<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Ruby</title>
	<link rel="self" href="http://planetruby.0x42.net/atom.xml"/>
	<link href="http://planetruby.0x42.net/"/>
	<id>http://planetruby.0x42.net/atom.xml</id>
	<updated>2009-07-03T18:02:17+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Hash tables: separate chaining vs. double hashing</title>
		<link href="http://eigenclass.org/R2/writings/separate-chaining-vs-double-hashing"/>
		<id>http://eigenclass.org/R2/writings/separate-chaining-vs-double-hashing</id>
		<updated>2009-07-02T13:22:19+00:00</updated>
		<content type="html">&lt;div&gt;&lt;b&gt;This entry uses &lt;a href=&quot;http://www.math.union.edu/locate/jsMath&quot;&gt;jsMath&lt;/a&gt; to display mathematical expressions. Please go to the main site
                   if some fail to render.&lt;/b&gt;&lt;hr /&gt;&lt;/div&gt;&lt;p&gt;In my earlier &lt;a href=&quot;http://eigenclass.org/R2/writings/finite-map-benchmarks&quot;&gt;finite map benchmarks&lt;/a&gt; which compared several hash tables and functional maps (AVL trees and ternary trees), separate chaining (with $$\alpha = 0.47$$) beat double hashing ($$\alpha = 0.42$$) at unsuccessful searches (1% hit rate), but was slower at successful ones.&lt;/p&gt;&lt;p&gt;Theory predicts the following average number of probes for unsuccessful and successful lookups (expressions below): &lt;img src=&quot;http://eigenclass.org/R2/files/separate-chaining-vs-double-hashing/unsuccessful1.png&quot; alt=&quot;Unsuccessful searches, same load factor&quot; /&gt; &lt;img src=&quot;http://eigenclass.org/R2/files/separate-chaining-vs-double-hashing/successful1.png&quot; alt=&quot;Successful searches, same load factor&quot; /&gt;&lt;/p&gt;&lt;p&gt;Separate chaining looks &lt;em&gt;much&lt;/em&gt; better here, but the graphs are misleading, because we don't actually care as much about the load factor as about memory usage, so we want to compare the collision resolution schemes when the latter is the same.&lt;/p&gt;&lt;p&gt;If we use a linked list for the collision chain, this represents one word of overhead per item compared to double hashing. For instance, if the load factor with separate chaining is 1, we can afford to have a table twice as big with double hashing for the same amount of memory and a load factor of 50%. In other words, $$N + n = N'$$ where $$N$$ and $$N'$$ are the sizes of the tables for separate chaining and double hashing, and $$n$$ the number of elements. The respective load factors are&lt;/p&gt;&lt;div&gt;&lt;code&gt;\[\begin{eqnarray*}
\alpha &amp;amp; = &amp;amp; \frac{n}{N}\\
\alpha' &amp;amp; = &amp;amp; \frac{n}{N'}\\
 &amp;amp; = &amp;amp; \frac{n}{N+n}\\
\alpha' &amp;amp; = &amp;amp; \frac{\alpha}{1+\alpha}\end{eqnarray*}
\]&lt;/code&gt;&lt;/div&gt;&lt;p&gt;The expressions for the average number of probes for unsuccessful and successful searches are (Knuth, TAOCP Vol 3, Section 6.4), for separate chaining&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://eigenclass.org/R2/writings/separate-chaining-vs-double-hashing&quot;&gt;Read more...&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/eigenclass?a=WxiaQY5B74I:8qkHTzgcino:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/eigenclass?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Mauricio Fernandez</name>
			<uri>http://eigenclass.org</uri>
		</author>
		<source>
			<title type="html">eigenclass</title>
			<subtitle type="html">eigenclass</subtitle>
			<link rel="self" href="http://eigenclass.org/hiki.rb?c=rss;format=1;tags=blog"/>
			<id>http://eigenclass.org/hiki.rb?c=rss;format=1;tags=blog</id>
			<updated>2009-07-03T11:01:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Math typesetting with jsMath</title>
		<link href="http://eigenclass.org/R2/writings/ocsiblog-jsmath-support"/>
		<id>http://eigenclass.org/R2/writings/ocsiblog-jsmath-support</id>
		<updated>2009-07-02T10:21:46+00:00</updated>
		<content type="html">&lt;div&gt;&lt;b&gt;This entry uses &lt;a href=&quot;http://www.math.union.edu/locate/jsMath&quot;&gt;jsMath&lt;/a&gt; to display mathematical expressions. Please go to the main site
                   if some fail to render.&lt;/b&gt;&lt;hr /&gt;&lt;/div&gt;&lt;p&gt;I've added math typesetting support to Ocsiblog, which runs this site, using &lt;a href=&quot;http://www.math.union.edu/~dpvc/jsMath/welcome.html&quot;&gt;jsMath&lt;/a&gt;: (double-click on the equations to see the sources)&lt;/p&gt;&lt;div&gt;&lt;code&gt;\[\begin{eqnarray*}
