<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Robby on Rails: Category Programming</title>
    <link>http://www.robbyonrails.com/articles/category/programming</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>thoughts.sort_by{|t| t[:topic]}.collect </description>
    <item>
      <title>Google Chrome: discuss</title>
      <description>&lt;p&gt;I&amp;#8217;m sure that most of you heard the news that Google is releasing a &lt;a href="http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html"&gt;new web browser named Chrome&lt;/a&gt;. Their &lt;a href="http://books.google.com/books?id=8UsqHohwwVYC&amp;#38;printsec=frontcover"&gt;comic for the announcement&lt;/a&gt; was very refreshing and entertaining read. Granted&amp;#8230; nobody that I know has seen it (as of today)...&lt;/p&gt;


	&lt;p&gt;For me, I&amp;#8217;m really interested in seeing what they&amp;#8217;ve done to &lt;em&gt;hopefully&lt;/em&gt; improve some of the short-comings of the user experience through their interaction design process. For example, tabs containing their own url/search fields sounds refreshing (I really dislike the hierarchy currently). Also, I&amp;#8217;m really looking forward to their dashboard-like default page.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/w49a/google-chrome-google-book-search"&gt;&lt;img src="http://img.skitch.com/20080902-8qdks9kdwcdtdq6f48sjrcsyi9.preview.jpg" alt="Google Chrome - Google Book Search" /&gt;&lt;/a&gt;&lt;/div&gt;

	&lt;p&gt;From a web development standpoint, it definitely raises questions about what we&amp;#8217;ll be able to do in the coming year(s).&lt;/p&gt;


	&lt;p&gt;What are your initial thoughts on this? &lt;strong&gt;Discuss&amp;#8230;&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Gary came across this amusing quote from a response by a representative at Microsoft.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;The browser landscape is highly competitive, but people will choose Internet Explorer 8 for the way it puts the services they want right at their fingertips &amp;#8230; and, more than any other browsing technology, puts them in control of their personal data on-line,&amp;#8221; Hachamovitch said. (&lt;a href="http://www.cnn.com/2008/TECH/09/01/google.browser.ap/index.html?iref=mpstoryview"&gt;read article on &lt;span class="caps"&gt;CNN&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;I&amp;#8217;m really not sure what that even means. Don&amp;#8217;t we already have our online services &lt;em&gt;at our fingertips&lt;/em&gt;? I suspect &lt;span class="caps"&gt;CNN&lt;/span&gt; interviewed the wrong person.. because this person said nothing.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Update #2:&lt;/strong&gt; Only a PC version available&amp;#8230; &lt;span class="caps"&gt;OSX&lt;/span&gt; / Linux are in development. Oh well&amp;#8230;&lt;/p&gt;
</description>
      <pubDate>Mon, 01 Sep 2008 21:40:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:fb75fbfe-4684-4915-8c01-047834e6cb23</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/09/01/google-chrome-discuss</link>
      <category>Programming</category>
      <category>web</category>
      <category>browsers</category>
      <category>google</category>
      <category>chrome</category>
      <category>design</category>
      <category>interaction</category>
      <category>internet</category>
    </item>
    <item>
      <title>The new RubyURL API</title>
      <description>&lt;p&gt;We&amp;#8217;ve just deployed the initial version of an &lt;a href="http://rubyurl.com/api"&gt;&lt;span class="caps"&gt;API&lt;/span&gt; for RubyURL&lt;/a&gt;. It makes it really easy to create RubyURLs and is now open to the public. Should it end up being abused, we&amp;#8217;ll consider introducing an &lt;span class="caps"&gt;API KEY&lt;/span&gt; for authenticating and tracking abuse.&lt;/p&gt;


	&lt;p&gt;In the meantime, you can now start to use the RubyURL &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;For example, the following&amp;#8230;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
$ curl  -i \ 
        -X POST \
        -H 'Content-Type: application/xml' \
        -d '&amp;lt;link&amp;gt;&amp;lt;website_url&amp;gt;http://github.com/robbyrussell&amp;lt;/website_url&amp;gt;&amp;lt;/link&amp;gt;' \
        http://rubyurl.com/api/links  
&lt;/code&lt;/pre&gt;

	&lt;p&gt;...would return the following response.&lt;/p&gt;


&lt;script src="http://gist.github.com/8207.js"&gt;&lt;/script&gt;

	&lt;p&gt;I&amp;#8217;ll be updating the &lt;a href="http://github.com/robbyrussell/shorturl/tree/master"&gt;ShortURL gem&lt;/a&gt; in the coming days (unless someone else wants to patch it first &lt;strong&gt;wink&lt;/strong&gt;) to take advantage of new &lt;span class="caps"&gt;API&lt;/span&gt;, versus how it&amp;#8217;s currently creating RubyURLs.&lt;/p&gt;


	&lt;p&gt;You can see the code &amp;amp; changes for this new &lt;span class="caps"&gt;API&lt;/span&gt; on the &lt;a href="http://github.com/robbyrussell/rubyurl/commits/master"&gt;RubyURL github site&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Update with &lt;span class="caps"&gt;JSON&lt;/span&gt;&lt;/h3&gt;


	&lt;p&gt;I took a little time today to update the &lt;span class="caps"&gt;API&lt;/span&gt; and extend it to support &lt;span class="caps"&gt;JSON&lt;/span&gt;. So&amp;#8230; you can now use the RubyURL &lt;span class="caps"&gt;API&lt;/span&gt; to generate RubyURLs via &lt;span class="caps"&gt;JSON&lt;/span&gt;. (see &lt;a href="http://github.com/robbyrussell/rubyurl/commit/36bcd0716a0a86fdaaf352d7760653b886877f2e"&gt;commits&lt;/a&gt;)&lt;/p&gt;


&lt;script src="http://gist.github.com/8363.js"&gt;&lt;/script&gt;

	&lt;p&gt;Enjoy! If you&amp;#8217;re using RubyURL via the new &lt;span class="caps"&gt;API&lt;/span&gt;, I&amp;#8217;d love to hear about it. :-)&lt;/p&gt;
</description>
      <pubDate>Sun, 31 Aug 2008 13:55:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f47bfa0b-c16e-4e8c-ba67-1a220f158d08</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/08/31/the-new-rubyurl-api</link>
      <category>RubyURL</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>api</category>
      <category>REST</category>
      <category>xml</category>
      <category>rubyurl</category>
      <category>development</category>
    </item>
    <item>
      <title>Flash Message Conductor</title>
      <description>&lt;p&gt;Do you find yourself copying and pasting the same code from Rails application-to-application as new projects start? Our team has a handful of projects in development right now and we notice that some of these &lt;em&gt;reusable&lt;/em&gt; components tend to get out of sync when we bounce between projects. So, we&amp;#8217;re making an effort to spot these and are creating a handful of plugins so that we can keep them updated between projects. (I&amp;#8217;m sure that a lot of you do this as well)&lt;/p&gt;


	&lt;p&gt;In an effort to share some of our patterns, we&amp;#8217;ll try to release them into the wild for others to use and perhaps if you have better patterns to offer, we&amp;#8217;re always interested in improving our approach.&lt;/p&gt;


	&lt;h2&gt;Introducing Flash Message Conductor&lt;/h2&gt;


	&lt;p&gt;Over the years, our designers and developers have approached the management of flash messages several different ways. In Rails, the default way to add something to a flash message is to do something like this in your controller.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&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;You have successfully signed in to your account.&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 we began doing a while back is to create a few controller helper methods:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;add_message&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;You have successfully signed in to your account.&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;add_notice&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;You've Got Mail!&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;add_error&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;Oops! Something got fucked up!&lt;/span&gt;&lt;span class="punct"&gt;&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;Really, nothing too crazy here, just a pattern that our developers have preferred to managing our application&amp;#8217;s flash messages.&lt;/p&gt;


	&lt;p&gt;Okay, so now for the part of the puzzle that we aimed to make consistent across our projects. Rendering flash messages would usually result in several lines of conditionals in our application layout to check if the flash had any values assigned to it. As we worked with our &lt;span class="caps"&gt;HTML&lt;/span&gt;/CSS designers to define a consistent pattern, we moved our code into a helper for rendering flash messages.&lt;/p&gt;


	&lt;p&gt;With Flash Message Conductor, we just need to pop in the following into our application layout.&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="string"&gt; render_flash_messages %&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;If we had called &lt;code&gt;add_message&lt;/code&gt;, it&amp;#8217;d render the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;div&lt;/span&gt; &lt;span class="attribute"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;flash_messages&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;p&lt;/span&gt; &lt;span class="attribute"&gt;class&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;message&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;You have successfully done XYZ...&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;p&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="tag"&gt;div&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Or, should you have called &lt;code&gt;add_error&lt;/code&gt;, it&amp;#8217;d render the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;div&lt;/span&gt; &lt;span class="attribute"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;flash_messages&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;p&lt;/span&gt; &lt;span class="attribute"&gt;class&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;error&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;Oops! Something went bonkers!&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;p&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="tag"&gt;div&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;What we&amp;#8217;ve done here is defined a consistent pattern for our designers and developers to follow. We&amp;#8217;ll always have a &lt;code&gt;div&lt;/code&gt; container that will use a &lt;code&gt;p&lt;/code&gt; tag to display the flash messages with a &lt;span class="caps"&gt;CSS&lt;/span&gt; class value that maps to the type of flash message that we&amp;#8217;re displaying. This makes it easier for us to reuse the same flash message styling (and tweak if necessary), but we know that it&amp;#8217;ll produce the same &lt;span class="caps"&gt;HTML&lt;/span&gt; across our applications.&lt;/p&gt;


	&lt;h3&gt;Installing Flash Message Conductor&lt;/h3&gt;


	&lt;p&gt;Like most &lt;em&gt;modern&lt;/em&gt; Rails applications, you can install with:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
script/plugin install git://github.com/planetargon/flash-message-conductor.git
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Then all of our helper methods will be available to your application. We&amp;#8217;ve also included an example &lt;span class="caps"&gt;CSS&lt;/span&gt; file, which you&amp;#8217;ll find in the plugin directory.&lt;/p&gt;


	&lt;p&gt;Sample output:&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/wuef/flash-message-area"&gt;&lt;img src="http://img.skitch.com/20080830-n8k8ikkk3i8himuxhk7pbf8tg3.preview.jpg" alt="flash message area" /&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;Anyhow, we&amp;#8217;ve posted the plugin up on GitHub for you all to use, if you&amp;#8217;d like to adopt a similar approach. If you have any alternative patterns that has helped your team, do share and I&amp;#8217;m looking forward to sharing some more of ours in the near future.&lt;/p&gt;


	&lt;p&gt;For more information, visit the &lt;a href="http://github.com/planetargon/flash-message-conductor"&gt;Flash Message Conductor plugin&lt;/a&gt; on GitHub.&lt;/p&gt;


	&lt;p&gt;If anything, hopefully this will inspire those of you who find yourself copying/pasting artifacts from application-to-application to extract that code into it&amp;#8217;s own reusable plugin. :-)&lt;/p&gt;
