<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Jason Rudolph</title>
 
 <link href="http://jasonrudolph.com/" />
 <updated>2009-11-03T23:17:05-05:00</updated>
 <id>http://jasonrudolph.com/</id>
 <author>
   <name>Jason Rudolph</name>
   <email>contact@jasonrudolph.com</email>
 </author>

 
 <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><link rel="self" href="http://feeds.feedburner.com/jasonrudolph" type="application/atom+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/jasonrudolph" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=Jason%20Rudolph&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fjasonrudolph&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
   <title>Live JavaScript TDD Action Coming to raleigh.rb</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/S2ZZImZ82hw/" />
   <updated>2009-07-15T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/07/15/live-javascript-tdd-action-coming-to-raleighrb</id>
   <content type="html">&lt;p&gt;Next week at raleigh.rb, &lt;a href="http://tech.hickorywind.org/" title="HickoryTech"&gt;Larry Karnowski&lt;/a&gt; and I are pairing up for a round of live test-driven JavaScript development with &lt;a href="http://github.com/relevance/blue-ridge" title="github.com/relevance/blue-ridge - JavaScript BDD Rails Plugin"&gt;Blue Ridge&lt;/a&gt;. Come see how easy and natural it can be to give your JavaScript code the testing love it deserves.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.meetup.com/raleighrb/calendar/10355088/" title="The Raleigh-area Ruby Brigade July Meeting - Javascript Testing in Rails: Fast, Headless, In-browser. Pick Any Three. [Larry Karnowski &amp;amp; Jason Rudolph]"&gt;meetup&lt;/a&gt; is at 7 PM on Tuesday, July 21.  Hope to see you there!&lt;/p&gt;

&lt;p&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5199836&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=1&amp;amp;amp;show_byline=1&amp;amp;amp;show_portrait=0&amp;amp;amp;color=&amp;amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5199836&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=1&amp;amp;amp;show_byline=1&amp;amp;amp;show_portrait=0&amp;amp;amp;color=&amp;amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://vimeo.com/5199836"&gt;Watch the preview on Vimeo&lt;/a&gt;. (Courtesy of &lt;a href="http://matthewbass.com"&gt;Matthew Bass&lt;/a&gt;.)&lt;/small&gt;&lt;/p&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=S2ZZImZ82hw:pPKstXKKRho:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=S2ZZImZ82hw:pPKstXKKRho:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=S2ZZImZ82hw:pPKstXKKRho:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/S2ZZImZ82hw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/07/15/live-javascript-tdd-action-coming-to-raleighrb/</feedburner:origLink></entry>
 
 <entry>
   <title>Git Up! 10 Reasons to Upgrade Your Old Git Installation</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/9hymiLsmXfA/" />
   <updated>2009-05-27T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation</id>
   <content type="html">&lt;p&gt;Git has seen a huge influx of newcomers over the past year.  Many folks installed Git as they read through their first tutorial, got it working, and are still using that same trusty installation today.  But rest assured, Git has not been standing still.&lt;/p&gt;

&lt;p&gt;If you installed Git a year ago (perhaps when Rails made the move in April of last year), you would've grabbed v1.5.5. The Git team has cranked out &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;five&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt" title="Git 1.6.0 Release Notes"&gt;feature&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.1.txt" title="Git 1.6.1 Release Notes"&gt;releases&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.2.txt" title="Git 1.6.2 Release Notes"&gt;since&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;then&lt;/a&gt;, full of usability improvements, a few new tricks, and, of course, numerous bug fixes.  So it's time for some spring cleaning of your dusty old Git installation.&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;If you're not yet sportin' the 1.6.3 hotness, here are ten reasons to Git up!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flickr.com/photos/midnight-digital/1878360316" title="Image courtesy of Midnight Digital (flickr.com/midnight-digital)"&gt;&lt;img src="http://jasonrudolph.com/resources/20090527-git-up.png" title="Image courtesy of Midnight Digital (flickr.com/midnight-digital)" alt="Git Up!" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Everyone's crazy-fast VCS is even faster: &lt;code&gt;git clone&lt;/code&gt; and &lt;code&gt;git merge&lt;/code&gt; have been rewritten in C. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;] [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt" title="Git 1.6.0 Release Notes"&gt;1.6.0&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Viewing your staged changes no longer requires a cheatsheet in order to remember the command: &lt;code&gt;git diff --staged&lt;/code&gt; serves as a substantially-more-obvious synonym to &lt;code&gt;git diff --cached&lt;/code&gt;.  [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.1.txt" title="Git 1.6.1 Release Notes"&gt;1.6.1&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Stashes always remember where they came from and make it easy to get back there: &lt;code&gt;git stash branch &amp;lt;branchname&amp;gt; [&amp;lt;stash&amp;gt;]&lt;/code&gt; creates a new branch starting at the commit at which the stash was created, checks out the branch, and applies the stash. The stash is guaranteed to apply cleanly, no matter how much the rest of your fast-movin' repo has changed. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt" title="Git 1.6.0 Release Notes"&gt;1.6.0&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you mistype a command, Git offers a helping hand: Clippy says, "It looks like you're trying to use SVN." [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.1.txt" title="Git 1.6.1 Release Notes"&gt;1.6.1&lt;/a&gt;]&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git stat
git: 'stat' is not a git-command. See 'git --help'.

Did you mean this?
    status
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Branch navigation adopts basic filesystem navigation idioms: Use &lt;code&gt;git checkout -&lt;/code&gt; to return to the last branch you were on. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.2.txt" title="Git 1.6.2 Release Notes"&gt;1.6.2&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A visualization of the ancestry tree is available without having to leave your terminal: &lt;code&gt;git log --graph&lt;/code&gt; outputs hot ASCII graph pr0n in full technicolor. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;] [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jasonrudolph.com/resources/20090527_git_log_graph_output.png" title="Full color visualization of the ancestry tree using 'get log --graph'"&gt;&lt;img src="http://jasonrudolph.com/resources/20090527_git_log_graph_output_thumb.png" alt="Full color visualization of the ancestry tree using 'get log --graph'" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting a quick, lean log from the command line now requires less typing (and no forced compliments). &lt;code&gt;git log --oneline&lt;/code&gt; replaces the need to use its older, more verbose cousin, &lt;code&gt;git log --pretty=oneline --abbrev-commit&lt;/code&gt;. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;del cite="http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/#comment-11129831" datetime="2009-06-20T15:00:00EDT"&gt;Speaking of things that are easier to type, reaching all the way over to hold down that cockamamie Shift key is hard work. Give yourself a break: If you're on OS X, you no longer need to type "HEAD"; "head" works just the same. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;]&lt;/del&gt; &lt;strong&gt;UPDATE&lt;/strong&gt; - As much as I enjoy that vacation from the Shift key, &lt;a href="http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/#comment-11129831" title="Git Up! 10 Reasons to Upgrade Your Old Git Installation - Comment from Junio Hamano (gitster)"&gt;apparently it is unintended behavior and "may even be considered a bug."&lt;/a&gt;  (Thanks to Junio Hamano for providing the inside scoop.) Allow me to present an alternate: Tidying up your list of remote branches is now possible with a single command: &lt;code&gt;git remote update --prune $remote&lt;/code&gt; fetches updates for the named &lt;code&gt;$remote&lt;/code&gt; repository (e.g., "origin") and prunes any stale tracking branches that you have lying around for that &lt;code&gt;$remote&lt;/code&gt; repo. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Searching for content no longer means scanning line after line to locate the matching text: &lt;code&gt;git grep&lt;/code&gt; now highlights the matches in color. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt" title="Git 1.6.3 Release Notes"&gt;1.6.3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jasonrudolph.com/resources/20090527_git_grep_output.png" title="Colorized output of 'git grep'"&gt;&lt;img src="http://jasonrudolph.com/resources/20090527_git_grep_output_thumb.png" alt="Colorized output of 'git grep'" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The science of Branchology added a few handy new instruments: Use &lt;code&gt;git branch --no-merged&lt;/code&gt; to list the branches that have not yet been merged into the current branch. Use &lt;code&gt;git branch --merged&lt;/code&gt; to see just the opposite. [&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.6.txt" title="Git 1.5.6 Release Notes"&gt;1.5.6&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;And this is by no means an exhaustive list.  An upgrade from v1.5.5 to v1.6.3 includes well over 100 improvements.  While no one of these improvements is revolutionary, they each make this awesome VCS just a tad nicer.  And collectively, they make it well worth the upgrade.&lt;/p&gt;