\nabla.D &amp;amp; = &amp;amp; \rho\\
\nabla.B &amp;amp; = &amp;amp; 0\\
\nabla\times E &amp;amp; = &amp;amp; -\frac{\partial B}{\partial t}\\
\nabla\times H &amp;amp; = &amp;amp; j+\frac{\partial D}{\partial t}\end{eqnarray*}
\]&lt;/code&gt;&lt;/div&gt;&lt;p&gt;When jsMath is enabled, you'll see in the bottom right-hand corner a button that triggers a control panel allowing you to set several options such as the scale or the rendering mechanism (TeX fonts, image fonts or native Unicode fonts; you can pick the one that works best for you and save the configuration --- the best one is TeX fonts, if you have them, but Unicode fonts is quite decent).  For best viewing, you can &lt;a href=&quot;http://www.math.union.edu/~dpvc/jsMath/users/fonts.html&quot;&gt;get the TeX fonts here&lt;/a&gt; (the page includes detailed install instructions for Windows, OSX and Un*x).&lt;/p&gt;&lt;p&gt;Here's what the above equations should look like with TeX and native Unicode fonts: &lt;img src=&quot;http://eigenclass.org/R2/files/ocsiblog-jsmath-support/texfonts.png&quot; alt=&quot;TeX&quot; /&gt; &lt;img src=&quot;http://eigenclass.org/R2/files/ocsiblog-jsmath-support/unicode.png&quot; alt=&quot;Unicode&quot; /&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/eigenclass?a=fmKE38R9yEA:21SyGznMPkw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/eigenclass?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Mauricio Fernandez</name>
			<uri>http://eigenclass.org</uri>
		</author>
		<source>
			<title type="html">eigenclass</title>
			<subtitle type="html">eigenclass</subtitle>
			<link rel="self" href="http://eigenclass.org/hiki.rb?c=rss;format=1;tags=blog"/>
			<id>http://eigenclass.org/hiki.rb?c=rss;format=1;tags=blog</id>
			<updated>2009-07-03T11:01:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Productivity tip: Let Derek Sivers Take Notes for You</title>
		<link href="http://www.chadfowler.com/2009/7/1/producitivity-tip-let-derek-sivers-take-notes-for-you"/>
		<id>tag:www.chadfowler.com,2009-07-01:20828</id>
		<updated>2009-07-02T01:10:29+00:00</updated>
		<content type="html">&lt;p&gt;I just finished reading the inspiring &lt;a href=&quot;http://www.amazon.com/E-Myth-Revisited-Small-Businesses-About/dp/0887307280/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1246487770&amp;amp;sr=8-1&quot;&gt;The E-Myth Revisited&lt;/a&gt;, which like my own first book &lt;a href=&quot;http://www.pragprog.com/titles/mjwti/my-job-went-to-india&quot;&gt;My Job Went to India&lt;/a&gt; suffers from an incredibly bad name.&lt;/p&gt;


	&lt;p&gt;This is definitely one of the most practically useful and potentially career-changing business books I’ve read. As I started getting toward the end, I realized that I should have been taking notes. The book is an excellent read, but at its core, it can be distilled into a clear outline of stuff to &lt;em&gt;do&lt;/em&gt; after you read it.  I was reading on my Kindle, which I’m still not good at using as a quick reference device. So, while I was excited about going back through the book and making myself a &lt;span class=&quot;caps&quot;&gt;TODO&lt;/span&gt; list, I wasn’t sure how to best do it.&lt;/p&gt;


	&lt;p&gt;Then I remembered Derek Sivers’ &lt;a href=&quot;http://sivers.org/book&quot;&gt;book list&lt;/a&gt;. Derek has obviously spent a &lt;em&gt;lot&lt;/em&gt; of time thoughtfully preparing a list of recommended books with reasons behind each recommendation. Not only that, he includes &lt;a href=&quot;http://sivers.org/book/EMythRevisited&quot;&gt;detailed notes&lt;/a&gt; on each book.  I read his notes on E-Myth Revisited and was pleased to see that all of the important stuff is captured. Thanks Derek!&lt;/p&gt;


	&lt;p&gt;Speaking of Derek and books, don’t miss his book, &lt;a href=&quot;http://sivers.org/pdf&quot;&gt;How to Call Attention to Your Music&lt;/a&gt;. It might be titled for musicians but I think everyone will find something valuable inside.&lt;/p&gt;</content>
		<author>
			<name>chad</name>
			<uri>http://www.chadfowler.com/</uri>
		</author>
		<source>
			<title type="html">ChadFowler.com - Home</title>
			<link rel="self" href="http://www.chadfowler.com/index.cgi?rss"/>
			<id>tag:www.chadfowler.com,2009:mephisto/</id>
			<updated>2009-07-02T23:00:54+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Ruby Hoedown 2009 mini-Interview with Jeremy McAnally</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/GP6EKDyyffA/ruby-hoedown-2009-mini-interview-with.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-3348268220449502312</id>
		<updated>2009-06-30T12:22:26+00:00</updated>
		<content type="html">Jeremy McAnally (@jm) is a good friend, and we've worked together on regional Ruby conferences and other projects.  With the Ruby Hoedown looming, I thought it was about time to sit down with him for a mini-interview about his free conference.  How have the community and your sponsors responded to making the Ruby Hoedown free? Jeremy Everyone has largely been in two camps: &quot;Wow that's awesome!&quot; &lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/GP6EKDyyffA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2009-06-30T19:01:01+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">A Ruby Couple:  Interview with James and Dana Gray</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/ZLQNnnpzrdI/ruby-couple-interview-with-james-and.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-4153762788165966179</id>
		<updated>2009-06-24T10:34:06+00:00</updated>
		<content type="html">It's another week without a Questions Five Ways discussion, but I've got another great interview that more than makes up for it.  James Gray (@JEG2) is very well known in the Ruby community.  His wife, Dana, is less well known, but won't stay that way for long.  Fresh from her Ruby presenting debut, a lightning talk on Ruby regular expressions at MWRC, the two of them are embarking on a joint &lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/ZLQNnnpzrdI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2009-06-30T19:01:01+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Community Highlights: Ruby Heroes</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/GRpbbG-Zgx8/community-highlights-ruby-heroes"/>
		<id>tag:weblog.rubyonrails.org,2009-06-12:25338</id>
		<updated>2009-06-19T15:55:56+00:00</updated>
		<content type="html">&lt;p&gt;This week I’m happy to tell you about a new set of articles which will be appearing here on the Rails blog called “Community Highlights”.  This new series will feature people/projects/sites from the Rails community that may deserve a little extra recognition.&lt;/p&gt;


	&lt;p&gt;This week, we’re going to start with a few people who received awards on stage at Railsconf 2009, this years Ruby Heroes.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Brian Helmkamp&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2009/6/10/Picture_444_1.png&quot; /&gt;
&lt;div&gt;Brian has been a contributing member of the Ruby community for 4 years now, but is most well known for his testing library &lt;a href=&quot;http://gitrdoc.com/brynary/webrat/tree/master/&quot;&gt;Webrat&lt;/a&gt;.  He’s a contributer to Rails, RSpec, Rubinius, and is a co-author on the recent &lt;a href=&quot;http://www.pragprog.com/titles/achbd/the-rspec-book&quot;&gt;RSpec Book&lt;/a&gt;.  More recently he’s been helping out the Rails core team with Rack:Test, and Rack:Debug.&lt;/div&gt;&lt;/p&gt;


	&lt;p&gt;His Blog: &lt;a href=&quot;http://www.brynary.com/&quot;&gt;http://www.brynary.com/&lt;/a&gt;
Twitter: &lt;a href=&quot;http://twitter.com/brynary&quot;&gt;brynary&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;Aman Gupta&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2009/6/10/Picture_445_1.png&quot; /&gt;
&lt;div&gt;Aman has taken over the maintenance, new features, and the recent releases of &lt;a href=&quot;http://rubyeventmachine.com/&quot;&gt;EventMachine&lt;/a&gt;, which is an invaluable tool for writing fast ruby applications. He’s also the author behind &lt;a href=&quot;http://github.com/tmm1/amqp/tree&quot;&gt;amqp&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://github.com/tmm1/xmpp4em/tree&quot;&gt;xmpp4em&lt;/a&gt; gems which are deployed far and wide.&lt;/div&gt;&lt;/p&gt;


	&lt;p&gt;Github: &lt;a href=&quot;http://github.com/tmm1&quot;&gt;http://github.com/tmm1&lt;/a&gt;&lt;br /&gt;
Twitter: &lt;a href=&quot;http://twitter.com/tmm1&quot;&gt;tmm1&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;Luis Lavena&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2009/6/12/LuisLavena.png&quot; /&gt;
&lt;div&gt;Luis has done a lot for the Ruby community in Argentina, but he’s most well known in our community for the work he’s done for windows users maintaining the &lt;a href=&quot;http://rubyforge.org/projects/rubyinstaller/&quot;&gt;One-Click Ruby Installer&lt;/a&gt;.  Recently he’s put up a &lt;a href=&quot;http://pledgie.com/campaigns/4435&quot;&gt;Plegie&lt;/a&gt; to help get the windows installer a new home.&lt;/div&gt;&lt;/p&gt;


	&lt;p&gt;His Blog: &lt;a href=&quot;http://blog.mmediasys.com/&quot;&gt;http://blog.mmediasys.com/&lt;/a&gt;
Twitter: &lt;a href=&quot;http://twitter.com/luislavena&quot;&gt;luislavena&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;Pat Allan&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2009/6/12/Pat-Allan.png&quot; /&gt;
&lt;div&gt;Pat is the mastermind behind &lt;a href=&quot;http://freelancing-god.github.com/ts/en/&quot;&gt;Thinking Sphinx&lt;/a&gt; which has become a standard when it comes to full-text search in Rails.  He is also the author of the excellent &lt;a href=&quot;http://peepcode.com/products/thinking-sphinx-pdf&quot;&gt;Thinking Sphinx&lt;/a&gt; PDF book and one of the founders of &lt;a href=&quot;http://railscamp08.org/&quot;&gt;Railscamp&lt;/a&gt;, where I hear he makes some killer pancakes.&lt;/div&gt;&lt;/p&gt;


	&lt;p&gt;His Blog: &lt;a href=&quot;http://freelancing-gods.com/&quot;&gt;http://freelancing-gods.com/&lt;/a&gt;
Twitter: &lt;a href=&quot;http://twitter.com/Pat&quot;&gt;Pat&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;Dan Kubb&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2009/6/12/DanKubb.png&quot; /&gt;
&lt;div&gt;Dan been tirelessly working on one of the hardest Ruby projects around, &lt;a href=&quot;http://datamapper.org/doku.php&quot;&gt;DataMapper&lt;/a&gt;.  He became the official maintainer after Sam Smoot and since then has completely rewritten the test suite to give DataMapper better coverage, has come up with a viable path to completion, and is currently working on making sure DataMapper works great with Rails 3.&lt;/div&gt;&lt;/p&gt;


	&lt;p&gt;Github: &lt;a href=&quot;http://github.com/dkubb&quot;&gt;http://github.com/dkubb&lt;/a&gt;&lt;br /&gt;