</description>
      <pubDate>Fri, 29 Aug 2008 16:35:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:95e800a7-f1a5-429b-94be-aed635f73036</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/08/29/flash-message-conductor</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>patterns</category>
      <category>pattern</category>
      <category>rubyonrails</category>
      <category>rails</category>
      <category>development</category>
      <category>html</category>
      <category>css</category>
      <category>team</category>
      <category>planetargon</category>
    </item>
    <item>
      <title>RSpec: It Should Behave Like</title>
      <description>&lt;p&gt;I was going through an older project of ours and cleaning up some specs and noticed how often we were doing the same thing in several places. When we started the project, we didn&amp;#8217;t get the benefits of shared groups. Now that we have some time to go through and update some of our older specs, I&amp;#8217;ve been trying to take advantage of the features currently available in &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;. One feature that I haven&amp;#8217;t seen a lot of mention of by people is shared groups, so I thought I&amp;#8217;d take a few minutes to write up a quick intro to using it.&lt;/p&gt;


	&lt;p&gt;To pick some low-hanging fruit, let&amp;#8217;s take an all-too-familiar method, which you might be familiar with&amp;#8230; &lt;code&gt;login_required&lt;/code&gt;. Sound familiar? Have you found yourself &lt;em&gt;stubbing&lt;/em&gt; &lt;code&gt;login_required&lt;/code&gt; over and over throughout your specs?&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="constant"&gt;Admin&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;DohickiesController&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;

  &lt;span class="ident"&gt;before&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:each&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stub!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:login_required&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="constant"&gt;Dohicky&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should_receive&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:paginate&lt;/span&gt; &lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;and_return&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="constant"&gt;Array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;get&lt;/span&gt; &lt;span class="symbol"&gt;:index&lt;/span&gt;
  &lt;span class="keyword"&gt;end&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;If you&amp;#8217;re requiring that a user should be logged in when interacting with most of the application (as in the case of an administration section/namespace), you might want to consolidate some of your work into one shared specification group. The basic premise behind this is that you can write a typical &lt;code&gt;describe&lt;/code&gt; block and load it into any other spec groups that you need. For example, in our case, we&amp;#8217;ll need to stub &lt;code&gt;login_required&lt;/code&gt; in several places. We can set this up in one shared group and reference it wherever necessary.&lt;/p&gt;


	&lt;p&gt;For example, here is what we&amp;#8217;ll start off with.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;an admin user is signed in&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;before&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:each&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stub!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:login_required&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="ident"&gt;describe&lt;/span&gt; &lt;span class="constant"&gt;Admin&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;DohickiesController&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="punct"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;However, the new describe block isn&amp;#8217;t accessible from the block at the bottom of the example&amp;#8230; yet. To do this, we just need to pass the option: &lt;code&gt;:shared =&amp;gt; true&lt;/code&gt; as you&amp;#8217;ll see in the following example.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;an admin user is signed in&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:shared&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;before&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:each&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stub!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:login_required&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;Great, now we can reference it by referring to it with: &lt;code&gt;it_should_behave_like SharedGroupName&lt;/code&gt;. In our example above, this would look like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;an admin user is signed in&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;before&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:each&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stub!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:login_required&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="ident"&gt;describe&lt;/span&gt; &lt;span class="constant"&gt;Admin&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;DohickiesController&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;it_should_behave_like&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;an admin user is signed in&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

  &lt;span class="ident"&gt;before&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:each&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="constant"&gt;Dohicky&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should_receive&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:paginate&lt;/span&gt; &lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;and_return&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="constant"&gt;Array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;get&lt;/span&gt; &lt;span class="symbol"&gt;:index&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

 &lt;span class="punct"&gt;...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="constant"&gt;Admin&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;DohickiesController&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;it_should_behave_like&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;an admin user is signed in&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

  &lt;span class="ident"&gt;before&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:each&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="attribute"&gt;@dohicky&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock_model&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="constant"&gt;Dohicky&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="constant"&gt;Dohicky&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should_receive&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="symbol"&gt;:new&lt;/span&gt; &lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;and_return&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="attribute"&gt;@dohicky&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;get&lt;/span&gt; &lt;span class="symbol"&gt;:new&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="punct"&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;That&amp;#8217;s it! Pretty simple, eh? We can now reference this shared group in any describe blocks that we want to. A benefit to this approach is that we can make change the authentication system (say, we decide to switch it entirely and/or even just change method names, set any other prerequisites necessary when an admin is signed in), we&amp;#8217;ll have a single place to change in our specs. (&lt;strong&gt;tip:&lt;/strong&gt; you can put these in your &lt;code&gt;spec_helper&lt;/code&gt; file)&lt;/p&gt;


	&lt;p&gt;You can learn more about &lt;code&gt;it_should_behave_like&lt;/code&gt; and other helpful features on the &lt;a href="http://rspec.info/documentation/"&gt;RSpec documentation site&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;If you have any suggestions on better ways of handling things like this, please follow up and share your solutions. I&amp;#8217;m always looking to sharpen my tools. :-)&lt;/p&gt;


	&lt;h3&gt;Update&lt;/h3&gt;


	&lt;p&gt;In response, &lt;a href="http://brynary.com/"&gt;Bryan Helmkamp&lt;/a&gt; suggests that a better solution is to define a method in our specs like, for example: &lt;code&gt;build_mock_user_and_login&lt;/code&gt;. then calling it in our &lt;code&gt;before(:each)&lt;/code&gt;. So, maybe the approach above isn&amp;#8217;t the most ideal method but I did wantt o draw some attention to &lt;code&gt;it_should_behave_like&lt;/code&gt;. I suppose that I need a better example.. another post, perhaps? :-)&lt;/p&gt;


	&lt;p&gt;Also, Ed Spencer has posted an article titled, &lt;a href="http://edspencer.net/2008/08/drying-up-your-crud-controller-rspecs.html"&gt;DRYing up your &lt;span class="caps"&gt;CRUD&lt;/span&gt; controller RSpecs&lt;/a&gt;, which will introduce you mor to &lt;code&gt;it_should_behave_like&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Thanks for feedback people!&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/02/13/be-careful-that-you-dont-stub-your-big-toe"&gt;Be Careful that you don&amp;#8217;t Stub your Big Toe&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;/ul&gt;
</description>
      <pubDate>Tue, 19 Aug 2008 21:47:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:769c7a25-afa3-40aa-aeb4-98c2ac61115a</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/08/19/rspec-it-should-behave-like</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>development</category>
      <category>rspec</category>
      <category>controllers</category>
      <category>rubyonrails</category>
      <category>rails</category>
      <category>agile</category>
      <category>tutorial</category>
      <category>specs</category>
      <category>code</category>
    </item>
    <item>
      <title>Alan Cooper @ Agile2008 slides</title>
      <description>&lt;p&gt;Alan Cooper, author of &lt;a href="http://www.amazon.com/About-Face-Essentials-Interface-Design/dp/1568843224"&gt;About Face&lt;/a&gt;, has slides from his presentation at Agile 2008 online.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.cooper.com/journal/agile2008/"&gt;The Wisdom of Experience&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If anybody knows if there is video of this talk, please let me know. :-)&lt;/p&gt;


	&lt;p&gt;Here are a few skitches from the slideshow.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/ug8u/the-wisdom-of-experience"&gt;&lt;img src="http://img.skitch.com/20080812-r9hyg3xrncidmpm691s3aemrxw.preview.jpg" alt="The Wisdom of Experience" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/ugej/the-wisdom-of-experience"&gt;&lt;img src="http://img.skitch.com/20080812-f18sjsi46bpx1uibn2k7jpw1ty.preview.jpg" alt="The Wisdom of Experience" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/ugep/the-wisdom-of-experience"&gt;&lt;img src="http://img.skitch.com/20080812-8bn4q9jgx64nyry16wgtmt91qg.preview.jpg" alt="The Wisdom of Experience" /&gt;&lt;/div&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/uges/the-wisdom-of-experience"&gt;&lt;img src="http://img.skitch.com/20080812-be1c52sxr11drrqy6xdtaf3f49.preview.jpg" alt="The Wisdom of Experience" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/ugei/the-wisdom-of-experience"&gt;&lt;img src="http://img.skitch.com/20080812-jcummuw488b67xim7i23b3n1at.preview.jpg" alt="The Wisdom of Experience" /&gt;&lt;/a&gt;&lt;/div&gt;
</description>
      <pubDate>Tue, 12 Aug 2008 18:19:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:969a9ba9-28c4-46e3-b060-6e86e6e54528</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/08/12/alan-cooper-agile2008-slides</link>
      <category>Programming</category>
      <category>d3</category>
      <category>agile</category>
      <category>development</category>
      <category>ui</category>
      <category>IxD</category>
      <category>interactiondesign</category>
      <category>alancooper</category>
    </item>
    <item>
      <title>Expanding Rails Boxcar packages</title>
      <description>&lt;p&gt;If you&amp;#8217;re in the market for a new hosting provider for your Ruby on Rails application, you might take a look at the new options for &lt;a href="http://railsboxcar.com/"&gt;Rails Boxcar.&lt;/a&gt; We recently expanded our service offerings into three pricing tiers as well as custom packages for those who need a bit more.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://www.railsboxcar.com/img/boxcar_logo_wide.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;A few things that we&amp;#8217;ve recently added support for:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Provide us your &lt;span class="caps"&gt;SSH&lt;/span&gt; key during sign up!
	&lt;ul&gt;
	&lt;li&gt;Allows us to keep your server even more secure by avoiding sending passwords over the net&lt;/li&gt;
		&lt;li&gt;Other fun features related to this coming soon&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
		&lt;li&gt;Auto-configured Nginx w/Mongrel cluster&lt;/li&gt;
		&lt;li&gt;Phusion Passenger (&lt;strong&gt;mod_rails&lt;/strong&gt;) support! (for those with mixed-environments)&lt;/li&gt;
		&lt;li&gt;Continued development of &lt;a href="http://github.com/planetargon/boxcar-conductor/tree/master"&gt;Boxcar Conductor&lt;/a&gt;)&lt;/li&gt;
		&lt;li&gt;...more in the works!&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The best part is that we can get you up and running with a new Boxcar now for as low as $59/month &lt;span class="caps"&gt;USD&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;For more information, visit: &lt;a href="http://railsboxcar.com"&gt;http://railsboxcar.com&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;If you have any questions, don&amp;#8217;t hesitate to &lt;a href="mailto:contact@planetargon.com?subject=Boxcar"&gt;contact us&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Mon, 04 Aug 2008 09:30:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f8d2d740-aad7-4c44-9465-53b9767e4df7</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/08/04/expanding-rails-boxcar-packages</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>boxcar</category>
      <category>hosting</category>
      <category>rails</category>
      <category>plugin</category>
      <category>vps</category>
      <category>capistrano</category>
    </item>
    <item>
      <title>The Art of Delivery, part 2</title>
      <description>&lt;p&gt;Two years ago, I wrote an article titled, &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;. I wanted to post a few updates based on how our process has evolved since then (and continues to).&lt;/p&gt;


	&lt;p&gt;Over the past few years, we&amp;#8217;ve been fortunate enough to work on quite a diverse collection of projects. This has enabled us to work with many different clients and solicit feedback on our process. This has given us an opportunity to evolve a set of best practices that fulfills the long-term project goals/budgets of our client while making sure that we&amp;#8217;re able to maintain a design and development process that is agile.&lt;/p&gt;


	&lt;p&gt;As I&amp;#8217;ve mentioned in previous posts, our team typically bills work per-iteration on projects rather than per-hour or a flat-bid per-project. Since iterations are bite-sized pieces of the entire project and limited to 1-2 weeks, our teams estimates are much more accurate and we&amp;#8217;re able to keep things rolling and on track.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/2275337814/" title="stay on track by Robby Russell, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2129/2275337814_6774d562ee.jpg" width="500" height="333" alt="stay on track" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The basic structure of our project looks like this.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;A &lt;strong&gt;Project&lt;/strong&gt; has many releases&lt;/li&gt;
		&lt;li&gt;A &lt;strong&gt;Release&lt;/strong&gt; has many iterations&lt;/li&gt;
		&lt;li&gt;An &lt;strong&gt;Iteration&lt;/strong&gt; has many deliverables&lt;/li&gt;
		&lt;li&gt;A &lt;strong&gt;Deliverable&lt;/strong&gt; has many tasks&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Before we begin working on an iteration, we outline a set of goals that we want to create solutions for. This process comes out of discussions between our client and us until we agree on what is the highest value/most critical to the success of the project, based on our shared understanding of where we are today. These goals translate into Deliverables, which in a typical iteration might require Interaction Design, Interface Design, or Development. We tend to break our process up into stages so that Interaction Design on Module &lt;span class="caps"&gt;XYZ&lt;/span&gt; would be implemented in a following iteration. This is because it&amp;#8217;s unrealistic to expect someone to provide an accurate estimate on how long it&amp;#8217;ll take to implement something before you know how people will interact with it.&lt;/p&gt;


	&lt;p&gt;Within any given iteration, our team is spread across several sets of deliverables. As a team, we breakdown these deliverables into smaller sets of tasks. It&amp;#8217;s our aim to keep tasks smaller than a full days worth of work as it&amp;#8217;s much easier to measure progress across the iteration when we can track tasks at a granular level.&lt;/p&gt;


	&lt;p&gt;Essentially, tasks are the individual steps needed to achieve these goals. We don&amp;#8217;t go out of our way to list each one of those during an estimate process as some tasks take less time than it takes to generate an estimate for them. Each person providing estimates should avoid getting too granular and aim to find a good balance that compliments their workflow.&lt;/p&gt;


	&lt;p&gt;Like most things&amp;#8230; mileage may vary.&lt;/p&gt;


	&lt;p&gt;Through this process, we can get calculate the estimated costs for each deliverable, which then provides us an cost for the entire iteration. In addition to deliverables, we also budget a set of hours/days so that we can be compensated for handling small requests, bug fixes, and project management. It&amp;#8217;s important to factor these things into your process.&lt;/p&gt;


	&lt;p&gt;In future posts, I&amp;#8217;ll discuss how we&amp;#8217;re handling this process while working on multiple projects&amp;#8230; as that&amp;#8217;s where it can chaos can start if you&amp;#8217;re not careful. ;-)&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/2274544107/" title="oops by Robby Russell, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2123/2274544107_0d427f84a7.jpg" width="500" height="333" alt="oops" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;How does your team work? As we&amp;#8217;re always evolving our process in an effort so that we can be more efficient and speed up our delivery cycle, I&amp;#8217;d love to learn from those in the community.&lt;/p&gt;
