<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>ELC Code Feed</title>
    <link>http://elctech.com/</link>
    <description>News, projects, and more.</description>
    <language>en-us</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ElcCodeFeed" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Friday late night hacking</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Pairing with Heineken on some cool stuff we will show you soon - live from Paris&lt;/p&gt;
&lt;p&gt;&lt;img src="http://elccore.s3.amazonaws.com/29/922/prost.jpg" alt="Prost" width="500" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/jJRPM6pvSQE" height="1" width="1"/&gt;</description>
      <author>Gregor Martynus</author>
      <pubDate>Fri, 06 Nov 2009 21:57:07 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/jJRPM6pvSQE/friday-late-night-hacking</link>
      <guid isPermaLink="false">http://elctech.com/articles/friday-late-night-hacking</guid>
    <feedburner:origLink>http://elctech.com/articles/friday-late-night-hacking</feedburner:origLink></item>
    <item>
      <title>Add Solr Searching to External Gem and Third Party Database</title>
      <description>&lt;div class="preface"&gt;
&lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;
Say you have a third party database that you need your rails applications to access. But of course you want it to be modular and use it again for other applications, so you write a gem to provide access to the non-rails standard database. Now you want to add in &lt;a href="http://acts-as-solr.rubyforge.org/" target="_blank"&gt;acts as solr&lt;/a&gt; to search across the database from your application.
&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Acts as solr is a rails plugin and requires a solr server instance be running and therefore its not necessarily correct to add in the acts_as_solr plugin into your gem library. The consuming applications should be responsible for indexing what they and and how they want it. So a common trick is used to add in the application specific functionality into the gem. Initializers are used to inject the desired functionality into the gems classes. Given you have your gem named third_party_db_gem, create a file in config/initializers named something along the lines of third_party_db_gem_extensions.rb. And put in some code like:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;third_party_db_gem&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span class="Support"&gt;ThirdPartyModel&lt;/span&gt;.&lt;span class="Entity"&gt;class_eval&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;
  &lt;span class="Keyword"&gt;include&lt;/span&gt; &lt;span class="Variable"&gt;ActsAsSolr&lt;/span&gt;
  acts_as_solr &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;fields&lt;/span&gt; =&amp;gt; [&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;email&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;phone&lt;/span&gt;, job]
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;h2&gt;Explanation&lt;/h2&gt;
&lt;p&gt;So first we had to require our gem, because our gem hasn't been loaded yet. Then we do a class_eval to inject our solr definition into one of the models. You would repeat that block for every class you wanted to index. Here's &lt;a href="http://blog.jayfields.com/2007/03/ruby-instanceeval-and-classeval-method.html" target="_blank"&gt;Jay Fields article more on class and instance eval&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/L6HY_iXXWZQ" height="1" width="1"/&gt;</description>
      <author>Nicholaus</author>
      <pubDate>Fri, 06 Nov 2009 00:49:09 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/L6HY_iXXWZQ/add-solr-searching-to-external-gem-and-third-party-database</link>
      <guid isPermaLink="false">http://elctech.com/articles/add-solr-searching-to-external-gem-and-third-party-database</guid>
    <feedburner:origLink>http://elctech.com/articles/add-solr-searching-to-external-gem-and-third-party-database</feedburner:origLink></item>
    <item>
      <title>batch finding composite primary keys [SOLVED]</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Issue with composite_primary_keys and find_in_batches. In short, they don't play nicely together.&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Issue:&lt;/h2&gt;
&lt;p&gt;Rails 2.3+ find_in_batches will not work if your model has composite primary keys.&lt;/p&gt;
&lt;h2&gt;Solution:&lt;/h2&gt;
&lt;p&gt;I found this gist:
&lt;br /&gt; https://gist.github.com/105318/13fe7c42c95c820fadbad84d54e00680ce9d110f
&lt;br /&gt;
which solved the issue. I just dropped it into a file in RAILS_ROOT/config/initializers to extend active record to be able to do batch finds on those models which use composite_primary_keys&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/nw9hFtO6MBA" height="1" width="1"/&gt;</description>
      <author>Max Murphy</author>
      <pubDate>Thu, 05 Nov 2009 19:14:05 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/nw9hFtO6MBA/batch-finding-composite-primary-keys-solved</link>
      <guid isPermaLink="false">http://elctech.com/articles/batch-finding-composite-primary-keys-solved</guid>
    <feedburner:origLink>http://elctech.com/articles/batch-finding-composite-primary-keys-solved</feedburner:origLink></item>
    <item>
      <title>[SOLVED] 64bit MySQL and 32bit Ruby: FAIL</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;For the people out there using RVM to rock multiple Ruby versions, here's a gotcha with REE and Snow Leopard that took me hours to solve: if you happened to boot your mac in 32-bit mode when building ree with the oh so awesome:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;rvm install ree
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;And then install MySQL 64bit and try to install the gem, ruby will positively hate you. It will also do it's best not to help you understand the issue whining about missing libraries and whatnot.&lt;/p&gt;
&lt;p&gt;
No, it's not a library issue. Your ruby is built for 32bit and the mysql libs are 64bit. I know for sure nokogiri has the same issue and I think many others as well.
&lt;/p&gt;
&lt;p&gt;
What kernel version am I running?
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; uname -m&lt;/span&gt;
x86_64

&lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; uname -m&lt;/span&gt;
i386
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;To force 64bit mode, reboot holding down the "6" and "4" keys on the keyboard.&lt;/p&gt;
&lt;p&gt;Recompiling your rubies is fun for sure, but if you get tired of it, here's how to make the 64bit switch permanent:
&lt;/p&gt;&lt;p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; sudo vim /Library/Preferences/SystemConfiguration/com.apple.Boot.plist&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;/p&gt;&lt;p&gt;Change the last &lt;string&gt;&lt;/string&gt; key to &lt;string&gt;arch=x86_64&lt;/string&gt;. You'll end up with:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Constant"&gt;?x&lt;/span&gt;ml version&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;1.0&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; encoding&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;UTF-8&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;!&lt;span class="Variable"&gt;DOCTYPE&lt;/span&gt; plist &lt;span class="Variable"&gt;PUBLIC&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;-//Apple Computer//DTD PLIST 1.0//EN&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;http://www.apple.com/DTDs/PropertyList-1.0.dtd&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;plist version&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;1.0&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;dict&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;key&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Variable"&gt;Kernel&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;key&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;string&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;mach_kernel&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;string&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;key&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;&lt;span class="Variable"&gt;Kernel&lt;/span&gt; &lt;span class="Variable"&gt;Flags&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;key&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;string&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;arch&lt;span class="Keyword"&gt;=&lt;/span&gt;x86_64&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;string&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;dict&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;plist&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

To check if a lib is 64bit, run:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; lipo -info /usr/local/mysql/lib/libmysqld.a &lt;/span&gt;
input file &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;local&lt;span class="Keyword"&gt;/&lt;/span&gt;mysql&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libmysqld.&lt;span class="Entity"&gt;a&lt;/span&gt; is &lt;span class="Keyword"&gt;not&lt;/span&gt; a fat file
&lt;span class="Variable"&gt;Non&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;fat file: &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;local&lt;span class="Keyword"&gt;/&lt;/span&gt;mysql&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libmysqld.&lt;span class="Entity"&gt;a&lt;/span&gt; is architecture: x86_64
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
What about my ruby version?
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; lipo -info ~/.rvm/ree-1.8.7-2009.10/lib/libruby-static.a &lt;/span&gt;
input file &lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Variable"&gt;Users&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;david&lt;span class="Keyword"&gt;/&lt;/span&gt;.&lt;span class="Entity"&gt;rvm&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;ree&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;.&lt;span class="Constant"&gt;7&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2009.10&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libruby&lt;span class="Keyword"&gt;-&lt;/span&gt;static.&lt;span class="Entity"&gt;a&lt;/span&gt; is &lt;span class="Keyword"&gt;not&lt;/span&gt; a fat file
&lt;span class="Variable"&gt;Non&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;fat file: &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;Users&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;david&lt;span class="Keyword"&gt;/&lt;/span&gt;.&lt;span class="Entity"&gt;rvm&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;ree&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;.&lt;span class="Constant"&gt;7&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2009.10&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libruby&lt;span class="Keyword"&gt;-&lt;/span&gt;static.&lt;span class="Entity"&gt;a&lt;/span&gt; is architecture: x86_64

&lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; lipo -info ~/.rvm/ruby-1.9.1-p243/lib/libruby-static.a &lt;/span&gt;
input file &lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Variable"&gt;Users&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;david&lt;span class="Keyword"&gt;/&lt;/span&gt;.&lt;span class="Entity"&gt;rvm&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.9&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;p243&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libruby&lt;span class="Keyword"&gt;-&lt;/span&gt;static.&lt;span class="Entity"&gt;a&lt;/span&gt; is &lt;span class="Keyword"&gt;not&lt;/span&gt; a fat file
&lt;span class="Variable"&gt;Non&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;fat file: &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;Users&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;david&lt;span class="Keyword"&gt;/&lt;/span&gt;.&lt;span class="Entity"&gt;rvm&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.9&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;p243&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libruby&lt;span class="Keyword"&gt;-&lt;/span&gt;static.&lt;span class="Entity"&gt;a&lt;/span&gt; is architecture: i386
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;code
&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;
Looks like I'll have to nuke my Ruby 1.9 install too. Sigh.
&lt;/p&gt;
&lt;h2&gt;Give us the fix already!&lt;/h2&gt;
&lt;p&gt;
Ok ok. Here it goes:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; One&lt;/span&gt;
echo &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;rvm_archflags='-arch x86_64'&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;.rvmrc&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Now rvm will now know what we want.&lt;/p&gt;
&lt;p&gt;That's not enough though and we need to make sure REE doesn't build with tcmalloc (at least until the good people at Google solve the non-64bit-ness of it). Only thing is rvm as of v0.64 has a little bug stopping params to be passed along. The soon to be released v0.75 fixes this but for now you need head:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Two&lt;/span&gt;
rvm rvm update &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;head
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Now we're ready to reinstall REE:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Three&lt;/span&gt;
rvm &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;force install ree &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;ree&lt;span class="Keyword"&gt;-&lt;/span&gt;options &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;tcmalloc
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
Many thanks to wayneeseguin for helping with this issue! Rvm is the best thing since sliced bread.
&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/Gx8pDLIraCI" height="1" width="1"/&gt;</description>
      <author>David Palm</author>
      <pubDate>Thu, 05 Nov 2009 14:22:27 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/Gx8pDLIraCI/-solved-64bit-mysql-and-32bit-ruby-fail</link>
      <guid isPermaLink="false">http://elctech.com/articles/-solved-64bit-mysql-and-32bit-ruby-fail</guid>
    <feedburner:origLink>http://elctech.com/articles/-solved-64bit-mysql-and-32bit-ruby-fail</feedburner:origLink></item>
    <item>
      <title>iPhone Tech Talk World Tour - San Jose</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Last week I went out to San Jose, CA to go to Apple's iPhone Tech Talk World Tour!&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://elccore.s3.amazonaws.com/4/916/photo 4.jpg" alt="Photo 4" /&gt;
Apple once a year holds 9 single day "Tech Talks" across the world. This year only 3 were in the US and I was lucky enough to get a spot at the San Jose meetup. The conference was focused on getting developers to use best practices in all regions of their applications. Apple's stance was even if the app is small, it might as well be designed as well as possible.

&lt;img src="http://elccore.s3.amazonaws.com/4/915/photo 3.jpg" alt="Photo 3" /&gt;

The day started with a nice overview of the iPhone platform. They sell tons of these things and people seem to love the App store. No real news there. Nice overview of the creative apps in the store. Certainly got everyone's brains working for an exciting day.

&lt;img src="http://elccore.s3.amazonaws.com/4/914/photo 2.jpg" alt="Photo 2" /&gt;

After looking over all the sessions I decided to spend my whole day in Room A which seemed to focus on the performance, threading and data management. The main tech point to take away from the conference was how threading is done on the iPhone. Apple's goal is to abstract away the complexities of classical threading. I went to an hour session on it and the only times I heard the words semaphore or lock was the speaker saying that they didn't exist anymore.

The iPhone has may build in calls which are blocking calls. This means that when performed on the main thread functionality will halt until they are done. A very commonly used blocking call is initWithContentsOfURL:. This method is used commonly for XML parsing and grabbing images from the internet. Apple has created a solution for this that essentially automizes your thread management with a single line of code. Lets say for example I am creating an app that on launch parses an XML source. If I have a containing method called parseXML() that does all the parsing I can call this method on a managed thread simply by using.
&lt;code language="objective-c"&gt;&lt;pre class="sunburst"&gt;NSOperationQueue *queue = [[NSOperationQueue &lt;span class="SupportFunction"&gt;alloc&lt;/span&gt;] &lt;span class="SupportFunction"&gt;init&lt;/span&gt;];
NSInvocationOperation *op = [[NSInvocationOperation &lt;span class="SupportFunction"&gt;alloc&lt;/span&gt;] &lt;span class="SupportFunction"&gt;initWithTarget&lt;span class="SupportFunction"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class="Variable"&gt;self&lt;/span&gt; &lt;span class="SupportFunction"&gt;selector&lt;span class="SupportFunction"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class="Storage"&gt;&lt;span class="Storage"&gt;@&lt;/span&gt;selector&lt;/span&gt;(parseXML) &lt;span class="SupportFunction"&gt;object&lt;span class="SupportFunction"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;nil&lt;/span&gt;];
[queue &lt;span class="SupportFunction"&gt;addOperation&lt;span class="SupportFunction"&gt;:&lt;/span&gt;&lt;/span&gt;op];
[op &lt;span class="SupportFunction"&gt;release&lt;/span&gt;];
&lt;/pre&gt;&lt;/code&gt;

That's it. Apple has made a general class called NSOperation that gives users the power to create their own automated threading classes. In this case I am using the built in NSIvocationoperation object that takes in a method and runs it on a secondary thread. Throw the operation into an operation queue and you are done. Very powerful stuff.

&lt;img src="http://elccore.s3.amazonaws.com/4/917/photo-1.jpg" alt="Photo-1" /&gt;

Aside from the fun tech stuff it was a great opportunity to meet people in the developer community and share ideas. 
&lt;p&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/39U8uxD8xdI" height="1" width="1"/&gt;</description>
      <author>ELC</author>
      <pubDate>Mon, 02 Nov 2009 20:56:27 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/39U8uxD8xdI/iphone-tech-talk-world-tour---san-jose</link>
      <guid isPermaLink="false">http://elctech.com/articles/iphone-tech-talk-world-tour---san-jose</guid>
    <feedburner:origLink>http://elctech.com/articles/iphone-tech-talk-world-tour---san-jose</feedburner:origLink></item>
    <item>
      <title>Great Resource For Testing Regular Expressions</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Through my travels through the internets, I have stumbled upon a very useful resource.  It is a site (written in rails of course) for testing your regular expressions.  It has a very clean interface and uses fancy ajax to give you real time results about your regular expressions.  The URL of the this site is &lt;a href="http://rubular.com/" target="_blank"&gt;http://rubular.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://elccore.s3.amazonaws.com/30/905/screenshot_06.png" alt="Screenshot_06" width="500" /&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
Not only does it provide real-time feedback on your regular expressions, it also will give you information about your matches.  This is much more useful than trial and error in your code.  Also, if you have an error in your regex, rubular will let you know about it.
&lt;/p&gt;

&lt;p&gt;A little rusty on your regex skills? No problem, the site even includes a box at the bottom detailing all of the most important regex strings.  So be sure to&lt;a href="http://rubular.com/" target="_blank"&gt; check it out&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/huHpoxUIdN8" height="1" width="1"/&gt;</description>
      <author>Brandon Trebitowski</author>
      <pubDate>Thu, 29 Oct 2009 16:43:10 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/huHpoxUIdN8/great-resource-for-testing-regular-expressions</link>
      <guid isPermaLink="false">http://elctech.com/articles/great-resource-for-testing-regular-expressions</guid>
    <feedburner:origLink>http://elctech.com/articles/great-resource-for-testing-regular-expressions</feedburner:origLink></item>
    <item>
      <title>Executing SQL commands in Rails</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Most of the times, ActiveRecord's helpers to access database info is all you need; sometimes, you want to do some hacky stuff.&lt;/p&gt; 