&lt;p&gt;So what are you waiting for?  Invest five minutes right now to &lt;a href="http://git-scm.com/download" title="Git - Fast Version Control System"&gt;upgrade&lt;/a&gt;.  C'mon.  You're sittin' around reading blogs.  What &lt;em&gt;else&lt;/em&gt; have you got to do?  Git up!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're on OS X, I recommend using MacPorts for quick and easy upgrades.  Let &lt;a href="http://robsanheim.com/2009/01/14/upgrading-git-via-macports/" title="Panasonic Youth &amp;#8211; Upgrading git via MacPorts"&gt;Rob Sanheim show you the way&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Image courtesy of &lt;a href="http://flickr.com/photos/midnight-digital" title="Flickr: midnight-digital's Photostream"&gt;Midnight Digital (flickr.com/midnight-digital)&lt;/a&gt;. [&lt;a href="http://creativecommons.org/licenses/by-nc-sa/2.0/" title="Creative Commons &amp;mdash; Attribution-Noncommercial-Share Alike 2.0 Generic"&gt;Creative Commons License&lt;/a&gt;]&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=9hymiLsmXfA:u_w9moi0o1Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=9hymiLsmXfA:u_w9moi0o1Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=9hymiLsmXfA:u_w9moi0o1Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/9hymiLsmXfA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/05/27/git-up-10-reasons-to-upgrade-your-old-git-installation/</feedburner:origLink></entry>
 
 <entry>
   <title>RailsConf 2009: JavaScript Testing in Rails Projects. No, Seriously!</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/MZsjdiiwYKY/" />
   <updated>2009-03-24T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/03/24/railsconf-2009-javascript-testing-in-rails-projects-no-seriously</id>
   <content type="html">&lt;p&gt;Going to RailsConf in Las Vegas this year?  &lt;a href="http://tech.hickorywind.org/" title="HickoryTech"&gt;Larry Karnowski&lt;/a&gt; and I are presenting a session on &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8013" title="JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three"&gt;giving your JavaScript code the testing love it deserves&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8013" title="JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three -- RailsConf 2009 - O'Reilly Conferences, May 04 - 07, 2009, Las Vegas, NV"&gt;&lt;img src="http://jasonrudolph.com/resources/200903-railsconf-2009.png" alt="RailsConf 2009" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our talk is on Tuesday, May 5 at 1:50 PM in Ballroom B.&lt;br/&gt;
&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three.&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
You wouldn’t consider developing a Rails application without having a solid test suite for your Ruby code, but you’ve somehow convinced yourself to cross your fingers and look the other way when it comes to JavaScript. It doesn’t have to be that way. In this session, you’ll learn how to apply test-driven and behavior-driven development to your unobtrusive JavaScript code in a Rails-friendly manner.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MZsjdiiwYKY:OgZe9zm_ypg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MZsjdiiwYKY:OgZe9zm_ypg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=MZsjdiiwYKY:OgZe9zm_ypg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/MZsjdiiwYKY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/03/24/railsconf-2009-javascript-testing-in-rails-projects-no-seriously/</feedburner:origLink></entry>
 
 <entry>
   <title>Developer Day: Evolving Your Git Workflow, and Much More</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/t7XcF3MId9c/" />
   <updated>2009-03-12T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2009/03/12/developer-day-evolving-your-git-workflow-and-much-more</id>
   <content type="html">&lt;p&gt;Next Saturday, March 21, &lt;a href="http://www.viget.com/" title="Web Strategy, Web Design, Web Development, and Web Marketing at Viget Labs"&gt;Viget Labs&lt;/a&gt; and &lt;a href="http://thinkrelevance.com/" title="Relevance: Agile Development, Consulting and Training"&gt;Relevance, Inc.&lt;/a&gt; are presenting &lt;a href="http://developer-day.com/" title="Developer Day - Durham, NC - March 21st, 2009"&gt;Developer Day&lt;/a&gt;, a one-day conference representing a veritable cornucopia of high-tech awesomeness.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://developer-day.com/" title="Developer Day - Durham, NC - March 21st, 2009"&gt;&lt;img src="http://jasonrudolph.com/resources/200903-developer-day.png" alt="200903 Developer Day" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the rundown:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Staying current with the ever-evolving technological possibilities can be challenging, but you love trying. Why? Because you’re a fantastic web developer who loves building things, (and, frankly, that's just how you roll).&lt;br/&gt;&lt;br/&gt;
Which is why this conference is perfect for you.&lt;br/&gt;&lt;br/&gt;
Hear eight presentations given by active practitioners on topics ranging from JavaScript and Scala to Rails performance and security. Each is tailored to give you insight into various topics that may positively influence how you work, regardless of your specialization.&lt;br/&gt;&lt;br/&gt;
So, come meet cool people, eat some lunch (from local Durham restaurants), and give yourself the day to learn and participate in several great discussions — all for the low, low price of $50.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I'll be speaking about taking your &lt;a href="http://git-scm.com/" title="Git - Fast Version Control System"&gt;Git&lt;/a&gt;-fu to the next level.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Evolving Your Git Workflow&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
Git has attracted many developers away from various centralized source control tools, but it’s easy to find yourself using Git like a slightly-better variant of your old VCS. “You don’t even have to be online to commit. Cool!” That’s a nice touch, but Git has way more to offer, and by picking up a few intermediate and advanced Git techniques, you can save a ton of time (and sanity) for yourself and your team.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Check out the &lt;a href="http://developer-day.com/" title="Developer Day - Durham, NC - March 21st, 2009"&gt;site&lt;/a&gt; for registration and full details. Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=t7XcF3MId9c:UeAw8ggCq1s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=t7XcF3MId9c:UeAw8ggCq1s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=t7XcF3MId9c:UeAw8ggCq1s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/t7XcF3MId9c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/03/12/developer-day-evolving-your-git-workflow-and-much-more/</feedburner:origLink></entry>
 
 <entry>
   <title>Git Tip: How to "Merge" Specific Files from Another Branch</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/ufiurlMjsBg/" />
   <updated>2009-02-25T00:00:00-05:00</updated>
   <id>http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch</id>
   <content type="html">&lt;h2&gt;Problem Statement&lt;/h2&gt;