</description>
      <pubDate>Thu, 22 May 2008 13:42:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:268b4aaa-a86f-443e-8365-039ef5c747aa</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/05/22/the-art-of-delivery-part-2</link>
      <category>Business</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>agile</category>
      <category>development</category>
      <category>iterations</category>
      <category>projects</category>
      <category>deliverables</category>
      <category>team</category>
      <category>estimates</category>
      <category>budgets</category>
      <category>process</category>
    </item>
    <item>
      <title>git-svn is a gateway drug</title>
      <description>&lt;p&gt;As we&amp;#8217;re migrating away from Subversion to Git, I&amp;#8217;m having to learn a lot about &lt;code&gt;git-svn&lt;/code&gt;. Andy has &lt;a href="http://andy.delcambre.com/2008/3/4/git-svn-workflow"&gt;posted a few articles&lt;/a&gt; on this topic, but I wanted to share a quick tip that I find myself forgetting.&lt;/p&gt;


	&lt;h2&gt;Working with Subversion branches&lt;/h2&gt;


	&lt;p&gt;While you&amp;#8217;re hopefully already familiar with how great &lt;strong&gt;local branches&lt;/strong&gt; are with Git, you might not know that you can connect local branches to &lt;strong&gt;remote&lt;/strong&gt; branches in your Subversion repository. This allows those of us who are using Git locally to work against Subversion branches.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m going to assume the following:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Your team is using Subversion&lt;/li&gt;
		&lt;li&gt;Your team already has a branch that you&amp;#8217;re working in&lt;/li&gt;
		&lt;li&gt;Your team is following Subversion directory conventions (&lt;code&gt;branches/&lt;/code&gt;, &lt;code&gt;tags/&lt;/code&gt;, and &lt;code&gt;trunk/&lt;/code&gt;)&lt;/li&gt;
		&lt;li&gt;You have Git installed (&lt;em&gt;with &lt;span class="caps"&gt;SVN&lt;/span&gt; extensions&lt;/em&gt;)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Checkout the Subversion project with Git&lt;/h3&gt;


	&lt;p&gt;Please visit Andy&amp;#8217;s tutorial, &lt;a href="http://andy.delcambre.com/2008/3/4/git-svn-workflow"&gt;Git &lt;span class="caps"&gt;SVN&lt;/span&gt; Workflow&lt;/a&gt;, for a more detailed explanation of the following commands.&lt;/p&gt;


	&lt;p&gt;First, we&amp;#8217;ll initialize your new local Git repository with &lt;code&gt;git-svn&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  git svn init -s http://svn.yourdomain.com/repos/project_name
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Now, you&amp;#8217;ll change directories to your new Git repository.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  cd project_name
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Let&amp;#8217;s fetch all previous revisions into your local repository&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  git svn fetch
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Great, once this is done&amp;#8230; you&amp;#8217;re &lt;strong&gt;master&lt;/strong&gt; (local) branch is linked to &lt;code&gt;trunk/&lt;/code&gt;.&lt;/p&gt;


	&lt;h3&gt;Mapping a local repository to a remote branch&lt;/h3&gt;


	&lt;p&gt;Assuming that your team is working in a Subversion branch on the current iteration of work. Our team has a naming convention for branches for each iteration. For example, if we&amp;#8217;re in Iteration 18, we&amp;#8217;ll write this as &lt;span class="caps"&gt;ITER&lt;/span&gt;-018 everywhere (Basecamp, Lighthouse, Subversion, etc&amp;#8230;). At the start of each iteration, we create a new branch with this naming convention.&lt;/p&gt;


	&lt;p&gt;For &lt;code&gt;ITER-018&lt;/code&gt;, the Subversion branch would be located at:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;http://svn.yourdomain.com/repos/project_name/branches/ITER-018&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you were to do a &lt;code&gt;git branch -r&lt;/code&gt;, you should see &lt;code&gt;ITER-018&lt;/code&gt; show up in the list. Now, the one thing that wasn&amp;#8217;t clear when I first read the &lt;code&gt;git-svn&lt;/code&gt; documentation was that you can&amp;#8217;t just checkout that branch with one command. In fact, this has tripped me up a few times.&lt;/p&gt;


	&lt;p&gt;First, you&amp;#8217;ll need to checkout a new &lt;em&gt;local&lt;/em&gt; branch. I&amp;#8217;ve opted to come up with my own convention for &lt;em&gt;local branches&lt;/em&gt; and in this case, I&amp;#8217;ll name it &lt;code&gt;iter_018&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  git co -b iter_018
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;So, now I&amp;#8217;m in the iter_018 branch, which is local. I&amp;#8217;m currently still mapped to &lt;code&gt;trunk/&lt;/code&gt;, which isn&amp;#8217;t what we want. However, all we need to do is reset where Git is currently pointed to. We can run &lt;a href="http://andy.delcambre.com/2008/3/12/git-reset-in-depth"&gt;git reset&lt;/a&gt; to point this to the &lt;span class="caps"&gt;ITER&lt;/span&gt;-018 branch.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  git reset --hard ITER-018
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;That&amp;#8217;s it! Now, the local &lt;code&gt;iter_018&lt;/code&gt; branch will point to &lt;code&gt;branches/ITER-018&lt;/code&gt; in your Subversion repository. This will allow you to work with your existing repository branch and still reap the benefits of local Git repositories.&lt;/p&gt;


	&lt;h3&gt;What about master?&lt;/h3&gt;


	&lt;p&gt;Good question. The &lt;code&gt;git reset&lt;/code&gt; command that you ran will &lt;span class="caps"&gt;ONLY&lt;/span&gt; apply that that individual local branch. So, master is &lt;em&gt;still&lt;/em&gt; pointing to &lt;code&gt;trunk/&lt;/code&gt;. This will allow you to have several local branches that map to remote branches.&lt;/p&gt;


	&lt;h2&gt;Next Steps&amp;#8230;&lt;/h2&gt;


	&lt;p&gt;If you&amp;#8217;re working with Git already.. great!&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re working in an environment that using Subversion, &lt;code&gt;git svn&lt;/code&gt; provides you the ability to start exploring Git without making your entire team switchover. Perhaps your a consultant and working for a client that uses Subversion&amp;#8230; no problem!&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;re still using Subversion for past client projects and are considering &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;, which &lt;a href="http://github.com/blog/40-we-launched"&gt;just launched (to the public) today&lt;/a&gt; for future projects. A few of us are already using GitHub for open source projects.&lt;/p&gt;


	&lt;p&gt;Fun.. I just saw the following tweet pass by as I began to wrap up this post.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/jeh1/rails-on-github"&gt;&lt;img src="http://img.skitch.com/20080411-rgageidq82ak6ij952ppant4u9.preview.jpg" alt="rails on github" /&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;&lt;a href="http://github.com/rails/"&gt;Check out Rails on GitHub!&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;The Gateway Drug&amp;#8230; Git reminds me of Cake&lt;/h3&gt;


&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/g0GxUxKZdHk&amp;#38;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/g0GxUxKZdHk&amp;#38;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;h3&gt;Questions?&lt;/h3&gt;


	&lt;p&gt;I know that I glossed over a few things, so feel free to post questions and/or tips for others who are looking to dabble with Git.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; You&amp;#8217;ll likely have problems if you don&amp;#8217;t have a Git authors file specified in your git config.&lt;/p&gt;
</description>
      <pubDate>Thu, 10 Apr 2008 22:28:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:cea369ee-eed9-4ec3-a0e9-91421f590dd7</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/04/10/git-svn-is-a-gateway-drug</link>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>git</category>
      <category>rubyonrails</category>
      <category>subversion</category>
      <category>github</category>
    </item>
    <item>
      <title>Tip: Link to Unimplemented</title>
      <description>&lt;p&gt;Throughout our design and development process, we&amp;#8217;re working around areas of the site that are not yet implemented but we also want to be able to allow our clients to demo their application. In an effort to manage their expectations, we need to be careful about what we link to. If a page/widget isn&amp;#8217;t ready to be demo&amp;#8217;d yet, we should avoid providing pathways to get interact with or navigate there. However, when we&amp;#8217;re implementing &lt;span class="caps"&gt;HTML&lt;/span&gt;/CSS for pages, it&amp;#8217;s sometimes makes sense to not hide certain things on the screen.&lt;/p&gt;


	&lt;p&gt;For example, let&amp;#8217;s suppose that you&amp;#8217;re working on the primary navigation of an application. You know what the other sections are going to be, but you&amp;#8217;ve only implemented a few of them so far. Your &lt;span class="caps"&gt;HTML&lt;/span&gt;/CSS person is working on the design for the navigation and wants to have them be proper links&amp;#8230; even to pages that don&amp;#8217;t yet exist.&lt;/p&gt;


	&lt;p&gt;One option, which is quite common, is to provide a link with &lt;code&gt;href="#"&lt;/code&gt;. This works to some extent, but when people click on things, they naturally expect something to happen in response.&lt;/p&gt;


	&lt;p&gt;This approach doesn&amp;#8217;t mesh well with our team as we don&amp;#8217;t really want to field any questions like, &amp;#8220;the navigation links are all broken. Nothing happens!&amp;#8221;&lt;/p&gt;


	&lt;p&gt;So, a pattern that we&amp;#8217;ve been using for a while is to trigger a javascript alert for every link within an implemented area that is linking to something that isn&amp;#8217;t yet implemented.&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s take a really basic javascript function like:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
# public/javascripts/application.js
function unimplemented() {
  alert("NOTICE\n\nThis feature is not implemented yet. Please check back again soon!");
}
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;This allows us to do the following:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  &amp;lt;a href="javascript:unimplemented();"&amp;gt;link text&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;When someone clicks the link, they&amp;#8217;ll see a typical javascript alert message. This informs our clients/beta testers that we&amp;#8217;re paying attention to what works and what doesn&amp;#8217;t.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/ecx1/unimplemented"&gt;&lt;img src="http://img.skitch.com/20080327-pbcddnkj85bu6m9x7mspme5y6.preview.jpg" alt="unimplemented" /&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;Let&amp;#8217;s take it a step further and push this into a view helper.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
# app/helpers/application_helper.rb
def link_to_unimplemented( link_text, *args )
  link_to_function( link_text, 'unimplemented()', *args)
end
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Now, we&amp;#8217;re able to use &lt;code&gt;link_to_unimplemented&lt;/code&gt; and pass any arguments that you&amp;#8217;d pass to the default &lt;code&gt;link_to&lt;/code&gt; view helper.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
&amp;lt;%= link_to_unimplemented( 'link text', { :class =&amp;gt; 'link_class_name' } ) -%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Now our web designers can go about their work and use this helper as necessary.&lt;/p&gt;


	&lt;p&gt;An nice benefit for doing this is that we have a pattern that we follow so that we can rely upon to make sure that we don&amp;#8217;t forget anything. This is the equivalent of adding @TODO@s throughout our code base.&lt;/p&gt;


	&lt;p&gt;If we search through &lt;code&gt;app/views&lt;/code&gt; for &amp;#8216;&lt;strong&gt;&lt;code&gt;link_to_unimplemented&lt;/code&gt;&lt;/strong&gt;&amp;#8217; we should be able to prevent missing any broken links. In the next screenshot, I&amp;#8217;m using &lt;code&gt;grep&lt;/code&gt; with colorized matches.&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/ecxh/unimplemented-2"&gt;&lt;img src="http://img.skitch.com/20080327-eg83hqhgpspk4n71hquswjpasf.preview.jpg" alt="unimplemented 2" /&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;As you can see, we have something left to implement in that area of the application. :-)&lt;/p&gt;


	&lt;p&gt;This has been one of those lightweight patterns that we&amp;#8217;ve been able to adopt and it&amp;#8217;s definitely helped manage the expectations of our clients throughout our development process.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;d love to hear your thoughts on this. How does your team handle things like this?&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/2007/08/01/designers-developers-and-the-x_-factor"&gt;Designers, Developers, and the x_ Factor&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/10/06/spice-up-your-terminal-with-colored-grep-pattern-results"&gt;Spice up your Terminal with colored grep pattern results&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
</description>
      <pubDate>Thu, 27 Mar 2008 06:10:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f2aad3fb-9728-4db3-8504-a7bf2bd76b24</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/27/tip-link-to-unimplemented</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>clients</category>
      <category>javascript</category>
      <category>helper</category>
      <category>development</category>
      <category>design</category>
      <category>html</category>
      <category>tip</category>
    </item>
    <item>
      <title>Managing Required Gems on Rails Projects</title>
      <description>&lt;p&gt;We&amp;#8217;re starting a new project and I&amp;#8217;m finding myself adding things to the code base that we&amp;#8217;ve done in the past&amp;#8230; hence the last few posts. As we&amp;#8217;re doing this, I&amp;#8217;d like to highlight some of the little things that we do on each project to maintain some consistency and in that process reach out to the community for alternative approaches.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m intrigued by the &lt;a href="http://errtheblog.com/posts/50-vendor-everything"&gt;vendor everything&lt;/a&gt; concept, but we haven&amp;#8217;t yet adopted this on any of our projects (yet).&lt;/p&gt;


	&lt;p&gt;What we have been doing is to maintain a &lt;code&gt;REQUIRED_GEMS&lt;/code&gt; file in the root directory of our Rails application.&lt;/p&gt;


	&lt;p&gt;For example:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
$ cat REQUIRED_GEMS