Twitter: &lt;a href=&quot;http://twitter.com/dkubb&quot;&gt;dkubb&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;John Nunemaker&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://weblog.rubyonrails.org/assets/2009/6/12/JohnNunemaker.png&quot; /&gt;
&lt;div&gt;Although John Nunemaker has released several widely used open source libraries, like &lt;a href=&quot;http://httparty.rubyforge.org/&quot;&gt;HTTParty&lt;/a&gt; and &lt;a href=&quot;http://happymapper.rubyforge.org/&quot;&gt;HappyMapper&lt;/a&gt;, his main contribution in my opinion comes from his blog &lt;a href=&quot;http://railstips.org/&quot;&gt;Rails Tips&lt;/a&gt;.  Over the past year he’s written an incredible number &lt;a href=&quot;http://railstips.org/smorgasbord/&quot;&gt;educational blog posts&lt;/a&gt; on many Ruby and Rails topics.&lt;/div&gt;&lt;/p&gt;


	&lt;p&gt;RailsTips: &lt;a href=&quot;http://railstips.org/&quot;&gt;http://railstips.org/&lt;/a&gt;&lt;br /&gt;
Twitter: &lt;a href=&quot;http://twitter.com/jnunemaker&quot;&gt;jnunemaker&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Those are your six Ruby Hero’s for 2009. If you’re interested you can also &lt;a href=&quot;http://railsconf.blip.tv/file/2086061/&quot;&gt;watch a video&lt;/a&gt; of the award ceremony which talks more about the methodology about how they were chosen and see 5 of these guys receive their awards on stage at Railsconf 2009.&lt;/p&gt;</content>
		<author>
			<name>Gregg Pollack</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2009:mephisto/</id>
			<updated>2009-07-03T09:01:47+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Finite maps galore: imperative code strikes back</title>
		<link href="http://eigenclass.org/R2/writings/finite-map-benchmarks"/>
		<id>http://eigenclass.org/R2/writings/finite-map-benchmarks</id>
		<updated>2009-06-19T10:16:51+00:00</updated>
		<content type="html">&lt;div&gt;&lt;b&gt;This entry uses &lt;a href=&quot;http://www.math.union.edu/locate/jsMath&quot;&gt;jsMath&lt;/a&gt; to display mathematical expressions. Please go to the main site
                   if some fail to render.&lt;/b&gt;&lt;hr /&gt;&lt;/div&gt;&lt;p&gt;Matías Giovannini has been implementing purely functional data structures based on &lt;a href=&quot;http://www.cs.princeton.edu/~rs/strings/&quot;&gt;Bentley and Sedgewick's ternary search trees (TST)&lt;/a&gt; and pitching them against OCaml's imperative hash table (Hashtbl). In the interval between the &lt;a href=&quot;http://alaska-kamtchatka.blogspot.com/2009/06/algorithm-conscious-cache-oblivious.html&quot;&gt;initial results&lt;/a&gt; and his showing his &lt;a href=&quot;http://alaska-kamtchatka.blogspot.com/2009/06/simple-efficient-trie-maps.html&quot;&gt;first version&lt;/a&gt; (called Trie_map from now on), I made a functional TST (&amp;quot;Ternary&amp;quot;) which compares favorably to both Trie_map and the &lt;a href=&quot;http://alaska-kamtchatka.blogspot.com/2009/06/tree-nursery.html&quot;&gt;revised implementation&lt;/a&gt; (&amp;quot;Trie_map_mod&amp;quot;).&lt;/p&gt;&lt;p&gt;I also resuscitated a hash table implementation of mine that uses open addressing with double hashing (in contrast to Hashtbl's external chaining) and exhibits vastly improved performance.&lt;/p&gt;&lt;p&gt;I'll show the benchmark results first, to be followed by some code and analysis.&lt;/p&gt;&lt;h2&gt; Benchmarks&lt;/h2&gt;&lt;p&gt;I benchmark the following finite map implementations:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;imperative:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Fasthashtbl: hash table with open addressing and double hashing&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hashtbl: the hash table from INRIA's stdlib (external chaining)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hashtbl_mod: Hashtbl with more aggressive resizing (lower load factor)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hashtbl_hval: Hashtbl_mod with caching of the hash value&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;functional:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Trie_map: TST with coalesced constructor for nodes with and without values&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Trie_map_mod: TST with different constructors for leaves and inner nodes with/without a value&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ternary: TST with separate constructor for nodes with and without values but no leaf constructor&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Map: the Map implementation from INRIA's stdlib (AVL tree)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All the finite maps are compared by&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;building a map with 98568 English words, which are added in (a) randomized and (b) lexicographic order&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;measuring the minimal lookup cost with constant lookups (so that everything is in the L1 cache)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;timing successful lookups by looking for the 98568 words&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;in the same (random) order the elements were added&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;in randomized order&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;in lexicographic order&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;in reverse lexicographic order&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;... against the maps built in randomized and lexicographic order&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;timing searches against the previously generated maps (randomized and lexicographic order) using&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;a larger set of English words (217625, 45.3% hit rate)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;a set of Spanish words (86016 words, 1.3% hit rate)&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;... in randomized and lexicographic order&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For the sake of exhaustiveness, I measure the iteration and functor overhead and detract it from the lookup timings. The total size of the structures (including the size of the strings) is also measured. All the measurements are repeated 20 times, and the best time is retained. The benchmarks are performed in a single program execution to achieve steady state (major heap resized to required size). The set of words used in the map is large enough to ensure the structure (taking 5.7MB to over 12MB) doesn't fit in the 2MB L2 cache.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;http://eigenclass.org/static/finite-map-bm.txt&quot;&gt;full results can be found here&lt;/a&gt; (also includes hash table benchmark with integer keys).&lt;/p&gt;&lt;p&gt;This table shows the results for a map built in randomized order (refer to the full output for those in lexicographic order).  Speed is measured in ops/sec, and size in bytes (&amp;quot;Find (hit, orig)&amp;quot; means that the lookups are performed in the same random order as the insertions).&lt;/p&gt;&lt;h3&gt; Insertion (randomized order) and lookup&lt;/h3&gt;&lt;table&gt;
&lt;tbody&gt;

