<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.2" -->
<rss version="2.0"
	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/"
	>

<channel>
	<title>BryanDonovan.com</title>
	<link>http://www.bryandonovan.com/blog</link>
	<description>A blog dedicated mostly to software development</description>
	<pubDate>Tue, 06 Dec 2011 02:17:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.2</generator>
	<language>en</language>
			<item>
		<title>Mocha - A great test framework for Node.js</title>
		<link>http://www.bryandonovan.com/blog/2011/12/05/mocha-a-great-test-framework-for-nodejs/</link>
		<comments>http://www.bryandonovan.com/blog/2011/12/05/mocha-a-great-test-framework-for-nodejs/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 02:13:17 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Node.js]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[jasmine]]></category>

		<category><![CDATA[mocha]]></category>

		<category><![CDATA[nodeunit]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[tdd]]></category>

		<category><![CDATA[vows]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/blog/2011/12/05/mocha-a-great-test-framework-for-nodejs/</guid>
		<description><![CDATA[I&#8217;ve been looking for a test framework for node.js for a while now that had all the features I was looking for.  Well, the search is over.  Mocha is hands-down the best I&#8217;ve used so far.  I like nodeunit, and have even contributed to it a bit, but the things I&#8217;ve been contributing are included in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been looking for a test framework for node.js for a while now that had all the features I was looking for.  Well, the search is over.  <a href="http://visionmedia.github.com/mocha/" title="Mocha test framework" target="_blank">Mocha</a> is hands-down the best I&#8217;ve used so far.  I like nodeunit, and have even contributed to it a bit, but the things I&#8217;ve been contributing are included in mocha.  It&#8217;s also quite a bit faster than nodeunit in my very crude benchmarks.</p>
<p>The key features for me:</p>
<ul>
<li>Before all, after all, before each, and after each hooks.</li>
<li>Nice reporters (nested, spec style is my favorite &#8212; which is what I added to nodeunit).</li>
<li>The source code is clean and well-organized.  Nodeunit&#8217;s is good too, but I find it hard to follow sometimes.</li>
<li>Tests never hang (not sure what I&#8217;m doing wrong, but a lot of tests hang for me nodeunit).</li>
<li>Async and synchronous test support. I.e., you don&#8217;t need to pass in a callback function to individual tests or test hooks unless the test or hook has an async function in it.</li>
</ul>
<p>It also has support for both &#8220;TDD&#8221; and &#8220;BDD&#8221; styles.  The Elders at <a href="http://mog.com" title="MOG" target="_blank">MOG</a> prefer the TDD syntax, so it&#8217;s nice having the ability to use that while reaping the benefits of BDD-like features.  It&#8217;s effectively the same exact thing as using the BDD syntax &#8212; it&#8217;s just using different words (&#8217;describe&#8217; vs &#8217;suite&#8217;, &#8216;it&#8217; vs &#8216;test&#8217;).</p>
<p>A couple of drawbacks (or future features hopefully):</p>
<ul>
<li>No support for recursively running all tests in a directory and its subdirectories.  This is solvable with a quick Makefile line though.</li>
<li>Can&#8217;t intertwine BDD and TDD styles (not without some ugly hacks anyway).  I.e., it would be cool if one guy on the team strongly preferred to use &#8216;describe&#8217; instead of &#8217;suite&#8217;, that Mocha would detect it somehow and let them run side-by-side with the TDD-style tests.</li>
</ul>
<p>That&#8217;s a short list of minor complaints, folks.  I highly recommend trying it.</p>
<p>P.s. I&#8217;ve only barely used Jasmine, but it seems like there was some limitation (at the time anyway) that made it difficult to use with nodejs.  Could be totally wrong though.  A lot of people like Vows as well, but I had a hard time getting into that syntax, and it sure as hell wouldn&#8217;t fly with The Elders.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2011/12/05/mocha-a-great-test-framework-for-nodejs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to test has_and_belongs_to_many (HABTM) associations</title>
		<link>http://www.bryandonovan.com/blog/2010/11/11/how-to-test-has_and_belongs_to_many-habtm-associations/</link>
		<comments>http://www.bryandonovan.com/blog/2010/11/11/how-to-test-has_and_belongs_to_many-habtm-associations/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 17:58:50 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[RSpec]]></category>

		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/2010/11/11/how-to-test-has_and_belongs_to_many-habtm-associations/</guid>
		<description><![CDATA[I recently inherited some code from someone who didn&#8217;t write any unit tests/specs, and was tasked with fixing a has_and_belongs_to_many bug where the IDs in the join table were backwards.  E.g., if we had a cars table and tires table, and the join table was cars_tables, the car_id being set was actually the tire_id, [...]]]></description>
			<content:encoded><![CDATA[<p>I recently inherited some code from someone who didn&#8217;t write any unit tests/specs, and was tasked with fixing a has_and_belongs_to_many bug where the IDs in the join table were backwards.  E.g., if we had a cars table and tires table, and the join table was cars_tables, the car_id being set was actually the tire_id, and vice-versa. This was because we weren&#8217;t using the default association names &#8212; instead of the association tires being called by &#8216;cars.tires&#8217;, it was &#8216;cars.related_tires&#8217;.  To do this, you pass extra params to the habtm method to specify the class_name, foreign_key, and association_foreign_key.  It&#8217;s easy to mix up the two foreign key params, which is what happened here.</p>
<p>So I wrote some RSpec model specs to reproduce the bug and fix it.  Turns out it&#8217;s a bit tricky reproducing the bug in tests.  Let me demonstrate.</p>
<p>Here are the models with the wrong foreign_key and association_foreign_key params set in the habtm method:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#DD7522;">class</span> Car &lt; <span style="color:#6666ff;">ActiveRecord::Base</span>
  has_and_belongs_to_many <span style="color:#5098C2;">:related_tires</span>,
   <span style="color:#5098C2;">:join_table</span> =&gt; <span style="color:#669933;">'cars_tires'</span>,
   <span style="color:#5098C2;">:class_name</span> =&gt; <span style="color:#669933;">'Tire'</span>,
   <span style="color:#5098C2;">:association_foreign_key</span> =&gt; <span style="color:#669933;">'car_id'</span>,
   <span style="color:#5098C2;">:foreign_key</span> =&gt; <span style="color:#669933;">'tire_id'</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">class</span> Tire &lt; <span style="color:#6666ff;">ActiveRecord::Base</span>
  has_and_belongs_to_many <span style="color:#5098C2;">:related_cars</span>,
   <span style="color:#5098C2;">:join_table</span> =&gt; <span style="color:#669933;">'cars_tires'</span>,
   <span style="color:#5098C2;">:class_name</span> =&gt; <span style="color:#669933;">'Car'</span>,
   <span style="color:#5098C2;">:association_foreign_key</span> =&gt; <span style="color:#669933;">'tire_id'</span>,
   <span style="color:#5098C2;">:foreign_key</span> =&gt; <span style="color:#669933;">'car_id'</span>
<span style="color:#DD7522;">end</span></pre></div></div>

<p>And here is the RSpec test that I initially wrote:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">describe Car <span style="color:#DD7522;">do</span>
  before<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:each</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DD7522;">do</span>
    <span style="color:#0066ff;">@car</span>  = Car.<span style="color:#F3C55F;">create</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:name</span>  =&gt; <span style="color:#669933;">'Big Truck'</span><span style="color:#DDDDDD;">&#41;</span>
    <span style="color:#0066ff;">@tire</span> = Tire.<span style="color:#F3C55F;">create</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:name</span> =&gt; <span style="color:#669933;">'Big Tire'</span><span style="color:#DDDDDD;">&#41;</span>
  <span style="color:#DD7522;">end</span>
&nbsp;
  it <span style="color:#669933;">&quot;should associate tire as related_tire&quot;</span> <span style="color:#DD7522;">do</span>
    <span style="color:#0066ff;">@car</span>.<span style="color:#F3C55F;">related_tires</span> &lt;&lt; <span style="color:#0066ff;">@tire</span>
    <span style="color:#0066ff;">@car</span>.<span style="color:#F3C55F;">related_tires</span>.<span style="color:#F3C55F;">size</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#EDDD3D;">1</span>
    <span style="color:#0066ff;">@tire</span>.<span style="color:#F3C55F;">related_cars</span>.<span style="color:#F3C55F;">size</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#EDDD3D;">1</span>
    <span style="color:#0066ff;">@car</span>.<span style="color:#F3C55F;">related_tires</span>.<span style="color:#F3C55F;">first</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#0066ff;">@tire</span>
    <span style="color:#0066ff;">@tire</span>.<span style="color:#F3C55F;">related_cars</span>.<span style="color:#F3C55F;">first</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#0066ff;">@car</span>
  <span style="color:#DD7522;">end</span>
<span style="color:#DD7522;">end</span></pre></div></div>

<p>The above spec passes.  But I knew what was being written to the cars_tires table was wrong.  I figured I could create a few extra Car objects initially, to make sure the @car.id and @tire.id aren&#8217;t both the same.  I added this to the before(:each) block:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">     <span style="color:#EDDD3D;">3</span>.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> 
      Car.<span style="color:#F3C55F;">create</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:name</span> =&gt; <span style="color:#669933;">&quot;Foo&quot;</span> + <span style="color:#DD7522;">rand</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#EDDD3D;">100</span><span style="color:#DDDDDD;">&#41;</span>.<span style="color:#F3C55F;">to_s</span><span style="color:#DDDDDD;">&#41;</span>
    <span style="color:#DD7522;">end</span></pre></div></div>

<p>But that still didn&#8217;t work.  Since the foreign_key and association_foreign_key are backwards in both tables, the Ruby association methods return the correct results.</p>
<p>I was able to reproduce the bug by checking what is actually written to the join table:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"> it <span style="color:#669933;">&quot;should set the correct car_id and tire_id in cars_tires table&quot;</span> <span style="color:#DD7522;">do</span>
    count_query = <span style="color:#669933;">&quot;select count(*) as qty from cars_tires&quot;</span>
    qty = Car.<span style="color:#F3C55F;">connection</span>.<span style="color:#F3C55F;">select_one</span><span style="color:#DDDDDD;">&#40;</span>count_query<span style="color:#DDDDDD;">&#41;</span><span style="color:#DDDDDD;">&#91;</span><span style="color:#669933;">'qty'</span><span style="color:#DDDDDD;">&#93;</span>.<span style="color:#F3C55F;">to_i</span>
    qty.<span style="color:#F3C55F;">should</span> == <span style="color:#EDDD3D;">0</span>
    <span style="color:#0066ff;">@tire</span>.<span style="color:#F3C55F;">related_cars</span> &lt;&lt; <span style="color:#0066ff;">@car</span>
    <span style="color:#0066ff;">@tire</span>.<span style="color:#F3C55F;">related_cars</span>.<span style="color:#F3C55F;">size</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#EDDD3D;">1</span>
    <span style="color:#0066ff;">@tire</span>.<span style="color:#F3C55F;">related_cars</span>.<span style="color:#F3C55F;">first</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#0066ff;">@car</span>
    Car.<span style="color:#F3C55F;">connection</span>.<span style="color:#F3C55F;">select_one</span><span style="color:#DDDDDD;">&#40;</span>count_query<span style="color:#DDDDDD;">&#41;</span><span style="color:#DDDDDD;">&#91;</span><span style="color:#669933;">'qty'</span><span style="color:#DDDDDD;">&#93;</span>.<span style="color:#F3C55F;">to_i</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#EDDD3D;">1</span>
    query = <span style="color:#669933;">&quot;select * from cars_tires&quot;</span>
    res = Car.<span style="color:#F3C55F;">connection</span>.<span style="color:#F3C55F;">select_one</span><span style="color:#DDDDDD;">&#40;</span>query<span style="color:#DDDDDD;">&#41;</span>
    inserted_tire_id = res<span style="color:#DDDDDD;">&#91;</span><span style="color:#669933;">&quot;tire_id&quot;</span><span style="color:#DDDDDD;">&#93;</span>
    inserted_car_id  = res<span style="color:#DDDDDD;">&#91;</span><span style="color:#669933;">&quot;car_id&quot;</span><span style="color:#DDDDDD;">&#93;</span>
    inserted_tire_id.<span style="color:#F3C55F;">to_i</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#0066ff;">@tire</span>.<span style="color:#F3C55F;">id</span>
    inserted_car_id.<span style="color:#F3C55F;">to_i</span>.<span style="color:#F3C55F;">should</span> == <span style="color:#0066ff;">@car</span>.<span style="color:#F3C55F;">id</span>
  <span style="color:#DD7522;">end</span></pre></div></div>

<p>Now the spec fails:</p>
<pre>
Car
  should associate tire as related_tire
  should set the correct car_id and tire_id in cars_tires table (FAILED - 1)

1)
'Car should set the correct car_id and tire_id in cars_tires table' FAILED
expected: 1,
     got: 4 (using ==)
./spec/models/car_spec.rb:32:

Finished in 0.168799 seconds

2 examples, 1 failure
</pre>
<p>And swapping the foreign_key and association_foreign_key values in the models fixes the problem.  </p>
<p>So, if you use a non-default name for your HABTM associations, you might want to run an extra test like this to make sure it&#8217;s really doing what you think it is.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2010/11/11/how-to-test-has_and_belongs_to_many-habtm-associations/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rubystats 0.2.3 released</title>
		<link>http://www.bryandonovan.com/blog/2008/07/06/rubystats-023-released/</link>
		<comments>http://www.bryandonovan.com/blog/2008/07/06/rubystats-023-released/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 19:42:31 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[ruby rubystats]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/2008/07/06/rubystats-023-released/</guid>
		<description><![CDATA[Thanks to Franz Schwartau who noticed a bug in the Rubystats gem, and after four hours of debugging, I&#8217;ve released Rubystats 0.2.3 which fixes the bug* Franz found in the beta distribution calculations.
Thanks again, Franz.
 * By bug I mean bugs, and by bugs I mean stupid mistakes in my code and lack of sufficient test [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to Franz Schwartau who noticed a bug in the <a href="http://rubystats.rubyforge.org" title="rubystats gem on rubyforge">Rubystats</a> gem, and after four hours of debugging, I&#8217;ve released Rubystats 0.2.3 which fixes the <a href="http://rubyforge.org/tracker/index.php?func=detail&amp;aid=21100&amp;group_id=1227&amp;atid=4833">bug</a>* Franz found in the beta distribution calculations.</p>
<p>Thanks again, Franz.</p>
<p><em> * By bug I mean bugs, and by bugs I mean stupid mistakes in my code and lack of sufficient test coverage.  But hey, this was some of the first ruby code I wrote (in fact I learned a lot of the ruby syntax in this project because I ported it from the PHPMath library), so I&#8217;m not surprised.  Not to say that the Rubystats library is junk.. it&#8217;s worked flawlessly for me for a few years now and has quite a bit of test coverage (more than PHPMath does &#8212; I implemented the tests from PHPMath and then some), but it&#8217;s certainly not perfect yet. It&#8217;s great to have members of the community finding bugs and letting me know about them.  That&#8217;s what open source is all about I guess. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2008/07/06/rubystats-023-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Heel RubyGem</title>
		<link>http://www.bryandonovan.com/blog/2008/04/25/heel-rubygem/</link>
		<comments>http://www.bryandonovan.com/blog/2008/04/25/heel-rubygem/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 16:28:03 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[heel thin ruby coderay launchy]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/2008/04/25/heel-rubygem/</guid>
		<description><![CDATA[I recently came across the Heel RubyGem.  To quote the RDoc page, &#8220;Heel is a small static web server for use when you need a quick web server for a directory. Once the server is running, heel will use launchy to open your browser at the URL of your document root.&#8221;  It uses [...]]]></description>
			<content:encoded><![CDATA[<p>I recently came across the Heel RubyGem.  To quote the RDoc page, &#8220;<a href="http://copiousfreetime.rubyforge.org/heel/classes/Heel.html">Heel</a> is a small static web server for use when you need a quick web server for a directory. Once the server is running, heel will use <a href="http://copiousfreetime.rubyforge.org/launchy/">launchy</a> to open your browser at the URL of your document root.&#8221;  It uses <a href="http://code.macournoyer.com/thin/">Thin</a> as a webserver</p>
<p>It&#8217;s just nice to, for example, launch Heel in your system&#8217;s rubygems directory so you can easily browse around. You can view ruby files with syntax highlighting (using <a href="http://coderay.rubychan.de/">coderay</a>).  Here&#8217;s a sample ruby file.. as you can see, it&#8217;s nicely done:</p>
<p><img src="http://www.bryandonovan.com/ruby/wp-content/uploads/2008/04/heel.png" alt="heel image" height="388" vspace="5" width="339" /></p>
<p>I was just looking the Thin webserver and came across this.  It&#8217;s been handy so far.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2008/04/25/heel-rubygem/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Writing tests for acts_as plugins</title>
		<link>http://www.bryandonovan.com/blog/2008/02/20/writing-tests-for-acts_as-plugins/</link>
		<comments>http://www.bryandonovan.com/blog/2008/02/20/writing-tests-for-acts_as-plugins/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 23:52:44 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[ruby rails tests ActiveRecord]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/2008/02/20/writing-tests-for-acts_as-plugins/</guid>
		<description><![CDATA[It took me a while to figure out a good way to approach this, so thought I&#8217;d share.  I&#8217;ve been wondering how to best write test code for a Rails plugin that deals with ActiveRecord models, and after trying a few different approaches, I decided to do the thing I should have done in [...]]]></description>
			<content:encoded><![CDATA[<p>It took me a while to figure out a good way to approach this, so thought I&#8217;d share.  I&#8217;ve been wondering how to best write test code for a Rails plugin that deals with ActiveRecord models, and after trying a few different approaches, I decided to do the thing I should have done in the first place: look at the test code for the plugins in Rails core.  The acts_as_tree <a href="http://dev.rubyonrails.org/svn/rails/plugins/acts_as_tree/test/acts_as_tree_test.rb" target="_blank">test code</a> is what I ended up using as a guide for my <a href="http://code.google.com/p/rails-multifielddate-plugin/source/browse/plugins/multi_field_date/test/multi_field_date_test.rb?r=8" target="_blank">tests</a> for <a href="http://code.google.com/p/rails-multifielddate-plugin/" target="_blank">MultiFieldDate</a>.  This approach uses SQLite as an in-memory database, so you do have to have SQLite3 and the sqlite3-ruby gem installed for this to work.  Alternatively, this should work with other database engines, but it would probably be a good idea to use table prefixes in those cases to avoid conflicts with existing tables.</p>
<p>Here&#8217;s a snippet of the MultiFieldDate test code:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#DD7522;">require</span> <span style="color:#669933;">'test/unit'</span>
<span style="color:#DD7522;">require</span> <span style="color:#669933;">'rubygems'</span>
<span style="color:#DD7522;">require</span> <span style="color:#669933;">'active_record'</span>
$:.<span style="color:#F3C55F;">unshift</span> <span style="color:#DD7522;">File</span>.<span style="color:#F3C55F;">dirname</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#DD7522;">__FILE__</span><span style="color:#DDDDDD;">&#41;</span> + <span style="color:#669933;">'/../lib'</span>
<span style="color:#DD7522;">require</span> <span style="color:#DD7522;">File</span>.<span style="color:#F3C55F;">dirname</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#DD7522;">__FILE__</span><span style="color:#DDDDDD;">&#41;</span> + <span style="color:#669933;">'/../init'</span>
&nbsp;
<span style="color:#6666ff;">ActiveRecord::Base</span>.<span style="color:#F3C55F;">establish_connection</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:adapter</span> =&gt; <span style="color:#669933;">&quot;sqlite3&quot;</span>, <span style="color:#5098C2;">:dbfile</span> =&gt; <span style="color:#669933;">&quot;:memory:&quot;</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
<span style="color:#7B7B7B; font-style:italic;"># AR keeps printing annoying schema statements</span>
<span style="color:#ff6633;">$stdout</span> = <span style="color:#DD7522;">StringIO</span>.<span style="color:#F3C55F;">new</span>
&nbsp;
<span style="color:#DD7522;">def</span> setup_db
  <span style="color:#6666ff;">ActiveRecord::Base</span>.<span style="color:#F3C55F;">logger</span>
  <span style="color:#6666ff;">ActiveRecord::Schema</span>.<span style="color:#F3C55F;">define</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:version</span> =&gt; <span style="color:#EDDD3D;">1</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DD7522;">do</span>
    create_table <span style="color:#5098C2;">:people</span> <span style="color:#DD7522;">do</span> |t|
      t.<span style="color:#F3C55F;">column</span> <span style="color:#5098C2;">:name</span>, <span style="color:#5098C2;">:string</span>
      t.<span style="color:#F3C55F;">column</span> <span style="color:#5098C2;">:birth_date</span>, <span style="color:#5098C2;">:date</span>
      t.<span style="color:#F3C55F;">column</span> <span style="color:#5098C2;">:birth_year</span>, <span style="color:#5098C2;">:integer</span>
      t.<span style="color:#F3C55F;">column</span> <span style="color:#5098C2;">:birth_month</span>, <span style="color:#5098C2;">:integer</span>
      t.<span style="color:#F3C55F;">column</span> <span style="color:#5098C2;">:birth_day</span>, <span style="color:#5098C2;">:integer</span>
    <span style="color:#DD7522;">end</span>
  <span style="color:#DD7522;">end</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">def</span> teardown_db
  <span style="color:#6666ff;">ActiveRecord::Base</span>.<span style="color:#F3C55F;">connection</span>.<span style="color:#F3C55F;">tables</span>.<span style="color:#F3C55F;">each</span> <span style="color:#DD7522;">do</span> |table|
    <span style="color:#6666ff;">ActiveRecord::Base</span>.<span style="color:#F3C55F;">connection</span>.<span style="color:#F3C55F;">drop_table</span><span style="color:#DDDDDD;">&#40;</span>table<span style="color:#DDDDDD;">&#41;</span>
  <span style="color:#DD7522;">end</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">class</span> Person &lt; <span style="color:#6666ff;">ActiveRecord::Base</span>
  multi_field_date <span style="color:#5098C2;">:birth</span>, <span style="color:#5098C2;">:date_field</span> =&gt; <span style="color:#669933;">'birth_date'</span>, <span style="color:#5098C2;">:year_field</span> =&gt; <span style="color:#669933;">'birth_year'</span>,
  <span style="color:#5098C2;">:month_field</span> =&gt; <span style="color:#669933;">'birth_month'</span>, <span style="color:#5098C2;">:day_field</span> =&gt; <span style="color:#669933;">'birth_day'</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">class</span> PersonTest &lt; <span style="color:#6666ff;">Test::Unit::TestCase</span>
&nbsp;
  <span style="color:#DD7522;">def</span> setup
    setup_db
  <span style="color:#DD7522;">end</span>
&nbsp;
  <span style="color:#DD7522;">def</span> teardown
    teardown_db
  <span style="color:#DD7522;">end</span>
&nbsp;
  <span style="color:#DD7522;">def</span> test_create_without_birth_date
    person = Person.<span style="color:#F3C55F;">new</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:name</span> =&gt; <span style="color:#669933;">'Joe Jones'</span><span style="color:#DDDDDD;">&#41;</span>
    person.<span style="color:#F3C55F;">save</span>
    assert<span style="color:#DDDDDD;">&#40;</span>person.<span style="color:#F3C55F;">valid</span>?, <span style="color:#DD7522;">true</span><span style="color:#DDDDDD;">&#41;</span>
  <span style="color:#DD7522;">end</span>
<span style="color:#7B7B7B; font-style:italic;">#...</span>
<span style="color:#DD7522;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2008/02/20/writing-tests-for-acts_as-plugins/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Upgrading to Rails 2.0</title>
		<link>http://www.bryandonovan.com/blog/2008/02/16/upgrading-to-rails-20/</link>
		<comments>http://www.bryandonovan.com/blog/2008/02/16/upgrading-to-rails-20/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 19:15:53 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rails ruby]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/2008/02/16/upgrading-to-rails-20/</guid>
		<description><![CDATA[Here&#8217;s a couple one-liner scripts to help convert your Rails app to 2.0.  These scripts are by no means perfect, but should help if you have a lot of files with &#8220;start_form_tag&#8221;, &#8220;end_form_tag&#8221;, or &#8220;:post =&#62; true&#8221;.  Back your files up first, of course.

find . &#124;grep -i &#34;\.erb$&#34; &#124; xargs ruby -p -i [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a couple one-liner scripts to help convert your Rails app to 2.0.  These scripts are by no means perfect, but should help if you have a lot of files with &#8220;start_form_tag&#8221;, &#8220;end_form_tag&#8221;, or &#8220;:post =&gt; true&#8221;.  Back your files up first, of course.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">find . |grep -i <span style="color:#669933;">&quot;<span style="color:#000099;">\.</span>erb$&quot;</span> | xargs ruby -<span style="color:#DD7522;">p</span> -i -e <span style="color:#669933;">&quot;gsub(/&lt;%=.*start_form_tag(.*)%&gt;/i, '&lt;% form_tag <span style="color:#000099;">\1</span> do -%&gt;')&quot;</span>
find . |grep -i <span style="color:#669933;">&quot;<span style="color:#000099;">\.</span>erb$&quot;</span> | xargs ruby -<span style="color:#DD7522;">p</span> -i -e <span style="color:#669933;">&quot;gsub(/&lt;%.*end_form_tag.*%&gt;/i, '&lt;% end #form_tag-%&gt;')&quot;</span>
find . |grep -i <span style="color:#669933;">&quot;<span style="color:#000099;">\.</span>erb$&quot;</span> | xargs ruby -<span style="color:#DD7522;">p</span> -i -e <span style="color:#669933;">'gsub(/:post<span style="color:#000099;">\s</span>=&gt;<span style="color:#000099;">\s</span>true/i, &quot;:method<span style="color:#000099;">\s</span>=&gt;<span style="color:#000099;">\s</span>:post&quot;)'</span></pre></div></div>

<p>Replace &#8220;erb&#8221; with &#8220;rtml&#8221; if you haven&#8217;t converted your views to .erb yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2008/02/16/upgrading-to-rails-20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Responses to benchmarks</title>
		<link>http://www.bryandonovan.com/blog/2008/02/06/responses-to-benchmarks/</link>
		<comments>http://www.bryandonovan.com/blog/2008/02/06/responses-to-benchmarks/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 15:33:52 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/2008/02/06/responses-to-benchmarks/</guid>
		<description><![CDATA[A couple people posted responses to the benchmarks on my Sun blog, so here they are.
From Susan Potter:
Bryan,
I wrote a benchmarking blog post in October last year relating to the difference in code-level optimizations between Ruby 1.8.6 and Ruby 1.9.0 and how the roles were reversed in these two versions: (link)

And her direct response:
This is [...]]]></description>
			<content:encoded><![CDATA[<p>A couple people posted responses to the benchmarks on my Sun blog, so here they are.</p>
<p>From <a href="http://snakesgemscoffee.susanpotter.net/">Susan Potter</a>:</p>
<blockquote><p>Bryan,</p>
<p>I wrote a benchmarking blog post in October last year relating to the difference in code-level optimizations between Ruby 1.8.6 and Ruby 1.9.0 and how the roles were reversed in these two versions: (<a href="http://blog.managedopensource.com/2007/10/31/reversal-of-code-performance-optimizations-from-ruby-1-8-to-1-9" target="_blank">link</a>)<a href="http://blog.managedopensource.com/2007/10/31/reversal-of-code-performance-optimizations-from-ruby-1-8-to-1-9" rel="nofollow"><br />
</a></p></blockquote>
<p>And her direct response:</p>
<blockquote><p>This is a response to Bryan Donovan’s blog post called ways to pass options.</p>
<p>Bryan’s original benchmark was run on Ruby 1.8.4.  I will be running the benchmarks on Ruby 1.8.6 and Ruby 1.9 to demonstrate performance reversal of code level optimizations between Ruby versions (as I did in Ruby performance reversal benchmark 1.8 to 1.9).<br />
I will use Bryan’s Ruby benchmark code to run for both Ruby 1.8.6 and Ruby 1.9.0 (official).</p>
<p>Ruby 1.8.6 Results</p>
<p>Below are the results of running the options passing benchmark in Ruby 1.8.6:</p></blockquote>

<div class="wp_syntax"><div class="code"><pre class="ruby">With no option values passed
Rehearsal -------------------------------------------
delete:   <span style="color:#EDDD3D;">0.290000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.340000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.428564</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.700000</span>   <span style="color:#EDDD3D;">0.190000</span>   <span style="color:#EDDD3D;">0.890000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.017415</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.370000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.420000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.509209</span><span style="color:#DDDDDD;">&#41;</span>
---------------------------------- total: <span style="color:#EDDD3D;">1</span>.650000sec
&nbsp;
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.300000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.350000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.428401</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.760000</span>   <span style="color:#EDDD3D;">0.130000</span>   <span style="color:#EDDD3D;">0.890000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.010474</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.360000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.410000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.490170</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With some option values passed
Rehearsal -------------------------------------------
delete:   <span style="color:#EDDD3D;">0.360000</span>   <span style="color:#EDDD3D;">0.060000</span>   <span style="color:#EDDD3D;">0.420000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.505094</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.890000</span>   <span style="color:#EDDD3D;">0.130000</span>   <span style="color:#EDDD3D;">1.020000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.150165</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.390000</span>   <span style="color:#EDDD3D;">0.070000</span>   <span style="color:#EDDD3D;">0.460000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.563713</span><span style="color:#DDDDDD;">&#41;</span>
---------------------------------- total: <span style="color:#EDDD3D;">1</span>.900000sec
&nbsp;
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.340000</span>   <span style="color:#EDDD3D;">0.060000</span>   <span style="color:#EDDD3D;">0.400000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.489191</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.920000</span>   <span style="color:#EDDD3D;">0.110000</span>   <span style="color:#EDDD3D;">1.030000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.149708</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.350000</span>   <span style="color:#EDDD3D;">0.090000</span>   <span style="color:#EDDD3D;">0.440000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.528287</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With all option values passed
Rehearsal -------------------------------------------
delete:   <span style="color:#EDDD3D;">0.420000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.470000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.547446</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.970000</span>   <span style="color:#EDDD3D;">0.130000</span>   <span style="color:#EDDD3D;">1.100000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.228093</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.420000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.470000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.574593</span><span style="color:#DDDDDD;">&#41;</span>
---------------------------------- total: <span style="color:#EDDD3D;">2</span>.040000sec
&nbsp;
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.400000</span>   <span style="color:#EDDD3D;">0.050000</span>   <span style="color:#EDDD3D;">0.450000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.485888</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.960000</span>   <span style="color:#EDDD3D;">0.140000</span>   <span style="color:#EDDD3D;">1.100000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.237509</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.400000</span>   <span style="color:#EDDD3D;">0.060000</span>   <span style="color:#EDDD3D;">0.460000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.536063</span><span style="color:#DDDDDD;">&#41;</span></pre></div></div>

<p>Ruby 1.9.0 Results</p>
<p>Below are the results of running the options passing benchmark in Ruby 1.9.0:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">With no option values passed
Rehearsal -------------------------------------------
delete:   <span style="color:#EDDD3D;">0.150000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.150000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.230391</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.540000</span>   <span style="color:#EDDD3D;">0.010000</span>   <span style="color:#EDDD3D;">0.550000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.645735</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.120000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.120000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.188468</span><span style="color:#DDDDDD;">&#41;</span>
---------------------------------- total: <span style="color:#EDDD3D;">0</span>.820000sec
&nbsp;
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.160000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.160000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.238828</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.520000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.520000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.610940</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.120000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.120000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.180744</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With some option values passed
Rehearsal -------------------------------------------
delete:   <span style="color:#EDDD3D;">0.220000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.220000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.294110</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.690000</span>   <span style="color:#EDDD3D;">0.010000</span>   <span style="color:#EDDD3D;">0.700000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.803382</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.220000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.220000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.297869</span><span style="color:#DDDDDD;">&#41;</span>
---------------------------------- total: <span style="color:#EDDD3D;">1</span>.140000sec
&nbsp;
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.210000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.210000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.283983</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.700000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.700000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.802766</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.230000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.230000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.295433</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With all option values passed
Rehearsal -------------------------------------------
delete:   <span style="color:#EDDD3D;">0.270000</span>   <span style="color:#EDDD3D;">0.010000</span>   <span style="color:#EDDD3D;">0.280000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.348052</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.770000</span>   <span style="color:#EDDD3D;">0.040000</span>   <span style="color:#EDDD3D;">0.810000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.947252</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.240000</span>   <span style="color:#EDDD3D;">0.010000</span>   <span style="color:#EDDD3D;">0.250000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.336790</span><span style="color:#DDDDDD;">&#41;</span>
---------------------------------- total: <span style="color:#EDDD3D;">1</span>.340000sec
&nbsp;
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.280000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.280000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.660810</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.750000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.750000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">1.618925</span><span style="color:#DDDDDD;">&#41;</span>
or_nil:   <span style="color:#EDDD3D;">0.240000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.240000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.478159</span><span style="color:#DDDDDD;">&#41;</span></pre></div></div>

<blockquote><p>In Ruby 1.8.6 the delete code is consistently more efficient, whereas in Ruby 1.9.0 the or_nil code is mostly more efficient, except for the With some option values passed scenario.</p>
<p>This once again shows that when optimizing performance on the code level, you need to be careful that you justify your micro-optimizations before you create code spaghetti just “because….”.  Readability and maintainability is most important and when needed, only then should you optimize.</p></blockquote>
<p><strong>Charles Oliver Nutter&#8217;s Response</strong><br />
<a href="http://headius.blogspot.com/">Charles Oliver Nutter</a> (of JRuby) responded as well:</p>
<blockquote><p> Stumbled on your blog post and ran the same numbers in JRuby on soylatte Java 6 on basically the same machine. My numbers for Ruby 1.8.6p111 were roughly the same as yours.</p>
<p>Here&#8217;s Ruby:</p></blockquote>

<div class="wp_syntax"><div class="code"><pre class="ruby"> user <span style="color:#DD7522;">system</span> total real
delete: <span style="color:#EDDD3D;">0.200000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.200000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.207049</span><span style="color:#DDDDDD;">&#41;</span>
merge: <span style="color:#EDDD3D;">0.710000</span> <span style="color:#EDDD3D;">0.010000</span> <span style="color:#EDDD3D;">0.720000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.720514</span><span style="color:#DDDDDD;">&#41;</span>
or_nil: <span style="color:#EDDD3D;">0.260000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.260000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.256742</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With some option values passed
&nbsp;
user <span style="color:#DD7522;">system</span> total real
delete: <span style="color:#EDDD3D;">0.250000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.250000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.260502</span><span style="color:#DDDDDD;">&#41;</span>
merge: <span style="color:#EDDD3D;">0.810000</span> <span style="color:#EDDD3D;">0.010000</span> <span style="color:#EDDD3D;">0.820000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.818434</span><span style="color:#DDDDDD;">&#41;</span>
or_nil: <span style="color:#EDDD3D;">0.290000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.290000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.294220</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With all option values passed
&nbsp;
user <span style="color:#DD7522;">system</span> total real
delete: <span style="color:#EDDD3D;">0.320000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.320000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.319335</span><span style="color:#DDDDDD;">&#41;</span>
merge: <span style="color:#EDDD3D;">0.890000</span> <span style="color:#EDDD3D;">0.010000</span> <span style="color:#EDDD3D;">0.900000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.896330</span><span style="color:#DDDDDD;">&#41;</span>
or_nil: <span style="color:#EDDD3D;">0.330000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.330000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.336673</span><span style="color:#DDDDDD;">&#41;</span></pre></div></div>

<blockquote><p>And here&#8217;s JRuby:</p></blockquote>

<div class="wp_syntax"><div class="code"><pre class="ruby">With no option values passed
&nbsp;
user <span style="color:#DD7522;">system</span> total real
delete: <span style="color:#EDDD3D;">0.133000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.133000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.133000</span><span style="color:#DDDDDD;">&#41;</span>
merge: <span style="color:#EDDD3D;">0.318000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.318000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.319000</span><span style="color:#DDDDDD;">&#41;</span>
or_nil: <span style="color:#EDDD3D;">0.474000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.474000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.474000</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With some option values passed
&nbsp;
user <span style="color:#DD7522;">system</span> total real
delete: <span style="color:#EDDD3D;">0.170000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.170000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.169000</span><span style="color:#DDDDDD;">&#41;</span>
merge: <span style="color:#EDDD3D;">0.295000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.295000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.295000</span><span style="color:#DDDDDD;">&#41;</span>
or_nil: <span style="color:#EDDD3D;">0.145000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.145000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.146000</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With all option values passed
&nbsp;
user <span style="color:#DD7522;">system</span> total real
delete: <span style="color:#EDDD3D;">0.154000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.154000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.154000</span><span style="color:#DDDDDD;">&#41;</span>
merge: <span style="color:#EDDD3D;">0.289000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.289000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.288000</span><span style="color:#DDDDDD;">&#41;</span>
or_nil: <span style="color:#EDDD3D;">0.101000</span> <span style="color:#EDDD3D;">0.000000</span> <span style="color:#EDDD3D;">0.101000</span> <span style="color:#DDDDDD;">&#40;</span> <span style="color:#EDDD3D;">0.100000</span><span style="color:#DDDDDD;">&#41;</span></pre></div></div>

<blockquote><p>Looks like something&#8217;s artificially slowing down the &#8220;or_nil&#8221; case in the first scenario, but the rest of the numbers look pretty solid.</p></blockquote>
<p>Interesting results all around.  I&#8217;m not going to lose sleep over the milliseconds I&#8217;m saving/losing with various approaches, so I&#8217;ll likely use the ops = ops[:foo] || &#8216;default&#8217; approach for readability.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2008/02/06/responses-to-benchmarks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby: benchmarking ways to pass options to a method</title>
		<link>http://www.bryandonovan.com/blog/2008/02/05/ruby-benchmarking-ways-to-pass-options-to-a-method/</link>
		<comments>http://www.bryandonovan.com/blog/2008/02/05/ruby-benchmarking-ways-to-pass-options-to-a-method/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 19:40:06 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[ruby rails benchmarking optimization]]></category>

		<guid isPermaLink="false">http://www.bryandonovan.com/ruby/?p=5</guid>
		<description><![CDATA[(reposting from my Sun blog)
I&#8217;ve wondered before what the fastest way is to pass a hash of options to a method in Ruby.. so today I benchmarked a few methods I&#8217;ve used in the past.
I&#8217;ve seen three main ways of passing an options hash to a method and extracting the options or use default values [...]]]></description>
			<content:encoded><![CDATA[<p>(reposting from my <a href="http://blogs.sun.com/bdonovan/entry/ruby_benchmarking_ways_to_pass" title="sun blog">Sun blog</a>)</p>
<p>I&#8217;ve wondered before what the fastest way is to pass a hash of options to a method in Ruby.. so today I benchmarked a few methods I&#8217;ve used in the past.</p>
<p>I&#8217;ve seen three main ways of passing an options hash to a method and extracting the options or use default values if they weren&#8217;t passed in:</p>
<ul>
<li>Merge the options with a hash of defaults, then assign values to local variables (or just use the options hash directly within the method)</li>
<li>Use something like <span style="font-family: monospace">var = options[:var] || &#8216;default&#8217; </span></li>
<li>Use the delete method on the hash, e.g., <span style="font-family: monospace">var = options.delete(:var) || &#8216;default&#8217;</span></li>
</ul>
<p>From what I can tell, using <span style="font-family: monospace">delete</span> is the fastest:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby"><span style="color:#DD7522;">require</span> <span style="color:#669933;">'benchmark'</span>
&nbsp;
<span style="color:#DD7522;">def</span> ops_delete<span style="color:#DDDDDD;">&#40;</span>ops=<span style="color:#DDDDDD;">&#123;</span><span style="color:#DDDDDD;">&#125;</span><span style="color:#DDDDDD;">&#41;</span>
  a = ops.<span style="color:#F3C55F;">delete</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span><span style="color:#DDDDDD;">&#41;</span> || <span style="color:#EDDD3D;">11</span>
  b = ops.<span style="color:#F3C55F;">delete</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:b</span><span style="color:#DDDDDD;">&#41;</span> || <span style="color:#EDDD3D;">22</span>
  c = ops.<span style="color:#F3C55F;">delete</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:c</span><span style="color:#DDDDDD;">&#41;</span> || <span style="color:#EDDD3D;">33</span>
  d = ops.<span style="color:#F3C55F;">delete</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:d</span><span style="color:#DDDDDD;">&#41;</span> || <span style="color:#EDDD3D;">44</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">def</span> ops_merge<span style="color:#DDDDDD;">&#40;</span>ops=<span style="color:#DDDDDD;">&#123;</span><span style="color:#DDDDDD;">&#125;</span><span style="color:#DDDDDD;">&#41;</span>
  ops = <span style="color:#DDDDDD;">&#123;</span>:a =&gt; <span style="color:#EDDD3D;">11</span>, <span style="color:#5098C2;">:b</span> =&gt; <span style="color:#EDDD3D;">22</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">33</span>, <span style="color:#5098C2;">:d</span> =&gt; <span style="color:#EDDD3D;">44</span><span style="color:#DDDDDD;">&#125;</span>.<span style="color:#F3C55F;">merge</span><span style="color:#DDDDDD;">&#40;</span>ops<span style="color:#DDDDDD;">&#41;</span>
  a = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:a</span><span style="color:#DDDDDD;">&#93;</span>
  b = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:b</span><span style="color:#DDDDDD;">&#93;</span>
  c = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:c</span><span style="color:#DDDDDD;">&#93;</span>
  d = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:d</span><span style="color:#DDDDDD;">&#93;</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">def</span> ops_or<span style="color:#DDDDDD;">&#40;</span>ops=<span style="color:#DDDDDD;">&#123;</span><span style="color:#DDDDDD;">&#125;</span><span style="color:#DDDDDD;">&#41;</span>
  a = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:a</span><span style="color:#DDDDDD;">&#93;</span> || <span style="color:#EDDD3D;">11</span>
  b = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:b</span><span style="color:#DDDDDD;">&#93;</span> || <span style="color:#EDDD3D;">22</span>
  c = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:c</span><span style="color:#DDDDDD;">&#93;</span> || <span style="color:#EDDD3D;">33</span>
  d = ops<span style="color:#DDDDDD;">&#91;</span><span style="color:#5098C2;">:d</span><span style="color:#DDDDDD;">&#93;</span> || <span style="color:#EDDD3D;">44</span>
<span style="color:#DD7522;">end</span>
&nbsp;
&nbsp;
n = <span style="color:#EDDD3D;">100000</span>
<span style="color:#DD7522;">puts</span> <span style="color:#669933;">&quot;With no option values passed&quot;</span>
<span style="color:#DD7522;">Benchmark</span>.<span style="color:#F3C55F;">bmbm</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#EDDD3D;">7</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DD7522;">do</span> |x|
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;delete:&quot;</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_delete; <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;merge:&quot;</span><span style="color:#DDDDDD;">&#41;</span>  <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_merge;  <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;ops_or:&quot;</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_or;     <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">puts</span>
<span style="color:#DD7522;">puts</span> <span style="color:#669933;">&quot;With some option values passed&quot;</span>
<span style="color:#DD7522;">Benchmark</span>.<span style="color:#F3C55F;">bmbm</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#EDDD3D;">7</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DD7522;">do</span> |x|
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;delete:&quot;</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_delete<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span> =&gt; <span style="color:#EDDD3D;">5</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">2</span><span style="color:#DDDDDD;">&#41;</span>; <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;merge:&quot;</span><span style="color:#DDDDDD;">&#41;</span>  <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_merge<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span> =&gt; <span style="color:#EDDD3D;">5</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">2</span><span style="color:#DDDDDD;">&#41;</span>;  <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;ops_or:&quot;</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_or<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span> =&gt; <span style="color:#EDDD3D;">5</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">2</span><span style="color:#DDDDDD;">&#41;</span>;     <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
<span style="color:#DD7522;">end</span>
&nbsp;
<span style="color:#DD7522;">puts</span>
<span style="color:#DD7522;">puts</span> <span style="color:#669933;">&quot;With all option values passed&quot;</span>
<span style="color:#DD7522;">Benchmark</span>.<span style="color:#F3C55F;">bmbm</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#EDDD3D;">7</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DD7522;">do</span> |x|
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;delete:&quot;</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_delete<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span> =&gt; <span style="color:#EDDD3D;">5</span>, <span style="color:#5098C2;">:b</span> =&gt; <span style="color:#EDDD3D;">1</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">2</span>, <span style="color:#5098C2;">:d</span> =&gt; <span style="color:#EDDD3D;">4</span><span style="color:#DDDDDD;">&#41;</span>; <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;merge:&quot;</span><span style="color:#DDDDDD;">&#41;</span>  <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_merge<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span> =&gt; <span style="color:#EDDD3D;">5</span>, <span style="color:#5098C2;">:b</span> =&gt; <span style="color:#EDDD3D;">1</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">2</span>, <span style="color:#5098C2;">:d</span> =&gt; <span style="color:#EDDD3D;">4</span><span style="color:#DDDDDD;">&#41;</span>;  <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
  x.<span style="color:#F3C55F;">report</span><span style="color:#DDDDDD;">&#40;</span><span style="color:#669933;">&quot;ops_or:&quot;</span><span style="color:#DDDDDD;">&#41;</span> <span style="color:#DDDDDD;">&#123;</span> n.<span style="color:#F3C55F;">times</span> <span style="color:#DD7522;">do</span> ops_or<span style="color:#DDDDDD;">&#40;</span><span style="color:#5098C2;">:a</span> =&gt; <span style="color:#EDDD3D;">5</span>, <span style="color:#5098C2;">:b</span> =&gt; <span style="color:#EDDD3D;">1</span>, <span style="color:#5098C2;">:c</span> =&gt; <span style="color:#EDDD3D;">2</span>, <span style="color:#5098C2;">:d</span> =&gt; <span style="color:#EDDD3D;">4</span><span style="color:#DDDDDD;">&#41;</span>;     <span style="color:#DD7522;">end</span> <span style="color:#DDDDDD;">&#125;</span>
<span style="color:#DD7522;">end</span></pre></div></div>

<p>Results (rehearsals omitted):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">With no option values passed
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.210000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.210000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.209877</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.720000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.720000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.750394</span><span style="color:#DDDDDD;">&#41;</span>
ops_or:   <span style="color:#EDDD3D;">0.260000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.260000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.258416</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With some option values passed
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.250000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.250000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.255536</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.830000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.830000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.831358</span><span style="color:#DDDDDD;">&#41;</span>
ops_or:   <span style="color:#EDDD3D;">0.310000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.310000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.314737</span><span style="color:#DDDDDD;">&#41;</span>
&nbsp;
With all option values passed
              user     <span style="color:#DD7522;">system</span>      total        real
delete:   <span style="color:#EDDD3D;">0.310000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.310000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.306889</span><span style="color:#DDDDDD;">&#41;</span>
merge:    <span style="color:#EDDD3D;">0.900000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.900000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.905261</span><span style="color:#DDDDDD;">&#41;</span>
ops_or:   <span style="color:#EDDD3D;">0.340000</span>   <span style="color:#EDDD3D;">0.000000</span>   <span style="color:#EDDD3D;">0.340000</span> <span style="color:#DDDDDD;">&#40;</span>  <span style="color:#EDDD3D;">0.348061</span><span style="color:#DDDDDD;">&#41;</span></pre></div></div>

<p>This was done in Ruby 1.8.4 on a 2GHz MacBook Intel Core Duo with 1GB 667 MHz DDR2 SDRAM.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryandonovan.com/blog/2008/02/05/ruby-benchmarking-ways-to-pass-options-to-a-method/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