&lt;p&gt;For example, I had to figure out a database's timezone and schema but I had no shell access to the server. So I ran this used Base.connection.execute and fetch_row to get the result&lt;/p&gt;

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;q&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Support"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="Entity"&gt;Base&lt;/span&gt;.&lt;span class="Entity"&gt;connection&lt;/span&gt;.&lt;span class="Entity"&gt;execute&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;SELECT NOW();&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
=&amp;gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&amp;lt;mysql::result:0x2b783735c4f8&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; q.&lt;span class="Entity"&gt;fetch_row&lt;/span&gt;
=&amp;gt; [&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;2009-10-20 17:30:49&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt;
=&amp;gt; &lt;span class="Variable"&gt;Tue&lt;/span&gt; &lt;span class="Variable"&gt;Oct&lt;/span&gt; &lt;span class="Constant"&gt;20&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;:&lt;span class="Constant"&gt;32&lt;/span&gt;:&lt;span class="Constant"&gt;02&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;0700&lt;/span&gt; &lt;span class="Constant"&gt;2009&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt;q.&lt;span class="Entity"&gt;free&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;mysql::&lt;span class="Entity"&gt;result&lt;/span&gt;:&lt;span class="Constant"&gt;0x2b783735c4f8&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
You can basically run any SQL query you want with these two methods. Now go crash some servers!
&lt;/p&gt;

&lt;p&gt;
Note: You should also free your result to free up memory. Thanks Emmanuel.
&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/c4ogYbv0g-s" height="1" width="1"/&gt;</description>
      <author>Alex Chee</author>
      <pubDate>Thu, 29 Oct 2009 01:19:47 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/c4ogYbv0g-s/executing-sql-commands-in-rails</link>
      <guid isPermaLink="false">http://elctech.com/snippets/executing-sql-commands-in-rails</guid>
    <feedburner:origLink>http://elctech.com/snippets/executing-sql-commands-in-rails</feedburner:origLink></item>
    <item>
      <title>Can't add git remote branch</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;
I love git, but it's full of gotchas. Here's one I ran into recently when trying to create a remote branch to do some major code refactoring.

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Constant"&gt;20&lt;/span&gt;:&lt;span class="Constant"&gt;22&lt;/span&gt;:&lt;span class="Constant"&gt;03&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;git push origin origin&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;refs&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;heads&lt;span class="Keyword"&gt;/&lt;/span&gt;new_remote_branch
error: src refspec origin does &lt;span class="Keyword"&gt;not&lt;/span&gt; match any.
fatal: &lt;span class="Variable"&gt;The&lt;/span&gt; remote &lt;span class="Keyword"&gt;end&lt;/span&gt; hung up unexpectedly
error: failed to push some refs to &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&amp;lt;repo here&amp;gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;repo&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

Hmm. This has always worked for me before, what gives?

When I took a look at my remote branches:
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Constant"&gt;20&lt;/span&gt;:&lt;span class="Constant"&gt;35&lt;/span&gt;:&lt;span class="Constant"&gt;33&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;git branch &lt;span class="Keyword"&gt;-&lt;/span&gt;r
  origin&lt;span class="Keyword"&gt;/&lt;/span&gt;master
&lt;/pre&gt;&lt;/code&gt;

I noticed that there's no HEAD pointer. I'm actually not certain of how that came about, but let's add it:

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;git symbolic&lt;span class="Keyword"&gt;-&lt;/span&gt;ref refs&lt;span class="Keyword"&gt;/&lt;/span&gt;remotes&lt;span class="Keyword"&gt;/&lt;/span&gt;origin&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Variable"&gt;HEAD&lt;/span&gt; refs&lt;span class="Keyword"&gt;/&lt;/span&gt;remotes&lt;span class="Keyword"&gt;/&lt;/span&gt;origin&lt;span class="Keyword"&gt;/&lt;/span&gt;master
&lt;/pre&gt;&lt;/code&gt;

Now this looks a little better:
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Constant"&gt;20&lt;/span&gt;:&lt;span class="Constant"&gt;38&lt;/span&gt;:&lt;span class="Constant"&gt;10&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;git branch &lt;span class="Keyword"&gt;-&lt;/span&gt;r
  origin&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Variable"&gt;HEAD&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; origin&lt;span class="Keyword"&gt;/&lt;/span&gt;master
  origin&lt;span class="Keyword"&gt;/&lt;/span&gt;master
&lt;/pre&gt;&lt;/code&gt;

And now git knows what do do when you try to branch off origin to a new remote branch:
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Constant"&gt;20&lt;/span&gt;:&lt;span class="Constant"&gt;41&lt;/span&gt;:&lt;span class="Constant"&gt;14&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;git push origin origin&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;refs&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;heads&lt;span class="Keyword"&gt;/&lt;/span&gt;new_remote_branch
&lt;span class="Variable"&gt;Counting&lt;/span&gt; objects: &lt;span class="Constant"&gt;429&lt;/span&gt;, done.
&lt;span class="Variable"&gt;Delta&lt;/span&gt; compression using up to &lt;span class="Constant"&gt;2&lt;/span&gt; threads.
&lt;span class="Variable"&gt;Compressing&lt;/span&gt; objects: &lt;span class="Constant"&gt;100&lt;/span&gt;&lt;span class="Keyword"&gt;%&lt;/span&gt; (&lt;span class="Constant"&gt;257&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;257&lt;/span&gt;), done.
&lt;span class="Variable"&gt;Writing&lt;/span&gt; objects: &lt;span class="Constant"&gt;100&lt;/span&gt;&lt;span class="Keyword"&gt;%&lt;/span&gt; (&lt;span class="Constant"&gt;370&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;370&lt;/span&gt;), &lt;span class="Constant"&gt;54.03&lt;/span&gt; &lt;span class="Variable"&gt;KiB&lt;/span&gt;, done.
&lt;span class="Variable"&gt;Total&lt;/span&gt; &lt;span class="Constant"&gt;370&lt;/span&gt; (delta &lt;span class="Constant"&gt;247&lt;/span&gt;), reused &lt;span class="Constant"&gt;167&lt;/span&gt; (delta &lt;span class="Constant"&gt;110&lt;/span&gt;)
&lt;span class="Variable"&gt;To&lt;/span&gt; git@&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;repo_url_here&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;.&lt;span class="Entity"&gt;git&lt;/span&gt;
 &lt;span class="Keyword"&gt;*&lt;/span&gt; [&lt;span class="Keyword"&gt;new&lt;/span&gt; branch]      origin&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Variable"&gt;HEAD&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; new_remote_branch
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;repo_url_here&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

Great. Add it to your evernote and move on with your life :D
&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/RZW3pr8xaYk" height="1" width="1"/&gt;</description>
      <author>Daniel LaBare</author>
      <pubDate>Thu, 29 Oct 2009 00:30:01 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/RZW3pr8xaYk/can-t-add-git-remote-branch</link>
      <guid isPermaLink="false">http://elctech.com/articles/can-t-add-git-remote-branch</guid>
    <feedburner:origLink>http://elctech.com/articles/can-t-add-git-remote-branch</feedburner:origLink></item>
    <item>
      <title>Good Ruby Times</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;
  In the last few weeks I've had the chance to glance into several different codebases, some written years ago by devs in their Rails-infancy (rainfancy?).
&lt;/p&gt;
&lt;p&gt;Doing the travelling codes-man like that is a golden opportunity to see what people's stumbling blocks are and how a few easy tricks can improve the code substantially.
  
What follows is not your new cutting edge coffe making kitchen sink script-fu, but a rather dull list of everyday Ruby that I learned people need to learn.
&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;One-stop requires&lt;/h2&gt;
&lt;p&gt;
  This is a short one: requires go into the environment.rb. 
&lt;/p&gt;
&lt;p&gt;
Really, don't use it elsewhere. I've seen people reason along the lines of "I keep the 'require hpricot' in my xe.com currency rates scraping class as to keep things local and closely knit". There is some truth to that argument and if a gem is only used by a rake task, maybe it even saves us a second during app startup and some RAM. Still, load order issues, poor readability and maintainability makes it a real pain to deal with down the road.
&lt;/p&gt;
&lt;p&gt;
Trust me: don't. Put it in environment.rb with a comment describing its purpose in your project.
&lt;/p&gt;
Whenever possible use the "config.gem". Advantages:
&lt;ul&gt;
  &lt;li&gt;allows you to specify the lib name even if the gem name is different (e.g. for github gems)&lt;/li&gt;
  &lt;li&gt;allows you to require sub libs&lt;br /&gt;
  &lt;p&gt;Not used very often perhaps but put to good use by e.g. the right_aws gem where you can choose to load just the SQS part with:&lt;/p&gt;
        &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;config.&lt;span class="Entity"&gt;gem&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;lib&lt;/span&gt; =&amp;gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;sqs/right_sqs&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
      &lt;p&gt;or maybe you just wanted the SDB part?&lt;/p&gt;
         &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;config.&lt;span class="Entity"&gt;gem&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;lib&lt;/span&gt; =&amp;gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;sdb/right_sdb_interface&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
      
    &lt;p&gt;
      I personally believe this particular feature is more confusing than helpful, but it's good to know it's there.
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;allows you to specify the library version&lt;br /&gt;
    &lt;p&gt;
      Towards the end of the development cycle, before rolling out to production, gems should generally be frozen. An alternative is to define exact versions in the config. I generally advise doing both as having the environment.rb as the one-stop source for gem requirements is a boon for everybody involved, capistrano scripts or new devs on your team.
    &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;all in one place, easy to find out requirements&lt;/li&gt;
&lt;/ul&gt;
   
&lt;h2&gt;Singleton methods (creation)&lt;/h2&gt;
    &lt;p&gt;Ruby provides three (common) ways to define a singleton method:&lt;/p&gt;

    &lt;ol style="list-style-type: lower-alpha"&gt;
      &lt;li&gt;&lt;p&gt;Explicitly name the class&lt;/p&gt;
        &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;RapidInterventionGroupTeam&lt;span class="EntityInheritedClass"&gt; &lt;span class="EntityInheritedClass"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;RapidInterventionGroupTeam.load_group_allocations_and_teams&lt;/span&gt;(&lt;span class="Variable"&gt;project_id&lt;span class="Variable"&gt;,&lt;/span&gt; curr_user&lt;/span&gt;)
&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
        
&lt;/pre&gt;&lt;/code&gt;      
      &lt;p&gt;
        PROs: hmm, dunno. Makes it easy to know what class you're looking at if the source code file is very long?
      &lt;/p&gt;
      &lt;p&gt;
        CONs: long, ugly
      &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Use self&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;RapidInterventionGroupTeam&lt;span class="EntityInheritedClass"&gt; &lt;span class="EntityInheritedClass"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;self.load_group_allocations_and_teams&lt;/span&gt;(&lt;span class="Variable"&gt;project_id&lt;span class="Variable"&gt;,&lt;/span&gt; curr_user&lt;/span&gt;)
&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;      
      &lt;p&gt;
        PROs: easy to spot here-comes-a-singleton-marker. Some people like to use the 'self' keyword. I call them self-ish people. Sorta short.
      &lt;/p&gt;
      &lt;p&gt;
        CONs: I think it's ugly. For more than two singletons that repeating 'self' annoys me.
      &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Use the metaclass&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;      
&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;RapidInterventionGroupTeam&lt;span class="EntityInheritedClass"&gt; &lt;span class="EntityInheritedClass"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; ==========================&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; = Class methods go here! =&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; ==========================&lt;/span&gt;
  &lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;&amp;lt;&amp;lt;&lt;/span&gt; self&lt;/span&gt;&lt;/span&gt;
    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;load_group_allocations_and_teams&lt;/span&gt;(&lt;span class="Variable"&gt;project_id&lt;span class="Variable"&gt;,&lt;/span&gt; cur_user&lt;/span&gt;)
&lt;span class="Comment"&gt;      &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  
    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;team_allocations&lt;/span&gt;
&lt;span class="Comment"&gt;      &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  
    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;group_allocations&lt;/span&gt;
&lt;span class="Comment"&gt;      &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; ============================&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; = Instance methods go here =&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; ============================&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;beef_cow_and_fowl&lt;/span&gt;
&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;      
      &lt;p&gt;
        PROs: shortest. Encourages devs to gather singletons in one spot, and perhaps they will notice when it gets out of hand and start creating mixins. Maybe. Also allows devs to show off their Ruby metaclass knowledge at bars. Maybe.
      &lt;/p&gt;
      &lt;p&gt;
        CONs: that class &lt;&lt; self &lt;em&gt;is&lt;/em&gt; funky and if funky doesn't rub well with you (or your boss) then I guess it's no good.
      &lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
      
  &lt;p&gt;
    I personally favor c) whenever the number of class methods goes above two or three; b) is fine when there are just a few of them.
  &lt;/p&gt;
&lt;h2&gt;Invoking singleton methods&lt;/h2&gt;
  &lt;p&gt;In Ruby there are many ways to invoke a class method. A few common ones:&lt;/p&gt;
  &lt;ol style="list-style-type: lower-alpha"&gt;
    &lt;li&gt;
      &lt;p&gt;Name the class explicitly:&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;user &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;User&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(&lt;span class="Constant"&gt;123&lt;/span&gt;)
&lt;span class="Support"&gt;Predators&lt;/span&gt;.&lt;span class="Entity"&gt;feed_to_wolves&lt;/span&gt;(&lt;span class="Constant"&gt;1&lt;/span&gt;, user)
      
&lt;/pre&gt;&lt;/code&gt;
    &lt;/li&gt;
    
    &lt;p&gt;When used from an instance of the class, use the context: self.class&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;Predators&lt;span class="EntityInheritedClass"&gt; &lt;span class="EntityInheritedClass"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;self.feed_to_wolves&lt;/span&gt;(&lt;span class="Variable"&gt;pack_id&lt;span class="Variable"&gt;,&lt;/span&gt; meat&lt;/span&gt;)
&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt; code&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
  
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; we know how we were born...&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;feed_us!&lt;/span&gt;(&lt;span class="Variable"&gt;meat&lt;/span&gt;)
    &lt;span class="Variable"&gt;self&lt;/span&gt;.&lt;span class="Entity"&gt;class&lt;/span&gt;.&lt;span class="Entity"&gt;feed_to_wolves&lt;/span&gt;(id, meat)
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
    &lt;li&gt;
      &lt;p&gt;Use a helper instance method &lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;    
&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;Steak&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;self.logger&lt;/span&gt;
    &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;logger&lt;/span&gt; &lt;span class="Keyword"&gt;||=&lt;/span&gt; &lt;span class="Support"&gt;Logger&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;log/steak.log&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
  &lt;span class="Keyword"&gt;def&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;logger&lt;/span&gt;
    &lt;span class="Variable"&gt;self&lt;/span&gt;.&lt;span class="Entity"&gt;class&lt;/span&gt;.&lt;span class="Entity"&gt;logger&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;beef&lt;/span&gt;
    logger.&lt;span class="Entity"&gt;debug&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;MONDAY BEEF!&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class="Entity"&gt;beef_for!&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;monday&lt;/span&gt;)
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;
      &lt;p&gt;
        Using an instance method this way to invoke a class level method is of course useful only if you invoke it very often and readability becomes very important. In the above example we're also memoizing (caching) the class level Logger object for fast access.
      &lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
      
  &lt;p&gt;
    I personally try 1) to avoid singletons altogether, 2) use method b) whenever possible and 3) start asking myself hard and awkward questions when doing a) more than 3 times a day. Too many singletons might be a codesmell.
  &lt;/p&gt;
    
    
&lt;h2&gt;Multiple return values&lt;/h2&gt;
  &lt;p&gt;First an example of how people often fake multiple value returns in Ruby:&lt;/p&gt;
  &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;Something&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;many&lt;/span&gt;
    [calc_monday_beef, calc_total_beef]
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;

s &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Something&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
retval &lt;span class="Keyword"&gt;=&lt;/span&gt; s.&lt;span class="Entity"&gt;many&lt;/span&gt;
  
&lt;/pre&gt;&lt;/code&gt;
  &lt;p&gt;
    DON'T: when coding a method and you realize you need to return more than one value from a method, you should stop and think. You're probably doing something wrong.&lt;br /&gt;
This is actually the reason why Ruby does not provide a way to return multiple values.
  &lt;/p&gt;  
  &lt;p&gt;
    If you're sure you know what you're doing and want to return more than value here are some tips:
  &lt;/p&gt;
  &lt;ol style="list-style-type: lower-alpha"&gt;
    &lt;li&gt;
      &lt;p&gt;do NOT do what I did in the example.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt; use descriptive variable names. "retval" above sucks. Use Ruby multiple value assignments like so:&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; cows, sheep, fish &lt;span class="Keyword"&gt;=&lt;/span&gt; [&lt;span class="Constant"&gt;1&lt;/span&gt;, &lt;span class="Constant"&gt;5&lt;/span&gt;, &lt;span class="Constant"&gt;3&lt;/span&gt;]
=&amp;gt; [&lt;span class="Constant"&gt;1&lt;/span&gt;, &lt;span class="Constant"&gt;5&lt;/span&gt;, &lt;span class="Constant"&gt;3&lt;/span&gt;]
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; cows
=&amp;gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; sheep
=&amp;gt; &lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; fish
=&amp;gt; &lt;span class="Constant"&gt;3&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;
      &lt;p&gt;Use this to assign multiple return values to local variables with helpful names:&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;      
s &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Something&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
monday_beef, total_beef &lt;span class="Keyword"&gt;=&lt;/span&gt; s.&lt;span class="Entity"&gt;many&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;
    &lt;/li&gt;

      
    &lt;li&gt;
      &lt;p&gt;
        c) if you're returning many values and you don't know beforehand how many values are coming back, use the splat operator (*):
      &lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; me, &lt;span class="Keyword"&gt;*&lt;/span&gt;others &lt;span class="Keyword"&gt;=&lt;/span&gt; [&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;abe&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;bob&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;caesar&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;donald&lt;/span&gt;]
=&amp;gt; [&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;abe&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;bob&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;caesar&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;donald&lt;/span&gt;]
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; me
=&amp;gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;abe&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; others
=&amp;gt; [&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;bob&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;caesar&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;donald&lt;/span&gt;]
      
&lt;/pre&gt;&lt;/code&gt;  
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;d) avoid using array indexes and prefer using Array#first, Array#last:&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;
          &lt;p&gt;BAD:&lt;/p&gt;
          &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  
s &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Something&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
retval &lt;span class="Keyword"&gt;=&lt;/span&gt; s.&lt;span class="Entity"&gt;many&lt;/span&gt;
&lt;span class="Support"&gt;Beef&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(retval[&lt;span class="Constant"&gt;0&lt;/span&gt;], &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;limit&lt;/span&gt; =&amp;gt; retval[&lt;span class="Constant"&gt;1&lt;/span&gt;])
          
&lt;/pre&gt;&lt;/code&gt;        
        &lt;/li&gt;
        &lt;li&gt;
          &lt;p&gt;STILL BAD SOMEWHAT BETTER:&lt;/p&gt;
          &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;s &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Something&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
retval &lt;span class="Keyword"&gt;=&lt;/span&gt; s.&lt;span class="Entity"&gt;many&lt;/span&gt;
&lt;span class="Support"&gt;Beef&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(retval.&lt;span class="Entity"&gt;first&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;limit&lt;/span&gt; =&amp;gt; retval.&lt;span class="Entity"&gt;last&lt;/span&gt;)
          
&lt;/pre&gt;&lt;/code&gt;        
      
          &lt;p&gt;Why better? Because you communicate to the reader that that 'retval' variable only have two values. (Yeah, it still sucks I know)
          &lt;/p&gt;      
      
        &lt;/li&gt;
        &lt;li&gt;        
          &lt;p&gt;ALSO BAD BUT SOMEWHAT-ER BETTER STILL:&lt;/p&gt;
          &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;s &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Something&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
monday_beef, beef_count &lt;span class="Keyword"&gt;=&lt;/span&gt; s.&lt;span class="Entity"&gt;many&lt;/span&gt;
&lt;span class="Support"&gt;Beef&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(monday_beef, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;limit&lt;/span&gt; =&amp;gt; beef_count)
          
&lt;/pre&gt;&lt;/code&gt;
      
        &lt;/li&gt;
        &lt;li&gt;        
          &lt;p&gt;GOOD:&lt;/p&gt;
          &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;s &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Something&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
&lt;span class="Support"&gt;Beef&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(s.&lt;span class="Entity"&gt;monday_beef&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;limit&lt;/span&gt; =&amp;gt; s.&lt;span class="Entity"&gt;total_beef_count&lt;/span&gt;)
          
&lt;/pre&gt;&lt;/code&gt;
          
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt; 
  &lt;/ol&gt;
&lt;h2&gt;Drop the return&lt;/h2&gt;
&lt;p&gt;
  Use the fact that Ruby methods return the value of the last expression. The only place where I think an explicit return is legit is when we want to return early and that's a performance optimization and as we know, premature optimization is the root of all evil, so unless you have benchmarks at hand proving the need for speed, just don't user 'return'.
&lt;/p&gt;
  
  &lt;ul&gt;
    &lt;li&gt;
      &lt;p&gt;Instead of:&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;course_description&lt;/span&gt;
  retval &lt;span class="Keyword"&gt;=&lt;/span&gt; course_shortname 
  retval &lt;span class="Keyword"&gt;=&lt;/span&gt; course_shortname &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;(&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;project&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;shortname&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;)&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; project
  &lt;span class="Keyword"&gt;return&lt;/span&gt; retval
&lt;span class="Keyword"&gt;end&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;
    &lt;/li&gt;  
    &lt;li&gt;
      &lt;p&gt;Do:&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;      
&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;course_description&lt;/span&gt;
  course_shortname &lt;span class="Keyword"&gt;+&lt;/span&gt; (project &lt;span class="Keyword"&gt;?&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;(&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;project&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;shortname&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;)&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; : &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;span class="Keyword"&gt;end&lt;/span&gt;
      
&lt;/pre&gt;&lt;/code&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

&lt;h2&gt;Enumerable&lt;/h2&gt;
&lt;p&gt;Learn to use and love ruby Enumerable module. It's really really useful.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instead of:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;      
&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;Vacation.holidaytype_selectbox&lt;/span&gt;
  types &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Array&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
  &lt;span class="Keyword"&gt;for&lt;/span&gt; vt &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Variable"&gt;VacationTypes&lt;/span&gt;
    types &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; vt[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;]
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;holidaytype_selectbox_model&lt;/span&gt; &lt;span class="Keyword"&gt;||=&lt;/span&gt; types
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Use:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;    
&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;self.holidaytype_selectbox&lt;/span&gt;
  &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;holidaytype_selectbox_model&lt;/span&gt; &lt;span class="Keyword"&gt;||=&lt;/span&gt; &lt;span class="Support"&gt;VacationTypes&lt;/span&gt;.&lt;span class="Entity"&gt;map&lt;/span&gt;(&lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;)
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Instead of:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;for&lt;/span&gt; result &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;candidate&lt;/span&gt;.&lt;span class="Entity"&gt;results&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;
  result.&lt;span class="Entity"&gt;destroy&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;      
  &lt;li&gt;
    &lt;p&gt;Use:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;candidate&lt;/span&gt;.&lt;span class="Entity"&gt;results&lt;/span&gt;.&lt;span class="Entity"&gt;each&lt;/span&gt;(&lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;destroy&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Instead of:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;approved&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="Keyword"&gt;unless&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;do_it&lt;/span&gt;.&lt;span class="Entity"&gt;nil?&lt;/span&gt;
  &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;events&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Event&lt;/span&gt;.&lt;span class="Entity"&gt;hourreporting_entries&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;user_id&lt;/span&gt;, params[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;projectid&lt;/span&gt;], &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;week&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;.&lt;span class="Entity"&gt;date&lt;/span&gt;, &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;week&lt;/span&gt;.&lt;span class="Entity"&gt;last&lt;/span&gt;.&lt;span class="Entity"&gt;date&lt;/span&gt;)

  &lt;span class="Keyword"&gt;for&lt;/span&gt; e &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;events&lt;/span&gt;
    &lt;span class="Keyword"&gt;if&lt;/span&gt; e.&lt;span class="Entity"&gt;approved&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
      &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;approved&lt;/span&gt; &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Do:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;    
&lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;do_it&lt;/span&gt;
  &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;events&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Event&lt;/span&gt;.&lt;span class="Entity"&gt;hourreporting_entries&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;user_id&lt;/span&gt;, params[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;projectid&lt;/span&gt;], &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;week&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;.&lt;span class="Entity"&gt;date&lt;/span&gt;, &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;week&lt;/span&gt;.&lt;span class="Entity"&gt;last&lt;/span&gt;.&lt;span class="Entity"&gt;date&lt;/span&gt;)
  &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;approved&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;events&lt;/span&gt;.&lt;span class="Entity"&gt;sum&lt;/span&gt;{|&lt;span class="Variable"&gt;e&lt;/span&gt;| e.&lt;span class="Entity"&gt;approved&lt;/span&gt; &lt;span class="Keyword"&gt;?&lt;/span&gt; e.&lt;span class="Entity"&gt;approved&lt;/span&gt; : &lt;span class="Constant"&gt;0&lt;/span&gt;}
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
    &lt;p&gt;The Array#sum method is a Rails addition.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;      
      
&lt;p&gt;
  In the app where I spotted the above, the default value for the 'approved' field is set to NULL. Had the default value been 0 instead, we could have written the above in an even shorter way:
&lt;/p&gt;
  &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;events&lt;/span&gt;.&lt;span class="Entity"&gt;sum&lt;/span&gt;(&lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;approved&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;
        
&lt;h2&gt;Truth&lt;/h2&gt;
&lt;p&gt;In Ruby, everything except false and nil evaluates to true. For realz.&lt;/p&gt;
  
&lt;ul&gt;
  &lt;li&gt;  
    &lt;p&gt;Instead of:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  
&lt;span class="Keyword"&gt;if&lt;/span&gt; options[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;add&lt;/span&gt;] &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; check_id.&lt;span class="Entity"&gt;to_i&lt;/span&gt; &lt;span class="Keyword"&gt;!=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
  meanie &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;MeanGuy&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(check_id)
  &lt;span class="Keyword"&gt;if&lt;/span&gt; meanie.&lt;span class="Entity"&gt;reason&lt;/span&gt; &lt;span class="Keyword"&gt;!=&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Keyword"&gt;!&lt;/span&gt;meanie.&lt;span class="Entity"&gt;reason&lt;/span&gt;.&lt;span class="Entity"&gt;nil?&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; meanie.&lt;span class="Entity"&gt;type&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Support"&gt;MeanGuy&lt;/span&gt;.&lt;span class="Entity"&gt;allowed_types&lt;/span&gt;[&lt;span class="Constant"&gt;0&lt;/span&gt;]
&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;    
  &lt;li&gt;    
    &lt;p&gt;Do:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  
&lt;span class="Keyword"&gt;if&lt;/span&gt; options[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;add&lt;/span&gt;] &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Keyword"&gt;!&lt;/span&gt;check_id.&lt;span class="Entity"&gt;zero?&lt;/span&gt;
  meanie &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;MeanGuy&lt;/span&gt;.&lt;span class="Entity"&gt;find&lt;/span&gt;(check_id)
  &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;!&lt;/span&gt;meanie.&lt;span class="Entity"&gt;reason&lt;/span&gt;.&lt;span class="Entity"&gt;blank?&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; meanie.&lt;span class="Entity"&gt;type&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Support"&gt;MeanGuy&lt;/span&gt;.&lt;span class="Entity"&gt;allowed_types&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;
&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;    
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  When chaining conditional checks like above with "&amp;&amp;", remember that Ruby will stop the checks at the first failure, so always put the 'cheapest' checks first (e.g. put any checks that require a database query last).
&lt;/p&gt;

&lt;p&gt;
  In the above snippet we see the very common "!something.blank?" idiom. I personally really don't like the prepended "!" and always try to avoid it. Hurts my eyes and makes me stumble while reading. Ideally the above should be:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;if&lt;/span&gt; meanie.&lt;span class="Entity"&gt;reason&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; meanie.&lt;span class="Entity"&gt;type&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Support"&gt;MeanGuy&lt;/span&gt;.allowed_type
&lt;/pre&gt;&lt;/code&gt;
        
&lt;p&gt;
  but if the meanie reason is allowed to be the empty string -- which Ruby will consider True -- then we need the explicit blank?-check.
&lt;/p&gt;    
  
    &lt;p&gt;Unrelated neat trick using &amp;&amp;:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Instead of:&lt;/p&gt;
        &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;safe_death&lt;/span&gt;(&lt;span class="Variable"&gt;dude&lt;/span&gt;)
  &lt;span class="Keyword"&gt;if&lt;/span&gt; dude
    &lt;span class="Keyword"&gt;if&lt;/span&gt; dude.&lt;span class="Entity"&gt;destroy&lt;/span&gt;
      &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Support"&gt;DudeMailer&lt;/span&gt;.&lt;span class="Entity"&gt;deliver_destruction_notification&lt;/span&gt;
        &lt;span class="Support"&gt;Call&lt;/span&gt;.&lt;span class="Entity"&gt;his_mum&lt;/span&gt;
      &lt;span class="Keyword"&gt;end&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Entity"&gt;safe_death&lt;/span&gt;(&lt;span class="Support"&gt;Dude&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;)
      
&lt;/pre&gt;&lt;/code&gt;
    &lt;/li&gt;
    
    &lt;li&gt;
      &lt;p&gt;Do:&lt;/p&gt;
      &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;safe_death&lt;/span&gt;(&lt;span class="Variable"&gt;dude&lt;/span&gt;)
  dude &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; dude.&lt;span class="Entity"&gt;destroy&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Support"&gt;DudeMailer&lt;/span&gt;.&lt;span class="Entity"&gt;deliver_destruction_notification&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Support"&gt;Call&lt;/span&gt;.&lt;span class="Entity"&gt;his_mum&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Entity"&gt;safe_death&lt;/span&gt;(&lt;span class="Support"&gt;Dude&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;)
      
&lt;/pre&gt;&lt;/code&gt;
    &lt;/li&gt;
&lt;p&gt;
  This works well only if you don't care about handling any error conditions
and success depends on *all* method calls being successful.
&lt;/p&gt;    
    
&lt;p&gt;
  To improve readability in general create as many predicate methods as possible. They are short, 
cheap and really helps readability.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instead of:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  
&lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;active&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;projects&lt;/span&gt;.&lt;span class="Entity"&gt;include?&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;beef_on_monday&lt;/span&gt;) &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;type&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;human&lt;/span&gt; &lt;span class="Keyword"&gt;||&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;type&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;dog&lt;/span&gt;)
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;        
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Do:&lt;/p&gt;
    &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;Person&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;active_monday_beefer?&lt;/span&gt;
    actvive? &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="Entity"&gt;member_of?&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;beef_on_monday&lt;/span&gt;) &lt;span class="Keyword"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (human? &lt;span class="Keyword"&gt;||&lt;/span&gt; dog?)
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;person&lt;/span&gt;.&lt;span class="Entity"&gt;active_monday_beefer?&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; Code&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
    