&lt;tr&gt;
&lt;th&gt;Data structure&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Load factor&lt;/th&gt;
&lt;th&gt;Insertion (rand)&lt;/th&gt;
&lt;th&gt;Find (constant)&lt;/th&gt;
&lt;th&gt;Find (hit, rand)&lt;/th&gt;
&lt;th&gt;Find (hit, orig)&lt;/th&gt;
&lt;th&gt;Find (hit, sorted)&lt;/th&gt;
&lt;th&gt;Find (45.3%, rand)&lt;/th&gt;
&lt;th&gt;Find (1.3%, rand)&lt;/th&gt;
&lt;th&gt;Find (1.3% sorted)&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;FastHashtbl&lt;/th&gt;
&lt;td&gt;7325544&lt;/td&gt;
&lt;td&gt;0.376&lt;/td&gt;
&lt;td&gt;1509558&lt;/td&gt;
&lt;td&gt;16701222&lt;/td&gt;
&lt;td&gt;2669067&lt;/td&gt;
&lt;td&gt;3554728&lt;/td&gt;
&lt;td&gt;3958575&lt;/td&gt;
&lt;td&gt;2347248&lt;/td&gt;
&lt;td&gt;3243197&lt;/td&gt;
&lt;td&gt;5133702&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Hashtbl&lt;/th&gt;
&lt;td&gt;5752664&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1105131&lt;/td&gt;
&lt;td&gt;5617227&lt;/td&gt;
&lt;td&gt;2136562&lt;/td&gt;
&lt;td&gt;2296294&lt;/td&gt;
&lt;td&gt;2791035&lt;/td&gt;
&lt;td&gt;1623434&lt;/td&gt;
&lt;td&gt;1731465&lt;/td&gt;
&lt;td&gt;2229713&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Hashtbl_mod&lt;/th&gt;
&lt;td&gt;7325528&lt;/td&gt;
&lt;td&gt;0.376&lt;/td&gt;
&lt;td&gt;639994&lt;/td&gt;
&lt;td&gt;7373058&lt;/td&gt;
&lt;td&gt;2711193&lt;/td&gt;
&lt;td&gt;2963744&lt;/td&gt;
&lt;td&gt;3893034&lt;/td&gt;
&lt;td&gt;2249186&lt;/td&gt;
&lt;td&gt;2926475&lt;/td&gt;
&lt;td&gt;4403349&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Hashtbl_hval&lt;/th&gt; &lt;!-- ds --&gt;
&lt;td&gt;8114072&lt;/td&gt; &lt;!-- size --&gt;
&lt;td&gt;0.376&lt;/td&gt; &lt;!-- alpha --&gt;
&lt;td&gt;675892&lt;/td&gt; &lt;!-- insert rand --&gt;
&lt;td&gt;10457458&lt;/td&gt; &lt;!-- constant --&gt;
&lt;td&gt;2769387&lt;/td&gt; &lt;!-- hit --&gt;
&lt;td&gt;3056772&lt;/td&gt; &lt;!-- hit, same --&gt;
&lt;td&gt;4153404&lt;/td&gt; &lt;!-- hit, sorted --&gt;
&lt;td&gt;2435018&lt;/td&gt; &lt;!-- 45.3 --&gt;
&lt;td&gt;3436621&lt;/td&gt; &lt;!-- 1.3 rand --&gt;
&lt;td&gt;5542555&lt;/td&gt; &lt;!-- 1.3 sorted --&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Ternary&lt;/th&gt; &lt;!-- ds --&gt;
&lt;td&gt;11894440&lt;/td&gt; &lt;!-- size --&gt;
&lt;td&gt;&lt;/td&gt; &lt;!-- alpha --&gt;
&lt;td&gt;179599&lt;/td&gt; &lt;!-- insert rand --&gt;
&lt;td&gt;14739138&lt;/td&gt; &lt;!-- constant --&gt;
&lt;td&gt;1484213&lt;/td&gt; &lt;!-- hit --&gt;
&lt;td&gt;1556592&lt;/td&gt; &lt;!-- hit, same --&gt;
&lt;td&gt;4576735&lt;/td&gt; &lt;!-- hit, sorted --&gt;
&lt;td&gt;1567019&lt;/td&gt; &lt;!-- 45.3 --&gt;
&lt;td&gt;2419841&lt;/td&gt; &lt;!-- 1.3 rand --&gt;
&lt;td&gt;6466320&lt;/td&gt; &lt;!-- 1.3 sorted --&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Trie_map&lt;/th&gt; &lt;!-- ds --&gt;
&lt;td&gt;&lt;/td&gt; &lt;!-- size --&gt;
&lt;td&gt;&lt;/td&gt; &lt;!-- alpha --&gt;
&lt;td&gt;99834&lt;/td&gt; &lt;!-- insert rand --&gt;
&lt;td&gt;11870073&lt;/td&gt; &lt;!-- constant --&gt;
&lt;td&gt;985476&lt;/td&gt; &lt;!-- hit --&gt;
&lt;td&gt;1024257&lt;/td&gt; &lt;!-- hit, same --&gt;
&lt;td&gt;3022102&lt;/td&gt; &lt;!-- hit, sorted --&gt;
&lt;td&gt;1085412&lt;/td&gt; &lt;!-- 45.3 --&gt;
&lt;td&gt;1797166&lt;/td&gt; &lt;!-- 1.3 rand --&gt;
&lt;td&gt;5763597&lt;/td&gt; &lt;!-- 1.3 sorted --&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Trie_map_mod&lt;/th&gt; &lt;!-- ds --&gt;
&lt;td&gt;12417768&lt;/td&gt; &lt;!-- size --&gt;
&lt;td&gt;&lt;/td&gt; &lt;!-- alpha --&gt;
&lt;td&gt;164725&lt;/td&gt; &lt;!-- insert rand --&gt;
&lt;td&gt;8476101&lt;/td&gt; &lt;!-- constant --&gt;
&lt;td&gt;1284442&lt;/td&gt; &lt;!-- hit --&gt;
&lt;td&gt;1340733&lt;/td&gt; &lt;!-- hit, same --&gt;
&lt;td&gt;3246878&lt;/td&gt; &lt;!-- hit, sorted --&gt;
&lt;td&gt;1417483&lt;/td&gt; &lt;!-- 45.3 --&gt;
&lt;td&gt;2151898&lt;/td&gt; &lt;!-- 1.3 rand --&gt;
&lt;td&gt;4811496&lt;/td&gt; &lt;!-- 1.3 sorted --&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th&gt;Map&lt;/th&gt; &lt;!-- ds --&gt;
&lt;td&gt;6805440&lt;/td&gt; &lt;!-- size --&gt;
&lt;td&gt;&lt;/td&gt; &lt;!-- alpha --&gt;
&lt;td&gt;167046&lt;/td&gt; &lt;!-- insert rand --&gt;
&lt;td&gt;1168963&lt;/td&gt; &lt;!-- constant --&gt;
&lt;td&gt;674209&lt;/td&gt; &lt;!-- hit --&gt;
&lt;td&gt;671368&lt;/td&gt; &lt;!-- hit, same --&gt;
&lt;td&gt;1026645&lt;/td&gt; &lt;!-- hit, sorted --&gt;
&lt;td&gt;556788&lt;/td&gt; &lt;!-- 45.3 --&gt;
&lt;td&gt;633682&lt;/td&gt; &lt;!-- 1.3 rand --&gt;
&lt;td&gt;986727&lt;/td&gt; &lt;!-- 1.3 sorted --&gt;
&lt;/tr&gt;

