<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>knock.on_wood</title><link>http://ryanwood.com/</link><description>unclear thoughts on software development</description><language>en</language><managingEditor>noemail@noemail.org (Ryan Wood)</managingEditor><lastBuildDate>Tue, 07 Jul 2009 06:28:40 PDT</lastBuildDate><feedburner:browserFriendly xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" /><itunes:owner><itunes:email>noemail@noemail.org</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:subtitle>unclear thoughts on software development</itunes:subtitle><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/sourcescape" type="application/rss+xml" /><item><title>Haml/Sass 2.2 is out</title><link>http://ryanwood.com/past/2009/7/7/hamlsass-22-is-out/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Tue, 07 Jul 2009 06:28:40 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/7/7/hamlsass-22-is-out/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Anyone who knows me knows that I&#8217;m a big fan of Haml and Sass. They simplify and clean up so much HTML-related code. The new version promises some <a href='http://nex-3.com/posts/84-haml-sass-2-2-released'>nice new features</a>.</p>]]></content:encoded><description>&lt;p&gt;Anyone who knows me knows that I&amp;#8217;m a big fan of Haml and Sass. They simplify and clean up so much HTML-related code. The new version promises some &lt;a href='http://nex-3.com/posts/84-haml-sass-2-2-released'&gt;nice new features&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Improving by gits and bounds</title><link>http://ryanwood.com/past/2009/6/20/improving-by-gits-and-bounds/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Sat, 20 Jun 2009 09:23:37 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/6/20/improving-by-gits-and-bounds/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Subversion (SVN) has been a staple of my development process since I ran kicking and screaming out of the Visual SourceSafe (VSS) dungeon many years old. It has served me very well. I used the basic edit-commit-merge life-cycle and all was good. Here’s the strange thing.</p>

<p><strong>I didn’t really learn how to use subversion specifically, or really version control in general, until I quit using subversion and started using git.</strong></p>

<p>The evolution started with VSS. Essentially it was a code backup. We did the occasionally file rollback, but that was it. Write code and periodically check it in, comment-less of course. I had a brief affair with SourceGear Vault. It was a much improved replacement for VSS. Though it fixed a lot of the bugs and other issues in VSS, but as I move more away from the Microsoft world, it became less useful.</p>

<p>Enter subversion.</p>

<p>What a breath of fresh air. Edit-merge-commit. Open source. Quicker. Concurrent development. Nice. Then I started learning about branches and tags. Wow, those could be useful. “Could” being the important word. Using branches and merging in SVN is certainly possible, but trivial. So I used them occasionally, but never with confidence or as any core part of my development process.</p>

<p><span>Then the cool kids started chanting “git, git, git”.</span></p>

<p>So I checked out what all the fuss was about like any good hopelessly addicted to new technology freak would do. Git was hard and a bit scary. Yeah, the whole “clone, add, commit” thing was fine, but start talking about rebasing and my head hurt. Git 101 tutorials will only take you so far and the rest you have to learn in the trenches.</p>

<p>I’m a few months out now and I wouldn’t go back. Oh wait. I have to. I still have a slew of projects in SVN. As I go back to those projects, I’m using SVN in ways I never would have previously.</p>

<p>Yesterday I had a bug to fix in a production app on Rails 2.0.1. It has been running without issue for over a year. So I go into my dev machine to make a quick fix and realize that I started to upgrade the app to 2.1.0 about 6 months ago. I have 6 or so commits but never deployed any of the changes. I can’t deploy them because they were never finished. mmmm.</p>

<p>Before git, I’d probably just make the changes on the server and back the code into the trunk. Gong. Being much more comfortable with branching and merging from working with git, I simply created a stable-1.0 branch off of the revision that was last deployed, applied the changes there. A quick update to my deploy.rb file pull from the branch rather than trunk and then<code><span class="ident">cap</span> <span class="ident">deploy</span></code>. Done.</p>