&lt;/pre&gt;&lt;/code&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Method naming&lt;/h2&gt;
&lt;p&gt;
  When naming your methods, avoid prepending "get_" or "set_". The Ruby convention is that getters are just the value name and the setter has the "=" postfix. Avoid the quasi-get_'s  too: load_, retrieve_, store_, put_. Sometimes they're ok, but just stop a second and think if:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Entity"&gt;store_incoming_beef&lt;/span&gt;()
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;is really really better than&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Entity"&gt;more_beef_in_the_holds&lt;/span&gt;()
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Entity"&gt;beefers_keepers&lt;/span&gt;()
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Entity"&gt;not_pork_not_sheep_not_fowl_but?&lt;/span&gt;()
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;As always rules are made to be broken, judiciously. ;)&lt;/p&gt;
    
&lt;p&gt;DON'T:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;get_premium, #get_unix_time_stamp, #load_dates, #retrieve_mums etc&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Do:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;premium, #unix_timestamp, #dates, #mums, #beefs&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
  
&lt;p&gt;DON'T:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Support"&gt;Server&lt;/span&gt;.&lt;span class="Entity"&gt;set_clock&lt;/span&gt;(&lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt;)
&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;doc&lt;/span&gt;.&lt;span class="Entity"&gt;store_signer&lt;/span&gt;(&lt;span class="Support"&gt;Dude&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;)
&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;tellus&lt;/span&gt;.&lt;span class="Entity"&gt;put_fire&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;wild&lt;/span&gt;)
&lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;set_back&lt;/span&gt;(&lt;span class="Constant"&gt;1&lt;/span&gt;.&lt;span class="Entity"&gt;year&lt;/span&gt;.&lt;span class="Entity"&gt;ago&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Do:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Support"&gt;Server&lt;/span&gt;.&lt;span class="Entity"&gt;clock&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt;
&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;doc&lt;/span&gt;.&lt;span class="Entity"&gt;signer&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Dude&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;tellus&lt;/span&gt;.&lt;span class="Entity"&gt;fire!&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;wild&lt;/span&gt;)
&lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;.&lt;span class="Entity"&gt;year&lt;/span&gt;.ago
&lt;/pre&gt;&lt;/code&gt;
      
&lt;p&gt;
  Keep method names short: e.g. #shorten_timespaces_because_of_special_holiday is too long. Long method names are often a sign of complex methods. Complex methods are often a sign we should refactor the code into smaller pieces.
&lt;/p&gt;
     
&lt;p&gt;
  Sometimes the work done by a method is simply too complicated to be expressed properly
by a short and self-explanatory method name. If so, don't even try. Leave the method name
short and cryptical. It becomes a marker for the reader of "hey, wanna understand this one?
Sorry but you really really have to go read the code!".
&lt;/p&gt;     
&lt;p&gt;DON'T:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;shorten_timespaces_because_of_special_holiday&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;DO:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;holiday_adjustment&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
      
&lt;p&gt;
  Use the "?" for predicates (should *always* return true/false or at least something that evaluates to true false, such as "abc"/nil)
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;Session&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;finished?&lt;/span&gt;
    finished_at
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;

sess &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Session&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
sess.&lt;span class="Entity"&gt;finished_at&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt;
sess.finished?
&lt;/pre&gt;&lt;/code&gt;        
&lt;p&gt;GOOD:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;if&lt;/span&gt; sess.&lt;span class="Entity"&gt;finished?&lt;/span&gt; 
  coffee!
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;BAD:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;if&lt;/span&gt; sess.&lt;span class="Entity"&gt;finished_at&lt;/span&gt;
  coffee!
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;h2&gt;Use rdoc!&lt;/h2&gt;
&lt;p&gt;
  User rdoc for your rails apps. It's actually nice. When your mum asks you what it is you actually do you can show her the rdocs with links and text and colors and lists and it will make her happy too. And very useful for people trying to read your code (ok, they can run the freakin' rake task themselves, but you should do it too!).
&lt;/p&gt;  
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  rake doc&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;app&lt;/span&gt;
  open doc&lt;span class="Keyword"&gt;/&lt;/span&gt;app&lt;span class="Keyword"&gt;/&lt;/span&gt;index
&lt;/pre&gt;&lt;/code&gt;&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/VvnAuTopbS4" height="1" width="1"/&gt;</description>
      <author>David Palm</author>
      <pubDate>Tue, 27 Oct 2009 13:01:21 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/VvnAuTopbS4/good-ruby-times</link>
      <guid isPermaLink="false">http://elctech.com/articles/good-ruby-times</guid>
    <feedburner:origLink>http://elctech.com/articles/good-ruby-times</feedburner:origLink></item>
    <item>
      <title>Amazon's MySQL in the Cloud (RDS)</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Amazon just released the &lt;strong&gt;"public beta of Amazon Relational Database Service (Amazon RDS), a new web service that makes it easy to set up, operate, and scale relational databases in the cloud."&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Great! So what is it?&lt;/h2&gt;
&lt;p&gt;RDS today is an EC2 instance running MySQL 5.1. Instead of starting an EC2 instance with RightScale or EC2 commandline tools, you start an RDS instance with the RDS commandline tools (and I'm sure RightScale will support RDS shortly).&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;The RDS instance accepts parameters such as root database username and password, db space to allocate, initial instance size (note there are new instances), db backup periods, among others. Amazon's RDS layer configures MySQL in a proven configuration based on the parameters you specify.&lt;/p&gt;
&lt;p&gt;RDS instances cost 10% more than a vanilla EC2 instance for Small, Large and XL instances. For Double and Quadruple DB instances the pricing is higher:
&lt;img src="http://elccore.s3.amazonaws.com/5/899/Screen shot 2009-10-27 at 09.40.26.png" alt="Screen shot 2009-10-27 at 09" /&gt;&lt;br /&gt;
Note that EC2 pricing is about to change and you will want to recalculate that 10% if RDS does not shift as well.&lt;/p&gt; 
&lt;h2&gt;And why do we want it?&lt;/h2&gt;
&lt;p&gt;If you run MySQL in EC2 for reasonably large properties, this service effectively provides a substantial reduction in undifferentiated system administration overhead within your organization. That is, if your deployment is small--you probably run your DB on the same machine as your application--you could use RDS to reduce your SysAdmin costs, but you probably value your time less than AWS costs at this stage of deployment. If your deployment is huge--you probably run your DB on EBS (RAID striped) with hot replication to other instances (for performance and failover) and automated offsite backups. You have a large AWS bill and a large SysAdmin cost to implement, monitor and maintain the configuration. RDS could potentially greatly reduce your SysAdmin bill, but today you cannot hot replicate nor run an RDS DB across multiple underlying instances--and therefore RDS is not for you.&lt;/p&gt;
&lt;h2&gt;So who is it for?&lt;/h2&gt; 
&lt;/div&gt;
&lt;p&gt;RDS as it stands today is ideal for deployments that have scale to warrant a separate DB. These are midsize deployments--or smaller deployments that follow best-practices in deployment and scalability over instance cost savings. These deployments may have mid-to-large EC2 instances powering their DB today, and don't need hot replication for performance nor uptime. Note that with the new double and quad instance sizes, the performance ceiling on a single instance has been greatly raised.&lt;/p&gt;
&lt;p&gt;These deployments will benefit from a proven DB configuration, out of the box automated backups, one command time-and-date restores, auto instance failover (some downtime would be associated), monitoring (accessible via CloudWatch), and autoscaling of their DB instance (yes--as load increases, your instance is seamlessly migrated to a larger instance).&lt;/p&gt;
&lt;p&gt;Our team routinely deploys the midsize and huge DB configurations described here. We have the highest SysAdmin cost on our huge deployments, but also the highest budgets :-). We have been using RDS as the staging DB for several of our midsized deployments. So far we have seen no real usage difference in using an RDS DB vs our own EC2-hosted DB. We do notice that we don't worry about whether our DB backup script is working. That alone is worth 10% of our instance cost. The reduction in DB instance deployment time and SysAdmin cost is also a win--but we won't see those savings until our next deployment--as all our deploys are RightScripted and already include a configured DB. Finally--the autoscale, fine-grained restore and other features sound great, but we won't have more to say until we use them in practice.&lt;/p&gt; 
&lt;h2&gt;Other Observations&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Logs are accessible within a MySQL table exposed within the RDS insance.&lt;/li&gt;
    &lt;li&gt;In the future it appears that other DB types (non MySQL 5.1) will be supported.&lt;/li&gt;
    &lt;li&gt;DB allocated storage must be declared in advance. Think of this as allocating the EBS volume connected to your instance. Going to need 50GB for your DB? Allocate 50GB. If it grows? Monitor DB size on CloudWatch and make sure you bump the allocated space. Will the RDS team email you to let you know this is an issue? Try it and find out. :-P&lt;/li&gt;
    &lt;li&gt;New instances were released coincident with the launch. 64GB and 32GB high-memory instances.&lt;/li&gt;
    &lt;li&gt;A new Small 64 bit instance is available, but only for RDS. This would be a nice-to-have for EC2 as well to minimize rebuilding templates when going from Small (32bit) to other sizes (64bit).&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/RzrNdbA-KP8" height="1" width="1"/&gt;</description>
      <author>Jonathan Siegel</author>
      <pubDate>Tue, 27 Oct 2009 10:08:41 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/RzrNdbA-KP8/amazon-s-mysql-in-the-cloud-rds</link>
      <guid isPermaLink="false">http://elctech.com/articles/amazon-s-mysql-in-the-cloud-rds</guid>
    <feedburner:origLink>http://elctech.com/articles/amazon-s-mysql-in-the-cloud-rds</feedburner:origLink></item>
    <item>
      <title>RightSignature hits the Press on ReadWrite Enterprise</title>
      <description>&lt;div class="preface"&gt;

&lt;p&gt;&lt;a href="http://www.readwriteweb.com" target="_blank"&gt;ReadWrite Enterprise&lt;/a&gt; &lt;a href="http://www.readwriteweb.com/enterprise/2009/10/rightsignature-sign-awaywith-y.php" target="_blank"&gt;says&lt;/a&gt; "RightSignature user interface is pretty elegant. It has a flow that makes it simple to complete the signing of documents through the automation of tasks such as adding initials to each page, a requirement of most contracts." They also comment that "Part of RightSignature's appeal is in its overall change to the workflow and the efficiencies that result." RightSignature is entering the Software-as-a-Service market and is headed to the top with other ecosystems like Salesforce.com and Google Wave.

&lt;/p&gt;&lt;p&gt;ELC Technologies continues to launch &lt;a href="http://www.elctech.com/services#our_products"&gt;cutting edge products&lt;/a&gt; on the web.&lt;/p&gt; 

&lt;p&gt;Read more at &lt;a href="http://www.readwriteweb.com/enterprise/2009/10/rightsignature-sign-awaywith-y.php"&gt;http://www.readwriteweb.com/enterprise/2009/10/rightsignature-sign-awaywith-y.php&lt;/a&gt;&lt;/p&gt;

&lt;img src="http://elccore.s3.amazonaws.com/4/893/ReadWriteRightSignPress.jpg" alt="Readwriterightsignpress" /&gt;

&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/v0n72VAupRY" height="1" width="1"/&gt;</description>
      <author>ELC</author>
      <pubDate>Wed, 21 Oct 2009 22:17:55 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/v0n72VAupRY/rightsignature-hits-the-press-on-readwrite-enterprise</link>
      <guid isPermaLink="false">http://elctech.com/articles/rightsignature-hits-the-press-on-readwrite-enterprise</guid>
    <feedburner:origLink>http://elctech.com/articles/rightsignature-hits-the-press-on-readwrite-enterprise</feedburner:origLink></item>
    <item>
      <title>How to remove trailing slashes to get better analytics on your page views</title>
      <description>&lt;div class="preface"&gt;

&lt;p&gt;
    I noticed when viewing my google analytics report that I had several duplicate entries for the same that looked like /page, and then /page/ (a trailing slash).
&lt;/p&gt;

&lt;p&gt;
    Obviously I'd like these two to be combined to get one statistic for those page views. There are a couple of ways to do this.
&lt;/p&gt;

&lt;p&gt;
1) The particular project in question is using nginx. We can use a rewrite to get rid of the slash.
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;server {
    server_name example.&lt;span class="Entity"&gt;com&lt;/span&gt;;

    ...

    rewrite &lt;span class="Keyword"&gt;^&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;(.&lt;span class="Keyword"&gt;*&lt;/span&gt;)&lt;span class="Keyword"&gt;/&lt;/span&gt;$ &lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;$&lt;/span&gt;1&lt;/span&gt; permanent;

    location &lt;span class="Keyword"&gt;/&lt;/span&gt; {
    ...
    }
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
2) You can also get creative with a little rack fun. 
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;sudo gem install rack&lt;span class="Keyword"&gt;-&lt;/span&gt;rewrite

&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; then slip the following in your environment.rb&lt;/span&gt;

config.&lt;span class="Entity"&gt;gem&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rack-rewrite&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;~&amp;gt; 0.1.2&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rack-rewrite&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
config.&lt;span class="Entity"&gt;middleware&lt;/span&gt;.&lt;span class="Entity"&gt;insert_before&lt;/span&gt;(&lt;span class="Support"&gt;Rack&lt;/span&gt;::&lt;span class="Entity"&gt;Lock&lt;/span&gt;, &lt;span class="Support"&gt;Rack&lt;/span&gt;::&lt;span class="Entity"&gt;Rewrite&lt;/span&gt;) &lt;span class="Keyword"&gt;do&lt;/span&gt;
  r301 &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;%r{&lt;/span&gt;^/&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;(&lt;/span&gt;.*&lt;span class="StringRegexp"&gt;)&lt;/span&gt;&lt;/span&gt;/$&lt;span class="StringRegexp"&gt;}&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;/$1&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
3) Other ways? Leave me some feedback.
&lt;/p&gt;

&lt;p&gt;
Now you should start to see only /page hits in your google analytics and no more /page/
&lt;/p&gt;

&lt;p&gt;Cool.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/YUIWc3VXW6o" height="1" width="1"/&gt;</description>
      <author>Daniel LaBare</author>
      <pubDate>Wed, 14 Oct 2009 01:42:54 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/YUIWc3VXW6o/how-to-remove-trailing-slashes-to-get-better-analytics-on-your-page-views</link>
      <guid isPermaLink="false">http://elctech.com/articles/how-to-remove-trailing-slashes-to-get-better-analytics-on-your-page-views</guid>
    <feedburner:origLink>http://elctech.com/articles/how-to-remove-trailing-slashes-to-get-better-analytics-on-your-page-views</feedburner:origLink></item>
    <item>
      <title>Custom Validations for Polymorphic Associatied Models</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;I recently needed custom validations for a polymorphically associated model, but only for certain polymorphic parents. Lets looks at an example, take the &lt;a href="http://robots.thoughtbot.com/post/159808315/a-compromise" target="_blank"&gt;acts_as_addressable plugin&lt;/a&gt;, an oldie but a goodie, it lets you attach addresses to all sorts of models. That is a great and extremely useful pattern, I use it all the time. But requirements can't always stay nice and polymorphic freindly. So we have to know when and how to extend the associations features and when to split the models. But all I needed was different validations for different models, so no need to split. Its simple, just utilize the if option on the validations and the model name stored in the addressable_type column.&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Variable"&gt;SKIP_VALIDATIONS_FOR&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt;[&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Widget&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Sprocket&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;]

validates_presence_of &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;street1&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;city&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;postal_code&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;country&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;if&lt;/span&gt;=&amp;gt; &lt;span class="Support"&gt;Proc&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt; {|&lt;span class="Variable"&gt;obj&lt;/span&gt;| &lt;span class="Keyword"&gt;!&lt;/span&gt;&lt;span class="Variable"&gt;SKIP_VALIDATIONS_FOR&lt;/span&gt;.&lt;span class="Entity"&gt;include?&lt;/span&gt;(obj.&lt;span class="Entity"&gt;addressable_type&lt;/span&gt;)}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;This is a pretty simple example, but could easily be expanded to fit different requirements.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/a2Dex43twW4" height="1" width="1"/&gt;</description>
      <author>Nicholaus</author>
      <pubDate>Tue, 13 Oct 2009 18:25:31 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/a2Dex43twW4/custom-validations-for-polymorphic-associatied-models</link>
      <guid isPermaLink="false">http://elctech.com/snippets/custom-validations-for-polymorphic-associatied-models</guid>
    <feedburner:origLink>http://elctech.com/snippets/custom-validations-for-polymorphic-associatied-models</feedburner:origLink></item>
    <item>
      <title>Floodgates opened to iPhone development</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;
For as active as iPhone application development community is, achieving success in iTunes has been an elusive affair for those who participate in this vertical.  The two main obstacles presented to anyone who wants to create an iPhone applications are: one, finding resources/developers with the right skill set; and two, marketing the application after the application has been submitted.  The bad news is Apple keeps iTunes a black box.  Unless your application has been reviewed or mentioned on review sites or blogs, no one will be able to find your application outside of iTunes.  This makes marketing your application relatively difficult.  Here's the good news: the cost to build an iPhone application should come down substantially as it no longer requires a developer with an exclusive knowledge to a specific technology to build an application for iPhone.
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
When Apple first announced to openly accept applications from developers, the prerequisite for the developer is a somewhat extensive knowledge in a language called "Objective-C."  For a short while, it would seem as though the developers who could produce Objective-C codes were superstars that also came with a superstar price tag.  Such stardom, however, did not last.  When 
&lt;a href="http://phonegap.com"&gt;PhoneGap&lt;/a&gt;
 was introduced as an open source development tool for iPhone via JavaScript, the web development community devoured it like salmon to a hungry bear.  Shortly after PhoneGap's success, 
&lt;a href="http://www.mono-project.com/"&gt;Mono framework&lt;/a&gt;  
was released in the commercial sector that provided the necessary development tools to the vast number of C# developers across multiple platforms.  And to unhinge the final bar from the floodgates, Adobe has 
&lt;a href="http://www.informationweek.com/news/internet/webdev/showArticle.jhtml?articleID=220301118"&gt;just announced&lt;/a&gt; 
that the next release of Flash is capable of compiling a flash project directly into native iPhone application.  Simply put, a project can go from design to finish without even being touched by a developer.
&lt;/p&gt;
&lt;p&gt;
The implication for this phenomenon is a curious one: how will Apple respond to the rush of new applications when the floodgates are finally open?  Will Apple still be able to keep its manual review process intact?  When the market is saturated with developers and applications, will Apple be able to to maintain iTunes exclusive distribution channel and continue to motivate merchants to participate? 
&lt;/p&gt;
&lt;p&gt;
How all of this will affect Apple or iPhone developers is yet to be seen.  However, one thing that seems to be true is that when given enough demands, people will find ways to liberate a technology regardless of how businesses are structured around it. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/v5mmIMBLiBU" height="1" width="1"/&gt;</description>
      <author>Rick</author>
      <pubDate>Mon, 12 Oct 2009 18:35:54 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/v5mmIMBLiBU/floodgates-opened-to-iphone-development</link>
      <guid isPermaLink="false">http://elctech.com/articles/floodgates-opened-to-iphone-development</guid>
    <feedburner:origLink>http://elctech.com/articles/floodgates-opened-to-iphone-development</feedburner:origLink></item>
    <item>
      <title>Make your buttons look super awesome</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;
  Back in April, &lt;a href="http://www.zurb.com" target="_blank"&gt;ZURB&lt;/a&gt; published &lt;a href="http://www.zurb.com/article/266/super-awesome-buttons-with-css3-and-rgba" target="_blank"&gt;the super awesome buttons&lt;/a&gt; to showcase what can now be done with CSS and RGBA.  They are so awesome!  They still look like images but loading speed and maintainability continues to benefit from normal HTML buttons.  Below is what they look like:
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.zurb.com/blog_uploads/0000/0485/buttons-02.html" target="_blank"&gt;&lt;img src="http://elccore.s3.amazonaws.com/29/876/super-awesome-buttons-all.png" alt="Super-awesome-buttons-all" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
I started using these buttons in some of our projects and extended them to improve the cross browser compatibility.  I added a nicer design for when the buttons get clicked, and removed the necessity to set to different background colors for different states of the buttons.
&lt;/p&gt;
&lt;p&gt;
Here is how the even more awesome buttons look like, click'em!
&lt;/p&gt;

