<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Vinsol</title>
	
	<link>http://vinsol.com/blog</link>
	<description>Ruby Rails Services</description>
	<lastBuildDate>Thu, 29 Oct 2009 08:08:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Vinsol" type="application/rss+xml" /><feedburner:emailServiceId>Vinsol</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Integrating Yahoo! BOSS with your rails application</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/ESYeSx3tnSo/</link>
		<comments>http://vinsol.com/blog/2009/10/29/integrating-yahoo-boss-with-your-rails-application/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 08:08:05 +0000</pubDate>
		<dc:creator>amit</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[yahoo boss]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=740</guid>
		<description><![CDATA[What is Yahoo! BOSS? Yahoo developer website cites it as:
&#8220;Yahoo! Search BOSS (Build your Own Search Service) is an initiative in Yahoo! Search to open up Yahoo!&#8217;s search infrastructure and enable third parties to build revolutionary search products leveraging their own data, content, technology, social graph, or other assets. This release includes Web, News, and [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>What is <strong>Yahoo! BOSS</strong>? Yahoo developer website cites it as:</p>
<p style="text-align:justify"><cite>&#8220;Yahoo! Search BOSS (Build your Own Search Service) is an initiative in Yahoo! Search to open up Yahoo!&#8217;s search infrastructure and enable third parties to build revolutionary search products leveraging their own data, content, technology, social graph, or other assets. This release includes Web, News, and Image Search as well as Spelling Suggestions.&#8221;</cite></p>
<p>Some of the possible implementation of Yahoo! Boss may be finding related posts for your article, suggested tag/category for an article/query, correcting misspelled words by providing suggestions, fetching latest news on a topic dynamically, search over delicious tags, customized language search. Some of these have been tried and successfully implemented. An example is the <a href="http://www.techcrunch.com/2008/11/26/techcrunchs-new-search-engine-powered-by-yahoo-boss/">TechCrunch&#8217;s Search Engine</a>.</p>
<p> Here is a concise guide on how to use this new service in your next rails application.</p>
<p><strong>Obtain API key</strong></p>
<p>Get an application key from <a href="http://developer.yahoo.com/search/boss/">http://developer.yahoo.com/search/boss/</a>.</p>
<p><strong>Install BOSSMan Gem</strong></p>
<p>BOSSMan is a gem for interaction with the Yahoo BOSS web service written by <a href="http://github.com/jpignata">John Pignata</a>. Install it using the following commands:</p>
<pre class="brush: bash;">
gem install gemcutter
gem tumble
gem install bossman
</pre>
<p><strong>Usage</strong></p>
<p>Put this in your environment.rb</p>
<pre class="brush: ruby;">
require 'bossman'
include BOSSMan
BOSSMan.application_id = &lt;Your Application ID&gt;
</pre>
<p><strong>Web Search</strong></p>
<p>Use the following code to execute search over the web:</p>
<pre class="brush: ruby;">
boss = Search.web(&quot;Apple Pie&quot;, { :count =&gt; 2, :filter =&gt; &quot;-hate&quot; })
puts &quot;Number of results: #{boss.totalhits}&quot;

boss.results.each do |result|
  puts &quot;#{result.title}&quot;
  puts &quot;#{result.dispurl}&quot;
  puts &quot;#{result.abstract}&quot;
end

# =&gt; Number of results: 2618888
# =&gt; &lt;b&gt;Apple&lt;/b&gt; &lt;b&gt;pie&lt;/b&gt; - Wikipedia, the free encyclopedia
# =&gt; &lt;b&gt;en.wikipedia.org&lt;/b&gt;/wiki/&lt;wbr&gt;&lt;b&gt;Apple&lt;/b&gt;_&lt;b&gt;pie&lt;/b&gt;
# =&gt; English &lt;b&gt;apple&lt;/b&gt; &lt;b&gt;pie&lt;/b&gt; recipes go back to the time of Chaucer. &lt;b&gt;...&lt;/b&gt; The basis of Dutch &lt;b&gt;apple&lt;/b&gt; &lt;b&gt;pie&lt;/b&gt; is a crust on the bottom and around the edges. &lt;b&gt;...&lt;/b&gt;

boss = Search.web(&quot;Moon&quot;, { :count =&gt; 10, :type =&gt; &quot;nonhtml,-pdf&quot; })

boss.results.each do |result|
  puts &quot;#{result.title}&quot;
  puts &quot;#{result.dispurl}&quot;
  puts &quot;#{result.abstract}&quot;
end

# =&gt; BACKGROUND:
# =&gt; www.&lt;b&gt;radford.edu&lt;/b&gt;/~rusmart/&lt;wbr&gt;&lt;b&gt;moon&lt;/b&gt;.doc
# =&gt; We noticed was that one of the scan lines took longer to scan the &lt;b&gt;moon&lt;/b&gt; then any other. This occurred toward the middle of the &lt;b&gt;moon&lt;/b&gt;. &lt;b&gt;...&lt;/b&gt;

boss = Search.web(&quot;Star&quot;, { :sites =&gt; &quot;wwe.com&quot;, :style=&gt;'raw' })
boss.results.each do |result|
  puts &quot;#{result.title}&quot;
  puts &quot;#{result.dispurl}&quot;
  puts &quot;#{result.abstract}&quot;
end

# =&gt; John Cena - WWE: Raw
# =&gt; www.&lt;b&gt;wwe.com&lt;/b&gt;/super&lt;b&gt;star&lt;/b&gt;s/raw/&lt;wbr&gt;johncena
# =&gt; Official profile from WWE for the professional wrestler John Cena, who has been training since he was 15. Features lots of photos and video clips, including John ...
</pre>
<p>Apart from <a href="#universal_arguments">universal arguments</a> mentioned at the end of this document, the following arguments can also be used:<br />
<script>
function toggleDiv(divid){
if(document.getElementById(divid).style.display == 'none'){
document.getElementById(divid).style.display = 'block';
}else{
document.getElementById(divid).style.display = 'none';
}
}
</script></p>
<style>
#universal_arguments td, #universal_arguments th, #web_search_arguments td, #web_search_arguments th, #web_response_fields td, #web_response_fields th, #image_search_arguments td, #image_search_arguments th, #image_response_fields th, #image_response_fields td, #news_search_arguments th, #news_search_arguments td, #news_response_fields td, #news_response_fields th{padding: 5px; vertical-align:top;}
#web_search_arguments li {list-style-type:none; background: none}
</style>
<table border="0" cellspacing="0" id="web_search_arguments">
<tbody>
<tr>
<th>Parameters</th>
<th>Values/Description</th>
</tr>
<tr>
<td><code>:filter</code></td>
<td>
Filter out adult or hate content<br />
Syntax: <code>:filter => "-hate, -porn"</code>
</td>
</tr>
<tr>
<td><code>:type</code></td>
<td>Specifies document formats (pdf, msoffice,etc)</td>
</tr>
<tr>
<td>:view</td>
<td>Syntax: <code>:view => "view1,view2"</code>, etc</p>
<p><code>:view => "keyterms"</code> will retrieve related words and phrases for each search result.</p>
<p><code>:view => "searchmonkey_feed"</code> will retrieve structured data markup, if available, for the search result in dataRSS format.</p>
<p><code>:view => "searchmonkey_rdf"</code> will retrieve structured data markup, if available, for the search result in rdf format.</p>
<p><code>:view => "delicious_toptags"</code> will retrieve the top public delicious tags for a document and the counts associated with each tag</p>
<p><code>:view => "delicious_saves"</code> will retrieve the number of times a document was saved in delicious</p>
<p><code>:view => "language"</code> identifies the language of the document</p>
</td>
</tr>
<tr>
<td>:abstract</td>
<td><code>:abstract => "long"</code> will retrieve and display an abstract of a web document up to 300 characters. This expanded abstract provides the requestor with a larger piece of information to work from in a web search query. The default for abstract is an abbreviated description.</td>
</tr>
</tbody>
</table>
<p>Click <a href="javascript:toggleDiv('web_response_fields')">here</a> to view list of response fields returned by web search.</p>
<table border="0" cellpadding="5" cellspacing="0" id="web_response_fields" style="display:none">
<tbody>
<tr>
<th>Fields</th>
<th>Details</th>
</tr>
<tr>
<td><code>count</code></td>
<td>Indicates how many results to show per page. The value shown in results is the smaller of the default or explicit “count” request argument value or the actual number of results in the response. The result set will include the requested “count” unless there are fewer than that number of matching documents.</td>
</tr>
<tr>
<td><code>totalhits</code></td>
<td>A result count that reflects no duplicates. The totalhits value is an approximation, and its value may change depending on the requested “start” and “count” values, because the approximation is adjusted as more exact result URLs are processed. A normal use for totalhits is to determine how many pages of results to offer in search result navigation. Since totalhits is an approximation, and the value may change as “start” increases on successive result pages, the result page navigation may need to be adjusted as a user browses result pages.</td>
</tr>
<tr>
<td><code>deephits</code></td>
<td>It returns an approximate count that reflects duplicate documents and all documents from a host. deephits, therefore, is invariably equal to or larger than TotalHits. The deephits value is normally used as an information display on a search result page, reporting how many total documents matched the search terms.</td>
</tr>
<tr>
<td><code>abstract</code></td>
<td>Abstract with keywords highlighted with HTML tags. abstract=long  will retrieve and display an abstract of a web document up to 300 characters. This expanded abstract provides the requester with a larger piece of information to work from in a web search query. </td>
</tr>
<tr>
<td><code>title</code></td>
<td>Title with keywords highlighted with HTML tags</td>
</tr>
<tr>
<td><code>url</code></td>
<td>URL of result</td>
</tr>
<tr>
<td><code>clickurl</code></td>
<td>Returns a navigation URL that leads to the target URL for each result. A clickurl might lead through a redirect server, which provides Yahoo! with important usage data from search result sets.</td>
</tr>
<tr>
<td><code>dispurl</code></td>
<td>Returns the URLs of documents matching the query result. Use this field only for display purposes on result pages. To direct search users to the target document, use the clickurl value</td>
</tr>
<tr>
<td><code>size</code></td>
<td>Returns the document’s size in bytes</td>
</tr>
<tr>
<td><code>date</code></td>
<td>Returns date in YYYY/MM/DD format</td>
</tr>
<tr>
<td><code>keyterms</code></td>
<td>When <code>:view => "keyterms"</code> is used in query string the keyterms section is included in the response. This includes a list of related words and phrases with the <code>term</code> subheadings.</td>
</tr>
<tr>
<td><code>searchmonkey_feed</code></td>
<td>Using this field will retrieve structured data markup, if available, for the search result in dataRSS format.</td>
</tr>
<tr>
<td><code>searchmonkey_rdf</code></td>
<td>Using this field will retrieve structured data markup, if available, for the search result in RDF format.</td>
</tr>
<tr>
<td><code>delicious_toptags</code></td>
<td>Retrieves the top public delicious tags for a document and the counts associated with each tag.</td>
</tr>
<tr>
<td><code>delicious_saves</code></td>
<td>The number of times a document was saved in delicious.</td>
</tr>
<tr>
<td><code>language</code></td>
<td>The language of the document.</td>
</tr>
</tbody>
</table>
<p><strong>Images Search</strong></p>
<p>For searching images on web, use the following code:</p>
<pre class="brush: ruby;">
boss = Search.images(&quot;snow hills&quot;, { :dimensions =&gt; &quot;large&quot; })

boss.results.each do |result|
  puts &quot;#{result.url}: #{result.abstract}&quot;
end

# =&gt; http://www.amanita-photolibrary.co.uk/photo_library/BI_habitats/gb96_chiltern_hills_from_ivinghoe_snow_std.jpg: Copyright © 2004 Chiltern hills east from near Ivinghoe snow habitats landscapes British Isles
</pre>
<p>Click <a href="javascript:toggleDiv('image_search_arguments')">here</a> for list of additional arguments that can be provided with image search. </p>
<table border="0" cellpadding="5" cellspacing="0" id="image_search_arguments" style="display:none">
<tbody>
<tr>
<th>Parameters</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code>:filter</code></td>
<td><code>yes</code> (default) or <code>no</code></td>
<td>Whether or not to activate the Offensive Content Reduction filter. If set to yes, content marked as offensive is omitted from results.</td>
</tr>
<tr>
<td><code>:dimensions</code></td>
<td><code>all</code> (default), <code>small</code>, <code>medium</code>, <code>large</code>, <code>wallpaper</code>, <code>widewallpaper</code></td>
<td>Small images are generally thumbnail or icon sized. Medium sized images are average sized; usually not exceeding an average screen size. Large images are screen size or larger. Size pairs other than those listed are ignored.</td>
</tr>
<tr>
<td><code>:refererurl</code></td>
<td>URL, no default</td>
<td>
Search for this URL. Depending on other query restrictions, returns all image objects with this referring URL.</p>
<p>Example:  http://www.foo.com/~foo/images.htm
</td>
</tr>
<tr>
<td><code>:url</code></td>
<td>URL, no default</td>
<td>Search for this URL. Returns this exact image result.</p>
<p>Example: http://www.foo.com/~foo/images/mydog.gif
</td>
</tr>
</tbody>
</table>
<p>Click <a href="javascript:toggleDiv('image_response_fields')">here</a> to view list of response fields returned by image search.</p>
<table border="0" cellpadding="5" cellspacing="0" id="image_response_fields" style="display:none">
<tbody>
<tr>
<th>Field Name</th>
<th>Description</th>
</tr>
<tr>
<td><code>totalhits, deephits</code></td>
<td>Number of listings that match the query parameters.</td>
</tr>
<tr>
<td><code>abstract</code></td>
<td>Description of image</td>
</tr>
<tr>
<td><code>clickurl</code></td>
<td>URL to click to view image </td>
</tr>
<tr>
<td><code>filename</code></td>
<td>Filename of image</td>
</tr>
<tr>
<td><code>size</code></td>
<td>Size of image file </td>
</tr>
<tr>
<td><code>format</code></td>
<td>Format of image </td>
</tr>
<tr>
<td><code>height</code></td>
<td>Height of full-size image </td>
</tr>
<tr>
<td><code>date</code></td>
<td>Last modification date of image YYYY/MM/DD</td>
</tr>
<tr>
<td><code>mimetype</code></td>
<td>MIME type of image </td>
</tr>
<tr>
<td><code>refererclickurl</code></td>
<td>Clickable link to page in which image was found </td>
</tr>
<tr>
<td><code>refererurl</code></td>
<td>Original link to page in which image was found </td>
</tr>
<tr>
<td><code>title</code></td>
<td>Title of image (usually the filename) </td>
</tr>
<tr>
<td><code>url</code></td>
<td>URL of image itself </td>
</tr>
<tr>
<td><code>width</code></td>
<td>Width of full-size image </td>
</tr>
<tr>
<td><code>thumbnail_url</code></td>
<td>Thumbnail image</td>
</tr>
<tr>
<td><code>thumbnail_height</code></td>
<td>Thumbnail height</td>
</tr>
<tr>
<td><code>thumbnail_width</code></td>
<td>Thumbnail width</td>
</tr>
</tbody>
</table>
<p><strong>News Search</strong></p>
<p>Yahoo! BOSS also provides news search capabilties. </p>
<pre class="brush: ruby;">
boss = BOSSMan::Search.news(&quot;free shipping&quot;, { :age =&gt; &quot;1d-2w&quot;, :orderby =&gt; &quot;date&quot;, :count =&gt; 1})

boss.results.each do |result|
  puts &quot;#{result.title} [from #{result.source}]&quot;
  puts &quot;#{result.abstract}&quot;
end
# =&gt; Wal-Mart announces weekly price cuts for holidays [from USA Today]
# =&gt; Wal-Mart said it will cut prices this holiday season for a week at a time on thousands of items, from bananas to board games. The first group of cuts hit Wednesday.
</pre>
<p>Click <a href="javascript:toggleDiv('news_search_arguments')">here</a> for list of additional arguments that can be provided with news search. </p>
<table border="0" cellpadding="5" cellspacing="0" id="news_search_arguments" style="display:none">
<tbody>
<tr>
<th>Parameters</th>
<th>Values</th>
<th>Description</th>
</tr>
<tr>
<td><code>:age</code></td>
<td><code>7d</code></td>
<td>Use age= to retrieve documents by age:<br />
<code>:age => "[value]d"</code><br />
NOTE: Maximum [value] cannot be greater than 1000.<br />
The default is 30 days, and valid values are <code>[1-30]d</code>. (News Search maintains a 30-day index.) The following example searches the full index:<br />
<code>:age => "7d"</code><br />
Age can be specified using a string made an integer and one of the letters &#8220;<code>s</code>&#8220;, &#8220;<code>m</code>&#8220;, &#8220;<code>h</code>&#8220;, &#8220;<code>d</code>&#8221; and &#8220;<code>w</code>&#8221; representing seconds, minutes, hours, days and weeks.<br />
No spaces are allowed in the string. Some examples:<br />
<code>:age => "30d"</code><br />
<code>:age => "1w"</code><br />
<code>:age => "12h"</code><br />
To specify an age range two values can be concatenated with a dash/hyphen for example:<br />
<code>:age => "5d-10d"</code> Between 5 and 10 days old<br />
<code>:age => "2w-30d"</code> Between 2 weeks and 30 days old<br />
Multiple ranges or more than one age parameter is not supported. </td>
</tr>
<tr>
<td><code>:orderby</code></td>
<td>relevance</td>
<td>To order by date add <code>:orderby => "date"</code> to the query string. Results will be returned with the most recent first. </td>
</tr>
</tbody>
</table>
<p>Click <a href="javascript:toggleDiv('news_response_fields')">here</a> to view list of response fields returned by news search.</p>
<table border="0" cellpadding="5" cellspacing="0" id="news_response_fields" style="display:none">
<tbody>
<tr>
<th>Field Name</th>
<th>Description</th>
</tr>
<tr>
<td><code>totalhits, deephits</code></td>
<td>Number of listings that match the query parameters.</td>
</tr>
<tr>
<td><code>abstract</code></td>
<td>Abstract of news story.</td>
</tr>
<tr>
<td><code>clickurl</code></td>
<td>Click this link to reach story, if present. </td>
</tr>
<tr>
<td><code>language</code></td>
<td>Language of story. </td>
</tr>
<tr>
<td><code>date</code></td>
<td>Last publication date of story. </td>
</tr>
<tr>
<td><code>time</code></td>
<td>Last publication time of story.</td>
</tr>
<tr>
<td><code>source</code></td>
<td>Source publication. </td>
</tr>
<tr>
<td><code>sourceurl</code></td>
<td>URL of source publication. </td>
</tr>
<tr>
<td><code>title</code></td>
<td>Title (or Headline) of the story. </td>
</tr>
<tr>
<td><code>url</code></td>
<td>Link to story.</td>
</tr>
</tbody>
</table>
<p><strong>Spelling Search</strong></p>
<p>Correct your misspelled words using its spelling suggestion feature:</p>
<pre class="brush: ruby;">
boss = BOSSMan::Search.spelling(&quot;acknowlegment&quot;)
puts boss.suggestion # =&gt; acknowledgment
</pre>
<p><strong>Site Explorer</strong></p>
<p>You can also search for the pages from other sites linking into your site pages.</p>
<pre class="brush: ruby;">
links = Search.se_inlink(&quot;http://mail.yahoo.com&quot;, :count =&gt; 2)
links.results.map { |result| p result.url }
# =&gt; http://www.aol.com/
# =&gt; http://groups.yahoo.com/
</pre>
<p>For displays a list of all pages belonging to a domain in the Yahoo! index, use se_pagedata method provided.</p>
<pre class="brush: ruby;">
links = Search.se_pagedata(&quot;twitter.com&quot;, :count =&gt; 1)
links.results.map { |result| p &quot;#{result.url} - #{result.abstract}&quot; }
# =&gt; http://twitter.com/ - Use Twitter to send status updates (tweets) through your cell phone, instant messenger, or via the Web, and notify friends and followers of the little things &lt;b&gt;...&lt;/b&gt;
</pre>
<p><strong>Universal Arguments for Web, Images and News</strong></p>
<p>Following is the list of most commonly used arguments with web, image and news search. For more comprehensive list click <a href="http://developer.yahoo.com/search/boss/boss_guide/overview.html">here</a></p>
<table border="0" cellpadding="5" cellspacing="0" id="universal_arguments">
<tbody>
<tr>
<th>Argument</th>
<th>Options/Details</th>
</tr>
<tr>
<td><code>:start</code></td>
<td>Ordinal position of first result. First position is 0. Default sets start to 0.</td>
</tr>
<tr>
<td><code>:count</code></td>
<td>Total number of results to return. Maximum value is 50. Default sets count to 10.</td>
</tr>
<tr>
<td><code>:format</code></td>
<td>The data format of the response. Value can be set to either <code>"xml"</code> or <code>"json"</code>. Default sets format to <code>"json"</code>.</td>
</tr>
<tr>
<td><code>:callback</code></td>
<td>The name of the callback function to wrap the result. Parameter is valid only if format is set to <code>"json"</code>. No default value exists.</td>
</tr>
<tr>
<td><code>:sites</code></td>
<td>Restrict BOSS search results to a set of pre-defined sites. Multiple sites must be comma separated. Example: (<code>:sites => "abc.com,cnn.com"</code>). The Images service does not yet support multiple sites.</td>
</tr>
<tr>
<td><code>:view</code></td>
<td>Retrieve additional search data provided by the respective BOSS service. Please see individual chapters to see what view options are available.</td>
</tr>
<tr>
<td><code>:style</code></td>
<td>By default for web search result titles and abstracts contain bold HTML tags around the search term. Use <code>:style => "raw"</code> to remove the bold tags around the search terms in titles and abstracts.</td>
</tr>
</tbody>
</table>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/ESYeSx3tnSo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/10/29/integrating-yahoo-boss-with-your-rails-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/10/29/integrating-yahoo-boss-with-your-rails-application/</feedburner:origLink></item>
		<item>
		<title>Rails Caching And JavaScript Techniques</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/_lq4UqQMZOk/</link>
		<comments>http://vinsol.com/blog/2009/09/07/rails-caching-and-javascript-techniques/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 06:47:20 +0000</pubDate>
		<dc:creator>sid</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=704</guid>
		<description><![CDATA[Cross posted from darthsid
While implementing caching in a recent rails project I came across some typical caching issues. In a lot of pages the content is same for all users but certain components in them have user specific actions. As an example, I have a page listing all public messages that users have posted(similar to [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Cross posted from <a title="Sid's Blog" href="http://darthsid.com/blog">darthsid</a></p>
<p>While implementing caching in a recent rails project I came across some typical caching issues. In a lot of pages the content is same for all users but certain components in them have user specific actions. As an example, I have a page listing all public messages that users have posted(similar to the <a href="http://twitter.com/public_timeline">public timeline</a> in <a href="http://twitter.com">twitter</a>) but actions on those messages are user specific(eg: only owner or admin can delete a message). Also, most of these actions use ajax and the rails <a href="http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-cross-site-request-forging-prevention">authenticity token</a> in them also gets cached resulting in subsequent failures if the session changes. Another issue was that the timestamps in most pages is fuzzy and they become irrelevant if a page gets cached for too long. I could have created separate caches for each user but if the user base really grows managing the caches would become a nightmare and that would still not solve the authenticity token and the timestamp problem. The simplest solution was to use JavaScript, more specifically <a href="http://jquery.com">jQuery</a>.<br />
<span id="more-704"></span><br />
I have been a big fan of jQuery since I started using it about a year and a half ago and try to use it in all my projects. There is an excellent Rails plugin called <a href="http://ennerchi.com/projects/jrails">jRails</a> that replaces Prototype with jQuery and provides all the default Rails helpers for JavaScript making jQuery even more tempting to use. The examples I use below all use jQuery.</p>
<p><big><big><strong>1. Handling User Specific Components</strong></big></big></p>
<p>Taking the delete action as explained in the example above, the code in the cached view looks something like this:</p>
<pre class="brush: ruby;">
&lt;% if logged_in? %&gt;
&lt;li class=&quot;delete &lt;%= 'only_' + (message.owner.login) + '_delete_allowed' %&gt;&quot;&gt;
  &lt;%= link_to_remote &quot;Delete&quot;,
    :url =&gt; user_message_path(current_user, message)
    :method =&gt; :delete,
    :confirm =&gt; &quot;Are you sure you wish to delete this message?&quot;,
    :html =&gt; { :title =&gt; &quot;Delete Post&quot; } %&gt;
&lt;/li&gt;
&lt;% end %&gt;
</pre>
<p>This will create an li element with class &#8220;delete&#8221; and &#8220;only_kratos_delete_allowed&#8221; if the username of the message owner is &#8220;kratos&#8221;</p>
<p>In the non-cached part of the view I have the following code:</p>
<pre class="brush: ruby;">
&lt;% if logged_in? %&gt;
  &lt;% if current_user.is_admin? %&gt;
    &lt;%= javascript_tag &quot;$(document).ready(function() { MessageView.removeInvalidDeteteButtons('only_#{current_user.login}_delete_allowed', 'true'); });&quot; %&gt;
  &lt;% else %&gt;
    &lt;%= javascript_tag &quot;$(document).ready(function() { MessageView.removeInvalidDeteteButtons('only_#{current_user.login}_delete_allowed'); });&quot; %&gt;
  &lt;% end %&gt;
&lt;% end %&gt;
</pre>
<p>If the current user is an admin I pass the JavaScript function an additional parameter.</p>
<p>In the application.js file I have the following code:</p>
<pre class="brush: jscript;">
var MessageView = {
  removeInvalidDeteteButtons: function(element_class, admin) {
    if (admin == undefined)
    {
      $('.delete').each(function() { if (!$(this).hasClass(element_class)) { $(this).remove(); } });
    }
  }
}
</pre>
<p>If the second parameter is passed(in the case of an admin) the function does nothing, else it iterates over all li elements with class &#8220;delete&#8221; and removes all elements that do not also have, in this case, the &#8220;only_kratos_delete_allowed&#8221; class.</p>
<p><big><big><strong>2. Handling Rails Authenticity Token</strong></big></big></p>
<p>This part describes how to take care of the authenticity token problem:</p>
<p>I added the following code to the layout:</p>
<pre class="brush: ruby;">
&lt;%= javascript_tag &quot;var AUTH_TOKEN = #{form_authenticity_token.inspect};&quot; if protect_against_forgery? %&gt;
</pre>
<p>This code creates a JavaScript variable named &#8220;AUTH_TOKEN&#8221; that contains the current authentication token. Since this section is not cached it always get the correct token.</p>
<p>Next I added the following code to application.js:</p>
<pre class="brush: jscript;">
$(document).ajaxSend(function(event, request, settings) {
  if (settings.type == 'get' || settings.type == 'GET' || typeof(AUTH_TOKEN) == &quot;undefined&quot;) return;
  var authTokenRegExp = /authenticity_token=\w{40}/
  settings.data = settings.data || &quot;&quot;;
  if (authTokenRegExp.test(settings.data))
  {
    settings.data=settings.data.replace(authTokenRegExp, &quot;authenticity_token=&quot; + encodeURIComponent(AUTH_TOKEN));
  }
  else
  {
    settings.data += (settings.data ? &quot;&amp;&quot; : &quot;&quot;) + &quot;authenticity_token=&quot; + encodeURIComponent(AUTH_TOKEN);
  }
})
</pre>
<p>This code is a slight modification of the code posted <a href="http://henrik.nyh.se/2008/05/rails-authenticity-token-with-jquery">here</a>. <a href="http://docs.jquery.com/Ajax/ajaxSend">ajaxSend</a> is jQuery function that is executed before every ajax request is sent and I use it here to replace or append the authenticity token to the request, unless the request is GET or the AUTH_TOKEN variable is not defined.</p>
<p><big><big><strong>3. Handling Fuzzy Timestamps</strong></big></big></p>
<p>The code for timestamps in the cached view looks like this:</p>
<pre class="brush: ruby;">
&lt;span&gt;
  &lt;%= process_message_body_timestamp(message) %&gt;
&lt;/span&gt;
</pre>
<p>And the helper code is:</p>
<pre class="brush: ruby;">
def process_message_body_timestamp(message)
  link_to &quot;#{message.created_at}&quot;, show_message_url(message), :class =&gt; &quot;timestamps&quot;
end
</pre>
<p>I put the following code in the layout(non-cached):</p>
<pre class="brush: ruby;">
&lt;%= javascript_tag &quot;$(document).ready(function() { CustomDate.datify(#{get_custom_date_arguments}) });&quot; %&gt;
</pre>
<p>The get_custom_date_arguments helper is defined in application helper and returns a string containing the current time arguments needed for the JavaScript function:</p>
<pre class="brush: ruby;">
def get_custom_date_arguments
  current_time = Time.zone.now
  &quot;#{current_time.year},#{current_time.month-1},#{current_time.day},#{current_time.hour},#{current_time.min},#{current_time.sec}&quot;
end
</pre>
<p>I put the following code in application.js:</p>
<pre class="brush: jscript;">
var CustomDate = {
  datify: function(current_utc_year,
                   current_utc_month,
                   current_utc_day,
                   current_utc_hour,
                   current_utc_minute,
                   current_utc_second) {
    $('.timestamps').each(function() {
      $(this).html(CustomDate.humane_date($(this).html(),
                                          current_utc_year,
                                          current_utc_month,
                                          current_utc_day,
                                          current_utc_hour,
                                          current_utc_minute,
                                          current_utc_second)).removeClass('timestamps')
    })
  },

  humane_date: function(date_str, current_utc_year, current_utc_month, current_utc_day, current_utc_hour, current_utc_minute, current_utc_second) {
    var time_formats = [
                        [60, 'less than a minute ago'],
                        [90, '1 minute'], // 60*1.5
                        [3600, 'minutes', 60], // 60*60, 60
                        [5400, '1 hour'], // 60*60*1.5
                        [86400, 'hours', 3600], // 60*60*24, 60*60
                        [129600, '1 day'], // 60*60*24*1.5
                        [604800, 'days', 86400], // 60*60*24*7, 60*60*24
                        [907200, '1 week'], // 60*60*24*7*1.5
                        [2628000, 'weeks', 604800], // 60*60*24*(365/12), 60*60*24*7
                        [3942000, '1 month'], // 60*60*24*(365/12)*1.5
                        [31536000, 'months', 2628000], // 60*60*24*365, 60*60*24*(365/12)
                        [47304000, '1 year'], // 60*60*24*365*1.5
                        [3153600000, 'years', 31536000], // 60*60*24*365*100, 60*60*24*365
                        [4730400000, '1 century'], // 60*60*24*365*100*1.5
                      ];

    var time = ('' + date_str).replace(/-/g,&quot;/&quot;).replace(/[TUTC]/g,&quot; &quot;),
        dt = new Date

    dt.setUTCFullYear(current_utc_year, current_utc_month, current_utc_day)
    dt.setUTCHours(current_utc_hour, current_utc_minute, current_utc_second)

    var seconds = ((dt - new Date(time) + (dt.getTimezoneOffset() * 60000)) / 1000),
        token = ' ago',
        prepend = '',
        i = 0,
        format;

    if (seconds &lt; 0) {
      seconds = Math.abs(seconds);
      token = '';
      prepend = 'in ';
    }

    while (format = time_formats[i++]) {
      if (seconds &lt; format[0]) {
        if (format.length == 2) {
          return (i&gt;1?prepend:'') + format[1] + (i &gt; 1 ? token : ''); // Conditional so we don't return Just Now Ago
        }
        else {
            return prepend + Math.round(seconds / format[2]) + ' ' + format[1] + (i &gt; 1 ? token : '');
        }
      }
    }

    // overflow for centuries
    if(seconds &gt; 4730400000) {
      return Math.round(seconds / 4730400000) + ' Centuries' + token;
    }

    return date_str;
  }
}
</pre>
<p>The datify function iterates over all timestamps(elements with class &#8220;timestamps&#8221;) and replaces them with fuzzy timestamps. The humane_date function(yanked from <a href="http://stackoverflow.com/questions/168924/how-to-render-contextual-difference-between-two-timestamps-in-javascript">here</a>) generates the actual fuzzy timestamps.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/_lq4UqQMZOk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/09/07/rails-caching-and-javascript-techniques/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/09/07/rails-caching-and-javascript-techniques/</feedburner:origLink></item>
		<item>
		<title>How to Integrate TinyMce with Redbox in 5 steps ?</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/HePiE813SG8/</link>
		<comments>http://vinsol.com/blog/2009/09/04/how-to-integrate-tinymce-with-redbox-in-5-steps/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 13:23:12 +0000</pubDate>
		<dc:creator>payal</dc:creator>
				<category><![CDATA[about this site]]></category>
		<category><![CDATA[popup]]></category>
		<category><![CDATA[popup and tinymce]]></category>
		<category><![CDATA[redbox]]></category>
		<category><![CDATA[tinymce]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=716</guid>
		<description><![CDATA[TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control.  It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.
Redbox is a library that pops a modal box over a web page, using CSS and javascript, so that you can ask the user a question, or [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control.  It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>
<p>Redbox is a library that pops a modal box over a web page, using CSS and javascript, so that you can ask the user a question, or show them something important. The box can be loaded from content already on the page (but hidden), or it can be loaded via AJAX. The contents of the box can be replaced using AJAX, for multi-page forms, and it can be closed easily using a javascript link.</p>
<p>Here is the process for integrating Redbox and tinymce.</p>
<p><strong>Step I:</strong><br />
Install required plugins:</p>
<p>- TinyMce(<a href="http://github.com/kete/tiny_mce/tree/master">http://github.com/kete/tiny_mce/tree/master</a>)<br />
- RedBox(<a href="http://www.craigambrose.com/projects/redbox">http://www.craigambrose.com/projects/redbox</a>)</p>
<p><strong>Step II:</strong><br />
Include javascript files to layout:</p>
<pre class="brush: ruby;">
  &lt;%= include_tiny_mce_js %&gt;
  &lt;%= javascript_tag &quot;initialize_editor();&quot; %&gt;
</pre>
<p>Now, add this javascript method which initilizes the text editor. You can specify the options you want for your text editor here.</p>
<p>Javascript:</p>
<pre class="brush: ruby;">function  initialize_editor(){
  tinyMCE.init({
    theme:&quot;advanced&quot;,
    //mode:&quot;textareas&quot;, // this is commented because we do not want to apply the editor to all the text area
     instances. Instead, we will use the class &quot;mceEditor&quot; to specify on which element we want to add the editor.
    theme_advanced_toolbar_location:&quot;top&quot;,
    theme_advanced_toolbar_align:&quot;left&quot;,
    theme_advanced_resizing:true,
    theme_advanced_resize_horizontal:false,
    paste_auto_cleanup_on_paste:true,
theme_advanced_blockformats:&quot;p,address,pre,h1,h2,h3,h4,h5,h6&quot;,
    theme_advanced_buttons1:&quot;bold, italic, underline, strikethrough, | , undo, redo, link, unlink, image, | , bullist, numlist&quot;,
    theme_advanced_buttons2:&quot;&quot;,
    theme_advanced_buttons3:&quot;&quot;,
    dialog_type:&quot;modal&quot;
  });
}</pre>
<p><strong><br />
Step III:</strong></p>
<p><strong><br />
</strong></p>
<p>Add editor class &#8220;mceEditor&#8221; to the text area where you want the editor to be added.</p>
<pre class="brush: ruby;">&lt;%= f.text_area :details, :id =&gt; 'ta_id', :class =&gt; 'mceEditor' %&gt;</pre>
<p>Now, we need to create a tinymce editor control for the text area(&#8217;ta_id&#8217;) on loading the popup so add this &#8220;execCommand&#8221; loads the tinyMCE in the textarea.</p>
<pre class="brush: ruby;">&lt;script type=&quot;text\javascript&quot;&gt;
  tinyMCE.execCommand('mceAddControl', true, &quot;ta_id&quot;);
&lt;/script&gt;</pre>
<p><strong>Step IV:</strong></p>
<p><strong><br />
</strong></p>
<p>When we submit our form and copy over the editor content to the text box it references. Tinymce provides a method &#8216;triggerSave&#8217; that moves the contents from the editor to the form field. This method is automatically called by tinyMCE by adding a trigger on the forms submit method.</p>
<p>Save the content:</p>
<pre class="brush: ruby;">&lt;%= f.submit 'Save', :class =&gt; 'primaryAction', :onclick =&gt; &quot;tinyMCE.triggerSave(true,true);&quot; %&gt;</pre>
<p><strong>Step V:</strong></p>
<p><strong><br />
</strong></p>
<p>Whenever we close our popup redbox we need to remove the tinymce editor control that we had added. Remove control on closing the redbox:</p>
<pre class="brush: ruby;">&lt;%= link_to_close_redbox 'Close', {:onclick =&gt; &quot;tinyMCE.execCommand('mceRemoveControl', true, 'ta_id'});&quot;} %&gt;</pre>
<p>Works on: Firefox(1.5+), Safari and IE(7+)</p>
<p>For Internet Explorer  we need to initialize the editor on loading the pop-up but for firefox we need to initalize editor on loading the main page. So we need modify our javascript</p>
<pre class="brush: ruby;">&lt;script type=&quot;text\javascript&quot;&gt;
  if(navigator.appName==&quot;Microsoft Internet Explorer&quot;)
  	initialize_editor();
  tinyMCE.execCommand('mceAddControl', true, &quot;ta_id&quot;);
&lt;/script&gt;</pre>
<p>And so here we are ready to go in just five simple steps.</p>
<p>Refer <a href="http://wiki.moxiecode.com/index.php/TinyMCE:Functions">here </a>for more details.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/HePiE813SG8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/09/04/how-to-integrate-tinymce-with-redbox-in-5-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/09/04/how-to-integrate-tinymce-with-redbox-in-5-steps/</feedburner:origLink></item>
		<item>
		<title>Now You Can Have Better Youtube Integration with Ruby on Rails</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/dr8MYhBw5_E/</link>
		<comments>http://vinsol.com/blog/2009/07/30/now-you-can-have-better-youtube-integration-with-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 11:47:29 +0000</pubDate>
		<dc:creator>vibha</dc:creator>
				<category><![CDATA[about this site]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=677</guid>
		<description><![CDATA[I recently wanted to upload, edit, update and delete a video directly on youtube from my rails application. This can be achieved by YouTube Data API that allows application to perform functions normally executed on youtube.
Step 1 : Demystifying Authentication with Google AuthSub
Google provides an authentication service to those web applications that need to access [...]


Related posts:<ol><li><a href='http://vinsol.com/blog/2008/11/25/reporting-the-first-full-day-ruby-event-in-india-the-ruby-funday/' rel='bookmark' title='Permanent Link: Reporting the first full day Ruby Event in India: The Ruby FunDay'>Reporting the first full day Ruby Event in India: The Ruby FunDay</a> <small>The First Ruby FunDay was held at Impetus Technologies, Noida...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>I recently wanted to upload, edit, update and delete a video directly on youtube from my rails application. This can be achieved by YouTube Data API that allows application to perform functions normally executed on youtube.</p>
<p><strong>Step 1 : Demystifying Authentication with Google AuthSub</strong></p>
<p>Google provides an authentication service to those web applications that need to access services protected by a user&#8217;s Google account. I chose<a href="http://code.google.com/apis/accounts/docs/AuthSub.html"> Google’s ‘AuthSub’ scheme</a> for this. This also provides a high level of security to web application.<br />
The AuthSub interface provides several methods for acquiring and managing authorization tokens. Once a web application has received a token, it can request access to a Google service.</p>
<p>To obtain an authentication token, submit an HTTP POST request to the following URL:</p>
<pre class="brush: ruby;">
https://www.google.com/accounts/AuthSubRequest?next=http%3A%2F%2Fwww.example.com%2Fupload.html&amp;scope=http%3A%2F%2Fgdata.youtube.com&amp;session=0&amp;secure=0
</pre>
<p>Setting session parameter to 1 indicates that the single-use token can be exchanged for a session token.<br />
<a href="http://code.google.com/apis/accounts/docs/AuthSub.html#AuthSubSessionToken">AuthSubSessionToken</a> is a method that allows the web application to exchange a single-use token for a session token. I used a gem ‘gdata’ to convert the token into a session token.</p>
<pre class="brush: ruby;">
client = GData::Client::DocList.new
client.authsub_token = params[:token]
session[:token] = client.auth_handler.upgrade()
</pre>
<p>Session token allows the application to make unlimited calls to the Google service. When using session tokens, your application should store the session token for each user rather than requesting a new one each time it needs to access a Google service. For other token management options, see <a href="http://code.google.com/apis/accounts/docs/AuthSub.html#WorkingAuthSub">Working With AuthSub.</a></p>
<p><strong>Step 2 : Getting the Youtube Developer Key</strong></p>
<p>A developer key is required that identifies the YouTube developer that is submitting an API request. A client ID identifies your application for logging and debugging purposes. Please visit <a href="http://code.google.com/apis/youtube/dashboard/">here</a> to obtain a developer key and client ID.</p>
<p><strong>Step 3 : Improving the Youtube Model</strong> <strong>Plugin</strong></p>
<p><a href="http://github.com/edgarjs/youtube-model/tree/master">“youtube-model”</a> is a plugin  that provides youtube video uploading functionality. That was a good start.<br />
I forked the plugin and updated it with few methods to get the rest of  the functionality done. Each method is explained here.<br />
<strong>1. uploaded_by_user</strong><br />
A method uploaded_by was provided in the plugin to retrieve all the videos of the user but it receives username as a parameter. So I added a method uploaded_by_user that receives the session token and solves our purpose.</p>
<pre class="brush: ruby;">
YouTube.uploaded_by_user(session[:token])
</pre>
<p><strong>2. update_video</strong><br />
The video can be updated by using this method passing video id, session token and params hash as parameters.</p>
<pre class="brush: ruby;">
YouTube.update_video(params[:id], session[:token], params[:you_tube_entry])
</pre>
<p><strong>3. delete_video</strong><br />
The video can also be deleted if uploaded at the user’s youtube account by passing video id and token as a parameter.</p>
<pre class="brush: ruby;">
YouTube.delete_video(params[:id], session[:token])
</pre>
<p><strong>4. video_status</strong><br />
This method helps finding out the status of uploaded video.</p>
<pre class="brush: ruby;">
s = YouTube.video_status(session[:token], params[:id])
@status = s.control.state.name
</pre>
<p>The changes to the plugin have been merged in the master and you can download everything <a href="http://github.com/vibha/youtube-model/tree/master">here</a>. I will really appreciate your feedback and suggestions to make this plugin better.</p>
<p><img class="alignleft" src="http://vinsol.com/components/com_staffmaster/images/vibha_vinsol.jpg" alt="" width="43" height="37" /> Vibha Chadha is working with Vinsol as a rails developer. When she is not writing code, she likes to read &#8220;geek&#8221; books and listen  to some &#8220;good&#8221; music.</p>


<p>Related posts:<ol><li><a href='http://vinsol.com/blog/2008/11/25/reporting-the-first-full-day-ruby-event-in-india-the-ruby-funday/' rel='bookmark' title='Permanent Link: Reporting the first full day Ruby Event in India: The Ruby FunDay'>Reporting the first full day Ruby Event in India: The Ruby FunDay</a> <small>The First Ruby FunDay was held at Impetus Technologies, Noida...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/dr8MYhBw5_E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/07/30/now-you-can-have-better-youtube-integration-with-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/07/30/now-you-can-have-better-youtube-integration-with-ruby-on-rails/</feedburner:origLink></item>
		<item>
		<title>Git Work Flow For Rails Developers</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/CXMVKyQM-zo/</link>
		<comments>http://vinsol.com/blog/2009/07/24/git-work-flow-for-rails-developers/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 07:32:04 +0000</pubDate>
		<dc:creator>sid</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=651</guid>
		<description><![CDATA[Cross posted from darthsid
This is my very first blog post and so I though it should be about a tool that is indispensable for me &#8211; Git. I started using git about 10 months ago and looking back I can&#8217;t imagine how I managed to get work done without it. The purpose of this post [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Cross posted from <a title="Sid's Blog" href="http://darthsid.com/blog">darthsid</a></p>
<p>This is my very first blog post and so I though it should be about a tool that is indispensable for me &#8211; Git. I started using git about 10 months ago and looking back I can&#8217;t imagine how I managed to get work done without it. The purpose of this post however is not to sing git&#8217;s praises, there are lots of good articles on the web that do so much better than I ever could. Instead, I wish to share the work-flow I use on my projects. I developed this work-flow by trial and error over the months and is currently the most efficient and productive approach I can think of. If any experienced git users happen to stumble upon this post, please do provide suggestions/alternatives to help me improve my process.</p>
<p>The project I am currently working on requires me to maintain two parallel deployment branches. One is a &#8220;production branch&#8221; which is deployed on the live server and the other is a &#8220;development branch&#8221; which is deployed on a staging server. All enhancements and feature additions are done in the &#8220;development branch&#8221; and the only changes made in the &#8220;production branch&#8221; are production bug fixes that need urgent attention. Once the &#8220;development branch&#8221; is deemed stable it is merged into &#8220;production branch&#8221; and deployed.<br />
<span id="more-651"></span><br />
I&#8217;ve divided my work-flow into two parts. The first part is a generic approach which I follow in all projects, the second part is specific to the case mentioned above and discusses how I manage the two branches using git. Although I mention &#8220;Rails&#8221; in the title of this post, the work-flow I define below is not &#8220;Rails&#8221; specific and can be applied to any project where multiple deployment branches need to be maintained. I assume the reader has a basic understanding of git and is comfortable with git branches. There are lots of configuration settings in git which help you setup things like you git author name, email and colors for git commands etc. There are two I would like to mention here though:</p>
<pre class="brush: bash;">git config --global push.default &quot;tracking&quot;</pre>
<p>This command tells git to perform a push only to the tracked remote branch in which you are currently working.</p>
<pre class="brush: bash;">git config --global pack.threads &quot;0&quot;</pre>
<p>This command tells git to auto-detect the number of threads to use for packing repositories and is useful when working on a machine with more than one core.</p>
<p><big><big><strong>1. Generic Workflow</strong></big></big></p>
<p><strong>a. Start with a clean master branch.</strong></p>
<pre class="brush: bash;">
git checkout master
git pull
</pre>
<p>You now have a clean master branch. Never work directly in the master branch, instead make all changes to a local branch.</p>
<p><strong>b. Create a local branch.</strong></p>
<pre class="brush: bash;">
git branch my_local_branch
git checkout my_local_branch
</pre>
<p>or do both in one command:</p>
<pre class="brush: bash;">git checkout -b my_local_branch</pre>
<p>This creates a new local branch named &#8220;my_local_branch&#8221; and switches to it. You can now perform all changes in this branch. One good practice to follow when using git is to commit often and in small chunks. This gives you finer control on the work done and allows you to fix mistakes without losing other work. Once you are satisfied, all those smaller commits can be consolidated in a single meaningful commit.</p>
<p><strong>c. Merge with master branch.</strong></p>
<pre class="brush: bash;">
git checkout master
git pull
</pre>
<p>if new changes were pulled do the following:</p>
<pre class="brush: bash;">
git checkout my_local_branch
git rebase master
</pre>
<p>A rebase will apply the newly pulled changes in the master branch to your local branch and then apply local branch changes on top of that. This will ensure a clean merge with master. Conflicts are very common during a rebase and will need to be resolved before you can have a successful rebase. You can also pass the &#8220;-i&#8221; option to rebase to perform an interactive rebase which will alllow you to squash multiple commits into one if you so require. Once you are finished with the rebase do the following:</p>
<pre class="brush: bash;">
git checkout master
git merge my_local_branch
git push
</pre>
<p>Once you are satisfied with the push you can delete the local branch:</p>
<pre class="brush: bash;">git branch -d my_local_branch</pre>
<p><big><big><strong><br />
2. Managing Multiple Deployment Branches</strong></big></big></p>
<p>The master branch is set as the branch for production deployment and a new remote branch is created for development phase. Since I use capistrano for project deployment I set it up to have three separate tasks: &#8220;production&#8221;, &#8220;production_staging&#8221; and &#8220;development_staging&#8221;. The &#8220;production&#8221; and &#8220;production_staging&#8221; tasks use the master branch and the &#8220;development_staging&#8221; task uses the newly created remote branch. For both the remote branches you must follow the above work-flow i.e: never work directly in the branches themselves, instead create local branches to work in.</p>
<p><strong>a. Create a new remote branch.</strong></p>
<p>First create a new remote branch from our master branch:</p>
<pre class="brush: bash;">git push origin master:refs/heads/development_phase_1</pre>
<p><strong>b. Track the remote branch.</strong></p>
<p>Track the newly created remote branch:</p>
<pre class="brush: bash;">git checkout --track -b development_phase_1 origin/development_phase_1</pre>
<p>This will create a new local branch named &#8220;development_phase_1&#8243; that is tracking the remote &#8220;development_phase_1&#8243; branch. Everyone who needs to work on development branch tracks this remote &#8220;development_phase_1&#8243; branch and pushes to it. The only pushes to master branch are production fixes.</p>
<p><strong>c. Merge the development branch with the master branch.</strong></p>
<p>Once work on development branch is finished we are ready to merge the two branches:</p>
<pre class="brush: bash;">
git checkout development_phase_1
git rebase master
git checkout master
git merge development_phase_1
git push
git branch -d development_phase_1
git push origin :heads/development_phase_1
</pre>
<p>Normally a rebase is not a good idea in a remotely tracked branch but since our phase is finished and we will create a new remote branch for the next phase, I do so here. Alternatively, I could do a force push for the remote development branch and everyone working on it would need to remove and retrack it again. The second last line removes our locally tracked development branch and the last one removes it from the remote repository.</p>
<p><big><big><strong>Final Thoughts</strong></big></big></p>
<p>As I mentioned before, the above presented work-flow is not perfect by any means but it works for me. I would appreciate feedback from anyone who reads this and has some  suggestions/recommendations to help me manage my projects better.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/CXMVKyQM-zo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/07/24/git-work-flow-for-rails-developers/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/07/24/git-work-flow-for-rails-developers/</feedburner:origLink></item>
		<item>
		<title>New Rails Plugin- Launching Soon has launched</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/qPDuwdZkudw/</link>
		<comments>http://vinsol.com/blog/2009/07/14/launching-soon/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 13:36:02 +0000</pubDate>
		<dc:creator>manik</dc:creator>
				<category><![CDATA[plugin]]></category>
		<category><![CDATA[rails plugins]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails plugin]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=641</guid>
		<description><![CDATA[&#8220;Launching Soon&#8221; is a new plugin that VinSol has developed.
Working on client projects, we saw a pattern &#8211; the client owns a domain, which is either parked or has a blog running on it, and then they commission us to build an application. While the application is being developed, they want us to setup a [...]


Related posts:<ol><li><a href='http://vinsol.com/blog/2008/11/08/webbynode-a-new-hosting-service-launching-soon/' rel='bookmark' title='Permanent Link: WebByNode: A New Hosting Service Launching Soon'>WebByNode: A New Hosting Service Launching Soon</a> <small>Guys, I received a mail today that there will be...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>&#8220;<a href="http://github.com/vinsol/Launching-Soon/tree/master" target="_blank">Launching Soon</a>&#8221; is a new plugin that VinSol has developed.</p>
<p>Working on client projects, we saw a pattern &#8211; the client owns a domain, which is either parked or has a blog running on it, and then they commission us to build an application. While the application is being developed, they want us to setup a landing page on the server, with a couple of  links &#8211; to the blog etc. and want to capture email addresses of people who are interested in the service that the application would offer.</p>
<p>We actually found a few ready to use options for this. This <a href="http://launchsoon.com/" target="_blank">php based paid script</a> was one and there is also a  <a href="http://woork.blogspot.com/2009/06/how-to-implement-launching-soon-page-in.html">free launching soon </a>module in PHP/Jquery.</p>
<p>However, we did not find anything for Rails so <a href="http://satishchauhan.com" target="_blank">Satish</a> set out to write a plugin for it. Then we thought it would be good to integrate it with <a href="http://campaignmonitor.com/" target="_blank">Campaign Monitor</a> , since most of our clients use this service for running their email campaigns.  And subsequently Satish extended it to add <a href="http://www.mailchimp.com/" target="_blank">Mail Chimp</a> integration also.</p>
<p>Give it a spin and send us your feedback via the <a href="https://vinsol.lighthouseapp.com/projects/31867-launching-soon/overview" target="_blank">LightHouse project.</a></p>


<p>Related posts:<ol><li><a href='http://vinsol.com/blog/2008/11/08/webbynode-a-new-hosting-service-launching-soon/' rel='bookmark' title='Permanent Link: WebByNode: A New Hosting Service Launching Soon'>WebByNode: A New Hosting Service Launching Soon</a> <small>Guys, I received a mail today that there will be...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/qPDuwdZkudw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/07/14/launching-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/07/14/launching-soon/</feedburner:origLink></item>
		<item>
		<title>RailsConf Day 1 – Links to slides and blog posts</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/txCyWj8ix6w/</link>
		<comments>http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/#comments</comments>
		<pubDate>Tue, 05 May 2009 11:49:44 +0000</pubDate>
		<dc:creator>kapil</dc:creator>
				<category><![CDATA[about this site]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[railsconf09]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=626</guid>
		<description><![CDATA[
This is the official link for all the presentation files, so whenever you are looking for PPTs , this is the first place

 http://en.oreilly.com/rails2009/public/schedule/proceedings

I really liked Arun Gupta&#8217;s post on Jruby on Rails and Sinatra.

Also, discovered Rack middleware for request rewriting.
Liked this starter for jruby on google app engine http://jruby-rack.appspot.com/
Robert Dempsey tutorial on  rails basics [...]


Related posts:<ol><li><a href='http://vinsol.com/blog/2008/11/25/reporting-the-first-full-day-ruby-event-in-india-the-ruby-funday/' rel='bookmark' title='Permanent Link: Reporting the first full day Ruby Event in India: The Ruby FunDay'>Reporting the first full day Ruby Event in India: The Ruby FunDay</a> <small>The First Ruby FunDay was held at Impetus Technologies, Noida...</small></li><li><a href='http://vinsol.com/blog/2008/11/25/presented-faceted-search-using-ultrasphinx/' rel='bookmark' title='Permanent Link: Presented faceted search using ultrasphinx'>Presented faceted search using ultrasphinx</a> <small>The first ruby funday held on 22nd Nov 2008 in...</small></li><li><a href='http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/' rel='bookmark' title='Permanent Link: 5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience'>5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience</a> <small>We will be again going to Rails Conf this year...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<ul>
<li>This is the official link for all the presentation files, so whenever you are looking for PPTs , this is the first place</li>
</ul>
<p><a href="http://en.oreilly.com/rails2009/public/schedule/proceedings"> http://en.oreilly.com/rails2009/public/schedule/proceedings</a></p>
<ul>
<li>I really liked Arun Gupta&#8217;s post on <a href="http://blogs.sun.com/arungupta/entry/rails_conf_2009_day_1">Jruby on Rails and Sinatra.<br />
</a></li>
<li>Also, discovered <a href="http://github.com/joshbuddy/rack-rewrite/blob/b7fd99e9f8d0fd0cffc9d2c71eccf00f978903ba/README.rdoc">Rack middleware for request rewriting.</a></li>
<li>Liked this starter for jruby on google app engine <a href="http://jruby-rack.appspot.com/">http://jruby-rack.appspot.com/</a></li>
<li>Robert Dempsey tutorial on  rails basics was cool. You can find ppt and code samples  here : <a href="http://blog.adsdevshop.com/2009/05/05/a-z-intro-to-ruby-on-rails-goodies/">http://blog.adsdevshop.com/2009/05/05/a-z-intro-to-ruby-on-rails-goodies/</a></li>
<li>There was a session on Sphinx and Thinking Sphinx by Christophe Lucas <a href="http://docs.google.com/Present?docid=dg5gdk9c_9gp77bvfj">http://docs.google.com/Present?docid=dg5gdk9c_9gp77bvfj</a></li>
<li> Another good session on internationalization of ruby on rails application by Chirtophe <a href="http://docs.google.com/Present?docid=dg5gdk9c_20fg3dnhxv">http://docs.google.com/Present?docid=dg5gdk9c_20fg3dnhxv</a></li>
<li>There was a session on agile estimation but I couldn&#8217;t locate its stuff. <a href="http://twitpic.com/4l4q5/full">http://twitpic.com/4l4q5/full</a></li>
<li>Here are notes to SproutCore tutorial <a href="http://sproutcore-rails.s3.amazonaws.com/solution.txt">http://sproutcore-rails.s3.amazonaws.com/solution.txt</a></li>
<li>There was a talk on chef &#8211; here is a github link of <a href="http://github.com/ezmobius/chef-deploy/tree/master"><span id="repository_description">Chef Resources and Providers for deploying ruby web apps without capistrano</span></a></li>
</ul>
<p>Please add any other userful links which I missed through comments. Looking forward for day 2. We are wearing black t -shirts with Vinsol printed in red.</p>


<p>Related posts:<ol><li><a href='http://vinsol.com/blog/2008/11/25/reporting-the-first-full-day-ruby-event-in-india-the-ruby-funday/' rel='bookmark' title='Permanent Link: Reporting the first full day Ruby Event in India: The Ruby FunDay'>Reporting the first full day Ruby Event in India: The Ruby FunDay</a> <small>The First Ruby FunDay was held at Impetus Technologies, Noida...</small></li><li><a href='http://vinsol.com/blog/2008/11/25/presented-faceted-search-using-ultrasphinx/' rel='bookmark' title='Permanent Link: Presented faceted search using ultrasphinx'>Presented faceted search using ultrasphinx</a> <small>The first ruby funday held on 22nd Nov 2008 in...</small></li><li><a href='http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/' rel='bookmark' title='Permanent Link: 5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience'>5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience</a> <small>We will be again going to Rails Conf this year...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/txCyWj8ix6w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/</feedburner:origLink></item>
		<item>
		<title>Why RailsConf at Las Vegas is a great opportunity for the community ?</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/rcvbAFLKc78/</link>
		<comments>http://vinsol.com/blog/2009/05/03/why-railsconf-at-las-vegas-is-a-great-opportunity-for-the-community/#comments</comments>
		<pubDate>Sun, 03 May 2009 15:31:14 +0000</pubDate>
		<dc:creator>kapil</dc:creator>
				<category><![CDATA[about this site]]></category>
		<category><![CDATA[lasvegas]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[railsconf09]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=607</guid>
		<description><![CDATA[Just few hours before start of rails conf 09 ,  people have started assembling in Las Vegas.  Attendees reaching early are already finding themselves busy , I was following twitter stream of #railsconf  and  found some interesting tweets which you usually don&#8217;t find before a major tech conference :
: more than doubled my money playing [...]


Related posts:<ol><li><a href='http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/' rel='bookmark' title='Permanent Link: 5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience'>5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience</a> <small>We will be again going to Rails Conf this year...</small></li><li><a href='http://vinsol.com/blog/2009/03/16/we-are-going-to-rails-conf-2009/' rel='bookmark' title='Permanent Link: We are going to Rails Conf 2009'>We are going to Rails Conf 2009</a> <small> Yes, We are going to Rails Conf this year. ...</small></li><li><a href='http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/' rel='bookmark' title='Permanent Link: RailsConf Day 1 &#8211; Links to slides and blog posts'>RailsConf Day 1 &#8211; Links to slides and blog posts</a> <small> This is the official link for all the presentation...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Just few hours before start of rails conf 09 ,  people have started assembling in Las Vegas.  Attendees reaching early are already finding themselves busy , I was following twitter stream of #railsconf  and  found some interesting tweets which you usually don&#8217;t find before a major tech conference :</p>
<p><em>: </em><span><em>more than doubled my money playing blackjack tonight. </em><a href="http://search.twitter.com/search?q=%23railsconf" target="_blank"><em>#</em></a><strong><a href="http://search.twitter.com/search?q=%23railsconf" target="_blank"><em>railsconf</em></a></strong></span></p>
<div><em> </em><span><em>:On my 27th hour and drunk with </em><em> in Vegas! </em><a href="http://search.twitter.com/search?q=%23railsconf" target="_blank"><em>#</em><strong><em>railsconf</em></strong></a></span></div>
<div><span><strong><em><br />
</em></strong></span></div>
<div><span><em>:any other old fights we can drudge up? Let&#8217;s turn RailsConf into a 1,000+ person free-for-all brawl.</em></span></div>
<div><span><em><br />
</em></span></div>
<div><span><strong><em><a href="http://twitter.com/erbmicha" target="_blank"></a><span><span style="font-weight: normal;">:really excited for </span><a href="http://twitter.com/railsconf" target="_blank"><span style="font-weight: normal;">@railsconf</span></a><span style="font-weight: normal;"> &#8211; had 4 people tell me not to lose too much money. i wasn&#8217;t aware i had a gambling problem. (denial)</span></span></em></strong></span></div>
<div><span><strong><em><span><span style="font-weight: normal;"><br />
</span></span></em></strong></span></div>
<div><span><strong><span><span style="font-weight: normal;">And , people <a href="http://railspikes.com/2008/6/27/just-say-no-to-railsconf-vegas">opposing the idea of rails</a> conf in LV will be very happy looking at these tweets but they miss a very major point which objo puts it beautifully and why our team at Vinsol is attending railsconf :</span></span></strong></span></div>
<div><span><strong><span><span style="font-weight: normal;"><br />
</span></span></strong></span></div>
<div><a href="http://twitter.com/objo" target="_blank">objo</a>: <span>But thinking about the event and all the friends I get to see and I&#8217;m stoked. Location really does not matter. Some of the brightest minds I know get together once a year in the summer. What gets discussed months ahead of time? <a href="http://search.twitter.com/search?q=%23railsconf" target="_blank">#<strong>railsconf</strong></a></span></div>
<div><span><strong><br />
</strong></span></div>
<div>As a part of rails community, I would appeal all of the people coming to railsconf09 to work hard and play harder . It&#8217;s an opportunity for all of us to show that we are one of the best  community in the world with respect for everyone and some sense of humour.  Looking forward to meet all of you</div>
<div><a href="http://www.twitter.com/the_vinsol">@the_vinsol</a></div>


<p>Related posts:<ol><li><a href='http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/' rel='bookmark' title='Permanent Link: 5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience'>5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience</a> <small>We will be again going to Rails Conf this year...</small></li><li><a href='http://vinsol.com/blog/2009/03/16/we-are-going-to-rails-conf-2009/' rel='bookmark' title='Permanent Link: We are going to Rails Conf 2009'>We are going to Rails Conf 2009</a> <small> Yes, We are going to Rails Conf this year. ...</small></li><li><a href='http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/' rel='bookmark' title='Permanent Link: RailsConf Day 1 &#8211; Links to slides and blog posts'>RailsConf Day 1 &#8211; Links to slides and blog posts</a> <small> This is the official link for all the presentation...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/rcvbAFLKc78" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/05/03/why-railsconf-at-las-vegas-is-a-great-opportunity-for-the-community/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/05/03/why-railsconf-at-las-vegas-is-a-great-opportunity-for-the-community/</feedburner:origLink></item>
		<item>
		<title>5+4 = 9  Fresh Apps to Maximize your RailsConf 09 Experience</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/qD6b0q9nhFU/</link>
		<comments>http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/#comments</comments>
		<pubDate>Fri, 01 May 2009 18:09:49 +0000</pubDate>
		<dc:creator>kapil</dc:creator>
				<category><![CDATA[about this site]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[railsconf09]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=599</guid>
		<description><![CDATA[We will be again going to Rails Conf this year and are pretty psyched about meeting all the great developers in the conference.  Here is a list of 5 apps(most related to twitter in some way) that I feel are pretty useful for any attendee :

Rails Conf TweetUps - A really cool app that lets [...]


Related posts:<ol><li><a href='http://vinsol.com/blog/2009/05/03/why-railsconf-at-las-vegas-is-a-great-opportunity-for-the-community/' rel='bookmark' title='Permanent Link: Why RailsConf at Las Vegas is a great opportunity for the community ?'>Why RailsConf at Las Vegas is a great opportunity for the community ?</a> <small>Just few hours before start of rails conf 09 ,...</small></li><li><a href='http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/' rel='bookmark' title='Permanent Link: RailsConf Day 1 &#8211; Links to slides and blog posts'>RailsConf Day 1 &#8211; Links to slides and blog posts</a> <small> This is the official link for all the presentation...</small></li><li><a href='http://vinsol.com/blog/2009/03/16/we-are-going-to-rails-conf-2009/' rel='bookmark' title='Permanent Link: We are going to Rails Conf 2009'>We are going to Rails Conf 2009</a> <small> Yes, We are going to Rails Conf this year. ...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>We will be again going to Rails Conf this year and are pretty psyched about meeting all the great developers in the conference.  Here is a list of 5 apps(most related to twitter in some way) that I feel are pretty useful for any attendee :</p>
<ul>
<li><strong>Rails Conf TweetUps </strong>- A really cool app that lets you upload your conf  schedule and and check who among your followers and friends are going to which sessions.  <a href="http://railsconf.intridea.com/">http://railsconf.intridea.com/</a></li>
</ul>
<ul>
<li> <strong>RailsConf LiveStream</strong> &#8211; A great app to track rails conf through blogs, twitters, flickr and Youtube. <a href="http://live.blogblogs.com.br/stream/railsconf">http://live.blogblogs.com.br/stream/railsconf</a></li>
</ul>
<ul>
<li><strong>Floxee BackChannel</strong> &#8211; A great way to follow the happenings of Rails conf from a list of  334 attendees<a href="http://railsconf.floxee.com/"><span style="color: #000000; text-decoration: none;"> </span></a><a href="http://railsconf.floxee.com/">http://railsconf.floxee.com/</a></li>
</ul>
<ul>
<li><strong>Rails Conf Speakers</strong> &#8211; A list of all rails conf speakers who are tweeting <a href="http://railsconf.floxee.com/list/tweeting/session_title/.+">http://railsconf.floxee.com/list/tweeting/session_title/.+</a></li>
</ul>
<ul>
<li><strong>Conf Offers.com</strong> &#8211; This is our small app developed in last 24 hours. Idea is to aggregate and rate all the offers, jobs, discount coupons and freebies at rails conf 09.  All the offers in this app come directly from YOU, the attendees.  Why don&#8217;t you post the first offer now ? <a href="http://confoffers.com">www.confoffers.com</a></li>
</ul>
<ul>
<li> <strong>RailsMaturityModel.com</strong> &#8211; This is not related to conf directly but is scheduled to launch in railsconf 09.  Obie&#8217;s idea of improving the quality of rails service provider by exploring best practices considered atleast. <a href="http://www.railsmaturitymodel.com">www.railsmaturitymodel.com</a></li>
</ul>
<p>Updates</p>
<ul>
<li><strong>RailsBridge</strong> &#8211; Its a great effort to create friendly and accessible ruby on rails community after recent incidents. Something positive is always good. <a href="http://railsbridge.org/">http://railsbridge.org/</a></li>
</ul>
<ul>
<li><strong>Ruby Roster </strong>- Aims to  provide the best directory of Ruby developers anywhere <a href="https://www.rubyroster.com/about">https://www.rubyroster.com/about</a></li>
</ul>
<ul>
<li><strong>Twipick </strong>- Its a real time search engines for pics . Try this link <a href="http://picfog.com/tag/railsconf">http://picfog.com/tag/railsconf</a></li>
</ul>
<p>In case you have idea about more apps for railsconf&#8217; 09, feel free to post comments here.</p>
<p>Catch you in Vegas. Follow Us on Twitter <a href="http://www.twitter.com/the_vinsol">@the_vinsol</a></p>


<p>Related posts:<ol><li><a href='http://vinsol.com/blog/2009/05/03/why-railsconf-at-las-vegas-is-a-great-opportunity-for-the-community/' rel='bookmark' title='Permanent Link: Why RailsConf at Las Vegas is a great opportunity for the community ?'>Why RailsConf at Las Vegas is a great opportunity for the community ?</a> <small>Just few hours before start of rails conf 09 ,...</small></li><li><a href='http://vinsol.com/blog/2009/05/05/railsconf-day-1-links-to-slides-and-blog-posts/' rel='bookmark' title='Permanent Link: RailsConf Day 1 &#8211; Links to slides and blog posts'>RailsConf Day 1 &#8211; Links to slides and blog posts</a> <small> This is the official link for all the presentation...</small></li><li><a href='http://vinsol.com/blog/2009/03/16/we-are-going-to-rails-conf-2009/' rel='bookmark' title='Permanent Link: We are going to Rails Conf 2009'>We are going to Rails Conf 2009</a> <small> Yes, We are going to Rails Conf this year. ...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/qD6b0q9nhFU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/05/01/5-fresh-apps-to-maximize-your-railsconf-09-experience/</feedburner:origLink></item>
		<item>
		<title>Funding Driven Development (FUDD)</title>
		<link>http://feedproxy.google.com/~r/Vinsol/~3/44yYyoL6eY0/</link>
		<comments>http://vinsol.com/blog/2009/04/17/funding-driven-development-fudd/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 11:58:16 +0000</pubDate>
		<dc:creator>kapil</dc:creator>
				<category><![CDATA[about this site]]></category>

		<guid isPermaLink="false">http://vinsol.com/blog/?p=592</guid>
		<description><![CDATA[
We live in a quick-fix society so it&#8217;s no wonder that many startups especially in technology look for the magic cure to increase their sales or get funding for their projects.  These projects follow funding driven development methodology. And here are few symptoms of  FDD :

Most of these products start looking for investors  even when [...]


Related posts:<ol><li><a href='http://vinsol.com/blog/2009/02/17/what-every-iphone-developer-ought-to-know-about-googles-android-platform/' rel='bookmark' title='Permanent Link: What every iphone developer ought to know about Google&#8217;s Android platform ?'>What every iphone developer ought to know about Google&#8217;s Android platform ?</a> <small>I think Android is an undiscovered Gold mine for mobile...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" style="display: inline" title="elmer fudd" src="http://rightwingnuthouse.com/images/ElmerFudd.jpg" alt="" width="102" height="200" /></p>
<p>We live in a quick-fix society so it&#8217;s no wonder that many startups especially in technology look for the magic cure to increase their sales or get funding for their projects.  These projects follow funding driven development methodology. And here are few symptoms of  FDD :</p>
<ul>
<li>Most of these products start looking for investors  even when the core benefit web app is not properly conceptualized.</li>
<li>The product manager spends more time with PR,investors and newspapers than with developers.</li>
<li>The milestones for the project are strictly based on the next press release, media  interview or conference.</li>
<li>Instead of driving real people and customers to sales pipeline, you meet people who are not your target audience.</li>
<li>They always think of  raising capital and use major part of that in increasing/improving your sales force.</li>
<li>They lack patience and you dont want to wait for few quarters to reach the right feature set after product launch based on feedback.</li>
<li>They are least bothered about the backend and focus on UI. As long as the site looks cool , you are okay with that irrespective of the quality of  code running in the backend.</li>
<li>Instead of a single marketing launch, They have a series of launch with some new stupid feature everytime which nobody needs in every launch.</li>
<li>When investors see PR stuff of your project, they expect  significant momentum which usually is not there.PR is not writing code. You can not try it, iterate, learn, and try again.</li>
<li>The founders feel great when they are covered by leading media instead of significant release that improves their product.</li>
<li> They don&#8217;t understand the value of an early release, release often.</li>
</ul>


<p>Related posts:<ol><li><a href='http://vinsol.com/blog/2009/02/17/what-every-iphone-developer-ought-to-know-about-googles-android-platform/' rel='bookmark' title='Permanent Link: What every iphone developer ought to know about Google&#8217;s Android platform ?'>What every iphone developer ought to know about Google&#8217;s Android platform ?</a> <small>I think Android is an undiscovered Gold mine for mobile...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/Vinsol/~4/44yYyoL6eY0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vinsol.com/blog/2009/04/17/funding-driven-development-fudd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://vinsol.com/blog/2009/04/17/funding-driven-development-fudd/</feedburner:origLink></item>
	</channel>
</rss>