<p>My point of this ramble is that choosing to work with new (different) technologies matures you as a developer. And the things you learn will give you a new, and generally better, perspective even when you work within your wheelhouse.</p>]]></content:encoded><description>&lt;p&gt;Subversion (SVN) has been a staple of my development process since I ran kicking and screaming out of the Visual SourceSafe (VSS) dungeon many years old. It has served me very well. I used the basic edit-commit-merge life-cycle and all was good. Here’s the strange thing.&lt;/p&gt;
</description></item><item><title>Slither: a DSL for parsing fixed-width text files</title><link>http://ryanwood.com/past/2009/6/12/slither-a-dsl-for-parsing-fixed-width-text-files/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Fri, 12 Jun 2009 13:54:19 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/6/12/slither-a-dsl-for-parsing-fixed-width-text-files/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Given the rage over XML and web services over the past decade or so, I was shocked at how common it is to still exchange data using a fixed-width file format over FTP. I guess it&#8217;s all about those mainframes and backward compatibility, but &#8220;WOW&#8221;.</p>

<p>At <a href='http://firstdata.com'>work</a> I have had numerous projects (mostly in Ruby) that involve creating and/or reading these fixed-width text files. Occasionally, I have the luxury of a CSV file and can use <a href='http://fastercsv.rubyforge.org/'>FasterCSV</a> to take care of business. To date, I haven&#8217;t had a single project that used XML.</p>

<p>Given the need, I decided to create an open source project. I had to work on it primarily on my own time, as our work environment is not what you would call &#8220;open source friendly&#8221;. So, <a href='http://github.com/ryanwood/slither/tree/master'>slither</a> was born.</p>

<h2 id='definitions'>Definitions</h2>

<p>Here&#8217;s a simple example. Assume you have the following file format:</p>
<style> 
  table#def { border-collapse: collapse; }
  table#def td { width: 100px; border: 1px solid #999; text-align: center;} 
</style><table id='def'>
<tr><th>Position</th><th>Lenth</th><th>Field</th><th>Align</th></tr>
<tr><td>0</td><td>8</td><td>Date</td><td>-</td></tr>
<tr><td>8</td><td>4</td><td>Year</td><td>-</td></tr>
<tr><td>12</td><td>20</td><td>Make</td><td>left</td></tr>
<tr><td>32</td><td>20</td><td>Model</td><td>left</td></tr>
<tr><td>52</td><td>10</td><td>Name</td><td>left</td></tr>
<tr><td>62</td><td>6</td><td>Price</td><td>right</td></tr>
</table>
<p>Here&#8217;s a sample file (cars.txt).</p>

<pre><code><span class="number">200606011999</span><span class="constant">BMW</span>                 <span class="number">325</span>                <span class="constant">Smith</span>      <span class="number">45500</span>
<span class="number">200506011993</span><span class="constant">Honda</span>               <span class="constant">Accord</span>             <span class="constant">Wood</span>        <span class="number">7500</span>
<span class="number">200601022006</span><span class="constant">Lexus</span>               <span class="number">350</span>                <span class="constant">Johnson</span>    <span class="number">25365</span></code></pre>

<p>Given this file, we would first need to create a slither definition.</p>

<pre><code><span class="constant">Slither</span><span class="punct">.</span><span class="ident">define</span> <span class="symbol">:cars</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">d</span><span class="punct">|</span>
  <span class="ident">d</span><span class="punct">.</span><span class="ident">section</span><span class="punct">,</span> <span class="symbol">:body</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">body</span><span class="punct">|</span>
    <span class="comment"># The trap is not very useful here since there is only one section</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">trap</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">line</span><span class="punct">|</span> <span class="ident">line</span> <span class="punct">=~</span> <span class="punct">/</span><span class="regex">^<span class="escape">\d</span>{8}</span><span class="punct">/</span> <span class="punct">}</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:date</span><span class="punct">,</span> <span class="number">8</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:year</span><span class="punct">,</span> <span class="number">4</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:make</span><span class="punct">,</span> <span class="number">20</span><span class="punct">,</span> <span class="symbol">:align</span> <span class="punct">=&gt;</span> <span class="symbol">:left</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:model</span><span class="punct">,</span> <span class="number">20</span><span class="punct">,</span> <span class="symbol">:align</span> <span class="punct">=&gt;</span> <span class="symbol">:left</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:name</span><span class="punct">,</span> <span class="number">10</span><span class="punct">,</span> <span class="symbol">:align</span> <span class="punct">=&gt;</span> <span class="symbol">:left</span>
    <span class="ident">body</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:price</span><span class="punct">,</span> <span class="number">6</span>
  <span class="keyword">end</span>
<span class="keyword">end</span></code></pre>

