<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Robby on Rails</title>
    <link>http://www.robbyonrails.com</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>thoughts.sort_by{|t| t[:topic]}.collect </description>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RobbyOnRails" /><feedburner:info uri="robbyonrails" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>45.52889</geo:lat><geo:long>-122.684581</geo:long><feedburner:browserFriendly>(Enter a personal message you would like to have appear at the top of your feed.)</feedburner:browserFriendly><item>
      <title>See you at LessConf and RailsConf?</title>
      <description>&lt;p&gt;Hey all,&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s been a while (most of my blogging is over on the &lt;a href="http://blog.planetargon.com/"&gt;Planet Argon blog&lt;/a&gt;)... but I&amp;#8217;m hoping to have some technical-related posts coming in the near future.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;ll be at &lt;a href="http://lessconf.com"&gt;LessConf&lt;/a&gt; in Florida this week, I&amp;#8217;ll be there. Do I owe you a drink?&lt;/p&gt;


	&lt;p&gt;Also, if you&amp;#8217;re coming to visit Portland for &lt;a href="http://www.railsconf.com/"&gt;RailsConf 2013&lt;/a&gt; and will arrive the weekend before, you should &lt;a href="http://planetargon.com/railsconf-hike"&gt;join us on a hike&lt;/a&gt;.  If you can&amp;#8217;t make it, be sure to say hello at the conference!&lt;/p&gt;


	&lt;p&gt;Hope all is well!&lt;/p&gt;


	&lt;p&gt;Cheers,