actionmailer
actionpack
actionwebservice
activerecord
activesupport
cgi_multipart_eof_fix
daemons
fastercsv
fastthread
feedtools
gem_plugin
image_science
mongrel
mongrel_cluster
mysql
rails
rake
RedCloth
Ruby-MemCache
soap4r
uuidtools
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Everybody on the team (designers/developers) knows to look here to make sure they have everything installed when beginning to work on the application.&lt;/p&gt;


	&lt;p&gt;This has worked fairly well from project to project but since we&amp;#8217;re starting a new project, I&amp;#8217;m curious if anybody has some better ways to approach this. Should we look more seriously at the vendor everything approach or are there any alternative approaches?&lt;/p&gt;
</description>
      <pubDate>Wed, 26 Mar 2008 22:27:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1dad9e29-fb50-447c-802d-1a0f6109ff1d</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/26/managing-required-gems-on-rails-projects</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>gems</category>
      <category>rubyonrails</category>
      <category>ruby</category>
      <category>rails</category>
      <category>workflow</category>
      <category>team</category>
      <category>planetargon</category>
      <category>question</category>
      <category>tip</category>
    </item>
    <item>
      <title>Managing SEO-friendly HTML Titles with Rails</title>
      <description>&lt;p&gt;I&amp;#8217;ve seen this come up a few times in the #rubyonrails &lt;span class="caps"&gt;IRC&lt;/span&gt; channel and figured that I&amp;#8217;d post a quick entry for future reference.&lt;/p&gt;


	&lt;h2&gt;Problem: &lt;span class="caps"&gt;HTML&lt;/span&gt; titles&lt;/h2&gt;


	&lt;p&gt;&lt;strong&gt;You want to have a clean way to manage the titles on your &lt;span class="caps"&gt;HTML&lt;/span&gt; pages.&lt;/strong&gt;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  &amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;Robby on Rails &amp;amp;mdash; Article Title Goes Here&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
      ...
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Possible Solution(s):&lt;/p&gt;


	&lt;p&gt;Since the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tag is usually declared in your layout, you need to be able to dynamically update this information from almost every action in your application.&lt;/p&gt;


	&lt;p&gt;Here are a few ways that I&amp;#8217;ve seen this handled.&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Use a instance variable, which would have a default value and you could override it in any controller action&lt;/li&gt;
		&lt;li&gt;Use the &lt;code&gt;content_for&lt;/code&gt; method to manage it.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;Let&amp;#8217;s take a few minutes to look at these two approaches.&lt;/p&gt;


	&lt;h3&gt;Instance Variable&lt;/h3&gt;


	&lt;p&gt;With the instance variable, you might end up with something like:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  # app/views/layouts/application.html.erb
  &amp;lt;title&amp;gt;Robby on Rails &amp;amp;mdash; &amp;lt;%= @html_title || 'Default text here...' -%&amp;gt;&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Then in a controller action&amp;#8230;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  # app/controllers/articles_controller.rb
  def show
    # ...
    @html_title = @article.title
  end
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;So, that&amp;#8217;s one way to handle it and is probably a more common way.&lt;/p&gt;


	&lt;h3&gt;The &lt;code&gt;content_for&lt;/code&gt; helper method approach&lt;/h3&gt;


	&lt;p&gt;This solution is very similar (and underneath uses an instance variable).&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ll use the &lt;a href="http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#M001069"&gt;content_for&lt;/a&gt; and a little &lt;code&gt;yield&lt;/code&gt; action.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  # app/views/layouts/application.html.erb
  &amp;lt;title&amp;gt;Robby on Rails &amp;lt;%= (html_title = yield :html_title) ? html_title : '&amp;amp;mdash; Default text here...' %&amp;gt;&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Then we&amp;#8217;ll create a helper method.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  # app/helpers/application_helper.rb
  def set_html_title(str="")
    unless str.blank?
      content_for :html_title do
       "&amp;amp;mdash; #{str} " 
      end
    end
  end  
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Now, instead of defining the &lt;span class="caps"&gt;HTML&lt;/span&gt; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; value in the controllers, we&amp;#8217;ll just toss this into our html.erb files as necessary.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  &amp;lt;% set_html_title(@article.name) -%&amp;gt;
  ... rest of view
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;..and that&amp;#8217;s pretty much it.&lt;/p&gt;


	&lt;h3&gt;Which is the better solution?&lt;/h3&gt;


	&lt;p&gt;This is where we&amp;#8217;ll not find a lot of consensus amongst people. I&amp;#8217;m a fan of the &lt;code&gt;content_for&lt;/code&gt;-based approach and defining the title in views rather than in controller actions. I&amp;#8217;m an advocate of skinny controllers and while I&amp;#8217;m not a big fan of messy views, I believe that there is less overhead in managing this within the View-world.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;d love to hear your thoughts on this. Perhaps you have a more eloquent for managing things like this? Do share. :-)&lt;/p&gt;
</description>
      <pubDate>Wed, 26 Mar 2008 16:41:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:de684f82-efe6-48b6-a6f5-68ea542d72ef</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/26/managing-seo-friendly-html-titles-with-rails</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>html</category>
      <category>rails</category>
      <category>rubyonrails</category>
      <category>helpers</category>
    </item>
    <item>
      <title>Things (in the Rails world) You Don't Yet Understand</title>
      <description>&lt;p&gt;This is inspired by a recent post by Seth Godin titled, &lt;a href="http://sethgodin.typepad.com/seths_blog/2008/03/things-you-dont.html"&gt;Things you don&amp;#8217;t understand&lt;/a&gt;, where he shared a list of things that he probably could understand if he put your mind to it, but doesn&amp;#8217;t. I decided to post a list of five (5) things in response within the context of Ruby/Rails.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m really interested in various things but am really unable to prioritize them high enough to spend the time to understand them.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;RSpec User Stories&lt;/li&gt;
		&lt;li&gt;Using Selenium with RSpec&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; (&lt;a href="http://blog.imperialdune.com/"&gt;Graeme&lt;/a&gt; speaks highly of it)&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://code.google.com/p/jsspec/"&gt;JSSpec&lt;/a&gt; (BDD for Javascript)&lt;/li&gt;
		&lt;li&gt;Using the Google Charts &lt;span class="caps"&gt;API&lt;/span&gt; with Rails&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;What about you? What&amp;#8217;s your list of things that you&amp;#8217;d like to understand more about?&lt;/p&gt;
</description>
      <pubDate>Tue, 25 Mar 2008 10:12:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2ad10b2f-7185-4d43-bc2e-1e881281f1c5</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/25/things-in-the-rails-world-you-dont-yet-understand</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>question</category>
      <category>rspec</category>
      <category>jquery</category>
      <category>javascript</category>
      <category>ruby</category>
      <category>rubyonrails</category>
      <category>rails</category>
      <category>google</category>
      <category>charts</category>
      <category>godin</category>
    </item>
    <item>
      <title>DRY(a): Year After Year</title>
      <description>&lt;p&gt;I&amp;#8217;m guilty of it. Many of you are likely guilty of it&amp;#8230; and I know that several customers of our &lt;a href="http://www.robbyonrails.com/articles/2007/06/17/audit-your-rails-development-team"&gt;Rails Code Audit and Review service&lt;/a&gt; are guilty of it.&lt;/p&gt;


	&lt;p&gt;How many times have you realized (after a few months has passed) that your Copyright date/year on your web site was no longer current?&lt;/p&gt;


	&lt;p&gt;How many of you had the same problem last year? The year before?&lt;/p&gt;


	&lt;p&gt;Let me share some advice with you all&amp;#8230; &lt;span class="caps"&gt;DRY&lt;/span&gt; (a)!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t Repeat Yourself (again)!&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;This is really a simple problem to fix but when we&amp;#8217;re busy tackling bigger problems&amp;#8230; little things like this slip by. Don&amp;#8217;t worry, you&amp;#8217;re not the only one who was reminded by a colleague three months into the year that you forgot to update this.&lt;/p&gt;


	&lt;p&gt;On client projects, we have a handful of helpers that we drop into the application. We&amp;#8217;re starting to extract more of these into plugins and will be releasing those as time permits. It just happened that I found myself looking at yet-another Rails code base this afternoon that was showing 2007 in the footer. An easily forgivable offense.. but if you&amp;#8217;re going to go in there and change it (again), &lt;em&gt;take a moment to do the right thing&lt;/em&gt;. ;-)&lt;/p&gt;


	&lt;p&gt;Our solution at &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt; on client projects is to create a basic view helper that renders the current year. This allows us to do the following.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  &amp;lt;div id="footer"&amp;gt;
    &amp;amp;copy; Copyright &amp;lt;%= current_year -%&amp;gt;. All Rights Reserved.
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;The helper code looks like:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  # add to application_helper.rb
  module ApplicationHelper
    def current_year
      Time.now.strftime('%Y')
    end
  end
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Voila. Not rocket science.. is it?&lt;/p&gt;


	&lt;p&gt;Guess what? I&amp;#8217;m getting really tired of adding this to every Rails project that I touch. So, I bottled this little gem into a new Rails plugin that we&amp;#8217;ll just add to future projects.&lt;/p&gt;


	&lt;h2&gt;Introducing Year after Year&lt;/h2&gt;


	&lt;p&gt;This is really the smallest plugin that I could put together (and it includes specs!)&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;What does it provide you?&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;YearAfterYear will provide you a helper that will render the current year (dynamically)! That&amp;#8217;s right&amp;#8230; just add the plugin to your Rails application and you too can enjoy New Years 2009 without having to have a deployment ready with a one line change from 2008 to 2009!&lt;/p&gt;


	&lt;p&gt;To use.. add the following to any view from within Ruby on Rails.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  &amp;lt;%= current_year -%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;h3&gt;Installation&lt;/h3&gt;


	&lt;p&gt;As I&amp;#8217;m using git, you&amp;#8217;ll need to grab this and put it into &lt;code&gt;vendor/plugins&lt;/code&gt;. That&amp;#8217;s it!&lt;/p&gt;


	&lt;p&gt;You can grab it on &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://github.com/robbyrussell/year_after_year/"&gt;http://github.com/robbyrussell/year_after_year/&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Bugs / Feature Requests &lt;a href="http://planetargon.lighthouseapp.com/projects/5187-open-source-projects/tickets"&gt;here&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Happy New Years (8+ months early)!&lt;/p&gt;


	&lt;p&gt;Just a friendly reminder to not forget the small stuff&amp;#8230; because your visitors will notice! ;-)&lt;/p&gt;


	&lt;h3&gt;Updates&amp;#8230;&lt;/h3&gt;


	&lt;p&gt;I got a few requests for this to also provide a range of years for people who like to do: &lt;strong&gt;2005-2007&lt;/strong&gt;. So this is now provided as well.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;year_range(start_year)&lt;/code&gt;&lt;/p&gt;


Example:
&lt;pre&gt;&lt;code&gt;
  &amp;lt;%= year_range(2005) %&amp;gt; # =&amp;gt; 2005-2008
&lt;/code&gt;&lt;/pre&gt;
</description>
      <pubDate>Mon, 24 Mar 2008 22:05:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4228a063-facc-4a13-bdb0-342c0fab415e</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/24/dry-a-year-after-year</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>sarcasm</category>
      <category>plugin</category>
      <category>rails</category>
      <category>rubyonrails</category>
      <category>years</category>
      <category>copyrights</category>
      <category>joke</category>
      <category>plugins</category>
    </item>
    <item>
      <title>Learning Git without getting your SVN feet wet</title>
      <description>&lt;p&gt;Our team has been migrating towards using &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; as our primary &lt;span class="caps"&gt;SCM&lt;/span&gt;. We have way too many Subversion-based projects and repositories to just do a clean switch over and not everybody on the team has had time to start playing with it. Baby-steps&amp;#8230;&lt;/p&gt;


	&lt;p&gt;So, for those of us who want to use it day-to-day, we&amp;#8217;re using &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html"&gt;git-svn&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://andy.delcambre.com/"&gt;Andy Delcambre&lt;/a&gt; has posted the first in a series of blog articles to help you pick up on using Git on Subversion-based projects. Check out his article, &lt;a href="http://andy.delcambre.com/2008/3/4/git-svn-workflow"&gt;Git &lt;span class="caps"&gt;SVN&lt;/span&gt; workflow&lt;/a&gt; to get up to speed.&lt;/p&gt;


	&lt;p&gt;Also, if you&amp;#8217;re on &lt;span class="caps"&gt;OSX&lt;/span&gt; and using Git&amp;#8230; check out &lt;a href="http://alternateidea.com"&gt;Justin Palmer&amp;#8217;s&lt;/a&gt; new project, &lt;a href="http://github.com/Caged/gitnub/wikis/home"&gt;GitNub&lt;/a&gt;, which describes itself as, &amp;#8220;a Gitk-like application written in RubyCocoa that looks like it belongs on a Mac.&amp;#8221; This looks promising. :-)&lt;/p&gt;