&lt;link href="http://elccore.s3.amazonaws.com/awesome_buttons/awesome-buttons.css" rel="stylesheet" media="all" type="text/css" /&gt;
	&lt;style type="text/css"&gt;  		
  	.awesome.blue {
      background-color: #0A50FF !important;
      }
      .awesome.red {
      background-color: #e33100 !important;
      }
      .awesome.green {
      background-color: #3ACC00 !important;
      }
a.awesome {
text-decoration: none !important;
}
    &lt;/style&gt;

&lt;script type="text/javascript" charset="utf-8"&gt;
    
      awesome_buttons = awesome_links = [
        ['now I\'m awesome', 'awesome medium button'],
        ['wow, huge!', 'awesome large button'],
        ['small but awesome', 'awesome small button'],
        ['so much color', 'awesome green button'],
        ['end even more', 'awesome blue button'],
        ['I could do it all day long', 'awesome huge red button'],
        ['Let\'s do it again!', '']
      ]
      awesome_buttons_index = awesome_links_index = 0
    
      function awesome_button(o) {
        o.value = awesome_buttons[awesome_buttons_index][0]
        o.className = awesome_buttons[awesome_buttons_index][1]
        awesome_buttons_index++
        if (awesome_buttons_index == awesome_buttons.length) awesome_buttons_index = 0
        return false
      }
      function awesome_link(o) {
        o.innerHTML = awesome_buttons[awesome_links_index][0]
        o.className = awesome_links[awesome_links_index][1]
        awesome_links_index++
        if (awesome_links_index == awesome_links.length) awesome_links_index = 0
        return false
      }
    &lt;/script&gt;

		  &lt;p style="margin: 2em 0; text-align: center"&gt;
		    &lt;input name="some_name" type="button" value="I'm just a button - Click me" onclick="return awesome_button(this)" /&gt; | &lt;a href="#" onclick="return awesome_link(this)"&gt;I'm just a link - Click me&lt;/a&gt;
		  &lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;This is how the css magic looks like&lt;/h2&gt;
&lt;code language="css"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; set an awesome color for the buttons &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;, 
&lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;, 
&lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt; {
  &lt;span class="CssPropertyName"&gt;background-color&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;&lt;span class="CssAdditionalConstants"&gt;#&lt;/span&gt;111&lt;/span&gt;;
}
&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; Touch the rest at your onw risk. &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;,
&lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;,
&lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt; { 

  &lt;span class="CssPropertyName"&gt;font&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;inherit&lt;/span&gt;;
  &lt;span class="CssPropertyName"&gt;background-repeat&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;repeat-x&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;color&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;&lt;span class="CssAdditionalConstants"&gt;#&lt;/span&gt;fff&lt;/span&gt;;
  &lt;span class="CssPropertyName"&gt;text-decoration&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;none&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;position&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;relative&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;cursor&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;pointer&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;border&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;font-style&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;normal&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;font-weight&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;bold&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;line-height&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;1&lt;/span&gt;; 
  
  &lt;span class="CssPropertyName"&gt;padding&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 10&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 6&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;;
  &lt;span class="CssPropertyName"&gt;font-size&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;13&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;;
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; IE only stuff &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  &lt;span class="CssPropertyName"&gt;border-bottom&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; &lt;span class="CssPropertyValue"&gt;solid&lt;/span&gt; &lt;span class="CssPropertyValue"&gt;transparent&lt;/span&gt;\&lt;span class="CssAdditionalConstants"&gt;9&lt;/span&gt;;
  
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; not all browser support these, but who cares? &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  &lt;span class="CssPropertyName"&gt;text-shadow&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt; &lt;span class="CssAdditionalConstants"&gt;-1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; rgba(&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0.25&lt;/span&gt;), &lt;span class="CssAdditionalConstants"&gt;-2&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 0&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; rgba(&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0.25&lt;/span&gt;); 
  &lt;span class="CssPropertyName"&gt;border&lt;/span&gt;-radius: &lt;span class="CssAdditionalConstants"&gt;5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; 
  -moz-&lt;span class="CssPropertyName"&gt;border&lt;/span&gt;-radius: &lt;span class="CssAdditionalConstants"&gt;5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; 
  -webkit-&lt;span class="CssPropertyName"&gt;border&lt;/span&gt;-radius: &lt;span class="CssAdditionalConstants"&gt;5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; 
  -moz-box-shadow: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 2&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; rgba(&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0.5&lt;/span&gt;); 
  -webkit-box-shadow: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 2&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; rgba(&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0.5&lt;/span&gt;);
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; one image for all states &lt;/span&gt;
&lt;span class="Comment"&gt;     see http://www.alistapart.com/articles/sprites &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  &lt;span class="CssPropertyName"&gt;background-image&lt;/span&gt;: &lt;span class="SupportFunction"&gt;url&lt;/span&gt;(&lt;span class="Variable"&gt;awesome-overlay-sprite.png&lt;/span&gt;);
  &lt;span class="CssPropertyName"&gt;background-position&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 0&lt;/span&gt;;
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; cross browser inline block hack &lt;/span&gt;
&lt;span class="Comment"&gt;     see http://blog.mozilla.com/webdev/2009/02/20/cross-browser-inline-block/ &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  &lt;span class="CssPropertyName"&gt;display&lt;/span&gt;: -moz-&lt;span class="CssPropertyValue"&gt;inline&lt;/span&gt;-stack;
  &lt;span class="CssPropertyName"&gt;display&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;inline-block&lt;/span&gt;;
  &lt;span class="CssPropertyName"&gt;vertical-align&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;middle&lt;/span&gt;;
  *&lt;span class="CssPropertyName"&gt;display&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;inline&lt;/span&gt; &lt;span class="Keyword"&gt;!important&lt;/span&gt;;
  &lt;span class="CssPropertyName"&gt;position&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;relative&lt;/span&gt;;
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; help IE to calm down a bit &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  zoom: &lt;span class="CssAdditionalConstants"&gt;1&lt;/span&gt;;
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt;disable text selection (Firefox only)&lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  -moz-user-select: &lt;span class="CssPropertyValue"&gt;none&lt;/span&gt;;
}
&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; hide selection background color &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;::&lt;/span&gt;selection&lt;/span&gt; {
	&lt;span class="CssPropertyName"&gt;background&lt;/span&gt;: &lt;span class="CssPropertyValue"&gt;transparent&lt;/span&gt;;
}

&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;hover&lt;/span&gt;,
&lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;hover&lt;/span&gt;,
&lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;hover&lt;/span&gt; {
  &lt;span class="CssPropertyName"&gt;background-position&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt; &lt;span class="CssAdditionalConstants"&gt;-50&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; 
  &lt;span class="CssPropertyName"&gt;color&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;&lt;span class="CssAdditionalConstants"&gt;#&lt;/span&gt;fff&lt;/span&gt;;
}
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,
&lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,
&lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;	{ 
  &lt;span class="CssPropertyName"&gt;background-position&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 100&lt;/span&gt;&lt;span class="Keyword"&gt;%&lt;/span&gt;; 
  -moz-box-shadow: &lt;span class="CssPropertyValue"&gt;inset&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 0&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 2&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; rgba(&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;,&lt;span class="CssAdditionalConstants"&gt;0.7&lt;/span&gt;); 
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; unfortunately, Safari seems not to support inset yet &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  -webkit-box-shadow: &lt;span class="CssPropertyValue"&gt;none&lt;/span&gt;;
  
  &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; IE only stuff &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt;
  &lt;span class="CssPropertyName"&gt;border-bottom&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;0&lt;/span&gt;\&lt;span class="CssAdditionalConstants"&gt;9&lt;/span&gt;;
  &lt;span class="CssPropertyName"&gt;border-top&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt; &lt;span class="CssPropertyValue"&gt;solid&lt;/span&gt; &lt;span class="CssAdditionalConstants"&gt;&lt;span class="CssAdditionalConstants"&gt;#&lt;/span&gt;666&lt;/span&gt;\&lt;span class="CssAdditionalConstants"&gt;9&lt;/span&gt;;
}

&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;small&lt;/span&gt;,         &lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;small&lt;/span&gt;,          &lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;small&lt;/span&gt; 	        { &lt;span class="CssPropertyName"&gt;padding&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;4&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 7&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; &lt;span class="CssPropertyName"&gt;font-size&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;10&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; }
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;small&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,  &lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;small&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,   &lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;small&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;	  { &lt;span class="CssPropertyName"&gt;padding&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 7&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 4&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; }
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;medium&lt;/span&gt;,        &lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;medium&lt;/span&gt;,         &lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;medium&lt;/span&gt;         { &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;/*&lt;/span&gt; default &lt;span class="Comment"&gt;*/&lt;/span&gt;&lt;/span&gt; }
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;medium&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;, &lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;medium&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,  &lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;medium&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;	{ &lt;span class="CssPropertyName"&gt;padding&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;6&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 10&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 5&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; }
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;large&lt;/span&gt;,         &lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;large&lt;/span&gt;,          &lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;large&lt;/span&gt; 	        { &lt;span class="CssPropertyName"&gt;padding&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;8&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 14&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 9&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; &lt;span class="CssPropertyName"&gt;font-size&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;14&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; }
&lt;span class="CssTagName"&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;large&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,  &lt;span class="CssTagName"&gt;input&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;large&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;,   &lt;span class="CssTagName"&gt;a&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;button&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;awesome&lt;/span&gt;&lt;span class="CssClass"&gt;&lt;span class="CssClass"&gt;.&lt;/span&gt;large&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;:&lt;/span&gt;active&lt;/span&gt;	  { &lt;span class="CssPropertyName"&gt;padding&lt;/span&gt;: &lt;span class="CssAdditionalConstants"&gt;9&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 14&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;&lt;span class="CssAdditionalConstants"&gt; 8&lt;/span&gt;&lt;span class="Keyword"&gt;px&lt;/span&gt;; }
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Turn a &lt;button&gt;button&lt;/button&gt; or a &lt;a href="#"&gt;Link&lt;/a&gt; just by adding the 'awesome button' classes:&lt;/p&gt;

&lt;code language="html"&gt;&lt;pre class="sunburst"&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;button&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;button before&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTagInline"&gt;button&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;&amp;amp;&lt;/span&gt;rarr&lt;span class="Constant"&gt;;&lt;/span&gt;&lt;/span&gt; 
&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;button&lt;/span&gt; &lt;span class="MetaTagInline"&gt;class&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;awesome button&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;button after&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTagInline"&gt;button&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;br&lt;/span&gt; /&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;input&lt;/span&gt; &lt;span class="MetaTagInline"&gt;class&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;awesome button&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="MetaTagInline"&gt;type&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;submit&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="MetaTagInline"&gt;value&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;submit before&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; /&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;&amp;amp;&lt;/span&gt;rarr&lt;span class="Constant"&gt;;&lt;/span&gt;&lt;/span&gt; 
&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;input&lt;/span&gt; &lt;span class="MetaTagInline"&gt;type&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;submit&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="MetaTagInline"&gt;value&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;submit after&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; /&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;br&lt;/span&gt; /&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;a&lt;/span&gt; &lt;span class="MetaTagInline"&gt;href&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;#&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Link before&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTagInline"&gt;a&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;&amp;amp;&lt;/span&gt;rarr&lt;span class="Constant"&gt;;&lt;/span&gt;&lt;/span&gt; 
&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;a&lt;/span&gt; &lt;span class="MetaTagInline"&gt;href&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;#&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="MetaTagInline"&gt;class&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;awesome button&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Link after&lt;span class="MetaTagInline"&gt;&lt;span class="MetaTagInline"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTagInline"&gt;a&lt;/span&gt;&lt;span class="MetaTagInline"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p style="text-align: center"&gt;&lt;button&gt;button before&lt;/button&gt; &amp;rarr;  &lt;button class="awesome medium button"&gt;button after&lt;/button&gt;&lt;br /&gt;
&lt;input type="submit" value="submit before" /&gt; &amp;rarr; &lt;input class="awesome medium button" type="submit" value="submit after" /&gt;&lt;br /&gt;
&lt;a href="#"&gt;Link before&lt;/a&gt; &amp;rarr; &lt;a href="#" class="awesome medium button"&gt;Link after&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Awesome Blueprint Plugin&lt;/h2&gt;

&lt;p&gt;These super awesome buttons play well together with &lt;a href="http://www.blueprintcss.org/" target="_blank"&gt;the blueprint css framework&lt;/a&gt;. Simply &lt;a href="http://github.com/gr2m/awesome-buttons"&gt;get the files from github&lt;/a&gt; and put them in you blueprint/plugins folder. Works awesome.&lt;/p&gt;

&lt;h2&gt;Demo&lt;/h2&gt;

&lt;p&gt;You can find the latest version of the demo in &lt;a href="http://github.com/gr2m/awesome-buttons" target="_blank"&gt;the git repository&lt;/a&gt; or you can open it &lt;a href="http://elccore.s3.amazonaws.com/awesome_buttons/demo.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let us know what you think!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/uPDymMtBJjk" height="1" width="1"/&gt;</description>
      <author>Gregor Martynus</author>
      <pubDate>Fri, 09 Oct 2009 16:24:41 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/uPDymMtBJjk/make-your-buttons-look-super-awesome</link>
      <guid isPermaLink="false">http://elctech.com/snippets/make-your-buttons-look-super-awesome</guid>
    <feedburner:origLink>http://elctech.com/snippets/make-your-buttons-look-super-awesome</feedburner:origLink></item>
    <item>
      <title>grepping the logs with your ears</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;This is a simple obvious idea, but for some reason I had never done it until recently.  My problem, I had a callback that I thought was firing way too often, but I didn't want to grep the logs constantly looking back and forth from the app to the console.  So I took advantage of the OSX 'say' command.&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Entity"&gt;system&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;say &amp;quot;in here&amp;quot;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
Just jam that in the code you want to monitor and listen for the noise.  There are many &lt;a href="http://www.gabrielserafini.com/archives/2008/08/19/mac-os-x-voices-for-using-with-the-say-command/" target="_blank"&gt;voices.&lt;/a&gt;  Also, it can also be a fun easter egg for your teammates by checking git author name and presenting them with a special message... but I would never recommend that :)
&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/iuppw5uddqE" height="1" width="1"/&gt;</description>
      <author>John Eberly</author>
      <pubDate>Thu, 08 Oct 2009 17:45:04 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/iuppw5uddqE/grepping-the-logs-with-your-ears</link>
      <guid isPermaLink="false">http://elctech.com/articles/grepping-the-logs-with-your-ears</guid>
    <feedburner:origLink>http://elctech.com/articles/grepping-the-logs-with-your-ears</feedburner:origLink></item>
    <item>
      <title>Copying files between S3 accounts</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Recently, I had to transfer a all files from one S3 account to another one. Since I didn't like to bother Amazon with my petty problems. I decided to use a ruby script to do it. Here's the script and some steps I took to do it.&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Setup&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;First thing we need to do is to get a list of the buckets we're using. Since each bucket has to be uniquely named, we need to figure out what to name our corresponding buckets in the new S3 account. 
&lt;/p&gt;
&lt;p&gt;
 Start up irb. Time for some digging.
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rubygems&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
=&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
=&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; s3&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(old_aws_id, old_aws_key)
=&amp;gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&amp;lt;rightaws::s3interface:0x1a56490 ...stuff...&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; buckets&lt;span class="Keyword"&gt;=&lt;/span&gt;s3.&lt;span class="Entity"&gt;list_all_my_buckets&lt;/span&gt;.&lt;span class="Entity"&gt;collect&lt;/span&gt;{|&lt;span class="Variable"&gt;b&lt;/span&gt;| b[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;]}
=&amp;gt; [&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old_bucket1&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old_bucket2&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rightaws::&lt;span class="Entity"&gt;s3interface&lt;/span&gt;:&lt;span class="Constant"&gt;0x1a56490&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt; Looks like we have 2 buckets to copy: &lt;strong&gt;old_bucket1&lt;/strong&gt; and &lt;strong&gt;old_bucket2&lt;/strong&gt;. Let's make new buckets for our new account: &lt;strong&gt;new_bucket1&lt;/strong&gt; and &lt;strong&gt;new_bucket2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
Back in console: 
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; s3_new&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(new_aws_id, new_aws_key)
=&amp;gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&amp;lt;rightaws::s3interface:0x1a5649a ...stuff...&amp;gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; s3_new.&lt;span class="Entity"&gt;create_bucket&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;new_bucket1&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;location&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;us&lt;/span&gt;)
=&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; s3_new.&lt;span class="Entity"&gt;create_bucket&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;new_bucket2&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;location&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;us&lt;/span&gt;)
=&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rightaws::&lt;span class="Entity"&gt;s3interface&lt;/span&gt;:&lt;span class="Constant"&gt;0x1a5649a&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;/div&gt;

&lt;div&gt;
&lt;p&gt;
	Now, we need to peek at the ACL settings for the files so we'll know how to modify the permissions for the new bucket. 
&lt;/p&gt;
&lt;p&gt;
	In console:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; key&lt;span class="Keyword"&gt;=&lt;/span&gt;s3.&lt;span class="Entity"&gt;list_all_my_buckets&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;
=&amp;gt; {&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;owner_display_name&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;my.old.name&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;creation_date&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;2009-08-06T23:32:38.000Z&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old_bucket1&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;owner_id&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000001&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
Make note of the old &lt;strong&gt;owner_display_name&lt;/strong&gt; and &lt;strong&gt;owner_id&lt;/strong&gt;: &lt;strong&gt;my.old.name&lt;/strong&gt;, &lt;strong&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000001&lt;/strong&gt;. 
We will need to replace these with our new ones during the process.
&lt;/p&gt;

&lt;p&gt;
Now we get our new owner_id and owner_display_name, the same way.
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; s3_new.&lt;span class="Entity"&gt;list_all_my_buckets&lt;/span&gt;.&lt;span class="Entity"&gt;first&lt;/span&gt;
=&amp;gt; {&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;owner_display_name&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;my.new.name&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;creation_date&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;2009-08-06T23:32:38.000Z&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;new_bucket1&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;owner_id&lt;/span&gt;=&amp;gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000002&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
Here's our new owner_display_name and owner_id: &lt;strong&gt;my.new.name&lt;/strong&gt;, &lt;strong&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000002&lt;/strong&gt;. 
&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt; The Code &lt;/h2&gt;
&lt;div&gt;
&lt;p&gt; Now here's the script to run. I recommend doing this on an EC2 machine, because Amazon won't charge for bandwidth within the EC2 and S3 networks. I also suggest running it on a screen session so you can leave the script alone on the server.&lt;/p&gt; 
&lt;ul&gt;&lt;li&gt;The script will loop through each item in your buckets.&lt;/li&gt; 
	&lt;li&gt;Copy the item over to the new corresponding bucket.&lt;/li&gt;
	&lt;li&gt;Strip out the ACL from the old one and reformat it for the new owner. 
	&lt;li&gt;Update the ACL permissions on the new file.&lt;/li&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;!/usr/bin/ruby&lt;/span&gt;
&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rubygems&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

oldAWS &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(old_aws_id, old_aws_key)
newAWS &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;new_aws_id, new_aws_key)&lt;/span&gt;
&lt;span class="String"&gt;newS3=RightAws::S3.new(new_aws_id, new_aws_key)&lt;/span&gt;
&lt;span class="String"&gt;&lt;/span&gt;
&lt;span class="String"&gt;bucket_mapping={&amp;quot;old_bucket1&amp;quot; =&amp;gt; &amp;quot;new_bucket1&amp;quot;,&lt;/span&gt;
&lt;span class="String"&gt;&amp;quot;old_bucket2&amp;quot; =&amp;gt; &amp;quot;new_bucket2&amp;quot;&lt;/span&gt;
&lt;span class="String"&gt;}&lt;/span&gt;
&lt;span class="String"&gt;&lt;/span&gt;
&lt;span class="String"&gt;# ACL property differences&lt;/span&gt;
&lt;span class="String"&gt;old_owner_id=&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000001&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;new_owner_id=&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000002&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;&lt;/span&gt;
&lt;span class="String"&gt;old_disp_name=&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;my.&lt;span class="Entity"&gt;old&lt;/span&gt;.&lt;span class="Entity"&gt;name&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;new_disp_name=&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;my.&lt;span class="Entity"&gt;new&lt;/span&gt;.&lt;span class="Entity"&gt;name&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;&lt;/span&gt;
&lt;span class="String"&gt;bucket_mapping.each do |old_bucket, new_bucket|&lt;/span&gt;
&lt;span class="String"&gt;  # get all keys for old bucket by looping through sets of max keys (1000) amazon gives&lt;/span&gt;
&lt;span class="String"&gt;  newS3Bucket=newS3.bucket(new_bucket)&lt;/span&gt;
&lt;span class="String"&gt;  oldAWS.incrementally_list_bucket(old_bucket) do |key_set|&lt;/span&gt;
&lt;span class="String"&gt;    # loop through content of key_set which contains keys&lt;/span&gt;
&lt;span class="String"&gt;    key_set[:contents].each do |key|&lt;/span&gt;
&lt;span class="String"&gt;      # if key already exists, don&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;t copy over
      &lt;span class="Keyword"&gt;if&lt;/span&gt; newS3Bucket.&lt;span class="Entity"&gt;key&lt;/span&gt;(key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;]).&lt;span class="Entity"&gt;exists?&lt;/span&gt;
        puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;new_bucket&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;key&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;key&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; already exists. Skipping...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class="Keyword"&gt;else&lt;/span&gt;
