<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Panasonic Youth » Software</title>
	
	<link>http://robsanheim.com</link>
	<description>rob sanheim writes about software, business, ruby, music, stuff and things</description>
	<pubDate>Tue, 23 Jun 2009 05:25:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/robsanheim/tech" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Rails 2.3, JSON, and lamentations</title>
		<link>http://robsanheim.com/2009/06/23/rails-23-json-and-lamentations/</link>
		<comments>http://robsanheim.com/2009/06/23/rails-23-json-and-lamentations/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 05:25:37 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://robsanheim.com/?p=430</guid>
		<description><![CDATA[There is a nasty gotcha in Rails 2.3 involving rendering JSON from models and a surprising change in behavior.  If you are familiar with how Rails renders xml for models, you may expect json to be very similar.  You would probably expect a top level root node followed by the attributes:
{"person" => { [...]]]></description>
			<content:encoded><![CDATA[<p>There is a nasty gotcha in Rails 2.3 involving rendering JSON from models and a surprising change in behavior.  If you are familiar with how Rails renders xml for models, you may expect json to be very similar.  You would probably expect a top level root node followed by the attributes:</p>
<p><code>{"person" => { "city=>nil, "name"=> "Foo Bar" } }</code></p>
<p>It appears somewhere on the road to 2.3, the JSON encoding changed so there is no longer a top level node:</p>
<p><code>{"city"=>nil, "name"=>"Foo Bar" } </code></p>
<p>The end result of this change means that if you have consumers expecting JSON in a typical &#8220;Rails&#8221; format, with a top level element denoting the class, there will be pain.  We just hit this in a project when trying to use ActiveResource to consume some models exposed via standard restful actions.  </p>
<p>The following demonstrates how this breaks down exactly:</p>
<p><code># in the backend web app<br />
Person.create! :name => &#8220;foo&#8221;</p>
<p># meanwhile, in an active resource consumer<br />
person = Person.find(1)  # finds a model okay, but&#8230;</p>
<p># the below all raise NoMethodError<br />
# they _should_ find the attribute from the attribute hash<br />
# and quack like an ActiveRecord model<br />
person.name<br />
person.age<br />
person.any_field_on_the_model </p>
<p>person.attributes # returns a hash in the format of { &#8220;person&#8221; => { &#8220;name&#8221; => &#8220;foo&#8221;&#8230;}, which is where the problem lies</code></p>
<p>It appears this issue is fixed or on the way to be fixed in the 2.3 stable branch, but for now be wary of JSON support in general on 2.3 until more of the below tickets get resolved.</p>
<p><strong>References:<br />
</strong></p>
<li><a href="https://rails.lighthouseapp.com/projects/8994/tickets/2584-232-activeresource-json-doesnt-send-parameters-with-root-node">the bug in question - still open</a></li>
<li><a href="https://rails.lighthouseapp.com/projects/8994/tickets/2456-activeresource-xmljson-encoding-inconsistency">xml vs json - fight!</a></li>
<li><a href="https://rails.lighthouseapp.com/projects/8994/tickets/2753-to_json-behavior-still-different-between-rails-2321-and-rails-2-3-stable">2.3 related (?) fix that caused other issues</a></li>
<li><a href="https://rails.lighthouseapp.com/projects/8994/tickets/2196-json-encoding-breaks-when-json-gem-is-loaded-before-active-support">an unrelated JSON issue, but very annoying and has hit us on multiple projects &#8212; require &#8220;json&#8221; considered harmful)</a></li>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=Lw-lPLxdqvs:QVGokSd2zNI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=Lw-lPLxdqvs:QVGokSd2zNI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=Lw-lPLxdqvs:QVGokSd2zNI:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2009/06/23/rails-23-json-and-lamentations/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CapGun 0.2.0 - now with all Git commits since the last release</title>
		<link>http://robsanheim.com/2009/06/21/capgun-020-now-with-all-git-commits-since-the-last-release/</link>
		<comments>http://robsanheim.com/2009/06/21/capgun-020-now-with-all-git-commits-since-the-last-release/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 06:02:22 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://robsanheim.com/?p=420</guid>
		<description><![CDATA[Relevance has released CapGun 0.2.0 to GitHub and Rubyforge.
We&#8217;ve added more Git knowledge to this release, courtesy some great work from Muness.  Your deployment notifications will now contain the branch they were deployed from and a list of all revisions included in the deployment (since the last deploy, of course).  
There was also [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://thinkrelevance.com">Relevance</a> has released <a href="http://github.com/relevance/cap_gun/tree/master">CapGun 0.2.0</a> to GitHub and Rubyforge.</p>
<p>We&#8217;ve added more Git knowledge to this release, courtesy some great work from <a href="http://muness.blogspot.com/">Muness</a>.  Your deployment notifications will now contain the branch they were deployed from and a list of all revisions included in the deployment (since the last deploy, of course).  </p>
<p>There was also a overhaul to the internals.  Muness refactored all the email logic to a presenter, so it should easy to change the notification email to your liking.  CapGun now uses Jeweler and Micronaut, to match the rest of the standards for Relevance open source.  </p>
<p>Keep us honest by checking the <a href="http://runcoderun.com/relevance/cap_gun">build status</a> on RunCodeRun, and file feature requests and bug reports on <a href="http://github.com/relevance/cap_gun/issues">Github Issues.</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=yu3BSnbuyPc:lCuTGVpIhF0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=yu3BSnbuyPc:lCuTGVpIhF0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=yu3BSnbuyPc:lCuTGVpIhF0:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2009/06/21/capgun-020-now-with-all-git-commits-since-the-last-release/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pair programming? TDD? Where is the proof?</title>
		<link>http://robsanheim.com/2009/02/10/pair-programming-tdd-where-is-the-proof/</link>
		<comments>http://robsanheim.com/2009/02/10/pair-programming-tdd-where-is-the-proof/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 13:00:22 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[BDD]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://robsanheim.com/?p=417</guid>
		<description><![CDATA[Often while discussing agile practices with agile skeptics, the question of proof comes up.  &#8220;Are there studies done showing TDD?  How do you know pairing works and doesn&#8217;t just waste time?&#8221;  
Those are tough questions.  Software is not a science, and there are no double-blind, randomized controlled projects.  The study [...]]]></description>
			<content:encoded><![CDATA[<p>Often while discussing agile practices with agile skeptics, the question of proof comes up.  &#8220;Are there studies done showing TDD?  How do you know pairing works and doesn&#8217;t just waste time?&#8221;  </p>
<p>Those are tough questions.  Software is not a science, and there are no double-blind, randomized controlled projects.  The study of software development barely approaches the level of a social science.  Its easy to discuss the flow and intuitive sense that agile works with other people who have experienced it, but try expressing that to someone who has never stepped beyond the waterfall model.</p>
<p>Things are getting better in the area of real, hard studies done on agile.  One example is the work being done by <a href="http://research.microsoft.com/en-us/projects/esm/" title="ESM - Microsoft Research">Microsoft&#8217;s Empirical Software Engineering Group (ESM)</a>.  The summary from the TDD study is worth citing:</p>
<p><cite>&#8220;The results of the case studies indicate that the pre-release defect density of the four products decreased between 40% and 90% relative to similar projects that did not use the TDD practice. Subjectively, the teams experienced a 15–35% increase in initial development time after adopting TDD.&#8221;</cite></p>
<p>I&#8217;ve included full links to some of the standout papers on my @to-read list below.  </p>
<ul>
<li>
<p><a href="http://www.springerlink.com/content/q91566748q234325/">Realizing quality improvement through test driven development: results and experiences of four industrial teams</a></p>
</li>
<li>
<p><a href="http://www2.computer.org/portal/web/csdl/doi/10.1109/TSE.2008.36">Do Cross Cutting Concerns Cause Defects?</a> (my alternate title: &#8220;why the hell should I care about AOP?&#8221;)</p>
</li>
<li>
<p><a href="http://portal.acm.org/citation.cfm?id=1414004.1414026&amp;coll=Portal&amp;dl=GUIDE&amp;CFID=13908394&amp;CFTOKEN=39610108">Pair programming: what&#8217;s in it for me?</a></p>
</li>
<li>
<p><a href="http://research.microsoft.com/apps/pubs/default.aspx?id=70535">The Influence of Organizational Structure On Software Quality: An Empirical Case Study</a></p>
</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=HN2W16uXV_A:ioN_3ADlRWs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=HN2W16uXV_A:ioN_3ADlRWs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=HN2W16uXV_A:ioN_3ADlRWs:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2009/02/10/pair-programming-tdd-where-is-the-proof/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Upgrading git via MacPorts</title>
		<link>http://robsanheim.com/2009/01/14/upgrading-git-via-macports/</link>
		<comments>http://robsanheim.com/2009/01/14/upgrading-git-via-macports/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 02:01:24 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Git]]></category>

		<category><![CDATA[Macintosh]]></category>

		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://robsanheim.com/?p=414</guid>
		<description><![CDATA[Git 1.6.1 was released at Christmas, and if you are still on 1.6.0 or lower its well worth upgrading.  MacPorts is the way to go for Git on the Mac - the ports team has been awesome in keeping up with the latest versions.  Here&#8217;s how I upgrade:
First, make sure you have the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://git-scm.com/">Git 1.6.1</a> was released at Christmas, and if you are still on 1.6.0 or lower its well worth upgrading.  MacPorts is the way to go for Git on the Mac - the ports team has been awesome in keeping up with the latest versions.  Here&#8217;s how I upgrade:</p>
<p>First, make sure you have the latest portfiles:</p>
<p><code>sudo port sync</code></p>
<p>Deactivate any preexisting versions - not sure if this is strictly necessary, but I&#8217;ve seen failures when I don&#8217;t.</p>
<p><code>sudo port deactivate git-core</code></p>
<p>Install the new hotness, with all optional add-ons.</p>
<p><code>sudo port install git-core +svn+bash_completion+doc</code></p>
<p>Verify it:</p>
<p><code>git --version<br />
# => git version 1.6.1</code></p>
<p>Note that there is a MacPorts &#8216;upgrade&#8217; command, but I&#8217;ve seen it fail to actually upgrade things from time to time.  Doing the install this way always works for me.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=kRJA-97FC-c:zZMsHK0ZOZg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=kRJA-97FC-c:zZMsHK0ZOZg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=kRJA-97FC-c:zZMsHK0ZOZg:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2009/01/14/upgrading-git-via-macports/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MacPorts Ruby performance gotcha</title>
		<link>http://robsanheim.com/2008/11/18/macports-ruby-performance-gotcha/</link>
		<comments>http://robsanheim.com/2008/11/18/macports-ruby-performance-gotcha/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 02:51:29 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Macintosh]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://robsanheim.com/?p=402</guid>
		<description><![CDATA[If you install Ruby from MacPorts (all the cool kids do), be aware that the first 1.8.7 port had some issues that basically broke performance, making it run three times slower than normal.  Verify that you have the 1.8.7-p72_2 version active, and not 1.8.7-p72_1:


~ $ sudo port installed &#124;grep ruby
ruby @1.8.7-p72_1+thread_hooks
ruby @1.8.7-p72_2+thread_hooks (active)


The defect [...]]]></description>
			<content:encoded><![CDATA[<p>If you install Ruby from MacPorts (all the cool kids do), be aware that the first 1.8.7 port had some issues that basically broke performance, making it run three times slower than normal.  Verify that you have the <code>1.8.7-p72_2</code> version active, and not <code>1.8.7-p72_1</code>:</p>
<p><code>
<pre>
~ $ sudo port installed |grep ruby
<code>ruby @1.8.7-p72_1+thread_hooks</code>
<code>ruby @1.8.7-p72_2+thread_hooks (active)</code>
</pre>
<p></code></p>
<p>The <a href="http://trac.macports.org/ticket/17092" title="#17092 (Ruby 1.8.7 is 3x slower than its predecessor) – MacPorts – Trac">defect on MacPorts Trac</a> has more details, along with links to a relevant <a href="http://groups.google.com/group/ruby-talk-google/browse_thread/thread/2b326089f18f2b29/49b69aca0f5112e8?lnk=gst&amp;q=macports#49b69aca0f5112e8">ruby-talk thread</a>.  </p>
<p>Its worth pointing out that this issue went from discovery to being fixed and released into the port stream in about a days time.  MacPorts has really come a long way from just a year or two ago.  Fairly major packages used to lag behind the latest stable releases by multiple versions, but now I find everything I care about stays up to date with ease from MacPorts.  They are even able to keep up with <a href="http://www.macports.org/ports.php?by=name&amp;substr=git-core" title="The MacPorts Project -- Available Ports">git releases</a>, an impressive task considering how fast and furious releases git releases come.  </p>
<p>Kudos to the <a href="http://www.macports.org/ports.php?by=name&amp;substr=git-core" title="The MacPorts Project -- Available Ports">MacPorts team</a> for doing a fine job and making developers&#8217; lives easier.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=IY4o09QOeDY:gdzIcs2-Bpg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=IY4o09QOeDY:gdzIcs2-Bpg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=IY4o09QOeDY:gdzIcs2-Bpg:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2008/11/18/macports-ruby-performance-gotcha/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tarantula 0.0.5 Released - the “Naked Aardvark” release</title>
		<link>http://robsanheim.com/2008/09/26/tarantula-005-released-the-naked-aardvark-release/</link>
		<comments>http://robsanheim.com/2008/09/26/tarantula-005-released-the-naked-aardvark-release/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 15:58:41 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://robsanheim.com/2008/09/26/tarantula-005-released-the-naked-aardvark-release/</guid>
		<description><![CDATA[Announcing version 0.0.5 of Tarantula.  
Tarantula is a big fuzzy spider. It crawls your Rails application, fuzzing data to see what breaks.  It can verify HTML validation across all your pages, ensure you don&#8217;t have 404s, and pretty much anything else you want via custom handlers.
Don&#8217;t let the version number fool you, we&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>Announcing version 0.0.5 of <a href="http://github.com/relevance/tarantula/tree/master">Tarantula.</a>  </p>
<p>Tarantula is a big fuzzy spider. It crawls your Rails application, fuzzing data to see what breaks.  It can verify HTML validation across all your pages, ensure you don&#8217;t have 404s, and pretty much anything else you want via custom handlers.</p>
<p>Don&#8217;t let the version number fool you, we&#8217;ve been using Tarantula across many projects at <a href="http://thinkrelevance.com">Relevance</a> and its very stable.  This release fixed a number of annoying bugs, including namespace conflicts with other classes due to Rails dependency loading, improved gem spec with correct dependencies, and clean up on the html reporter.</p>
<p>Install it via the Github</p>
<p><code>gem install relevance-tarantula --source http://gems.github.com</code></p>
<p>or via Rails 2.1+ gem handing:</p>
<p><code>config.gem "relevance-tarantula", :source => "http://gems.github.com"</code></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=pINj08CgZ18:SeyHRu8jlDg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=pINj08CgZ18:SeyHRu8jlDg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=pINj08CgZ18:SeyHRu8jlDg:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2008/09/26/tarantula-005-released-the-naked-aardvark-release/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Scp or rsync failing with no error message?  Check your startup scripts…</title>
		<link>http://robsanheim.com/2008/09/15/scp-or-rsync-failing-with-no-error-message-check-your-startup-scripts/</link>
		<comments>http://robsanheim.com/2008/09/15/scp-or-rsync-failing-with-no-error-message-check-your-startup-scripts/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 03:52:44 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://robsanheim.com/2008/09/15/scp-or-rsync-failing-with-no-error-message-check-your-startup-scripts/</guid>
		<description><![CDATA[The other day I was having issues trying to scp/rsync data, with no real error message to try and debug things.  Turns out that any output produced by your startup scripts will break rsync/scp hard.  I had some simple &#8216;echo&#8217; statements print when different scripts were being loaded&#8230;turns out scp/rysync don&#8217;t like that.
My [...]]]></description>
			<content:encoded><![CDATA[<p>The other day I was having issues trying to scp/rsync data, with no real error message to try and debug things.  Turns out that any output produced by your startup scripts will break rsync/scp hard.  I had some simple &#8216;echo&#8217; statements print when different scripts were being loaded&#8230;turns out scp/rysync don&#8217;t like that.</p>
<p>My capistrano task was a very simple call out to the &#8216;get&#8217; helper, which just uses scp under the hood.  The task ran and looked as if it completed, only nothing was ever transferred and the scp progress bar never came up.  Sometimes it would block and do nothing, which was real fun, too.</p>
<p>The solution was simple - change all the <a href="http://github.com/relevance/etc">bash scripts</a> we use to not output any echo anything when running.  I deployed the new scripts to all servers I needed to scp with, and the issue was resolved.</p>
<p>Since this is a <a href="http://www.openssh.org/faq.html#2.9">known issue in the faq</a>, it won&#8217;t be fixed or improved with a better error message.  It&#8217;s just something you need to be aware of and work around, either via detecting if the session has an interactive terminal before sending output or removing your output statements altogether from you startup scripts.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=UkYOfCU420E:bU2nwJyLmSo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=UkYOfCU420E:bU2nwJyLmSo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=UkYOfCU420E:bU2nwJyLmSo:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2008/09/15/scp-or-rsync-failing-with-no-error-message-check-your-startup-scripts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git Clone vs cp -R –&gt; WTF?</title>
		<link>http://robsanheim.com/2008/07/30/git-clone-vs-cp-r-wtf/</link>
		<comments>http://robsanheim.com/2008/07/30/git-clone-vs-cp-r-wtf/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 01:04:44 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Git]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://robsanheim.com/2008/07/30/git-clone-vs-cp-r-wtf/</guid>
		<description><![CDATA[I knew git was fast, and I even knew it was faster than a lot of plain linux local file operations.  Still, this still blew me away:
PLAIN TEXT
CODE:




rsanheim@ares:~/src/personal/oss $ du -hd 0 insoshi/


&#160;26M&#160; &#160; insoshi/


&#160;


rsanheim@ares:~/src/personal/oss $ time git clone insoshi/ /tmp/insoshi


Initialize /tmp/insoshi/.git


Initialized empty Git repository in /private/tmp/insoshi/.git/


Checking out files: 100% &#40;2193/2193&#41;, done.


&#160;


real&#160; &#160; 0m3.826s


user&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>I knew git was fast, and I even knew it was faster than a lot of plain linux local file operations.  Still, this still blew me away:</p>
<div class="igBar"><span id="lcode-3"><a href="#" onclick="javascript:showCodeTxt('code-3'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-3">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">rsanheim@ares:~/src/personal/oss $ du -hd <span style="color:#800000;color:#800000;">0</span> insoshi/</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;26M&nbsp; &nbsp; insoshi/</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">rsanheim@ares:~/src/personal/oss $ time git clone insoshi/ /tmp/insoshi</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Initialize /tmp/insoshi/.<span style="">git</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Initialized empty Git repository in /private/tmp/insoshi/.<span style="">git</span>/</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Checking out files: <span style="color:#800000;color:#800000;">100</span>% <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;color:#800000;">2193</span>/<span style="color:#800000;color:#800000;">2193</span><span style="color:#006600; font-weight:bold;">&#41;</span>, done.</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="">real</span>&nbsp; &nbsp; 0m3.826s</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">user&nbsp; &nbsp; 0m0.251s</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">sys&nbsp;0m0.658s</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">rsanheim@ares:~/src/personal/oss $ time cp -R insoshi/ /tmp/insoshi_cp</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">real&nbsp; &nbsp; 0m9.065s</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">user&nbsp; &nbsp; 0m0.114s</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">sys&nbsp;0m1.442s </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Ok, so a 26 meg repo takes almost three times as long to copy via a recursive cp than a local git clone.  Thats a fairly small repo, lets try something bigger:</p>
<div class="igBar"><span id="lcode-4"><a href="#" onclick="javascript:showCodeTxt('code-4'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-4">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">rsanheim@ares:~/src/relevance $ du -hd <span style="color:#800000;color:#800000;">0</span> rails</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;75M&nbsp; &nbsp; rails</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">rsanheim@ares:~/src/relevance $ time git clone rails /tmp/rails2</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Initialize /tmp/rails2/.<span style="">git</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Initialized empty Git repository in /private/tmp/rails2/.<span style="">git</span>/</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">real&nbsp; &nbsp; 0m2.321s</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">user&nbsp; &nbsp; 0m0.151s</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">sys&nbsp;0m0.465s</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">rsanheim@ares:~/src/relevance $ time cp -R rails/ /tmp/rails</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">real&nbsp; &nbsp; 0m7.133s</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">user&nbsp; &nbsp; 0m0.067s</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">sys&nbsp;0m1.505s </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>The rails repo at 75 megs is still ~ 3 times faster.</p>
<p>Obviously, this is not scientific at all, but the point is pretty clear.  Git is doing some magic that lets it move files around locally 2 to 3 times faster than a plain copy.  From looking at the man page, I would guess it has something to do with git using hardlinks for things in .git/objects when cloning locally.  My linux fu falls down a bit here -- what are the ramifications of using hard links versus doing a "real" copy?</p>
<p>(This also makes me want to try out <a href="http://eigenclass.org/hiki/gibak-backup-system-introduction">gitbak</a> even more...)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=U-JDnCvqtow:gFGYgtaIcjM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=U-JDnCvqtow:gFGYgtaIcjM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=U-JDnCvqtow:gFGYgtaIcjM:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2008/07/30/git-clone-vs-cp-r-wtf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quick: Find the Bug or Gotcha with named_scope</title>
		<link>http://robsanheim.com/2008/07/23/quick-find-the-bug-or-gotcha-with-named_scope/</link>
		<comments>http://robsanheim.com/2008/07/23/quick-find-the-bug-or-gotcha-with-named_scope/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 06:42:47 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://robsanheim.com/2008/07/23/quick-find-the-bug-or-gotcha-with-named_scope/</guid>
		<description><![CDATA[Think fast!  Where's the bug?
PLAIN TEXT
RUBY:




named_scope :active, :conditions =&#62; &#91;"activated_at &#60;= ?", DateTime.now.utc.to_s&#40;:db&#41;&#93; 






Looks fine, right?  Maybe you've hit this already, and you see it immediately.  
The symptoms are that the DateTime.now always seems to be a bit off - maybe you just restarted your server and its a only a few [...]]]></description>
			<content:encoded><![CDATA[<p>Think fast!  Where's the bug?</p>
<div class="igBar"><span id="lruby-7"><a href="#" onclick="javascript:showCodeTxt('ruby-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-7">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">named_scope :active, :conditions =&gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">"activated_at &lt;= ?"</span>, DateTime.<span style="color:#9900CC;">now</span>.<span style="color:#9900CC;">utc</span>.<span style="color:#9900CC;">to_s</span><span style="color:#006600; font-weight:bold;">&#40;</span>:db<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Looks fine, right?  Maybe you've hit this already, and you see it immediately.  </p>
<p>The symptoms are that the DateTime.now always seems to be a bit off - maybe you just restarted your server and its a only a few minutes off.</p>
<p>The bug is that DateTime.now gets evaluated at the time the class is loaded, not when the finder is run.  What makes this easy to miss is that it will always work fine in tests and development, as everything is constantly getting reloaded there.</p>
<p>The fix, obvious once you've spent a combined time of over an hour trying to figure out what is going on:</p>
<div class="igBar"><span id="lruby-8"><a href="#" onclick="javascript:showCodeTxt('ruby-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-8">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">named_scope :active, <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> :conditions =&gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">"activated_at &lt;= ?"</span>, DateTime.<span style="color:#9900CC;">now</span>.<span style="color:#9900CC;">utc</span>.<span style="color:#9900CC;">to_s</span><span style="color:#006600; font-weight:bold;">&#40;</span>:db<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=rurK5TLzrXw:9p2yDz-serk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=rurK5TLzrXw:9p2yDz-serk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=rurK5TLzrXw:9p2yDz-serk:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2008/07/23/quick-find-the-bug-or-gotcha-with-named_scope/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Notes on testing Bj (Background Job)</title>
		<link>http://robsanheim.com/2008/07/10/notes-on-testing-bj-background-job/</link>
		<comments>http://robsanheim.com/2008/07/10/notes-on-testing-bj-background-job/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 07:24:39 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://robsanheim.com/2008/07/10/notes-on-testing-bj-background-job/</guid>
		<description><![CDATA[Some thoughts and random notes on testing Bj within a Rails integration test (or spec).

You have to turn transactions off for the scope of the test, or suffer very confusing issues, since Bj itself wraps the job submittal within a transaction.  The way I did this was just overriding the use_transactional_fixtures method in the [...]]]></description>
			<content:encoded><![CDATA[<p>Some thoughts and random notes on testing <a href="http://codeforpeople.rubyforge.org/svn/bj/trunk/README">Bj</a> within a Rails integration test (or spec).</p>
<ul>
<li>You have to turn transactions off for the scope of the test, or suffer very confusing issues, since Bj itself wraps the job submittal within a transaction.  The way I did this was just overriding the use_transactional_fixtures method in the one specific spec.</p>
<div class="igBar"><span id="lruby-11"><a href="#" onclick="javascript:showCodeTxt('ruby-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-11">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">describe Foo</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">use_transactional_fixtures</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">false</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
</li>
<li>Remember, bj = <strong>background</strong> job.  This may seem obvious, but whatever you submit to bj will be running in an entirely different process, so in our spec you need to wait for that job to complete before trying to assert things.  You can do something as simple as this:
<div class="igBar"><span id="lruby-12"><a href="#" onclick="javascript:showCodeTxt('ruby-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-12">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">MAX_TIME = <span style="color:#006666;color:#800000;">10</span>.<span style="color:#006666;color:#800000;">0</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; seconds = <span style="color:#006666;color:#800000;">0</span>.<span style="color:#006666;color:#800000;">0</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">while</span><span style="color:#006600; font-weight:bold;">&#40;</span>job.<span style="color:#9900CC;">pending</span>?<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; job.<span style="color:#9900CC;">reload</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; seconds += <span style="color:#006666;color:#800000;">0</span>.<span style="color:#006666;color:#800000;">5</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">sleep</span> <span style="color:#006666;color:#800000;">0</span>.<span style="color:#006666;color:#800000;">5</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">raise</span> <span style="color:#9966CC; font-weight:bold;">if</span> seconds&gt; MAX_TIME</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;"># normal assertions here </span></div>
</li>
</ol>
</div>
</div>
</div>
<p>
This gives your job up to 10 seconds to finish, and will timeout if it takes too long, which usually means something has gone wrong.
</li>
<li>You now have to watch multiple logs to figure out what is going on.  So tail your test.log and tail the bj log as well, and run the script in isolation to make sure you understand where exceptions and syntax errors will go.  I wasted some time scanning logs when I really need to check the job.stderr field that bj populates, so be sure to output that for common test failures.</li>
</ul>
<p>Overall, I've been pleased with bj, besides some open questions I've still been working out by perusing the source.  Check it out if you need a easy to use persistent job queue.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=I3aCh2FNMhc:3gOWGX3gdqo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/robsanheim/tech?a=I3aCh2FNMhc:3gOWGX3gdqo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/robsanheim/tech?i=I3aCh2FNMhc:3gOWGX3gdqo:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://robsanheim.com/2008/07/10/notes-on-testing-bj-background-job/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