Robby&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=UcZlfq9zRCU:X7LL4ovPu5Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=UcZlfq9zRCU:X7LL4ovPu5Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=UcZlfq9zRCU:X7LL4ovPu5Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=UcZlfq9zRCU:X7LL4ovPu5Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=UcZlfq9zRCU:X7LL4ovPu5Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=UcZlfq9zRCU:X7LL4ovPu5Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=UcZlfq9zRCU:X7LL4ovPu5Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/UcZlfq9zRCU" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 09 Apr 2013 11:15:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:31687292-741a-4aba-a8eb-aae18b78f879</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/UcZlfq9zRCU/see-you-at-lessconf-and-railsconf</link>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>railsconf</category>
      <category>lessconf</category>
      <category>portland</category>
      <category>travel</category>
      <category>conferences</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2013/04/09/see-you-at-lessconf-and-railsconf</feedburner:origLink></item>
    <item>
      <title>2012 Rails Hosting Survey results</title>
      <description>&lt;p&gt;A few months ago we invited the Ruby on Rails community to participate in our hosting survey. We&amp;#8217;ve since &lt;a href="http://blog.planetargon.com/entries/2012/8/14/rails-hosting-survey-2012-results-are-in"&gt;published the results&lt;/a&gt; and created an &lt;a href="https://planetargon-blog.s3.amazonaws.com/images/infographic-2012-survey.png"&gt;infographic&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;To learn more, check out the &lt;a href="http://rails-hosting.com/"&gt;Rails Hosting&lt;/a&gt; site.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:Pyfako6jgMI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:Pyfako6jgMI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=93Y9dPhxFzg:Pyfako6jgMI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:Pyfako6jgMI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:Pyfako6jgMI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:Pyfako6jgMI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=93Y9dPhxFzg:Pyfako6jgMI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/93Y9dPhxFzg" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 14 Sep 2012 17:51:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:5c0d17ed-16f3-48f1-854e-c88ea2d841d1</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/93Y9dPhxFzg/2012-rails-hosting-survey-results</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>hosting</category>
      <category>survey</category>
      <category>deployment</category>
      <category>community</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2012/09/14/2012-rails-hosting-survey-results</feedburner:origLink></item>
    <item>
      <title>2012 Rails Hosting Survey results</title>
      <description>&lt;p&gt;A few months ago we invited the Ruby on Rails community to participate in our hosting survey. We&amp;#8217;ve since &lt;a href="http://blog.planetargon.com/entries/2012/8/14/rails-hosting-survey-2012-results-are-in"&gt;published the results&lt;/a&gt; and created an &lt;a href="https://planetargon-blog.s3.amazonaws.com/images/infographic-2012-survey.png"&gt;infographic&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;To learn more, check out the &lt;a href="http://rails-hosting.com/"&gt;Rails Hosting&lt;/a&gt; site.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:AQBZ0g4pm_Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:AQBZ0g4pm_Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=93Y9dPhxFzg:AQBZ0g4pm_Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:AQBZ0g4pm_Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:AQBZ0g4pm_Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=93Y9dPhxFzg:AQBZ0g4pm_Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=93Y9dPhxFzg:AQBZ0g4pm_Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/93Y9dPhxFzg" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 14 Sep 2012 17:51:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:026b12af-fa4e-4c5d-81f1-96e0727e4271</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/93Y9dPhxFzg/2012-rails-hosting-survey-results</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>hosting</category>
      <category>survey</category>
      <category>deployment</category>
      <category>community</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2012/09/14/2012-rails-hosting-survey-results</feedburner:origLink></item>
    <item>
      <title>GoogleAnalyticsProxy - now minified</title>
      <description>&lt;p&gt;It&amp;#8217;s been several years since I released &lt;a href="https://github.com/robbyrussell/GoogleAnalyticsProxy"&gt;GoogleAnalyticsProxy&lt;/a&gt;, which allows our team to test their GA event/click/view tracking during the development phases of our project. Today, I pushed a quick update to it with a minified version of the JavaScript so that there is a smaller footprint.&lt;/p&gt;


	&lt;p&gt;For more information on how we use it, read my older post, &lt;a href="http://www.robbyonrails.com/articles/2009/11/01/googleanalyticsproxy-for-development-environment-tracking-events-in-google-analytics"&gt;Tracking Google Analytics events in development environment with GoogleAnalyticsProxy&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=aloTzmj5iiU:k3fUaRbN4bE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=aloTzmj5iiU:k3fUaRbN4bE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=aloTzmj5iiU:k3fUaRbN4bE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=aloTzmj5iiU:k3fUaRbN4bE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=aloTzmj5iiU:k3fUaRbN4bE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=aloTzmj5iiU:k3fUaRbN4bE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=aloTzmj5iiU:k3fUaRbN4bE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/aloTzmj5iiU" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 10 Jul 2012 12:39:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:bda3636e-5cc5-438f-b588-d11ab6e55329</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/aloTzmj5iiU/googleanalyticsproxy-now-minified</link>
      <category>google</category>
      <category>analytics</category>
      <category>javascript</category>
      <category>development</category>
      <category>metrics</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2012/07/10/googleanalyticsproxy-now-minified</feedburner:origLink></item>
    <item>
      <title>Planet Argon on social media</title>
      <description>&lt;p&gt;You can follow along with some of my writing at the following sites:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://www.facebook.com/planetargon"&gt;Planet Argon on Facebook&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://twitter.com/planetargon"&gt;Planet Argon on twitter&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.planetargon.com/"&gt;Planet Argon blog&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=V4ukB29gfYs:dRuEO7TMVOY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=V4ukB29gfYs:dRuEO7TMVOY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=V4ukB29gfYs:dRuEO7TMVOY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=V4ukB29gfYs:dRuEO7TMVOY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=V4ukB29gfYs:dRuEO7TMVOY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=V4ukB29gfYs:dRuEO7TMVOY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=V4ukB29gfYs:dRuEO7TMVOY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/V4ukB29gfYs" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 05 Jul 2012 22:36:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:20e85d5d-6fe5-4679-a45e-ee43f2b1ba02</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/V4ukB29gfYs/planet-argon-on-social-media</link>
      <category>Business</category>
      <category>PLANET ARGON</category>
      <category>facebook</category>
      <category>twitter</category>
      <category>planet</category>
      <category>argon</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2012/07/05/planet-argon-on-social-media</feedburner:origLink></item>
    <item>
      <title>Setting Akamai Edge-Control headers with Ruby on Rails</title>
      <description>&lt;p&gt;Just a short and sweet little tip.&lt;/p&gt;


	&lt;p&gt;Several months ago we moved one of our clients over to Akamai&amp;#8217;s Content Delivery Network (CDN). Ww were previously using a combination of Amazon S3 and CloudFront with &lt;em&gt;some&lt;/em&gt; benefits, but we were finding several key areas of the world were not s covered by Amazon (yet) for asset delivery. Along with that, we really wanted to take advantage of the &lt;span class="caps"&gt;CDN&lt;/span&gt; for more of our &lt;span class="caps"&gt;HTML&lt;/span&gt; content with a lot of complex rules that related to geo-targeting and regionalization of content.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll try to cover those topics in another post, but wanted to share a few tidbits of code that we are using to manage Akamai&amp;#8217;s Edge-control caches from within our Rails application.&lt;/p&gt;


	&lt;p&gt;With Akamai, we&amp;#8217;re able to tell their Edge servers whether it should hold on to the response so it can try to avoid an extra request to the origin (aka our Rails application). From Rails, we just added a few helper methods to our controllers so that we can litter our application with various expiration times.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="comment"&gt;# Sets the headers for Akamai&lt;/span&gt;
  &lt;span class="comment"&gt;# acceptable formats include:&lt;/span&gt;
  &lt;span class="comment"&gt;#   1m, 10m, 90m, 2h, 5d&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;set_cache_control_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;maxage&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;20m&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;headers&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;Edge-control&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;!no-store, max-age=&lt;span class="expr"&gt;#{maxage}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This allows us to do things like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;ProductsController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ApplicationController&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;show&lt;/span&gt;
      &lt;span class="ident"&gt;set_cache_control_for&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;4h&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
      &lt;span class="attribute"&gt;@product&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:id&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Then when Akamai gets a request for &lt;code&gt;http://domain.com/products/20-foo-bar&lt;/code&gt;, it&amp;#8217;ll try to keep a cached copy around for four hours before it hits our server again.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=PxPmnnQtEcI:0nV0da7sEHQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=PxPmnnQtEcI:0nV0da7sEHQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=PxPmnnQtEcI:0nV0da7sEHQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=PxPmnnQtEcI:0nV0da7sEHQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=PxPmnnQtEcI:0nV0da7sEHQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=PxPmnnQtEcI:0nV0da7sEHQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=PxPmnnQtEcI:0nV0da7sEHQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/PxPmnnQtEcI" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 19 Jun 2012 00:54:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:029e2f64-44bd-4b0b-89be-c669171f1807</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/PxPmnnQtEcI/setting-akamai-edge-control-headers-with-ruby-on-rails</link>
      <category>Ruby on Rails</category>
      <category>akamai</category>
      <category>ruby</category>
      <category>on</category>
      <category>rails</category>
      <category>performance</category>
      <category>caching</category>
      <category>controllers</category>
      <category>helpers</category>
    <category domain="http://rss.financialcontent.com/stocksymbol">CDN</category><feedburner:origLink>http://www.robbyonrails.com/articles/2012/06/19/setting-akamai-edge-control-headers-with-ruby-on-rails</feedburner:origLink></item>
    <item>
      <title>Announcing the 2012 Rails Hosting Survery</title>
      <description>&lt;p&gt;You might recall that back in 2009, we surveyed the Ruby on Rails community to gauge how people were deploying and hosting their applications. It&amp;#8217;s been over three years, so we&amp;#8217;ve decided to run it again&amp;#8230;. I know&amp;#8230; we&amp;#8217;re crazy like that!&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://rails-hosting.com/?utm_source=robbyonrails&amp;#38;utm_medium=blog&amp;#38;utm_campaign=announcement"&gt;&lt;img src="http://rails-hosting.com/img/img_rails_hosting_survey.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;So&amp;#8230; without further ado&amp;#8230; we present &lt;a href="http://rails-hosting.com/?utm_source=robbyonrails&amp;#38;utm_medium=blog&amp;#38;utm_campaign=announcement"&gt;the 2012 Rails Hosting Survey&lt;/a&gt;. We&amp;#8217;ll be collecting responses for a month, so be sure to put it on your todo list.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=LhPfe8vZCE4:Uyxu5GUr7jo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=LhPfe8vZCE4:Uyxu5GUr7jo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=LhPfe8vZCE4:Uyxu5GUr7jo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=LhPfe8vZCE4:Uyxu5GUr7jo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=LhPfe8vZCE4:Uyxu5GUr7jo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=LhPfe8vZCE4:Uyxu5GUr7jo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=LhPfe8vZCE4:Uyxu5GUr7jo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/LhPfe8vZCE4" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 31 May 2012 13:40:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8895e969-533e-4f5d-83d1-2dbc52e70690</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/LhPfe8vZCE4/announcing-the-2012-rails-hosting-survery</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>hosting</category>
      <category>deployment</category>
      <category>rubyonrails</category>
      <category>rails</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2012/05/31/announcing-the-2012-rails-hosting-survery</feedburner:origLink></item>
    <item>
      <title>A Mobile Site or Responsive Design?</title>
      <description>&lt;p&gt;Our team at &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt; just released a white paper on this topic. I&amp;#8217;d like to invite you to &lt;a href="http://blog.planetargon.com/entries/2012/5/29/white-paper-responsive-design-vs-mobile-site"&gt;check it out&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=ZSmSCqkk-zY:MzDUdZNBZTc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=ZSmSCqkk-zY:MzDUdZNBZTc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=ZSmSCqkk-zY:MzDUdZNBZTc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=ZSmSCqkk-zY:MzDUdZNBZTc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=ZSmSCqkk-zY:MzDUdZNBZTc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=ZSmSCqkk-zY:MzDUdZNBZTc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=ZSmSCqkk-zY:MzDUdZNBZTc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/ZSmSCqkk-zY" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 30 May 2012 14:45:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d1cca65e-040b-4ed5-82dd-858c257c347e</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/ZSmSCqkk-zY/a-mobile-site-or-responsive-design</link>
      <category>PLANET ARGON</category>
      <category>mobile</category>
      <category>html</category>
      <category>css</category>
      <category>responsive</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2012/05/30/a-mobile-site-or-responsive-design</feedburner:origLink></item>
    <item>
      <title>Planet Argon is hiring</title>
      <description>&lt;p&gt;Hello all!&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve been so busy this year travelling (for pleasure and work) and helping grow the company that I&amp;#8217;ve not had much to say here. Expect some posts soon!&lt;/p&gt;


	&lt;p&gt;In the meantime, if you&amp;#8217;re looking for a new challenge&amp;#8230; &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt; is seeking a few more Ruby on Rails developers. Interested? &lt;a href="http://planetargon.com/careers"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=KvLrGvwylio:YQOfafAMWy4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=KvLrGvwylio:YQOfafAMWy4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=KvLrGvwylio:YQOfafAMWy4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=KvLrGvwylio:YQOfafAMWy4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=KvLrGvwylio:YQOfafAMWy4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=KvLrGvwylio:YQOfafAMWy4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=KvLrGvwylio:YQOfafAMWy4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/KvLrGvwylio" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 22 Aug 2011 23:28:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8ed35c54-95b8-43a6-a3a5-171022db0e44</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/KvLrGvwylio/planet-argon-is-hiring</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>jobs</category>
      <category>rubyonrails</category>
      <category>planetargon</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2011/08/22/planet-argon-is-hiring</feedburner:origLink></item>
    <item>
      <title>Announcing RailsDeveloper</title>
      <description>&lt;p&gt;Earlier today&amp;#8230; our team at &lt;a href="http://planetargon.com/"&gt;Planet Argon&lt;/a&gt; launched a new site for the Ruby on Rails community. If you have a few spare minutes, I&amp;#8217;d love it if you&amp;#8217;d to head over and &lt;a href="http://railsdeveloper.com/blog/2010/8/31/we-are-railsdeveloper"&gt;read the announcement&lt;/a&gt; on &lt;a href="http://railsdeveloper.com"&gt;RailsDeveloper&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=zN82LA5csyA:opKiOuNMEHw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=zN82LA5csyA:opKiOuNMEHw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=zN82LA5csyA:opKiOuNMEHw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=zN82LA5csyA:opKiOuNMEHw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=zN82LA5csyA:opKiOuNMEHw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=zN82LA5csyA:opKiOuNMEHw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=zN82LA5csyA:opKiOuNMEHw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/zN82LA5csyA" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 01 Sep 2010 12:01:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6fe475bc-a1c1-44b7-a195-df91d701d824</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/zN82LA5csyA/announcing-railsdeveloper</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>railsdeveloper</category>
      <category>rubyonrails</category>
      <category>rails</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2010/09/01/announcing-railsdeveloper</feedburner:origLink></item>
    <item>
      <title>Join the zsh revolution</title>
      <description>&lt;p&gt;I love the OhMyZsh community. Let&amp;#8217;s grow it a little more this next Tuesday.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://twitter.com/ohmyzsh/status/14812098501"&gt;&lt;img src="http://img.skitch.com/20100527-pnc2xtigq9xerriem7txddwi7s.preview.jpg" alt="Twitter / Oh My Zsh: Declaring that next Tuesda ..." /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;Join the Zsh revolution here&amp;#8230;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XEH0bCbJGpc:s5COtTolBUc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XEH0bCbJGpc:s5COtTolBUc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=XEH0bCbJGpc:s5COtTolBUc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XEH0bCbJGpc:s5COtTolBUc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XEH0bCbJGpc:s5COtTolBUc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XEH0bCbJGpc:s5COtTolBUc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=XEH0bCbJGpc:s5COtTolBUc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/XEH0bCbJGpc" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 27 May 2010 12:17:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2766f0b7-3e6e-45c6-8bc4-154409587c1c</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/XEH0bCbJGpc/join-the-zsh-revolution</link>
      <category>zsh</category>
      <category>ohmyzsh</category>
      <category>console</category>
      <category>terminal</category>
      <category>bash</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2010/05/27/join-the-zsh-revolution</feedburner:origLink></item>
    <item>
      <title>Planet Argon Blog</title>
      <description>&lt;p&gt;Just a quick update to let you know that I&amp;#8217;ll be moving more of my business-related topics to the &lt;a href="http://blog.planetargon.com"&gt;Planet Argon Blog&lt;/a&gt;. I invite you to &lt;a href="http://feeds.feedburner.com/planetargon"&gt;subscribe to that feed&lt;/a&gt; as well. :-)&lt;/p&gt;


	&lt;p&gt;p.s. We just published Episode 4 of the &lt;a href="http://planetargon.com/podcast"&gt;Planet Argon Podcast&lt;/a&gt;, which was on the topic of Hiring designers.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=CCJJPxix8xw:Q8ZCc3EMkzA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=CCJJPxix8xw:Q8ZCc3EMkzA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=CCJJPxix8xw:Q8ZCc3EMkzA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=CCJJPxix8xw:Q8ZCc3EMkzA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=CCJJPxix8xw:Q8ZCc3EMkzA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=CCJJPxix8xw:Q8ZCc3EMkzA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=CCJJPxix8xw:Q8ZCc3EMkzA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/CCJJPxix8xw" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 17 Feb 2010 09:11:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:24463249-ef68-4d4a-93b5-6dc95beb80d3</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/CCJJPxix8xw/planet-argon-blog</link>
      <category>Business</category>
      <category>PLANET ARGON</category>
      <category>planetargon</category>
      <category>blog</category>
      <category>podcast</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2010/02/17/planet-argon-blog</feedburner:origLink></item>
    <item>
      <title>Installing Ruby on Rails, Passenger, PostgreSQL, MySQL, Oh My Zsh on Snow Leopard, Fourth Edition</title>
      <description>&lt;p&gt;Welcome to what seems like my tenth installment (actually, it&amp;#8217;s the fourth) of showing you how I setup my development environment on a fresh &lt;span class="caps"&gt;OSX&lt;/span&gt; install. In this case, I&amp;#8217;m actually getting a MacBook setup for a new employee with Snow Leopard.&lt;/p&gt;


	&lt;p&gt;Over the years, I&amp;#8217;ve evolved these following steps and they&amp;#8217;ve helped our team maintain a consistent and stable envirnment for Ruby on Rails development. I know that there are a few other ways to approaching this and I&amp;#8217;m sure you&amp;#8217;ll get similar results, but this approach has allowed me to maintain a hassle-free setup for the last five years.&lt;/p&gt;


	&lt;p&gt;As with all things&amp;#8230; your milage may vary.&lt;/p&gt;


	&lt;h2&gt;Phase One&lt;/h2&gt;


	&lt;p&gt;During this initial phase, we&amp;#8217;re going to install the primary dependencies and setup our environment.&lt;/p&gt;


	&lt;h3&gt;XCode&lt;/h3&gt;


	&lt;p&gt;The first thing that you&amp;#8217;ll need to do is install XCode, which almost everything depends upon as this will install developer-friendly tools for you. Apple has been kind enough to ship this on your Snow Leopard &lt;span class="caps"&gt;DVD&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-kmamssde4apw1qxcs6u991p518.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Go ahead and install XCode from the &lt;strong&gt;Optional Installs&lt;/strong&gt; folder.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-1up5s7ahybmryrerrxxwn1d7tu.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;(might require a reboot)&lt;/p&gt;


	&lt;p&gt;You can also &lt;a href="http://developer.apple.com/technology/xcode.html"&gt;download it&lt;/a&gt; online.&lt;/p&gt;


	&lt;h3&gt;MacPorts&lt;/h3&gt;


	&lt;p&gt;Now we’ll install MacPorts, which the web site describes itself as, &amp;#8220;an open-source community initiative to design an easy-to-use system for compiling, installing, and upgrading either command-line, &lt;span class="caps"&gt;X11&lt;/span&gt; or Aqua based open-source software on the Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; operating system.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;As I&amp;#8217;ve said in past versions of this guide, this tool is about to become one of the most important tools on your operating system. It&amp;#8217;ll be used time and time again to maintain your libraries and many of the Unix tools that you&amp;#8217;ll be using. If you&amp;#8217;re from the Linux or &lt;span class="caps"&gt;BSD&lt;/span&gt; world, you are likely familiar with similar tools… such as: &lt;code&gt;apt-get&lt;/code&gt;, &lt;code&gt;port&lt;/code&gt;, and &lt;code&gt;yum&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;You&amp;#8217;ll want to download the latest stable version from &lt;a href="http://www.macports.org"&gt;http://www.macports.org/&lt;/a&gt;. Once downloaded, you can install it.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-fd4h7rd16437yd63hf45mkn592.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Once this is installed, you&amp;#8217;ll be able to use the &lt;code&gt;port&lt;/code&gt; command from your console.&lt;/p&gt;


	&lt;h3&gt;Wget&lt;/h3&gt;


	&lt;p&gt;Let&amp;#8217;s test out your MacPorts install by installing a useful tool called wget, which we&amp;#8217;ll use to install oh-my-zsh.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo port install wget&lt;/code&gt;&lt;/p&gt;


	&lt;h3&gt;Git and Subversion&lt;/h3&gt;


	&lt;p&gt;Every development environment should have some source code management tools available. We&amp;#8217;ll install both of these with one command.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo port install git-core +svn&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;This will install git and subversion.&lt;/p&gt;


	&lt;h3&gt;oh-my-zsh&lt;/h3&gt;


	&lt;p&gt;&lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;Oh My Zsh&lt;/a&gt; is the most amazing thing to happen to shells since&amp;#8230; well since I said so. It&amp;#8217;s one of my open source projects that I encourage you to give a whirl.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;That&amp;#8217;s it. The next time you open up your terminal, you&amp;#8217;ll be running zsh with a bunch of stuff available. For more information, visit &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;http://github.com/robbyrussell/oh-my-zsh&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Terminal theme (optional)&lt;/h3&gt;


	&lt;p&gt;I never understood why the icon for Terminal has a black background but when you start it up the default theme is black on white.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-1b92cbx8gtuttqsbdd49qspq7f.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;versus&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-8dnmpswyumfk73h942g6u4fih4.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Anyhow, I&amp;#8217;m a fan of the the dark background. To change this, open up preferences in Terminal. Select &lt;strong&gt;Pro&lt;/strong&gt;, then click on the &lt;strong&gt;Default&lt;/strong&gt; window so that this sticks around.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-mr4q4y5btq7sscuh7ceky3ahgx.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s now open up a new Terminal window..&lt;/p&gt;


	&lt;p&gt;You should be looking at something like this:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-psmj7mqsx38j1i2nj75n6hbcg7.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Much better&amp;#8230; let&amp;#8217;s continue.&lt;/p&gt;


	&lt;h2&gt;Phase Two&lt;/h2&gt;


	&lt;p&gt;We&amp;#8217;re now going to start installing everything we need to get this running.&lt;/p&gt;


	&lt;h3&gt;Ruby 1.8.7.x&lt;/h3&gt;


	&lt;p&gt;First up, Ruby.&lt;/p&gt;


	&lt;p&gt;Snow Leopard includes Ruby and Rails already installed, but we&amp;#8217;re going to back these up for a rainy day. Just issue these  commands:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
$ sudo su -
Password:
:~ root# mv /usr/bin/ruby /usr/bin/ruby.orig
:~ root# mv /usr/bin/gem /usr/bin/gem.orig
:~ root# mv /usr/bin/rails /usr/bin/rails.orig
:~ root# logout
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-b7cxbt8andg3t7ntn17r1wahfg.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Now we&amp;#8217;ll go ahead and install a fresh copy of Ruby and RubyGems via MacPorts.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo port install ruby rb-rubygems&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;You should now see something like this for a bit&amp;#8230;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-n9xxiaqbe6bw72qr88dgurxqdp.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s watch a video about bumble bees.&lt;/p&gt;


&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/R-o6e57AEGo&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/R-o6e57AEGo&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;p&gt;When it finishes installing, you should check that Ruby is available to you and installed in &lt;code&gt;/opt/local/bin&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-tfc3ifeaau15295r9sfmfhbnm1.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ll also take a second to create a symlink for this as some tools seem to rely on &lt;code&gt;/usr/bin/ruby&lt;/code&gt; being there.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo ln -s /opt/local/bin/ruby /usr/bin/ruby&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Great, let&amp;#8217;s move on.&lt;/p&gt;


	&lt;h3&gt;Passenger (mod_rails)&lt;/h3&gt;


	&lt;p&gt;Now that we have Ruby installed, we&amp;#8217;re going to take a quick detour to setup Passenger with the Apache server already available on your machine. I&amp;#8217;ve been a big fan of using Passenger for your development for over a year now.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo gem install passenger&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Once the gem is finished installing, you&amp;#8217;ll need to install the apache2 module with the following command:&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;ll ask you to continue by pressing Enter. At this point, it&amp;#8217;ll check that you have all the necessary dependencies and then compile everything needed for Apache2.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-x4rcmr6m5q44etk7rad2kqpmir.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Now I&amp;#8217;ll force you to watch a highlights reel of Fernando Torres&amp;#8230; &lt;em&gt;the best striker in the world!&lt;/em&gt;&lt;/p&gt;


&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jRtq6TtSxbE&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jRtq6TtSxbE&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;p&gt;The passenger install will then show you this output, which you&amp;#8217;ll want to stop and read for a moment and highlight the following:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-ms13ub2srx2axk6ti43ifiyut4.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Then using vi or emacs, you&amp;#8217;ll want to create a new file with the following content:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;vi /etc/apache2/other/passenger.conf&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Then paste in the following (what you highlighted and copied above.)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
LoadModule passenger_module /opt/local/lib/ruby/gems/1.8/gems/passenger-2.2.9/ext/apache2/mod_passenger.so
PassengerRoot /opt/local/lib/ruby/gems/1.8/gems/passenger-2.2.9
PassengerRuby /opt/local/bin/ruby
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;You&amp;#8217;ll also want to include the following below what you just pasted.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  # Set the default environment to development
  RailsEnv development

  # Which directory do you want Apache to be able to look into for projects?
  &amp;lt;Directory "/Users/ryangensel/development"&amp;gt;
      Order allow,deny
      Allow from all
  &amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;You&amp;#8217;ll want to quickly start up your web sharing, which will start Apache2 up via your System Preferences.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-ekr2g6f5seb6iif35fteyjfi74.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-rm96gmde4d8ffwjbdyqusiqr8f.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Simple enough&amp;#8230; moving forward.&lt;/p&gt;


	&lt;h3&gt;Passenger Pref Pane&lt;/h3&gt;


	&lt;p&gt;To make things as simple as possible, I&amp;#8217;d encourage you to install the &lt;a href="http://www.fngtps.com/2009/09/new-os-more-pane-passenger-preference-pane-v1-3"&gt;Passenger Preference Pane&lt;/a&gt; (view this post for a download).&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-ra8p88abxtnxbq3m9711gbpryb.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;h3&gt;Development directory&lt;/h3&gt;


	&lt;p&gt;I have a directory named &lt;code&gt;development/&lt;/code&gt; in my home directory, which is where I end up storing all of my projects. This should match whatever you put above in the apache configuration (&lt;code&gt;&amp;lt;Directory "/Users/ryangensel/development"&amp;gt;&lt;/code&gt;).&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;mkdir development; cd development;&lt;/code&gt;&lt;/p&gt;


	&lt;h3&gt;Installing Ruby on Rails via RubyGems&lt;/h3&gt;


	&lt;p&gt;Now we&amp;#8217;ll use RubyGems to install the latest version of Ruby on Rails (and all of it&amp;#8217;s dependencies).&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo gem install rails&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-eyhg4t9sscbeiccs5rxkb5p35.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;While this is installing, you can watch a video from my old band that ended around the time that business started picking up for &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt;.&lt;/p&gt;


&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SJvncb3bVdg&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/SJvncb3bVdg&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;p&gt;Great, let&amp;#8217;s test out the install of Rails&amp;#8230;&lt;/p&gt;


	&lt;h3&gt;Test Rails and Passenger&lt;/h3&gt;


	&lt;p&gt;In your development directory, let&amp;#8217;s quickly a new Rails app&amp;#8230;&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;rails testapp&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;This will generate a new Rails application in a &lt;code&gt;testapp/&lt;/code&gt; directory.&lt;/p&gt;


	&lt;p&gt;Now open up the &lt;strong&gt;Passenger Preferences Pane&lt;/strong&gt; and add this directory as a new application.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-83rjan794eqcmy62e1u4aujtiy.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-tms89ssutthhq8rkpjm392qfpb.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Press Apply&amp;#8230;&lt;/p&gt;


	&lt;p&gt;You should now fire up your browser of choice and head to &lt;code&gt;http://testapp.local&lt;/code&gt;. If all has worked, you&amp;#8217;ll see a, &amp;#8220;Welcome aboard&amp;#8221; screen from the Ruby on Rails application.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-c9phjdfq8ybcu29uc5k9qiuha9.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Assuming that this worked for you, let&amp;#8217;s take a quick break to make some tea&amp;#8230;&lt;/p&gt;


	&lt;h2&gt;Phase Three&lt;/h2&gt;


	&lt;p&gt;In this last phase, we&amp;#8217;re going to install a few database servers and corresponding rubygems so that you can get to work.&lt;/p&gt;


	&lt;h3&gt;PostgreSQL&lt;/h3&gt;


	&lt;p&gt;At &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt;, we build our web applications on top of &lt;a href="http://postgresql.org"&gt;PostgreSQL&lt;/a&gt;. I&amp;#8217;ve been a long-time advocate of it and hope you consider using it yourself.&lt;/p&gt;


	&lt;p&gt;At this point in time, the current stable version of PostgreSQL via MacPorts is 8.4.x. Let&amp;#8217;s install that now&amp;#8230;&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo port install postgresql84 postgresql84-server&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Once this finishes compiling, you&amp;#8217;ll need to run the following commands to setup a new PostgreSQL database.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
sudo mkdir -p /opt/local/var/db/postgresql84/defaultdb
sudo chown postgres:postgres /opt/local/var/db/postgresql84/defaultdb
sudo su postgres -c '/opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb'
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Assuming that you want PostgreSQL to always be running, you can run:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql84-server.plist&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;...and to start it right now, run:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo launchctl start org.macports.postgresql84-server&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Before you can start using it, we&amp;#8217;ll need to make sure that the PostgreSQL executables are available in your shell path. Since you&amp;#8217;re now using &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;oh-my-zsh&lt;/a&gt;, you&amp;#8217;ll want to edit &lt;code&gt;~/.zshrc&lt;/code&gt; with your favorite editor.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;vi ~/.zshrc&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Just append this to &lt;code&gt;export PATH=&lt;/code&gt; line in the file.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;:/opt/local/lib/postgresql84/bin&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Your &lt;span class="caps"&gt;PATH&lt;/span&gt; might look something like the following now:&lt;/p&gt;


	&lt;p&gt;@# Customize to your needs&amp;#8230;
export &lt;span class="caps"&gt;PATH&lt;/span&gt;=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/lib/postgresql84/bin@&lt;/p&gt;


	&lt;h4&gt;Setup database user&lt;/h4&gt;


	&lt;p&gt;To setup a new database (with superuser credentials), just run:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;createuser --superuser ryangensel -U postgres&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ll now test creating a database:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;createdb test_db&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s test that we can access it&amp;#8230;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
➜  ~  psql test_db
psql (8.4.2)
Type "help" for help.

test_db=# \q
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Great, let&amp;#8217;s drop it now.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
➜  ~  dropdb test_db
➜  ~  psql test_db
psql: FATAL:  database "test_db" does not exist
➜  ~
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Okay, we&amp;#8217;ll now install the library that will allow Ruby to talk to PostgreSQL.&lt;/p&gt;


	&lt;p&gt;Just run: &lt;code&gt;sudo gem install pg&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-b4cf1pm1utkf2ihd9up432etwm.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Voila&amp;#8230; let&amp;#8217;s move on to the inferior database&amp;#8230;&lt;/p&gt;


	&lt;h3&gt;MySQL&lt;/h3&gt;


	&lt;p&gt;We&amp;#8217;re going to run through the installation of MySQL really quickly because you might need it.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo port install mysql5 mysql5-server&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;This took ages on my machine&amp;#8230; so let&amp;#8217;s watch a video.&lt;/p&gt;


&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LOZIjWJpiBk&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LOZIjWJpiBk&amp;#38;hl=en_US&amp;#38;fs=1&amp;#38;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;p&gt;We&amp;#8217;ll now setup the database and make sure it starts on system boot.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
 sudo -u _mysql mysql_install_db5
 sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
 sudo launchctl start org.macports.mysql5
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Let&amp;#8217;s test that we can create a database now (and that it&amp;#8217;s running.)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
 ➜  ~  mysql5 -u root
 Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 3
 Server version: 5.1.43 Source distribution

 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 mysql&amp;gt; create database test1;
 Query OK, 1 row affected (0.00 sec)

 mysql&amp;gt; \q
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Great, we&amp;#8217;ll now install the library that will allow Ruby to talk to MySQL.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;sudo gem install mysql -- --with-mysql-config=/opt/local/lib/mysql5/bin/mysql_config&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;That should be it!&lt;/p&gt;


	&lt;h3&gt;Phase Four, next steps&lt;/h3&gt;


	&lt;p&gt;Okay&amp;#8230; so we&amp;#8217;ve installed XCode, MacPorts, Ruby, Rails, PostgreSQL, MySQL&amp;#8230; and I&amp;#8217;ve also got you to switch your default terminal shell from bash to zsh. You might take a look over the &lt;a href="http://wiki.github.com/robbyrussell/oh-my-zsh/themes"&gt;available themes for Oh My Zsh&lt;/a&gt; so that you can personalize your terminal experience even further.&lt;/p&gt;


	&lt;p&gt;You also now have a handful of gems installed as you can see with &lt;code&gt;gem list&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20100208-p2kkjnng2b2kebeenkwkihn2p5.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;h3&gt;Closing thoughts&amp;#8230;&lt;/h3&gt;


	&lt;p&gt;This is the fourth version of this guide and I&amp;#8217;ve appreciated the hundreds of comments, questions, and emails that I have received&amp;#8230; let&amp;#8217;s not forget all those beers that people buy me when I&amp;#8217;m at conferences. :-)&lt;/p&gt;


	&lt;p&gt;I hope you have found some of this useful. If you have any problems and/or questions, don&amp;#8217;t hesitate to post them in the comments section below.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=kN-FSueN98w:RFyY6yzVe84:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=kN-FSueN98w:RFyY6yzVe84:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=kN-FSueN98w:RFyY6yzVe84:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=kN-FSueN98w:RFyY6yzVe84:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=kN-FSueN98w:RFyY6yzVe84:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=kN-FSueN98w:RFyY6yzVe84:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=kN-FSueN98w:RFyY6yzVe84:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/kN-FSueN98w" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 08 Feb 2010 13:14:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:2387d63c-c145-4f7e-ad77-e3aa9aabacef</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/kN-FSueN98w/installing-ruby-on-rails-passenger-postgresql-mysql-oh-my-zsh-on-snow-leopard-fourth-edition</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PostgreSQL</category>
      <category>PLANET ARGON</category>
      <category>rubyonrails</category>
      <category>github</category>
      <category>ohmyzsh</category>
      <category>zsh</category>
      <category>postgresql</category>
      <category>mysql</category>
      <category>rails</category>
      <category>ruby</category>
      <category>xcode</category>
      <category>snowleopard</category>
      <category>osx</category>
      <category>guide</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2010/02/08/installing-ruby-on-rails-passenger-postgresql-mysql-oh-my-zsh-on-snow-leopard-fourth-edition</feedburner:origLink></item>
    <item>
      <title>(oh my) Zsh themes Gone Wild! 18+</title>
      <description>&lt;p&gt;Earlier this evening, I accepted a pull-request for theme number 18, which is now included in &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;Oh My Zsh&lt;/a&gt;. To celebrate, I&amp;#8217;ve updated the &lt;a href="http://wiki.github.com/robbyrussell/oh-my-zsh/themes"&gt;themes wiki page&lt;/a&gt; with fresh screenshots.&lt;/p&gt;


	&lt;p&gt;Here is a sampling of some of the themes that you can use out of the box with &lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;Oh My Zsh&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/robbyrussell/oh-my-zsh"&gt;&lt;img src="http://robbyonrails.com/files/ohmyzsh-themes.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Oh My Zsh is much more than a collection of themes for your zsh config. It&amp;#8217;s a way of life&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


	&lt;p&gt;Also, be sure to follow &lt;a href="http://twitter.com/ohmyzsh"&gt;ohmyzsh&lt;/a&gt; on twitter now!&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; well.. at least while you&amp;#8217;re in the terminal. ;-)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1XJ-4fOA1XM:rPsqkr9mjMU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1XJ-4fOA1XM:rPsqkr9mjMU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=1XJ-4fOA1XM:rPsqkr9mjMU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1XJ-4fOA1XM:rPsqkr9mjMU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1XJ-4fOA1XM:rPsqkr9mjMU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1XJ-4fOA1XM:rPsqkr9mjMU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=1XJ-4fOA1XM:rPsqkr9mjMU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/1XJ-4fOA1XM" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 28 Dec 2009 00:25:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1ea0b1b9-5c4c-4282-871b-26d24714b96a</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/1XJ-4fOA1XM/zsh-themes-gone-wild-18</link>
      <category>Programming</category>
      <category>zsh</category>
      <category>ohmyzsh</category>
      <category>github</category>
      <category>terminal</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/12/28/zsh-themes-gone-wild-18</feedburner:origLink></item>
    <item>
      <title>RubyURL goes GOP...</title>
      <description>&lt;p&gt;Will refrain from any political commentary, but was notified by some friends that the &lt;span class="caps"&gt;GOP&lt;/span&gt; was using the &lt;a href=":http://github.com/robbyrussell/rubyurl"&gt;source code&lt;/a&gt; for &lt;a href="http://rubyurl.com"&gt;RubyURL&lt;/a&gt; for their new &lt;span class="caps"&gt;URL&lt;/span&gt; shortening site (&lt;a href="http://gop.am"&gt;gop.am&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;To celebrate, I decided to daisy chain a few rubyurl-based sites together and came up with:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rubyurl.com/hj6l"&gt;http://rubyurl.com/hj6l&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Enjoy!&lt;/p&gt;


	&lt;p&gt;As always, you can &lt;a href="http://github.com/robbyrussell/rubyurl"&gt;fork/clone here&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=4Wn-kAEwSqs:TgoNhw6VLwU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=4Wn-kAEwSqs:TgoNhw6VLwU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=4Wn-kAEwSqs:TgoNhw6VLwU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=4Wn-kAEwSqs:TgoNhw6VLwU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=4Wn-kAEwSqs:TgoNhw6VLwU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=4Wn-kAEwSqs:TgoNhw6VLwU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=4Wn-kAEwSqs:TgoNhw6VLwU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/4Wn-kAEwSqs" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 16 Dec 2009 23:08:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:90336b56-d75c-4c7f-8173-b64b3220e16f</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/4Wn-kAEwSqs/rubyurl-goes-gop</link>
      <category>RubyURL</category>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>rubyurl</category>
      <category>gop</category>
      <category>zombieurl</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/12/16/rubyurl-goes-gop</feedburner:origLink></item>
    <item>
      <title>Sending email: Controllers versus Models</title>
      <description>&lt;p&gt;While reviewing some code recently, I came across controller code that resembled the following.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@customer&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;
  &lt;span class="constant"&gt;CustomerMailer&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;deliver_welcome_message&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@customer&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;flash&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:message&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Your account has been successfully created. We've sent you a welcome letter with...&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;redirect_to&lt;/span&gt; &lt;span class="ident"&gt;dashboard_path&lt;/span&gt;
&lt;span class="keyword"&gt;else&lt;/span&gt;
  &lt;span class="punct"&gt;...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Fairly typical Rails code. Nothing alarming here, but I wanted to evaluate the call to the mailer in this scenario. When it comes to sending emails from your application, you can choose to do it from the controller as in the example above or in your models. Our team prefers to do this from our model via a callback as we are considering this to be part of our business logic.&lt;/p&gt;


	&lt;p&gt;Each time a customer is created, we want to send them an email. This can be moved into the model and resembled something like the following..&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;after_create&lt;/span&gt; &lt;span class="symbol"&gt;:send_welcome_message&lt;/span&gt; &lt;span class="comment"&gt;#, other callbacks..&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;send_welcome_message&lt;/span&gt;
  &lt;span class="constant"&gt;CustomerMailer&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;deliver_welcome_message&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;There are a few benefits to doing it this way.&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;We can test that this is being triggered within our model specs instead of our controller specs. (we prefer to spend more of our time working within models than controllers)&lt;/li&gt;
		&lt;li&gt;We remove the dependency that all requests must be processed through our controllers.
	&lt;ul&gt;
	&lt;li&gt;Example: We may one day create rake tasks that data and want these emails to still be sent out. (We&amp;#8217;ve had to do this a few times)&lt;/li&gt;
	&lt;/ol&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I definitely don&amp;#8217;t think doing this via controllers is a bad idea, I just lean towards keeping controllers as dumbed down as possible. This allows us to have less controller code that is focused on passing data to/from models and letting our models do the heavy lifting.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;:&lt;/strong&gt; DHH was kind enough to &lt;a href="http://www.loudthinking.com/posts/43-think-of-emails-as-views-delivered-through-smtp"&gt;post a more detailed response&lt;/a&gt; on his blog.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=S3fujhcFUNI:RPhLOckfsa8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=S3fujhcFUNI:RPhLOckfsa8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=S3fujhcFUNI:RPhLOckfsa8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=S3fujhcFUNI:RPhLOckfsa8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=S3fujhcFUNI:RPhLOckfsa8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=S3fujhcFUNI:RPhLOckfsa8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=S3fujhcFUNI:RPhLOckfsa8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/S3fujhcFUNI" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 16 Nov 2009 09:33:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:d6851ac5-ee56-40a0-844e-2ac06dea641f</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/S3fujhcFUNI/sending-email-controllers-versus-models</link>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>development</category>
      <category>rubyonrails</category>
      <category>actionmailer</category>
      <category>models</category>
      <category>controllers</category>
      <category>patterns</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/11/16/sending-email-controllers-versus-models</feedburner:origLink></item>
    <item>
      <title>Using BETWEEN for SQL comparisons</title>
      <description>&lt;p&gt;Recently, &lt;a href="http://eddorre.com/"&gt;Carlos&lt;/a&gt;, suggested that I should start sharing some basic &lt;span class="caps"&gt;SQL&lt;/span&gt; tips that help with performance and/or general usage. I recently came across some code that I didn&amp;#8217;t like to read and/or write. For example, let&amp;#8217;s take the following&amp;#8230;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
SELECT * FROM brochures WHERE published_at &amp;lt;= now() AND archived_at &amp;gt;= now()
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Essentially, this is pulling back some data &lt;code&gt;WHERE&lt;/code&gt; the the brochures are considered published. (&lt;em&gt;We have a project that allows people to manage their brochure launch dates ahead of time.&lt;/em&gt;) In fact, in this project, we have no less than 6-8 dates in the database that we&amp;#8217;re comparing data on and it&amp;#8217;s easy to get lost in the logic when trying to understand it.&lt;/p&gt;


	&lt;p&gt;Now, there isn&amp;#8217;t anything inheriently wrong with how this condition is constuctued. As a matter of personal taste, I find it annoying to mentally parse. Also, I find having to write &lt;code&gt;now()&lt;/code&gt; more than once in a &lt;code&gt;WHERE&lt;/code&gt; clause to feel like I&amp;#8217;m repeating myself.&lt;/p&gt;


	&lt;p&gt;Read it outloud&amp;#8230;&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;WHERE the brochures published at date is less than and/or equal to right now &lt;span class="caps"&gt;AND&lt;/span&gt; the  archived date is greater than and/or equal to now.&amp;#8221;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Who talks like that?&lt;/p&gt;


	&lt;p&gt;Luckily, there is a better and in my opinion, a more readable way to express this is with the &lt;span class="caps"&gt;BETWEEN&lt;/span&gt; construct in &lt;span class="caps"&gt;SQL&lt;/span&gt;. (&lt;a href="http://www.postgresql.org/docs/current/static/functions-comparison.html"&gt;postgresql docs&lt;/a&gt;, &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between"&gt;mysql docs&lt;/a&gt;)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
SELECT * FROM brochures WHERE now() BETWEEN published_at AND archived_at
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Let&amp;#8217;s read this outloud&amp;#8230;&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;WHERE the current date is &lt;em&gt;between&lt;/em&gt; the published at and archived at dates.&amp;#8221;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;This sounds more natural to me.&lt;/p&gt;


	&lt;p&gt;Additionally, you can also do the inverse with &lt;code&gt;NOT&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
SELECT ... WHERE now() NOT BETWEEN brochures.published_at AND brochures.archive_at
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Remember kids, &lt;em&gt;&amp;#8220;code is for humans first and computers second.&amp;#8221;&lt;/em&gt;&amp;#8212;Martin Fowler&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=uWzCv8yDqaE:pACsrzH8b78:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=uWzCv8yDqaE:pACsrzH8b78:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=uWzCv8yDqaE:pACsrzH8b78:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=uWzCv8yDqaE:pACsrzH8b78:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=uWzCv8yDqaE:pACsrzH8b78:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=uWzCv8yDqaE:pACsrzH8b78:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=uWzCv8yDqaE:pACsrzH8b78:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/uWzCv8yDqaE" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 14 Nov 2009 14:55:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e7b6f3bd-81d1-4cdb-bf95-ae4e9f97cdf5</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/uWzCv8yDqaE/using-between-for-sql-comparisons</link>
      <category>Programming</category>
      <category>PostgreSQL</category>
      <category>code</category>
      <category>sql</category>
      <category>development</category>
      <category>postgresql</category>
      <category>mysql</category>
      <category>refactoring</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/11/14/using-between-for-sql-comparisons</feedburner:origLink></item>
    <item>
      <title>Launching Ruby on Rails projects, the video</title>
      <description>&lt;p&gt;For those of you who didn&amp;#8217;t make it to &lt;a href="http://www.rails-underground.com/"&gt;Rails Underground&lt;/a&gt; in July to witness my &lt;em&gt;mind-blowing&lt;/em&gt; talk, &lt;a href="http://www.slideshare.net/robbyrussell/launching-ruby-on-rails-projects-a-checklist"&gt;Launching Ruby on Rails projects&lt;/a&gt; , it appears that Skills Matter has finally &lt;a href="http://skillsmatter.com/podcast/ajax-ria/robby-russell-launching-ruby-on-rails-projects"&gt;posted a video&lt;/a&gt; of it online. :-)&lt;/p&gt;


	&lt;p&gt;The sound levels are really low&amp;#8230; but hopefully you&amp;#8217;ll find it helpful.&lt;/p&gt;


	&lt;p&gt;You can also &lt;a href="http://www.slideshare.net/robbyrussell/launching-ruby-on-rails-projects-a-checklist"&gt;view the slides&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Related Posts&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2008/12/14/launching-ruby-on-rails-projects-a-checklist"&gt;Launching Ruby on Rails projects, a checklist&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=R3xgJOl_OSs:f4xdjgCR36I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=R3xgJOl_OSs:f4xdjgCR36I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=R3xgJOl_OSs:f4xdjgCR36I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=R3xgJOl_OSs:f4xdjgCR36I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=R3xgJOl_OSs:f4xdjgCR36I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=R3xgJOl_OSs:f4xdjgCR36I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=R3xgJOl_OSs:f4xdjgCR36I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/R3xgJOl_OSs" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 11 Nov 2009 12:00:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ee480bcd-b905-418a-8487-34597633a4cc</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/R3xgJOl_OSs/launching-ruby-on-rails-projects-the-video</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>projects</category>
      <category>agile</category>
      <category>development</category>
      <category>clients</category>
      <category>presentation</category>
      <category>conference</category>
      <category>rubyonrails</category>
      <category>video</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/11/11/launching-ruby-on-rails-projects-the-video</feedburner:origLink></item>
    <item>
      <title>Planet Argon Podcast, Episode 3: How We Manage Bugs</title>
      <description>&lt;p&gt;Earlier this week, we published Episode 3 of the &lt;a href="http://planetargon.com/podcast"&gt;Planet Argon Podcast&lt;/a&gt;. In this latest episode we responded to one of the ideas someone in the audience &lt;a href="http://heybrainstormr.com/t/5DW1"&gt;asked on this brainstormr&lt;/a&gt;, which was, &amp;#8220;How do you manage bugs?&amp;#8221;&lt;/p&gt;


	&lt;p&gt;We had a round table discussion about how we classify and prioritize bugs with our clients, ticketing systems, and other tools that we use to streamline this process.&lt;/p&gt;


	&lt;p&gt;You can listen to this on &lt;a href="http://feeds.feedburner.com/PlanetArgonPodcast"&gt;iTunes&lt;/a&gt; or &lt;a href="http://planetargon.com/podcast"&gt;online&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=c2JDkSGzHqc:xNcvZQuH2m0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=c2JDkSGzHqc:xNcvZQuH2m0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=c2JDkSGzHqc:xNcvZQuH2m0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=c2JDkSGzHqc:xNcvZQuH2m0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=c2JDkSGzHqc:xNcvZQuH2m0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=c2JDkSGzHqc:xNcvZQuH2m0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=c2JDkSGzHqc:xNcvZQuH2m0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/c2JDkSGzHqc" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 11 Nov 2009 11:46:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:0d8e68fc-06cf-4312-b64a-913a4b8b3bf2</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/c2JDkSGzHqc/planet-argon-podcast-episode-3-how-we-manage-bugs</link>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>agile</category>
      <category>bugs</category>
      <category>lighthouse</category>
      <category>planetargon</category>
      <category>podcast</category>
      <category>collaboration</category>
      <category>clients</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/11/11/planet-argon-podcast-episode-3-how-we-manage-bugs</feedburner:origLink></item>
    <item>
      <title>Tracking Google Analytics events in development environment with GoogleAnalyticsProxy</title>
      <description>&lt;p&gt;As mentioned in a recent article&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;, I&amp;#8217;ve been diving deep into &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; lately while working on a few client projects. We&amp;#8217;re aiming to use much more of the features of Google Analytics and have been hitting some roadblocks with the development versus production application environments. Once you begin to dive into event tracking and &lt;span class="caps"&gt;AJAX&lt;/span&gt;-driven goal conversions, relying on just the sample code that Google Analytics provides you is going to result in you looking at a handful of JavaScript errors.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/nfu1f/pagetracker-is-not-defined"&gt;&lt;img src="http://img.skitch.com/20091101-c62euttfs5ejejt2eqpfxpnfau.preview.jpg" alt="pageTracker is not defined" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;another example from the firebug javascript console&amp;#8230;&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/nfu1g/firebug-pagetracker-is-not-defined"&gt;&lt;img src="http://img.skitch.com/20091101-p5mb21ufih99n3sa6uafsc4gyf.preview.jpg" alt="firebug pageTracker is not defined" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;We see JavaScript errors like this because we don&amp;#8217;t load the google analytics code in our development environments. As you can see, we are only loading this in our production environment.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;production&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;-%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;
    &amp;lt;!--// Google Analytics //--&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;script&lt;/span&gt; &lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;text/javascript&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
    &lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;gaJsHost&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;((&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;https:&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="ident"&gt;document&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;location&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;protocol&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;https://ssl.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://www.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;);&lt;/span&gt;
    &lt;span class="ident"&gt;document&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;write&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;unescape&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;%3Cscript src='&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;gaJsHost&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;));&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;script&amp;gt;
    &amp;lt;script type=&amp;quot;text&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;javascript&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;gt;
    var pageTracker = _gat._getTracker(&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="constant"&gt;UA&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="constant"&gt;XXXXXX&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;);
    pageTracker._trackPageview();
    &amp;lt;/script&amp;gt;
  &amp;lt;% end -%&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;To &lt;a href="http://code.google.com/apis/analytics/docs/gaJS/gaJSApiEventTracking.html#_gat.GA_EventTracker_._trackEvent"&gt;track an event with Google Analytics&lt;/a&gt;, you&amp;#8217;d need to trigger something like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;pageTracker&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_trackEvent&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Button&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Click&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Get in touch&lt;/span&gt;&lt;span class="punct"&gt;');&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;As you can see from our code earlier, in development, the &lt;code&gt;pageTracker&lt;/code&gt; variable isn&amp;#8217;t defined and that&amp;#8217;s why we&amp;#8217;re getting those JS errors. We also don&amp;#8217;t want to add conditionals everywhere in our application to check if we&amp;#8217;re in development or production environment.. as that&amp;#8217;d just make our views uglier than they need to be. So, I decided that I&amp;#8217;d create a proxy class in JavaScript that would allow us to trigger &lt;code&gt;_trackEvent()&lt;/code&gt; and &lt;code&gt;_trackPageview()&lt;/code&gt; and handle it appropriately.&lt;/p&gt;


	&lt;p&gt;This class works with the following logic:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;if google analytics &lt;strong&gt;is&lt;/strong&gt; loaded, pass the parameters to the real &lt;code&gt;pageTracker&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;if google analytics &lt;strong&gt;is &lt;span class="caps"&gt;NOT&lt;/span&gt;&lt;/strong&gt; loaded, output the information to &lt;code&gt;console.log()&lt;/code&gt; for debugging purposes&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;For example, on a gallery on our web site&amp;#8230; we track when people navigate next and/or previous through the photos. In our development environment, I can watch the JavaScript console output the following:&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/nfu19/firebug-gap"&gt;&lt;img src="http://img.skitch.com/20091101-jwbyprqyaj68hxtjw8bbg6mccm.preview.jpg" alt="Firebug - GAP" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;And in our production environment, we can see that this was sent to Google Analytics.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/nfuut/firebug-trackevent"&gt;&lt;img src="http://img.skitch.com/20091101-q9dkn8tw3kyndxr55fqed6k8fq.preview.jpg" alt="Firebug - trackEvent()" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;We&amp;#8217;re able to do this by initializing the GoogleAnalyticsProxy class and calling these functions through it. For example:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;_gap&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="constant"&gt;GoogleAnalyticsProxy&lt;/span&gt;&lt;span class="punct"&gt;();&lt;/span&gt;
  &lt;span class="ident"&gt;_gap&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_trackEvent&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Video&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Play&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Homepage video&lt;/span&gt;&lt;span class="punct"&gt;');&lt;/span&gt;
  &lt;span class="ident"&gt;_gap&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_trackEvent&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Video&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Pause&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Homepage video&lt;/span&gt;&lt;span class="punct"&gt;');&lt;/span&gt;
  &lt;span class="ident"&gt;_gap&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_trackEvent&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Button&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Click&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Call to action X&lt;/span&gt;&lt;span class="punct"&gt;');&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You&amp;#8217;ll see that we&amp;#8217;re just calling &lt;code&gt;_gap&lt;/code&gt; versus &lt;code&gt;pageTracker&lt;/code&gt;. We then replace all the instances of pageTracker (except where it is defined in the google analytics code block they provide you). You&amp;#8217;ll find this located near the bottom of our &lt;code&gt;application.html.erb&lt;/code&gt; file.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;production&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;-%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;
  &amp;lt;!--// Google Analytics //--&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;script&lt;/span&gt; &lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;text/javascript&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
  &lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;gaJsHost&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;((&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;https:&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="ident"&gt;document&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;location&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;protocol&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;https://ssl.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://www.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;);&lt;/span&gt;
  &lt;span class="ident"&gt;document&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;write&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;unescape&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;%3Cscript src='&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;gaJsHost&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;));&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;script&amp;gt;
  &amp;lt;script type=&amp;quot;text&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;javascript&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;gt;
  var pageTracker = _gat._getTracker(&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="constant"&gt;UA&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="constant"&gt;XXXXXX&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;);
  pageTracker._trackPageview();
  &amp;lt;/script&amp;gt;
&amp;lt;% end -%&amp;gt;

&amp;lt;script type=&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ident"&gt;text&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;javascript&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;gt;
  var _gap = new GoogleAnalyticsProxy();
&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;We now have &lt;code&gt;_gap&lt;/code&gt; available throughout our project and can call &lt;code&gt;_trackEvent()&lt;/code&gt; and &lt;code&gt;_trackPageview()&lt;/code&gt; with it. Note: You can use any JS variable name that you want, _gap is just what I went with.&lt;/p&gt;


	&lt;h2&gt;Get GoogleAnalyticsProxy&lt;/h2&gt;


	&lt;p&gt;I&amp;#8217;ve gone ahead and tossed this small JavaScript class (known as &lt;a href="http://github.com/robbyrussell/GoogleAnalyticsProxy"&gt;GoogleAnalyticsProxy&lt;/a&gt;) on Github for your enjoyment. I have some more articles in the works that will show you some tips for how to make the most of Google Analytics. If you have any questions and/or ideas for related article topics, don&amp;#8217;t hesitate to let me know.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a href="http://www.robbyonrails.com/articles/2009/10/21/tracking-ajax-driven-events-in-ruby-on-rails-for-google-analytics-conversion-goals"&gt;Tracking &lt;span class="caps"&gt;AJAX&lt;/span&gt;-driven events in Ruby on Rails for Google Analytics conversion goals&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Vufb1T5mkK8:RIIfQAVQ9E8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Vufb1T5mkK8:RIIfQAVQ9E8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=Vufb1T5mkK8:RIIfQAVQ9E8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Vufb1T5mkK8:RIIfQAVQ9E8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Vufb1T5mkK8:RIIfQAVQ9E8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Vufb1T5mkK8:RIIfQAVQ9E8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=Vufb1T5mkK8:RIIfQAVQ9E8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/Vufb1T5mkK8" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 01 Nov 2009 13:55:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e2bd1653-794b-473a-89ed-a89a58eb0706</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/Vufb1T5mkK8/googleanalyticsproxy-for-development-environment-tracking-events-in-google-analytics</link>
      <category>Ruby on Rails</category>
      <category>PostgreSQL</category>
      <category>javascript</category>
      <category>analytics</category>
      <category>kpi</category>
      <category>googleanalytics</category>
      <category>events</category>
      <category>proxy</category>
      <category>opensource</category>
      <category>github</category>
      <category>prototype</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/11/01/googleanalyticsproxy-for-development-environment-tracking-events-in-google-analytics</feedburner:origLink></item>
    <item>
      <title>Planet Argon Podcast, Episode 2: The Letter Scotch</title>
      <description>&lt;p&gt;Earlier this week our &lt;a href="http://planetargon.com/podcast"&gt;new podcast&lt;/a&gt; was approved and is &lt;a href="http://planetargon.com/news/2009/10/26/podcast-now-available-in-apple-itunes-store"&gt;now available in the Apple iTunes Store&lt;/a&gt;. We&amp;#8217;re also &lt;a href="http://heybrainstormr.com/t/5DW1"&gt;soliciting topic ideas for future episodes&lt;/a&gt; on &lt;a href="http://planetargon.com/projects/brainstormr"&gt;brainstormr&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;We posted Episode 2, The Letter Scotch, yesterday for your enjoyment. In this episode, we covered a handful of web browser tools that we use (and detest) to debug &lt;span class="caps"&gt;HTML&lt;/span&gt;, CSS, and JavaScript. This included Web Inspector, Firebug, DebugBar, and a handful of other tools. We all have slightly different preferences, depending on the tasks that we&amp;#8217;re working on and the team had an open dialogue about the pros/cons of each of these tools.&lt;/p&gt;


	&lt;p&gt;You can learn more about and listen to our podcast at &lt;a href="http://planetargon.com/podcast"&gt;http://planetargon.com/podcast&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Thanks in advance for listening!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_7o3kZqz4po:xpzEbbUNI1E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_7o3kZqz4po:xpzEbbUNI1E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=_7o3kZqz4po:xpzEbbUNI1E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_7o3kZqz4po:xpzEbbUNI1E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_7o3kZqz4po:xpzEbbUNI1E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_7o3kZqz4po:xpzEbbUNI1E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=_7o3kZqz4po:xpzEbbUNI1E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/_7o3kZqz4po" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 30 Oct 2009 08:27:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:b468dea2-2eda-48d1-a56e-d56f27c30d55</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/_7o3kZqz4po/planet-argon-podcast-episode-2-the-letter-scotch</link>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>planetargon</category>
      <category>rubyonrails</category>
      <category>agile</category>
      <category>podcast</category>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
      <category>firefox</category>
      <category>firebug</category>
      <category>safari</category>
      <category>debugbar</category>
      <category>internetexplorer</category>
      <category>webbrowsers</category>
      <category>webinspector</category>
      <category>itunes</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/30/planet-argon-podcast-episode-2-the-letter-scotch</feedburner:origLink></item>
    <item>
      <title>Planet Argon Podcast, Episode 1: Shin Splints</title>
      <description>&lt;p&gt;We&amp;#8217;re currently waiting to get our new podcast approved by Apple, but have uploaded episode 1 to tumblr in the meantime.&lt;/p&gt;


&lt;embed type="application/x-shockwave-flash" src="http://planetargon.tumblr.com/swf/audio_player_black.swf?audio_file=http://www.tumblr.com/audio_file/220369476/tumblr_krxusucVgn1qz5fkl&amp;amp;color=FFFFFF" height="27" width="207" quality="best"&gt;

	&lt;p&gt;In this short episode, we cover the following topics:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://github.com/binarylogic/authlogic"&gt;Authlogic&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://github.com/notahat/machinist/"&gt;Machinist&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://github.com/robbyrussell/faker"&gt;Faker&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://lesscss.org/"&gt;&lt;span class="caps"&gt;LESS&lt;/span&gt;&lt;/a&gt; (for &lt;span class="caps"&gt;CSS&lt;/span&gt;)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://textorize.org/"&gt;Textorize&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://planetargon.com/what-we-do/development/rails-code-audit"&gt;The 8-Hour Rails Code Audits&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;We&amp;#8217;re planning to keep this short and focused to a few topics. Once it&amp;#8217;s posted on iTunes, we&amp;#8217;ll let you know.&lt;/p&gt;


	&lt;p&gt;Please consider &lt;a href="http://feeds.feedburner.com/PlanetArgonPodcast"&gt;subscribing to the podcast&lt;/a&gt;. Enjoy!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=7YddW-7-9l8:5s9IXWPJCok:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=7YddW-7-9l8:5s9IXWPJCok:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=7YddW-7-9l8:5s9IXWPJCok:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=7YddW-7-9l8:5s9IXWPJCok:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=7YddW-7-9l8:5s9IXWPJCok:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=7YddW-7-9l8:5s9IXWPJCok:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=7YddW-7-9l8:5s9IXWPJCok:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/7YddW-7-9l8" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 22 Oct 2009 18:50:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:b2051962-5ab1-4b11-880d-3a9c3155140b</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/7YddW-7-9l8/planet-argon-podcast-episode-1-shin-splints</link>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>podcast</category>
      <category>authlogic</category>
      <category>gems</category>
      <category>machinist</category>
      <category>faker</category>
      <category>less</category>
      <category>css</category>
      <category>textorize</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/22/planet-argon-podcast-episode-1-shin-splints</feedburner:origLink></item>
    <item>
      <title>Email twice. Four months later</title>
      <description>&lt;p&gt;It&amp;#8217;s been just over four months since I posted about my experiment, &lt;a href="http://www.robbyonrails.com/articles/2009/06/10/email-twice-daily-no-more-no-less"&gt;Email. Twice daily. No more, no less.&lt;/a&gt; where I shared my plans to restrict myself to checking email only twice a day at designated times. In the post, I had hinted at sharing my lessons months later. So, it&amp;#8217;s time to throw my dirty laundry in the street and expose myself.&lt;/p&gt;


	&lt;p&gt;First off.. the brutal truth. It&amp;#8217;s really fucking hard to maintain this. Habits are nearly as hard to &lt;em&gt;make&lt;/em&gt; as they are to break. I suspect that I honor my rule 2-3 days each week and it&amp;#8217;s completely inconsistent the remainder. Usually, I find myself looking at email at 8:30am and have to slap myself and yell, &amp;#8220;what are you doing?!!?&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Guilt sinks in and I hit  ⌘-q. Problem solved&amp;#8230; for a little while.&lt;/p&gt;


	&lt;p&gt;So, what has lead to this. Well, one of the biggest hurdles has been that one of our largest clients is now focused more in the United Kingdom. Luckily, I&amp;#8217;m an early-morning person, but this means that my 10am &lt;span class="caps"&gt;PDT&lt;/span&gt; rule wouldn&amp;#8217;t have me checking for their precious emails until 6pm &lt;span class="caps"&gt;GMT&lt;/span&gt; their time. Not exactly acceptable. So, I&amp;#8217;ve been more flexible in the mornings and responding to emails as early as 5-6am &lt;span class="caps"&gt;PDT&lt;/span&gt;. However, I realize that I&amp;#8217;m cheating myself of previous focus time and need to recalibrate my email windows.&lt;/p&gt;


	&lt;p&gt;Given these new constraints, I&amp;#8217;m now trying 8:30am and 2:30pm as my primary email times.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m curious how this has been working out for you&amp;#8230;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=AlpkzupAeWI:bZdCz6lWzuw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=AlpkzupAeWI:bZdCz6lWzuw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=AlpkzupAeWI:bZdCz6lWzuw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=AlpkzupAeWI:bZdCz6lWzuw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=AlpkzupAeWI:bZdCz6lWzuw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=AlpkzupAeWI:bZdCz6lWzuw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=AlpkzupAeWI:bZdCz6lWzuw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/AlpkzupAeWI" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 21 Oct 2009 17:41:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7bcc2c38-b63b-43bf-b8d9-69ebf4a9c060</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/AlpkzupAeWI/email-twice-four-months-later</link>
      <category>Off-Topic</category>
      <category>email</category>
      <category>productivity</category>
      <category>focus</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/21/email-twice-four-months-later</feedburner:origLink></item>
    <item>
      <title>RailsOnPg released</title>
      <description>&lt;p&gt;Hello fellow &lt;a href="http://postgresql.org"&gt;PostgreSQL&lt;/a&gt; and &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; geeks,&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/alex3t"&gt;Alexander Tretyakov&lt;/a&gt; (&lt;a href="http://twitter.com/redvok"&gt;twitter&lt;/a&gt;) recently released a plugin for Ruby on Rails, which extends migrations and provides you with the ability to create.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Functions (&lt;a href="http://developer.postgresql.org/pgdocs/postgres/sql-createtrigger.html"&gt;pg docs&lt;/a&gt;)&lt;/li&gt;
		&lt;li&gt;Triggers (&lt;a href="http://developer.postgresql.org/pgdocs/postgres/sql-createfunction.html"&gt;pg docs&lt;/a&gt;)&lt;/li&gt;
		&lt;li&gt;Views (&lt;a href="http://developer.postgresql.org/pgdocs/postgres/sql-createview.html"&gt;pg docs&lt;/a&gt;)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;While you can already do something like this with &lt;code&gt;execute&lt;/code&gt; in your migrations:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;CREATE VIEW my_tasty_snacks AS SELECT * FROM snacks WHERE food = 'Tasty';&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;With RailsOnPage, you&amp;#8217;re provided a &lt;span class="caps"&gt;DSL&lt;/span&gt; so that you can do the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;create_view&lt;/span&gt; &lt;span class="symbol"&gt;:my_tasy_snacks&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;view&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;view&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;select&lt;/span&gt;     &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;*&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;view&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;from&lt;/span&gt;       &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;snacks&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;view&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conditions&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;food&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Tasty&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;&lt;small&gt;note: I haven&amp;#8217;t tested the above, just a hypothetical example&lt;/small&gt;&lt;/p&gt;


	&lt;p&gt;Anyhow, if you&amp;#8217;re in the habit of using views, functions, or triggers with your PostgreSQL database and are using Ruby on Rails, you might &lt;a href="http://github.com/alex3t/rails_on_pg"&gt;give RailsOnPg a whirl&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=m4Lizw2mocQ:RsNSRrKteiA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=m4Lizw2mocQ:RsNSRrKteiA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=m4Lizw2mocQ:RsNSRrKteiA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=m4Lizw2mocQ:RsNSRrKteiA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=m4Lizw2mocQ:RsNSRrKteiA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=m4Lizw2mocQ:RsNSRrKteiA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=m4Lizw2mocQ:RsNSRrKteiA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/m4Lizw2mocQ" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 21 Oct 2009 17:07:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:13c6817f-f554-4995-8fdc-7fb9b425dfae</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/m4Lizw2mocQ/railsonpg-released</link>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>PostgreSQL</category>
      <category>postgresql</category>
      <category>rubyonrails</category>
      <category>plugins</category>
      <category>databases</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/21/railsonpg-released</feedburner:origLink></item>
    <item>
      <title>Tracking AJAX-driven events in Ruby on Rails for Google Analytics conversion goals</title>
      <description>&lt;p&gt;Tracking your &lt;a href="http://en.wikipedia.org/wiki/Performance_indicator"&gt;&lt;span class="caps"&gt;KPI&lt;/span&gt;&amp;#8217;s&lt;/a&gt; is extremely important in your online venture. At a minimum, you should be using something like &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; to track conversions in your application. Setting up goals is actually quite simple, especially if you&amp;#8217;re just tracking that specific pages are loaded. However, if some of your conversion points occur through &lt;span class="caps"&gt;AJAX&lt;/span&gt;, you might not be capturing those activities in Google Analytics.&lt;/p&gt;


	&lt;p&gt;Lucky for you, it&amp;#8217;s actually &lt;a href="http://www.google.com/support/googleanalytics/bin/answer.py?hl=en&amp;#38;answer=55520"&gt;quite simple to update this&lt;/a&gt;. I thought I&amp;#8217;d show you a fairly simple example to help you along.&lt;/p&gt;


	&lt;p&gt;On our web site, we have a mini contact form at the bottom of many of our pages. When submitted, if JavaScript is enabled, it&amp;#8217;ll perform an Ajax request to submit the form. If you fill out the main &lt;a href="http://planetargon.com/get-in-touch"&gt;Get in Touch&lt;/a&gt; form that gets processed and we redirect people to a thank you page. The &lt;span class="caps"&gt;URL&lt;/span&gt; for that is unique and we&amp;#8217;re able to track those in Google Analytics quite easily.&lt;/p&gt;


	&lt;p&gt;However, with the Ajax-form, the &lt;span class="caps"&gt;URL&lt;/span&gt; in the browser isn&amp;#8217;t going to change so Google Analytics isn&amp;#8217;t going to track that conversion. So, we needed to track that properly.&lt;/p&gt;


	&lt;p&gt;To do this, we just need to call a JavaScript function that the Google Analytics code provides you.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;pageTracker&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_trackPageview&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/contact_requests/thanks&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Let&amp;#8217;s look at some simple code from our controller action. If the request is from JavaScript, we currently replace the form area with the content in a partial. (&lt;strong&gt;note&lt;/strong&gt;: if you&amp;#8217;re curious about the &lt;code&gt;_x&lt;/code&gt;, read &lt;a href="http://www.robbyonrails.com/articles/2007/08/01/designers-developers-and-the-x_-factor"&gt;Designers, Developers and the x_ factor&lt;/a&gt;)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;respond_to&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;redirect_to&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:thanks&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;js&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:update&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;replace&lt;/span&gt; &lt;span class="symbol"&gt;:x_mini_contact_form_module&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:partial&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mini_contact_form_thanks&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;As you can see, the redirect will within the &lt;code&gt;format.html&lt;/code&gt; block will lead people to our conversion point. However, the &lt;code&gt;format.js&lt;/code&gt; block will keep the user on the current page and it&amp;#8217;ll not trigger Google Analytics to track the conversion. To make this happen, we&amp;#8217;ll just sprinkle in the following line of code.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;call&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;pageTracker._trackPageview(&amp;quot;/contact_requests/thanks&amp;quot;);&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;However, if you need to do something like this in several locations in your application, you might want to just extend the JavaScriptGenerator &lt;code&gt;page.&lt;/code&gt; GeneratorMethods. (you could toss this in &lt;code&gt;lib/&lt;/code&gt;, create a plugin, etc&amp;#8230;)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;ActionView&lt;/span&gt;
    &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Helpers&lt;/span&gt;
      &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;PrototypeHelper&lt;/span&gt;
        &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;JavaScriptGenerator&lt;/span&gt; &lt;span class="comment"&gt;#:nodoc:&lt;/span&gt;
          &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;GeneratorMethods&lt;/span&gt;
            &lt;span class="comment"&gt;# Calls the Google Analytics pageTracker._trackPageview function with +path+.&lt;/span&gt;
            &lt;span class="comment"&gt;#&lt;/span&gt;
            &lt;span class="comment"&gt;# Examples:&lt;/span&gt;
            &lt;span class="comment"&gt;#&lt;/span&gt;
            &lt;span class="comment"&gt;#&lt;/span&gt;
            &lt;span class="comment"&gt;#  # Triggers: pageTracker._trackPageview('/contact_requests/thanks');&lt;/span&gt;
            &lt;span class="comment"&gt;#  page.track_page_view '/contact_requests/thanks'&lt;/span&gt;
            &lt;span class="comment"&gt;#&lt;/span&gt;
            &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;track_page_view&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
             &lt;span class="ident"&gt;record&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;pageTracker._trackPageview('&lt;span class="expr"&gt;#{path}&lt;/span&gt;');&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="keyword"&gt;end&lt;/span&gt;
          &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This will allow us to do the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;track_page_view&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/contact_requests/thanks&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

  &lt;span class="comment"&gt;# or using a route/path&lt;/span&gt;
  &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;track_page_view&lt;/span&gt; &lt;span class="ident"&gt;thanks_contact_requests_path&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;So, our updated code now looks like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:update&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;replace&lt;/span&gt; &lt;span class="symbol"&gt;:x_mini_contact_form_module&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:partial&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mini_contact_form_thanks&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;track_page_view&lt;/span&gt; &lt;span class="ident"&gt;thanks_contact_requests_path&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;With this in place, we can sprinkle similar code for our various conversion points that are Ajax-driven and Google Analytics will pick it up.&lt;/p&gt;


	&lt;p&gt;Happy tracking!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=luhBlhUJguc:CKVxoZA_vD0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=luhBlhUJguc:CKVxoZA_vD0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=luhBlhUJguc:CKVxoZA_vD0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=luhBlhUJguc:CKVxoZA_vD0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=luhBlhUJguc:CKVxoZA_vD0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=luhBlhUJguc:CKVxoZA_vD0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=luhBlhUJguc:CKVxoZA_vD0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/luhBlhUJguc" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 21 Oct 2009 13:09:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:aa29c8a0-a707-4a4d-9584-5126c65a91e7</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/luhBlhUJguc/tracking-ajax-driven-events-in-ruby-on-rails-for-google-analytics-conversion-goals</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>ajax</category>
      <category>rubyonrails</category>
      <category>analytics</category>
      <category>javascript</category>
      <category>prototype</category>
      <category>kpi</category>
      <category>conversions</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/21/tracking-ajax-driven-events-in-ruby-on-rails-for-google-analytics-conversion-goals</feedburner:origLink></item>
    <item>
      <title>The 8-Hour Rails Code Audit</title>
      <description>&lt;p&gt;While our team is typically focused on larger client and internal projects, we do get an opportunity to assist businesses on a much smaller scale. Whether this be through retainer-based consulting or through code audits, we have seen a lot of Ruby on Rails code over what has nearly been&amp;#8230; five years!? We&amp;#8217;ve been able to compile a fairly extensive checklist that we use in our code audit process that we&amp;#8217;ve decided to streamline it into a smaller product.&lt;/p&gt;


	&lt;p&gt;Historically, this service has ranged anywhere from $2000-6000, depending the size and scope of the projects, but we want to help smaller startups&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; and projects outline a roadmap for how they can begin to refactor and optimize their existing code base so that they can be more efficient at the start of 2010. So, we&amp;#8217;ve scaled things down into an extremely affordable flat-rate package where we work off of a pre-defined number of hours.[2]&lt;/p&gt;


	&lt;p&gt;Through the end of 2009, we&amp;#8217;re now offering &lt;a href="http://planetargon.com/what-we-do/development/rails-code-audit"&gt;the 8-Hour Rails Code Audit package&lt;/a&gt; for just $1000 &lt;span class="caps"&gt;USD&lt;/span&gt; (&lt;a href="http://planetargon.com/what-we-do/development/rails-code-audit"&gt;details&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;re currently limiting this service to just two projects per week, &lt;a href="http://planetargon.com/get-in-touch"&gt;so reserve your spot now&lt;/a&gt;.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Larger projects are welcome to benefit from this service and custom quotes are available upon request.&lt;/p&gt;


	&lt;p id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; As always, we&amp;#8217;re happy to discuss longer engagements.&lt;/p&gt;


	&lt;h3&gt;Related Posts&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/06/17/audit-your-rails-development-team"&gt;Audit Your Rails Development Team&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/06/18/rails-code-audits-and-reviews-continued"&gt;Rails Code Audits and Reviews, continued&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=2PJF4eJsfC8:v5iC8nz8V9A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=2PJF4eJsfC8:v5iC8nz8V9A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=2PJF4eJsfC8:v5iC8nz8V9A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=2PJF4eJsfC8:v5iC8nz8V9A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=2PJF4eJsfC8:v5iC8nz8V9A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=2PJF4eJsfC8:v5iC8nz8V9A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=2PJF4eJsfC8:v5iC8nz8V9A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/2PJF4eJsfC8" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 20 Oct 2009 07:13:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:32523701-9fd6-41d0-beb9-189fdf069d63</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/2PJF4eJsfC8/the-8-hour-rails-code-audit</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>code</category>
      <category>codeaudit</category>
      <category>agile</category>
      <category>programming</category>
      <category>planetargon</category>
      <category>audit</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/20/the-8-hour-rails-code-audit</feedburner:origLink></item>
    <item>
      <title>Flash Message Conductor now a Gem</title>
      <description>&lt;p&gt;We&amp;#8217;ve been doing some early (or late&amp;#8230; if you&amp;#8217;re a half-full kind of person) spring cleaning on some of our projects. One of the small projects, &lt;a href="http://github.com/planetargon/flash-message-conductor"&gt;flash_message_conductor&lt;/a&gt;, which &lt;a href="http://www.robbyonrails.com/articles/2008/08/29/flash-message-conductor"&gt;we released last year as a plugin&lt;/a&gt; is now a gem. We&amp;#8217;ve been &lt;a href="http://www.robbyonrails.com/articles/2009/01/13/question-plugins-or-gems-or-both"&gt;moving away from using plugins in favor of gems&lt;/a&gt; as we like locking in specific released versions and being able to specify them in our &lt;code&gt;environment.rb&lt;/code&gt; file is quite convenient.&lt;/p&gt;


	&lt;p&gt;To install, just run the following:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  sudo gem install flash-message-conductor --source=http://gemcutter.org
  Successfully installed flash-message-conductor-1.0.0
  1 gem installed
  Installing ri documentation for flash-message-conductor-1.0.0...
  Installing RDoc documentation for flash-message-conductor-1.0.0...
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;You&amp;#8217;ll then just need to include the following in your &lt;code&gt;config/environment.rb&lt;/code&gt; file.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Rails&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Initializer&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
  &lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;flash-message-conductor&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:lib&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;flash_message_conductor&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:source&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://gemcutter.org&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You can take a peak at the &lt;a href="http://github.com/planetargon/flash-message-conductor/blob/master/README"&gt;&lt;span class="caps"&gt;README&lt;/span&gt;&lt;/a&gt; for usage examples.&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ll be packaging up a handful of our various plugins that we reuse on projects and moving them to gems. Stay tuned&amp;#8230; :-)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=padiFAcdxxY:oRJ_BIa-vl4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=padiFAcdxxY:oRJ_BIa-vl4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=padiFAcdxxY:oRJ_BIa-vl4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=padiFAcdxxY:oRJ_BIa-vl4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=padiFAcdxxY:oRJ_BIa-vl4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=padiFAcdxxY:oRJ_BIa-vl4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=padiFAcdxxY:oRJ_BIa-vl4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/padiFAcdxxY" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 13 Oct 2009 10:30:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7f1572d8-0026-4620-b8de-f7e2b5a5ca63</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/padiFAcdxxY/flash-message-conductor-now-a-gem</link>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>gem</category>
      <category>plugins</category>
      <category>github</category>
      <category>development</category>
      <category>code</category>
      <category>rubyonrails</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/10/13/flash-message-conductor-now-a-gem</feedburner:origLink></item>
    <item>
      <title>Oh My Zsh gets an auto-updater</title>
      <description>&lt;p&gt;I wanted to publically thank everyone for helping me get Oh My Zsh out there and &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;continue to improve it&lt;/a&gt;. Many of us spend a lot of time in our terminals throughout the day and I firmly believe that having a well-working shell is nearly as important as having a well-working texteditor.&lt;/p&gt;


	&lt;p&gt;While Oh My Zsh isn&amp;#8217;t a large project, it is my attempt to share what I&amp;#8217;ve learned about using zsh with others&amp;#8230; but honestly, my goal is to learn from you. I don&amp;#8217;t have a lot of time to really dive into the deepend of the zsh-pool so am relying on others to share their tricks, hacks, functions, themes, etc. So, I thought that if I created a basic framework with outlined some conventions so that others could contribute, that perhaps I&amp;#8217;d end up with a kickass shell.&lt;/p&gt;


	&lt;p&gt;So far&amp;#8230; Oh My Zsh has been &lt;a href="http://github.com/robbyrussell/oh-my-zsh/network"&gt;forked on github 25 times&lt;/a&gt; and is being &lt;a href="http://github.com/robbyrussell/oh-my-zsh/watchers"&gt;watched by over 100 people&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Last week, I pushed out an update that introduces an auto-update feature. I&amp;#8217;m quite keen of desktop applications that can auto-update themselves, so our initial version of this feature will ask you no more than once a week if you want to check for updates. This means that as we continue to extend and improve Oh My Zsh, you can keep up-to-date.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/nbm23/terminal-zsh"&gt;&lt;img src="http://img.skitch.com/20091001-gsgeh75peiebfs8y6146xuu7r8.preview.jpg" alt="Terminal 2014 zsh" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"&gt;Uploaded with &lt;a href="http://plasq.com/"&gt;plasq&lt;/a&gt;&amp;#8217;s &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

	&lt;p&gt;It&amp;#8217;s the beginning of a new month&amp;#8230; are you still using Bash? Perhaps you&amp;#8217;re using your own zsh configuration but want to see what else zsh can offer you? I invite you to install Oh My Zsh today. :-)&lt;/p&gt;


	&lt;p&gt;Just run this in your terminal and you&amp;#8217;ll get setup. Don&amp;#8217;t worry&amp;#8230; you won&amp;#8217;t lose your existing configuration. :-)&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;wget http://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;For more infromation, visit &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;http://github.com/robbyrussell/oh-my-zsh/&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XqYa0gGOHtE:eVU9-JGiT_Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XqYa0gGOHtE:eVU9-JGiT_Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=XqYa0gGOHtE:eVU9-JGiT_Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XqYa0gGOHtE:eVU9-JGiT_Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XqYa0gGOHtE:eVU9-JGiT_Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=XqYa0gGOHtE:eVU9-JGiT_Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=XqYa0gGOHtE:eVU9-JGiT_Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/XqYa0gGOHtE" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 30 Sep 2009 21:21:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3239e28b-21e7-4a68-8859-aa6b8702976a</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/XqYa0gGOHtE/oh-my-zsh-gets-an-auto-updater</link>
      <category>Programming</category>
      <category>zsh</category>
      <category>bash</category>
      <category>terminal</category>
      <category>project</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/09/30/oh-my-zsh-gets-an-auto-updater</feedburner:origLink></item>
    <item>
      <title>Planting the seeds</title>
      <description>&lt;p&gt;Yesterday, the Rails team released 2.3.4, which includes standardized way for loading seed data into your application so that you didn&amp;#8217;t have to clutter your database migrations.&lt;/p&gt;


	&lt;p&gt;I noticed a few comments on some blogs where people were asking how to use this new feature, so here is a quick runthrough a few ways that you can use it.&lt;/p&gt;


	&lt;h2&gt;Populating Seed Data Approaches&lt;/h2&gt;


	&lt;p&gt;The &lt;code&gt;db/seeds.rb&lt;/code&gt; file is your playground. We&amp;#8217;ve been evolving our seed file on a new project and it&amp;#8217;s been great at allowing us to populate a really large data. Here are a few approaches that we&amp;#8217;ve taken to diversify our data so that when we&amp;#8217;re working on UI, we can have some diversified content.&lt;/p&gt;


	&lt;h3&gt;Basic example&lt;/h3&gt;


	&lt;p&gt;Any code that add to &lt;code&gt;db/seeds.rb&lt;/code&gt; is going to executed when you run &lt;code&gt;rake db:seed&lt;/code&gt;. You can do something as simple as:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;# db/seeds.rb

Article.create(:title =&amp;gt; 'My article title', :body =&amp;gt; 'Lorem ipsum dolor sit amet, consectetur adipisicing elit')&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Just create database records like you would in your Rails application or in &lt;code&gt;script/console&lt;/code&gt;. Simple enough, right? Let&amp;#8217;s play with a few other approaches that we&amp;#8217;ve begun to use.&lt;/p&gt;


	&lt;h3&gt;Use the names of real people&lt;/h3&gt;


	&lt;p&gt;We&amp;#8217;re using the &lt;a href="http://github.com/fcoury/octopi/"&gt;Octopi gem&lt;/a&gt; to connect to github, collect all the names of people that follow me there, and using their names to seed our development database.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="attribute"&gt;@robby_on_github&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Octopi&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;User&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;robbyrussell&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;

&lt;span class="comment"&gt;# add a bunch of semi-real users&lt;/span&gt;
&lt;span class="attribute"&gt;@robby_on_github&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;followers&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;follower&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;github_person&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Octopi&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;User&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;follower&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;next&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;github_person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;

  &lt;span class="comment"&gt;# split their name in half... good enough (like the goonies)&lt;/span&gt;
  &lt;span class="ident"&gt;first_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;github_person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;split&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; &lt;/span&gt;&lt;span class="punct"&gt;')[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="ident"&gt;last_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;github_person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;split&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; &lt;/span&gt;&lt;span class="punct"&gt;')[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="ident"&gt;new_person&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:first_name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;first_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:last_name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;last_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:email&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Faker&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Internet&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;email&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                             &lt;span class="symbol"&gt;:password&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;secret&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:password_confirmation&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;secret&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
                             &lt;span class="symbol"&gt;:github_username&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;follower&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:website_url&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;github_person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;blog&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;We do this with a few sources (twitter, github, etc..) to pull in the names of real people. If you want to be part of my seed data, you might &lt;a href="http://github.com/robbyrussell/"&gt;consider following me on Github&lt;/a&gt;. ;-)&lt;/p&gt;


	&lt;h3&gt;Use Faker for Fake data&lt;/h3&gt;


	&lt;p&gt;You may have noticed in the previous code sample, that I used Faker in that code. We are using this a bunch in our seed data file. With Faker, you can generate a ton of fake data really easy.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;links&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Faker&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Lorem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="punct"&gt;)+&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; &lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;capitalize&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                    &lt;span class="symbol"&gt;:url&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://&lt;span class="expr"&gt;#{Faker::Internet.domain_name}&lt;/span&gt;/&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                    &lt;span class="symbol"&gt;:description&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Faker&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Lorem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sentences&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)+&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; &lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;We might toss something like that into a method so that we can do the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="attribute"&gt;@people&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="number"&gt;500&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;generate_link_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@people&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sort_by&lt;/span&gt;&lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;}[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;...and we&amp;#8217;ll get 500 links added randomly across all of the people we added to our system. You can get fairly creative here.&lt;/p&gt;


	&lt;p&gt;For example, we might even wanted random amounts of comments added to our links.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;generate_link_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;person&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;link&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;person&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;links&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Faker&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Lorem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="punct"&gt;)+&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; &lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;capitalize&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                             &lt;span class="symbol"&gt;:url&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://&lt;span class="expr"&gt;#{Faker::Internet.domain_name}&lt;/span&gt;/&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                             &lt;span class="symbol"&gt;:description&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Faker&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Lorem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sentences&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)+&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; &lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;

  &lt;span class="comment"&gt;# let's randomly add some comments...&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;link&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;valid?&lt;/span&gt;
    &lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;link&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;comments&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:person_id&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@people&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sort_by&lt;/span&gt;&lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;}[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                           &lt;span class="symbol"&gt;:body&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Faker&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Lorem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;paragraph&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)+&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;It&amp;#8217;s not beautiful, but it gets the job done. It makes navigating around the application really easy so that we aren&amp;#8217;t having to constantly input new data all the time. As mentioned, it really helps when we&amp;#8217;re working on the UI.&lt;/p&gt;


	&lt;h2&gt;Your ideas?&lt;/h2&gt;


	&lt;p&gt;We&amp;#8217;re trying a handful of various approaches to seed our database. If you have some fun ways of populating your development database with data, we&amp;#8217;d love to hear about it.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=gizZCNjRZwM:TVK3Bd2Cbg4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=gizZCNjRZwM:TVK3Bd2Cbg4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=gizZCNjRZwM:TVK3Bd2Cbg4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=gizZCNjRZwM:TVK3Bd2Cbg4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=gizZCNjRZwM:TVK3Bd2Cbg4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=gizZCNjRZwM:TVK3Bd2Cbg4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=gizZCNjRZwM:TVK3Bd2Cbg4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/gizZCNjRZwM" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 05 Sep 2009 08:00:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:18d867c2-4616-46cd-b01d-be922b00ccf5</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/gizZCNjRZwM/planting-the-seeds</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>seeds</category>
      <category>database</category>
      <category>development</category>
      <category>workflow</category>
      <category>faker</category>
      <category>github</category>
      <category>rubyonrails</category>
      <category>code</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/09/05/planting-the-seeds</feedburner:origLink></item>
    <item>
      <title>Oh My Zsh gets theme support</title>
      <description>&lt;p&gt;I just pushed a small change to &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;Oh My Zsh&lt;/a&gt;, which gives it rudimentary support for themes. What I&amp;#8217;m hoping to do is collect prompts from tons of people and make it simple for others to find a &lt;span class="caps"&gt;PROMPT&lt;/span&gt; that works well for them.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/b7m4i/robbyrussells-oh-my-zsh-at-2c9f74b5c3f6910e7c66601008e9ddd0444b70c7-github"&gt;&lt;img src="http://img.skitch.com/20090831-be83mt3js29aaxujgtsab2e7pe.preview.jpg" alt="robbyrussell's oh-my-zsh at 2c9f74b5c3f6910e7c66601008e9ddd0444b70c7 - GitHub" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;As of right now, there are only three for you to choose from. So, please head over to github, &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;fork Oh My Zsh&lt;/a&gt;, add your theme, and send a pull request. :-)&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/b7m43/zsh-users-robbyrussell-projects-development-planetargon-brainstorm-zsh"&gt;&lt;img src="http://img.skitch.com/20090831-j8q4wx315p3x4dj99parmgnn4w.preview.jpg" alt="zsh /Users/robbyrussell/Projects/development/planetargon/brainstorm 2014 zsh" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;Once I get it merged in, we&amp;#8217;ll get a screenshot of it added to the Oh My Zsh wiki. (&lt;a href="http://wiki.github.com/robbyrussell/oh-my-zsh/themes"&gt;see themes&lt;/a&gt;)&lt;/p&gt;


	&lt;p&gt;I know that many of you have some really sweet prompts configured as I got a lot of response with my post, &lt;a href="http://www.robbyonrails.com/articles/2009/02/13/show-me-your-and-ill-show-you-mine-terminal-prompts-with-git-branches" title="terminal prompts with git branches"&gt;Show me your and I&amp;#8217;ll show you mine&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=mpZF6jXLTJ4:-2bstUFy2PY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=mpZF6jXLTJ4:-2bstUFy2PY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=mpZF6jXLTJ4:-2bstUFy2PY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=mpZF6jXLTJ4:-2bstUFy2PY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=mpZF6jXLTJ4:-2bstUFy2PY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=mpZF6jXLTJ4:-2bstUFy2PY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=mpZF6jXLTJ4:-2bstUFy2PY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/mpZF6jXLTJ4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 31 Aug 2009 10:00:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c5ab26ec-4d96-4a42-848d-ce90f5cedb52</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/mpZF6jXLTJ4/oh-my-zsh-gets-theme-support</link>
      <category>Programming</category>
      <category>shell</category>
      <category>zsh</category>
      <category>terminal</category>
      <category>prompt</category>
      <category>git</category>
      <category>console</category>
      <category>themes</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/08/31/oh-my-zsh-gets-theme-support</feedburner:origLink></item>
    <item>
      <title>..and on the seventh day, Science created zsh</title>
      <description>&lt;p&gt;Inspired by some recent posts from Tom on &lt;a href="http://tomafro.net/tags/zsh"&gt;zsh&lt;/a&gt;, I decided that I&amp;#8217;d do my part to help people give it a whirl. I&amp;#8217;ve been using zsh for a few years now and haven&amp;#8217;t found myself missing bash.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re interested in taking a few minutes to give zsh a while, you&amp;#8217;re in luck. I recently reorganized all of my zsh config into a package and &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;tossed it on github&lt;/a&gt; to share. My goal was to create a reusable tool that would allow people to get up and running quickly with some of the fun configuration that I&amp;#8217;ve come to rely on on a daily basis.&lt;/p&gt;


	&lt;p&gt;For example:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Auto-complete rake and capistrano tasks&lt;/li&gt;
		&lt;li&gt;Git branch names when you&amp;#8217;re in a git project directory structure&lt;/li&gt;
		&lt;li&gt;Tons of color highlighting (grep, git, etc.)&lt;/li&gt;
		&lt;li&gt;Sexy prompts.. (so say me)&lt;/li&gt;
		&lt;li&gt;much much more&amp;#8230;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I invite you to give &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;Oh My Zsh&lt;/a&gt; a whirl, which should take you less than a minute. Just &lt;a href="http://github.com/robbyrussell/oh-my-zsh/"&gt;follow the instructions&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Also, Oh My Zsh is Snow Leopard compatible. ;-)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=K-ukcJq4JMc:vwz_zVRuuPo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=K-ukcJq4JMc:vwz_zVRuuPo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=K-ukcJq4JMc:vwz_zVRuuPo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=K-ukcJq4JMc:vwz_zVRuuPo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=K-ukcJq4JMc:vwz_zVRuuPo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=K-ukcJq4JMc:vwz_zVRuuPo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=K-ukcJq4JMc:vwz_zVRuuPo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/K-ukcJq4JMc" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 30 Aug 2009 20:08:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0570dff1-8539-4396-a718-557895cf6c65</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/K-ukcJq4JMc/and-on-the-seventh-day-science-created-zsh</link>
      <category>Programming</category>
      <category>terminal</category>
      <category>osx</category>
      <category>linux</category>
      <category>console</category>
      <category>bash</category>
      <category>zsh</category>
      <category>git</category>
      <category>github</category>
      <category>commandline</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/08/30/and-on-the-seventh-day-science-created-zsh</feedburner:origLink></item>
    <item>
      <title>So long and thanks for all the hoodwinks</title>
      <description>&lt;p&gt;_why,&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re out there and come across this&amp;#8230; know that one of my fondest memories on the internet was with you. Hoodink.d was one of the greatest things on the internet four years ago and I suspect that a very tiny fraction of the Ruby community has even heard of it.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/3838279665/" title="Thanks hoodwink'd by Robby Russell, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3450/3838279665_90a7e7632b_o.jpg" width="421" height="199" alt="Thanks hoodwink'd" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Fortunately for me, I have a copy of the hoodwink git repository and was able to get it running tonight in hopes that I might find you lurking in the mousehole. I&amp;#8217;m convinced that you are in a parallel internetverse. Perhaps you might send me an invite.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/3838274563/" title="Hoodwink'd. do you remember? by Robby Russell, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3437/3838274563_07ee2d960d.jpg" width="465" height="500" alt="Hoodwink'd. do you remember?" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;I miss hoodwink&amp;#8230; and if you stay missing, I&amp;#8217;ll just miss hoodwink more.&lt;/p&gt;


	&lt;p&gt;In the meantime, I wonder how hard it&amp;#8217;ll be to get hoodwink to run on rack.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/3839209620/" title="the winker's satellite office » login by Robby Russell, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3520/3839209620_a62e917f8d.jpg" width="500" height="368" alt="the winker's satellite office » login" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Wink you on the other side,
Robby&lt;/p&gt;


	&lt;p&gt;p.s. you can find me in my own mousehole&amp;#8230; should you want to send me an invite and/or feed me cheese.&lt;/p&gt;


	&lt;h2&gt;Related Posts&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2005/08/25/thank-you-hoodwink-d"&gt;Thank you hoodwink.d&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Z4n48rHTF6g:6qV8vCWb0tw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Z4n48rHTF6g:6qV8vCWb0tw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=Z4n48rHTF6g:6qV8vCWb0tw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Z4n48rHTF6g:6qV8vCWb0tw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Z4n48rHTF6g:6qV8vCWb0tw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Z4n48rHTF6g:6qV8vCWb0tw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=Z4n48rHTF6g:6qV8vCWb0tw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/Z4n48rHTF6g" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 20 Aug 2009 00:24:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6cb5176a-e3e2-40da-be6e-ecb45fe11737</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/Z4n48rHTF6g/so-long-and-thanks-for-all-the-hoodwinks</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>_why</category>
      <category>hoodwinkd</category>
      <category>nostalgia</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/08/20/so-long-and-thanks-for-all-the-hoodwinks</feedburner:origLink></item>
    <item>
      <title>Ch-ch-ch-changes at Planet Argon</title>
      <description>&lt;p&gt;Now that the cat is out of the bag, I can share some recent news with you. Earlier today, we announced that &lt;a href="http://blueboxgrp.com/"&gt;Blue Box Group&lt;/a&gt; had acquired &lt;a href="http://railsboxcar.com"&gt;Rails Boxcar&lt;/a&gt;, our kickass deployment solution for Ruby on Rails applications.&lt;/p&gt;


	&lt;p&gt;Our team has been offering hosting services for over six years. When I made the decision to start providing Rails hosting over four years ago, it was something that I thought the community needed to validate that Ruby on Rails was a viable solution for building web applications. At the time, there was only one or two companies offering pre-configured solutions. The good ole days. :-)&lt;/p&gt;


	&lt;p&gt;Over the course of the past 4+ years, we&amp;#8217;ve helped deploy and host well over a thousand web applications built with Ruby on Rails. Perhaps we even hosted your site at one point or another. We definitely had a lot of fun and learned a lot from our experience.&lt;/p&gt;


	&lt;p&gt;Fast-forward four years, the community now has several great solutions and options for hosting their Ruby on Rails
applications. Knowing this, we began to look over the &lt;a href="http://planetargon.com/what-we-do?src=robbyonrails"&gt;plethora of services that we offer&lt;/a&gt; and felt that we had been spreading ourselves too thinly. We were faced with the big question of: Should we focus our energy on trying to innovate in this competitive space or should we find a community-respected vendor to pass the torch to?&lt;/p&gt;


	&lt;p&gt;Rails Boxcar is a product that we are extremely proud of and believe the acquisition by Blue Box Group will be great for our existing customers. The acquisition is going to benefit our customers as they&amp;#8217;ll be able to interface with a team with more resources. A team that also aims to innovate in this space and believes that Rails Boxcar will help them do that.&lt;/p&gt;


	&lt;p&gt;As a byproduct of this deal, our team has an opportunity to focus our collective energy on designing and developing web applications, which has also been a central part of what we do for as long as we&amp;#8217;ve been in business. We plan to speed up our efforts on a handful web-based products that we&amp;#8217;ve been internally developing and hope to release in the near future.&lt;/p&gt;


	&lt;p&gt;I had the pleasure of getting to talk thoroughly with the team at Blue Box Group and really feel like they&amp;#8217;ll be able to focus their energy on maintaining and innovating within the Ruby on Rails hosting world.. definitely more than we could over the coming years. In the end, the acquisition is going to benefit our customers the most as they&amp;#8217;ll be able to interface with a larger team that is innovating in this space.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re interested in learning more about the acquisition, please &lt;a href="http://www.prlog.org/10308400.html"&gt;read the press release&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;From our perspective, this is a win-win-win situation for everyone involved. Expect to see some more news from us in the near future&amp;#8230; and if you&amp;#8217;re looking for a design and development team, don&amp;#8217;t hesitate to &lt;a href="http://planetargon.com/get-in-touch?src=robbyonrails"&gt;get in touch with us&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r3Pg8R9FaWM:qoli2ZSnFPo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r3Pg8R9FaWM:qoli2ZSnFPo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=r3Pg8R9FaWM:qoli2ZSnFPo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r3Pg8R9FaWM:qoli2ZSnFPo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r3Pg8R9FaWM:qoli2ZSnFPo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r3Pg8R9FaWM:qoli2ZSnFPo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=r3Pg8R9FaWM:qoli2ZSnFPo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/r3Pg8R9FaWM" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 12 Aug 2009 18:31:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:de57f385-d412-424c-9b80-de710ef0b600</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/r3Pg8R9FaWM/ch-ch-ch-changes-at-planet-argon</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>PLANET ARGON</category>
      <category>rails</category>
      <category>boxcar</category>
      <category>planet</category>
      <category>argon</category>
      <category>business</category>
      <category>blue</category>
      <category>box</category>
      <category>group</category>
      <category>hosting</category>
      <category>rubyonrails</category>
      <category>announcement</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/08/12/ch-ch-ch-changes-at-planet-argon</feedburner:origLink></item>
    <item>
      <title>Slides from my Rails Underground 2009 talk</title>
      <description>&lt;p&gt;Hello from London!&lt;/p&gt;


	&lt;p&gt;Am currently enjoying the talks at Rails Underground 2009 in London and had the pleasure to be one of the first speakers at the conference. My talk covered a collection of what our team considers best practices. Best practices that aid in the successful launch of a web application and covered a few Rails-specific topics as well.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll be sharing some posts in the coming week(s) that&amp;#8217;ll expand on some of these topics as promised to the audience.&lt;/p&gt;


&lt;div style="width:425px;text-align:left" id="__ss_1770095"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/robbyrussell/launching-ruby-on-rails-projects-a-checklist" title="Launching Ruby on Rails projects: A checklist"&gt;Launching Ruby on Rails projects: A checklist&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=launching-rails-apps-090726062406-phpapp02&amp;#38;stripped_title=launching-ruby-on-rails-projects-a-checklist" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=launching-rails-apps-090726062406-phpapp02&amp;#38;stripped_title=launching-ruby-on-rails-projects-a-checklist" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/robbyrussell"&gt;Robby Russell&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;

	&lt;p&gt;Since I covered a wide range of topics, I decided to share my slides online. They won&amp;#8217;t provide as much context (as I&amp;#8217;m not speaking as you&amp;#8217;ll look at them), but they might hint at some of the topics that I covered. There was a guy video taping the talks&amp;#8230; so I assume that a video of my talk will be posted online in the near future.&lt;/p&gt;


	&lt;p&gt;Until then&amp;#8230; &lt;a href="http://www.slideshare.net/robbyrussell/launching-ruby-on-rails-projects-a-checklist"&gt;here are the slides&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=cLC8vvqsQ8Y:Ktg_uYEHRHw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=cLC8vvqsQ8Y:Ktg_uYEHRHw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=cLC8vvqsQ8Y:Ktg_uYEHRHw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=cLC8vvqsQ8Y:Ktg_uYEHRHw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=cLC8vvqsQ8Y:Ktg_uYEHRHw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=cLC8vvqsQ8Y:Ktg_uYEHRHw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=cLC8vvqsQ8Y:Ktg_uYEHRHw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/cLC8vvqsQ8Y" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 24 Jul 2009 10:37:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3310f57f-0e48-45d1-b8b0-e306f57657c3</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/cLC8vvqsQ8Y/slides-from-my-rails-underground-2009-talk</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>hosting</category>
      <category>rubyonrails</category>
      <category>agile</category>
      <category>conference</category>
      <category>deployment</category>
      <category>london</category>
      <category>talk</category>
      <category>feedback</category>
      <category>seo</category>
      <category>railsunder</category>
      <category>presentation</category>
      <category>analytics</category>
      <category>sem</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/07/24/slides-from-my-rails-underground-2009-talk</feedburner:origLink></item>
    <item>
      <title>Launching Rails projects, an open call for lessons learned</title>
      <description>&lt;p&gt;I&amp;#8217;m working on &lt;a href="http://www.robbyonrails.com/articles/2009/06/18/speaking-at-rails-underground-2009"&gt;my presentation&lt;/a&gt; for &lt;a href="http://www.rails-underground.com/"&gt;Rails Underground&lt;/a&gt; and was hoping to solicit a few tips from other people in the industry.&lt;/p&gt;


	&lt;p&gt;Have you launched a Ruby on Rails application recently? Are there some things that you wish you had known beforehand?&lt;/p&gt;


	&lt;p&gt;Mind sharing? You can email me with your story at  &lt;a href="mailto:robby+launchstory@planetargon.com"&gt;robby+launchstory@planetargon.com&lt;/a&gt;. I&amp;#8217;ll let you know if your tip gets used in the presentation and please indicate if you&amp;#8217;d be okay with me posting your tip in a future blog post.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=dS34copGVrE:kyeI-k5ocx0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=dS34copGVrE:kyeI-k5ocx0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=dS34copGVrE:kyeI-k5ocx0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=dS34copGVrE:kyeI-k5ocx0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=dS34copGVrE:kyeI-k5ocx0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=dS34copGVrE:kyeI-k5ocx0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=dS34copGVrE:kyeI-k5ocx0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/dS34copGVrE" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 23 Jun 2009 12:33:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:370686db-a712-41f6-8024-baeaf261bc5a</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/dS34copGVrE/launching-rails-projects-an-open-call-for-lessons-learned</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>launching</category>
      <category>rubyonrails</category>
      <category>tips</category>
      <category>conference</category>
      <category>rails</category>
      <category>lessons</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/23/launching-rails-projects-an-open-call-for-lessons-learned</feedburner:origLink></item>
    <item>
      <title>Using model constants for project sanity</title>
      <description>&lt;p&gt;On one of our larger client projects (approx. 160 models and growing&amp;#8230;) we have a specific model that we refer to quite a bit throughout our code. This model contains less than 10 records, but each of them sits on top of an insanely large and complex set of data. Each record refers to a each of their regions that our client does business in.&lt;/p&gt;


	&lt;p&gt;For example&amp;#8230; we have, Australia, United Kingdom, Canada, United States, and so forth. Each of these regional divisions has their own company code, which are barely distinguishable from the next. They make sense to our client, but when we&amp;#8217;re not interacting with those codes on a regular basis, we have to look constantly look them up again to make sure we&amp;#8217;re dealing with the right record.&lt;/p&gt;


	&lt;p&gt;I wanted to share something that we did to make this easier for our team to work around these codes, which we should have thought of &lt;em&gt;long&lt;/em&gt; ago.&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s take the following mode, &lt;code&gt;Division&lt;/code&gt;. We only have about 10 records in our database, but have conditional code throughout the site that are dependent upon which divisions specific actions are being triggered within. Each division has various business logic that we have to maintain.&lt;/p&gt;


	&lt;p&gt;Prior to our change, we&amp;#8217;d come across a lot of code like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;# For all divisions except Canada, invoices are sent via email&lt;/span&gt;
&lt;span class="comment"&gt;# In Canada, invoices are sent via XML to a 3rd-party service&lt;/span&gt;
&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;process_invoices_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;division&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;division&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;code&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;XIUHR12&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="comment"&gt;# trigger method to send invoices to 3rd party service&lt;/span&gt;
    &lt;span class="comment"&gt;# ...&lt;/span&gt;
  &lt;span class="keyword"&gt;else&lt;/span&gt;
    &lt;span class="comment"&gt;# batch up invoices and send via email&lt;/span&gt;
    &lt;span class="comment"&gt;# ...&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;An alternative that we&amp;#8217;d also find ourselves using was.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;division&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Canada&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Hell, I think I&amp;#8217;ve even seen &lt;code&gt;if division.id == 2&lt;/code&gt; somewhere in the code before. To be fair to ourselves, we did inherit this project a few years ago. ;-)&lt;/p&gt;


	&lt;p&gt;Throughout the code base, you&amp;#8217;ll find business rules like this. Our developers all agreed that this was far from friendly and/or efficient and worst of all, it was extremely error-prone. There have been a few incidents where we read the code wrong and/or got them confused with one another. We were lacking a convention that we could all begin to rely on and use.&lt;/p&gt;


	&lt;p&gt;So, we decided to implement the following change.&lt;/p&gt;


	&lt;h3&gt;Model Constants&lt;/h3&gt;


	&lt;p&gt;You might already use constants in your Ruby on Rails application. It&amp;#8217;s not uncommon to add a few into &lt;code&gt;config/environment.rb&lt;/code&gt; and call it a day, but you might also consider scoping them within your models. (makes it much easier for you to maintain them as well)&lt;/p&gt;


	&lt;p&gt;In our scenario, we decided to add the following constants to our &lt;code&gt;division&lt;/code&gt; model.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Division&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="constant"&gt;AFRICA&lt;/span&gt;      &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;XYU238&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="constant"&gt;ASIA&lt;/span&gt;        &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;XIUHR73&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="constant"&gt;AUSTRALIA&lt;/span&gt;   &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;XIUHR152&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="constant"&gt;CANADA&lt;/span&gt;      &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;XIUHR12&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="constant"&gt;USA&lt;/span&gt;         &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;XIUHR389&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="comment"&gt;# etc..&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;What this will do is load up ech of these constants with the corresponding object. It&amp;#8217;s basically the equivallent of us doing:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;division&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="constant"&gt;Division&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;XIUHR389&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;But, with this approach, we can stop worrying about their codes and use the division names that we&amp;#8217;re talking about with our clients. Our client usually approaches us with, &amp;#8220;In Australia, we need to do X,Y,Z differently than we do in the other divisions due to new government regulations.&amp;#8221;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;division&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="constant"&gt;Division&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;CANADA&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="ident"&gt;division&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="constant"&gt;Division&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;AFRICA&lt;/span&gt;
    &lt;span class="comment"&gt;#&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="constant"&gt;Division&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;AUSTRALIA&lt;/span&gt;
    &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;We are finding this to be &lt;em&gt;much&lt;/em&gt; easier to read and maintain. When we&amp;#8217;re dealing with a lot of complex business logic in the application, little changes like this can make a big difference.&lt;/p&gt;


	&lt;p&gt;If you have any alternative solutions, we&amp;#8217;d love to hear them. Until then, we&amp;#8217;ve been quite pleased with this approach. Perhaps you&amp;#8217;ll find some value in it as well.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=s7WFVPPpmcw:FEuf359UNno:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=s7WFVPPpmcw:FEuf359UNno:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=s7WFVPPpmcw:FEuf359UNno:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=s7WFVPPpmcw:FEuf359UNno:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=s7WFVPPpmcw:FEuf359UNno:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=s7WFVPPpmcw:FEuf359UNno:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=s7WFVPPpmcw:FEuf359UNno:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/s7WFVPPpmcw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 23 Jun 2009 01:39:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:fc030737-c47e-4235-ae26-e5960f67d81b</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/s7WFVPPpmcw/using-model-constants-for-project-sanity</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>development</category>
      <category>ruby</category>
      <category>rubyonrails</category>
      <category>model</category>
      <category>activerecord</category>
      <category>businesslogic</category>
      <category>code</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/23/using-model-constants-for-project-sanity</feedburner:origLink></item>
    <item>
      <title>Aliasing resources in Ruby on Rails</title>
      <description>&lt;p&gt;Earlier today, a friend working on a project asked me how we approached routes on our website. If you take a quick peak at &lt;a href="http://planetargon.com/"&gt;our website&lt;/a&gt;, you&amp;#8217;ll see that we have URLs like so:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://planetargon.com/"&gt;http://planetargon.com/&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://planetargon.com/who-we-are"&gt;http://planetargon.com/who-we-are&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://planetargon.com/who-we-are/robby-russell"&gt;http://planetargon.com/who-we-are/robby-russell&lt;/a&gt;

	&lt;p&gt;I couldn&amp;#8217;t remember where I came across this before and wasn&amp;#8217;t quickly finding it in the &lt;a href="http://api.rubyonrails.org"&gt;Ruby on Rails &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;, so decided that I&amp;#8217;d do a quick write up on it.&lt;/p&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;When we launched our new site a few months ago, we were working off an existing code base. We have a model named, &lt;code&gt;TeamMember&lt;/code&gt; and a corresponding controller. When we decided to come up with new conventions for our &lt;span class="caps"&gt;URL&lt;/span&gt; structure, we opted to ditch the normal Rails conventions and go our own route. What we weren&amp;#8217;t sure about was how to alias resources in our routes nicely. After some digging around, we came across the &lt;code&gt;:as&lt;/code&gt; option.&lt;/p&gt;


	&lt;p&gt;So, our route was:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;resources&lt;/span&gt; &lt;span class="symbol"&gt;:team_members&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Which provided us with:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;/team_members&lt;/li&gt;
		&lt;li&gt;/team_members/robby-russell&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;We simply added &lt;code&gt;:as =&amp;gt; 'who-we-are'&lt;/code&gt; to our route:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;resources&lt;/span&gt; &lt;span class="symbol"&gt;:team_members&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:as&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;who-we-are&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;...and we got exactly what we were looking for in our URLs.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
* /who-we-are
* /who-we-are/gary-blessington
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;If you &lt;a href="http://planetargon.com"&gt;look at our site&lt;/a&gt;, you&amp;#8217;ll notice that we did this in a few areas of our application so that we could define our own &lt;span class="caps"&gt;URL&lt;/span&gt; structure that was more friendly for visitors and search engines.&lt;/p&gt;


	&lt;p&gt;Anyhow, just a quick tip for those who want to change up their URLs with Ruby on Rails.&lt;/p&gt;


	&lt;p&gt;p.s., if you know where I can find this documented, let me know so that I can provide a &lt;span class="caps"&gt;URL&lt;/span&gt; in this post for others. :-)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=9eN3dxKGNGw:n6Y5Cap8Sjw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=9eN3dxKGNGw:n6Y5Cap8Sjw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=9eN3dxKGNGw:n6Y5Cap8Sjw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=9eN3dxKGNGw:n6Y5Cap8Sjw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=9eN3dxKGNGw:n6Y5Cap8Sjw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=9eN3dxKGNGw:n6Y5Cap8Sjw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=9eN3dxKGNGw:n6Y5Cap8Sjw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/9eN3dxKGNGw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 23 Jun 2009 01:00:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:86d03112-712c-4662-8be3-6d1067c5242f</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/9eN3dxKGNGw/aliasing-resources-in-ruby-on-rails</link>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>rubyonrails</category>
      <category>rails</category>
      <category>routes</category>
      <category>seo</category>
      <category>development</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/23/aliasing-resources-in-ruby-on-rails</feedburner:origLink></item>
    <item>
      <title>Remember to Flush Your Toilet</title>
      <description>&lt;p&gt;Saw &lt;a href="http://twitter.com/TeresaBrazen/statuses/2226976754"&gt;this tweet&lt;/a&gt; the other day&amp;#8230;&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/bw5w6/twitter-teresa-brazen-design-principle-flush-t-"&gt;&lt;img src="http://img.skitch.com/20090620-rdde21aee5smktrwi857mpdytn.preview.jpg" alt="Twitter / Teresa Brazen: Design Principle: Flush t ..." /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080"&gt;Uploaded with &lt;a href="http://plasq.com/"&gt;plasq&lt;/a&gt;&amp;#8217;s &lt;a href="http://skitch.com"&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

	&lt;p&gt;So, I have to ask. How many toilets (buckets) do you maintain? How many of them still have projects/tasks in them? Why haven&amp;#8217;t you flushed your toilets yet?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=iX0UuaHVcjY:uwMZ8z4COLY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=iX0UuaHVcjY:uwMZ8z4COLY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=iX0UuaHVcjY:uwMZ8z4COLY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=iX0UuaHVcjY:uwMZ8z4COLY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=iX0UuaHVcjY:uwMZ8z4COLY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=iX0UuaHVcjY:uwMZ8z4COLY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=iX0UuaHVcjY:uwMZ8z4COLY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/iX0UuaHVcjY" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 19 Jun 2009 19:58:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1db88a75-16fa-40a2-99ef-5f6b92363cc4</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/iX0UuaHVcjY/remember-to-flush-your-toilet</link>
      <category>Off-Topic</category>
      <category>productivity</category>
      <category>agile</category>
      <category>toilets</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/19/remember-to-flush-your-toilet</feedburner:origLink></item>
    <item>
      <title>Speaking at Rails Underground 2009</title>
      <description>&lt;p&gt;It&amp;#8217;s time to find my passport again&amp;#8230;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/2241810168/" title="Waiting at Gatwick Airport by Robby Russell, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2312/2241810168_2af66d4a2e.jpg" width="500" height="375" alt="Waiting at Gatwick Airport" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve been invited to speak at &lt;a href="http://railsunderground.com/"&gt;Rails Underground&lt;/a&gt;, which is being held in London, UK from July 24-25th.&lt;/p&gt;


	&lt;p&gt;My talk, which is tentatively titled, &lt;strong&gt;&amp;#8220;Launching Ruby on Rails projects, a checklist&amp;#8221;&lt;/strong&gt;, will expand on several ideas that came out a &lt;a href="http://www.robbyonrails.com/articles/2008/12/14/launching-ruby-on-rails-projects-a-checklist"&gt;previous article on the topic&lt;/a&gt;. Additionally, I plan to share some of the lessons that we&amp;#8217;ve learned at &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt; as we&amp;#8217;ve launched projects over last several years.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.rails-underground.com" title="I'm speaking at Rails Underground!"&gt;&lt;img src="http://www.rails-underground.com/images/speaker_badge.png" alt="I'm speaking at Rails Underground!"/&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re able to make it, I encourage you to &lt;a href="http://bw.eventwax.com/rails-underground-09/register"&gt;register for the event&lt;/a&gt; before it&amp;#8217;s too late. Take a quick peak at the &lt;a href="http://www.rails-underground.com/09-conference-speakers.html"&gt;list of speakers&lt;/a&gt;. I&amp;#8217;m grateful to the event organizers for the invite and look forward to seeing/meeting all of the attendees!&lt;/p&gt;


	&lt;p&gt;Also, for those of you in the London area. If you&amp;#8217;re seeking a design and development team that specializes in Ruby on Rails and want to schedule a meeting with me while I&amp;#8217;m visiting, don&amp;#8217;t hesitate to &lt;a href="http://planetargon.com/get-in-touch"&gt;get in touch with us&lt;/a&gt;. I&amp;#8217;m planning on staying a few days extra around the conference dates to visit some of our existing clients and would be happy to meet you.&lt;/p&gt;


&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JpUbmkyrBjs&amp;#38;hl=en&amp;#38;fs=1&amp;#38;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JpUbmkyrBjs&amp;#38;hl=en&amp;#38;fs=1&amp;#38;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=FlFbPkKEiLc:ZlKld5C8PZA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=FlFbPkKEiLc:ZlKld5C8PZA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=FlFbPkKEiLc:ZlKld5C8PZA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=FlFbPkKEiLc:ZlKld5C8PZA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=FlFbPkKEiLc:ZlKld5C8PZA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=FlFbPkKEiLc:ZlKld5C8PZA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=FlFbPkKEiLc:ZlKld5C8PZA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/FlFbPkKEiLc" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 18 Jun 2009 08:40:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1bdde6ad-c174-4731-ba01-10826094969f</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/FlFbPkKEiLc/speaking-at-rails-underground-2009</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>speaking</category>
      <category>conference</category>
      <category>london</category>
      <category>rubyonrails</category>
      <category>planetargon</category>
      <category>railsunderground</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/18/speaking-at-rails-underground-2009</feedburner:origLink></item>
    <item>
      <title>Howdy Rip!</title>
      <description>&lt;p&gt;Chris Wanstrath (&lt;a href="http://twitter.com/defunkt"&gt;@defunkt&lt;/a&gt;) just posted the following on twitter.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;Hello Rip &amp;#8211; &lt;a href="http://hellorip.com/"&gt;http://hellorip.com/&lt;/a&gt;&amp;#8220;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;The &lt;a href="http://hellorip.com/about.html"&gt;Rip project describes itself&lt;/a&gt; as, &amp;#8220;an attempt to create a next generation packaging system for Ruby.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;One of the cool features is that it supports multiple environments. For example, you can have different Rip environments (with different gem versioning) that are targeted towards specific applications. I have to dig around more through the project, but this looks fascinating.&lt;/p&gt;


	&lt;p&gt;Check it out at &lt;a href="http://hellorip.com/"&gt;http://hellorip.com/&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m also curious as to how you think you might be able to start using this.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;What are some ways that you could use Rip&lt;/strong&gt;&amp;#8212;&lt;a href="http://heybrainstormr.com/t/pgte"&gt;http://heybrainstormr.com/t/pgte&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=TH0E1dEWm74:U422ddpa24w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=TH0E1dEWm74:U422ddpa24w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=TH0E1dEWm74:U422ddpa24w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=TH0E1dEWm74:U422ddpa24w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=TH0E1dEWm74:U422ddpa24w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=TH0E1dEWm74:U422ddpa24w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=TH0E1dEWm74:U422ddpa24w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/TH0E1dEWm74" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 11 Jun 2009 12:35:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d1faaf2a-7cb7-45b9-b969-924c8179379b</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/TH0E1dEWm74/howdy-rip</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rubygems</category>
      <category>gems</category>
      <category>git</category>
      <category>github</category>
      <category>rubyonrails</category>
      <category>development</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/11/howdy-rip</feedburner:origLink></item>
    <item>
      <title>Email. Twice daily. No more, no less.</title>
      <description>&lt;p&gt;On a recent trip to Las Vegas, I picked up &lt;a href="http://www.amazon.com/4-hour-Work-Week-Escape-Anywhere/dp/0091923530"&gt;The Four Hour Workweek&lt;/a&gt; for my Amazon Kindle to read on my flight. When I came back from my short vacation, I decided that I was going to change how I approach email on a daily basis. In my position, I receive a lot of business-related emails on a daily basis, whether that be from employees, clients, or potential clients. A typical day would consist of me trying to get a few tasks done while keeping an eye on any new requests. This resulted in a lot of context-switching and my days were extremely fragmented. Our team had started an experiment where we&amp;#8217;d track all of our time throughout the day on printout. Our goal was to log all of our start/stop times for each activity and also capture each interruption within those time windows. After just a few days of doing this, I was noticing how much time was being spent on emails each day. I also noticed that it was rare to have a full hour of uninterrupted work on a single activity. Aside from distractions that you&amp;#8217;d typically find in an office environment, email was keeping me from attaining the level of focus that I was seeking on my work.&lt;/p&gt;


	&lt;p&gt;So, using some motivation from The Four Hour Workweek&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;, I opted to come back to the studio and change my behavior. That morning, I emailed my entire team and my clients to let them know that I would only be checking my email at 10am and 4pm each day. I explained that they could call me at the studio if there was something that needed my urgent attention. Admittedly, I was nervous as I hit send. What was I getting myself into? What were my clients going to think? Would they think that I&amp;#8217;m just an unorganized mess?&lt;/p&gt;


	&lt;p&gt;Three weeks later&amp;#8230;? It was one of the best emails that I&amp;#8217;ve sent in ages.&lt;/p&gt;


	&lt;h2&gt;The Results&amp;#8230; (so far)&lt;/h2&gt;


	&lt;p&gt;Here are a few realizations and conclusions that I&amp;#8217;ve been able to attribute to this change.&lt;/p&gt;


	&lt;h3&gt;My World Didn&amp;#8217;t Collapse&lt;/h3&gt;


	&lt;p&gt;Before I made this decision, I came up with a lot of excuses for why this was a bad idea.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;I might not respond fast enough to a new sales lead&lt;/li&gt;
		&lt;li&gt;A client might forget and send me an urgent request via email&lt;/li&gt;
		&lt;li&gt;Insert any other reason related to you just not following up quick enough&amp;#8230;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;In three weeks, none of these things has bitten me in the ass. It hasn&amp;#8217;t been perfect, but I don&amp;#8217;t believe that it&amp;#8217;s had any significant impact that outweighed the benefits.&lt;/p&gt;


	&lt;h3&gt;Less Time Spent on Emails&lt;/h3&gt;


	&lt;p&gt;I spend less time on email than I did before. Why? I don&amp;#8217;t treat email the same way that I used to. As a result of approaching email differently, I noticed that I am now more likely to keep my emails short and sweet&amp;#8230; and most importantly, to the point. One of the great things about Gmail is that it&amp;#8217;s made it easy to have &lt;em&gt;conversation&lt;/em&gt;-style emails with people, but it&amp;#8217;s also made it too easy to have conversations with people. I now realize that so many conversations that I would participate via email would entail single sentence questions/responses with similar length follow-ups. Each time you come back to that email, your attention is on that conversation and those can eat up a lot of time if you&amp;#8217;re not careful.&lt;/p&gt;


	&lt;p&gt;So, now that I&amp;#8217;m checking email twice a day, I tend to write only what is necessary to move the conversation forward until the next time I check my email. As a result, email conversations are slower now, but they aren&amp;#8217;t taking as much of my time. The benefits have outweighed the negatives.&lt;/p&gt;


	&lt;h3&gt;More Focus Time&lt;/h3&gt;


	&lt;p&gt;Since this change, there has been a handful of days where I have been able to focus completely on a single activity (task) for over a hour at a time. My record was nearly three hours one morning early last week. Unfortunately, I completed the task I had budgeted five hours for was finished in less than three. ;-)&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m able to do this more now because I&amp;#8217;ve been able to release my &lt;em&gt;check-your-email-again-just-to-be-safe&lt;/em&gt; demons. I&amp;#8217;ve been able to trust my system and I&amp;#8217;ll share some tips on how I eased myself into this.&lt;/p&gt;


	&lt;p&gt;More focus time has allowed me to spend less time working on individual tasks because they are subjected to nearly as much context-switching.&lt;/p&gt;


	&lt;h3&gt;More Creative Time&lt;/h3&gt;


	&lt;p&gt;Another benefit that I&amp;#8217;ve seen since this change is that with this time that I&amp;#8217;ve salvaged, I find myself with more time to be creative. I haven&amp;#8217;t pinpointed what the reason behind this is, but I do feel like I&amp;#8217;ve been more creative the past few weeks than I have been for the several months prior. Perhaps it&amp;#8217;s just a side-effect to altering my workday&amp;#8230; or that I don&amp;#8217;t feel like a victim to the &lt;span class="caps"&gt;INBOX&lt;/span&gt;&amp;#8230; or that it&amp;#8217;s been extremely sunny in Portland&amp;#8230; or that I&amp;#8217;m more aware of how I&amp;#8217;m spending my day.&lt;/p&gt;


	&lt;p&gt;Whatever it was, it started within days after I implemented this new approach to managing email. I&amp;#8217;m happy to attribute it to this for the time being. ;-)&lt;/p&gt;


	&lt;h2&gt;How I Did It&lt;/h2&gt;


	&lt;p&gt;Here are a few things that I did to start this process. Credit is due to Tim Ferris for suggesting most of these and here are some of my further thoughts.&lt;/p&gt;


	&lt;h3&gt;List Your Excuses&lt;/h3&gt;


	&lt;p&gt;Chances are, you don&amp;#8217;t have as many as you think you do. I started with the critical ones and really weighed the pros/cons. It&amp;#8217;s safe to use the, &lt;em&gt;&amp;#8220;Will anybody die if I do this?&amp;#8221;&lt;/em&gt; question to help you respond to each of these. You can be a little less cynical and ask yourself, &lt;em&gt;&amp;#8220;Will we go out of business if I do this?&amp;#8221;&lt;/em&gt;... or &lt;em&gt;&amp;#8220;Will we lose client X if I do this?&amp;#8221;&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;Then ask yourself, &amp;#8220;Is it unreasonable for me to do this?&amp;#8221; If the answer to, &amp;#8220;will we lose client X if I do this?&amp;#8221; and this don&amp;#8217;t match up, you might want to re-evaluating your client roster. If your clients are reasonable people, they&amp;#8217;ll see that there is value in this that will benefit both parties. As I mentioned, just remind them that they can &lt;em&gt;call you&lt;/em&gt; if there an urgent request. If they abuse this, straighten them out or it&amp;#8217;s time to re-evaluate your client roster.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s not unreasonable to protect &lt;em&gt;your&lt;/em&gt; time as much as possible, despite how much they pay you.&lt;/p&gt;


	&lt;h3&gt;Set a Time (use a calendar reminder)&lt;/h3&gt;


	&lt;p&gt;You can&amp;#8217;t just say, &amp;#8220;I&amp;#8217;m only going to check my email twice a day.&amp;#8221; There isn&amp;#8217;t any way that I would have been able to honor such a commitment. &amp;#8220;When exactly?,&amp;#8221; is the obvious response to that.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/busrx/planet-argon-calendar"&gt;&lt;img src="http://img.skitch.com/20090611-psyure4swk4mt833g1iunqqu8b.preview.jpg" alt="planet argon - Calendar" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;I set a scheduled event on my calendar that happens everyday at 10am and 4pm. I have a 15 minute notice on that event so that I&amp;#8217;m reminded that it&amp;#8217;s time to wrap up what I&amp;#8217;m working on. When I have a conflicting meeting, I will just reschedule my email for another time of the day. The time is visible to all of my teammates and my clients know when I&amp;#8217;ll be catching up on email.&lt;/p&gt;


	&lt;p&gt;Why did I chose 10am and 4pm? Well, I start my day at the studio at 7am. This allows me to have up to three hours of time to focus on getting other things done before tackling email. Why 4pm? This is a hour or so before I leave for the day. Email isn&amp;#8217;t the first or the last thing on my mind at each ends of my workday.&lt;/p&gt;


	&lt;h3&gt;Communicate the Change&lt;/h3&gt;


	&lt;p&gt;This will &lt;strong&gt;not work&lt;/strong&gt; if you don&amp;#8217;t set peoples expectations. If people are accustomed to you being extremely quick to respond to emails and you change your behavior all of a sudden, you&amp;#8217;re going to freak them out. Let them know what you&amp;#8217;re doing, why you&amp;#8217;re doing it, and you might even encourage them to consider it too. More often than not, everyone you work with is feeling overwhelmed and wants more control over their day. Send them a link to this post. ;-)&lt;/p&gt;


	&lt;p&gt;It all comes back to managing their expectations.&lt;/p&gt;


	&lt;h3&gt;Quit Your Email application&lt;/h3&gt;


	&lt;p&gt;Seriously, quit that application when you&amp;#8217;re not using it. In fact, quit any program that is open when it&amp;#8217;s not related to the activity that you&amp;#8217;re focused on. For email, we use Gmail for domains and I run it through Fluid. This means that at 10am and 4pm, I launch the Fluid app and start working my way through emails. Once I get through my inbox and finish what I need to handle right now, I quit it.&lt;/p&gt;


	&lt;p&gt;Also&amp;#8230; &lt;strong&gt;disable email notifications. They aren&amp;#8217;t worth it.&lt;/strong&gt;&lt;/p&gt;


	&lt;h3&gt;Inbox Zero&lt;/h3&gt;


	&lt;p&gt;I&amp;#8217;ve been practicing the habit of keeping my &lt;span class="caps"&gt;INBOX&lt;/span&gt; empty for nearly a year. Everything gets labelled, organized, and archived properly once I open up each email. Some stuff gets sent to Highrise to respond to later while some emails get an immediate response.&lt;/p&gt;


	&lt;p&gt;One of my favorite things about maintaining &lt;a href="http://www.43folders.com/izero"&gt;Inbox Zero&lt;/a&gt; and checking my email twice daily is that when I open up my email client, I&amp;#8217;m faced with a list of nothing but unread emails. Since I know they&amp;#8217;re all unread, I can start at the oldest and move my way through them, one by one. When I get to the end of that list, I&amp;#8217;m almost done. I then fire up Highrise to see if there is anybody to get back to today. If so, I fire off those emails and close off those tasks. Once I have both lists completed, I&amp;#8217;m done.&lt;/p&gt;


	&lt;h3&gt;No Cheating&lt;/h3&gt;


	&lt;p&gt;The one thing that I&amp;#8217;m working on the hardest right now is not cheating. I&amp;#8217;ve caught myself a few times. I&amp;#8217;m waiting in line at the coffee shop and I pull out my iPhone. Out of habit, I launch the Mail.app and find myself looking at incoming emails. You might argue that if you&amp;#8217;re not in the middle of something, it&amp;#8217;s a good way to feel useful, but I&amp;#8217;m sure that there are other things you can be tackling. Your email will be there at 10am&amp;#8230; I promise.&lt;/p&gt;


	&lt;p&gt;The biggest problem with cheating is that if you see that someone responded to something you sent in your previous email, it&amp;#8217;ll force you to make a decision. a) do you look now? or b) look later? If you choose &lt;strong&gt;b&lt;/strong&gt;, your brain is going to be wondering what she said. It&amp;#8217;s can really bug you for a few hours. Trust me. :-)&lt;/p&gt;


	&lt;h2&gt;In Summary..&lt;/h2&gt;


	&lt;p&gt;It&amp;#8217;s only been three weeks since I adopted this and I know it&amp;#8217;s far from perfect. However, I assure you&amp;#8230; it&amp;#8217;s been worth the self-proclaimed risks. I enjoy my email time more than I used to. As I mentioned earlier, I like being presented with a healthy list of unread emails to work my way through. Sometimes it takes only five minutes to get through them all, sometimes a hour or more if I have a lot of people to follow up with.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s been a fun ride so far and I&amp;#8217;m sure that there are many more challenges ahead, but I am planning to stay on course. Who knows, maybe I can move to once daily after a few months?&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a href="http://www.fourhourworkweek.com/blog/2007/03/22/how-to-check-e-mail-twice-a-day-or-once-every-10-days/"&gt;How to Check E-mail Twice a Day… or Once Every 10 Days&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=WtWhmVwtHCA:BQFcb_Phmx8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=WtWhmVwtHCA:BQFcb_Phmx8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=WtWhmVwtHCA:BQFcb_Phmx8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=WtWhmVwtHCA:BQFcb_Phmx8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=WtWhmVwtHCA:BQFcb_Phmx8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=WtWhmVwtHCA:BQFcb_Phmx8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=WtWhmVwtHCA:BQFcb_Phmx8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/WtWhmVwtHCA" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 10 Jun 2009 20:24:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f8103cd6-6df7-41f4-aa50-1d3231261a48</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/WtWhmVwtHCA/email-twice-daily-no-more-no-less</link>
      <category>Business</category>
      <category>gtd</category>
      <category>clients</category>
      <category>productivity</category>
      <category>time</category>
      <category>email</category>
      <category>management</category>
      <category>agile</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/10/email-twice-daily-no-more-no-less</feedburner:origLink></item>
    <item>
      <title>Estimating versus Timeboxing, part 1</title>
      <description>&lt;p&gt;As if delivering projects wasn&amp;#8217;t hard enough. Delivering projects &lt;em&gt;on time&lt;/em&gt; is even harder. As practitioners, we&amp;#8217;re all responsible for measuring up the obstacles in front of us and are accountable to those measurements. At least, we should be.&lt;/p&gt;


	&lt;p&gt;One of those measurements is &lt;strong&gt;time&lt;/strong&gt;. Time is a funny thing. People have a lot of &lt;a href="http://thinkexist.com/quotations/time"&gt;interesting things to say about time&lt;/a&gt;. Some say that it&amp;#8217;s one of the most valuable things that we have&amp;#8230; but I&amp;#8217;ll avoid diving into a philosophical discussion for now.&lt;/p&gt;


	&lt;p&gt;What I wanted to talk about was project estimation. Specifically, estimates for deliverables. For the past several years, our team has put a lot of effort into becoming more accurate in our time estimating skills. Despite analyzing how often we over and/or underestimate the time each of us believes it&amp;#8217;ll take to complete a task, we find ourselves coming back to the drawing board.&lt;/p&gt;


	&lt;p&gt;A few things that we&amp;#8217;ve learned.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Tasks that we believe will take a few days/week/more to complete are often underestimated&lt;/li&gt;
		&lt;li&gt;Tasks that we believe will take less than a few hours are often more accurate or overestimated&lt;/li&gt;
		&lt;li&gt;Too many tasks were completed with a bigger budget than was necessary (lower &lt;span class="caps"&gt;ROI&lt;/span&gt;)&lt;/li&gt;
		&lt;li&gt;A lot of time was spent working on requirements refining to get better estimates&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;When we began to step back from this and look for patterns, we found that several of the tasks that we would budget hours for (versus estimate hours for) were proving to be more accurate. This approach is most commonly known as &lt;a href="http://en.wikipedia.org/wiki/Time_boxing"&gt;timeboxing&lt;/a&gt;. With timeboxing, we can place a dollar value on a specific task and work within that constraint. For example, with our clients, both parties can come to the conclusion that, &amp;#8220;we believe that it&amp;#8217;s worth up to $800 to implement this new functionality.&amp;#8221; With that, we&amp;#8217;re able take that dollar amount and figure out how many hours to box ourselves within.&lt;/p&gt;


&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/54On0uLtdJc&amp;#38;hl=en&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/54On0uLtdJc&amp;#38;hl=en&amp;#38;fs=1&amp;#38;color1=0x5d1719&amp;#38;color2=0xcd311b" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;p&gt;The underlying question to our client with each change/feature request is, &lt;em&gt;&amp;#8220;How valuable is this to your business at this point in time?&amp;#8221;&lt;/em&gt; Whereas, with a typical approach to time estimates, a client comes to you with a list of changes/features and you provide them with time estimates. &amp;#8220;&lt;em&gt;We estimate that it&amp;#8217;ll take 6 hours at $200/hour for feature X and we&amp;#8217;d do it like this&amp;#8230;&amp;#8221;&lt;/em&gt; The client will have to evaluate your estimate and figure out if it&amp;#8217;s worth $1200 and make a decision. They can respond with, &amp;#8220;no, that&amp;#8217;s too expensive, can we do it for less?&amp;#8221; The following steps would entail your team trying to find ways to reduce your estimate.&lt;/p&gt;


	&lt;p&gt;While these two paths might seem very similar, it&amp;#8217;s been my experience that the standard approach to estimating takes more time for negotiating the terms of the agreement.&lt;/p&gt;


	&lt;p&gt;However, with timeboxing, you are asking your client to provide you with an initial budget. This will completely change how you respond to the feature request. When you have a timebox, from the moment that you begin to evaluate the request, your brain will add the necessary constraints to keep things within scope.&lt;/p&gt;


	&lt;p&gt;Through this process, we&amp;#8217;ve revamped our estimating process so that as we&amp;#8217;re building our iteration costs for clients. For each deliverable, we break down a series of objectives/tasks and apply timeboxes to each of those while knowing what the budget is for the deliverable as a whole. Usually, the deliverable is directly related to the request that came from our client with a budget. The process is completely transparent and our team is responsible for working within those constraints.&lt;/p&gt;


	&lt;p&gt;..and as we&amp;#8217;ve learned from Ruby on Rails, constraints can be extremely beneficial.&lt;/p&gt;


	&lt;p&gt;While I don&amp;#8217;t have all the answers yet, my goal is to share some of my experiences and lessons on the topic. I&amp;#8217;d love to hear about how you&amp;#8217;re adopting timeboxing in your project planning and estimating process.&lt;/p&gt;


	&lt;p&gt;Anyhow, just some thoughts that I wanted to share. More to come&amp;#8230;&lt;/p&gt;


	&lt;h3&gt;Read Related Articles&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2006/05/31/the-art-of-delivery-part-1"&gt;The Art of Delivery&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2008/05/22/the-art-of-delivery-part-2"&gt;The Art of Delivery, part 2&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=8pfyqPj_25E:yiSeNt5hB7Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=8pfyqPj_25E:yiSeNt5hB7Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=8pfyqPj_25E:yiSeNt5hB7Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=8pfyqPj_25E:yiSeNt5hB7Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=8pfyqPj_25E:yiSeNt5hB7Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=8pfyqPj_25E:yiSeNt5hB7Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=8pfyqPj_25E:yiSeNt5hB7Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/8pfyqPj_25E" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 10 Jun 2009 18:29:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:238587aa-e9fd-4c66-932e-4cff1de1f3e6</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/8pfyqPj_25E/estimating-versus-timeboxing-part-1</link>
      <category>Business</category>
      <category>d3</category>
      <category>PLANET ARGON</category>
      <category>agile</category>
      <category>timeboxing</category>
      <category>timebox</category>
      <category>planning</category>
      <category>projects</category>
      <category>clients</category>
      <category>estimates</category>
      <category>process</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/10/estimating-versus-timeboxing-part-1</feedburner:origLink></item>
    <item>
      <title>Hello, HeyBrainstormr.com</title>
      <description>&lt;p&gt;If you &lt;a href="http://twitter.com/robbyrussell"&gt;follow me on twitter&lt;/a&gt;, you might have heard that we launched a little project that we&amp;#8217;ve been cooking up at &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt;. (&lt;a href="http://planetargon.com/news/2009/6/2/heybrainstormr-launched"&gt;news post&lt;/a&gt;)&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://heybrainstormr.com"&gt;HeyBrainstormr&lt;/a&gt; is a lightweight web application that we created so that we could start a brainstorm on a specific topic and solicit ideas from each other. That&amp;#8217;s all it does. Nothing more. Nothing less.&lt;/p&gt;


	&lt;p&gt;We know that having an open brainstorming session requires there to be zero criticism and opted to keep the process anonymous so that even the quiet people could share their ideas. :-)&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/b12hi/what-can-i-do-right-now-brainstorming-for-the-rest-of-us-heybrainstormr"&gt;&lt;img src="http://img.skitch.com/20090603-njuf1rttuf7bgn8jna1fjihjeb.preview.jpg" alt="what can i do right now? : Brainstorming for the rest of us. : HeyBrainstormr" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;We&amp;#8217;ll be posting more details about it on our blog in the near future, but wanted to invite all of my readers to give it a whirl.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://heybrainstormr.com"&gt;Start a brainstorm now!&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I have a few topics that I started (and &lt;a href="http://twitter.com/robbyrussell"&gt;tweeted&lt;/a&gt; about). Feel free to share your ideas on them. :-)&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://heybrainstormr.com/t/oM4z"&gt;I need some music suggestions. Help?&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://heybrainstormr.com/t/vwC1"&gt;I have writers block. Help me come up with some blog topic ideas?&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://heybrainstormr.com/t/zmBu"&gt;what can i do right now?&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;We hope that you find it as fun as we have.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r0FYLowUFrY:GoOps9x9rNE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r0FYLowUFrY:GoOps9x9rNE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=r0FYLowUFrY:GoOps9x9rNE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r0FYLowUFrY:GoOps9x9rNE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r0FYLowUFrY:GoOps9x9rNE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=r0FYLowUFrY:GoOps9x9rNE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=r0FYLowUFrY:GoOps9x9rNE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/r0FYLowUFrY" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 03 Jun 2009 18:28:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e809a33f-b8fe-4520-a9e4-fb14d148eedb</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/r0FYLowUFrY/hello-heybrainstormr-com</link>
      <category>Ruby on Rails</category>
      <category>PLANET ARGON</category>
      <category>heybrainstormr</category>
      <category>brainstormr</category>
      <category>launch</category>
      <category>brainstorming</category>
      <category>agile</category>
      <category>design</category>
      <category>development</category>
      <category>planetargon</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/03/hello-heybrainstormr-com</feedburner:origLink></item>
    <item>
      <title>What can we do right now?</title>
      <description>&lt;p&gt;Last month I picked up a new kindle from Amazon and have been reading a handful of books. One book that I&amp;#8217;ve been really impressed with is &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&amp;#8217;s&lt;/a&gt; new book, &lt;a href="http://www.pragprog.com/titles/cfcar2/the-passionate-programmer"&gt;The Passionate Programmer&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/3527248122/" title="Passionate Programmer by Robby Russell, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3328/3527248122_cfa19885a1.jpg" width="375" height="500" alt="Passionate Programmer" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;I plan to post some more thoughts in upcoming articles, but wanted to share this gem.&lt;/p&gt;


&lt;blockquote&gt;
&amp;#8220;If you treat your projects like a race, you&amp;#8217;ll get to the end a lot faster than if you treat them like a prison cell. Create movement. Be the one who pushes. Don&amp;#8217;t get comfortable. Always be the one to ask, &amp;#8220;But what can we do right now?&amp;#8221;&amp;#8221; 

&lt;i&gt;- Chad Fowler, The Passionate Programmer&lt;/i&gt;
&lt;/blockquote&gt;

	&lt;p&gt;Sometimes we feel stuck, but that doesn&amp;#8217;t stop us from stepping to the side and assessing the situation. There is always something useful that &lt;a href="http://heybrainstormr.com/t/zmBu"&gt;we could be doing right now&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Yh6T5yaZo6c:kgO5DNKzuBg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Yh6T5yaZo6c:kgO5DNKzuBg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=Yh6T5yaZo6c:kgO5DNKzuBg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Yh6T5yaZo6c:kgO5DNKzuBg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Yh6T5yaZo6c:kgO5DNKzuBg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=Yh6T5yaZo6c:kgO5DNKzuBg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=Yh6T5yaZo6c:kgO5DNKzuBg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/Yh6T5yaZo6c" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 03 Jun 2009 18:12:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:976a942d-221e-4e1f-b4f2-e975a6f6b27f</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/Yh6T5yaZo6c/what-can-we-do-right-now</link>
      <category>Ruby</category>
      <category>Programming</category>
      <category>projects</category>
      <category>agile</category>
      <category>gtd</category>
      <category>team</category>
      <category>book</category>
      <category>programming</category>
      <category>inspiration</category>
      <category>motivation</category>
      <category>kindle</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/06/03/what-can-we-do-right-now</feedburner:origLink></item>
    <item>
      <title>82,520 minutes on Phusion Passenger</title>
      <description>&lt;p&gt;It&amp;#8217;s been over 83,520 minutes since I made the switch from using mongrel as my development environment web server to &lt;a href="http://www.modrails.com/"&gt;Phusion Passenger&lt;/a&gt;. I&amp;#8217;ve been extremely impressed with it. &lt;a href="http://planetargon.com/who-we-are"&gt;Our team&lt;/a&gt; has all switched over and haven&amp;#8217;t really hit any obstacles in the transition.&lt;/p&gt;


	&lt;p&gt;Since some people asked me to let them know how this trial period worked out, I felt it was my duty to encourage you all to try it. You can check out my previous post, &lt;a href="http://www.robbyonrails.com/articles/2009/02/11/switch-to-passenger-mod_rails-in-development-on-osx-in-less-than-7-minutes-or-your-money-back"&gt;Switch to Passenger (mod_rails) in development on &lt;span class="caps"&gt;OSX&lt;/span&gt; in less than 7 minutes or your money back!&lt;/a&gt; to get rolling.&lt;/p&gt;


	&lt;p&gt;Additionally, if you&amp;#8217;re looking for a streamlined Ruby on Rails deployment environment that includes Passenger, check out &lt;a href="http://railsboxcar.com"&gt;Rails Boxcar&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=GI3iRDpAccs:MNkL00LQ7y8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=GI3iRDpAccs:MNkL00LQ7y8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=GI3iRDpAccs:MNkL00LQ7y8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=GI3iRDpAccs:MNkL00LQ7y8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=GI3iRDpAccs:MNkL00LQ7y8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=GI3iRDpAccs:MNkL00LQ7y8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=GI3iRDpAccs:MNkL00LQ7y8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/GI3iRDpAccs" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 10 Apr 2009 05:10:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4b873084-0255-45dc-b0f2-d2849eb352a0</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/GI3iRDpAccs/82-520-minutes-on-phusion-passenger</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>passenger</category>
      <category>mongrel</category>
      <category>development</category>
      <category>osx</category>
      <category>rubyonrails</category>
      <category>rails</category>
      <category>railsboxcar</category>
      <category>hosting</category>
      <category>deployment</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/04/10/82-520-minutes-on-phusion-passenger</feedburner:origLink></item>
    <item>
      <title>20 articles on Cucumber and a free beverage recipe!</title>
      <description>&lt;p&gt;&lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; has been getting quite a bit of attention in the community and with the new &lt;a href="http://www.pragprog.com/titles/achbd/the-rspec-book"&gt;RSpec Book&lt;/a&gt; on nearing publication, I predict that by this time next year, it&amp;#8217;ll become a household word like &lt;a href="http://en.wiktionary.org/wiki/boanthropy"&gt;boanthropy&lt;/a&gt;.&lt;/p&gt;


	&lt;h2&gt;What is Cucumber?&lt;/h2&gt;


	&lt;p&gt;The Cucumber project describes itself as a suite that, &amp;#8220;&lt;em&gt;lets software development teams describe how software should behave in plain text. The text is written in a business-readable domain-specific language and serves as documentation, automated tests and development-aid &amp;#8211; all rolled into one format.&lt;/em&gt;&amp;#8220;&lt;/p&gt;


	&lt;p&gt;One of the great things about Cucumber is that it can be used to test applications in any language. I haven&amp;#8217;t been able to track down a lot of articles of how people are using it with other languages, so please comment if you&amp;#8217;re aware of some.&lt;/p&gt;


	&lt;p&gt;In any event, I&amp;#8217;ve been collecting and reading resources from a variety of Cucumber aficionados and thought I&amp;#8217;d share some links with you. To round it out, I &lt;a href="http://twitter.com/robbyrussell/status/1487899554"&gt;asked on twitter&lt;/a&gt; for some others so that I could hit twenty. :-)&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href="http://dannorth.net/whats-in-a-story"&gt;What’s in a Story?&lt;/a&gt;, Dan North&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.josephwilk.net/ruby/telling-a-good-story-rspec-stories-from-the-trenches.html"&gt;Telling a good story &amp;#8211; Rspec stories from the trenches&lt;/a&gt;, Joseph Wilk&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://railscasts.com/episodes/155-beginning-with-cucumber"&gt;Beginning with Cucumber&lt;/a&gt;, Ryan Bates (Railscasts)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.brightbox.co.uk/posts/using-rspec-cucumber-and-user-stories-to-build-our-internal-systems"&gt;Using RSpec, Cucumber and User stories to build our internal systems&lt;/a&gt;, Rahoul Baruah&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.rubyinside.com/cucumber-the-latest-in-ruby-testing-1342.html"&gt;Cucumber: The Latest in Ruby Testing&lt;/a&gt;, Ruby Inside&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.pathf.com/blogs/2009/03/using-cucumber-for-acceptance-testing/"&gt;Using Cucumber for Acceptance Testing&lt;/a&gt;, Noel Rappin&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.slideshare.net/bkeepers/behavior-driven-development-with-cucumber-presentation"&gt;Behavior Driven Development with Cucumber&lt;/a&gt;, Brandon Keepers (presentation/slides)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://pivotallabs.com/users/jdean/blog/articles/763-testing-capistrano-recipes-with-cucumber"&gt;Testing capistrano recipes with cucumber&lt;/a&gt;, Jeff Dean&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.benmabey.com/2009/02/17/using-cucumber-to-integrate-distributed-systems-and-test-messaging/"&gt;Using Cucumber to Integrate Distributed Systems and Test Messaging&lt;/a&gt;, Ben Mabey&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.pmamediagroup.com/2009/04/tutorial-how-to-install-setup-cucumber/"&gt;Tutorial: How to install/setup Cucumber&lt;/a&gt;, Alan Mitchell&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://drnicwilliams.com/2009/03/26/testing-outbound-emails-with-cucumber/"&gt;Testing outbound emails with Cucumber&lt;/a&gt;, Dr. Nic Willians&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://japhr.blogspot.com/2009/03/proper-cucumber-sintatra-driving.html"&gt;Proper Cucumber Sintatra Driving&lt;/a&gt;, Chris Strom&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://thomaslundstrom.blogspot.com/2009/03/on-getting-started-with-using-cucumber.html"&gt;On getting started using Cucumber for .NET&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.mattwynne.net/2008/11/14/dry-up-your-cucumber-steps/"&gt;&lt;span class="caps"&gt;DRY&lt;/span&gt; up your Cucumber Steps&lt;/a&gt;, Matt Wynne&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://skillsmatter.com/podcast/ajax-ria/cucumber-celerity-firewatir"&gt;Cucumber, Celerity, &amp;#38; FireWatir&lt;/a&gt;, Aidy Lewis (presentation/video)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.brynary.com/2009/2/3/cucumber-step-definition-tip-stubbing-time"&gt;Cucumber step definition tip: Stubbing time&lt;/a&gt;, Bryan Helmkamp&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.infoq.com/news/2009/03/bdd-with-cucumber"&gt;Story Driven Development Recipes with Cucumber&lt;/a&gt;, Sebastien Auvray&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://opensoul.org/2009/3/6/testing-facebook-with-cucumber"&gt;Testing Facebook with Cucumber&lt;/a&gt;, Brandon Keepers&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://itsignals.cascadia.com.au/?p=30"&gt;Testing with the help of machinist, forgery, cucumber, webrat and rspec&lt;/a&gt;, Etienne van Tonder&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://devcaffeine.com/2009/02/16/integration-testing-ssl-with-cucumber/"&gt;Integration testing &lt;span class="caps"&gt;SSL&lt;/span&gt; with Cucumber&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://devcaffeine.com/2009/02/16/integration-testing-ssl-with-cucumber/"&gt;Continuous Integration Blueprints: How to Build an Army of Killer Robots With Hudson and Cucumber&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;So.. there you have it. Please post comments with links to any useful articles not mentioned and I&amp;#8217;ll try to keep the list updated.&lt;/p&gt;


	&lt;p&gt;Also, be sure to check out the &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/tutorials-and-related-blog-posts"&gt;list of tutorials and related blog posts&lt;/a&gt; on the &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/"&gt;cucumber wiki&lt;/a&gt; (github).&lt;/p&gt;


	&lt;h2&gt;&lt;span class="caps"&gt;FREE RECIPE&lt;/span&gt;: Cucumber Water&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://robbyonrails.com/files/3225964781_428d359aa5_m.jpg" style="float:right;" /&gt;
And now&amp;#8230;for the reason you are all here! If you like cucumbers (eating them)... I would highly recommend heading to your local farmers market and purchasing some cucumbers. Aside from being healthy to eat&amp;#8230; they can help make a tasty beverage.&lt;/p&gt;


	&lt;p&gt;Then do the following&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Chop several slices of a cucumber&lt;/li&gt;
		&lt;li&gt;Fill a pitcher with cold water and ice&lt;/li&gt;
		&lt;li&gt;Toss in slices of cucumber&lt;/li&gt;
		&lt;li&gt;Stir and leave in fridge for a while&lt;/li&gt;
		&lt;li&gt;Take out of fridge, pour into cup&amp;#8230;&lt;/li&gt;
		&lt;li&gt;Drink&amp;#8230; hack&amp;#8230; and enjoy&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Be sure to check out, &lt;a href="http://www.wikihow.com/Make-Cucumber-Water"&gt;How to Make Cucumber Water&lt;/a&gt; on wikihow for details.&lt;/p&gt;


	&lt;p&gt;Happy Hacking!&lt;/p&gt;


	&lt;h2&gt;Related Posts (by me)&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2008/08/19/rspec-it-should-behave-like"&gt;RSpec: It Should Behave Like&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/08/02/spec-your-views"&gt;Spec Your Views&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/06/17/audit-your-rails-development-team"&gt;Audit Your Rails Development Team&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/02/08/is-bdd-kinkier-than-tdd"&gt;Is &lt;span class="caps"&gt;BDD&lt;/span&gt; kinkier than &lt;span class="caps"&gt;TDD&lt;/span&gt;?&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=61LG2Dxw24Y:g9VLLyEu-fI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=61LG2Dxw24Y:g9VLLyEu-fI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=61LG2Dxw24Y:g9VLLyEu-fI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=61LG2Dxw24Y:g9VLLyEu-fI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=61LG2Dxw24Y:g9VLLyEu-fI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=61LG2Dxw24Y:g9VLLyEu-fI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=61LG2Dxw24Y:g9VLLyEu-fI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/61LG2Dxw24Y" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 09 Apr 2009 22:22:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:18dfd567-2034-43c7-bf69-54f37498669b</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/61LG2Dxw24Y/20-articles-on-cucumber-and-a-free-beverage-recipe</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>rspec</category>
      <category>cucumber</category>
      <category>testing</category>
      <category>tdd</category>
      <category>bdd</category>
      <category>links</category>
      <category>recipe</category>
      <category>water</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/04/09/20-articles-on-cucumber-and-a-free-beverage-recipe</feedburner:origLink></item>
    <item>
      <title>Building a prototype? Bring some rope.</title>
      <description>&lt;p&gt;While scanning through Allison&amp;#8217;s copy of &lt;a href="http://www.amazon.com/gp/product/0470229101?ie=UTF8&amp;#38;tag=robonrai-20&amp;#38;linkCode=as2&amp;#38;camp=1789&amp;#38;creative=390957&amp;#38;creativeASIN=0470229101"&gt;Designing for the Digital Age: How to Create Human-Centered Products and Services&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=robonrai-20&amp;#38;l=as2&amp;#38;o=1&amp;#38;a=0470229101" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, I came across this nugget.&lt;/p&gt;


&lt;blockquote lang="english"&gt;

	&lt;p&gt;&lt;strong&gt;The problem with software prototypes&lt;/strong&gt;&lt;/p&gt;


It seems to be widely understood that industrial design and mechanical engineering prototypes&amp;mdash;from paperclips and tape to polished appearance models&amp;mdash;are disposable learning tools. Prototyping is clearly distinct from manufacturing, so it would be ludicrous to think that even a late-stage prototype could be reused as part of the final product. In software, however, the tools used for anything other than paper prototyping are generally the same tools used for &amp;#8220;manufacturing&amp;#8221; (i.e., writing production code). For this reason, many stakeholders can&amp;#8217;t see why a detailed prototype that appears functional is still many months away from completion. 
&lt;/blockquote&gt;

	&lt;p&gt;It immediately reminded me of a &lt;a href="http://www.robbyonrails.com/articles/2006/06/07/prototypes-are-your-friends"&gt;few&lt;/a&gt; &lt;a href="http://www.robbyonrails.com/articles/2006/03/11/keeping-prototypes-is-a-bad-idea"&gt;posts&lt;/a&gt; that I had written about three years ago on the topic of developing prototypes &lt;em&gt;and &lt;span class="caps"&gt;NOT&lt;/span&gt; keeping them&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;The author continues with&amp;#8230;&lt;/p&gt;


&lt;blockquote&gt;
It&amp;#8217;s important to educate stakeholders that prototype code is kind of like the illusion of automatic doors on Star Trek&amp;mdash;it looks like it&amp;#8217;s working, but it&amp;#8217;s really a guy standing behind the wall pulling a rope.
&lt;/blockquote&gt;

	&lt;p&gt;I completely agree that &lt;em&gt;education&lt;/em&gt; is the most important aspect to managing client expectations. With regard to the amount of work that you put into a prototype, we need to be careful on how much time and energy is put into them. If we can get away with a guy (or some quick Javascript hacks) to demonstrate possible functionality, make sure we aren&amp;#8217;t using much more than rope. &lt;strong&gt;Rope is cheap. Prototypes should be too.&lt;/strong&gt;&lt;/p&gt;


	&lt;h2&gt;Related Posts&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2006/06/07/prototypes-are-your-friends"&gt;Prototypes Are Your Friends&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2006/03/11/keeping-prototypes-is-a-bad-idea"&gt;Keeping Prototypes is a Bad Idea&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2006/09/25/matz-on-considering-interface"&gt;Matz on Considering Interface&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=v8U5YhPQDcg:TVrvMwoOOwE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=v8U5YhPQDcg:TVrvMwoOOwE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=v8U5YhPQDcg:TVrvMwoOOwE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=v8U5YhPQDcg:TVrvMwoOOwE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=v8U5YhPQDcg:TVrvMwoOOwE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=v8U5YhPQDcg:TVrvMwoOOwE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=v8U5YhPQDcg:TVrvMwoOOwE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/v8U5YhPQDcg" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 09 Apr 2009 15:57:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:58d7182b-0e87-45e3-b9cc-904109585d6f</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/v8U5YhPQDcg/building-a-prototype-bring-some-rope</link>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>programming</category>
      <category>agile</category>
      <category>prototypes</category>
      <category>books</category>
      <category>quote</category>
      <category>development</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/04/09/building-a-prototype-bring-some-rope</feedburner:origLink></item>
    <item>
      <title>HTTParty goes foreign</title>
      <description>&lt;p&gt;Just a quick post to get share something I was tinkering with this evening.&lt;/p&gt;


	&lt;p&gt;I came across &lt;a href="http://rubybook.ca/2009/03/03/google-translation-api-with-ruby/"&gt;this post by Gerald Bauer&lt;/a&gt;, which shows you how to use the &lt;a href="http://code.google.com/apis/ajaxlanguage/documentation/reference.html"&gt;Google Translation &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; with Ruby via Net::HTTP. I thought I&amp;#8217;d play with the service with &lt;a href="http://httparty.rubyforge.org/"&gt;HTTParty&lt;/a&gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;GoogleApi&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;HTTParty&lt;/span&gt;
  &lt;span class="ident"&gt;base_uri&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;ajax.googleapis.com&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.translate&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;string&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;to&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;from&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;en&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;get&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/ajax/services/language/translate&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:query&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:langpair&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{from}&lt;/span&gt;|&lt;span class="expr"&gt;#{to}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:q&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;string&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:v&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1.0&lt;/span&gt;&lt;span class="punct"&gt;})&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;A few examples from playing with it.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;GoogleApi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;translate&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;bonjour&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;en&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fr&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseData&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: {&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;translatedText&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;hello&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;}, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseDetails&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: null, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseStatus&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: 200}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;GoogleApi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;translate&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Red wine&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fr&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseData&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: {&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;translatedText&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;Vin rouge&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;,&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;detectedSourceLanguage&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;en&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;}, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseDetails&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: null, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseStatus&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: 200}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;GoogleApi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;translate&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Where is the bathroom?&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;es&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseData&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: {&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;translatedText&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;\302\277&lt;/span&gt;D&lt;span class="escape"&gt;\303\263&lt;/span&gt;nde est&lt;span class="escape"&gt;\303\241&lt;/span&gt; el ba&lt;span class="escape"&gt;\303\261&lt;/span&gt;o?&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;,&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;detectedSourceLanguage&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;en&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;}, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseDetails&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: null, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseStatus&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: 200}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;GoogleApi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;translate&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Good morning&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;it&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseData&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: {&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;translatedText&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;Buon giorno&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;,&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;detectedSourceLanguage&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;en&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;}, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseDetails&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: null, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseStatus&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: 200}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;What a &lt;em&gt;party&lt;/em&gt;!&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;GoogleApi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;translate&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;party&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;it&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseData&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: {&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;translatedText&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;festa&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;,&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;detectedSourceLanguage&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;en&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;}, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseDetails&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: null, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseStatus&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: 200}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;GoogleApi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;translate&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;party&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;es&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseData&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: {&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;translatedText&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;fiesta&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;,&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;detectedSourceLanguage&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;:&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;en&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;}, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseDetails&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: null, &lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;responseStatus&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;: 200}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Look how easy that was. :-)&lt;/p&gt;


	&lt;p&gt;For a previous post on using this gem, read &lt;a href="http://www.robbyonrails.com/articles/2008/11/26/the-httparty-has-just-begun"&gt;The HTTParty has just begun&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_edOKrdhutQ:4SkKwDLpVYA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_edOKrdhutQ:4SkKwDLpVYA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=_edOKrdhutQ:4SkKwDLpVYA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_edOKrdhutQ:4SkKwDLpVYA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_edOKrdhutQ:4SkKwDLpVYA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=_edOKrdhutQ:4SkKwDLpVYA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=_edOKrdhutQ:4SkKwDLpVYA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/_edOKrdhutQ" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 16 Mar 2009 02:05:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:bdfa14b0-de4c-4292-b274-c86d80af7e60</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/_edOKrdhutQ/httparty-goes-foreign</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>google</category>
      <category>translation</category>
      <category>api</category>
      <category>httparty</category>
      <category>http</category>
      <category>REST</category>
      <category>language</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/03/16/httparty-goes-foreign</feedburner:origLink></item>
    <item>
      <title>The Rails Hosting Survey 2009 Survey results are in!</title>
      <description>&lt;p&gt;&lt;a href="http://rails-hosting.com"&gt;&lt;img src="http://planetargon.com/images/img_rails_hosting_survey.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;We recently &lt;a href="http://www.robbyonrails.com/articles/2009/01/13/take-the-ruby-on-rails-hosting-in-2009-survey"&gt;announced a survey&lt;/a&gt; that touched on topics related to the deployment and hosting of Ruby on Rails applications. We promised to share the results with the community and have made this information available at &lt;a href="http://rails-hosting.com"&gt;http://rails-hosting.com&lt;/a&gt;. You can download the results in &lt;span class="caps"&gt;CSV&lt;/span&gt;, PDF, and view them in &lt;span class="caps"&gt;HTML&lt;/span&gt; &lt;a href="http://rails-hosting.com"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Thanks again to everyone who helped us execute this survey!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1zFx3_5zpwQ:RKO8rOTLLZo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1zFx3_5zpwQ:RKO8rOTLLZo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=1zFx3_5zpwQ:RKO8rOTLLZo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1zFx3_5zpwQ:RKO8rOTLLZo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1zFx3_5zpwQ:RKO8rOTLLZo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RobbyOnRails?a=1zFx3_5zpwQ:RKO8rOTLLZo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RobbyOnRails?i=1zFx3_5zpwQ:RKO8rOTLLZo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/1zFx3_5zpwQ" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 11 Mar 2009 13:27:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1f517f02-8b33-49dd-ab19-187384a543fb</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/1zFx3_5zpwQ/the-rails-hosting-survey-2009-survey-results-are-in</link>
      <category>Ruby on Rails</category>
      <category>hosting</category>
      <category>rails</category>
      <category>rubyonrails</category>
      <category>survey</category>
      <category>community</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/03/11/the-rails-hosting-survey-2009-survey-results-are-in</feedburner:origLink></item>
    <item>
      <title>Git commit-msg for Lighthouse tickets</title>
      <description>&lt;p&gt;A quick follow-up to a post from a few months ago on how our team has a naming convention for git branches when we&amp;#8217;re working on Lighthouse tickets (&lt;a href="http://www.robbyonrails.com/articles/2008/12/11/lighthouse-tickets-and-git-branching"&gt;read previous post&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve just put together a quick git hook for &lt;code&gt;commit-msg&lt;/code&gt;, which will automatically amend the commit message with the current ticket number when you&amp;#8217;re following the branch naming conventions described &lt;a href="http://www.robbyonrails.com/articles/2008/12/11/lighthouse-tickets-and-git-branching"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Just toss this &lt;a href="http://gist.github.com/65330"&gt;gist&lt;/a&gt; into &lt;code&gt;.git/hooks/commit-msg&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  #!/bin/sh

  #
  # Will append the current Lighthouse ticket number to the commit message automatically
  # when you use the LH_* branch naming convention.
  #
  # Drop into .git/hooks/commit-msg
  # chmod +x .git/hooks/commit-msg

  exec &amp;lt; /dev/tty

  commit_message=$1
  ref=$(git symbolic-ref HEAD 2&amp;gt; /dev/null) || return
  branch=${ref#refs/heads/}

  if [[ $branch =~ LH_(.*) ]]
  then
  lighthouse_ticket=${BASH_REMATCH[1]}

    echo "What is the state of ticket #${lighthouse_ticket}? " 
    echo "(o)pen " 
    echo "(h)old" 
    echo "(r)esolved" 
    echo "Enter the current state for #${lighthouse_ticket}: (o)" 

    state="open" 

    read state_selection

    case $state_selection in
      "o" )
        state="open" 
        ;;
      "h" )
        state="hold" 
        ;;
      "r" )
        state="resolved" 
        ;;
    esac
  echo &amp;gt;&amp;#38;2 "[#${lighthouse_ticket} state:${state}]" &amp;gt;&amp;gt; "$1" 
    exit 0
  fi
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Then a quick example of how this works&amp;#8230;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  ➜  bin git:(LH_9912 ♻ ) git ci -m "another test" 
  What is the state of this ticket? 
  (o)pen 
  (h)old
  (r)esolved
  Enter the current state: (o)
  h
  Created commit 1ed2713: another test
   1 files changed, 3 insertions(+), 1 deletions(-)
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Now to see this in action&amp;#8230; (screenshot)&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/brh2m/git-message-hook"&gt;&lt;img src="http://img.skitch.com/20090216-rerecdmycjpu7brfppgmmbt8tx.preview.jpg" alt="git message hook" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;Then we&amp;#8217;ll check out the git log really quick.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
➜  bin git:(LH_9912) git log
commit 1ed271323c4a054fe56e76bddc9ac81d241a1032
Author: Robby Russell &amp;lt;robby@planetargon.com&amp;gt;
Date:   Mon Feb 16 12:06:33 2009 -0800

    another test
    [#9912 state:hold]
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Thanks to &lt;a href="http://andy.delcambre.com/"&gt;Andy&lt;/a&gt; for helping me figure out how to read user input during a git hook.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RobbyOnRails?a=Q65nxq84"&gt;&lt;img src="http://feeds.feedburner.com/~f/RobbyOnRails?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RobbyOnRails?a=frtOgMD6"&gt;&lt;img src="http://feeds.feedburner.com/~f/RobbyOnRails?i=frtOgMD6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RobbyOnRails?a=iVXSyvOi"&gt;&lt;img src="http://feeds.feedburner.com/~f/RobbyOnRails?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RobbyOnRails?a=SuYmuPGG"&gt;&lt;img src="http://feeds.feedburner.com/~f/RobbyOnRails?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RobbyOnRails?a=OCkpkUOS"&gt;&lt;img src="http://feeds.feedburner.com/~f/RobbyOnRails?i=OCkpkUOS" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RobbyOnRails/~4/9jO4D3RYLUA" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 16 Feb 2009 13:51:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:def4745b-9f02-4b00-a6f9-597777fb3aad</guid>
      <author>Robby Russell</author>
      <link>http://feedproxy.google.com/~r/RobbyOnRails/~3/9jO4D3RYLUA/git-commit-msg-for-lighthouse-tickets</link>
      <category>Programming</category>
      <category>git</category>
      <category>lighthouse</category>
      <category>github</category>
      <category>workflow</category>
      <category>bash</category>
    <feedburner:origLink>http://www.robbyonrails.com/articles/2009/02/16/git-commit-msg-for-lighthouse-tickets</feedburner:origLink></item>
  </channel>
</rss>