<h2 id='parsing'>Parsing</h2>

<p>From there we could parse the above file like this:</p>

<pre><code><span class="comment"># Arguments are the file path and the definition name</span>
<span class="ident">parsed_data</span> <span class="punct">=</span> <span class="constant">Slither</span><span class="punct">.</span><span class="ident">parse</span><span class="punct">(&quot;</span><span class="string">cars.txt</span><span class="punct">&quot;,</span> <span class="symbol">:cars</span><span class="punct">).</span><span class="ident">inspect</span></code></pre>

<p>It should return a hash with nested arrays keyed by section.</p>

<pre><code><span class="ident">result</span> <span class="punct">=</span> <span class="punct">{</span>
  <span class="symbol">:body</span> <span class="punct">=&gt;</span> <span class="punct">[</span>
    <span class="punct">{</span> <span class="symbol">:date</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">20060601</span><span class="punct">&quot;,</span> 
      <span class="symbol">:year</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">1999</span><span class="punct">&quot;,</span> 
      <span class="symbol">:make</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">BWW</span><span class="punct">&quot;,</span> 
      <span class="symbol">:model</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">325</span><span class="punct">&quot;,</span> 
      <span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">Smith</span><span class="punct">&quot;,</span> 
      <span class="symbol">:price</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">45500</span><span class="punct">&quot;</span> <span class="punct">},</span>
    <span class="punct">...</span>
  <span class="punct">]</span>
<span class="punct">}</span></code></pre>

<h2 id='generating'>Generating</h2>

<p>To generate a file, simply do the opposite. Create a properly formatted hash and call generate:</p>

<pre><code><span class="comment"># Generates the file as a string</span>
<span class="ident">puts</span> <span class="constant">Slither</span><span class="punct">.</span><span class="ident">generate</span><span class="punct">(</span><span class="symbol">:cars</span><span class="punct">,</span> <span class="ident">my_car_hash</span><span class="punct">)</span>

<span class="comment"># Writes the file</span>
<span class="constant">Slither</span><span class="punct">.</span><span class="ident">write</span><span class="punct">(&quot;</span><span class="string">cars.txt</span><span class="punct">&quot;,</span> <span class="symbol">:cars</span><span class="punct">,</span> <span class="ident">my_car_hash</span><span class="punct">)</span></code></pre>

<h2 id='just_the_beginning'>Just the Beginning</h2>

<p>There are many more things that Slither can do:</p>

<ul>
<li>headers and footers</li>

<li>templated sections</li>

<li>typecasting</li>

<li>formatting</li>

<li>validation (not quite there yet)</li>
</ul>

<p>So go ahead and install the gem or <a href='http://github.com/ryanwood/slither/tree/master'>fork the Github project</a> if you&#8217;re interested in hacking.</p>

<pre><code><span class="comment"># Run the following if you haven&quot;t already:</span>
<span class="ident">gem</span> <span class="ident">sources</span> <span class="punct">-</span><span class="ident">a</span> <span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">gems</span><span class="punct">.</span><span class="ident">github</span><span class="punct">.</span><span class="ident">com</span>
<span class="comment"># Install the gem(s):</span>
<span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">ryanwood</span><span class="punct">-</span><span class="ident">slither</span></code></pre>]]></content:encoded><description>&lt;p&gt;Given the rage over XML and web services over the past decade or so, I was shocked at how common it is to still exchange data using a fixed-width file format over FTP. I guess it&amp;#8217;s all about those mainframes and backward compatibility, but &amp;#8220;WOW&amp;#8221;.&lt;/p&gt;
</description></item><item><title>whenever: cron...the Ruby Way</title><link>http://ryanwood.com/past/2009/6/11/whenever-cron-the-ruby-way/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Thu, 11 Jun 2009 06:16:08 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/6/11/whenever-cron-the-ruby-way/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Many Rails app need to make use of cron in some form or fashion. <a href='http://github.com/javan/whenever/tree/master'>Whenever</a> is a great little DSL for creating, organizing, managing, and deploying your app related cron jobs.</p>

<p>Here&#8217;s an example from the <a href='http://wiki.github.com/javan/whenever/instructions-and-examples'>wiki</a>. You simply install the gem and run <code><span class="ident">wheneverize</span></code> in your root dir. Then add the following to your <code><span class="ident">config</span><span class="punct">/</span><span class="ident">schedule</span><span class="punct">.</span><span class="ident">rb</span></code> file:</p>

<pre><code><span class="ident">set</span> <span class="symbol">:path</span><span class="punct">,</span> <span class="punct">&quot;</span><span class="string">/var/www/apps/my_app</span><span class="punct">&quot;</span> 

<span class="ident">every</span> <span class="number">10</span><span class="punct">.</span><span class="ident">minutes</span> <span class="keyword">do</span>
  <span class="ident">runner</span> <span class="punct">&quot;</span><span class="string">MyModel.some_process</span><span class="punct">&quot;</span> 
  <span class="ident">rake</span> <span class="punct">&quot;</span><span class="string">my:rake:task</span><span class="punct">&quot;</span>  
  <span class="ident">command</span> <span class="punct">&quot;</span><span class="string">/usr/bin/my_great_command</span><span class="punct">&quot;</span> 
<span class="keyword">end</span></code></pre>

<p>will yield&#8230;</p>

<pre><code><span class="number">0</span><span class="punct">,</span><span class="number">10</span><span class="punct">,</span><span class="number">20</span><span class="punct">,</span><span class="number">30</span><span class="punct">,</span><span class="number">40</span><span class="punct">,</span><span class="number">50</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">/</span><span class="regex">var</span><span class="punct">/</span><span class="ident">www</span><span class="punct">/</span><span class="ident">apps</span><span class="punct">/</span><span class="ident">my_app</span><span class="punct">/</span><span class="ident">script</span><span class="punct">/</span><span class="ident">runner</span> <span class="punct">-</span><span class="ident">e</span> <span class="ident">production</span> <span class="punct">&quot;</span><span class="string">MyModel.some_process</span><span class="punct">&quot;</span> 

<span class="number">0</span><span class="punct">,</span><span class="number">10</span><span class="punct">,</span><span class="number">20</span><span class="punct">,</span><span class="number">30</span><span class="punct">,</span><span class="number">40</span><span class="punct">,</span><span class="number">50</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">*</span> <span class="ident">cd</span> <span class="punct">/</span><span class="ident">var</span><span class="punct">/</span><span class="ident">www</span><span class="punct">/</span><span class="ident">apps</span><span class="punct">/</span><span class="ident">my_app</span> <span class="punct">&amp;&amp;</span> <span class="constant">RAILS_ENV</span><span class="punct">=</span><span class="ident">production</span> <span class="punct">/</span><span class="ident">usr</span><span class="punct">/</span><span class="ident">bin</span><span class="punct">/</span><span class="ident">env</span> <span class="ident">rake</span> <span class="ident">my</span><span class="symbol">:rake:task</span>

<span class="number">0</span><span class="punct">,</span><span class="number">10</span><span class="punct">,</span><span class="number">20</span><span class="punct">,</span><span class="number">30</span><span class="punct">,</span><span class="number">40</span><span class="punct">,</span><span class="number">50</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">*</span> <span class="punct">/</span><span class="regex">usr</span><span class="punct">/</span><span class="ident">bin</span><span class="punct">/</span><span class="ident">my_great_command</span></code></pre>

<p>For more on setup and deployment, see the <a href='http://github.com/javan/whenever/tree/master'>README</a>. RubyInside has a <a href='http://www.rubyinside.com/whenever-a-ruby-dsl-for-defining-cron-jobs-1835.html'>nice review</a> as well.</p>]]></content:encoded><description>&lt;p&gt;Many Rails app need to make use of cron in some form or fashion. &lt;a href='http://github.com/javan/whenever/tree/master'&gt;Whenever&lt;/a&gt; is a great little DSL for creating, organizing, managing, and deploying your app related cron jobs.&lt;/p&gt;
</description></item><item><title>git cherry to the rescue</title><link>http://ryanwood.com/past/2009/6/5/git-cherry-to-the-rescue/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Fri, 05 Jun 2009 07:02:49 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/6/5/git-cherry-to-the-rescue/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I&#8217;ve been trying to find a simple way to find out the commit differences in two git branches for while now. I resorted to using <code><span class="ident">git</span> <span class="ident">show</span><span class="punct">-</span><span class="ident">branch</span></code> which works pretty well, but can get cumbersome when you have a lot of branches. I just discovered <a href='http://kernel.org/pub/software/scm/git/docs/git-cherry.html'><code><span class="ident">git</span> <span class="ident">cherry</span></code></a> is just want I&#8217;ve been looking for.</p>