&lt;p&gt;Part of your team is hard at work developing a new feature in another branch.  They've been working on the branch for several days now, and they've been committing changes every hour or so.  Something comes up, and you need to add &lt;em&gt;some&lt;/em&gt; of the code from that branch back into your mainline development branch.  (For this example, we'll assume mainline development occurs in the &lt;code&gt;master&lt;/code&gt; branch.)  You're not ready to merge the entire feature branch into &lt;code&gt;master&lt;/code&gt; just yet.  The code you need to grab is isolated to a handful of files, and those files don't yet exist in the &lt;code&gt;master&lt;/code&gt; branch.&lt;/p&gt;

&lt;h2&gt;Buckets o' Fail&lt;/h2&gt;

&lt;p&gt;This seems like it should be a simple enough task, so we start rummaging through our Git toolbox looking for just the right instrument.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea, the First.&lt;/strong&gt; Isn't this exactly what &lt;code&gt;git cherry-pick&lt;/code&gt; is made for?  Not so fast.  The team has made numerous commits to the files in question.  &lt;code&gt;git cherry-pick&lt;/code&gt; wants to merge a commit - not a file - from one branch into another branch.  We don't want to have to track down all the commits related to these files.  We just want to grab these files in their current state in the feature branch and drop them into the &lt;code&gt;master&lt;/code&gt; branch.  We &lt;em&gt;could&lt;/em&gt; hunt down the &lt;em&gt;last&lt;/em&gt; commit to each of these files and feed that information to &lt;code&gt;git cherry-pick&lt;/code&gt;, but that still seems like more work than ought to be necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea, the Second.&lt;/strong&gt; How 'bout &lt;code&gt;git merge --interactive&lt;/code&gt;?  Sorry.  That's not actually a thing.  You're thinking of &lt;code&gt;git add --interactive&lt;/code&gt; (which won't work for our purposes either).  Nice try though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea, the Third.&lt;/strong&gt; Maybe we can just merge the whole branch using &lt;code&gt;--squash&lt;/code&gt;, keep the files we want, and throw away the rest.  Um, yeah, that &lt;em&gt;would&lt;/em&gt; work. Eventually. But we want to be done with this task in ten seconds, not ten &lt;em&gt;minutes&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea, the Fourth.&lt;/strong&gt; When in doubt, pull out the brute force approach?  Surely we can just check out the feature branch, copy the files we need to a directory outside the repo, checkout the &lt;code&gt;master&lt;/code&gt; branch, and then paste the files back in place.  Ouch!  Yeah.  Maybe, but I think we might have our Git license revoked if we resort to such a hack.&lt;/p&gt;

&lt;h2&gt;The Simplest Thing That Could Possibly Work&lt;/h2&gt;

&lt;p&gt;As it turns out, we're trying too hard.  Our good friend &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html" title="git-checkout man page"&gt;&lt;code&gt;git checkout&lt;/code&gt;&lt;/a&gt; is the right tool for the job.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout source_branch &amp;lt;paths&amp;gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;br/&gt;


&lt;p&gt;We can simply give &lt;code&gt;git checkout&lt;/code&gt; the name of the feature branch [1] and the paths to the specific files that we want to add to our master branch.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git branch
* master
  twitter_integration
$ git checkout twitter_integration app/models/avatar.rb db/migrate/20090223104419_create_avatars.rb test/unit/models/avatar_test.rb test/functional/models/avatar_test.rb
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD &amp;lt;file&amp;gt;..." to unstage)
#
#   new file:   app/models/avatar.rb
#   new file:   db/migrate/20090223104419_create_avatars.rb
#   new file:   test/functional/models/avatar_test.rb
#   new file:   test/unit/models/avatar_test.rb
#
$ git commit -m "'Merge' avatar code from 'twitter_integration' branch"
[master]: created 4d3e37b: "'Merge' avatar code from 'twitter_integration' branch"
4 files changed, 72 insertions(+), 0 deletions(-)
create mode 100644 app/models/avatar.rb
create mode 100644 db/migrate/20090223104419_create_avatars.rb
create mode 100644 test/functional/models/avatar_test.rb
create mode 100644 test/unit/models/avatar_test.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;br/&gt;


&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=KuDd6rT5aFM" title="YouTube - Michael Scott - Boom Roasted"&gt;Boom.  Roasted.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Notes&lt;/h2&gt;