&lt;span class="Comment"&gt;        &lt;span class="Comment"&gt;#&lt;/span&gt; download data and header from old bucket&lt;/span&gt;
        puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Copying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;old_bucket&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;key&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;key&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
        &lt;span class="Keyword"&gt;begin&lt;/span&gt;
          data&lt;span class="Keyword"&gt;=&lt;/span&gt;oldAWS.&lt;span class="Entity"&gt;get_object&lt;/span&gt;(old_bucket,key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;])
        &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
          puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot download, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
          &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
     
        retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
        &lt;span class="Keyword"&gt;begin&lt;/span&gt;
          headers&lt;span class="Keyword"&gt;=&lt;/span&gt;oldAWS.&lt;span class="Entity"&gt;head&lt;/span&gt;(old_bucket,key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;])
        &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
          puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot get header, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
          &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
        &lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Comment"&gt;        &lt;span class="Comment"&gt;#&lt;/span&gt; upload key to bucket&lt;/span&gt;
        puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Putting to &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;new_bucket&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;key&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;key&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
        &lt;span class="Keyword"&gt;begin&lt;/span&gt;
          newAWS.&lt;span class="Entity"&gt;put&lt;/span&gt;(new_bucket, key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;], data, headers)
        &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
          puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot put object, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
          &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
        &lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Comment"&gt;        &lt;span class="Comment"&gt;#&lt;/span&gt; copy permissions to new Bucket&lt;/span&gt;
        retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
        &lt;span class="Keyword"&gt;begin&lt;/span&gt;
          acl_prop&lt;span class="Keyword"&gt;=&lt;/span&gt;oldAWS.&lt;span class="Entity"&gt;get_acl&lt;/span&gt;(old_bucket, key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;])
        &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
          puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot get ACL, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
          &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
     
&lt;span class="Comment"&gt;        &lt;span class="Comment"&gt;#&lt;/span&gt; Replace Owner ID and Display name for new bucket&lt;/span&gt;
        puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old ACL &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;acl_prop&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;object&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        acl_prop[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;object&lt;/span&gt;].&lt;span class="Entity"&gt;gsub!&lt;/span&gt;(old_owner_id,new_owner_id)
        acl_prop[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;object&lt;/span&gt;].&lt;span class="Entity"&gt;gsub!&lt;/span&gt;(old_disp_name,new_disp_name)
        puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;new ACL &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;acl_prop&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;object&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
   
        puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;changing ACL&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
     
        retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
        &lt;span class="Keyword"&gt;begin&lt;/span&gt;
          newAWS.&lt;span class="Entity"&gt;put_acl&lt;/span&gt;(new_bucket, key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;], acl_prop[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;object&lt;/span&gt;])
        &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
          puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot update ACL, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
          &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
      &lt;span class="Keyword"&gt;end&lt;/span&gt;
     
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt; That's basically all there is to it. If you want to do a check if all the files are there, use &lt;a href="http://www.elctech.com/snippets/counting-total-number-of-objects-in-s3"&gt;this script&lt;/a&gt;. Now I'm going to explain each part of the script. So you probably don't want to stay for this part. &lt;/p&gt;

&lt;h2&gt; Breakdown &lt;/h2&gt;
&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;!/usr/bin/ruby&lt;/span&gt;
&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rubygems&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

oldAWS &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(old_aws_id, old_aws_key)
newAWS &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;new_aws_id, new_aws_key)&lt;/span&gt;
&lt;span class="String"&gt;newS3=RightAws::S3.new(new_aws_id, new_aws_key)&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Initialize connections to S3. I used RightAws::S3 object to able to access the bucket individually.
&lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;bucket_mapping&lt;span class="Keyword"&gt;=&lt;/span&gt;{&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old_bucket1&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;new_bucket1&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,
&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old_bucket2&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;new_bucket2&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Map the old buckets to the new corresponding ones.&lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;old_owner_id&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000001&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
new_owner_id&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;123abcdefghijklmnoprxyz45600000000000000000000000000000000000002&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

old_disp_name&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;my.old.name&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
new_disp_name&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;my.new.name&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Store the ACL credentials for the old and new accounts. &lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;bucket_mapping.&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;old_bucket&lt;/span&gt;, &lt;span class="Variable"&gt;new_bucket&lt;/span&gt;|
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; get all keys for old bucket by looping through sets of max keys (1000) amazon gives&lt;/span&gt;
  newS3Bucket&lt;span class="Keyword"&gt;=&lt;/span&gt;newS3.&lt;span class="Entity"&gt;bucket&lt;/span&gt;(new_bucket)
	...
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;We loop through each of the buckets in our hash, grab the new corresponding bucket&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  oldAWS.&lt;span class="Entity"&gt;incrementally_list_bucket&lt;/span&gt;(old_bucket) &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;key_set&lt;/span&gt;|
    key_set[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;contents&lt;/span&gt;].&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;key&lt;/span&gt;|
	...
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Since Amazon only lets you get 1000 keys max at one time, we use right_aws's incrementally_list_bucket method to get eventually loop through all the keys in that bucket. Then we loop through each set of keys. &lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;	  &lt;span class="Keyword"&gt;if&lt;/span&gt; newS3Bucket.&lt;span class="Entity"&gt;key&lt;/span&gt;(key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;]).&lt;span class="Entity"&gt;exists?&lt;/span&gt;
	    puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;new_bucket&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;key&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;key&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; already exists. Skipping...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
	  &lt;span class="Keyword"&gt;else&lt;/span&gt;
&lt;span class="Comment"&gt;	    &lt;span class="Comment"&gt;#&lt;/span&gt; download data and header from old bucket&lt;/span&gt;
	    puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Copying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;old_bucket&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;key&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;key&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
	    retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
	    &lt;span class="Keyword"&gt;begin&lt;/span&gt;
	      data&lt;span class="Keyword"&gt;=&lt;/span&gt;oldAWS.&lt;span class="Entity"&gt;get_object&lt;/span&gt;(old_bucket,key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;])
	    &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
	      puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot download, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
	      retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
	      &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
	    &lt;span class="Keyword"&gt;end&lt;/span&gt;

	    retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
	    &lt;span class="Keyword"&gt;begin&lt;/span&gt;
	      headers&lt;span class="Keyword"&gt;=&lt;/span&gt;oldAWS.&lt;span class="Entity"&gt;head&lt;/span&gt;(old_bucket,key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;])
	    &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
	      puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot get header, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
	      retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
	      &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
	    &lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Comment"&gt;	    &lt;span class="Comment"&gt;#&lt;/span&gt; upload key to bucket&lt;/span&gt;
	    puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Putting to &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;new_bucket&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;key&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;key&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
	    retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
	    &lt;span class="Keyword"&gt;begin&lt;/span&gt;
	      newAWS.&lt;span class="Entity"&gt;put&lt;/span&gt;(new_bucket, key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;], data, headers)
	    &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
	      puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot put object, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
	      retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
	      &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
	    &lt;span class="Keyword"&gt;end&lt;/span&gt;
	...
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Now, we only copy over the file if it's not there, and we copy over the header from the old file to the new one. &lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;       retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
       &lt;span class="Keyword"&gt;begin&lt;/span&gt;
         acl_prop&lt;span class="Keyword"&gt;=&lt;/span&gt;oldAWS.&lt;span class="Entity"&gt;get_acl&lt;/span&gt;(old_bucket, key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;])
       &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
         puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot get ACL, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
         retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
         &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
       &lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Comment"&gt;       &lt;span class="Comment"&gt;#&lt;/span&gt; Replace Owner ID and Display name for new bucket&lt;/span&gt;
       puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;old ACL &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;acl_prop&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;object&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
       acl_prop[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;object&lt;/span&gt;].&lt;span class="Entity"&gt;gsub!&lt;/span&gt;(old_owner_id,new_owner_id)
       acl_prop[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;object&lt;/span&gt;].&lt;span class="Entity"&gt;gsub!&lt;/span&gt;(old_disp_name,new_disp_name)
       puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;new ACL &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;acl_prop&lt;span class="StringEmbeddedSource"&gt;[&lt;/span&gt;&lt;span class="StringConstant"&gt;&lt;span class="StringConstant"&gt;:&lt;/span&gt;object&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;]&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

       puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;changing ACL&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

       retries&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;
       &lt;span class="Keyword"&gt;begin&lt;/span&gt;
         newAWS.&lt;span class="Entity"&gt;put_acl&lt;/span&gt;(new_bucket, key[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;key&lt;/span&gt;], acl_prop[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;object&lt;/span&gt;])
       &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Exception&lt;/span&gt; =&amp;gt; e
         puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;cannot update ACL, &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;e&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;retrying &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;retries&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; out of 10 times...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
         retries &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
         &lt;span class="Keyword"&gt;retry&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; retries &lt;span class="Keyword"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="Constant"&gt;10&lt;/span&gt;
       &lt;span class="Keyword"&gt;end&lt;/span&gt;
...
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Finally, we get the old ACL, which is an XML file. We then gsub the old values with the new values and replace the new file's ACL.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Wash, rinse, repeat.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/sfS-LVPm9tc" height="1" width="1"/&gt;</description>
      <author>Alex Chee</author>
      <pubDate>Thu, 08 Oct 2009 01:42:52 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/sfS-LVPm9tc/copying-files-between-s3-accounts</link>
      <guid isPermaLink="false">http://elctech.com/tutorials/copying-files-between-s3-accounts</guid>
    <feedburner:origLink>http://elctech.com/tutorials/copying-files-between-s3-accounts</feedburner:origLink></item>
    <item>
      <title>RightSignature Wins VentureNet "Best of Show"</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Daryl Bernstein, CEO of RightSignature, presented at VentureNet in Los Angeles today and won "Best of Show" for 2009. This follows another win by RightScale in 2007. ELC Technologies continues to launch cutting edge products on the web.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/faXHPWoV7HI" height="1" width="1"/&gt;</description>
      <author>ELC</author>
      <pubDate>Thu, 08 Oct 2009 00:44:03 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/faXHPWoV7HI/rightsignature-wins-venturenet-best-of-show</link>
      <guid isPermaLink="false">http://elctech.com/articles/rightsignature-wins-venturenet-best-of-show</guid>
    <feedburner:origLink>http://elctech.com/articles/rightsignature-wins-venturenet-best-of-show</feedburner:origLink></item>
    <item>
      <title>[Solved] RightScale CentOS 5.0 Rails 2.3.4 upgrade </title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Here's the issue:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem install rails &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;ri &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;rdoc &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;version&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;2.3&lt;/span&gt;.&lt;span class="Constant"&gt;4&lt;/span&gt;
&lt;span class="Variable"&gt;ERROR&lt;/span&gt;:  could &lt;span class="Keyword"&gt;not&lt;/span&gt; find gem rails locally &lt;span class="Keyword"&gt;or&lt;/span&gt; &lt;span class="Keyword"&gt;in&lt;/span&gt; a repository
&lt;/pre&gt;&lt;/code&gt;
&lt;h2&gt;Huh?&lt;/h2&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] gem &lt;span class="Keyword"&gt;-&lt;/span&gt;v
&lt;span class="Constant"&gt;1.2&lt;/span&gt;.&lt;span class="Constant"&gt;0&lt;/span&gt;
[prompt] cat &lt;span class="Keyword"&gt;/&lt;/span&gt;etc&lt;span class="Keyword"&gt;/&lt;/span&gt;issue
&lt;span class="Variable"&gt;CentOS&lt;/span&gt; release &lt;span class="Constant"&gt;5.0&lt;/span&gt; (&lt;span class="Variable"&gt;Final&lt;/span&gt;)
&lt;span class="Variable"&gt;Kernel&lt;/span&gt; \r on an \m
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;OK--no problems. Let's look at the gem sources...&lt;/p&gt; 
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem sources
&lt;span class="Keyword"&gt;**&lt;/span&gt;&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Variable"&gt;CURRENT&lt;/span&gt; &lt;span class="Variable"&gt;SOURCES&lt;/span&gt; &lt;span class="Keyword"&gt;**&lt;/span&gt;&lt;span class="Keyword"&gt;*&lt;/span&gt;

http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;mirror.&lt;span class="Entity"&gt;rightscale&lt;/span&gt;.&lt;span class="Entity"&gt;com&lt;/span&gt;
http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;gems.&lt;span class="Entity"&gt;github&lt;/span&gt;.com
&lt;/pre&gt;&lt;/code&gt;
&lt;h2&gt;RightScale's gem mirror is stale!&lt;/h2&gt;
&lt;p&gt;So let's add rubyforge too...&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem sources &lt;span class="Keyword"&gt;-&lt;/span&gt;a http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;gems.&lt;span class="Entity"&gt;rubyforge&lt;/span&gt;.&lt;span class="Entity"&gt;org&lt;/span&gt;
http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;gems.&lt;span class="Entity"&gt;rubyforge&lt;/span&gt;.&lt;span class="Entity"&gt;org&lt;/span&gt; added to sources
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;And then update our gems en masse:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem update
&lt;span class="Variable"&gt;Updating&lt;/span&gt; installed gems
&lt;span class="Variable"&gt;Updating&lt;/span&gt; &lt;span class="Variable"&gt;RedCloth&lt;/span&gt;
&lt;span class="Variable"&gt;Building&lt;/span&gt; native extensions.  &lt;span class="Variable"&gt;This&lt;/span&gt; could take a &lt;span class="Keyword"&gt;while&lt;/span&gt;...
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed &lt;span class="Variable"&gt;RedCloth&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;4.2&lt;/span&gt;.&lt;span class="Constant"&gt;2&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; &lt;span class="Variable"&gt;RubyInline&lt;/span&gt;
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed &lt;span class="Variable"&gt;RubyInline&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;3.8&lt;/span&gt;.&lt;span class="Constant"&gt;3&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; &lt;span class="Variable"&gt;ZenTest&lt;/span&gt;
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed &lt;span class="Variable"&gt;ZenTest&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;4.1&lt;/span&gt;.&lt;span class="Constant"&gt;4&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; erubis
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed erubis&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2.6&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; eventmachine
&lt;span class="Variable"&gt;Building&lt;/span&gt; native extensions.  &lt;span class="Variable"&gt;This&lt;/span&gt; could take a &lt;span class="Keyword"&gt;while&lt;/span&gt;...
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed eventmachine&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;0.12&lt;/span&gt;.&lt;span class="Constant"&gt;8&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; highline
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed highline&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.5&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; hoe
&lt;span class="Variable"&gt;ERROR&lt;/span&gt;:  &lt;span class="Variable"&gt;While&lt;/span&gt; executing gem ... (&lt;span class="Support"&gt;Gem&lt;/span&gt;::&lt;span class="Entity"&gt;InstallError&lt;/span&gt;)
    hoe requires &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; version &lt;span class="Keyword"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;h2&gt;Our RubyGems is too old, but upgrading gives us:&lt;/h2&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem update &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;system
&lt;span class="Variable"&gt;Updating&lt;/span&gt; &lt;span class="Variable"&gt;RubyGems&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Variable"&gt;ERROR&lt;/span&gt;:  &lt;span class="Variable"&gt;While&lt;/span&gt; executing gem ... (&lt;span class="Variable"&gt;NameError&lt;/span&gt;)
    undefined local variable &lt;span class="Keyword"&gt;or&lt;/span&gt; method &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;remote_gemspecs' for #&amp;lt;gem::commands::updatecommand:0xb776f4f0&amp;gt;&lt;/span&gt;
&lt;span class="String"&gt;&amp;lt;/gem::commands::updatecommand:0xb776f4f0&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Ouch! Let's try the rubygems update helper:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem install rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Constant"&gt;1&lt;/span&gt; gem installed
&lt;span class="Variable"&gt;Installing&lt;/span&gt; ri documentation &lt;span class="Keyword"&gt;for&lt;/span&gt; rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;...
&lt;span class="Variable"&gt;Installing&lt;/span&gt; &lt;span class="Variable"&gt;RDoc&lt;/span&gt; documentation &lt;span class="Keyword"&gt;for&lt;/span&gt; rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;...