&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt; Implementation notes&lt;/h2&gt;&lt;p&gt;The &lt;a href=&quot;http://github.com/mfp/ocaml-finite-maps/tree/master&quot;&gt;source code for all the containers and the benchmarks can be obtained here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I modified Hashtbl first by changing its resizing policy so that the load factor is the same as in Fasthashtbl (Hashtbl_mod), and second by caching the hash value in the nodes (Hashtbl_hval), which makes successful lookups faster when there are collisions (since the key comparison can be bypassed when the hash values differ) and helps a lot with unsuccessful ones.&lt;/p&gt;&lt;p&gt;Fasthashtbl, Hashtbl_mod and Hashtbl_hval only allow the load factors to grow to 50% before resizing the underlying array to twice its former size; the average load factor is thus 37.5%. Hashtbl, on the other hand, allows it to grow to 2.0, which, theory predicts, would require 13.4 probes per unsuccessful search, and 4.6 per successful one (Knuth, TAOCP Vol 3, Section 6.4, page 524). For a 37.5% load factor, Hashtbl, Hashtbl_mod and Hashtbl_hval will require 1.1 and 1.2, and Fasthashtbl (which uses open addressing with double hashing) will need 1.6 and 1.25 --- double hashing is about as good for successful lookups but worse at unsuccessful ones.&lt;/p&gt;&lt;p&gt;Trie_map_mod and Ternary are very similar: the only differences are that the latter doesn't have a separate Leaf node type, and its code has undergone a few manual optimizations explained below.&lt;/p&gt;&lt;h2&gt; Some observations&lt;/h2&gt;&lt;h3&gt; Functional vs. imperative&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;http://eigenclass.org/R2/writings/finite-map-benchmarks&quot;&gt;Read more...&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/eigenclass?a=H1sK2fDoZdk:Darl0TRn6NQ:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/eigenclass?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Mauricio Fernandez</name>
			<uri>http://eigenclass.org</uri>
		</author>
		<source>
			<title type="html">eigenclass</title>
			<subtitle type="html">eigenclass</subtitle>
			<link rel="self" href="http://eigenclass.org/hiki.rb?c=rss;format=1;tags=blog"/>
			<id>http://eigenclass.org/hiki.rb?c=rss;format=1;tags=blog</id>
			<updated>2009-07-03T11:01:36+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">People Behind GoGaRuCo, Josh Susser</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/1hvZdYeeVzo/people-behind-gogaruco-josh-susser.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-166853867190696147</id>
		<updated>2009-06-19T08:44:21+00:00</updated>
		<content type="html">I didn't get a Questions Five Ways discussion done this week, hopefully I'll get that back on track next week.  I did finish up another project I've been working on for far too long though, an interview with Josh Susser (@hasmanyjosh), one of the GoGaRuCo organizers.  Josh is a longtime member of the Ruby community, and a very smart guy.  I'm grateful that he took a the time to talk with me, I &lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/1hvZdYeeVzo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2009-06-30T19:01:01+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Ruby Best Practices</title>
		<link href="http://feeds.oreilly.com/~r/oreilly/ruby/~3/ZF71Q9qceNA/"/>
		<id>http://oreilly.com/catalog/9780596523008/</id>
		<updated>2009-06-17T08:00:43+00:00</updated>
		<content type="html">Increase Your Productivity - Write Better Code
	&lt;img src=&quot;http://feeds.feedburner.com/~r/oreilly/ruby/~4/ZF71Q9qceNA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Gregory Brown</name>
			<uri>http://oreilly.com/ruby</uri>
		</author>
		<source>
			<title type="html">O'Reilly Media: Ruby and Rails</title>
			<subtitle type="html">A compilation of O'Reilly Media's information about the Ruby programming language from news, books, conferences, courses, community, and reports.</subtitle>
			<link rel="self" href="http://feeds.oreilly.com/oreilly/ruby"/>
			<id>http://oreilly.com/ruby</id>
			<updated>2009-06-26T07:23:38+00:00</updated>
			<rights type="html">Copyright O'Reilly Media, Inc.</rights>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">No More Projects</title>
		<link href="http://www.chadfowler.com/2009/6/15/no-more-projects"/>
		<id>tag:www.chadfowler.com,2009-06-15:20803</id>
		<updated>2009-06-16T13:42:02+00:00</updated>
		<content type="html">&lt;p&gt;As a young self-taught software developer, one of the first books I remember reading was Steve McConnell’s &lt;a href=&quot;http://www.stevemcconnell.com/sg.htm&quot;&gt;Software Project Survival Guide: How to Be Sure Your First Important Project Isn’t Your Last&lt;/a&gt;. Who knows why I picked that one of all the possible books but I somehow knew I wanted to learn something about the broad practice of software development instead of just focusing on how to make specific widgets appear on the screen in Delphi or VB or how to automate the shell on our &lt;span class=&quot;caps&quot;&gt;VAX&lt;/span&gt; cluster. I probably happened upon the book while aimlessly thumbing through spines in the local book store and was drawn to the snazzy cover.&lt;/p&gt;


	&lt;p&gt;And so it was that one of my first experiences in learning software became project-focused. “How to be sure your first important project isn’t your last” indeed. This thing called software development was apparently all about doing &lt;em&gt;projects&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;I was not alone in this understanding of how software development worked. Most of the people I encountered in my professional life approached software work this way. When something needs to get done, the first step is to name it—sometimes with a silly code name and sometimes with a generic name like “the HR system project” and the next step is to start planning the project.&lt;/p&gt;


	&lt;p&gt;I’ve started to notice a bad habit. Whenever I need to do something I don’t want to do. Or, worse, something that I want to do but I am prone to procrastinate (according to &lt;a href=&quot;http://www.amazon.com/War-Art-Through-Creative-Battles/dp/0446691437&quot;&gt;The War of Art&lt;/a&gt; procrastinating something is a sign that it’s important). The bad habit is this: I turn it into a project.&lt;/p&gt;


	&lt;p&gt;Projects are lovely for procrastinators. As soon as you call something a project, you give it permission to &lt;em&gt;not&lt;/em&gt; be completed right now.&lt;/p&gt;


	&lt;p&gt;Events such as the &lt;a href=&quot;http://railsrumble.com/&quot;&gt;Rails Rumble&lt;/a&gt; have shown that it’s possible to finish software projects in two days that might take a corporate development team weeks or months in a normal project scenario. What’s the difference? Do the Rails Rumble participants throw quality out the window? Do their apps &lt;em&gt;suck&lt;/em&gt;? Do they avoid testing and cut corners? Yea, sometimes. But so do most corporate development groups. That’s how things are.&lt;/p&gt;


	&lt;p&gt;I’ve learned over the course of my career that the amount of time I spend on something doesn’t positively correlate to its value or quality when finished. In other words, if I do something really quickly, it’s not likely to be less valuable than something that takes me a long time to do. Within obvious limits.&lt;/p&gt;


	&lt;p&gt;So if you want something to take a long time, call it a project. If you want it to get done, just get it done.&lt;/p&gt;</content>
		<author>
			<name>chad</name>
			<uri>http://www.chadfowler.com/</uri>
		</author>
		<source>
			<title type="html">ChadFowler.com - Home</title>
			<link rel="self" href="http://www.chadfowler.com/index.cgi?rss"/>
			<id>tag:www.chadfowler.com,2009:mephisto/</id>
			<updated>2009-07-02T23:00:54+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Minor Changes to the Rails Security Policy</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/cNvVKIsrLlo/minor-changes-to-the-rails-security-policy"/>
		<id>tag:weblog.rubyonrails.org,2009-06-16:25362</id>
		<updated>2009-06-16T10:25:36+00:00</updated>
		<content type="html">&lt;p&gt;After reviewing the feedback on the two recent security announcements we’ve made a few minor changes to the &lt;a href=&quot;http://rubyonrails.org/security&quot;&gt;Ruby on Rails security policy&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The first change we’ve made is to include more information on what to do if you don’t receive a response from the security team.  In general reports to the security address should receive a response within 24 hours, however the sheer volume of spam to the address can, and has, lead to messages being caught in spam filters.  In the event you don’t receive a response there are now two direct-emails to the people currently looking after security reports.  That page will be kept up to date as responsibilities are reassigned.&lt;/p&gt;


	&lt;p&gt;The second change is to more clearly outline the announcement policy for rails vulnerabilities.  In short, we notify vendor-sec ahead of the public notification to allow time for people distributing rails to prepare packages for their distributions.  Then when the time has come for public notification an email is sent to the &lt;a href=&quot;http://groups.google.com/group/rubyonrails-security&quot;&gt;security announcement list&lt;/a&gt;.  Finally the announcement is posted to this blog.&lt;/p&gt;


	&lt;p&gt;The security announcement list is &lt;strong&gt;extremely&lt;/strong&gt; low volume and you’re &lt;strong&gt;strongly&lt;/strong&gt; suggested to subscribe to it.  This is the place which receives the first public announcements of all vulnerabilities in Rails, and also tends to receive additional notifications about vulnerabilities in ruby itself.   We’ve been using this list for several years but judging by confusion and misinformed comments following the announcement of &lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt;-2009-1904, not enough people were aware of its existence.&lt;/p&gt;


	&lt;p&gt;If you have any comments on the security policy, please send them via email to &lt;a href=&quot;mailto:security@rubyonrails.org&quot;&gt;security@rubyonrails.org&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>michael</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2009:mephisto/</id>
			<updated>2009-07-03T09:01:47+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Silly Sinatra Application</title>
		<link href="http://talklikeaduck.denhaven2.com/2009/06/14/silly-sinatra-application"/>
		<id>tag:talklikeaduck.denhaven2.com,2005:Article/563</id>
		<updated>2009-06-15T03:52:56+00:00</updated>
		<content type="html">&lt;div&gt;
        &lt;div&gt;
&lt;div&gt;
&lt;img src=&quot;http://talklikeaduck.denhaven2.com/files/2009-06-14_strangersinthenight.jpg&quot; alt=&quot;Strangersinthenight&quot; height=&quot;193&quot; width=&quot;200&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;CodeRay&quot;&gt;&lt;pre&gt;&lt;span class=&quot;CodeRay&quot;&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;sinatra&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; 

&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;be&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;do, be, do, be, do&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt; 

get &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/strangers&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;
   be &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; 
       be &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;
       &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
   &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

The thought occurred to me during Glenn Vanderberg's presentation on Sinatra at RubyRX a few months back.

        &lt;/div&gt;
      &lt;/div&gt;</content>
		<author>
			<name>Rick DeNatale</name>
			<uri>http://talklikeaduck.denhaven2.com</uri>
		</author>
		<source>
			<title type="html">Talk Like A Duck : Tag ruby, everything about ruby</title>
			<subtitle type="html">In Ruby, it's not the dog, it's the tricks!</subtitle>
			<link rel="self" href="http://talklikeaduck.denhaven2.com/tag/ruby.atom"/>
			<id>tag:talklikeaduck.denhaven2.com,2005:/tag/ruby</id>
			<updated>2009-06-30T15:00:35+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Things I mentioned in my Ruby Nation presentation</title>
		<link href="http://www.chadfowler.com/2009/6/13/things-i-referenced-in-my-ruby-nation-presentation"/>
		<id>tag:www.chadfowler.com,2009-06-13:20802</id>
		<updated>2009-06-13T18:13:46+00:00</updated>
		<content type="html">&lt;p&gt;I had a great time at &lt;a href=&quot;http://rubynation.org&quot;&gt;Ruby Nation&lt;/a&gt; this weekend. After my presentation I got a number of questions asking about things I referenced during the talk. Here’s an attempt to point to some of them. If you weren’t there, you won’t have any context but feel free to follow the links anyway You might find something interesting.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.pragprog.com/titles/cfcar2/the-passionate-programmer/&quot;&gt;My Book&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.bls.gov/tus/charts/&quot;&gt;Bureau of Labor Statistics Time Use Survey&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Stockholm_syndrome&quot;&gt;Stockholm Syndrome&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.stockhausen.org/&quot;&gt;Karlheinz Stockhausen&lt;/a&gt;  whose name I accidentally used when trying to refer to Stockholm Syndrome.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.4d.com/&quot;&gt;4d Database&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.johncoltrane.com/swf/main.htm&quot;&gt;John Coltrane&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.drawingsofleonardo.org/&quot;&gt;da Vinci Sketches&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://c2.com/cgi/wiki?EightHourBurn&quot;&gt;Eight Hour Burn&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.objectmentor.com/omTraining/course_agile_immersion.html&quot;&gt;XP (Agile) Immersion&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://hepcat1950.com/pmivmix1.html&quot;&gt;Pat Metheny&lt;/a&gt; – “Whenever young guys ask me what they should do to get better, I always say try to be the worst guy in whatever band you’re in. That’s the secret.”&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://iwillteachyoutoberich.com&quot;&gt;I Will Teach You To Be Rich&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.sethgodin.com/purple/&quot;&gt;Purple Cow&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://fourhourworkweek.com/&quot;&gt;4-Hour Work Week&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewCollaboration?ids=322685-2355964-4316308&amp;amp;s=143441&quot;&gt;Wozzeck&lt;/a&gt; by &lt;a href=&quot;http://w3.rz-berlin.mpg.de/cmp/berg.html&quot;&gt;Alban Berg&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://drepunggomang.com/&quot;&gt;Drepung Gomang Institute&lt;/a&gt; (for whom we translated Hindi)&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://chadfowler.com/2009/5/2/what-would-you-rather-be-doing&quot;&gt;What Would You Rather Be Doing?&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.asksunday.com/&quot;&gt;Ask Sunday&lt;/a&gt; – the company I mentioned that helped me with research&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Stamina-1350-Magnetic-Resistance-Recumbent/dp/B001ICPCPW/ref=sr_1_258?ie=UTF8&amp;amp;s=sporting-goods&amp;amp;qid=1244916825&amp;amp;sr=1-258&quot;&gt;My exercise bike&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.arduino.cc/&quot;&gt;Arduino&lt;/a&gt; – I used this to create the interface to my exercise bike&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/gosu/&quot;&gt;Gosu&lt;/a&gt; – The game library I used to write my exercise bike “game”&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://rubyhoedown2007.confreaks.com/session05.html&quot;&gt;Building Games with Ruby&lt;/a&gt; – Andrea O.K. Wright’s presentation on game development in Ruby&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.cs.virginia.edu/~robins/YouAndYourResearch.html&quot;&gt;You and Your Research&lt;/a&gt; – Richard Hamming at Bell Labs&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Fixing-Broken-Windows-Restoring-Communities/dp/0684837382&quot;&gt;Fixing Broken Windows: Restoring Order And Reducing Crime In Our Communities&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://pragprog.com&quot;&gt;The Pragmatic Programmer&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://en.oreilly.com/rails2009/public/schedule/detail/8772&quot; title=&quot;Video&quot;&gt;Discussion Panel: Women in Rails&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.prevention.com/14worsthealthmistakes/list/12.html&quot;&gt;14 Worst Health Mistakes Even Smart Women Make&lt;/a&gt; – Referenced Harvard and University of Texas studies on the effect of the company you keep&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://sivers.org/pdf&quot;&gt;How to Call Attention to Your Music&lt;/a&gt; – Derek Sivers free ebook&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.avclub.com/articles/15-things-kurt-vonnegut-said-better-than-anyone-el,1858/&quot;&gt;15 Things Kurt Vonnegut Said Better Than Anyone Else Ever Has Or Will&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>chad</name>
			<uri>http://www.chadfowler.com/</uri>
		</author>
		<source>
			<title type="html">ChadFowler.com - Home</title>
			<link rel="self" href="http://www.chadfowler.com/index.cgi?rss"/>
			<id>tag:www.chadfowler.com,2009:mephisto/</id>
			<updated>2009-07-02T23:00:54+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Another piece of music</title>
		<link href="http://pragdave.blogs.pragprog.com/pragdave/2009/06/another-piece-of-music.html"/>
		<id>http://pragdave.blogs.pragprog.com/pragdave/2009/06/another-piece-of-music.html</id>
		<updated>2009-06-12T21:50:40+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://pragdave.blogs.pragprog.com/.a/6a00d83451c41c69e20115700c8074970c-pi&quot;&gt;&lt;img class=&quot;at-xid-6a00d83451c41c69e20115700c8074970c &quot; alt=&quot;Dance_alone&quot; title=&quot;Dance_alone&quot; src=&quot;http://pragdave.blogs.pragprog.com/.a/6a00d83451c41c69e20115700c8074970c-800wi&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; In my ongoing quest to keep myself honest, here's another piece of music I wrote. This one I started over a year ago, but then put down for a while. I think it really wants to be a lot longer piece—maybe one day.&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;ul&gt;
&lt;li&gt;the &lt;a href=&quot;http://pragdave.pragprog.com/music/dance_alone.mp3&quot;&gt;mp3 file&lt;/a&gt; (thanks, Mike Springer)&lt;/li&gt;
&lt;li&gt;the &lt;a href=&quot;http://pragdave.pragprog.com/music/dance_alone.pdf&quot;&gt;music&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content>
		<author>
			<name>Dave Thomas</name>
			<uri>http://pragdave.blogs.pragprog.com/pragdave/</uri>
		</author>
		<source>
			<title type="html">PragDave</title>
			<subtitle type="html">Dave Thomas–Pragmatic Programmer</subtitle>
			<link rel="self" href="http://pragdave.blogs.pragprog.com/pragdave/rss.xml"/>
			<id>http://pragdave.blogs.pragprog.com/pragdave/rss.xml</id>
			<updated>2009-07-02T01:00:46+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Which Tool Would You Use?</title>
		<link href="http://blog.nicksieger.com/articles/2009/06/12/which-tool-would-you-use"/>
		<id>urn:uuid:a3633f0f-4b90-4de2-a278-6c33c3d15aab</id>
		<updated>2009-06-12T20:40:17+00:00</updated>
		<content type="html">&lt;p&gt;I started in on the twice&amp;#45;yearly task of pruning our hedges today&amp;#46; So confronted with this task:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/nicksieger/3619672997/&quot; title=&quot;Shearing the shrubs by nicksieger, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2458/3619672997_70636e8702.jpg&quot; width=&quot;375&quot; height=&quot;500&quot; alt=&quot;Shearing the shrubs&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div&gt;&lt;/div&gt;

&lt;p&gt;Which tool would you use?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/nicksieger/3620490416/&quot; title=&quot;Which tool? by nicksieger, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3410/3620490416_2fb853899c.jpg&quot; width=&quot;375&quot; height=&quot;500&quot; alt=&quot;Which tool?&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div&gt;&lt;/div&gt;

&lt;p&gt;I used both today, but realized I enjoy using the hand trimmers much more&amp;#46; With the electric trimmers, you can buzz through a lot of hedge quickly, but sometimes this happens:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/nicksieger/3620491260/&quot; title=&quot;Too close by nicksieger, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3300/3620491260_3c9ddd2ab1.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Too close&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div&gt;&lt;/div&gt;

&lt;p&gt;With the hand trimmers, I can take my time and make precise cuts&amp;#46; The end result may take more time, but it turns out much, much better&amp;#46;&lt;/p&gt;

&lt;p&gt;Software tools have similar feels to me&amp;#46; Java feels an awful lot like the electric trimmers&amp;#46; It&amp;#8217;s heavy and powerful, but sometimes by the time you&amp;#8217;ve finished with it, you&amp;#8217;ve cut so far in that you may have missed a simpler, lighter solution&amp;#46;&lt;/p&gt;

&lt;p&gt;Ruby feels like the hand trimmers&amp;#46; Precision, less code, more intent, and I can take my time to think through and arrive at a solution without leaving a huge trail of trimmings (code) behind me&amp;#46;&lt;/p&gt;</content>
		<author>
			<name>Nick Sieger</name>
			<uri>http://blog.nicksieger.com/</uri>
		</author>
		<source>
			<title type="html">Nick Sieger</title>
			<subtitle type="html">do what you love</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/nicksieger"/>
			<id>tag:blog.nicksieger.com,2005:Typo</id>
			<updated>2009-07-02T14:00:28+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Questions Five Ways - Overview</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/Zllgxs6NzX4/questions-five-ways-overview.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-4471407718643973361</id>
		<updated>2009-06-10T10:50:35+00:00</updated>
		<content type="html">Digg thisor Tweet itI think one of the better ideas I've had on this blog is my 'Questions Five Ways' series.  For each post, I'll ask a guiding question of five leading hackers, some from the Ruby community and some from outside it.  My intent is to build some great resources for everyone who's trying to become a better programmer.  If you'd like some more details about the seris, you can take a&lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/Zllgxs6NzX4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2009-06-30T19:01:01+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Reading and Testing Your Legacy Code</title>
		<link href="http://feedproxy.google.com/~r/on-ruby/~3/C1KcUyvLOpo/reading-and-testing-your-legacy-code.html"/>
		<id>tag:blogger.com,1999:blog-24599054.post-8163964131741958684</id>
		<updated>2009-06-10T10:50:09+00:00</updated>
		<content type="html">In this week's installment of Questions Five Ways, we're talking about testing and code reading as tools for dealing with legacy code.  This week's participants are Cory Foy (@cory_foy), Dave Thomas (@PragDave), Antonio Cangiano (@acangiano), and Tim Bray (@timbray).What is the relationship between testing and code reading when dealing with legacy code, and how can we use the two processes to &lt;img src=&quot;http://feeds.feedburner.com/~r/on-ruby/~4/C1KcUyvLOpo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>pate</name>
			<email>noreply@blogger.com</email>
			<uri>http://on-ruby.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">On Ruby</title>
			<subtitle type="html">The (mostly) tech related musings of Pat Eyler.  Ruby, Erlang, Haskell, Scala, Ocaml, Publishing, and more ...</subtitle>
			<link rel="self" href="http://on-ruby.blogspot.com/atom.xml"/>
			<id>tag:blogger.com,1999:blog-24599054</id>
			<updated>2009-06-30T19:01:01+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">DoS Vulnerability in Ruby</title>
		<link href="http://feedproxy.google.com/~r/RidingRails/~3/YKY7eI3OyQQ/dos-vulnerability-in-ruby"/>
		<id>tag:weblog.rubyonrails.org,2009-06-10:25334</id>
		<updated>2009-06-10T00:03:25+00:00</updated>
		<content type="html">&lt;p&gt;A Denial of Service vulnerability has been found and fixed in ruby.  The vulnerability is due to the BigDecimal method mishandling certain large input values and can cause the interpreter to crash.  This could be used by an attacker to crash any ruby program which creates BigDecimal objects based on user input, including almost every Rails application. This vulnerability has been assigned the &lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt; name &lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt;-2009-1904.&lt;/p&gt;


	&lt;p&gt;For upgrade instructions and information on affected ruby versions please see the &lt;a href=&quot;http://www.ruby-lang.org/en/news/2009/06/09/dos-vulnerability-in-bigdecimal/&quot;&gt;ruby security team’s announcement&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;All users are advised to upgrade their ruby installations immediately to avoid this problem.  In the event that you are unable to upgrade your ruby installation, or are using an out-of-maintenance ruby version, there is a &lt;a href=&quot;http://github.com/NZKoz/bigdecimal-segfault-fix/tree/master&quot;&gt;workaround available on github&lt;/a&gt;.  You can either install it as a gem, or simply copy the file &lt;a href=&quot;http://github.com/NZKoz/bigdecimal-segfault-fix/blob/0aaf499f7b3df630da2e5780512975751d3473fd/lib/bigdecimal-segfault-fix.rb&quot;&gt;bigdecimal-segfault-fix.rb&lt;/a&gt;  into &lt;ins&gt;config/initializers&lt;/ins&gt; of your rails application.&lt;/p&gt;


	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;NOTE&lt;/span&gt;: this workaround breaks valid formats supported by BigDecimal, users should not rely on this fix for an extended period of time but should instead immediately begin planning a migration to a supported ruby release.&lt;/p&gt;


	&lt;p&gt;The upcoming Rails 2.3.3 release will include some minor mitigating changes to reduce some potential attack vectors for this vulnerability.  However these mitigations will not close every potential method of attack and users should still upgrade their ruby installation as soon as possible.&lt;/p&gt;


	&lt;p&gt;Thanks to Jose Fernández for reporting the vulnerability to the rails security team, and to the ruby security team for confirming the nature of the bug and handling the release process.&lt;/p&gt;</content>
		<author>
			<name>michael</name>
			<uri>http://weblog.rubyonrails.org/</uri>
		</author>
		<source>
			<title type="html">Riding Rails - home</title>
			<link rel="self" href="http://feeds.feedburner.com/RidingRails"/>
			<id>tag:weblog.rubyonrails.org,2009:mephisto/</id>
			<updated>2009-07-03T09:01:47+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Project Kenai at JavaOne</title>
		<link href="http://blog.nicksieger.com/articles/2009/06/09/project-kenai-at-javaone"/>
		<id>urn:uuid:9a1f22f6-e5db-4cf7-a49d-79c06dbb4bf2</id>
		<updated>2009-06-09T02:23:36+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s just the beginning and a small milestone, but it&amp;#8217;s a goal we set for ourselves by JavaOne last week that we reached: 10K registered users at &lt;a href=&quot;http://kenai.com/&quot;&gt;http://kenai&amp;#46;com/&lt;/a&gt;&amp;#46; We were fortunate to be highlighted in the Tuesday afternoon keynote, which, to our collective relief, &lt;a href=&quot;http://blogs.zdnet.com/BTL/?p=19181&quot;&gt;went off without a hitch&lt;/a&gt;&amp;#46; I also had a chance to speak a bit about Project Kenai behind the scenes in my technical session&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/TS5413_09J1_SiegerLessons.pdf&quot;&gt;My slides are available&lt;/a&gt; and contain a decent overview of what we&amp;#8217;ve been doing&amp;#46; One slide in particular seems to have &lt;a href=&quot;http://twitter.com/olabini/status/2027466455&quot;&gt;surprised&lt;/a&gt; some folks: our codebase metrics&amp;#46;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12K lines of application code (everything in &lt;code&gt;app/{controllers,models,helpers}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;10K lines of views (HTML + template code in &lt;code&gt;app/views&lt;/code&gt;) &lt;/li&gt;
&lt;li&gt;1K lines of custom Javascript (&lt;code&gt;public/javascripts&lt;/code&gt; excluding jQuery and plugins)&lt;/li&gt;
&lt;li&gt;8K lines of test code (RSpec + plain text stories) (yes, we&amp;#8217;re upgrading to &lt;a href=&quot;http://cukes.info&quot;&gt;Cucumber&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;73&amp;#46;7% test coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&amp;#8217;re doing Rails, you&amp;#8217;re probably not all that surprised by these numbers; hopefully you&amp;#8217;ve seen similar ones yourself&amp;#46; If you haven&amp;#8217;t tried Rails, consider a site like kenai&amp;#46;com and ask yourself if you could build and maintain a production site like it with these numbers in your favorite language/framework&amp;#46;&lt;/p&gt;

&lt;p&gt;Other takeaways from my talk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Java what it&amp;#8217;s good for; in this case, long&amp;#45;running server apps&amp;#46; The downtime of the JRuby/GlassFish&amp;#45;deployed Rails application has been minimal for us; the few cases where we&amp;#8217;ve had issues, they&amp;#8217;ve usually been self&amp;#45;inflicted application problems&amp;#46; Instead of running Monit with a pack of Mongrels that need to be periodically recycled, we run a few GlassFish domains per server and only recycle them when we deploy new code&amp;#46;&lt;/li&gt;
&lt;li&gt;For the Java programmers out there, don&amp;#8217;t be afraid to use stuff other than Java&amp;#46; We use Python, Django, Memcached, Perl, and anything that gets the job done&amp;#46;&lt;/li&gt;
&lt;li&gt;You can build cool stuff quickly with community Rails plugins like &lt;a href=&quot;http://github.com/technoweenie/attachment_fu/tree/master&quot;&gt;attachment_fu&lt;/a&gt;, &lt;a href=&quot;http://geokit.rubyforge.org/&quot;&gt;geokit&lt;/a&gt;, and &lt;a href=&quot;http://wiki.github.com/mislav/will_paginate&quot;&gt;will_paginate&lt;/a&gt;&amp;#46; Not news to Rails programmers, but I&amp;#8217;d be interested to hear of any equivalents for Java&amp;#45;based web frameworks&amp;#46;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jruby.org/&quot;&gt;JRuby&lt;/a&gt; is a big win, allowing co&amp;#45;development on MRI and JRuby with deployment to GlassFish&amp;#46; JRuby&amp;#8217;s java integration also allows for neat tricks like &lt;a href=&quot;http://kenai.com/projects/image-voodoo&quot;&gt;image_voodoo&lt;/a&gt;, a pure&amp;#45;Java imaging plugin for attachment_fu&amp;#46;&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Nick Sieger</name>
			<uri>http://blog.nicksieger.com/</uri>
		</author>
		<source>
			<title type="html">Nick Sieger</title>
			<subtitle type="html">do what you love</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/nicksieger"/>
			<id>tag:blog.nicksieger.com,2005:Typo</id>
			<updated>2009-07-02T14:00:28+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">The Unexpected Consequences of Consumerism</title>
		<link href="http://www.chadfowler.com/2009/6/9/the-unexpected-consequences-of-consumerism"/>
		<id>tag:www.chadfowler.com,2009-06-09:20785</id>
		<updated>2009-06-09T00:38:48+00:00</updated>
		<content type="html">&lt;p&gt;I’m reading &lt;a href=&quot;http://www.amazon.com/Vagabonding-Uncommon-Guide-Long-Term-Travel/dp/0812992180/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1244506800&amp;amp;sr=8-1&quot;&gt;Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel&lt;/a&gt; by Rolf Potts. I’m only a quarter of the way through it and it’s already worth the price. In the third chapter, Rolf talks about the American reaction to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Exxon_Valdez_oil_spill&quot;&gt;Exxon Valdez oil spill&lt;/a&gt; in the late 80s. The nation suddenly became, on the average, much more environmentally minded. So what did we do? We bought “environmental” products. Recycled products, energy-efficient this-or-that, health food, etc. What did we &lt;em&gt;not&lt;/em&gt; do? Actually change our behavior.&lt;/p&gt;


	&lt;p&gt;Here’s a quote from page 29:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;The more our life options get paraded around as consumer options, the more we forget that there's a difference between the two.&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;When I read this I recognized a pattern in myself and many people (everyone?) I know:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;You want to lose weight, get excited and buy a bunch of books, magazines, DVDs, etc. on weight loss. Join a fitness site where you can log calories and workouts. Buy a book about a diet with an enticing name.&lt;/li&gt;
		&lt;li&gt;Want to learn a new technology? Get a bunch of books, sign up for a mailing list.&lt;/li&gt;
		&lt;li&gt;Train for a triathlon? Tons of triathlon books, a bicycle, funny triathlon clothes, triathlete magazine, etc.&lt;/li&gt;
		&lt;li&gt;Want to learn a (human) language? Buy some software and books, music, movies.&lt;/li&gt;
		&lt;li&gt;Want to learn an instrument? Books, an instrument, a case for the instrument, various accessories.&lt;/li&gt;
		&lt;li&gt;Get more organized? Productivity books, a &lt;span class=&quot;caps&quot;&gt;PDA&lt;/span&gt;, PIM software.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I do this all the time. I decide I’m going to do something challenging, and my first step is to load up on &lt;em&gt;stuff&lt;/em&gt; related to whatever it is I want to do. My second step is to continue to load up on stuff related to the topic. And so on.&lt;/p&gt;


	&lt;p&gt;Why do we do this? Because we know that we’re staring in the face of something that’s both very important and very scary. We want to feel like we’re doing something about whatever goal it is we have in mind. And the easiest way to feel like we’re doing something is to buy stuff.&lt;/p&gt;


	&lt;p&gt;What’s upsetting is to realize that in my case, simply buying the stuff is all I typically need to get enough of the feeling that I’m “dong something” to be satisfied.  The end result? I’m fat, I still can’t program in Haskell worth a damn, I haven’t run the triathlon, I don’t know Spanish, I can’t play accordion very well, and I’m totally unorganized.&lt;/p&gt;


	&lt;p&gt;Experiment: next time a really important goal comes along, I’m not allowed to do  &lt;em&gt;any&lt;/em&gt; discretionary spending related to that goal.&lt;/p&gt;


	&lt;p&gt;My hypothesis is that unfunded life goals stand a better chance of being met.&lt;/p&gt;</content>
		<author>
			<name>chad</name>
			<uri>http://www.chadfowler.com/</uri>
		</author>
		<source>
			<title type="html">ChadFowler.com - Home</title>
			<link rel="self" href="http://www.chadfowler.com/index.cgi?rss"/>
			<id>tag:www.chadfowler.com,2009:mephisto/</id>
			<updated>2009-07-02T23:00:54+00:00</updated>
		</source>
	</entry>

</feed>