&lt;p&gt;[1] &lt;code&gt;git checkout&lt;/code&gt; actually accepts any tree-ish here. So you're not limited to grabbing code from the current tip of a branch; if needed, you can also check out files using a tag or the SHA for a past commit.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=ufiurlMjsBg:wMlW_5Ob_PI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=ufiurlMjsBg:wMlW_5Ob_PI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=ufiurlMjsBg:wMlW_5Ob_PI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/ufiurlMjsBg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/</feedburner:origLink></entry>
 
 <entry>
   <title>TextMate Oldie But Goodie Wrap-up</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/bBurfJNS3yw/" />
   <updated>2008-12-02T00:00:00-05:00</updated>
   <id>http://jasonrudolph.com/blog/2008/12/02/textmate-oldie-but-goodie-wrap-up</id>
   <content type="html">&lt;p&gt;With November behind us, there's now a &lt;a href="http://jasonrudolph.com/blog/2008/11/04/a-month-of-textmate-productivity-tips/" title="jasonrudolph/blog &amp;raquo; A Month of TextMate Productivity Tips"&gt;month of TextMate productivity tips&lt;/a&gt; scattered across the twitterverse.  In case you missed any of them, here's a recap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/985128152" title="Twitter / jasonrudolph: TMOBGOTD #1: TextMate Oldie But Goodie Of The Day"&gt;November 1&lt;/a&gt; - Use &lt;strong&gt;Control+Option+Command+V&lt;/strong&gt; to view your clipboard history. Then hit &lt;strong&gt;Enter&lt;/strong&gt; to paste the selected item into the current document.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/986324036" title="Twitter / jasonrudolph: TMOBGOTD #2: TextMate Oldie But Goodie Of The Day"&gt;November 2&lt;/a&gt; - Use &lt;strong&gt;Control+Shift+C&lt;/strong&gt; to access the Math bundle from any file. Instantly perform calculations, add/subtract selected numbers, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/987583480" title="Twitter / jasonrudolph: TMOBGOTD #3: TextMate Oldie But Goodie Of The Day"&gt;November 3&lt;/a&gt; - With your cursor on any Ruby string, use &lt;strong&gt;Control+Shift+&lt;code&gt;'&lt;/code&gt;&lt;/strong&gt; to toggle between single quotes, double quotes, and &lt;code&gt;%Q{}&lt;/code&gt;. Also works with Groovy, JavaScript, Perl, SQL, Bash, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/989258974" title="Twitter / jasonrudolph: TMOBGOTD #4: TextMate Oldie But Goodie Of The Day"&gt;November 4&lt;/a&gt; - In HTML (or HTML-friendly) files, select several lines and use &lt;strong&gt;Control+Command+Shift+W&lt;/strong&gt; to wrap each line in a pair of HTML tags.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/991596639" title="Twitter / jasonrudolph: TMOBGOTD #5: TextMate Oldie But Goodie Of The Day"&gt;November 5&lt;/a&gt;    - &lt;strong&gt;Control+Escape&lt;/strong&gt; brings up the automation menu. Use it for quick access to the current bundle and to navigate through other bundles.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/993248827" title="Twitter / jasonrudolph: TMOBGOTD #6: TextMate Oldie But Goodie Of The Day"&gt;November 6&lt;/a&gt;    - With your cursor on any Ruby symbol, use &lt;strong&gt;Control+:&lt;/strong&gt; to change it to a string. Use &lt;strong&gt;Control+:&lt;/strong&gt; again to toggle back to a symbol.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/994869385" title="Twitter / jasonrudolph: TMOBGOTD #7: TextMate Oldie But Goodie Of The Day"&gt;November 7&lt;/a&gt;    - Folding is (almost always) evil and is triggered by accident more often than not. Turn it off in &lt;strong&gt;View -&gt; Gutter -&gt; Foldings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/996269641" title="Twitter / jasonrudolph: TMOBGOTD #8: TextMate Oldie But Goodie Of The Day"&gt;November 8&lt;/a&gt;    - For the rare occasion when you &lt;em&gt;want&lt;/em&gt; folding, use &lt;strong&gt;F1&lt;/strong&gt; to fold the current block. Use &lt;strong&gt;Command+Option+n&lt;/strong&gt; (where n is a digit) to toggle foldings at the nth level.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/997515553" title="Twitter / jasonrudolph: TMOBGOTD #9: TextMate Oldie But Goodie Of The Day"&gt;November 9&lt;/a&gt;    - With your cursor on a misspelled word, use &lt;strong&gt;Option+F2&lt;/strong&gt; to bring up suggested spelling corrections. Hit &lt;strong&gt;Enter&lt;/strong&gt; to choose a correction.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/998734765" title="Twitter / jasonrudolph: TMOBGOTD #10: TextMate Oldie But Goodie Of The Day"&gt;November 10&lt;/a&gt;  - With your cursor on any ActiveRecord model, use &lt;strong&gt;Control+Command+Shift+S&lt;/strong&gt; to instantly view the schema for that model.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1000366213" title="Twitter / jasonrudolph: TMOBGOTD #11: TextMate Oldie But Goodie Of The Day"&gt;November 11&lt;/a&gt; - When working w/ CSS, use &lt;strong&gt;Command+Shift+C&lt;/strong&gt; to bring up the OS X color palette. Choose a color to insert the corresponding hex code.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1002089182" title="Twitter / jasonrudolph: TMOBGOTD #12: TextMate Oldie But Goodie Of The Day"&gt;November 12&lt;/a&gt; - Selection-fu =&gt; Use &lt;strong&gt;Control+W&lt;/strong&gt; to select the current word. Use &lt;strong&gt;Command+Shift+L&lt;/strong&gt; to select the current line.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1003798845" title="Twitter / jasonrudolph: TMOBGOTD #13: TextMate Oldie But Goodie Of The Day"&gt;November 13&lt;/a&gt; - Use &lt;strong&gt;Control+H&lt;/strong&gt; to pull up the documentation for the selected word. Works for CSS attributes, Ruby methods, HTML tags, Javadoc, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1005452019" title="Twitter / jasonrudolph: TMOBGOTD #14: TextMate Oldie But Goodie Of The Day"&gt;November 14&lt;/a&gt; - Anywhere that ERb is supported, use &lt;strong&gt;Control+&gt;&lt;/strong&gt; to produce a &amp;lt;%= %&gt; sequence. Hit it again to cycle through the various flavors.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1007068201" title="Twitter / jasonrudolph: TMOBGOTD #15: TextMate Oldie But Goodie Of The Day"&gt;November 15&lt;/a&gt; - Need fast access to placeholder text? Type "lorem" and hit &lt;strong&gt;Tab&lt;/strong&gt;.         &lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1008426064" title="Twitter / jasonrudolph: TMOBGOTD #16: TextMate Oldie But Goodie Of The Day"&gt;November 16&lt;/a&gt; - Sometimes TextMate is too smart for its own good. Use &lt;strong&gt;Control+Command+V&lt;/strong&gt; to paste &lt;em&gt;without&lt;/em&gt; reindent. Especially useful for YAML.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1009988210" title="Twitter / jasonrudolph: TMOBGOTD #17: TextMate Oldie But Goodie Of The Day"&gt;November 17&lt;/a&gt; - Fun with case conversions - &lt;strong&gt;Control+U&lt;/strong&gt; =&gt; TO UPPERCASE. &lt;strong&gt;Control+Shift+U&lt;/strong&gt; =&gt; to lowercase. &lt;strong&gt;Control+Option+U&lt;/strong&gt; =&gt; Convert to Titlecase.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1011447822" title="Twitter / jasonrudolph: TMOBGOTD #18: TextMate Oldie But Goodie Of The Day"&gt;November 18&lt;/a&gt; - Use &lt;strong&gt;Control+Tab&lt;/strong&gt; to toggle focus between the editor window and the folder/file tree in the project drawer.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1013044747" title="Twitter / jasonrudolph: TMOBGOTD #19: TextMate Oldie But Goodie Of The Day"&gt;November 19&lt;/a&gt; - Don't lose time waiting for "Find in Project" to slog through a large project. Search fast w/ &lt;a href="http://bit.ly/ack" title="protocool's ack-tmbundle at GitHub"&gt;Ack in Project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1014602882" title="Twitter / jasonrudolph: TMOBGOTD #20: TextMate Oldie But Goodie Of The Day"&gt;November 20&lt;/a&gt; - Use &lt;strong&gt;Control+Option+Command+P&lt;/strong&gt; to preview the current file as rendered HTML. Good for HTML (duh), Markdown, and Textile.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1017290604" title="Twitter / jasonrudolph: TMOBGOTD #21: TextMate Oldie But Goodie Of The Day"&gt;November 21&lt;/a&gt; - &lt;strong&gt;Command+Option+[&lt;/strong&gt; =&gt; Format current selection (or current line if nothing is selected) according to rules for the current grammar.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1018311743" title="Twitter / jasonrudolph: TMOBGOTD #22: TextMate Oldie But Goodie Of The Day"&gt;November 22&lt;/a&gt; - Use &lt;strong&gt;Option+PageUp&lt;/strong&gt; and &lt;strong&gt;Option+PageDown&lt;/strong&gt; to page up/down while keeping your cursor in the middle of the screen. (On a laptop, &lt;strong&gt;PageUp&lt;/strong&gt; is &lt;strong&gt;Function+Up&lt;/strong&gt;. So, for this tip, you'd use &lt;strong&gt;Function+Option+Up&lt;/strong&gt; and &lt;strong&gt;Function+Option+Down&lt;/strong&gt;.)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1019577832" title="Twitter / jasonrudolph: TMOBGOTD #23: TextMate Oldie But Goodie Of The Day"&gt;November 23&lt;/a&gt; - Use &lt;strong&gt;Command+Option+W&lt;/strong&gt; to toggle soft line wrapping.          &lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1021193988" title="Twitter / jasonrudolph: TMOBGOTD #24: TextMate Oldie But Goodie Of The Day"&gt;November 24&lt;/a&gt; - Hit &lt;strong&gt;Escape&lt;/strong&gt; to auto-complete the current word using similar words in the current file (in order of their proximity to the cursor).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1022973346" title="Twitter / jasonrudolph: TMOBGOTD #25: TextMate Oldie But Goodie Of The Day"&gt;November 25&lt;/a&gt; - Enable &lt;a href="http://bit.ly/tm" title="TextMate Manual » Calling TextMate from Other Applications"&gt;"Edit in TextMate"&lt;/a&gt; to use TextMate from any Cocoa app - email in Mail.app, blog comments &amp;amp; wikis in Safari, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1025110446" title="Twitter / jasonrudolph: TMOBGOTD #26: TextMate Oldie But Goodie Of The Day"&gt;November 26&lt;/a&gt; - Use &lt;strong&gt;Option+Command+R&lt;/strong&gt; to feed the current file (or selection) to any shell command and capture the output in any number of ways.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1026835629" title="Twitter / jasonrudolph: TMOBGOTD #27: TextMate Oldie But Goodie Of The Day"&gt;November 27&lt;/a&gt; - Use &lt;strong&gt;Control+Option+Shift+H&lt;/strong&gt; to change the language of the current file to HTML. Use 'X' for XML or XSL. 'R' for Ruby, Rails, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1028073252" title="Twitter / jasonrudolph: TMOBGOTD #28: TextMate Oldie But Goodie Of The Day"&gt;November 28&lt;/a&gt; - &lt;strong&gt;Command+Shift+T&lt;/strong&gt; =&gt; Go to symbol. This grammar-sensitive fuzzy finder locates classes &amp;amp; methods in Ruby, IDs in HTML, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1029697485" title="Twitter / jasonrudolph: TMOBGOTD #29: TextMate Oldie But Goodie Of The Day"&gt;November 29&lt;/a&gt; - Hold down the &lt;strong&gt;Option&lt;/strong&gt; key while selecting an area of text to make a columnar selection. More info here http://bit.ly/tmcol.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/1030966782" title="Twitter / jasonrudolph: TMOBGOTD #30: TextMate Oldie But Goodie Of The Day"&gt;November 30&lt;/a&gt; - Forgot how to access a certain feature of TextMate. Quickly find any and all of the TMOBGOTD tips (and more) with &lt;strong&gt;Command+Shift+?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;And if you're still following along, you're hardcore enough that you'll want to make sure that the bonus inaugural entry is firmly tucked into your TextMate black belt as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/statuses/983796383" title="Twitter / jasonrudolph: TMOBGOTD #0: TextMate Oldie But Goodie Of The Day"&gt;October 31&lt;/a&gt; - &lt;strong&gt;Control+Command+T&lt;/strong&gt; =&gt; Fuzzy find for bundle items.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Got a favorite TextMate tip of your own to share? Tag it with the worst acronym ever (&lt;a href="http://search.twitter.com/search?q=TMOBGOTD" title="TMOBGOTD - Twitter Search"&gt;TMOBGOTD&lt;/a&gt; - TextMate Oldie But Goodie Of The Day) for all the TextMate-lovin' world to see.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=bBurfJNS3yw:LOXXwxWFPjI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=bBurfJNS3yw:LOXXwxWFPjI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=bBurfJNS3yw:LOXXwxWFPjI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/bBurfJNS3yw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2008/12/02/textmate-oldie-but-goodie-wrap-up/</feedburner:origLink></entry>
 
 <entry>
   <title>Grails vs. Rails: Are we seriously still talking about this?!</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/6TF-eHy0Jak/" />
   <updated>2008-11-18T00:00:00-05:00</updated>
   <id>http://jasonrudolph.com/blog/2008/11/18/grails-vs-rails-are-we-seriously-still-talking-about-this</id>
   <content type="html">&lt;p&gt;I had the &lt;a href="http://twitter.com/jasonrudolph/status/1010492093" title="Twitter / Jason Rudolph: Checking out @robertfischer's Grails presentation at TriJUG"&gt;pleasure of meeting a local Grails enthusiast last night&lt;/a&gt; who was new to the Triangle, but I was disappointed to see the same old argument spoil the show.  The &lt;a href="http://jasonrudolph.com/blog/tag/rails/" title="jasonrudolph.com/blog &amp;raquo; Rails"&gt;Rails&lt;/a&gt; vs. &lt;a href="http://jasonrudolph.com/blog/tag/grails/" title="jasonrudolph.com/blog &amp;raquo; Grails"&gt;Grails&lt;/a&gt; debate is tired, and it's curiously - perhaps even &lt;a href="http://enfranchisedmind.com/blog/2008/11/18/intro-to-grails-presentation-slides/#comment-33865" title="Enfranchised Mind &amp;raquo; &amp;#8220;Intro to Grails&amp;#8221; Presentation Slides"&gt;embarrassingly&lt;/a&gt; - unidirectional. I hereby call on the great philosophers to weigh in:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=aMfr2CgIPhg" title="YouTube: Rodney King - Can We All Get Along..."&gt;Philosopher, The First&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.vanderburg.org/Blog/Software/Development/koan.blog" title="Glenn Vanderburg: Six of One, a Half Dozen of the Other"&gt;Philosopher, The Second&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, go in peace.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2008-11-19&lt;/strong&gt; - Robert has deleted his comment (originally linked to above and &lt;a href="http://jasonrudolph.com/blog/2008/11/18/grails-vs-rails-are-we-seriously-still-talking-about-this/#comment-14775" title="jasonrudolph.com/blog - Comment by Robert Fischer"&gt;referenced by Robert below&lt;/a&gt;) from his blog.  His original blog post remains intact, sans incendiary comment.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=6TF-eHy0Jak:5W2v9qzt8L4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=6TF-eHy0Jak:5W2v9qzt8L4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=6TF-eHy0Jak:5W2v9qzt8L4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/6TF-eHy0Jak" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2008/11/18/grails-vs-rails-are-we-seriously-still-talking-about-this/</feedburner:origLink></entry>
 
 <entry>
   <title>A Month of TextMate Productivity Tips</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/Src0jwzWmNc/" />
   <updated>2008-11-04T00:00:00-05:00</updated>
   <id>http://jasonrudolph.com/blog/2008/11/04/a-month-of-textmate-productivity-tips</id>
   <content type="html">&lt;p&gt;I've had the joy of calling &lt;a href="http://macromates.com/" title="TextMate — The Missing Editor for Mac OS X"&gt;TextMate&lt;/a&gt; my editor of choice for almost three years now, and as the &lt;a href="http://pragmaticprogrammer.com/the-pragmatic-programmer/extracts/tips" title="Pragmatic Software Development Tips from the &amp;quot;Pragmatic Programmer&amp;quot;"&gt;The Pragmatic Programmer&lt;/a&gt; wisely recommends, my editor has definitely grown to become "an extension of [my] hand."  Often when giving a presentation or pair programming, someone will stop me to ask, "Wait a minute. How'd you do that?" "&lt;em&gt;That&lt;/em&gt;" is inevitably in reference to some bit of hyper-productive TextMate keyboard wizardry that eliminated several steps the person was otherwise expecting to see. Of course, a few years ago you were more likely to hear &lt;em&gt;me&lt;/em&gt; asking that question. (And I still love it when I get to ask that question nowadays.)&lt;/p&gt;