</description>
      <pubDate>Tue, 11 Mar 2008 01:59:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:00328f04-0b81-4c29-9915-1f4e729ae317</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/11/learning-git-without-getting-your-svn-feet-wet</link>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>git</category>
      <category>subversion</category>
      <category>svn</category>
      <category>scm</category>
      <category>code</category>
      <category>planetargon</category>
      <category>andy</category>
      <category>gitnub</category>
    </item>
    <item>
      <title>Launch your own RubyURL</title>
      <description>&lt;p&gt;A few weeks ago, I moved &lt;a href="http://rubyurl.com"&gt;RubyURL&lt;/a&gt; from subversion to git. During that process, I decided to use my invite to &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; and have decided to go ahead and open up the source code.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s currently a whopping 92 &lt;span class="caps"&gt;LOC&lt;/span&gt; with a 1:2.5 code to spec ratio. (I had a goal to keep is below 100 &lt;span class="caps"&gt;LOC&lt;/span&gt;)&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;RubyURL on GitHub: &lt;a href="http://github.com/robbyrussell/rubyurl"&gt;http://github.com/robbyrussell/rubyurl&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Public Clone &lt;span class="caps"&gt;URL&lt;/span&gt;: &lt;a href="git://github.com/robbyrussell/rubyurl.git"&gt;git://github.com/robbyrussell/rubyurl.git&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Feel free to grab it and help contribute. This has served almost &lt;strong&gt;14 million&lt;/strong&gt; redirects since August 2007 and is running on a &lt;a href="http://planetargon.com/hosting.html"&gt;Rails Boxcar&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;To grab it with git.. run: &lt;code&gt;git clone git://github.com/robbyrussell/rubyurl.git&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Feel free to submit tickets to the &lt;a href="http://planetargon.lighthouseapp.com/projects/4059-rubyurl"&gt;Rubyurl ticket system&lt;/a&gt;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://planetargon.lighthouseapp.com/projects/4059-rubyurl"&gt;http://planetargon.lighthouseapp.com/projects/4059-rubyurl&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Enjoy!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;&lt;/strong&gt; Ryan McGeary was kind enough to be the first person to help track down a bug and &lt;a href="http://github.com/robbyrussell/rubyurl/commits/master"&gt;submit patches&lt;/a&gt;. :-)&lt;/p&gt;
</description>
      <pubDate>Sat, 01 Mar 2008 18:31:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:a1e839d1-4c9b-47d6-931c-b0559ea71539</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/03/01/launch-your-own-rubyurl</link>
      <category>RubyURL</category>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>rubyurl</category>
      <category>boxcar</category>
      <category>git</category>
      <category>subversion</category>
      <category>github</category>
      <category>open</category>
      <category>source</category>
      <category>rails</category>
      <category>rspec</category>
    </item>
    <item>
      <title>ShortURL 0.8.4 released and gets a new mainainer... me!</title>
      <description>&lt;p&gt;Earlier today, Vincent Foley was kind enough to hand over maitenance of the the ShortURL project on RubyForge to me. He first released it back in 2005, which &lt;a href="http://www.robbyonrails.com/articles/2005/06/01/rubyurl-friendly-library"&gt;I blogged about&lt;/a&gt; as &lt;a href="http://rubyurl.com"&gt;RubyURL&lt;/a&gt; was the first shortening service that it supported (and is the default). Unfortunately, the release of RubyURL 2.0 broke backwards compatibility and Vincent wasn&amp;#8217;t maintaining it anymore. So, earlier, I decided to patch this and got a new version released that now works with the current RubyURL site.&lt;/p&gt;


	&lt;p&gt;While working on the code, I decided to extend the compatible services to include &lt;a href="http://moourl.com"&gt;moourl&lt;/a&gt; and &lt;a href="http://urltea.com"&gt;urlTea&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;These updates are available in ShortURL version 0.8.4.&lt;/strong&gt;&lt;/p&gt;


	&lt;h2&gt;Install the ShortURL gem&lt;/h2&gt;


	&lt;p&gt;Installation is a snap&amp;#8230; (like 99.7% of rubygems&amp;#8230;)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  ~ &amp;gt; sudo gem install shorturl                                                                                                                                                                                                           Password:

  Successfully installed shorturl-0.8.4
  1 gem installed
  Installing ri documentation for shorturl-0.8.4...
  Installing RDoc documentation for shorturl-0.8.4.  
&lt;/code&gt;&lt;/pre&gt;

	&lt;h2&gt;Using ShortURL&lt;/h2&gt;


	&lt;p&gt;The ShortURL gem provides the ShortURL library, which you can use from any Ruby application.&lt;/p&gt;


	&lt;h3&gt;Using the ShortURL library&lt;/h3&gt;


&lt;pre&gt;&lt;code&gt;
  ~ &amp;gt; irb                                                                                                                                                                                                                           
  irb(main):001:0&amp;gt; require 'rubygems'
  =&amp;gt; true
  irb(main):002:0&amp;gt; require 'shorturl'
  =&amp;gt; true
  irb(main):003:0&amp;gt; ShortURL.shorten( 'http://www.istwitterdown.com' )
  =&amp;gt; "http://rubyurl.com/P9w" 
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;As you can see&amp;#8230;it&amp;#8217;s really straight forward.&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s try it with a few other services.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
irb(main):004:0&amp;gt; ShortURL.shorten( 'http://www.istwitterdown.com', :moourl )
=&amp;gt; "http://moourl.com/fvoky" 
irb(main):005:0&amp;gt; ShortURL.shorten( 'http://www.istwitterdown.com', :tinyurl )
=&amp;gt; "http://tinyurl.com/2t3qmh" 
&lt;/code&gt;&lt;/pre&gt;

	&lt;h3&gt;Using the shorturl command-line tool&lt;/h3&gt;


	&lt;p&gt;Many people don&amp;#8217;t know that ShortURL provides a command-line tool, which you can use after installing the gem.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  ~ &amp;gt; shorturl http://istwitterdown.com                                                                                                                                                                                               
  http://rubyurl.com/Lwk
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;If you&amp;#8217;d like to see more services provided than the ones listed here, please submit &lt;a href="http://rubyforge.org/tracker/?atid=2896&amp;#38;group_id=732&amp;#38;func=browse"&gt;feature requests&lt;/a&gt; and/or &lt;a href="http://rubyforge.org/tracker/?atid=2895&amp;#38;group_id=732&amp;#38;func=browse"&gt;patches&lt;/a&gt; on the rubyforge project.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rubyforge.org/projects/shorturl/"&gt;http://rubyforge.org/projects/shorturl/&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;ShortURL Documentation&lt;/h2&gt;


	&lt;p&gt;To see the latest documentation for the project, please visit:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://rubyforge.org/projects/shorturl/"&gt;http://rubyforge.org/projects/shorturl/&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;My favorite part about this? My &lt;a href="http://www.robbyonrails.com/articles/2005/09/13/rubyurl-meets-rbot"&gt;rbot plugin for RubyURL&lt;/a&gt; works again!&lt;/p&gt;


&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/robbyrussell/rpg4/rbot-and-rubyurl"&gt;&lt;img src="http://img.skitch.com/20080107-mhjgi5mqgbcfgygut426ee8b53.preview.jpg" alt="rbot and rubyurl" /&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;Happy &lt;span class="caps"&gt;URL&lt;/span&gt;-shortening!&lt;/p&gt;
</description>
      <pubDate>Sun, 06 Jan 2008 18:49:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:5a4cc022-3fb9-4d4d-9d25-aa709a51c30e</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/01/06/shorturl-0-8-4-released-and-gets-a-new-mainainer-me</link>
      <category>RubyURL</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>rubyurl</category>
      <category>shorturl</category>
      <category>rbot</category>
      <category>gem</category>
      <category>rubyforge</category>
      <category>programming</category>
      <category>development</category>
    </item>
    <item>
      <title>Advanced Mathematics and Programming</title>
      <description>&lt;p&gt;First of all, Happy New Year!&lt;/p&gt;


	&lt;p&gt;The other day I received an email from a friend where she asked me if I thought that  &lt;em&gt;having excellent math skills&lt;/em&gt; were important in a programmers career. I&amp;#8217;ve heard this question asked before and while I thought that might have been the case when I was a lot younger (when I had zero plans to go into the IT world)... I&amp;#8217;ve not seen this to be true. My response to her was that it really depended on the types of programming work that one might want to go into. There are definitely programming jobs that require extremely advanced mathematical skills, but I&amp;#8217;d guess that many, if not most, don&amp;#8217;t really have that sort of prerequisite.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://www.robbyonrails.com/files/255342.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;So, as I was saying. I think it really depends. It depends on what sort of programming you&amp;#8217;re interested in pursuing. In general, when we&amp;#8217;re looking to hire someone at &lt;a href="http://planetargon.com"&gt;Planet Argon&lt;/a&gt;, we&amp;#8217;re looking for people with good research and problem solving skills. Programming languages are tools to help solve problems and build things. So, while math skills are useful, they aren&amp;#8217;t likely going to make or break a developer.&lt;/p&gt;


	&lt;p&gt;Like any career, it should be something that you&amp;#8217;re passionate about.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m curious. As programmers&amp;#8230; how would you respond to the following question?&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;Should an advanced knowledge of mathematics be a prerequisite in pursuing a career in programming?&amp;#8221;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;I can only answer the question from my own perspective and would like to share some others. Thanks!&lt;/p&gt;
</description>
      <pubDate>Tue, 01 Jan 2008 14:40:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:039c0630-0944-48d5-8b56-1a41225eaafe</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2008/01/01/advanced-mathematics-and-programming</link>
      <category>Programming</category>
      <category>programming</category>
      <category>math</category>
      <category>development</category>
      <category>careers</category>
    </item>
    <item>
      <title>Embracing Chaos, part 1</title>
      <description>&lt;p&gt;Consider this part one of several posts on my thoughts of &lt;strong&gt;the art of embracing chaos&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;Don&amp;#8217;t let &lt;a href="http://www.amazon.com/Agile-Software-Development-SCRUM-Schwaber/dp/0130676349"&gt;the books&lt;/a&gt; fool you. The construction of custom software is an unmastered and volatile cesspool of chaos. I don&amp;#8217;t adhere to the belief that there is a perfect methodology or process that will work for every project&amp;#8230; as I&amp;#8217;m sure many of you don&amp;#8217;t.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://www.robbyonrails.com/files/usa_lebowski_hi.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Unlike bowling, you&amp;#8217;ll never achieve a perfect score. Even in bowling, It&amp;#8217;s unlikely that anybody will learn how to bowl a perfect score and do so on every game for the rest of their career.&lt;/p&gt;


	&lt;p&gt;You&amp;#8217;ll never meet &lt;em&gt;every&lt;/em&gt; expectation that a client has on every project.&lt;/p&gt;


	&lt;p&gt;You&amp;#8217;ll never meet &lt;em&gt;every&lt;/em&gt; expectation that a user has when they interact with your application.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.mickipedia.com/?p=1007"&gt;Expectations are an interesting thing&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Your project might get widely adopted and embraced, but &lt;a href="http://istwitterdown.com/"&gt;you&amp;#8217;re still trying to control chaos&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/261845948/" title="chaos by Robby Russell, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/88/261845948_5c6fc23e4f.jpg" width="500" height="333" alt="chaos" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s chaos. Pure chaos&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


	&lt;p&gt;So, why do we bother? Why do we try so hard when the odds aren&amp;#8217;t in our favor?&lt;/p&gt;


	&lt;p&gt;To be continued&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Related Posts:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2007/04/10/embracing-failure-part-1"&gt;Embracing Failure&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.robbyonrails.com/articles/2006/11/18/dont-over-promise"&gt;Don&amp;#8217;t Over Promise&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a href="http://en.wikipedia.org/wiki/Chaos_theory"&gt;Chaos Theory&lt;/a&gt;, Wikipedia&lt;/p&gt;
</description>
      <pubDate>Mon, 17 Dec 2007 22:21:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b33dc953-4c4c-478b-9332-b0f58c09e214</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/12/17/embracing-chaos-part-1</link>
      <category>Business</category>
      <category>Programming</category>
      <category>d3</category>
      <category>agile</category>
      <category>development</category>
      <category>d3</category>
      <category>projectmanagmeent</category>
      <category>clients</category>
      <category>choas</category>
      <category>bowling</category>
      <category>expectations</category>
      <category>control</category>
    </item>
    <item>
      <title>Get to Know a Gem: Rak</title>
      <description>&lt;p&gt;A few months ago, I posted about an article that showed you &lt;a href="http://www.robbyonrails.com/articles/2007/10/06/spice-up-your-terminal-with-colored-grep-pattern-results"&gt;how to colorize your grep search results&lt;/a&gt;. Since then, I&amp;#8217;ve heard people talking about &lt;a href="http://petdance.com/ack/"&gt;ack&lt;/a&gt;, which describes itself as&amp;#8230;&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;a tool like grep, aimed at programmers with large trees of heterogeneous source code.&amp;#8221;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;It&amp;#8217;s written in Perl, which is fine and dandy&amp;#8230; but before I installed it, I heard that there was a Ruby version named &lt;a href="http://rak.rubyforge.org/"&gt;rak&lt;/a&gt;, which describes itself as&amp;#8230;&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;a grep replacement in pure Ruby. It accepts Ruby syntax regular expressions and automatically recurses directories, skipping .svn/, .cvs/, pkg/ and more things you don&amp;#8217;t care about. &amp;#8220;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Sounds great. Let&amp;#8217;s see what this thing can do.&lt;/p&gt;


	&lt;h2&gt;Installing rak&lt;/h2&gt;


	&lt;p&gt;Daniel Lucraft, the author of rak, was kind enough to package it up as a Rubygem. So, all we have to do is install it via &lt;code&gt;gem install rak&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
   &amp;gt; sudo gem install rak                                                                                                                                                                                                     
  Password:
  Bulk updating Gem source index for: http://gems.rubyforge.org
  Successfully installed rak-0.8.0
  Installing ri documentation for rak-0.8.0...
  Installing RDoc documentation for rak-0.8.0...
  ~ &amp;gt;
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Great, let&amp;#8217;s move on.&lt;/p&gt;


	&lt;h2&gt;Using rak&lt;/h2&gt;


	&lt;p&gt;Now that it&amp;#8217;s installed, we can use Rak by typing &lt;code&gt;rak&lt;/code&gt; from the command line. You&amp;#8217;d typically want to run this from within the root of your application.&lt;/p&gt;


	&lt;p&gt;For example, basic usage would look like the following.&lt;/p&gt;