[prompt] sudo update_rubygems
&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;578&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;report_activate_error': Could not find RubyGem builder (&amp;gt;= 0) (Gem::LoadError)&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:134:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:158:in `activate&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;157&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;each'&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:157:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:49:in `gem&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;update_rubygems:&lt;span class="Constant"&gt;18&lt;/span&gt;
[prompt] sudo gem install builder &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;ri &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;rdoc
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed builder&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2.1&lt;/span&gt;.&lt;span class="Constant"&gt;2&lt;/span&gt;
&lt;span class="Constant"&gt;1&lt;/span&gt; gem installed
[prompt] sudo update_rubygems
&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;578&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;report_activate_error': Could not find RubyGem session (&amp;gt;= 0) (Gem::LoadError)&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:134:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:158:in `activate&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;157&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;each'&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:157:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:49:in `gem&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;update_rubygems:&lt;span class="Constant"&gt;18&lt;/span&gt;
[prompt] sudo gem install session &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;ri &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;rdoc
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed session&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2.4&lt;/span&gt;.&lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="Constant"&gt;1&lt;/span&gt; gem installed
[prompt] sudo update_rubygems
&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;578&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;report_activate_error': Could not find RubyGem hoe-seattlerb (&amp;gt;= 0) (Gem::LoadError)&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:134:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:158:in `activate&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;157&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;each'&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:157:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:49:in `gem&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;update_rubygems:&lt;span class="Constant"&gt;18&lt;/span&gt;
[prompt] sudo gem install hoe&lt;span class="Keyword"&gt;-&lt;/span&gt;seattlerb &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;ri &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;rdoc
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed hoe&lt;span class="Keyword"&gt;-&lt;/span&gt;seattlerb&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.2&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;span class="Constant"&gt;1&lt;/span&gt; gem installed
[prompt] sudo update_rubygems
&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;578&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;report_activate_error': RubyGem version error: hoe(1.8.2 not &amp;gt;= 2.3.3) (Gem::LoadError)&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:134:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:158:in `activate&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;157&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;each'&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:157:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:158:in `activate&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;:&lt;span class="Constant"&gt;157&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;in&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;each'&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:157:in &lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;activate&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="String"&gt;	from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:49:in `gem&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
	from &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;update_rubygems:&lt;span class="Constant"&gt;18&lt;/span&gt;
[prompt] sudo gem install hoe &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;ri &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;rdoc
&lt;span class="Variable"&gt;ERROR&lt;/span&gt;:  &lt;span class="Variable"&gt;Error&lt;/span&gt; installing hoe:
	hoe requires &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; version &lt;span class="Keyword"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;

[prompt] echo &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;lost in a maze of tiny dark passages&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
lost &lt;span class="Keyword"&gt;in&lt;/span&gt; a maze of dark tiny passages
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;So it appears that we can neither satisfy the requirements for installing hoe (need RubyGems &gt;= 1.3.1) nor update rubygems (need hoe &gt;= 2.3.3)... but let's take a deeper look and find &lt;b&gt;the solution&lt;/b&gt;.&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem list
...
rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update (&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;, &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;)
...
&lt;/pre&gt;&lt;/code&gt;
&lt;h2&gt;The Solution:&lt;/h2&gt;&lt;h2&gt;
&lt;/h2&gt;&lt;/div&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem uninstall rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;version&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; uninstalled rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;And now we're unblocked and back on track:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo update_rubygems
&lt;span class="Variable"&gt;Installing&lt;/span&gt; &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;
mkdir &lt;span class="Keyword"&gt;-&lt;/span&gt;p &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;
mkdir &lt;span class="Keyword"&gt;-&lt;/span&gt;p &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;bin
install &lt;span class="Keyword"&gt;-&lt;/span&gt;c &lt;span class="Keyword"&gt;-&lt;/span&gt;m &lt;span class="Constant"&gt;0644&lt;/span&gt; ubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt; &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;ubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;
install &lt;span class="Keyword"&gt;-&lt;/span&gt;c &lt;span class="Keyword"&gt;-&lt;/span&gt;m &lt;span class="Constant"&gt;0644&lt;/span&gt; rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt; &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;site_ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems.&lt;span class="Entity"&gt;rb&lt;/span&gt;
&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;snip&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;
install &lt;span class="Keyword"&gt;-&lt;/span&gt;c &lt;span class="Keyword"&gt;-&lt;/span&gt;m &lt;span class="Constant"&gt;0755&lt;/span&gt; &lt;span class="Keyword"&gt;/&lt;/span&gt;tmp&lt;span class="Keyword"&gt;/&lt;/span&gt;gem &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;gem
rm &lt;span class="Keyword"&gt;/&lt;/span&gt;tmp&lt;span class="Keyword"&gt;/&lt;/span&gt;gem
rm &lt;span class="Keyword"&gt;-&lt;/span&gt;f &lt;span class="Keyword"&gt;/&lt;/span&gt;root&lt;span class="Keyword"&gt;/&lt;/span&gt;.&lt;span class="Entity"&gt;gem&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;source_cache
rm &lt;span class="Keyword"&gt;-&lt;/span&gt;f &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;source_cache
&lt;span class="Variable"&gt;Removing&lt;/span&gt; old &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; &lt;span class="Variable"&gt;RDoc&lt;/span&gt; &lt;span class="Keyword"&gt;and&lt;/span&gt; ri
rm &lt;span class="Keyword"&gt;-&lt;/span&gt;rf &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;doc&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.2&lt;/span&gt;.&lt;span class="Constant"&gt;0&lt;/span&gt;
rm &lt;span class="Keyword"&gt;-&lt;/span&gt;rf &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;doc&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;
&lt;span class="Variable"&gt;Installing&lt;/span&gt; rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt; ri into &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;doc&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;ri
&lt;span class="Variable"&gt;Installing&lt;/span&gt; rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt; rdoc into &lt;span class="Keyword"&gt;/&lt;/span&gt;usr&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;ruby&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;1.8&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;doc&lt;span class="Keyword"&gt;/&lt;/span&gt;rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rdoc

&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;

&lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;Announce&lt;/span&gt;: &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; &lt;span class="Variable"&gt;Release&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;0&lt;/span&gt;

&lt;span class="Variable"&gt;NOTE&lt;/span&gt;:  &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; &lt;span class="Constant"&gt;1.1&lt;/span&gt; &lt;span class="Keyword"&gt;and&lt;/span&gt; &lt;span class="Constant"&gt;1.2&lt;/span&gt; have problems upgrading &lt;span class="Keyword"&gt;when&lt;/span&gt; there is no
rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update installed.  &lt;span class="Variable"&gt;You&lt;/span&gt; will need to follow the second set of update
instructions &lt;span class="Keyword"&gt;if&lt;/span&gt; you see &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Nothing to update&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.

&lt;span class="Variable"&gt;Release&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;0&lt;/span&gt; fixes some bugs.

&lt;span class="Variable"&gt;Bugs&lt;/span&gt; fixed:

&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Variable"&gt;Disregard&lt;/span&gt; ownership of &lt;span class="Keyword"&gt;~&lt;/span&gt; under &lt;span class="Variable"&gt;Windows&lt;/span&gt; &lt;span class="Keyword"&gt;while&lt;/span&gt; creating &lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;.gem.  Fixes&lt;/span&gt;
&lt;span class="StringRegexp"&gt;  issues related to no uid support under Windows.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;* Fix requires for Gem::inflate, Gem::deflate, etc.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;* Make Gem.dir respect :gemhome value from config.  &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;(&lt;/span&gt;Note: this feature may be&lt;/span&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;  removed since it is hard to implement on 1.9.&lt;span class="StringRegexp"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;* Kernel methods are now private.  Patch #20801 by Stefan Rusterholz.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;* Gem::location_of_caller now behaves on Windows.  Patch by Daniel Berger.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;* Silence PATH warning.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;Deprecation Notices:&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;* Gem::manage_gems will be removed on or after March 2009.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;For a full list of changes to RubyGems and the contributor for each change, see&lt;/span&gt;
&lt;span class="StringRegexp"&gt;the ChangeLog file.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;Special thanks to Chad Wooley for backwards compatibility testing and Luis&lt;/span&gt;
&lt;span class="StringRegexp"&gt;Lavena for continuing windows support.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;== How can I get RubyGems?&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;NOTE:  If you have installed RubyGems using a package system you may want to&lt;/span&gt;
&lt;span class="StringRegexp"&gt;install a new RubyGems through the same packaging system.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;If you have a recent version of RubyGems &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;(&lt;/span&gt;0.8.5 or later&lt;span class="StringRegexp"&gt;)&lt;/span&gt;&lt;/span&gt;, then all&lt;/span&gt;
&lt;span class="StringRegexp"&gt;you need to do is:&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;  $ gem update --system   &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;(&lt;/span&gt;you might need to be admin/root&lt;span class="StringRegexp"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;NOTE:  RubyGems 1.1 and 1.2 have problems upgrading when there is no&lt;/span&gt;
&lt;span class="StringRegexp"&gt;rubygems-update installed.  You will need to follow the second set of update&lt;/span&gt;
&lt;span class="StringRegexp"&gt;instructions if you see &amp;quot;Nothing to update&amp;quot;.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;NOTE: You may have to run the command twice if you have any previosly&lt;/span&gt;
&lt;span class="StringRegexp"&gt;installed rubygems-update gems.&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;If you have an older version of RubyGems installed, then you can still&lt;/span&gt;
&lt;span class="StringRegexp"&gt;do it in two steps:&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;  $ gem install rubygems-update  &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;(&lt;/span&gt;again, might need to be admin/root&lt;span class="StringRegexp"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;  $ update_rubygems              &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;(&lt;/span&gt;... here too&lt;span class="StringRegexp"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;If you don't have any gems install, there is still the pre-gem&lt;/span&gt;
&lt;span class="StringRegexp"&gt;approach to getting software ... doing it manually:&lt;/span&gt;
&lt;span class="StringRegexp"&gt;&lt;/span&gt;
&lt;span class="StringRegexp"&gt;1. DOWNLOAD FROM: http:&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubyforge.&lt;span class="Entity"&gt;org&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;frs&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;?g&lt;/span&gt;roup_id&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;126&lt;/span&gt;
&lt;span class="Constant"&gt;2&lt;/span&gt;. &lt;span class="Variable"&gt;UNPACK&lt;/span&gt; &lt;span class="Variable"&gt;INTO&lt;/span&gt; &lt;span class="Variable"&gt;A&lt;/span&gt; &lt;span class="Variable"&gt;DIRECTORY&lt;/span&gt; &lt;span class="Variable"&gt;AND&lt;/span&gt; &lt;span class="Variable"&gt;CD&lt;/span&gt; &lt;span class="Variable"&gt;THERE&lt;/span&gt;
&lt;span class="Constant"&gt;3&lt;/span&gt;. &lt;span class="Variable"&gt;INSTALL&lt;/span&gt; &lt;span class="Variable"&gt;WITH&lt;/span&gt;:  ruby setup.&lt;span class="Entity"&gt;rb&lt;/span&gt;  (you may need admin&lt;span class="Keyword"&gt;/&lt;/span&gt;root privilege)

&lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Variable"&gt;To&lt;/span&gt; &lt;span class="Variable"&gt;File&lt;/span&gt; &lt;span class="Variable"&gt;Bugs&lt;/span&gt;

&lt;span class="Variable"&gt;The&lt;/span&gt; &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; bug tracker can be found on &lt;span class="Variable"&gt;RubyForge&lt;/span&gt; at:
http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;rubyforge.&lt;span class="Entity"&gt;org&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;tracker&lt;span class="Keyword"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;?f&lt;/span&gt;unc&lt;span class="Keyword"&gt;=&lt;/span&gt;add&lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt;group_id&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;126&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt;atid&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;575&lt;/span&gt;

&lt;span class="Variable"&gt;When&lt;/span&gt; filing a bug, &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;gem env&lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt; output will be helpful &lt;span class="Keyword"&gt;in&lt;/span&gt; diagnosing the issue.

&lt;span class="Variable"&gt;If&lt;/span&gt; you find a bug where &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; crashes, please provide debug output. &lt;span class="Variable"&gt;You&lt;/span&gt; can
&lt;span class="Keyword"&gt;do &lt;/span&gt;that with &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;gem --debug the_command&lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt;.

&lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Variable"&gt;Thanks&lt;/span&gt;

&lt;span class="Variable"&gt;Keep&lt;/span&gt; those gems coming!

&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt; &lt;span class="Variable"&gt;Jim&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt; &lt;span class="Variable"&gt;Chad&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt; &lt;span class="Variable"&gt;Eric&lt;/span&gt; (&lt;span class="Keyword"&gt;for&lt;/span&gt; the &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; team)


&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;

&lt;span class="Variable"&gt;RubyGems&lt;/span&gt; installed the following executables:
	&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;gem

&lt;span class="Variable"&gt;If&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;`&lt;/span&gt;gem&lt;span class="String"&gt;`&lt;/span&gt;&lt;/span&gt; was installed by a previous &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; installation, you may need
to remove it by hand.
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Now what we were after again? Right--Rails 2.3.4. Let's do some general cleanup:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;[prompt] sudo gem update &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;system
&lt;span class="Variable"&gt;Updating&lt;/span&gt; &lt;span class="Variable"&gt;RubyGems&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed rubygems&lt;span class="Keyword"&gt;-&lt;/span&gt;update&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
:&lt;span class="Constant"&gt;0&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;Warning&lt;/span&gt;: &lt;span class="Support"&gt;Gem&lt;/span&gt;::&lt;span class="Entity"&gt;SourceIndex&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;search support for String patterns is deprecated&lt;/span&gt;
&lt;span class="Variable"&gt;Updating&lt;/span&gt; &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; to &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Variable"&gt;Installing&lt;/span&gt; &lt;span class="Variable"&gt;RubyGems&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt;
&lt;span class="Variable"&gt;RubyGems&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt; installed

&lt;span class="Keyword"&gt;===&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;5&lt;/span&gt; &lt;span class="Keyword"&gt;/&lt;/span&gt; &lt;span class="Constant"&gt;2009&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;07&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;21&lt;/span&gt;

&lt;span class="Variable"&gt;Bug&lt;/span&gt; fixes:

&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Variable"&gt;Fix&lt;/span&gt; use of prerelease gems.
&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Support"&gt;Gem&lt;/span&gt;.&lt;span class="Entity"&gt;bin_path&lt;/span&gt; no longer escapes path with spaces. &lt;span class="Variable"&gt;Bug&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;25935 and #26458.&lt;/span&gt;

&lt;span class="Variable"&gt;Deprecation&lt;/span&gt; &lt;span class="Variable"&gt;Notices&lt;/span&gt;:

&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Variable"&gt;Bulk&lt;/span&gt; index update is no longer supported (the code currently remains, but &lt;span class="Keyword"&gt;not&lt;/span&gt;
  the tests)
&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Support"&gt;Gem&lt;/span&gt;::&lt;span class="Entity"&gt;manage_gems&lt;/span&gt; was removed &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;3&lt;/span&gt;.
&lt;span class="Keyword"&gt;*&lt;/span&gt; &lt;span class="Support"&gt;Time&lt;/span&gt;::&lt;span class="Entity"&gt;today&lt;/span&gt; was removed &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Constant"&gt;1.3&lt;/span&gt;.&lt;span class="Constant"&gt;3&lt;/span&gt;.


&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;

&lt;span class="Variable"&gt;RubyGems&lt;/span&gt; installed the following executables:
	&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;usr&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;bin&lt;span class="Keyword"&gt;/&lt;/span&gt;gem
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;And a full update as well:&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;sudo gem update
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;This completes while reporting one error with Hoe &lt;a href="http://www.cherpec.com/2009/06/hpricot-081-on-ruby-185/" rel="nofollow"&gt;resolvable via this post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;And finally install Rails:&lt;/h2&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;sudo gem install rails &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;rdoc &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;no&lt;span class="Keyword"&gt;-&lt;/span&gt;ri 
&lt;span class="Variable"&gt;Successfully&lt;/span&gt; installed rails&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2.3&lt;/span&gt;.&lt;span class="Constant"&gt;4&lt;/span&gt;
&lt;span class="Constant"&gt;1&lt;/span&gt; gem installed
&lt;/pre&gt;&lt;/code&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/fjnnH-4ZM14" height="1" width="1"/&gt;</description>
      <author>Jonathan Siegel</author>
      <pubDate>Wed, 07 Oct 2009 13:12:15 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/fjnnH-4ZM14/-solved-rightscale-centos-5-0-rails-2-3-4-upgrade</link>
      <guid isPermaLink="false">http://elctech.com/articles/-solved-rightscale-centos-5-0-rails-2-3-4-upgrade</guid>
    <feedburner:origLink>http://elctech.com/articles/-solved-rightscale-centos-5-0-rails-2-3-4-upgrade</feedburner:origLink></item>
    <item>
      <title>Ruby Daemons and Angels</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;
  Unix is pretty good at managing processes. Fork is a simple yet powerful means of achieving parallelism for workloads that are reasonably well self-contained.
&lt;/p&gt;
&lt;p&gt;
Ryan Tomayko just published an &lt;a href="http://tomayko.com/writings/unicorn-is-unix" target="_blank"&gt;awesome overview of the technology and philosophy of Unicorn&lt;/a&gt;, where the *nix kernel and process management is put to very good use. A very good read, highly recommended! In addition to that, the &lt;a href="http://unicorn.bogomips.org/" target="_blank"&gt;Unicorn&lt;/a&gt; sources are a treasure trove of good ruby code applied to POSIX programming.
&lt;/p&gt;
&lt;p&gt;
  The web application development racket has a higher tier where the load can be so insane that the standard "receive request, process it, format a reply and send it back" just doesn't cut it. I/O contention, traffic spikes and subsystem failures becomes the real hurdle for a successful website. As all human-machine interaction studies show, &lt;strong&gt;latency&lt;/strong&gt; is one of the top characteristics of a successful software. Quick and accurate feedback to users is paramount to communicate solidity and high quality.
&lt;/p&gt;
&lt;p&gt;
  At ELC, we're ever more often confronted with helping clients and partners to provide not only applications with all the needed features, but also to help cope with some crazy workloads.
&lt;/p&gt;

&lt;p&gt;
  As many others, we often enough look to queues and asynchronous workers for help. Instead of processing a request right off the HAProxy plate, we throw it off to a queue where a battery of worker processes will take care of the real work. This allows the app server(s) to respond quickly and provide that stern look in the eyes of the user, saying "Trust us, you're request is in good hands."&lt;br /&gt;
  :)
&lt;/p&gt;

&lt;h2&gt;Queues and workers &lt;/h2&gt;
&lt;p&gt;
  Queues is a big topic. Very interesting, go google it. Today I want to talk about the other, often neglected part: the workers.
&lt;/p&gt;
&lt;p&gt;
  When decoupling the web tier from the processing tier you often end up with code that all in all is pretty simple and straightforward. Throwing together a worker script is pretty easy, especially if you already have a working version of it to steal bits and pieces from.
&lt;/p&gt;
&lt;p&gt;
  The pesky thing about workers is that they run headless and they must somehow be monitored. Process monitoring is also a big topic I'm not going to spend time on. What I do want to talk about is how important it is not to underestimate the difficulty of writing a decent worker, and to realize how your focus should probably be on making it debuggable, introspectable and as a good Unix citizen as possible.
&lt;/p&gt;

&lt;/div&gt;

&lt;h2&gt;Daemon Kit&lt;/h2&gt;
&lt;p&gt;
  Cron and script/runner is a useful combo for some kinds of asynchronous worker, but the issues that can arise are many. Each time your job runs it has to instantiate a full Rails stack and open up all the IO channels needed. Lot of fat there.
&lt;/p&gt;
&lt;p&gt;
  Plain ruby scripts and the Daemon class is somewhat better and given the knowledge it's possible to write awesome daemons where your workers can live and thrive. It &lt;strong&gt;does&lt;/strong&gt; take a lot of knowledge and fiddling to get it right though.
&lt;/p&gt;
&lt;p&gt;
  Enter &lt;a href="http://github.com/kennethkalmer/daemon-kit"&gt;Daemon Kit&lt;/a&gt; by &lt;a href="http://www.opensourcery.co.za/"&gt;Kenneth Kalmer&lt;/a&gt;. Tired of reinventing the wheel he wrote a collection of libraries and generators to facilitate the lives of daemon summoners like yourselves.
&lt;/p&gt;
&lt;p&gt;
  Go get it!
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;gem install kennethkalmer&lt;span class="Keyword"&gt;-&lt;/span&gt;daemon&lt;span class="Keyword"&gt;-&lt;/span&gt;kit &lt;span class="Keyword"&gt;-&lt;/span&gt;s http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;gems.&lt;span class="Entity"&gt;github&lt;/span&gt;.com
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  What follows is an example daemon built with daemon-kit, but with an additional twist inspired by the unicorn project: spawn a configurable number of workers to attack your workload in parallel. We're going to start with a standard daemon-kit daemon and see how easy it is to extend to fit you own needs.
&lt;/p&gt;
&lt;h2&gt;Step one: Generate a daemon&lt;/h2&gt;
&lt;p&gt;
  Easy as pie. Run:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;$ daemon&lt;span class="Keyword"&gt;-&lt;/span&gt;kit foff
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  A bunch of files are generated. Open the foff/ directory in your IDE and have a look around. You'll find a bunch of useful readme files in the various subdirs, pointing you in the right direction.
&lt;/p&gt;

&lt;h2&gt;Step two: command line options&lt;/h2&gt;
&lt;p&gt;
  We need to be able to pass in the number of worker processes to start. Open config/arguments.rb. Add the following:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;options&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;worker_count&lt;/span&gt;] &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Default&lt;/span&gt;
  opts.&lt;span class="Entity"&gt;on&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;-w&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;--workers WORKER_COUNT&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Number of worker processes to spawn&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;worker_count&lt;/span&gt;|
    &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;options&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;worker_count&lt;/span&gt;] &lt;span class="Keyword"&gt;=&lt;/span&gt; worker_count.&lt;span class="Entity"&gt;to_i&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
Try your daemon!  
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  $ bin&lt;span class="Keyword"&gt;/&lt;/span&gt;foff
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  See that? Already up and running.
&lt;/p&gt;

&lt;h2&gt;Step three: Signals&amp;traps&lt;/h2&gt;
&lt;p&gt;
  Let's move on. Open libexec/foff-daemon.rb. You'll find a configuration block that is executed once the daemon is initialized but before the workers arrives to the plant. Here's where we'll set up our traps to catch the signals.
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Support"&gt;DaemonKit&lt;/span&gt;::&lt;span class="Entity"&gt;Application&lt;/span&gt;.&lt;span class="Entity"&gt;running!&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;config&lt;/span&gt;|
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  Signals? Signals is another big topic I'm in no way competent to speak in depth about. For now, suffice to say that you want to make sure that when you stop your daemon you send it a signal, usually the INT signal. There are several interesting signals you can send your processes and when properly implemented they allow the user to do many nice things. Check out nginx or Unicorn for examples of good signal processing.
&lt;/p&gt;
  &lt;p&gt;When your daemon goes down, the workers probably need time to finish up what they were doing. If you don't do this carefully, one Ctrl + C later you might just have interrupted a recurring billing worker just after it sent off a request to the inventory dudes but before billing the client. Don't go there.
&lt;/p&gt;
&lt;p&gt;
   For now just trust that mr Kalmer knows what he's doing and add:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; encoding: utf-8&lt;/span&gt;
  
&lt;span class="Support"&gt;DaemonKit&lt;/span&gt;::&lt;span class="Entity"&gt;Application&lt;/span&gt;.&lt;span class="Entity"&gt;running!&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;config&lt;/span&gt;|
  config.&lt;span class="Entity"&gt;trap&lt;/span&gt;( &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;INT&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; ) &lt;span class="Keyword"&gt;do&lt;/span&gt;
    &lt;span class="Support"&gt;DaemonKit&lt;/span&gt;.&lt;span class="Entity"&gt;logger&lt;/span&gt;.&lt;span class="Entity"&gt;info&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;INT  &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Process&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;ppid&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &amp;gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Process&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;pid&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; GOING DOWN. WORKERS: &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;WORKERS&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;keys&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class="Variable"&gt;WORKERS&lt;/span&gt;.&lt;span class="Entity"&gt;each_pair&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;pid&lt;/span&gt;, &lt;span class="Variable"&gt;foff&lt;/span&gt;|
      &lt;span class="Support"&gt;DaemonKit&lt;/span&gt;.&lt;span class="Entity"&gt;logger&lt;/span&gt;.&lt;span class="Entity"&gt;info&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;Notifying child process &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;pid&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; it's time to go.&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class="Entity"&gt;kill_worker&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;QUIT&lt;/span&gt;, pid)
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
    &lt;span class="Support"&gt;Process&lt;/span&gt;.&lt;span class="Entity"&gt;waitall&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  The above code intercepts the INT signal, logs a message and then tells each of your running workers to stop gracefully (using the QUIT signal). The last line, Process.waitall, makes the master daemon process wait for all children (your workers) to finish.
&lt;/p&gt;
&lt;p&gt;
  This is example code and the above is not enough for production use. If an error occurs inside your trap block, the INT signal will go unheeded, or worse, the master will die but the worker process will steam on uncontrolled. You need to add all kinds of checks. For instance, what happens if evil Eve just issued a kill -9 to one of your worker processes, leaving your master daemon with a dangling worker. Tread carefully.
&lt;/p&gt;

&lt;h2&gt;Step four: GO KILL THAT DAEMON&lt;/h2&gt;
&lt;p&gt;
  Next up is the kill_worker method. Plain and simple (and stolen from the awesome &lt;a href="http://unicorn.bogomips.org/" target="_blank"&gt;Unicorn&lt;/a&gt; sources):
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; Delivers a signal to a worker and fails gracefully if the worker&lt;/span&gt;
&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; is no longer running.&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;kill_worker&lt;/span&gt;(&lt;span class="Variable"&gt;signal&lt;span class="Variable"&gt;,&lt;/span&gt; wpid&lt;/span&gt;)
    &lt;span class="Keyword"&gt;begin&lt;/span&gt;
      &lt;span class="Support"&gt;Process&lt;/span&gt;.&lt;span class="Entity"&gt;kill&lt;/span&gt;(signal, wpid)
    &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Support"&gt;Errno&lt;/span&gt;::&lt;span class="Entity"&gt;ESRCH&lt;/span&gt;
      worker &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;WORKERS&lt;/span&gt;.&lt;span class="Entity"&gt;delete&lt;/span&gt;(wpid) &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Constant"&gt;nil&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  "Errno::ESRCH"?!? I bet that's obvious to Matz, but to me it's even hard to read... It's good I don't need to know &lt;i&gt;exactly&lt;/i&gt; what that part does. So, kill_worker signals the worker with PID wpid and if Eve already killed it (or, it died by itself) we stop trying to deal with it and move on.
&lt;/p&gt;

&lt;h2&gt;Step five: Trapping workers on a fork&lt;/h2&gt;
&lt;p&gt;
  Now let's set up the workers. I choose to put that in its own method, fork_and_trap:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; Fork, listen for QUIT signals and run()&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;fork_and_trap&lt;/span&gt;(&lt;span class="Variable"&gt;wrkr&lt;/span&gt;)
    fork &lt;span class="Keyword"&gt;do&lt;/span&gt;
      &lt;span class="Entity"&gt;trap&lt;/span&gt;(&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;QUIT&lt;/span&gt;) &lt;span class="Keyword"&gt;do &lt;/span&gt;
        wrkr.&lt;span class="Entity"&gt;stopit!&lt;/span&gt;
        wrkr.&lt;span class="Entity"&gt;log&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;aawwwright, time for a break. Hang on, lemme finish up...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class="Keyword"&gt;end&lt;/span&gt;

      wrkr.&lt;span class="Entity"&gt;run&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  Given a worker instance ("wrkr"), we fork() and setup the "listener" for the QUIT signal that we just setup above. The master daemon, when receiving an INT, will send QUIT to all known workers which in turn will run worker specific cleanup code, the #stopit! method in our case, and gracefully exit.&lt;br /&gt;
  We also call the #run method on the worker and off he goes!
&lt;/p&gt;

&lt;h2&gt;Step six: do it already!&lt;/h2&gt;
&lt;p&gt;
  The final piece is the actual worker spawning and accountant code. Again, there are probably a lot of pieces missing, but it boils down to:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; ===========================&lt;/span&gt;
&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; = Set up and fork workers =&lt;/span&gt;
&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; ===========================&lt;/span&gt;
&lt;span class="Variable"&gt;WORKERS&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; {}

(&lt;span class="Constant"&gt;0&lt;/span&gt;...&lt;span class="Support"&gt;DaemonKit&lt;/span&gt;.&lt;span class="Entity"&gt;arguments&lt;/span&gt;.&lt;span class="Entity"&gt;options&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;worker_count&lt;/span&gt;]).&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;
  foff &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Foff&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
  &lt;span class="Variable"&gt;WORKERS&lt;/span&gt;[ &lt;span class="Entity"&gt;fork_and_trap&lt;/span&gt;(foff) ] &lt;span class="Keyword"&gt;=&lt;/span&gt; foff
&lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Support"&gt;DaemonKit&lt;/span&gt;.&lt;span class="Entity"&gt;logger&lt;/span&gt;.&lt;span class="Entity"&gt;info&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;PIDs: &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;WORKERS&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;keys&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;inspect&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="Support"&gt;Process&lt;/span&gt;.waitall
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  Remember the first step, when we set up the arguments processing? We can access the value passed from the command line in the DaemonKit.arguments.options collection. If we launched with:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  $ bin&lt;span class="Keyword"&gt;/&lt;/span&gt;foff &lt;span class="Keyword"&gt;-&lt;/span&gt;w &lt;span class="Constant"&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  we'll spawn 12 worker processes and the master daemon can keep tabs on them in the WORKER constant, where the PIDs are keys and the values are the now running workers.
&lt;/p&gt;
&lt;p&gt;
  We finish up with a call to Process.waitall so the master daemon doesn't exit.
&lt;/p&gt;
&lt;h2&gt;Step seven: the Working Class&lt;/h2&gt;
&lt;p&gt;
  The worker class is of course where all the meat is going. For this article I just cooked up a barebones worker that executes 5 steps and sleeps for 1 or 2 seconds for each step. The "steps" are application specific, something like "1. Pull from inventory", "2. Call mum", "3. Tell FedEx to pick up the stuff", "4. Bill client". At the completion of each work unit we check if we have received a QUIT in the meantime. If so, exit the loop.
&lt;/p&gt;
&lt;p&gt;
  Put the following in lib/foff.rb
&lt;/p&gt;

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; encoding: utf-8&lt;/span&gt;

  &lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="JEntityNameType"&gt;Foff&lt;/span&gt;
    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;log&lt;/span&gt;(&lt;span class="Variable"&gt;msg&lt;/span&gt;)
      (&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;logger&lt;/span&gt; &lt;span class="Keyword"&gt;||=&lt;/span&gt; &lt;span class="Support"&gt;DaemonKit&lt;/span&gt;.&lt;span class="Entity"&gt;logger&lt;/span&gt;).&lt;span class="Entity"&gt;info&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Process&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;ppid&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &amp;gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Process&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;pid&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;msg&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;

    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;stopit!&lt;/span&gt;
      &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;shutting_down&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;

    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;shutting_down?&lt;/span&gt;
      &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;shutting_down&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;

    &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;run&lt;/span&gt;
      &lt;span class="Keyword"&gt;loop&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;
        log &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;START @ &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Time&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;now&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        (&lt;span class="Constant"&gt;0&lt;/span&gt;..&lt;span class="Constant"&gt;5&lt;/span&gt;).&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;step&lt;/span&gt;|
          log &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;workee workee at step &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;step&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          sleep &lt;span class="Entity"&gt;rand&lt;/span&gt;(&lt;span class="Constant"&gt;2&lt;/span&gt;)
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
        log &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;END @ &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Time&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;now&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

        &lt;span class="Keyword"&gt;if&lt;/span&gt; shutting_down?
          log &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;TERMINATING @ &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="Support"&gt;Time&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;now&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          exit
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
      &lt;span class="Keyword"&gt;end&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
  Not much to say here. Note that the only reference to DaemonKit is in the #log method and that is easy to remove. We're also pleasantly free of process management code in here. All that stuff is taken care of in the master daemon. Loose coupling ftw!
&lt;/p&gt;


&lt;h2&gt;Step eight: profit off of the work of others&lt;/h2&gt;
&lt;p&gt;
  Time for a test run:
&lt;/p&gt;
&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;  $ bin&lt;span class="Keyword"&gt;/&lt;/span&gt;foff &lt;span class="Keyword"&gt;-&lt;/span&gt;w &lt;span class="Constant"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;img src="http://elccore.s3.amazonaws.com/10/863/out.png" alt="Out" /&gt;
&lt;p&gt;
You can see your three workers start up and go about their business. When the signal comes (Ctrl + C), the master daemon notifies the workers who in turn finishes off whatever they were doing and then, finally, our daemon can rest in peace.
&lt;/p&gt;
&lt;p&gt;
You might notice how some log messages are printed weirdly on screen. I'm not sure why this happens, but I'd put my money on the Ruby standard logging library not coping with parallel access very well. It's a good thing the logging backend of DaemonKit is pluggable...
&lt;/p&gt;
&lt;p&gt;
As said above, writing daemons is harder than you'd think but with tools like DaemonKit to help it's not that bad.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/0VueIa_XwrU" height="1" width="1"/&gt;</description>
      <author>David Palm</author>
      <pubDate>Tue, 06 Oct 2009 14:05:35 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/0VueIa_XwrU/ruby-daemons-and-angels</link>
      <guid isPermaLink="false">http://elctech.com/articles/ruby-daemons-and-angels</guid>
    <feedburner:origLink>http://elctech.com/articles/ruby-daemons-and-angels</feedburner:origLink></item>
    <item>
      <title>Stop wasting time - create Bug Tickets with Screenshots using Freshlog</title>
      <description>&lt;div class="preface"&gt;
  &lt;p&gt;  
 I love bug reports with screenshots because you take one look and you know exactly what the problem is.  There is no need to leave your ticket environment to reproduce the bug, you see it right there.  You see the browser and you see the current site, so let's start fixing!
  &lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;But&lt;/strong&gt;: I hate to attach screenshots to bug reports (don't you?).  Reason being, you need two tools to work.  First, you have to create the screenshot, then you need to create a ticket and attach the screenshot to it. 
&lt;/p&gt;
&lt;p&gt;
Because creating and attaching screenshots is so frustrating, clients may not see the benefit in doing it, which results in tickets lacking screenshots and causes developers to waste time trying to understand a ticket, before being able to fix one.  
&lt;/p&gt;
&lt;p&gt;
The guys from &lt;a href="http://freshlog.com/" target="_blank"&gt;freshlog.com&lt;/a&gt; created a neat solution for this problem: they simply combined ticketing and taking screenshots in one easy to use tool:
&lt;object height="408" width="510"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Rz_BRo_821I&amp;hl=en&amp;fs=1&amp;" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" type="application/x-shockwave-flash" src="http://www.youtube.com/v/Rz_BRo_821I&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" height="408" width="510"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Welcome to agile bug reporting!&lt;/h2&gt;
&lt;p&gt;
Take a screenshot, crop it, annotate it and upload it to a new OR existing ticket/to do within your favorite team collaboration tool like Basecamp, unfuddle or lighthouse. Simply enter you account credentials and ticket creation with attachments is only a keyboard shortcut away!
&lt;/p&gt;

&lt;h2&gt;How  to setup Freshlog for unfuddle&lt;/h2&gt;

&lt;h3&gt;1. Add your unfuddle Account&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://elccore.s3.amazonaws.com/29/855/Picture 7.png" alt="Picture 7" /&gt;&lt;/p&gt;

&lt;p&gt;This is what Freshlog looks like when you open it for the first time.  It offers image hosting for your screenshots, however, you don't need this feature for unfuddle as the screenshots will be attached directly to the tickets.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://elccore.s3.amazonaws.com/29/856/Picture 9.png" alt="Picture 9" /&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Click on the Issue Tracker Tab&lt;/li&gt;
&lt;li&gt;Select http&lt;strong&gt;s&lt;/strong&gt;:// in the dropbox next to URL: (if you have a paid unfuddle account)&lt;/li&gt;
&lt;li&gt;Enter the subdomain of the unfuddle account you want to login &lt;/li&gt;
&lt;li&gt;Enter username and password of your personal account and hit save&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;2. Setup Preview as your default Image Editor&lt;/h3&gt;

&lt;p&gt;
&lt;img src="http://elccore.s3.amazonaws.com/29/857/Picture 10.png" alt="Picture 10" /&gt;
&lt;/p&gt;

&lt;p&gt;Click on the Application Tab and hit "Chose Editor". You can use any editor you want but the build in Mac OS X preview application fits perfectly for screenshot annotations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You may need to enable annotations in your preview app: &lt;/p&gt;

&lt;p&gt;&lt;img src="http://elccore.s3.amazonaws.com/29/858/add-annotaction-to-preview.png" alt="Add-annotaction-to-preview" style="margin: 0 -10px" /&gt;&lt;/p&gt;

&lt;h3&gt;3. Take and attach a screenshots to a new or existing Ticket&lt;/h3&gt;

&lt;p&gt;
Simply follow &lt;a href="http://freshlog.com/tour" target="_blank"&gt;the video tour provided by Freshlog&lt;/a&gt;. The shown steps are the same for unfuddle.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/qOzXuM4NYiA" height="1" width="1"/&gt;</description>
      <author>Gregor Martynus</author>
      <pubDate>Sat, 03 Oct 2009 12:01:05 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/qOzXuM4NYiA/stop-wasting-time---create-bug-tickets-with-screenshots-using-freshlog</link>
      <guid isPermaLink="false">http://elctech.com/articles/stop-wasting-time---create-bug-tickets-with-screenshots-using-freshlog</guid>
    <feedburner:origLink>http://elctech.com/articles/stop-wasting-time---create-bug-tickets-with-screenshots-using-freshlog</feedburner:origLink></item>
    <item>
      <title>Creating PDFs with MacRuby</title>
      <description>&lt;div class="preface"&gt;
  &lt;p&gt;
Macs are cool. Cocoa is cool. Ruby is cool. Matz is nice so we are nice. Sansonetti&amp;amp;Co at Apple are like the master drinkmixers, joining together the best of the best in one neat package. I'm talking about MacRuby.
&lt;/p&gt;
  &lt;img src="http://elccore.s3.amazonaws.com/10/854/also_cool_fu.jpg" alt="Also_cool_fu" /&gt;
  &lt;p&gt;
The latest MacRuby dev branch, 0.5, is using LLVM and packs speed and features enough to make any geek teary eyed. This morning I wanted to take it for a test run on a problem domain that is sort of close to what my current project is dealing with: PDFs. 
&lt;/p&gt;
  &lt;p&gt;
We all know Mac OS X is crazy good at reading, writing and printing PostScript and PDFs. It's right in there in the OS core graphics libraries. So, I thought, wouldn't it be cool to see how to use MacRuby and Quartz to read and parse PDFs directly, rather than that pesky old beast that is Ghostscript? (GS is an awesome piece of work, very capable and I'm not meaning to sound negative here. It's just kinda... old style?)
&lt;/p&gt;
  &lt;p&gt;
So, here's some example code. You never knew you needed it, but here it is: you know all of those PDFs that you have lying around on your Desktop? Wouldn't it be fantastic to have one big PDF with the first page of all of those?
&lt;/p&gt;
  &lt;p&gt;
No? Really? C'mon!
&lt;/p&gt;
  &lt;p&gt;
So, listen, it's like the internet. You didn't know you needed that either back in the day. This is exactly the same. Keep reading.
&lt;/p&gt;
  &lt;h2&gt;Get the goods&lt;/h2&gt;
  &lt;p&gt;
Go read this: http://redartisan.com/2009/9/1/macruby-intro. Awesome intro, instructions that work. Takes hours, so it's a good thing you now know you really really need your first-page-of-all PDF.
&lt;/p&gt;
  &lt;h2&gt;Got quartz?&lt;/h2&gt;
  &lt;p&gt;
Done? Sweet. So here goes:
&lt;/p&gt;
  &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;framework &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Quartz&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
mother_pdf &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;PDFDocument&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
&lt;span class="Support"&gt;Dir&lt;/span&gt;.&lt;span class="Entity"&gt;glob&lt;/span&gt;(&lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;expand_path&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;~/Desktop/*.pdf&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)).&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;file_path&lt;/span&gt;|
  url &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;NSURL&lt;/span&gt;.&lt;span class="Entity"&gt;fileURLWithPath&lt;/span&gt;(file_path)
  pdf &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;PDFDocument&lt;/span&gt;.&lt;span class="Entity"&gt;alloc&lt;/span&gt;.&lt;span class="Entity"&gt;initWithURL&lt;/span&gt; url
  puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Loaded PDF from: &lt;span class="StringConstant"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;file_path&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  mother_pdf.&lt;span class="Entity"&gt;insertPage&lt;/span&gt;(pdf.&lt;span class="Entity"&gt;pageAtIndex&lt;/span&gt;(&lt;span class="Constant"&gt;0&lt;/span&gt;), atIndex: mother_pdf.&lt;span class="Entity"&gt;pageCount&lt;/span&gt;)
&lt;span class="Keyword"&gt;end&lt;/span&gt;
puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Done&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
mother_pdf.&lt;span class="Entity"&gt;writeToFile&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;./mother.pdf&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;
  &lt;p&gt;
See how short that was? I was just blown away by the ease of it. The only gotcha was that it took me a while to a) find the API docs for PDFKit and b) learn which framework I needed (quartz, not PDFKit).
&lt;/p&gt;
  &lt;p&gt;
Mixing and matching standard Ruby (File, Dir.glob etc) and Cocoa is just... seamless! Very very cool. The PDFKit API is straightforward to use. Let's add an annotation to each page. There are a ton of different kinds of annotations you can add, but let's keep it simple: PDFAnnotationText. Add this method on top of the code above.
&lt;/p&gt;
  &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;annotation&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;/span&gt;)
  rect  &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;NSRect&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Variable"&gt;NSPoint&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Constant"&gt;100&lt;/span&gt;,&lt;span class="Constant"&gt;100&lt;/span&gt;), &lt;span class="Variable"&gt;CGSize&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Constant"&gt;150&lt;/span&gt;,&lt;span class="Constant"&gt;100&lt;/span&gt;))
  annot &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;PDFAnnotationText&lt;/span&gt;.&lt;span class="Entity"&gt;alloc&lt;/span&gt;.&lt;span class="Entity"&gt;initWithBounds&lt;/span&gt;(rect)
  annot.&lt;span class="Entity"&gt;shouldDisplay&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
  annot.&lt;span class="Entity"&gt;contents&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; text
  annot.&lt;span class="Entity"&gt;color&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;NSColor&lt;/span&gt;.&lt;span class="Entity"&gt;whiteColor&lt;/span&gt;
  annot
&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;
  &lt;p&gt;
Notice how we can use annot.color= instead of the "real" message name, annot.setColor(). That's a MacRuby extra.&lt;br /&gt;
Next, modify the PDF generating code like so to get this:
&lt;/p&gt;
  &lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;framework &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Quartz&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;annotation&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;/span&gt;)
  rect  &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;NSRect&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Variable"&gt;NSPoint&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Constant"&gt;100&lt;/span&gt;,&lt;span class="Constant"&gt;100&lt;/span&gt;), &lt;span class="Variable"&gt;CGSize&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Constant"&gt;150&lt;/span&gt;,&lt;span class="Constant"&gt;100&lt;/span&gt;))
  annot &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;PDFAnnotationText&lt;/span&gt;.&lt;span class="Entity"&gt;alloc&lt;/span&gt;.&lt;span class="Entity"&gt;initWithBounds&lt;/span&gt;(rect)
  annot.&lt;span class="Entity"&gt;shouldDisplay&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
  annot.&lt;span class="Entity"&gt;contents&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; text
  annot.&lt;span class="Entity"&gt;color&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;NSColor&lt;/span&gt;.&lt;span class="Entity"&gt;whiteColor&lt;/span&gt;
  annot
&lt;span class="Keyword"&gt;end&lt;/span&gt;

mother_pdf &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;PDFDocument&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
&lt;span class="Support"&gt;Dir&lt;/span&gt;.&lt;span class="Entity"&gt;glob&lt;/span&gt;(&lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;expand_path&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;~/Desktop/*.pdf&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)).&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;file_path&lt;/span&gt;|
  url &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;NSURL&lt;/span&gt;.&lt;span class="Entity"&gt;fileURLWithPath&lt;/span&gt;(file_path)
  pdf &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;PDFDocument&lt;/span&gt;.&lt;span class="Entity"&gt;alloc&lt;/span&gt;.&lt;span class="Entity"&gt;initWithURL&lt;/span&gt; url
  puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Loaded PDF from: &lt;span class="StringConstant"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;file_path&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  page &lt;span class="Keyword"&gt;=&lt;/span&gt; pdf.&lt;span class="Entity"&gt;pageAtIndex&lt;/span&gt;(&lt;span class="Constant"&gt;0&lt;/span&gt;)
  page.&lt;span class="Entity"&gt;addAnnotation&lt;/span&gt;(&lt;span class="Entity"&gt;annotation&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Origin: &lt;span class="StringConstant"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;file_path&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))
  mother_pdf.&lt;span class="Entity"&gt;insertPage&lt;/span&gt;(page, atIndex: mother_pdf.&lt;span class="Entity"&gt;pageCount&lt;/span&gt;)
&lt;span class="Keyword"&gt;end&lt;/span&gt;
puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Done&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
mother_pdf.&lt;span class="Entity"&gt;writeToFile&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;./mother.pdf&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;/pre&gt;&lt;/code&gt;
  &lt;p&gt;
See? Pretty cool right? :)
&lt;/p&gt;
  &lt;p&gt;
Also cool:
&lt;/p&gt;
  &lt;img src="http://elccore.s3.amazonaws.com/10/853/also_cool_brooklynbridge.jpg" alt="Also_cool_brooklynbridge" /&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/848l7jg-YKg" height="1" width="1"/&gt;</description>
      <author>David Palm</author>
      <pubDate>Fri, 18 Sep 2009 12:08:13 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/848l7jg-YKg/creating-pdfs-with-macruby</link>
      <guid isPermaLink="false">http://elctech.com/articles/creating-pdfs-with-macruby</guid>
    <feedburner:origLink>http://elctech.com/articles/creating-pdfs-with-macruby</feedburner:origLink></item>
    <item>
      <title>Lazer Battles in Nerd World: pew pew pew</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;For one week, some of the worlds smartest people gather in the desert and its not for a conference. Engineers from all disciplines, artists, craftsmen, writers, thinkers, &lt;a href="http://www.youtube.com/watch?v=Pk7yqlTMvp8" target="_blank"&gt;cat herders&lt;/a&gt; and of course pyrotechnicians come to show off their inventions, create art, and to collaborate on a new society; a society based on one nerdy principle: Lazer Battles. Purely metaphorical lazer battles of course, nobody's actually playing lazer tag, because that would be lame. Its more about who can drag the largest lazer possible to the desert and mount it on top of the largest &lt;a href="http://images.google.com/images?q=geodesic+dome&amp;oe=utf-8&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a&amp;um=1&amp;ie=UTF-8&amp;ei=iGeySqTlOIXSsgOnnsjRDA&amp;sa=X&amp;oi=image_result_group&amp;ct=title&amp;resnum=4" target="_blank"&gt;geodesic dome&lt;/a&gt; possible and fire it across the night at other geometric shapes or even other nerds. Those other nerds could possibly be trying to solve a turn based collaborative giant floating Rubik Cube &lt;a href="http://gizmodo.com/5352460/what-is-this" target="_blank"&gt;&lt;img src="http://cache.gawker.com/assets/images/4/2009/09/500x_Cube2.jpg" alt="rubik cude" /&gt;&lt;/a&gt; or going head to head on a &lt;a href="http://www.flickr.com/photos/7363531@N05/sets/72157607189119692/" target="_blank"&gt;4 story high Tetris game&lt;/a&gt; with player cam. &lt;img src="http://farm4.static.flickr.com/3295/2839223369_2f074df5c8.jpg" alt="tetris" /&gt; One camp of nerdy rocket surgeons took the fight to the heavens with their &lt;a href="http://www.raygungothicrocket.com" target="_blank"&gt;Raygun Gothic Rocketship&lt;/a&gt;. &lt;object height="300" width="400"&gt; &lt;param name="flashvars" value="offsite=true?=en-us&amp;page_show_url=%2Fphotos%2Ftags%2Fraygungothicrocketship%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Ftags%2Fraygungothicrocketship%2F&amp;tags=raygungothicrocketship&amp;jump_to=&amp;start_index=" /&gt; &lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649" /&gt; &lt;param name="allowFullScreen" value="true" /&gt;&lt;embed allowfullscreen="true" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" type="application/x-shockwave-flash" flashvars="offsite=true?=en-us&amp;page_show_url=%2Fphotos%2Ftags%2Fraygungothicrocketship%2Fshow%2F&amp;page_show_back_url=%2Fphotos%2Ftags%2Fraygungothicrocketship%2F&amp;tags=raygungothicrocketship&amp;jump_to=&amp;start_index=" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;
Nerdy meets Mad Max and the computer controlled propane cannons were born.
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/34f4gNOu-zs&amp;hl=en&amp;fs=1&amp;" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" type="application/x-shockwave-flash" src="http://www.youtube.com/v/34f4gNOu-zs&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
But in Nerd World™, its the giant propane explosion that trumps all others.&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0ITH9OU67t0&amp;hl=en&amp;fs=1&amp;" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" type="application/x-shockwave-flash" src="http://www.youtube.com/v/0ITH9OU67t0&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6_7cRO_IjKI&amp;hl=en&amp;fs=1&amp;" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed allowfullscreen="true" type="application/x-shockwave-flash" src="http://www.youtube.com/v/6_7cRO_IjKI&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br /&gt;(skip to the 1:10 mark for the goods) 
&lt;/p&gt;
&lt;p&gt;I'm not sure what you've all heard about Burning Man. But I am hear to let you know that the rumors are true, its more than geek friendly, its built by geeks for geeks. Its not all about being a hippie and dancing the night away, like so many people who haven't gone think; its about community and collaboration. And if you can only attend one conference next year, it should be in &lt;a href="http://www.burningman.com/" target="_blank"&gt;Black Rock City&lt;/a&gt;.
&lt;img src="http://wildgreenyonder.files.wordpress.com/2007/10/64155263_f9a8409b63.jpg" alt="black rock city" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/4T3Mgsurov0" height="1" width="1"/&gt;</description>
      <author>Nicholaus</author>
      <pubDate>Thu, 17 Sep 2009 17:05:53 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/4T3Mgsurov0/lazer-battles-in-nerd-world-pew-pew-pew</link>
      <guid isPermaLink="false">http://elctech.com/articles/lazer-battles-in-nerd-world-pew-pew-pew</guid>
    <feedburner:origLink>http://elctech.com/articles/lazer-battles-in-nerd-world-pew-pew-pew</feedburner:origLink></item>
    <item>
      <title>Rake Routes Review Repeat</title>
      <description>&lt;div class="preface"&gt;

&lt;p&gt;
If you have a large and active project with many, many nested routes you'll find that listing routes using rake:routes usually ends up a mass of info spewed into terminal that is painful to wade through even with grep.&lt;/p&gt;
&lt;p&gt;
It became a pain for me and I decided to take a stab at extending rake:routes to add a task to simplify the output and add some new information.  Most of the time I grep rake:routes to confirm a path name or to see if I'm missing a route. Some of the time I wonder about whether there are orphaned routes or whether there are missing controller methods.  It would be nice to get some help on these too.&lt;/p&gt;
&lt;p&gt;
So I put together a rake task for routes that you can drop into lib/tasks/routes.rake to get more succinct output.&lt;/p&gt; 

&lt;p&gt;&lt;strong&gt;&gt;&gt;rake routes:by_controller&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
With this I'm able to get a brief listing by controller of the action, method and path along with some information to identify any routes that have been orphaned.  Perhaps some of the resources can be removed or some paths should be filtered (ie. :only =&gt;[:index, :show]).&lt;/p&gt;
&lt;p&gt;
For example: running "&lt;strong&gt;rake routes:by_controller pattern=com.e&lt;/strong&gt;"  will result in output like the following (except better in terminal; color coded):&lt;p&gt;

&lt;/p&gt;&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Variable"&gt;Attempting&lt;/span&gt; to match routes controller methods to app controller methods

&lt;span class="Variable"&gt;Match&lt;/span&gt; controllers on pattern &lt;span class="Keyword"&gt;~&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;com.e&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;

&lt;span class="Variable"&gt;Controller&lt;/span&gt; methods implemented
&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="Variable"&gt;Controller&lt;/span&gt; methods &lt;span class="Keyword"&gt;not&lt;/span&gt; implemented


&lt;span class="Variable"&gt;CONTROLLER&lt;/span&gt;: user&lt;span class="Keyword"&gt;/&lt;/span&gt;tickets&lt;span class="Keyword"&gt;/&lt;/span&gt;comments
  &lt;span class="Keyword"&gt;*&lt;/span&gt;index    &lt;span class="Variable"&gt;GET&lt;/span&gt;     user_ticket_comments                                                   
  create    &lt;span class="Variable"&gt;POST&lt;/span&gt;                                                                           
  &lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="Keyword"&gt;new&lt;/span&gt;      &lt;span class="Variable"&gt;GET&lt;/span&gt;     new_user_ticket_comment                                                
  &lt;span class="Keyword"&gt;*&lt;/span&gt;edit     &lt;span class="Variable"&gt;GET&lt;/span&gt;     edit_user_ticket_comment                                               
  &lt;span class="Keyword"&gt;*&lt;/span&gt;show     &lt;span class="Variable"&gt;GET&lt;/span&gt;     user_ticket_comment                                                    
  &lt;span class="Keyword"&gt;*&lt;/span&gt;update   &lt;span class="Variable"&gt;PUT&lt;/span&gt;                                                                            
  &lt;span class="Keyword"&gt;*&lt;/span&gt;destroy  &lt;span class="Variable"&gt;DELETE&lt;/span&gt;                                                                         


&lt;span class="Variable"&gt;CONTROLLER&lt;/span&gt;: comments
  &lt;span class="Keyword"&gt;*&lt;/span&gt;index    &lt;span class="Variable"&gt;GET&lt;/span&gt;     comments                                                               
  create    &lt;span class="Variable"&gt;POST&lt;/span&gt;                                                                           
  &lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="Keyword"&gt;new&lt;/span&gt;      &lt;span class="Variable"&gt;GET&lt;/span&gt;     new_comment                                                            
  &lt;span class="Keyword"&gt;*&lt;/span&gt;edit     &lt;span class="Variable"&gt;GET&lt;/span&gt;     edit_comment                                                           
  &lt;span class="Keyword"&gt;*&lt;/span&gt;show     &lt;span class="Variable"&gt;GET&lt;/span&gt;     comment                                                                
  &lt;span class="Keyword"&gt;*&lt;/span&gt;update   &lt;span class="Variable"&gt;PUT&lt;/span&gt;                                                                            
  &lt;span class="Keyword"&gt;*&lt;/span&gt;destroy  &lt;span class="Variable"&gt;DELETE&lt;/span&gt;                                                                         


&lt;span class="Variable"&gt;Number&lt;/span&gt; of methods: &lt;span class="Constant"&gt;14&lt;/span&gt;
&lt;span class="Variable"&gt;Controller&lt;/span&gt; methods implemented: &lt;span class="Constant"&gt;2&lt;/span&gt;
&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="Variable"&gt;Controller&lt;/span&gt; methods &lt;span class="Keyword"&gt;not&lt;/span&gt; implemented: &lt;span class="Constant"&gt;12&lt;/span&gt;
 
&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;
&lt;p&gt;
How does it help?&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt; It becomes easy to copy and paste a path.&lt;/li&gt;
 &lt;li&gt; You'll see 'create' is defined in the controller but that the other actions aren't.  Maybe they should be implemented (or maybe not) and just filtered from routes (ie. :only =&gt; [:create]).&lt;/li&gt;
&lt;li&gt; A succinct, uncluttered view by controller.&lt;/li&gt;&lt;/ol&gt;


&lt;p&gt;Any way, grab the code below and have fun. &lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;namespace &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;routes&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;

  desc &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Brief listing of routes info plus matches to app controller methods&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
  task &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;by_controller&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;environment&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;
    task_setup &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Attempting to match routes controller methods to app controller methods&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    methods &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Entity"&gt;find_routes_controller_methods_matched_to_app_controller_methods&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;pattern&lt;/span&gt;)
    index_width, controller_width, action_width, path_width, method_width, segment_width, app_controller_action &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Entity"&gt;get_array_elements_max_width&lt;/span&gt;(methods)
    last_controller &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
    methods.&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;index&lt;/span&gt;, &lt;span class="Variable"&gt;controller&lt;/span&gt;, &lt;span class="Variable"&gt;action&lt;/span&gt;, &lt;span class="Variable"&gt;path&lt;/span&gt;, &lt;span class="Variable"&gt;method&lt;/span&gt;, &lt;span class="Variable"&gt;segment&lt;/span&gt;, &lt;span class="Variable"&gt;app_controller_action&lt;/span&gt;|
      &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;methods_count&lt;/span&gt; &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
      &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;missing_methods_count&lt;/span&gt; &lt;span class="Keyword"&gt;+=&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt; &lt;span class="Keyword"&gt;unless&lt;/span&gt; app_controller_action 
      puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;CONTROLLER: &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;controller&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;ljust&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;controller_width&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;strip&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;unless&lt;/span&gt; last_controller &lt;span class="Keyword"&gt;==&lt;/span&gt; controller
      puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;  &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;app_controller_action &lt;span class="Keyword"&gt;?&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="Entity"&gt;green&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;action&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;:&lt;/span&gt; &lt;span class="StringEmbeddedSource"&gt;&lt;span class="Entity"&gt;yellow&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;*&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;action&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;ljust&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;action_width&lt;span class="Keyword"&gt;+&lt;/span&gt;colorize_width&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;  &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;method&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;ljust&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;method_width&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;  &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;path&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;ljust&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;path_width&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
      last_controller &lt;span class="Keyword"&gt;=&lt;/span&gt; controller
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
    display_counts
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;get_array_elements_max_width&lt;/span&gt;(&lt;span class="Variable"&gt;array&lt;/span&gt;)
    array.&lt;span class="Entity"&gt;first&lt;/span&gt;.&lt;span class="Entity"&gt;enum_with_index&lt;/span&gt;.&lt;span class="Entity"&gt;map&lt;/span&gt; {|&lt;span class="Variable"&gt;element&lt;/span&gt;,&lt;span class="Variable"&gt;idx&lt;/span&gt;| array.&lt;span class="Entity"&gt;map&lt;/span&gt; {|&lt;span class="Variable"&gt;element&lt;/span&gt;| element[idx]}.&lt;span class="Entity"&gt;map&lt;/span&gt; {|&lt;span class="Variable"&gt;n&lt;/span&gt;| n &lt;span class="Keyword"&gt;?&lt;/span&gt; n.&lt;span class="Entity"&gt;length&lt;/span&gt; : &lt;span class="Constant"&gt;0&lt;/span&gt;}.&lt;span class="Entity"&gt;max&lt;/span&gt;}
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;list_directories&lt;/span&gt;(&lt;span class="Variable"&gt;directory&lt;span class="Variable"&gt;,&lt;/span&gt; pattern&lt;/span&gt;)
    result &lt;span class="Keyword"&gt;=&lt;/span&gt; []
    &lt;span class="Support"&gt;Dir&lt;/span&gt;.&lt;span class="Entity"&gt;glob&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;directory&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;/*&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;file&lt;/span&gt;|
      &lt;span class="Keyword"&gt;next&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; file[&lt;span class="Constant"&gt;0&lt;/span&gt;] &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;?.&lt;/span&gt;
      &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;directory?&lt;/span&gt; file
        result.&lt;span class="Entity"&gt;push&lt;/span&gt;(&lt;span class="Keyword"&gt;*&lt;/span&gt;&lt;span class="Entity"&gt;list_directories&lt;/span&gt;(file, pattern))
      &lt;span class="Keyword"&gt;elsif&lt;/span&gt; file &lt;span class="Keyword"&gt;=~&lt;/span&gt; pattern
        result &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; file
      &lt;span class="Keyword"&gt;end&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
    result
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;find_routes_controller_actions&lt;/span&gt;(&lt;span class="Variable"&gt;pattern&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)
    routes &lt;span class="Keyword"&gt;=&lt;/span&gt; []
    &lt;span class="Support"&gt;ActionController&lt;/span&gt;::&lt;span class="Entity"&gt;Routing&lt;/span&gt;::&lt;span class="Entity"&gt;Routes&lt;/span&gt;.&lt;span class="Entity"&gt;routes&lt;/span&gt;.&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;route&lt;/span&gt;|
      path &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;ActionController&lt;/span&gt;::&lt;span class="Entity"&gt;Routing&lt;/span&gt;::&lt;span class="Entity"&gt;Routes&lt;/span&gt;.&lt;span class="Entity"&gt;named_routes&lt;/span&gt;.&lt;span class="Entity"&gt;routes&lt;/span&gt;.&lt;span class="Entity"&gt;index&lt;/span&gt;(route).&lt;span class="Entity"&gt;to_s&lt;/span&gt;
      method &lt;span class="Keyword"&gt;=&lt;/span&gt; route.&lt;span class="Entity"&gt;conditions&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;method&lt;/span&gt;].&lt;span class="Entity"&gt;blank?&lt;/span&gt; &lt;span class="Keyword"&gt;?&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;GET&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; : route.&lt;span class="Entity"&gt;conditions&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;method&lt;/span&gt;].&lt;span class="Entity"&gt;to_s&lt;/span&gt;.&lt;span class="Entity"&gt;upcase&lt;/span&gt;
      segment &lt;span class="Keyword"&gt;=&lt;/span&gt; route.&lt;span class="Entity"&gt;segments&lt;/span&gt;.&lt;span class="Entity"&gt;inject&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) { |&lt;span class="Variable"&gt;str&lt;/span&gt;,&lt;span class="Variable"&gt;s&lt;/span&gt;| str &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; s.&lt;span class="Entity"&gt;to_s&lt;/span&gt; }
      segment.&lt;span class="Entity"&gt;chop!&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; segment.&lt;span class="Entity"&gt;length&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;
      controller &lt;span class="Keyword"&gt;=&lt;/span&gt; route.&lt;span class="Entity"&gt;requirements&lt;/span&gt;.&lt;span class="Entity"&gt;empty?&lt;/span&gt; &lt;span class="Keyword"&gt;?&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; : route.&lt;span class="Entity"&gt;requirements&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;controller&lt;/span&gt;]
      action &lt;span class="Keyword"&gt;=&lt;/span&gt; route.&lt;span class="Entity"&gt;requirements&lt;/span&gt;.&lt;span class="Entity"&gt;empty?&lt;/span&gt; &lt;span class="Keyword"&gt;?&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; : route.&lt;span class="Entity"&gt;requirements&lt;/span&gt;[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;action&lt;/span&gt;]
      route.&lt;span class="Entity"&gt;requirements&lt;/span&gt;.&lt;span class="Entity"&gt;delete&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;controller&lt;/span&gt;
      route.&lt;span class="Entity"&gt;requirements&lt;/span&gt;.&lt;span class="Entity"&gt;delete&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;action&lt;/span&gt;

      &lt;span class="Keyword"&gt;if&lt;/span&gt; controller &lt;span class="Keyword"&gt;=~&lt;/span&gt; &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexpSpecial"&gt;&lt;span class="StringRegexpSpecial"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;pattern&lt;/span&gt;&lt;span class="StringRegexpSpecial"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;
        &lt;span class="Keyword"&gt;unless&lt;/span&gt; routes.&lt;span class="Entity"&gt;assoc&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;controller&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;:&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;action&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          routes &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; [&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;controller&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;:&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;action&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, controller, action, path, method, segment] &lt;span class="Keyword"&gt;unless&lt;/span&gt; controller.&lt;span class="Entity"&gt;blank?&lt;/span&gt;
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
      &lt;span class="Keyword"&gt;end&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
    routes
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;find_app_controller_actions&lt;/span&gt;(&lt;span class="Variable"&gt;pattern&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)
    controller_actions &lt;span class="Keyword"&gt;=&lt;/span&gt; []
    controllers &lt;span class="Keyword"&gt;=&lt;/span&gt; list_directories &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;/app/controllers&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;_controller.rb$&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;
    controllers.&lt;span class="Entity"&gt;each&lt;/span&gt; {|&lt;span class="Variable"&gt;a&lt;/span&gt;| a.&lt;span class="Entity"&gt;gsub!&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;/app/controllers/&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;); a.&lt;span class="Entity"&gt;gsub!&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.rb&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)}
    controllers.&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;controller_path&lt;/span&gt;|
      &lt;span class="Keyword"&gt;if&lt;/span&gt; controller_path &lt;span class="Keyword"&gt;=~&lt;/span&gt; &lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexpSpecial"&gt;&lt;span class="StringRegexpSpecial"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;pattern&lt;/span&gt;&lt;span class="StringRegexpSpecial"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;
        controller &lt;span class="Keyword"&gt;=&lt;/span&gt; controller_path.&lt;span class="Entity"&gt;camelize&lt;/span&gt;.&lt;span class="Entity"&gt;gsub&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;.rb&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
        (&lt;span class="Entity"&gt;eval&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;controller&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;.public_instance_methods&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class="Keyword"&gt;-&lt;/span&gt;
            &lt;span class="Support"&gt;ApplicationController&lt;/span&gt;.&lt;span class="Entity"&gt;public_instance_methods&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt;
            &lt;span class="Support"&gt;Object&lt;/span&gt;.&lt;span class="Entity"&gt;methods&lt;/span&gt;).&lt;span class="Entity"&gt;sort&lt;/span&gt;.&lt;span class="Entity"&gt;each&lt;/span&gt; {|&lt;span class="Variable"&gt;method&lt;/span&gt;| controller_actions &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; [&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;controller&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;underscore&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;gsub!&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;(&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;_controller&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;,&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;)&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;:&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;method&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]}
      &lt;span class="Keyword"&gt;end&lt;/span&gt;
    &lt;span class="Keyword"&gt;end&lt;/span&gt;
    controller_actions
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;find_routes_controller_methods_matched_to_app_controller_methods&lt;/span&gt;(&lt;span class="Variable"&gt;pattern&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)
    controller_actions &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Entity"&gt;find_app_controller_actions&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;pattern&lt;/span&gt;)
    &lt;span class="Entity"&gt;find_routes_controller_actions&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;pattern&lt;/span&gt;).&lt;span class="Entity"&gt;map!&lt;/span&gt; {|&lt;span class="Variable"&gt;p&lt;/span&gt;| p &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; controller_actions.&lt;span class="Entity"&gt;find&lt;/span&gt; {|&lt;span class="Variable"&gt;i&lt;/span&gt;| i[&lt;span class="Constant"&gt;0&lt;/span&gt;] &lt;span class="Keyword"&gt;==&lt;/span&gt; p[&lt;span class="Constant"&gt;0&lt;/span&gt;]}}
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;task_setup&lt;/span&gt;(&lt;span class="Variable"&gt;title&lt;/span&gt;)
    &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;pattern&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;ENV&lt;/span&gt;[&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;pattern&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;] &lt;span class="Keyword"&gt;?&lt;/span&gt; &lt;span class="Variable"&gt;ENV&lt;/span&gt;[&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;pattern&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;].&lt;span class="Entity"&gt;downcase&lt;/span&gt; : &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
    &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;methods_count&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
    &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;missing_methods_count&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
    puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;title&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Match controllers on pattern =~ /&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;pattern&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;/&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts green &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Controller methods implemented&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts yellow &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;*Controller methods not implemented&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;display_counts&lt;/span&gt;
    puts &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;&lt;span class="StringConstant"&gt;\n&lt;/span&gt;Number of methods: &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;methods_count&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts green &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Controller methods implemented &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;methods_count&lt;/span&gt; &lt;span class="Keyword"&gt;-&lt;/span&gt; &lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;missing_methods_count&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts yellow &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;*Controller methods not implemented &lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;&lt;span class="StringVariable"&gt;&lt;span class="StringVariable"&gt;@&lt;/span&gt;missing_methods_count&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;

  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;colorize&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;span class="Variable"&gt;,&lt;/span&gt; color_code&lt;/span&gt;)
    &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;color_code&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEmbeddedSource"&gt;&lt;span class="StringEmbeddedSource"&gt;#{&lt;/span&gt;text&lt;span class="StringEmbeddedSource"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringConstant"&gt;\e&lt;/span&gt;[0m&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;colorize_width&lt;/span&gt;; &lt;span class="Constant"&gt;10&lt;/span&gt;;&lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;red&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;/span&gt;); &lt;span class="Entity"&gt;colorize&lt;/span&gt;(text, &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\e&lt;/span&gt;[31m&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;); &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;green&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;/span&gt;); &lt;span class="Entity"&gt;colorize&lt;/span&gt;(text, &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\e&lt;/span&gt;[32m&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;); &lt;span class="Keyword"&gt;end&lt;/span&gt;
  &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;yellow&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;/span&gt;); &lt;span class="Entity"&gt;colorize&lt;/span&gt;(text, &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="StringConstant"&gt;\e&lt;/span&gt;[33m&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;); &lt;span class="Keyword"&gt;end&lt;/span&gt;

&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;&lt;/p&gt;




&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/P0Rj6I90idI" height="1" width="1"/&gt;</description>
      <author>Victor Christensen</author>
      <pubDate>Fri, 04 Sep 2009 22:52:09 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/P0Rj6I90idI/rake-routes-review-repeat</link>
      <guid isPermaLink="false">http://elctech.com/articles/rake-routes-review-repeat</guid>
    <feedburner:origLink>http://elctech.com/articles/rake-routes-review-repeat</feedburner:origLink></item>
    <item>
      <title>Counting total number of objects in S3</title>
      <description>&lt;div class="preface"&gt;
&lt;p&gt;Sometimes it comes in handy to get the total number of objects you have in S3 but it is not as straight forward. Here's a snippet I use to get total number of objects using right_aws gem. &lt;/p&gt;
&lt;/div&gt;

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rubygems&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; 
&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; 

&lt;span class="Variable"&gt;AWS_ID&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;id&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Variable"&gt;AWS_KEY&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;mykey&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

s3&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Variable"&gt;AWS_ID&lt;/span&gt;, &lt;span class="Variable"&gt;AWS_KEY&lt;/span&gt;) 
count&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;

buckets&lt;span class="Keyword"&gt;=&lt;/span&gt;s3.&lt;span class="Entity"&gt;list_all_my_buckets&lt;/span&gt;.&lt;span class="Entity"&gt;collect&lt;/span&gt;{|&lt;span class="Variable"&gt;b&lt;/span&gt;| b[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;]}
buckets.&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;bucket_name&lt;/span&gt;|
    s3.&lt;span class="Entity"&gt;incrementally_list_bucket&lt;/span&gt;(bucket_name) { |&lt;span class="Variable"&gt;k&lt;/span&gt;| 
        count &lt;span class="Keyword"&gt;+=&lt;/span&gt; k[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;contents&lt;/span&gt;].&lt;span class="Entity"&gt;size&lt;/span&gt;
    }
&lt;span class="Keyword"&gt;end&lt;/span&gt;
puts count
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
The script gets all your buckets, count the contents of the buckets incrementally because AWS only allows a max of 1000 items to be returned per request.
&lt;/p&gt;

&lt;h2&gt;Get  total size of data being used&lt;/h2&gt;
&lt;p&gt;
You can also modify this script to sum up the amount of space you're using:
&lt;/p&gt;

&lt;code language="ruby"&gt;&lt;pre class="sunburst"&gt;&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rubygems&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; 
&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;right_aws&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; 

&lt;span class="Variable"&gt;AWS_ID&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;id&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="Variable"&gt;AWS_KEY&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;mykey&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;

s3&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Support"&gt;RightAws&lt;/span&gt;::&lt;span class="Entity"&gt;S3Interface&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;(&lt;span class="Variable"&gt;AWS_ID&lt;/span&gt;, &lt;span class="Variable"&gt;AWS_KEY&lt;/span&gt;) 
size&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;0&lt;/span&gt;

buckets&lt;span class="Keyword"&gt;=&lt;/span&gt;s3.&lt;span class="Entity"&gt;list_all_my_buckets&lt;/span&gt;.&lt;span class="Entity"&gt;collect&lt;/span&gt;{|&lt;span class="Variable"&gt;b&lt;/span&gt;| b[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;name&lt;/span&gt;]}
buckets.&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;bucket_name&lt;/span&gt;|
    s3.&lt;span class="Entity"&gt;incrementally_list_bucket&lt;/span&gt;(bucket_name) { |&lt;span class="Variable"&gt;k&lt;/span&gt;| 
        k[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;contents&lt;/span&gt;].&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;content&lt;/span&gt;|
            size &lt;span class="Keyword"&gt;+=&lt;/span&gt; content[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;size&lt;/span&gt;]
        &lt;span class="Keyword"&gt;end&lt;/span&gt;
    }
&lt;span class="Keyword"&gt;end&lt;/span&gt;
puts count
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
Note: I just made up this script right now and haven't tested it out. Please tell me if it works.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ElcCodeFeed/~4/FoMP350Q6ug" height="1" width="1"/&gt;</description>
      <author>Alex Chee</author>
      <pubDate>Tue, 01 Sep 2009 19:45:25 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/ElcCodeFeed/~3/FoMP350Q6ug/counting-total-number-of-objects-in-s3</link>
      <guid isPermaLink="false">http://elctech.com/snippets/counting-total-number-of-objects-in-s3</guid>
    <feedburner:origLink>http://elctech.com/snippets/counting-total-number-of-objects-in-s3</feedburner:origLink></item>
  </channel>
</rss>