&lt;p&gt;For the month of November, I'll share one of these &lt;em&gt;"How'd you do that?"&lt;/em&gt; tips each day. They're by no means revolutionary; they're much more in the &lt;em&gt;oldie but goodie&lt;/em&gt; camp.  Hence the name: &lt;strong&gt;TextMate Oldie But Goodie Of The Day (TMOBGOTD)&lt;/strong&gt;. Each one can shave time - sometimes several seconds - off of common tasks.  And if they're common tasks in your workflow, then that time surely adds up.&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;You can follow along at &lt;a href="http://twitter.com/jasonrudolph" title="Twitter / Jason Rudolph"&gt;twitter.com/jasonrudolph&lt;/a&gt;, where the first four tips are already in place.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/985128152" title="Twitter / jasonrudolph: TMOBGOTD #1: TextMate Oldie But Goodie Of The Day"&gt;November 1&lt;/a&gt; - Use &lt;strong&gt;Control+Option+Command+V&lt;/strong&gt; to view your clipboard history. Then hit &lt;strong&gt;Enter&lt;/strong&gt; to paste the selected item into the current document.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/986324036" title="Twitter / jasonrudolph: TMOBGOTD #2: TextMate Oldie But Goodie Of The Day"&gt;November 2&lt;/a&gt; - Use &lt;strong&gt;Control+Shift+C&lt;/strong&gt; to access the Math bundle from any file. Instantly perform calculations, add/subtract selected numbers, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/987583480" title="Twitter / jasonrudolph: TMOBGOTD #3: TextMate Oldie But Goodie Of The Day"&gt;November 3&lt;/a&gt; - With your cursor on any Ruby string, use &lt;strong&gt;Control+Shift+&lt;code&gt;'&lt;/code&gt;&lt;/strong&gt; to toggle between single quotes, double quotes, and &lt;code&gt;%Q{}&lt;/code&gt;. Also works with Groovy, JavaScript, Perl, SQL, Bash, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasonrudolph/status/989258974" title="Twitter / jasonrudolph: TMOBGOTD #4: TextMate Oldie But Goodie Of The Day"&gt;November 4&lt;/a&gt; - In HTML (or HTML-friendly) files, select several lines and use &lt;strong&gt;Control+Command+Shift+W&lt;/strong&gt; to wrap each line in a pair of HTML tags.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Whether you're seeing these techniques for the first time or rediscovering a command that you'd forgotten about, take a moment to try it out.  Perform each technique three times, and you'll be well on your way to committing it to memory. In just 60 seconds a day, you too can train to become a TextMate black belt.  Or double your money back.  Guaranteed.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2008-12-02&lt;/strong&gt; - Check out the &lt;a href="http://jasonrudolph.com/blog/2008/12/02/textmate-oldie-but-goodie-wrap-up/" title="jasonrudolph/blog &amp;raquo; TextMate Oldie But Goodie Wrap-up"&gt;full list of tips in the wrap-up post&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=Src0jwzWmNc:QNZUtJWEMFc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=Src0jwzWmNc:QNZUtJWEMFc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=Src0jwzWmNc:QNZUtJWEMFc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/Src0jwzWmNc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2008/11/04/a-month-of-textmate-productivity-tips/</feedburner:origLink></entry>
 
 <entry>
   <title>Testing Anti-Patterns Potpourri - Quotes, Resources, and Collective Wisdom</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/DA-eHhtQo4c/" />
   <updated>2008-10-07T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2008/10/07/testing-anti-patterns-potpourri-quotes-resources-and-collective-wisdom</id>
   <content type="html">&lt;p&gt;While working on the &lt;a href="http://jasonrudolph.com/blog/testing-anti-patterns-how-to-fail-with-100-test-coverage/" title="jasonrudolph.com/blog - Testing Anti-Patterns"&gt;Testing Anti-Patterns series&lt;/a&gt; over the past few months, I've had the pleasure of reading some great writing on testing, test-driven development, code coverage analysis, and the bigger picture of software quality in general.  What follows is a collection of some of my favorite findings: quotes and resources spanning the last ten years and then some.&lt;/p&gt;