&lt;code&gt;$ rak search-pattern&lt;/code&gt;

	&lt;p&gt;In my first test, I ran &lt;code&gt;rak README&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/rak_output_1-20071211-083456.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Immediately, I see a greater advantage to &lt;code&gt;rak&lt;/code&gt; over using &lt;code&gt;grep&lt;/code&gt; and that&amp;#8217;s because it&amp;#8217;s giving me line numbers for free, which takes remembering a few extra options with grep.&lt;/p&gt;


	&lt;p&gt;Like &lt;code&gt;grep&lt;/code&gt;, we can specify a specific path to search with. For example, we use a view helper named &lt;code&gt;link_to_unimplemented&lt;/code&gt; to help us track actions that aren&amp;#8217;t implemented yet. Looking at a current project, I can run &lt;code&gt;rak link_to_unimplemented app/views&lt;/code&gt; and produce the following results.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/terminal__less__160x49-20071211-085748.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m going to keep playing with it, but wanted to help get the word out. If you have any tips on using it, please share them in the comments. :-)&lt;/p&gt;
</description>
      <pubDate>Tue, 11 Dec 2007 11:10:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ae4ad314-4ef2-4c9d-9388-152a1d7c956c</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/12/11/get-to-know-a-gem-rak</link>
      <category>Ruby</category>
      <category>Programming</category>
      <category>gems</category>
      <category>rubyforge</category>
      <category>rak</category>
      <category>grep</category>
      <category>terminal</category>
      <category>unix</category>
      <category>tip</category>
      <category>development</category>
      <category>code</category>
      <category>ruby</category>
    </item>
    <item>
      <title>That Checkbox Needs a Label</title>
      <description>&lt;p&gt;As a user of many web applications, I often find myself noticing little things that slow me down. One such thing is the use of checkboxes in web forms. It&amp;#8217;s not the problem of checkboxes itself, it&amp;#8217;s the face that checkboxes require the user to really focus their attention to a fairly small box on the page and perform a click inside. If you&amp;#8217;re filling out a form really quickly, it&amp;#8217;s almost guaranteed that you&amp;#8217;ll take advantage of you your tab key to get through each field quickly. Sometimes there are &lt;code&gt;select&lt;/code&gt; boxes, which require the user to make selections with their mouse. Checkboxes drive me crazy because it requires more time to position the cursor and move on.&lt;/p&gt;


	&lt;p&gt;So, when I see a form like this, I don&amp;#8217;t see it being very quick to interact with.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/missing_label-20071201-222047.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;While I&amp;#8217;m not in love with the date selection interface here, my bigger pain has been the checkbox in the form. Why? Because they forgot to use the &lt;code&gt;&amp;lt;label for=""&amp;gt;&lt;/code&gt; HTML tag.&lt;/p&gt;


	&lt;p&gt;What&amp;#8217;s the problem? Well, I don&amp;#8217;t have the convenience of clicking on the label text, which would toggle the corresponding checkbox.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/missing_label-20071201-222751.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;I know, many of you know all about this&amp;#8230; but I run into this problem everywhere. This is an accessibility issue for people and really just increases the chances for a frustrating user experience. When you use the label tag properly&amp;#8230; it will provide a larger amount of the screen for people to click, which reduces the chance of not clicking in the right spot. The label tag was designed with this in mind so that people could click &lt;em&gt;close enough&lt;/em&gt; to trigger the desired action.&lt;/p&gt;


	&lt;p&gt;Here is an example of where it becomes really useful.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/good_label_for_usage-20071201-224846.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;So, the lesson? Please remember to use the label for tag. :-)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
&amp;lt;input type="checkbox" id="remember_me" name="remember_me" value="true" /&amp;gt;
&amp;lt;label for="remember_me"&amp;gt;Remember info?&amp;lt;/label&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;This is an easy thing to forget when building web applications. We&amp;#8217;ve forgot and I&amp;#8217;m sure you have too. I just wanted to point it out though because I see this happen so much&amp;#8230; even in new sites.&lt;/p&gt;


	&lt;p&gt;Perhaps you run into similar problems with web applications that can be fixed with just a little more &lt;span class="caps"&gt;HTML&lt;/span&gt;. Care to share your experiences?&lt;/p&gt;


	&lt;p&gt;For more information, read &lt;a href="http://diveintoaccessibility.org/day_28_labeling_form_elements.html"&gt;Labeling form elements&lt;/a&gt;  from the &lt;a href="http://diveintoaccessibility.org/"&gt;Dive Into Accessibility&lt;/a&gt; site.&lt;/p&gt;
</description>
      <pubDate>Sun, 02 Dec 2007 00:43:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:efe7de1c-ff24-41f9-9ef0-4cdb23f20523</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/12/02/that-checkbox-needs-a-label</link>
      <category>Programming</category>
      <category>html</category>
      <category>forms</category>
      <category>checkboxes</category>
      <category>interaction</category>
      <category>design</category>
      <category>web</category>
      <category>applications</category>
      <category>usability</category>
      <category>IxD</category>
      <category>accessibility</category>
    </item>
    <item>
      <title>Rolling up my Sleeves, continued</title>
      <description>&lt;p&gt;It&amp;#8217;s been about a year and a half since &lt;a href="http://www.robbyonrails.com/articles/2006/06/10/rolling-up-my-sleeves"&gt;I wrote about my wrist pains&lt;/a&gt; that would often occur at work, which was being caused by something I bet many of us deal with from time to time&amp;#8230; &lt;a href="http://en.wikipedia.org/wiki/Repetitive_strain_injury"&gt;Repetitive Strain Injury&lt;/a&gt;. So, I&amp;#8217;ve been wearing these gloves when I&amp;#8217;m at work on my normal Apple keyboard. I knew that they helped to some degree because on the days that I forgot them, my wrists would begin to hurt after a hour or two of coding/writing emails. Not much fun.&lt;/p&gt;


	&lt;p&gt;A few months ago, I attempted to start typing with Dvorak, which started off with requiring myself to do it for about three hours each morning to start the day and then switching back. After about a week and a half, I forgot to continue doing it. The Dvorak keyboard sits next to my desk&amp;#8230; whispering to me, &amp;#8220;play with me&amp;#8221;... but I haven&amp;#8217;t had time to get back into it.&lt;/p&gt;


	&lt;p&gt;So, the strain continues from time to time. Over the course of a few months, I began to notice that most of the strain seemed to be in my right wrist and I started to wonder if the mouse movements were a bigger culprit than the keyboard itself. So, I spoke to a guy at &lt;a href="http://macforce.com"&gt;Macforce&lt;/a&gt; (a cool and local Apple dealer) about the mouse pad that he was using. He said that it really helped him out and so I bought myself one.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://images.belkin.com/F8E262cSLV/STD1_F8E262cSLV.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s a &lt;a href="http://catalog.belkin.com/IWCatProductPage.process?Product_Id=22468"&gt;Belkin WaveRest&amp;#8482; Gel Mouse Pad&lt;/a&gt; and cost me less than $30 &lt;span class="caps"&gt;USD&lt;/span&gt;. It&amp;#8217;s been a few weeks and I&amp;#8217;ve noticed that I can go almost the entire day without the gloves that I wore before. So, I think that there is still some strain occurring, but a lot less than before. So, I&amp;#8217;m hoping to give Dvorak another shot and hope that combo helps alleviate a lot of pain that I&amp;#8217;ve been experiencing at work.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re experiencing wrist pains and it&amp;#8217;s focused on the hand that you use your mouse with, you might consider something like this to help out.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m sure that I&amp;#8217;m not the only one that has/is experienced motion strain at the computer.. so, what has been your experience and have you  had any success making improvements to your work space to help?&lt;/p&gt;
</description>
      <pubDate>Tue, 27 Nov 2007 12:33:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:0f697759-9f1d-414f-861a-67e03997a503</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/11/27/rolling-up-my-sleeves-continued</link>
      <category>Off-Topic</category>
      <category>Programming</category>
      <category>wrists</category>
      <category>rpi</category>
      <category>motion</category>
      <category>strain</category>
      <category>injusry</category>
      <category>work.</category>
      <category>keyboard</category>
      <category>dvorak</category>
      <category>mousepad</category>
      <category>ouch</category>
    </item>
    <item>
      <title>Master/Slave Databases with Ruby on Rails</title>
      <description>&lt;p&gt;Not terribly long ago, I &lt;a href="http://www.robbyonrails.com/articles/2007/10/05/multiple-database-connections-in-ruby-on-rails"&gt;announced Active Delegate&lt;/a&gt;, which was a really lightweight plugin that I developed to allow models to talk to multiple databases for specific methods. The plugin worked great for really simple situations, like individual models.. but when it came time to test with associations it fell apart. I haven&amp;#8217;t had a chance to work on any updates and knew that it was going to take more work to get it going.&lt;/p&gt;


	&lt;p&gt;Earlier this week, we helped one of our bigger clients launch their new web site&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;. For the deployment, we needed to send all writes to a master database and a reads to slaves (initial deployment is talking to almost 10 slaves spread around the globe!). We needed something to get integrated quickly and decided to ditch Active Delegate for the time being and began looking at the following options.&lt;/p&gt;


	&lt;p&gt;I spoke with Rick Olson&lt;sup&gt;&lt;a href="#fn2"&gt;2&lt;/a&gt;&lt;/sup&gt; and he pointed me to a new plugin that he hasn&amp;#8217;t really released yet. So, I&amp;#8217;m going to do him a favor and announce it for him. Of course&amp;#8230; I got his permission first&amp;#8230; ;-)&lt;/p&gt;


	&lt;h2&gt;Announcing Masochism!&lt;/h2&gt;


	&lt;p&gt;Masochism&lt;sup&gt;&lt;a href="#fn3"&gt;3&lt;/a&gt;&lt;/sup&gt; is a new plugin for Ruby on Rails that allows you to delegate all writes to a master database and reads to a slave database. The configuration process is just a few lines in your environment file and the plugin takes care of the rest.&lt;/p&gt;


	&lt;h3&gt;Installing Masochism&lt;/h3&gt;


	&lt;p&gt;With &lt;a href="http://piston.rubyforge.org/usage.html"&gt;piston&lt;/a&gt;, you can import Masochism with:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  $ cd vendor/plugins
  $ piston import http://ar-code.svn.engineyard.com/plugins/masochism/
&lt;/code&gt;&lt;/pre&gt;

	&lt;ul&gt;
	&lt;li&gt;To learn more about piston, read &lt;a href="http://www.robbyonrails.com/articles/2007/01/16/every-second-counts-with-a-piston-in-your-trunk"&gt;Every Second Counts with a Piston in your trunk&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;You can also install it with the old-fashioned way:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  $ ./script/plugin install -x http://ar-code.svn.engineyard.com/plugins/masochism/
&lt;/code&gt;&lt;/pre&gt;

	&lt;h3&gt;Configuring Masochism&lt;/h3&gt;


	&lt;p&gt;The first thing that you&amp;#8217;ll need to do is add another database connection in &lt;code&gt;config/database.yml&lt;/code&gt; for &lt;code&gt;master_database&lt;/code&gt;. By default, Masochism expects you to have a production database, which will be the read-only/slave database. The &lt;code&gt;master_database&lt;/code&gt; will be the connection details for your (you guessed it&amp;#8230;) master database.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
# config/database.yml  
production:
  database: masochism_slave_database
  adapter: postgresql
  host: slavedb1.hostname.tld
  ...

master_database:
  database: masochism_master_database
  adapter: postgresql
  host: masterdb.hostname.tld
  ...
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;The idea here is that replication will be handled elsewhere and your application can reap the benefits of talking to the slave database for all of it&amp;#8217;s read-only operations and let the master database(s) spend their time writing data.&lt;/p&gt;


	&lt;p&gt;The next step is to set this up in your environment file. In our scenario, this was &lt;code&gt;config/environments/production.rb&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;