<p>This will show the commit differences between my-dev-branch and master.</p>

<pre><code><span class="global">$ </span><span class="ident">git</span> <span class="ident">checkout</span> <span class="ident">my</span><span class="punct">-</span><span class="ident">dev</span><span class="punct">-</span><span class="ident">branch</span>
<span class="global">$ </span><span class="ident">git</span> <span class="ident">cherry</span> <span class="punct">-</span><span class="ident">v</span> <span class="ident">master</span>
<span class="punct">+</span> <span class="ident">cf9221200cb9574e3cc92fa72570f9813b86af24</span> <span class="constant">Moved</span> <span class="ident">configuration</span> <span class="ident">out</span> <span class="ident">of</span> <span class="ident">lib</span> <span class="ident">folder</span>
<span class="punct">+</span> <span class="number">32</span><span class="ident">c456574cb58a2a8c9b354b5eca56b6f28bab82</span> <span class="constant">Fixed</span> <span class="ident">some</span> <span class="ident">bugs</span></code></pre>

<p>I guess It pays to start digging deeper into the underlying git commands.</p>]]></content:encoded><description>&lt;p&gt;I&amp;#8217;ve been trying to find a simple way to find out the commit differences in two git branches for while now. I resorted to using &lt;code&gt;&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;branch&lt;/span&gt;&lt;/code&gt; which works pretty well, but can get cumbersome when you have a lot of branches. I just discovered &lt;a href='http://kernel.org/pub/software/scm/git/docs/git-cherry.html'&gt;&lt;code&gt;&lt;span class="ident"&gt;git&lt;/span&gt; &lt;span class="ident"&gt;cherry&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is just want I&amp;#8217;ve been looking for.&lt;/p&gt;
</description></item><item><title>MacUpdate Spring 2009 Bundle</title><link>http://ryanwood.com/past/2009/5/29/macupdate-spring-2009-bundle/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Fri, 29 May 2009 07:00:56 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/5/29/macupdate-spring-2009-bundle/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>For you mac users, check out the <a href='http://www.mupromo.com/'>MacUpdate Spring Bundle</a>. It&#8217;s similar to the rockin&#8217; <a href='http://www.macheist.com/'>MacHeist Bundle</a> that was offered a month or so ago. For $49 you get 11+ great apps including <a href='http://www.parallels.com/'>Parallels</a> and <a href='http://www.micromat.com/index.php?option=com_content&amp;task=view&amp;id=202&amp;Itemid=107'>TechTool Pro</a>. Sold.</p>]]></content:encoded><description>&lt;p&gt;For you mac users, check out the &lt;a href='http://www.mupromo.com/'&gt;MacUpdate Spring Bundle&lt;/a&gt;. It&amp;#8217;s similar to the rockin&amp;#8217; &lt;a href='http://www.macheist.com/'&gt;MacHeist Bundle&lt;/a&gt; that was offered a month or so ago. For $49 you get 11+ great apps including &lt;a href='http://www.parallels.com/'&gt;Parallels&lt;/a&gt; and &lt;a href='http://www.micromat.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=202&amp;amp;Itemid=107'&gt;TechTool Pro&lt;/a&gt;. Sold.&lt;/p&gt;</description></item><item><title>Git - Making the Switch</title><link>http://ryanwood.com/past/2009/5/28/git-making-the-switch/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Thu, 28 May 2009 03:54:53 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/5/28/git-making-the-switch/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I am using <a href='http://git-scm.com/'>git</a> for all new projects. For the active ones that are still on <a href='http://subversion.tigris.org/'>subversion</a> I&#8217;m using <a href='http://www.kernel.org/pub/software/scm/git-core/docs/git-svn.html'>git-svn</a>. It is true&#8211; git-svn is a <a href='http://www.robbyonrails.com/articles/2008/04/10/git-svn-is-a-gateway-drug'>gateway drug</a>. While git provides a number of <a href='http://whygitisbetterthanx.com/#svn'>advantages over subversion</a>, there are a number of hurdles to overcome if you decide to switch.</p>