&lt;h2&gt;How Not to Test&lt;/h2&gt;

&lt;p&gt;Let's start off with something light.  James Carr's &lt;a href="http://blog.james-carr.org/?p=44" title="James Carr &amp;raquo; Blog Archive &amp;raquo; TDD Anti-Patterns"&gt;TDD Anti-Pattern Catalogue&lt;/a&gt; is a good, fun read that's downright hilarious at times (but only because we remember &lt;del&gt;writing&lt;/del&gt; seeing these tests once or twice).  And not only are the anti-patterns that James proposes worth reading, you owe it to yourself to check out the extensive discussion in the comments as well. There you'll find folks chiming in with many additional gems, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/#comment-47093" title="James Carr &amp;raquo; Blog Archive &amp;raquo; TDD Anti-Patterns"&gt;The Blue Moon&lt;/a&gt; - Matt Simner's aptly-named anti-pattern is one we've all hit at least once: "A test that’s specifically dependent on the current date, and fails as a result of things like public holidays, leap years, weekends, 5-week months, etc."  Ouch.&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/#comment-77729" title="James Carr &amp;raquo; Blog Archive &amp;raquo; TDD Anti-Patterns"&gt;Honest Guv&lt;/a&gt; - Graham Lenton's contribution to the list brings back some memories I'd rather forget: "Where the expected outcome is so entropic that the developer simply asserts true with a comment 'this works, honestly.'"  Um.  Sure it does.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;We're Still Figuring This Stuff Out&lt;/h2&gt;