# Add this to config/environments/production.rb
config.after_initialize do 
  ActiveReload::ConnectionProxy.setup!    
end

&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Voila, you should be good to go now. As I mentioned, we&amp;#8217;ve only been using this for this past week and we&amp;#8217;ve had to address a few problems that the initial version of the plugin didn&amp;#8217;t address. One of our developers, &lt;a href="http://andy.delcambre.com/"&gt;Andy Delcambre&lt;/a&gt;, just posted an article to show how we had a problem with &lt;a href="http://andy.delcambre.com/2007/11/15/masochistic-connection-proxy-with-observers"&gt;using ActiveRecord observers and masochism&lt;/a&gt;, which we&amp;#8217;re sending over a patch for now.&lt;/p&gt;


	&lt;p&gt;As we continue to monitor how this solution works, we&amp;#8217;ll report any findings on our blog. In the meantime, I&amp;#8217;d be interested in knowing what you&amp;#8217;re using to solve this problem. :-)&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a href="http://contiki.com"&gt;Contiki&lt;/a&gt;, a cool travel company we&amp;#8217;re working with&lt;/p&gt;


	&lt;p id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; Rick just moved to Portland&amp;#8230; welcome to stump town!&lt;/p&gt;


	&lt;p id="fn3"&gt;&lt;sup&gt;3&lt;/sup&gt; &lt;a href="http://ar-code.svn.engineyard.com/plugins/masochism/README"&gt;The Masochism plugin &lt;span class="caps"&gt;README&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 15 Nov 2007 16:02:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:3420b2e3-a80c-43c9-a136-a58040069607</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/11/15/master-slave-databases-with-ruby-on-rails</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>plugins</category>
      <category>masochism</category>
      <category>database</category>
      <category>mysql</category>
      <category>postgresql</category>
      <category>client</category>
      <category>development</category>
      <category>activerecord</category>
      <category>replication</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Chad Fowler's Dirty Little Secret?</title>
      <description>&lt;p&gt;I saw this photo of the Microsoft team from 1978 on &lt;a href="http://flickr.com/photos/anselmhook/1498377919/"&gt;Anselm&amp;#8217;s flickr&lt;/a&gt; and thought, &amp;#8220;Hmm, that looks like Chad Fowler!&amp;#8221;&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/chad_fowler_in_78-20071006-130251.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Could this be &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&amp;#8217;s&lt;/a&gt; dirty little secret?..&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/imgp5302.png__png_image__413x416_pixels_-20071006-125640.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Happy Saturday!&lt;/p&gt;
</description>
      <pubDate>Sat, 06 Oct 2007 15:00:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c6f3710c-4bbc-415c-8bb4-17107749a5e0</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/10/06/chads-dirty-little-secret</link>
      <category>Off-Topic</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>sarcasm</category>
      <category>humor</category>
      <category>chad</category>
      <category>chadfowler</category>
      <category>rubyonrails</category>
      <category>rails</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Spice up your Terminal with colored grep pattern results</title>
      <description>&lt;p&gt;Earlier, I came across a post by Garry Dolley, which he shows how to acheive &lt;a href="http://scie.nti.st/2007/7/18/colorized-grep-matches"&gt;colorized grep matches&lt;/a&gt; in bash. I recall having color matches when I used to use Linux on a daily basis as my primary work environment, but haven&amp;#8217;t gotten around to setting this up on my MacBook, which is where I do almost all of my development work.&lt;/p&gt;


	&lt;h2&gt;Before&lt;/h2&gt;


	&lt;p&gt;If you don&amp;#8217;t already have colors, a grep in your terminal might look something like the following screenshot.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/terminal_sans_colors-20071006-104657.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;While, I have a very small output here, this gets much crazier when you&amp;#8217;re using &lt;code&gt;egrep&lt;/code&gt; across an entire project. It&amp;#8217;s hard to scan through all of the results for the inline pattern matches.&lt;/p&gt;


	&lt;p&gt;So, taking Garry&amp;#8217;s suggestion (for &lt;code&gt;bash&lt;/code&gt;), I did something similar with my favorite shell, &lt;a href="http://en.wikipedia.org/wiki/Zsh"&gt;Z shell&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Add the following to your &lt;code&gt;~/.zshrc&lt;/code&gt; file to begin experimenting with the colors.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  export GREP_OPTIONS='--color=auto' 
  export GREP_COLOR='1;36'
&lt;/code&gt;&lt;/pre&gt;

	&lt;h2&gt;After&lt;/h2&gt;


	&lt;p&gt;With the new variables defined in my &lt;code&gt;.zshrc&lt;/code&gt;, I can now start to see colors showing up in my grep results.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/grep_with_colors-1-20071006-104732.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Pretty cool, huh?&lt;/p&gt;


	&lt;h2&gt;Variants&lt;/h2&gt;


	&lt;p&gt;To save you the trouble of trying tons of combinations yourself, which I suspect you&amp;#8217;ll do anyways, here are some other variants.&lt;/p&gt;


	&lt;h3&gt;Blinking&lt;/h3&gt;


	&lt;p&gt;If you change the first number in &lt;code&gt;GREP_COLOR&lt;/code&gt; to &lt;strong&gt;5&lt;/strong&gt;, you&amp;#8217;re matches will &lt;blink&gt;&lt;strong&gt;blink&lt;/strong&gt;&lt;/blink&gt;!&lt;/p&gt;


	&lt;p&gt;You&amp;#8217;ll have to experiment with this yourself as I&amp;#8217;m not going to make a video for you. ;-)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  export GREP_COLOR='5;35'
&lt;/code&gt;&lt;/pre&gt;

	&lt;h3&gt;Inverted Colors&lt;/h3&gt;


	&lt;p&gt;You can also invert the colors so that the background color changes on your pattern matches.&lt;/p&gt;


	&lt;p&gt;For example:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/default-3-20071006-104539.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;To achieve this, you can set the first number in &lt;code&gt;GREP_COLOR&lt;/code&gt; to &lt;strong&gt;7&lt;/strong&gt;.&lt;/p&gt;


	&lt;h3&gt;...and so much more&lt;/h3&gt;


	&lt;p&gt;I decided to write a quick and ugly ruby script to iterate through the color combinations that I was trying.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/coloring_egrep-20071006-104018.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Anyhow, I&amp;#8217;ll leave you on that note. If you figure out how to do any other fun things with grep colors, do let me know. :-)&lt;/p&gt;
</description>
      <pubDate>Sat, 06 Oct 2007 12:43:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0bc194d2-edc7-4df5-ad4a-298061ef9d9f</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/10/06/spice-up-your-terminal-with-colored-grep-pattern-results</link>
      <category>Programming</category>
      <category>grep</category>
      <category>shell</category>
      <category>unix</category>
      <category>terminal</category>
      <category>egrep</category>
      <category>colors</category>
    </item>
    <item>
      <title>PLANET ARGON is seeking fresh talent... could it be you?</title>
      <description>&lt;p&gt;My blog has been fairly quiet lately because our team has been busy helping push a few big client projects out the door. We&amp;#8217;ll be posting announcements about those launches on the &lt;a href="http://blog.planetargon.com"&gt;&lt;span class="caps"&gt;PLANET ARGON&lt;/span&gt; Blog&lt;/a&gt; soon, so stay-tuned there!&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ve been growing the design-side of our team lately, but we&amp;#8217;re also still seeking some more Rails-talent in Portland, OR. If you&amp;#8217;re in Portland or interested in moving here&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;, you should introduce yourself to our team. We&amp;#8217;re looking for people to work on-site in Portland, so any remote candidates will be turned away&amp;#8230; we&amp;#8217;re moving into a shiny and new office space in downtown and are looking for another developer to join our Design and Development team.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/1010617614/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1283/1010617614_25191cbcab.jpg" width="333" height="500" alt="PLANET ARGON goes hiking" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;you&amp;#8217;ll fit in really well if you&amp;#8217;re into outdoor activities&amp;#8230; ;-)&lt;/small&gt;&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;re seeking mid-level Ruby on Rails developers that can pick things up quickly. Having some experience with RSpec will go along way with us. Ideal candidates would have great communication skills and be able to work in a fast-paced environment that places a &lt;em&gt;huge&lt;/em&gt; emphasis on &lt;a href="http://www.robbyonrails.com/articles/2007/05/23/hug-your-designer-day-part-2"&gt;collaboration between designers and developers&lt;/a&gt; (let&amp;#8217;s not forget to mention our clients). Bring what you already know and learn the rest with us.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm1.static.flickr.com/123/345862990_d60db3c2ae.jpg" alt="" /&gt;&lt;br /&gt;&lt;small&gt;While everyone might have Wii&amp;#8217;s in the office, we&amp;#8217;ve taken it to the next level with Speed Stacking! :-p&lt;/small&gt;&lt;/p&gt;


	&lt;p&gt;To apply, send an email to &lt;a href="mailto:af22+8509@c1.catchthebest.com"&gt;af22+8509@c1.catchthebest.com&lt;/a&gt;,&lt;/p&gt;


	&lt;p&gt;Side note: We&amp;#8217;re giving &lt;a href="http://www.catchthebest.com"&gt;Catch the Best&lt;/a&gt; a whirl to review job candidates. If you&amp;#8217;re hiring people, you might consider giving it a try.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Everybody is moving to Portland&amp;#8230; ;-)&lt;/p&gt;
</description>
      <pubDate>Thu, 04 Oct 2007 10:10:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4b3818bc-9ac3-4bb5-80ef-1df68979893c</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/10/04/planet-argon-is-seeking-fresh-talent-could-it-be-you</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>hiring</category>
      <category>job</category>
      <category>portland</category>
      <category>oregon</category>
      <category>planetargon</category>
      <category>developer</category>
      <category>rubynrails</category>
      <category>rails</category>
    </item>
    <item>
      <title>Edge Rails Documentation: Revisited</title>
      <description>&lt;p&gt;This question, &lt;em&gt;&amp;#8220;where can I find documentation for Edge Rails?&amp;#8221;&lt;/em&gt; still comes up quite often on mailing lists, &lt;span class="caps"&gt;IRC&lt;/span&gt;, and other places. I just wanted to point out a few resources for you.&lt;/p&gt;


	&lt;p&gt;In March 2006, &lt;a href="http://www.robbyonrails.com/articles/2006/03/03/bleeding-edge-rails-documentation"&gt;our team announced&lt;/a&gt; that we&amp;#8217;d be updating a &lt;span class="caps"&gt;RDOC&lt;/span&gt; site a few times a day as the Rails project gets commits.&lt;/p&gt;


	&lt;p&gt;You can still access the &lt;span class="caps"&gt;PLANET ARGON&lt;/span&gt; Edge Rails documentation here:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://edgedocs.planetargon.org"&gt;http://edgedocs.planetargon.org&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Caboose also has some Edge Rails documentation here:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://caboo.se/doc.html"&gt;http://caboo.se/doc.html&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you&amp;#8217;re aware of any other online resources for Edge Rails documentation, please let me know.&lt;/p&gt;
</description>
      <pubDate>Wed, 26 Sep 2007 08:34:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:6438d608-93ab-43c9-9fcd-5837529bd67c</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/09/26/edge-rails-documentation-revisited</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>rails</category>
      <category>rubyonrails</category>
      <category>edge</category>
      <category>edgerails</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Rails Development Performance Tip - dev_mode_performance_fixes</title>
      <description>&lt;p&gt;When you&amp;#8217;re running a Rails application in development mode, you might notice that it takes a little longer for requests to get processed and this is somewhat intentional as the framework is was designed to allow you to run the application and make live changes to it. This way you can do some basic functional tests from your web browser, work on &lt;span class="caps"&gt;HTML&lt;/span&gt;/CSS changes, or anything else that might need to be done in development mode.&lt;/p&gt;


	&lt;p&gt;Anyhow, this can be slow from time to time and if you&amp;#8217;ve done much Ajax work, you might be familiar with how slow this can feel when performing some basic tasks. Well, thanks to &lt;a href="http://www.workingwithrails.com/person/5337-josh-goebel"&gt;Josh Goebel&lt;/a&gt;, we can speed up things with a new plugin he just released.&lt;/p&gt;


	&lt;p&gt;To install via piston:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;cd vendor/plugins; piston import http://svn.techno-weenie.net/projects/plugins/dev_mode_performance_fixes/&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;To install via &lt;code&gt;script/plugin&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;./script/plugin install http://svn.techno-weenie.net/projects/plugins/dev_mode_performance_fixes/&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Josh has posted some &lt;a href="http://svn.techno-weenie.net/projects/plugins/dev_mode_performance_fixes/BENCHMARKS"&gt;benchmarks&lt;/a&gt; and in my totally basic tests&amp;#8230; shows &lt;strong&gt;about four times (4x) speed improvement for reqs/sec&lt;/strong&gt;!&lt;/p&gt;


	&lt;p&gt;How does it work? From what I can tell, it works somewhat like &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/#rsn"&gt;autotest&lt;/a&gt;, in that keeps things cached and when it sees files modified, it re-caches the changes. He&amp;#8217;s made it so that the stack doesn&amp;#8217;t need to reload for each request, which is quite slow.&lt;/p&gt;


	&lt;p&gt;Since it&amp;#8217;s development-mode only, I&amp;#8217;d encourage you to install it and give it a whirl.&lt;/p&gt;


	&lt;p&gt;Have Fun!&lt;/p&gt;