<h2 id='command_line'>Command Line</h2>

<p>One of the toughest areas, is getting comfortable with the command line. Most of the subversion users I know rarely, if ever, use the <code><span class="ident">svn</span></code> command line utility. The simply stick with a nice GUI client. When learning git I would argue that you <em>need</em> to learn the command line. If you don&#8217;t understand what is going on under the covers, you can really end up in a ditch. The <a href='http://git-scm.com/documentation'>documentation</a> is pretty good, but unless you are a command line junkie, it will take some time to move your version control mindset over.</p>

<p>And make sure you keep your install current. There has been <a href='http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/'>lots of good stuff</a> added in recent days.</p>

<h2 id='it_takes_thought'>It Takes Thought</h2>

<p>The power of git comes at the price of understanding. Version control becomes more than a simple &#8220;right-click and commit every once in a while&#8221; endeavor. Git allows you to craft your commits so your repository is clean and tells a story of how your app developed. Using rebase you can rewrite, combine, remove and edit commits. It crazy and dangerous and comes with significant responsibility, but the price is worth it. <a href='http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive-?cos=1'>Check this out</a>.</p>

<h2 id='confidence'>Confidence</h2>

<p>The biggest hurdle for me was gaining confidence that I could be productive and wasn&#8217;t going to destroy my applications inadvertently. The resources available are getting <a href='http://git-scm.com/'>better</a> and <a href='http://www.gitcasts.com/'>better</a> and <a href='http://gitready.com/'>better</a>. However, confidence only comes with experience. It doesn&#8217;t matter how many books you read on dating, at some point, you have to walk up to that personal and ask them out. Confidence requires action. Luckily, git won&#8217;t throw a drink in your face or laugh at you.</p>