&lt;p&gt;Some tests are just so incredibly rotten that it's easy to definitively declare a better approach, but it's not always that black and white.  Just as we have to make &lt;a href="http://www.vanderburg.org/Blog/Software/Development/koan.blog" title="Glenn Vanderburg: Blog - Six of One, a Half Dozen of the Other"&gt;trade-offs&lt;/a&gt; when designing and developing production code, so too do we have to weigh the advantages and disadvantages of the available approaches for testing that code.&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;In his post on &lt;a href="http://blog.jayfields.com/2008/06/developer-testing-and-importance-of.html" title="Jay Fields' Thoughts: Developer Testing and the Importance of Context"&gt;Developer Testing and the Importance of Context&lt;/a&gt;, Jay Fields reflects on the catalog of testing patterns he's documented over the past few years, and he reminds us that "context is still king:"&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;You'll find that some of [the] approaches are in direct conflict. This isn't because one pattern is superior to another in isolation, it's because one pattern is superior to another in context.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Software development certainly isn't the only engineering discipline that requires its practitioners to manage trade-offs, so how do we compare with other industries?  The often controversial (but always entertaining) Neal Ford argues that "testing is the engineering rigor of software development," but that &lt;a href="http://memeagora.blogspot.com/2007/11/building-bridges-without-engineering.html" title="Meme Agora: Building Bridges without Engineering"&gt;we've still got a long way to go&lt;/a&gt; if software development will ever truly be an engineering discipline:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It may just be that software will always resist traditional engineering kinds of analysis. We'll know in a few thousand years, when we've been building software as long as we've been building bridges. We're currently at the level in software where bridge builders were when they built a bridge, ran a heavy cart across it, and it collapsed. "Well, that wasn't a very good bridge. Let's try again."&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Pragmatic Use of Code Coverage Analysis&lt;/h2&gt;

&lt;p&gt;We've talked quite a bit about &lt;a href="http://jasonrudolph.com/blog/2008/06/10/a-brief-discussion-of-code-coverage-types/" title="jasonrudolph.com/blog -- A Brief Discussion of Code Coverage Types"&gt;code coverage&lt;/a&gt; in our discussion of &lt;a href="http://jasonrudolph.com/blog/testing-anti-patterns-how-to-fail-with-100-test-coverage/" title="jasonrudolph.com/blog -- Testing Anti-Patterns: How to Fail With 100% Test Coverage"&gt;testing anti-patterns&lt;/a&gt;.  Brian Marick's 1997 paper titled &lt;a href="http://www.exampler.com/testing-com/writings/coverage.pdf" title="PDF - 'How to Misuse Code Coverage' by Brian Marick"&gt;How to Misuse Code Coverage&lt;/a&gt; is a must-read, full of pragmatic advice from a veteran tester:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I've written four coverage tools ... I still find myself looking at a coverage condition, saying "I know how to satisfy that," and getting an almost physical urge to write a quick-and-dirty test that would make the coverage tool happy. It's only the certain knowledge that customers don't care if the coverage tool is happy that restrains me.&lt;/p&gt;

&lt;p&gt;The most common coverage mistake is giving into that urge. I warn against it by saying that coverage tools don't give commands ("make that evaluate true"), they give clues ("you made some mistakes somewhere around there"). If you treat their clues as commands, you'll end up in the fable of the Sorcerer's Apprentice: causing a disaster because your tools do something very precisely, very enthusiastically, and with inhuman efficiency - but that something is only what you thought you wanted.&lt;/p&gt;

&lt;p&gt;Designing your initial test suite to achieve 100% coverage is an even worse idea. It’s a sure way to create a test suite weak at finding those all-important faults of omission. Further, the coverage tool can no longer tell you where your test suite is weak - because it's uniformly weak in precisely the way that coverage can't directly detect. Don't use code coverage in test design. The return on your testing dollar (in terms of bugs found) is too low.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Now that we know how to misuse code coverage, the Google Testing Blog weighs in on the &lt;a href="http://googletesting.blogspot.com/2008/03/tott-understanding-your-coverage-data.html" title="Google Testing Blog: TotT: Understanding Your Coverage Data"&gt;proper application of coverage analysis&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make your tests as comprehensive as you can, without coverage in mind. This means writing as many test cases as are necessary, not just the minimum set of test cases to achieve maximum coverage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check coverage results from your tests. Find code that's missed in your testing. Also look for unexpected coverage patterns, which usually indicate bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add additional test cases to address the missed cases you found in step 2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeat step 2-3 until it's no longer cost effective. If it is too difficult to test some of the corner cases, you may want to consider refactoring to improve testability.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;In &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670" title="Amazon.com: Code Complete: A Practical Handbook of Software Construction: Steve McConnell"&gt;Code Complete&lt;/a&gt;, Steve McConnell offers sage advice for knowing when you can reasonably move to Step 2.  (Hint: Just testing the happy path ain't gonna get you there.):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Immature testing organizations tend to have about five clean tests for every dirty test.  Mature testing organizations tend to have five dirty tests for every clean test. This ratio is not reversed by reducing the clean tests; it’s done by creating 25 times as many dirty tests.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And we should always keep the value of code coverage (or any isolated metric for that matter) in perspective, as Andy Glover reminds us in his post on &lt;a href="http://thediscoblog.com/2008/03/20/unambiguously-analyzing-metrics" title="The Disco Blog  &amp;raquo; Blog Archive   &amp;raquo; Unambiguously analyzing metrics"&gt;unambiguously analyzing metrics&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Metrics are more copasetic when combined with other metrics and trended – for instance, complexity alone is somewhat interesting, but pairing complexity with code coverage paints a much more detailed metric that bears understanding. High complexity with low coverage is clearly more risky than the same complexity with high code coverage ...&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Beyond Developer Testing&lt;/h2&gt;

&lt;p&gt;Not only should we avoid relying on a single metric, we should also be wary of relying too much on a single form (or a single "layer") of testing.  As Luke Francl argues in his &lt;a href="http://railspikes.com/2008/7/11/testing-is-overrated" title="Rail Spikes: Testing is Overrated"&gt;call for more diverse testing&lt;/a&gt;, even the most exhaustive set of unit tests is limited in the scope of defects it can find [1]:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;img src="http://jasonrudolph.com/resources/200810_testing_layers_venn_diagram.png" alt="200810 Testing Layers Venn Diagram" /&gt;   &lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;Don’t put all your eggs in one basket. The most interesting thing about these defect detection techniques is that they tend to find different errors. Unit testing finds certain errors; manual testing others; usability testing and code reviews still others.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In his post on &lt;a href="http://www.codinghorror.com/blog/archives/001059.html" title="Coding Horror: The Ultimate Unit Test Failure"&gt;The Ultimate Unit Test Failure&lt;/a&gt;, Jeff Atwood comes out swingin' and begs development teams to invest in interaction design with the same enthusiasm (or perhaps more) that we give to developer testing:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Perfectly executed code coverage doesn't mean users will use your program. Or that it's even &lt;em&gt;worth&lt;/em&gt; using in the first place.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;No Silver Bullet&lt;/h2&gt;