</description>
      <pubDate>Tue, 28 Aug 2007 21:57:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3886af4d-eb92-42ae-b5db-5b7f7f32fe34</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/08/28/rails-development-performance-tip-dev_mode_performance_fixes</link>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>performance</category>
      <category>development</category>
    </item>
    <item>
      <title>Subscribe to Basecamp RSS Feeds in Google Reader</title>
      <description>&lt;p&gt;Yesterday afternoon, we were helping our newest employee, Paige Saez, get setup with new accounts across all of our applications. She uses &lt;a href="http://google.com/reader"&gt;Google Reader&lt;/a&gt; and couldn&amp;#8217;t understand why her Basecamp &lt;span class="caps"&gt;RSS&lt;/span&gt; wasn&amp;#8217;t working in it. We explained that Google doesn&amp;#8217;t provide any way to subscribe to authenticated feeds (yet)... so it wasn&amp;#8217;t something she could do. (I still use NetNewsWire because of this problem&amp;#8230;)&lt;/p&gt;


	&lt;p&gt;During the discussion, I said that it probably wouldn&amp;#8217;t take much effort to build a proxy for an authenticated feed&amp;#8230; and Andy said he&amp;#8217;d give it a shot.&lt;/p&gt;


	&lt;p&gt;10 minutes later&amp;#8230; he had &lt;a href="http://andy.delcambre.com/2007/8/17/authenticated-rss-proxy"&gt;an initial version of a &lt;span class="caps"&gt;RSS&lt;/span&gt; proxy application&lt;/a&gt;, written in Ruby.&lt;/p&gt;


	&lt;p&gt;15 minutes after that, we had it up and running on a private server for all of us at &lt;a href="http://planetargon.com"&gt;&lt;span class="caps"&gt;PLANET ARGON&lt;/span&gt;&lt;/a&gt; to begin using.&lt;/p&gt;


	&lt;p&gt;...and here is the proof!&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://myskitch.com/robbyrussell/basecamp_google_reader-20070817-133108.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Wee! Authenticated Basecamp &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds in Google reader. It even works with the openid authentication.&lt;/p&gt;


	&lt;p&gt;You can &lt;a href="http://andy.delcambre.com/2007/8/17/authenticated-rss-proxy"&gt;grab the code from Andy&amp;#8217;s blog post&lt;/a&gt; and finally make the switch off of desktop &lt;span class="caps"&gt;RSS&lt;/span&gt; readers to Google Reader, because you know you want to. ;-)&lt;/p&gt;


	&lt;p&gt;Thanks Andy!&lt;/p&gt;
</description>
      <pubDate>Fri, 17 Aug 2007 15:42:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:027be2ac-f2fa-4ad5-83d8-329ab333c3d6</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/08/17/subscribe-to-basecamp-rss-feeds-in-google-reader</link>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>basecamp</category>
      <category>rss</category>
      <category>mongrel</category>
      <category>google</category>
      <category>reader</category>
      <category>subscription</category>
      <category>authentication</category>
    </item>
    <item>
      <title>RubyURL: new design and code base</title>
      <description>&lt;p&gt;Yesterday evening, I deployed the new version of &lt;a href="http://rubyurl.com"&gt;RubyURL&lt;/a&gt;. This was a collaborative effort between &lt;a href="http://chriszgriffin.com/"&gt;Chris Griffin&lt;/a&gt; and I, which we&amp;#8217;re happy to finally push live.&lt;/p&gt;


	&lt;p&gt;There are a few things that we&amp;#8217;re going to push out in near future, such as an &lt;span class="caps"&gt;API&lt;/span&gt; and a new RubyGem.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robbyrussell/1051199668/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1331/1051199668_84a2781b5e.jpg" width="500" height="458" alt="RubyURL » Keep it short (and sweet)" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Chris volunteered to work on the new design and I did most of the programming in Ruby on Rails. When we worked on this, we really wanted to keep the process as simple as possible, despite &lt;a href="http://www.robbyonrails.com/articles/2007/07/16/rubyurl-2-0-on-the-horizon"&gt;some of the problems&lt;/a&gt; that the site has been having.&lt;/p&gt;


	&lt;p&gt;In the end, we have a Rails application that is only 85 lines of code and has a 1:2.3 code-to-spec ratio. I wanted to keep it under 100 lines of code. This means that there is some breathing room for further development.&lt;/p&gt;


	&lt;p&gt;We also tried out a beta account that I was given for &lt;a href="http://roundhaus.com/"&gt;RoundHaus&lt;/a&gt; for Subversion hosting. We had a really good experience using their service and were impressed by the plethora of useful features that came with the repository, such as continuous integration, rcov/code coverage stats, and twitter integration!.&lt;/p&gt;


	&lt;p&gt;If you find a bug, be sure to submit a ticket on the &lt;a href="http://planetargon.lighthouseapp.com/projects/4059-rubyurl/"&gt;RubyURL bug tracker&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;On a side note, we deployed this on a brand new &lt;a href="http://railsboxcar.com"&gt;Rails Boxcar&lt;/a&gt;, our new hosting solution that will be launched in the very near future. ;-)&lt;/p&gt;
</description>
      <pubDate>Wed, 08 Aug 2007 08:58:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9306d9e7-32b5-4afc-ba15-46cc3bc8590a</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/08/08/rubyurl-new-design-and-code-base</link>
      <category>RubyURL</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>PLANET ARGON</category>
      <category>rubyurl</category>
      <category>design</category>
      <category>development</category>
      <category>launch</category>
      <category>boxcar</category>
      <category>rubyonrails</category>
      <category>rails</category>
    </item>
    <item>
      <title> Rails Business: &amp;quot;Weekly&amp;quot; Review #3</title>
      <description>&lt;p&gt;It&amp;#8217;s been about six weeks since the last Rails Business &amp;#8220;Weekly&amp;#8221; Review on here, so perhaps it&amp;#8217;s worth changing the name to cut me some slack on not being consistent. ;-)&lt;/p&gt;


	&lt;p&gt;Since the last post, we&amp;#8217;ve gone from around 400 members to 555 as of this morning. We&amp;#8217;ve had 562 messages as well, so there hasn&amp;#8217;t been a shortage of discussions taking place. I&amp;#8217;d like to take a few moments to highlight some of the discussions that have taken place and encourage you all to consider participating, if you&amp;#8217;re not already.&lt;/p&gt;


	&lt;h3&gt;Licensing and Client Agreements&lt;/h3&gt;


	&lt;p&gt;Tim Case writes,&lt;/p&gt;


&lt;blockquote&gt;&amp;#8220;My client sent me this agreement drawn up from their lawyer that
included the following:
&lt;br /&gt;&lt;br /&gt;
(c)     the Contractor shall not bundle with or incorporate into any Work
Product any third-party products, ideas, processes, software, codes,
data, techniques, names, images, or other items or properties without
the express, written prior approval of the Company;&amp;#8221; 
&lt;/blockquote&gt;

	&lt;p&gt;Tim then goes on to ask how his applies to using Ruby on Rails, which as a &lt;span class="caps"&gt;MIT&lt;/span&gt; license and how other consultancies are handling these types of situations. &lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/ec01cd3bdfece804/3477c340e01446ba#3477c340e01446ba"&gt;Follow the discussion&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Escrow&lt;/h3&gt;


	&lt;p&gt;Gustin writes, &amp;#8220;Does anyone have any escrow experience, legal and cost? I am dealing with a client that got burned bad and we are reducing their fear with escrow on the first two iterations.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/c70e5b7b0a63917a/b4fced25705ca24a#b4fced25705ca24a"&gt;Follow the discussion&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Project Planning tools&lt;/h3&gt;


	&lt;p&gt;Mike Pence writes, &amp;#8220;So, I used to use MS Project for the composition of those dreaded Gantt charts, but it has been a few years since I had to be so formal. Anything new and exciting &amp;#8211; and more robust than Basecamp &amp;#8211; happening in the world of project planning software?&amp;#8221;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/a5d56192aeb3b36f/ef7bd04df87927d3#ef7bd04df87927d3"&gt;Follow the discussion&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Not long after, Jim Mulholland started a new thread on the same topic and brought up the open source application, redMine. &lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/a8b57756ec338b9c/bc4611a37cd57e3b#bc4611a37cd57e3b"&gt;Follow this discussion&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Ruby on Rails versus .NET&lt;/h3&gt;


	&lt;p&gt;Michael Breen asked a big question on the list, which has sparked an going discussion about the benefits of using Rails versus .NET (and other platforms).&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;&amp;#8220;A couple of months ago I decided to stop actively pursuing .NET gigs to focus on Rails. Several of my existing .NET clients have learned of this through the grapevine and have contacted me to discuss.&amp;#8221;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;&lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/a3036352c84163a2/2b0c7904537b89d4#2b0c7904537b89d4"&gt;Follow the discussion&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Three things Tim&amp;#8217;s learned from Freelancing Rails&lt;/h3&gt;


	&lt;p&gt;Tim Case shared his experience of freelancing with Ruby on Rails and highlights three things that he&amp;#8217;s learned.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;The non-code business aspect of Freelancing is demanding. &lt;/li&gt;
		&lt;li&gt;It takes 10 hours to bill 6 to 8.&lt;/li&gt;
		&lt;li&gt;Figuring out your rate is hard.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Read the &lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/85d38e8e613aad22/e40445bbae689249#e40445bbae689249"&gt;rest of Tim&amp;#8217;s observations and the discussion the followed&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Client issue tracking and documentation&lt;/h3&gt;


	&lt;p&gt;Jeff Judge writes, &amp;#8220;Hello all! I was curious to here how people are handling client issue tracking and documentation.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Several applications were mentioned for handling issue tracking and the general consensus was that there was still a lot to be desired that current options didn&amp;#8217;t provide. Be sure to &lt;a href="http://groups.google.com/group/rails-business/browse_thread/thread/3219076d080c77a2/f7d09645b372cd08#f7d09645b372cd08"&gt;follow the discussions&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Join the Community&lt;/h3&gt;


	&lt;p&gt;These were just a small handfull of the discussions that have taken place over the past several weeks. If you&amp;#8217;re an aspiring Rails freelancer or business owner, be sure to &lt;a href="http://groups.google.com/group/rails-business/subscribe"&gt;join the community&lt;/a&gt; and share your experiences and learn from other members of the community that are willing to share theirs.&lt;/p&gt;


	&lt;p&gt;Until next time, have fun!&lt;/p&gt;
</description>
      <pubDate>Sun, 05 Aug 2007 10:37:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e4e3e478-abe8-484c-af51-09d7ebb19e96</guid>
      <author>Robby Russell</author>
      <link>http://www.robbyonrails.com/articles/2007/08/05/rails-business-weekly-review-3</link>
      <category>Business</category>
      <category>Ruby on Rails</category>
      <category>Programming</category>
      <category>business</category>
      <category>rails</category>
      <category>rubynrails</category>
      <category>clients</category>
      <category>group</category>
      <category>community</category>
    </item>
    <item>
      <title>Spec Your Views</title>
      <description>&lt;p&gt;I meant to work on this post&amp;#8230; oh about 7 months ago.&lt;/p&gt;


	&lt;p&gt;Way back in January (7 months ago), Jamis Buck posted an article titled, &lt;a href="http://weblog.jamisbuck.org/2007/1/29/testing-your-views"&gt;Testing your views&lt;/a&gt;, which gave a few tips on using Test::Unit to, as the title suggests, test your views.&lt;/p&gt;


	&lt;p&gt;While, I&amp;#8217;m not going to rewrite everything that Jamis wrote, I&amp;#8217;d like to show you how to test these views with RSpec. (you might take a moment to quickly read his post&amp;#8230;)&lt;/p&gt;


	&lt;p&gt;In this example, I&amp;#8217;m going to show you how we&amp;#8217;re able to write specs for the following &lt;span class="caps"&gt;RHTML&lt;/span&gt;, which  you&amp;#8217;ll notice matches the code that he wrote tests for.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  &amp;lt;% if @user.administrator? %&amp;gt;
    Hi &amp;lt;%= @user.name %&amp;gt;! You appear to be an administrator.
    &amp;lt;%= link_to "Click here", admin_url, :id =&amp;gt; "admin_link" %&amp;gt;
    to see the admin stuff!
  &amp;lt;% end %&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Jamis writes, &lt;em&gt;&amp;#8220;The only really significant thing you ought to be testing here is that the admin link only shows up for administrators. &amp;#8220;&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;So, let&amp;#8217;s do just that, but with RSpec.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m not sure how Jamis is handling his view tests, but we&amp;#8217;re going to approach our view specs, much like we approach our controller specs, with the use of mocks and stubs, because we really d