<p>If you&#8217;re on a steady diet of svn, <a href='http://git.or.cz/course/svn.html'>compare</a> and give git a try. You know you want to.</p>]]></content:encoded><description>&lt;p&gt;I am using &lt;a href='http://git-scm.com/'&gt;git&lt;/a&gt; for all new projects. For the active ones that are still on &lt;a href='http://subversion.tigris.org/'&gt;subversion&lt;/a&gt; I&amp;#8217;m using &lt;a href='http://www.kernel.org/pub/software/scm/git-core/docs/git-svn.html'&gt;git-svn&lt;/a&gt;. It is true&amp;#8211; git-svn is a &lt;a href='http://www.robbyonrails.com/articles/2008/04/10/git-svn-is-a-gateway-drug'&gt;gateway drug&lt;/a&gt;. While git provides a number of &lt;a href='http://whygitisbetterthanx.com/#svn'&gt;advantages over subversion&lt;/a&gt;, there are a number of hurdles to overcome if you decide to switch.&lt;/p&gt;
</description></item><item><title>Googling Myself</title><link>http://ryanwood.com/past/2009/5/27/googling-myself/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Wed, 27 May 2009 16:23:40 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/5/27/googling-myself/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>For some reason I googled myself tonight. Of interest, I found that I am:</p>

<ul>
<li><a href='http://wiki.answers.com/Q/How_did_Ryan_Wood_bay_area_rapper_known_as_Woodie_die'>a rapper</a></li>

<li><a href='http://woodyart.blogspot.com/'>an artist</a></li>

<li><a href='http://www.deadtroll.com/video/pitchingmother.html'>a film maker</a></li>

<li><a href='http://www.modelmayhem.com/162883'>a model</a></li>

<li><a href='http://www.goduke.com/ViewArticle.dbml?DB_OEM_ID=4200&amp;ATCLID=157382'>a wide receiver</a></li>

<li><a href='http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=30565'>a left wing</a></li>

<li><a href='http://lawyers.law.cornell.edu/lawyer/ryan-wood-1481538'>a lawyer</a></li>

<li><a href='http://www.healthgrades.com/directory_search/physician/profiles/dr-md-reports/Dr-Ryan-Wood-DO-461F1C8B.cfm'>a doctor</a></li>

<li><a href='http://www.youtube.com/watch?v=y0dBZQE7lNQ'>a guitarist</a></li>

<li><a href='http://ryanwoodconsulting.com/'>a consultant</a></li>

<li><a href='http://www.ryanandwood.com/'>a distillery</a></li>

<li><a href='http://ryanwoodbaptist.org/'>a church</a></li>
</ul>