&lt;p&gt;If there's any one theme that we can observe across this collection of ideas, it's the recognition that no recipe, or tool, or one-size-fits-all process offers the One True Way (TM) to develop quality software.  As Michael Feathers &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2008/06/the-flawed-theo.html" title="Michael Feathers' Blog: The Flawed Theory Behind Unit Testing"&gt;points out&lt;/a&gt;, quality doesn't come from a "mechanistic" approach to testing:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Quality is a function of thought and reflection - precise thought and reflection. That’s the magic. Techniques which reinforce that discipline invariably increase quality.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;It's only that critical thought that will tell us when it would be more cost-effective to use one flavor of testing over another.  It's only that critical thought that will uncover implied requirements in a user story or prompt us to ask about hidden assumptions that might be lingering in a given use case.  It's only that critical thought that will recognize when the pattern that's worked for us 95% of the time simply isn't appropriate for the particular scenario we've just come across.  To forgo that critical thought in search of a silver bullet, that's the ultimate testing anti-pattern.&lt;/p&gt;

&lt;h2&gt;Notes&lt;/h2&gt;

&lt;p&gt;[1] Luke notes that the specific overlaps in the diagram are admittedly arbitrary.  The specific areas of overlap are insignificant for our purposes here.  Noteworthy is that while there is some overlap between these forms of testing, each one tends to identify at least some defects that are less likely to be identified by other forms of testing.  (Diagram used with permission.)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;This &lt;a href="http://jasonrudolph.com/blog/testing-anti-patterns-how-to-fail-with-100-test-coverage/" title="jasonrudolph.com/blog - Testing Anti-Patterns"&gt;series&lt;/a&gt; is taken from the &lt;a href="http://blog.thinkrelevance.com/2008/5/23/how-to-fail-with-100-test-coverage" title="Relevance Blog : How To Fail With 100% Test Coverage"&gt;How To Fail With 100% Test Coverage&lt;/a&gt; talk. Check the &lt;a href="http://thinkrelevance.com/events" title="Relevance: Events"&gt;schedule&lt;/a&gt; for a talk near you.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="http://thinkrelevance.com/about/stuart-halloway" title="Relevance: Stuart Halloway"&gt;Stuart Halloway&lt;/a&gt;, &lt;a href="http://robsanheim.com/" title="Panasonic Youth"&gt;Rob Sanheim&lt;/a&gt;, and &lt;a href="http://gigavolt.net/blog/" title="Potential Differences"&gt;Greg Vaughn&lt;/a&gt; for reading drafts of this post.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=DA-eHhtQo4c:nhZTh32rkpE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=DA-eHhtQo4c:nhZTh32rkpE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=DA-eHhtQo4c:nhZTh32rkpE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/DA-eHhtQo4c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2008/10/07/testing-anti-patterns-potpourri-quotes-resources-and-collective-wisdom/</feedburner:origLink></entry>
 
 <entry>
   <title>Audio, Video, Slides: How to Fail With 100% Test Coverage at raleigh.rb</title>
   <link href="http://feedproxy.google.com/~r/jasonrudolph/~3/MO-GIR-PLlQ/" />
   <updated>2008-09-09T00:00:00-04:00</updated>
   <id>http://jasonrudolph.com/blog/2008/09/09/audio-video-slides-how-to-fail-with-100-test-coverage-at-raleighrb</id>
   <content type="html">&lt;p&gt;The &lt;a href="http://jasonrudolph.com/blog/testing-anti-patterns-how-to-fail-with-100-test-coverage/" title="jasonrudolph.com/blog - Testing Anti-Patterns: How to Fail With 100% Test Coverage"&gt;Testing Anti-Patterns series&lt;/a&gt; began as a conference presentation titled &lt;strong&gt;How to Fail With 100% Test Coverage&lt;/strong&gt;, and I recently had the pleasure of presenting that talk at the &lt;a href="http://ruby.meetup.com/3/calendar/7849526/" title="Raleigh-area Ruby Brigade August Meeting - Jason Rudolph on 'How to Fail With 100% Test Coverage'"&gt;Raleigh-Area Ruby Brigade (raleigh.rb)&lt;/a&gt;.  &lt;a href="http://matthewbass.com" title="matthewbass.com"&gt;Matthew Bass&lt;/a&gt; was kind enough to record the audio from the event, and I've taken a stab at syncing that audio with the slides for a full-on multimedia extravaganza.&lt;sup&gt;&amp;sect;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;&lt;object width="400" height="302"&gt;   &lt;param name="allowfullscreen" value="true" /&gt;   &lt;param name="allowscriptaccess" value="always" /&gt;   &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1683910&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=1&amp;amp;amp;show_byline=1&amp;amp;amp;show_portrait=0&amp;amp;amp;color=59a5d1&amp;amp;amp;fullscreen=1" /&gt; &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1683910&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=1&amp;amp;amp;show_byline=1&amp;amp;amp;show_portrait=0&amp;amp;amp;color=59a5d1&amp;amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://vimeo.com/1683910?pg=embed&amp;amp;amp;sec=1683910" title="How To Fail With 100% Test Coverage on Vimeo"&gt;Download Quicktime video via Vimeo&lt;/a&gt; (registration required)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=34717809&amp;amp;amp;id=273853776" title="raleigh.rb Podcast on iTunes - Jason Rudolph on 'How to Fail With 100% Test Coverage'"&gt;Download MP3 via iTunes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.raleighrb.com/podcast/2008-08-19_how_to_fail.mp3" title="raleigh.rb MP3 - Jason Rudolph on 'How to Fail With 100% Test Coverage'"&gt;Download MP3 directly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jasonrudolph.com/downloads/presentations/How_to_Fail_With_100_Percent_Test_Coverage.pdf" title="Slides - Jason Rudolph on 'How to Fail With 100% Test Coverage'&amp;quot;"&gt;Download slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wanna see this talk live?  Check the &lt;a href="http://thinkrelevance.com/events" title="Relevance: Events"&gt;schedule&lt;/a&gt; for an event near you.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;&amp;sect;&lt;/sup&gt; Keynote's Quicktime recording/exporting has a seemingly diabolical sense of humor.  For comedic effect (or perhaps to make sure you're paying attention), it likes to randomly shuffle the slides every once in a while.  So in the video, you'll notice that unfortunately the slides and the audio don't &lt;em&gt;always&lt;/em&gt; line up just right.  If you find it too erratic, then it may be easier to listen to the &lt;a href="http://www.raleighrb.com/podcast/2008-08-19_how_to_fail.mp3" title="raleigh.rb MP3 - Jason Rudolph on 'How to Fail With 100% Test Coverage'"&gt;audio&lt;/a&gt; and advance the &lt;a href="http://jasonrudolph.com/downloads/presentations/How_to_Fail_With_100_Percent_Test_Coverage.pdf" title="Slides - Jason Rudolph on 'How to Fail With 100% Test Coverage'&amp;quot;"&gt;slides&lt;/a&gt; manually.  And if you see Tyler Durden make a cameo, well, it was probably just Keynote having a laugh.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MO-GIR-PLlQ:N75QAXChi34:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jasonrudolph?a=MO-GIR-PLlQ:N75QAXChi34:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jasonrudolph?i=MO-GIR-PLlQ:N75QAXChi34:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jasonrudolph/~4/MO-GIR-PLlQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jasonrudolph.com/blog/2008/09/09/audio-video-slides-how-to-fail-with-100-test-coverage-at-raleighrb/</feedburner:origLink></entry>
 
 
</feed>