<p>My parents should be proud!</p>]]></content:encoded><description>&lt;p&gt;For some reason I googled myself tonight. Of interest, I found that I am:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://wiki.answers.com/Q/How_did_Ryan_Wood_bay_area_rapper_known_as_Woodie_die'&gt;a rapper&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://woodyart.blogspot.com/'&gt;an artist&lt;/a&gt;&lt;/li&gt;
</description></item><item><title>The Ruby Toolbox</title><link>http://ryanwood.com/past/2009/5/27/the-ruby-toolbox/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Wed, 27 May 2009 05:06:50 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/5/27/the-ruby-toolbox/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Speaking of gems, <a href='http://www.rubyinside.com'>Ruby Inside</a> has a <a href='http://www.rubyinside.com/the-ruby-toolbox-see-the-most-popular-ruby-libraries-by-usage-1776.html'>great post</a> on the <a href='http://ruby-toolbox.com/'>Ruby ToolBox</a>.</p>

<blockquote>
<p>&#8220;The Ruby Toolbox gives Ruby developers a categorized overview of 100 or so different libraries ranked on how commonly used they are. It&#8217;s not perfect as it only pays attention to projects hosted on Github and the ranking system is based on the number of watchers and forks they have, but it&#8217;s enough to give you a basic overview of the activity within a certain area.&#8221;</p>
</blockquote>

<p>It&#8217;s a really nice resource to look at when trying to pick a plugin for a particular task when there are just too many to choose from. <a href='http://gems.rubyforge.org/stats.html'>RubyForge has stats</a> as well.</p>

<p><img src='http://ruby-toolbox.com/images/Toolbox_Red-256x256.png' alt='Toolbox' /></p>]]></content:encoded><description>&lt;p&gt;Speaking of gems, &lt;a href='http://www.rubyinside.com'&gt;Ruby Inside&lt;/a&gt; has a &lt;a href='http://www.rubyinside.com/the-ruby-toolbox-see-the-most-popular-ruby-libraries-by-usage-1776.html'&gt;great post&lt;/a&gt; on the &lt;a href='http://ruby-toolbox.com/'&gt;Ruby ToolBox&lt;/a&gt;.&lt;/p&gt;
</description></item><item><title>Fresh Gems</title><link>http://ryanwood.com/past/2009/5/27/fresh-gems/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ryan Wood</dc:creator><pubDate>Wed, 27 May 2009 03:52:59 PDT</pubDate><guid isPermaLink="true">http://ryanwood.com/past/2009/5/27/fresh-gems/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Every 6 months or so I do a head&#8217;s down exploration of new <a href='http://en.wikipedia.org/wiki/RubyGems'>gems</a> out there in the Ruby world. The speed of progress int he open source world amazes me. For those that are interested, here are some of my recent findings:</p>

<ul>
<li><a href='http://github.com/binarylogic/authlogic/tree/master'>authlogic</a>: an excellent authentication framework for Ruby and Rails. It&#8217;s quickly replacing <a href='http://github.com/technoweenie/restful-authentication/tree/master'>restful_authentication</a> as the standard.</li>

<li><a href='http://github.com/binarylogic/settingslogic/tree/master'>settingslogic</a>: a small app config gem similar to <a href='http://github.com/cjbottaro/app_config/tree/master'>app_config</a>.</li>

<li><a href='http://trollop.rubyforge.org/'>trollop</a>: a <em>great</em> command line parser for ruby apps. Beats the tar out of optparse.</li>

<li><a href='http://github.com/thoughtbot/factory_girl/tree/master'>factory_girl</a>: a solid replacement for fixtures</li>

<li><a href='http://sinatrarb.com'>sinatra</a>: a lightweight HTTP server. Very nice.</li>

<li><a href='http://logging.rubyforge.org/'>logging</a>: a replacements for the aging, outdated <a href='http://log4r.sourceforge.net/'>log4r</a> project.</li>
</ul>]]></content:encoded><description>&lt;p&gt;Every 6 months or so I do a head&amp;#8217;s down exploration of new &lt;a href='http://en.wikipedia.org/wiki/RubyGems'&gt;gems&lt;/a&gt; out there in the Ruby world. The speed of progress int he open source world amazes me. For those that are interested, here are some of my recent findings:&lt;/p&gt;
</description></item><media:rating>nonadult</media:rating></channel></rss>
