<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Planet RubyOnRails</title>
    <link>http://www.planetrubyonrails.org/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/planetrubyonrails" type="application/rss+xml" /><item>
      <title>wnoronha: Fun with Google Video Chat</title>
      <description>&lt;div style="text-align: center;"&gt;
&lt;object type="application/x-shockwave-flash" width="400" height="300" data="http://www.flickr.com/apps/video/stewart.swf?v=63881" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt;
    &lt;param name="flashvars" value="intl_lang=en-us&amp;amp;photo_secret=c0b59feaaa&amp;amp;photo_id=3025735534&amp;amp;show_info_box=true" /&gt;
    &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=63881" /&gt;
    &lt;param name="bgcolor" value="#000000" /&gt;
    &lt;param name="allowFullScreen" value="true" /&gt;
    &lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=63881" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;amp;photo_secret=c0b59feaaa&amp;amp;photo_id=3025735534&amp;amp;flickr_show_info_box=true" height="300" width="400" /&gt;
  &lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.hyperionreactor.net/node/259" target="_blank"&gt;read more&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/hyperionreactor?a=RqIfN"&gt;&lt;img src="http://feeds.feedburner.com/~f/hyperionreactor?i=RqIfN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/hyperionreactor?a=XNvLn"&gt;&lt;img src="http://feeds.feedburner.com/~f/hyperionreactor?i=XNvLn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/hyperionreactor?a=Ya9sN"&gt;&lt;img src="http://feeds.feedburner.com/~f/hyperionreactor?i=Ya9sN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
 &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=UiCJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=UiCJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Fwyxn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Fwyxn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=znVrN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=znVrN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=QSuvn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=QSuvn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=W9TRN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=W9TRN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=zmymn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=zmymn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/hyperionreactor/~4/458152589" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 19 Nov 2008 22:01:48 -0600</pubDate>
      <guid>259 at http://www.hyperionreactor.net</guid>
      <author>wnoronha</author>
      <source>http://feeds.feedburner.com/%7Er/hyperionreactor/%7E3/458152589/259</source>
      <link>http://feeds.feedburner.com/%7Er/hyperionreactor/%7E3/458152589/259</link>
      <category>google</category>
    </item>
    <item>
      <title>daniel: Delayed Gratification with Rails</title>
      <description>&lt;p&gt;In which Daniel Morrison covers how to install and use delayed job, a rails plugin that encapsulates the common pattern of executing longer tasks in the background.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=vRb7N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=vRb7N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=XJmHn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=XJmHn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=MkuGN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=MkuGN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=fwt5n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=fwt5n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=i5QgN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=i5QgN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=ydlBn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=ydlBn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Wed, 19 Nov 2008 20:35:00 -0600</pubDate>
      <guid>tag:railstips.org,2008-11-19:8401</guid>
      <author>daniel</author>
      <source>http://feeds.feedburner.com/%7Er/railstips/%7E3/458795056/delayed-gratification-with-rails</source>
      <link>http://feeds.feedburner.com/%7Er/railstips/%7E3/458795056/delayed-gratification-with-rails</link>
      <category>plugins</category>
      <category>background_jobs</category>
      <category>collectiveidea</category>
      <category>delayed_job</category>
      <category>performance</category>
    </item>
    <item>
      <title>pelle: Agree2 is now officially launched</title>
      <description>&lt;p&gt;Goodbye Fax, Goodbye Fedex, Goodbye Mont Blanc pens&amp;#8230; Hello &lt;a href='http://agree2.com'&gt;Agree2&lt;/a&gt;.&lt;/p&gt;
&lt;p/&gt;
&lt;p&gt;What started as a proof of concept prototype in creating agreements roughly 2 years ago is now officially launched. We have been in beta for a long time, but now we feel the time is right to lift the beta tag and introduce our commercial plans.&lt;/p&gt;
&lt;p&gt;But first let me explain what Agree2 is all about. Plain and simple we are all about helping you reach agreement.&lt;/p&gt;
&lt;p&gt;See the &lt;a href='http://blog.extraeagle.com/2008/11/19/agree2-is-launched/'&gt;Agree2 launch Post&lt;/a&gt; for more information or go straight to &lt;a href='http://agree2.com'&gt;Agree2&lt;/a&gt; to sign up.&lt;/p&gt;



&lt;p class='agree2_ad'&gt;&lt;a href='http://agree2.com?referrer=0'&gt;Create, negotiate and accept legally binding contracts for free with our Agree2 service.&lt;/a&gt;&lt;/p&gt;&lt;div class='feedflare'&gt;
&lt;a href='http://feeds.feedburner.com/~f/StakeVentures?a=j6OlN'&gt;&lt;img src='http://feeds.feedburner.com/~f/StakeVentures?i=j6OlN' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/~f/StakeVentures?a=KRB3N'&gt;&lt;img src='http://feeds.feedburner.com/~f/StakeVentures?i=KRB3N' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/~f/StakeVentures?a=fNhfN'&gt;&lt;img src='http://feeds.feedburner.com/~f/StakeVentures?i=fNhfN' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/~f/StakeVentures?a=I0u3n'&gt;&lt;img src='http://feeds.feedburner.com/~f/StakeVentures?i=I0u3n' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/~f/StakeVentures?a=Klajn'&gt;&lt;img src='http://feeds.feedburner.com/~f/StakeVentures?i=Klajn' border='0'/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src='http://feeds.feedburner.com/~r/StakeVentures/~4/458789097' height='1' width='1'/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=0fHJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=0fHJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=SivNn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=SivNn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=UHvvN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=UHvvN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=BSu2n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=BSu2n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=lmtjN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=lmtjN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=HU8Dn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=HU8Dn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Wed, 19 Nov 2008 20:29:16 -0600</pubDate>
      <guid>tag:stakeventures.com,2005:Typo-300</guid>
      <author>pelle</author>
      <source>http://feeds.feedburner.com/%7Er/StakeVentures/%7E3/458789097/agree2-is-now-officially-launched</source>
      <link>http://feeds.feedburner.com/%7Er/StakeVentures/%7E3/458789097/agree2-is-now-officially-launched</link>
      <category>agree2</category>
    </item>
    <item>
      <title>wnoronha: Butane Lighter and Cigarette Case</title>
      <description>&lt;div style="text-align: center;"&gt;
&lt;object type="application/x-shockwave-flash" width="500" height="375" data="http://www.flickr.com/apps/video/stewart.swf?v=63881" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;amp;photo_secret=a5e79b28ba&amp;amp;photo_id=3043272078&amp;amp;show_info_box=true" /&gt; &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=63881" /&gt; &lt;param name="bgcolor" value="#000000" /&gt; &lt;param name="allowFullScreen" value="true" /&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=63881" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;amp;photo_secret=a5e79b28ba&amp;amp;photo_id=3043272078&amp;amp;flickr_show_info_box=true" height="375" width="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.hyperionreactor.net/node/258" target="_blank"&gt;read more&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/hyperionreactor?a=yhhSN"&gt;&lt;img src="http://feeds.feedburner.com/~f/hyperionreactor?i=yhhSN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/hyperionreactor?a=UOA5n"&gt;&lt;img src="http://feeds.feedburner.com/~f/hyperionreactor?i=UOA5n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/hyperionreactor?a=WLG5N"&gt;&lt;img src="http://feeds.feedburner.com/~f/hyperionreactor?i=WLG5N" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
 &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=PhjPN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=PhjPN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=t98jn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=t98jn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=subMN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=subMN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=HPrKn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=HPrKn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=g5sJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=g5sJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=uuUHn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=uuUHn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/hyperionreactor/~4/458152590" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 19 Nov 2008 08:25:47 -0600</pubDate>
      <guid>258 at http://www.hyperionreactor.net</guid>
      <author>wnoronha</author>
      <source>http://feeds.feedburner.com/%7Er/hyperionreactor/%7E3/458152590/258</source>
      <link>http://feeds.feedburner.com/%7Er/hyperionreactor/%7E3/458152590/258</link>
      <category>cool</category>
      <category>dealextreme</category>
      <category>fun</category>
      <category>smoking</category>
    </item>
    <item>
      <title>ryan: What&amp;apos;s New in Edge Rails: Application.rb Duality is no More</title>
      <description>&lt;p&gt;Ever wonder why your &lt;code&gt;ArticlesController&lt;/code&gt; has to live in a file called &lt;code&gt;articles_controller.rb&lt;/code&gt; but that special &lt;code&gt;ApplicationController&lt;/code&gt; gets to hang out in &lt;code&gt;application.rb&lt;/code&gt;?  Well &lt;a href='http://github.com/rails/rails/commit/fcce1f17eaf9993b0210fe8e2a8117b61a1f0f69'&gt;no more&lt;/a&gt;.. That snooty little controller will now live in &lt;code&gt;application_controller.rb&lt;/code&gt; and abide by the same naming restrictions that the rest of us do.&lt;/p&gt;


  &lt;p&gt;As you can see by the &lt;a href='http://github.com/rails/rails/commit/fcce1f17eaf9993b0210fe8e2a8117b61a1f0f69#comments'&gt;comments&lt;/a&gt;, by the time this is in a stable Rails release there will be upgrade help.  However, for those of you on Edge Rails, you’ll need to make this change yourself.&lt;/p&gt;


  &lt;p&gt;tags: &lt;a href='http://technorati.com/tag/ruby'&gt;ruby&lt;/a&gt;,
&lt;a href='http://technorati.com/tag/rubyonrails'&gt;rubyonrails&lt;/a&gt;&lt;/p&gt;
          
&lt;p&gt;&lt;a href='http://feedads.googleadservices.com/%7Ea/Knc8SXFDJE-stsA9Ewx9Te-xakc/a'&gt;&lt;img ismap='true' src='http://feedads.googleadservices.com/%7Ea/Knc8SXFDJE-stsA9Ewx9Te-xakc/i' border='0'/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class='feedflare'&gt;
&lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=AhWSCmMt'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?d=41' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=saAreHsH'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?d=50' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=yQlvSTyq'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?d=43' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=ST3BkxIb'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?i=ST3BkxIb' border='0'/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src='http://feedproxy.google.com/%7Er/RyansScraps/%7E4/oPBuRmhH4kM' height='1' width='1'/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=vubJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=vubJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=9kkBn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=9kkBn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=r81qN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=r81qN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=bwwQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=bwwQn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=lQUCN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=lQUCN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Yxczn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Yxczn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Wed, 19 Nov 2008 01:36:00 -0600</pubDate>
      <guid>tag:ryandaigle.com,2008-11-19:8037</guid>
      <author>ryan</author>
      <source>http://feedproxy.google.com/%7Er/RyansScraps/%7E3/oPBuRmhH4kM/what-s-new-in-edge-rails-application-rb-duality-is-no-more</source>
      <link>http://feedproxy.google.com/%7Er/RyansScraps/%7E3/oPBuRmhH4kM/what-s-new-in-edge-rails-application-rb-duality-is-no-more</link>
    </item>
    <item>
      <title>brian: Rubinius is a community project</title>
      <description>&lt;p&gt;Yesterday was a tough day. You can read the &lt;a href='http://blog.engineyard.com/2008/11/17/rubinius-past-present-and-future'&gt;details&lt;/a&gt; and &lt;a href='http://blog.fallingsnow.net/'&gt;Evan’s&lt;/a&gt; &lt;a href='http://blog.fallingsnow.net/2008/11/18/a-sad-day/'&gt;thoughts&lt;/a&gt; about it.&lt;/p&gt;


  &lt;p&gt;It was especially hard for me because &lt;a href='http://metaclass.org/'&gt;Wilson&lt;/a&gt; was a mentor of sorts and the first person I talked to when I dropped into the #rubinius channel nearly two years ago. He allayed any fear I had that Rubinius would fragment the Ruby community and helped me get started contributing.&lt;/p&gt;


  &lt;p&gt;And &lt;a href='http://journal.kittensoft.org/'&gt;Eero&lt;/a&gt;, among many other things, jumped on board right away and toiled for many hours on the early specs, putting up with my dead ends when the project that is now &lt;a href='http://rubyspec.org/'&gt;RubySpec&lt;/a&gt; was merely an expedient to fast-track Rubinius development.&lt;/p&gt;


  &lt;p&gt;So, I want to express my thanks to my teammates and wish them the best in their next endeavors. And I want to emphasize something that is well known to those of us who have worked hard on Rubinius from long before &lt;a href='http://engineyard.com/'&gt;Engine Yard&lt;/a&gt; began to support the project: &lt;strong&gt;Rubinius is a community project&lt;/strong&gt;.&lt;/p&gt;


  &lt;p&gt;Evan’s free-flowing commit bit, the early adoption of Git, and the emphasis on writing specs while developing are just a few aspects that have helped propel Rubinius very quickly in its couple year history. And there is still plenty of exciting and interesting work to be done. We are all very grateful for Engine Yard’s support of the project, and that support remains strong and dedicated.&lt;/p&gt;


  &lt;p&gt;But the key to Rubinius’ success is the community. In the past year, I feel we have to some extent let you, the community, down. We need to make Rubinius even easier to try out, understand, and contribute to. And we need your feedback on ways we can do this. The recent VM rewrite has been a huge step forward in this regard. But have you opened up the code, poked around, asked us about stuff that doesn’t make sense? If you haven’t, let us know why not. Have you taken a look at a failing spec for the core library? There’s tons of beautiful Ruby code just begging for some love. Let us know what barriers prevent you from spending some free time in there.&lt;/p&gt;


  &lt;p&gt;If you’re worried that development on Rubinius will slow down, I would challenge you to not let that happen. Evan produces prodigious amounts of code and has a terrific mix of genius and pragmatism. I will certainly not be working any less hard than I have for the past two years. So if you, like me, believe that Rubinius can be a terrific platform for Ruby, jump in. No contribution is too small. And we’re building on a solid foundation of past success.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Lud3N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Lud3N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=g4Pcn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=g4Pcn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=7aqfN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=7aqfN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=GlAhn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=GlAhn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=f1I0N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=f1I0N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=6R3nn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=6R3nn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 22:03:00 -0600</pubDate>
      <guid>tag:blog.brightredglow.com,2008-11-18:5177</guid>
      <author>brian</author>
      <source>http://feeds.feedburner.com/%7Er/defeulerxcosxisinxend/%7E3/457685243/rubinius-is-a-community-project</source>
      <link>http://feeds.feedburner.com/%7Er/defeulerxcosxisinxend/%7E3/457685243/rubinius-is-a-community-project</link>
    </item>
    <item>
      <title>ryan: What&amp;apos;s New in Edge Rails: Default Scoping</title>
      <description>&lt;p&gt;It’s pretty common to want &lt;span class='caps'&gt;SQL&lt;/span&gt; queries against a particular table to always be sorted the same way, and is one of the reasons why I added the &lt;code&gt;ordered&lt;/code&gt; scope to the &lt;a href='https://github.com/yfactorial/utility_scopes/tree'&gt;utility scopes&lt;/a&gt; gem.  For instance, when dealing with collections of articles it is reasonable to expect that the default ordering be most recent first, i.e. &lt;code&gt;created_at DESC&lt;/code&gt;.  Well now you can &lt;a href='http://github.com/rails/rails/commit/32cb2345a54b9ab38461b2d4bb0dbd1706f2800e'&gt;specify default ordering, and other scopes, in edge rails&lt;/a&gt; directly in your ActiveRecord model.&lt;/p&gt;


  &lt;p&gt;Taking our &lt;code&gt;Article&lt;/code&gt; example let’s specify the aforementioned default ordering:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Article&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;ActiveRecord&lt;/span&gt;::&lt;span class='co'&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class='sy'&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;created_at DESC&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


  &lt;p&gt;Now, when any find method or named_scope is executed the default ordering comes along for the ride:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='co'&gt;Article&lt;/span&gt;.find(&lt;span class='sy'&gt;:all&lt;/span&gt;) &lt;span class='c'&gt;#=&amp;gt; "SELECT * FROM `articles` ORDER BY created_at DESC"&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


  &lt;p&gt;The same holds true for any named scopes you might have:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Article&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;ActiveRecord&lt;/span&gt;::&lt;span class='co'&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class='sy'&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;created_at DESC&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  named_scope &lt;span class='sy'&gt;:published&lt;/span&gt;, &lt;span class='sy'&gt;:conditions&lt;/span&gt; =&amp;gt; { &lt;span class='sy'&gt;:published&lt;/span&gt; =&amp;gt; &lt;span class='pc'&gt;true&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='co'&gt;Article&lt;/span&gt;.published &lt;span class='c'&gt;#=&amp;gt; "SELECT * FROM `articles` WHERE published = true ORDER BY created_at DESC"&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


  &lt;p&gt;There are some things to keep in mind, however.  First is that scopes like &lt;code&gt;:join&lt;/code&gt;, &lt;code&gt;:offset&lt;/code&gt;, &lt;code&gt;:limit&lt;/code&gt; and &lt;code&gt;:order&lt;/code&gt; will get clobbered by the innermost rule.  For example, here the default scope ordering loses out to the &lt;code&gt;named_scope&lt;/code&gt; ordering.&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Article&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;ActiveRecord&lt;/span&gt;::&lt;span class='co'&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class='sy'&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;created_at DESC&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  named_scope &lt;span class='sy'&gt;:published&lt;/span&gt;, &lt;span class='sy'&gt;:conditions&lt;/span&gt; =&amp;gt; { &lt;span class='sy'&gt;:published&lt;/span&gt; =&amp;gt; &lt;span class='pc'&gt;true&lt;/span&gt; },&lt;tt&gt;
&lt;/tt&gt;                          &lt;span class='sy'&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;published_at DESC&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='c'&gt;# published_at DESC clobbers default scope&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='co'&gt;Article&lt;/span&gt;.published&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='c'&gt;#=&amp;gt; "SELECT * FROM `articles` WHERE published = true ORDER BY published_at DESC"&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


  &lt;p&gt;Also keep in mind that the default scoping is inherited, so child-classes of &lt;code&gt;Article&lt;/code&gt; will have the same default scoping.&lt;/p&gt;


  &lt;p&gt;And for those occasions when you want to override or remove your default scope, just use &lt;code&gt;with_exclusive_scope&lt;/code&gt;:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Article&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;ActiveRecord&lt;/span&gt;::&lt;span class='co'&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  default_scope &lt;span class='sy'&gt;:order&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;created_at DESC&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='c'&gt;# Ignore other scoping within this block&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='co'&gt;Article&lt;/span&gt;.with_exclusive_scope { find(&lt;span class='sy'&gt;:all&lt;/span&gt;) }  &lt;span class='c'&gt;#=&amp;gt; "SELECT * FROM `articles`&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


  &lt;p&gt;&lt;code&gt;default_scope&lt;/code&gt; is a great way to specify reasonable query defaults and relieve yourself of having to create your own named_scopes for that purpose or specify such conditions at every invocation.  &lt;em&gt;Yes, I just said ‘relieve yourself’...  giggity giggity&lt;/em&gt;&lt;/p&gt;


  &lt;p&gt;tags: &lt;a href='http://technorati.com/tag/ruby'&gt;ruby&lt;/a&gt;,
&lt;a href='http://technorati.com/tag/rubyonrails'&gt;rubyonrails&lt;/a&gt;&lt;/p&gt;
          
&lt;p&gt;&lt;a href='http://feedads.googleadservices.com/%7Ea/eMft8ILhvx_oyMv7R3IP2u1I9bw/a'&gt;&lt;img ismap='true' src='http://feedads.googleadservices.com/%7Ea/eMft8ILhvx_oyMv7R3IP2u1I9bw/i' border='0'/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class='feedflare'&gt;
&lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=JPbtcGXf'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?d=41' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=0yjGpyzM'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?d=50' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=SP3IFGE0'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?d=43' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feedproxy.google.com/%7Ef/RyansScraps?a=1HhUZnW3'&gt;&lt;img src='http://feedproxy.google.com/%7Ef/RyansScraps?i=1HhUZnW3' border='0'/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src='http://feedproxy.google.com/%7Er/RyansScraps/%7E4/uCvC6ciZvPg' height='1' width='1'/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=PXm0N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=PXm0N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=tzmvn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=tzmvn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=L19vN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=L19vN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Xotfn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Xotfn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=9hnzN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=9hnzN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=AV55n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=AV55n" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 21:51:00 -0600</pubDate>
      <guid>tag:ryandaigle.com,2008-11-18:8031</guid>
      <author>ryan</author>
      <source>http://feedproxy.google.com/%7Er/RyansScraps/%7E3/uCvC6ciZvPg/what-s-new-in-edge-rails-default-scoping</source>
      <link>http://feedproxy.google.com/%7Er/RyansScraps/%7E3/uCvC6ciZvPg/what-s-new-in-edge-rails-default-scoping</link>
    </item>
    <item>
      <title>michael: Potential Circumvention of CSRF Protection in Rails 2.1</title>
      <description>&lt;p&gt;There is a bug in all 2.1.x versions of Ruby on Rails which affects the effectiveness of the &lt;span class='caps'&gt;CSRF&lt;/span&gt; protection given by protect_from_forgery.&lt;/p&gt;


  &lt;p&gt;By design rails does not perform token verification on requests with certain content types not typically generated by browsers.  Unfortunately this list also included ‘text/plain’ which can be generated by browsers.&lt;/p&gt;


  &lt;h2&gt;Impact&lt;/h2&gt;


  &lt;p&gt;Requests can be crafted which will circumvent the &lt;span class='caps'&gt;CSRF&lt;/span&gt; protection entirely.  Rails does not parse the parameters provided with these requests, but that may not be enough to protect your application.&lt;/p&gt;


  &lt;h2&gt;Affected Versions&lt;/h2&gt;


  &lt;ul&gt;
  &lt;li&gt;All releases in the 2.1 series&lt;/li&gt;
    &lt;li&gt;All 2.2 Pre Releases&lt;/li&gt;
  &lt;/ul&gt;


  &lt;h2&gt;Fixes&lt;/h2&gt;


  &lt;p&gt;The upcoming 2.1.3 and 2.2.2 releases will contain a fix for this issue.&lt;/p&gt;


  &lt;h2&gt;Interim Workarounds&lt;/h2&gt;


  &lt;p&gt;Users of 2.1.x releases are advised to insert the following code into a file in config/initializers/&lt;/p&gt;


&lt;blockquote&gt;
  &lt;p&gt;Mime::Type.unverifiable_types.delete(:text)&lt;/p&gt;

&lt;/blockquote&gt;




  &lt;p&gt;Users of Edge Rails after 2.2.1, should upgrade to the latest code in 2-2-stable.&lt;/p&gt;


  &lt;p&gt;The patch for the 2.1.x series is available on &lt;a href='http://github.com/rails/rails/commit/099a98e9b7108dae3e0f78b207e0a7dc5913bd1a'&gt;github&lt;/a&gt;. This will also apply cleanly to 2.2 pre-releases prior to &lt;a href='http://github.com/rails/rails/commit/f1ad8b48aae3ee26613b3e77bc0056e120096846'&gt;this changeset&lt;/a&gt; released on Thursday November 13th at 11:19:53 2008 &lt;span class='caps'&gt;CET&lt;/span&gt;.  Users with edge-rails checkouts after that date, are advised to upgrade to the latest code in 2-2-stable.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=zdDZN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=zdDZN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=7YgAn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=7YgAn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=UgyZN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=UgyZN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=MEOln"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=MEOln" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=tFl1N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=tFl1N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=d4rGn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=d4rGn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 18:13:00 -0600</pubDate>
      <guid>tag:weblog.rubyonrails.com,2008-11-18:22844</guid>
      <author>michael</author>
      <source>http://feeds.feedburner.com/%7Er/RidingRails/%7E3/457453697/potential-circumvention-of-csrf-protection-in-rails-2-1</source>
      <link>http://feeds.feedburner.com/%7Er/RidingRails/%7E3/457453697/potential-circumvention-of-csrf-protection-in-rails-2-1</link>
      <category>announcement</category>
      <category>csrf</category>
      <category>security</category>
    </item>
    <item>
      <title>bsag: Shadow sister</title>
      <description>&lt;p&gt;[Something I wrote in my head at the end of last week, cycling home.]&lt;/p&gt;

&lt;p&gt;The bright full moon is floating down the river, trembling and fractured by the breeze. A rider's lamp behind me spawns my shadow sister, moving in front of me, solid and hunched against the chill. She weaves left and right, now skimming across the grass, now sliding over the gravel path. I'm fascinated by my projected self, encountering the future ahead of me, but keeping me company on this cold, dark night.&lt;/p&gt;

&lt;p&gt;Eventually, the rider passes me. My shadow sister slows then disappears, and I feel a sudden ridiculous pang of loss for something which was just a trick of the light. Despite knowing how she was born, I find myself looking for her for the rest of the journey, wondering if she's around the next corner, or waiting for me in the trees.&lt;/p&gt;
      
&lt;p&gt;&lt;a href='http://feeds.feedburner.com/~a/butshesagirl?a=2Cptrl'&gt;&lt;img src='http://feeds.feedburner.com/~a/butshesagirl?i=2Cptrl' border='0'/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class='feedflare'&gt;
&lt;a href='http://feeds.feedburner.com/~f/butshesagirl?a=pceaN'&gt;&lt;img src='http://feeds.feedburner.com/~f/butshesagirl?i=pceaN' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/~f/butshesagirl?a=4YegN'&gt;&lt;img src='http://feeds.feedburner.com/~f/butshesagirl?i=4YegN' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/~f/butshesagirl?a=JoS0n'&gt;&lt;img src='http://feeds.feedburner.com/~f/butshesagirl?i=JoS0n' border='0'/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=iPflN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=iPflN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Ke7Hn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Ke7Hn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=wFP7N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=wFP7N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Gvvbn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Gvvbn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=1oGgN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=1oGgN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=6oryn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=6oryn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 18:10:06 -0600</pubDate>
      <guid>tag:rousette.org.uk,2008:blog/1.3386</guid>
      <author>bsag</author>
      <source>http://feeds.feedburner.com/%7Er/butshesagirl/%7E3/457456809/</source>
      <link>http://feeds.feedburner.com/%7Er/butshesagirl/%7E3/457456809/</link>
      <category>bike</category>
      <category>random_mumblings</category>
    </item>
    <item>
      <title>Gilbert Guttmann: My ideal Spaces setup</title>
      <description>When Apple announced &lt;a href='http://www.apple.com/macosx/features/spaces.html'&gt;Spaces&lt;/a&gt; for Leopard, I was not that excited. I've never been a fan of Virtual Desktops because I thought they would just distract rather than offer any use. You know, another one of these neat looking toy features.

I was so wrong.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=5Bd9N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=5Bd9N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=DGkyn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=DGkyn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=oiJ0N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=oiJ0N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=3Sxqn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=3Sxqn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=H4bXN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=H4bXN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Topln"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Topln" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 17:49:58 -0600</pubDate>
      <guid>http://www.wildbit.com/?p=308</guid>
      <author>Gilbert Guttmann</author>
      <source>http://feeds.feedburner.com/%7Er/Tidbit/%7E3/457423289/</source>
      <link>http://feeds.feedburner.com/%7Er/Tidbit/%7E3/457423289/</link>
      <category>development</category>
      <category>tips_&amp;_tools</category>
      <category>leopard</category>
      <category>mac_os_x</category>
      <category>productivity</category>
      <category>spaces</category>
      <category>virtual_desktops</category>
    </item>
    <item>
      <title>David: New Rails 2.2 i18n defaults</title>
      <description>&lt;p&gt;I just reduced the housework needed to setup a new Rails application with i18n. All new applications will ship with a config/locales directory that’s automatically wired up in the load path for i18n. So you can just drop .yml or .rb locale files in there and they’ll be instantly available for translation.&lt;/p&gt;


  &lt;p&gt;There’s also a sample config/locales/en.yml file in there to give you a starting point. In addition, the initializer is now wired up through the Rails config. The new default environment.rb provides these pointers:&lt;/p&gt;


&lt;pre&gt;# The internationalization framework can be changed 
# to have another default locale (standard is :en) or more load paths.
# All files from config/locales/*.rb,yml are added automatically.
# config.i18n.load_path &amp;lt;&amp;lt; Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
# config.i18n.default_locale = :de&lt;/pre&gt;

  &lt;p&gt;So on a fresh Rails 2.2 application, you’ll be able to do see it all wired up out of the box (the :hello key is from the config/locales/en.yml demo file):&lt;/p&gt;


&lt;pre&gt;$ ./script/console
&amp;gt;&amp;gt; I18n.t :hello
=&amp;gt; "Hello world"&lt;/pre&gt;

  &lt;p&gt;Rails 2.2 final is just around the corner. We’ve been ironing out the last bugs and added the last amount of polish to make this a kick ass release. Also, work on 2.3 / 3.0 has already begun in master as well since we’ve branched for 2.2 a while back.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=mNpoN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=mNpoN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=UGrvn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=UGrvn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=xc7XN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=xc7XN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=SpIXn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=SpIXn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=qPbJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=qPbJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=9DXxn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=9DXxn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 13:44:00 -0600</pubDate>
      <guid>tag:weblog.rubyonrails.com,2008-11-18:22826</guid>
      <author>David</author>
      <source>http://feeds.feedburner.com/%7Er/RidingRails/%7E3/457192457/new-rails-2-2-i18n-defaults</source>
      <link>http://feeds.feedburner.com/%7Er/RidingRails/%7E3/457192457/new-rails-2-2-i18n-defaults</link>
      <category>documentation</category>
    </item>
    <item>
      <title>Graeme Mathieson: Rubaidh&amp;#8217;s new office sign</title>
      <description>Rubaidh Ltd has recently moved in to new offices in Musselburgh, and this morning I came in to discover that the folks who run the building have put up a sign for our office.  Shiny, eh?

While I&amp;#8217;m posting, I&amp;#8217;d like to welcome Mark Connell, the newest member of Rubaidh&amp;#8217;s team.  He is a [...]&lt;div class='feedflare'&gt;
&lt;a href='http://feeds.feedburner.com/%7Ef/wossname?a=0rpun'&gt;&lt;img src='http://feeds.feedburner.com/%7Ef/wossname?i=0rpun' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/%7Ef/wossname?a=sJQen'&gt;&lt;img src='http://feeds.feedburner.com/%7Ef/wossname?i=sJQen' border='0'/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src='http://feeds.feedburner.com/%7Er/wossname/%7E4/457102867' height='1' width='1'/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=rqB0N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=rqB0N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=1o1bn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=1o1bn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=dMbSN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=dMbSN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=1Dwtn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=1Dwtn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=LvXbN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=LvXbN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=FEeun"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=FEeun" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 11:55:27 -0600</pubDate>
      <guid>http://woss.name/2008/11/18/rubaidhs-new-office-sign/</guid>
      <author>Graeme Mathieson</author>
      <source>http://feeds.feedburner.com/%7Er/wossname/%7E3/457102867/</source>
      <link>http://feeds.feedburner.com/%7Er/wossname/%7E3/457102867/</link>
      <category>uncategorized</category>
    </item>
    <item>
      <title>chad: Scotland on Rails Call for Proposals</title>
      <description>&lt;p&gt;Being an organizers of Ruby conferences myself, I always enjoy going to the regional conferences.  I’ve been to the &lt;a href='http://mtnwestrubyconf.org/'&gt;Mountain West RubyConf&lt;/a&gt;, &lt;a href='http://www.rubyhoedown.com/'&gt;Ruby Hoedown&lt;/a&gt; and &lt;a href='http://site.locaweb.com.br/railssummit/default.asp?language=7'&gt;Rails Summit Latin America&lt;/a&gt;.  Each was excellent in its own unique way. It’s also a great pleasure for me to attend a conference I’m not organizing.&lt;/p&gt;


  &lt;p&gt;So I’m looking forward to the upcoming &lt;a href='http://scotlandonrails.com/'&gt;Scotland on Rails&lt;/a&gt; in March.  &lt;a href='http://marcelmolina.com/'&gt;Marcel&lt;/a&gt; and I will be presenting a tutorial for charity at this year’s conference.&lt;/p&gt;


  &lt;p&gt;I’ve heard great things about last year’s Scotland on Rails, and I trust my friends in Scotland to put on an excellent show.  If you haven’t been to Edinburgh, you owe yourself a trip.  It’s an incredibly beautiful city.&lt;/p&gt;


  &lt;p&gt;What better way to explore new lands than to do it by invitation as a speaker?  Scotland on Rails has opened its &lt;a href='http://scotlandonrails.com/proposals.html'&gt;Call for Proposals&lt;/a&gt; (it’s been open for a while, but I’m slow).  The &lt;span class='caps'&gt;CFP&lt;/span&gt; closes in 2 weeks (December 1st), so if you’re interested in speaking don’t be late.  From what &lt;a href='http://www.cardboardsoftware.com/'&gt;Alan&lt;/a&gt; tells me, they are especially interested in hearing how to do &lt;span class='caps'&gt;BIG&lt;/span&gt; projects with Ruby and Rails.&lt;/p&gt;


  &lt;p&gt;Hope to see you there.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=nyH7N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=nyH7N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=nHIJn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=nHIJn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Jy10N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Jy10N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=lgy9n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=lgy9n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=urY0N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=urY0N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=mV8un"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=mV8un" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 18 Nov 2008 04:51:00 -0600</pubDate>
      <guid>tag:www.chadfowler.com,2008-11-18:19467</guid>
      <author>chad</author>
      <source>http://www.chadfowler.com/2008/11/18/scotland-on-rails-call-for-proposals</source>
      <link>http://www.chadfowler.com/2008/11/18/scotland-on-rails-call-for-proposals</link>
      <category>conferences</category>
      <category>rails</category>
    </item>
    <item>
      <title>Jamis: Vim Follow-up</title>
      <description>&lt;p&gt;So, it’s been over a month and a half since I &lt;a href='http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim'&gt;switched back to Vim&lt;/a&gt;, and I figured I’d post a bit about how things are going.&lt;/p&gt;


  &lt;p&gt;I &lt;strong&gt;love&lt;/strong&gt; it. Though the future is notoriously difficult to foretell, I think it’s safe to say that I won’t be switching editors again anytime soon. Vim is where it’s at, for me.&lt;/p&gt;


  &lt;p&gt;Here’s the combination of plugins and such that I’ve found work best for me.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=f1Z8N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=f1Z8N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=RPCxn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=RPCxn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=g5AGN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=g5AGN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=TnVPn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=TnVPn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=UUcLN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=UUcLN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=yxV8n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=yxV8n" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Mon, 17 Nov 2008 19:09:00 -0600</pubDate>
      <guid>tag:weblog.jamisbuck.org,2008-11-17:5474</guid>
      <author>Jamis</author>
      <source>http://weblog.jamisbuck.org/2008/11/17/vim-follow-up</source>
      <link>http://weblog.jamisbuck.org/2008/11/17/vim-follow-up</link>
      <category>tips_&amp;_tricks</category>
      <category>vim</category>
    </item>
    <item>
      <title>dhh: Myth #6: Rails only speaks English</title>
      <description>&lt;p&gt;It used to be somewhat inconvenient to deal with UTF-8 in Rails because Ruby's primary method of dealing with them was through regular expressions. If you just did a naïve string operation, you'd often be surprised by results and think that Ruby was somehow fundamentally unable to deal with UTF-8. &lt;/p&gt;

&lt;p&gt;Take the string "Iñtërnâtiônàlizætiøn". If you were to do a string[0,2] operation and expected to get the two first characters back, you'd get "I\303" because Ruby operated on the byte level, not the character level. And UTF-8 characters can be multibyte, so you'd only get 1.5 characters back. Yikes!&lt;/p&gt;

&lt;p&gt;Rails dealt with this &lt;a href='http://weblog.rubyonrails.org/2007/1/19/rails-1-2-rest-admiration-http-lovefest-and-utf-8-celebrations'&gt;long ago&lt;/a&gt; by introducing a &lt;a href='http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html'&gt;character proxy&lt;/a&gt; on top of strings that is UTF-8 safe. Now you can just do s.first(2) and you'll get the two first characters back. No surprises. Everything inside of Rails uses this, so validations, truncating, and what have you is all UTF-8 safe.&lt;/p&gt;

&lt;p&gt;Not only that, but we actually assume that all operations are going to happen with UTF-8. The default charset for responses sent with Rails is UTF-8. The default charset for database operations is UTF-8. So Rails assumes that everything coming in, everything going out, and all that's being manipulated is UTF-8.&lt;/p&gt;

&lt;p&gt;This is a long way of saying that Rails is perfectly capable of dealing with all kinds of international texts that can be described in UTF-8. The early inconveniences of Ruby's regular expression-based approach has long been superseded. You need no longer worry that Rails doesn't speak your language. Basecamp, for example, has content in some 70+ languages at least. It works very well.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;But what about translations and locales?&lt;/b&gt;
&lt;br/&gt;It was long a point of contention that Rails didn't ship with a internationalization framework in the box. There has, however, long been a wide variety of plugins that added this support. There was localize, globalize, and many others. Each with their own strengths and tailored to different situations.&lt;/p&gt;

&lt;p&gt;All these plugins have powered Rails applications in other languages than English for a long time. Some made it possible to translate strings to multiple languages, others just made Rails work well for one other given language. But whatever your translation need was, there was probably a plugin out there that did it.&lt;/p&gt;

&lt;p&gt;But obviously things could be better and with Rails 2.2 we've made them a whole lot more so. Rails 2.2 ships with &lt;a href='http://www.artweb-design.de/2008/7/18/the-ruby-on-rails-i18n-core-api'&gt;a simple internationalization framework&lt;/a&gt; that makes it silly easy to do translations and locales. There's a dedicated &lt;a href='http://groups.google.com/group/rails-i18n'&gt;discussion group&lt;/a&gt;, &lt;a href='http://rails-i18n.org/wiki'&gt;wiki&lt;/a&gt;, and &lt;a href='http://rails-i18n.org/'&gt;website&lt;/a&gt; for getting familiar with this work. I've been using it in a test with translating Basecamp to Danish and really like what I'm seeing.&lt;/p&gt;

&lt;p&gt;So in summary, Rails is very capable of making sites that need to be translated into many different locales. Before Rails 2.2, you'd have to use one of the many plugins. After Rails 2.2, you can use what's in the box for most cases (or add additional plugins for more exotic support).&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Don't forget about time zones!&lt;/b&gt;
&lt;br/&gt;Dealing well with content in UTF-8 and translating your application into many languages goes a long way to make your application ready for the world, but most sites also need to deal with time. When you deal with time in a global setting, you also need to deal with time zones.&lt;/p&gt;

&lt;p&gt;I'm incredibly proud of the outstanding work that Geoff Buesing lead for the implementation of time zones in Rails 2.1. It's amazing how Geoff and team were able to reduce something so complex to something so simple. And it shows the great power of being an full-stack framework. Geoff was able to make changes to Rails, Action Pack, and Active Record to make the entire experience seamless.&lt;/p&gt;

&lt;p&gt;To lean more about time zones in Rails, see &lt;a href='http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/'&gt;Geoff's tutorial&lt;/a&gt; or watch &amp;lt;a href=http://railscasts.com/episodes/106""&amp;gt;the Railscast on Time Zones.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;See the &lt;a href='http://www.loudthinking.com/posts/29-the-rails-myths'&gt;Rails Myths&lt;/a&gt; index for more myths about Rails.&lt;/i&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=L3MZN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=L3MZN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=IQC3n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=IQC3n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=vXbaN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=vXbaN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=JWH7n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=JWH7n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=EfX8N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=EfX8N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=rGtJn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=rGtJn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Mon, 17 Nov 2008 11:35:00 -0600</pubDate>
      <guid>tag:www.loudthinking.com,2007:Post35</guid>
      <author>dhh</author>
      <source>http://feeds.feedburner.com/%7Er/LoudThinking/%7E3/455891372/35-myth-6-rails-only-speaks-english</source>
      <link>http://feeds.feedburner.com/%7Er/LoudThinking/%7E3/455891372/35-myth-6-rails-only-speaks-english</link>
    </item>
    <item>
      <title>jnunemaker: HappyMapper, Making XML Fun Again</title>
      <description>&lt;p&gt;In which I show that &lt;span class='caps'&gt;XML&lt;/span&gt; does not have to suck—instead you can just HappyMap it!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=YZFLN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=YZFLN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=rJQSn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=rJQSn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=nF0iN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=nF0iN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=md0nn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=md0nn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=9JrCN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=9JrCN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=yWS6n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=yWS6n" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Mon, 17 Nov 2008 07:10:00 -0600</pubDate>
      <guid>tag:railstips.org,2008-11-17:8402</guid>
      <author>jnunemaker</author>
      <source>http://feeds.feedburner.com/%7Er/railstips/%7E3/455693306/happymapper-making-xml-fun-again</source>
      <link>http://feeds.feedburner.com/%7Er/railstips/%7E3/455693306/happymapper-making-xml-fun-again</link>
      <category>gems</category>
      <category>specifically_ruby</category>
      <category>happymapper</category>
      <category>xml</category>
    </item>
    <item>
      <title>ben: The New(ish) Bleything.net</title>
      <description>&lt;p&gt;While I’m completely sure that nobody ever goes to &lt;a href='http://www.bleything.net/'&gt;bleything.net&lt;/a&gt;, I have nevertheless put far more time than is necessary or reasonable into it over the past couple of weeks.&lt;/p&gt;


  &lt;p&gt;Inspired by my former LiveJournal coworker &lt;a href='http://www.davidrecordon.com/'&gt;David Recordon&lt;/a&gt;, I added “recent activity” updates to bleything.net.  It now shows you my recent tweets (with @s filtered out), my recent FireEagle updates, and GitHub activity.&lt;/p&gt;


  &lt;p&gt;There’s more coming, but I’ll save that for when I actually release it.  I’m still working on the relaunch of this blog, but I’ve gotten sidetracked in javascript wankery.  Once everything’s done and the dust has settled, I’ll be doing a series on all the code I wrote for this round of site updates… there’s some fun stuff involved.&lt;/p&gt;


  &lt;p&gt;As a preview, here’s a snippet of the script that fetches updates from GitHub:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;when&lt;/span&gt; &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;CommitEvent&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:type&lt;/span&gt;      ] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;GitHubCommit&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:commit_id&lt;/span&gt; ] = update.links.first.href.split( &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;/&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; ).last&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:target&lt;/span&gt;    ] = update.title.txt.match( &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='ch'&gt;\w&lt;/span&gt;&lt;span class='k'&gt;+&lt;/span&gt;&lt;span class='ch'&gt;\/&lt;/span&gt;&lt;span class='ch'&gt;\w&lt;/span&gt;&lt;span class='k'&gt;+&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt; )[&lt;span class='i'&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:text&lt;/span&gt;      ] = Hpricot( update.content ).at( &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;//p[2]&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; ).inner_html.strip&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;when&lt;/span&gt; &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;DeleteEvent&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:type&lt;/span&gt;   ] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;GitHubDelete&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:target&lt;/span&gt; ] = update.title.txt.match( &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='ch'&gt;\w&lt;/span&gt;&lt;span class='k'&gt;+$&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt; )[&lt;span class='i'&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;when&lt;/span&gt; &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;ForkEvent&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:type&lt;/span&gt;   ] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;GitHubFork&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:target&lt;/span&gt; ] = update.title.txt.match( &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='ch'&gt;\w&lt;/span&gt;&lt;span class='k'&gt;+&lt;/span&gt;&lt;span class='ch'&gt;\/&lt;/span&gt;&lt;span class='ch'&gt;\w&lt;/span&gt;&lt;span class='k'&gt;+&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt; )[&lt;span class='i'&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;when&lt;/span&gt; &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;FollowEvent&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  username     = update.title.txt.match( &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='ch'&gt;\w&lt;/span&gt;&lt;span class='k'&gt;+$&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt; )[&lt;span class='i'&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;  profile_page = Hpricot( open(&lt;span class='s'&gt;&lt;span class='dl'&gt;"&lt;/span&gt;&lt;span class='k'&gt;http://github.com/&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;#{&lt;/span&gt;username&lt;span class='dl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;"&lt;/span&gt;&lt;/span&gt;) )&lt;tt&gt;
&lt;/tt&gt;  realname     = profile_page.at( &lt;span class='s'&gt;&lt;span class='dl'&gt;"&lt;/span&gt;&lt;span class='k'&gt;span#profile_name&lt;/span&gt;&lt;span class='dl'&gt;"&lt;/span&gt;&lt;/span&gt; ).inner_html.strip&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:type&lt;/span&gt;   ] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;GitHubFollow&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:target&lt;/span&gt; ] = username&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:text&lt;/span&gt;   ] = realname&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;when&lt;/span&gt; &lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;WatchEvent&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:type&lt;/span&gt;   ] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;GitHubWatch&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  update_hash[ &lt;span class='sy'&gt;:target&lt;/span&gt; ] = Hpricot( update.content ).at( &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;//a&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; ).inner_html.strip&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


  &lt;p&gt;Look for more soon!&lt;/p&gt;
          &lt;div class='feedflare'&gt;
&lt;a href='http://feeds.feedburner.com/%7Ef/bleything/blog?a=Z5ivN'&gt;&lt;img src='http://feeds.feedburner.com/%7Ef/bleything/blog?i=Z5ivN' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/%7Ef/bleything/blog?a=c7PmN'&gt;&lt;img src='http://feeds.feedburner.com/%7Ef/bleything/blog?i=c7PmN' border='0'/&gt;&lt;/a&gt; &lt;a href='http://feeds.feedburner.com/%7Ef/bleything/blog?a=E3RtN'&gt;&lt;img src='http://feeds.feedburner.com/%7Ef/bleything/blog?i=E3RtN' border='0'/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src='http://feeds.feedburner.com/%7Er/bleything/blog/%7E4/455653438' height='1' width='1'/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=AJviN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=AJviN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=TPMSn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=TPMSn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=b7jkN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=b7jkN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=8ksgn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=8ksgn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=zSlWN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=zSlWN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=a8BQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=a8BQn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Mon, 17 Nov 2008 06:16:00 -0600</pubDate>
      <guid>tag:blog.bleything.net,2008-11-17:6982</guid>
      <author>ben</author>
      <source>http://feeds.feedburner.com/%7Er/bleything/blog/%7E3/455653438/the-new-ish-bleything-net</source>
      <link>http://feeds.feedburner.com/%7Er/bleything/blog/%7E3/455653438/the-new-ish-bleything-net</link>
      <category>administrivia</category>
      <category>announcements</category>
      <category>ruby,_rails,_and_related</category>
      <category>bleything.net</category>
      <category>fireeagle</category>
      <category>github</category>
      <category>merb</category>
      <category>twitter</category>
    </item>
    <item>
      <title>dhh: Myth #5: Rails is hard because of Ruby</title>
      <description>&lt;p&gt;I've talked to lots of PHP and Java programmers who love the idea and concept of Rails, but are afraid of stepping in because of Ruby. The argument goes that since they already know PHP or Java, that it would be less work to just pick one of the Rails knockoffs in those languages. I really don't think so.&lt;/p&gt;

&lt;p&gt;Ruby is actually an amazingly simple language to pickup the basics on. Yes, there's a lot of depth in the meta programming corners, but you really don't need to go there to get stuff done. Certainly not to get going. The base mechanics of getting productive takes much shorter than you likely think.&lt;/p&gt;

&lt;p&gt;After all, Ruby is neither LISP nor Smalltalk. It's not a completely new and alien world if you're coming from PHP or Java. Lots of concepts and constructs are the same. The code even looks similar in many cases, just stated more succinctly.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Learn Ruby in the time it would take to learn a framework&lt;/b&gt;
&lt;br/&gt;I'd argue that most programmers could get up and running in Ruby in about the same time it would take them to learn another framework in their current language anyway. I know it sounds a lot more scary to learn a whole new language rather than just another framework, but it really isn't.&lt;/p&gt;

&lt;p&gt;The number one piece of feedback I get from people who dreaded the jump but did it anyway is: Why didn't I do this sooner?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Learn while doing something real that matters to you&lt;/b&gt;
&lt;br/&gt;Also, speaking from my own experience learning Ruby, I'd actually recommend trying to do something real. Don't just start with the basics of the language in a vacuum. Pick something you actually want done and just start doing it one step of the time. You'll learn as you go along and you'll have to motivation to keep it up because stuff is coming alive.&lt;/p&gt;

&lt;p&gt;So don't write off Rails because you don't know Ruby. Your fears of starting from scratch again will quickly make way for the joy of the new language and you'll get to use the real Rails as a reward. Come on in, the water is fine!&lt;/p&gt;

&lt;p&gt;&lt;i&gt;See the &lt;a href='http://www.loudthinking.com/posts/29-the-rails-myths'&gt;Rails Myths&lt;/a&gt; index for more myths about Rails.&lt;/i&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=hjkeN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=hjkeN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=G1Whn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=G1Whn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=G9mqN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=G9mqN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=OZrYn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=OZrYn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=WbwHN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=WbwHN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=Damfn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=Damfn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Sat, 15 Nov 2008 20:10:00 -0600</pubDate>
      <guid>tag:www.loudthinking.com,2007:Post34</guid>
      <author>dhh</author>
      <source>http://feeds.feedburner.com/%7Er/LoudThinking/%7E3/454253303/34-myth-5-rails-is-hard-because-of-ruby</source>
      <link>http://feeds.feedburner.com/%7Er/LoudThinking/%7E3/454253303/34-myth-5-rails-is-hard-because-of-ruby</link>
    </item>
    <item>
      <title>tobi: Passenger</title>
      <description>&lt;p&gt;So there is a lot of talk about &lt;a href='http://www.modrails.com/'&gt;Phusion Passenger&lt;/a&gt; lately and I feel the need to chime in here. David pointed out that &lt;a href='http://loudthinking.com/posts/30-myth-1-rails-is-hard-to-deploy'&gt;Shopify is running on passenger&lt;/a&gt; which is something I &lt;a href='http://twitter.com/tobi/statuses/922799148'&gt;announced on Twitter&lt;/a&gt; a few months ago.&lt;/p&gt;


  &lt;p&gt;Some context on Shopify’s installation: We launched Shopify originally on Lighttpd with FastCGI and later migrated to nginx with mongrels. Obviously we had to use HAProxy between Nginx and mongrels to avoid the dreaded “queue behind long running process” problem. We also added Monit to the mix which observed all mongrels to make sure that everything  is running according to plan. After a process reaches 260 mb of memory we signal it to shut down after the next request so that a new one can start out with less memory. For this we added runit to the mix which supervises the mongrels and starts them up quickly once they hit the ground.&lt;/p&gt;


  &lt;p&gt;It’s important to note that we are not talking about a memory leak here. The reason for the 260mb ceiling comes from two issues with Ruby’s garbage collector:&lt;/p&gt;


  &lt;ol&gt;
  &lt;li&gt;It allocates memory in very large chunks once the available memory gets low. This means a 140mb process increases to 260mb in a single go. It also never gives memory back to the operating system because Ruby’s GC is not able to move objects. Once it adds an object into the newly allocated space and that object remains alive, it cannot yield memory back to the OS. &lt;/li&gt;
    &lt;li&gt;Because Ruby’s garbage collector uses mark and sweep it has to traverse the entire memory space in search of pointers. There are no generations that help with that. It means that GC cycles become longer and longer the more memory is available. &lt;del&gt;-Rails mitigates these issues by moving a full GC run behind a &lt;span class='caps'&gt;HTTP&lt;/span&gt; response, into the time period when the process is waiting for a new request&lt;/del&gt; (&lt;strong&gt;Update:&lt;/strong&gt; Rails doesn’t do this anymore) but performance monitoring tools such as &lt;a href='https://rpm.newrelic.com/'&gt;NewRelic&lt;/a&gt; clearly show that average response times is directly correlated with the amount of memory used across the server farm.&lt;/li&gt;
  &lt;/ol&gt;


  &lt;p&gt;Now why did we switch to Passenger? Simple: the keyword is &lt;strong&gt;remove moving parts&lt;/strong&gt;.&lt;/p&gt;


  &lt;p&gt;Every additional tool you add will come with it’s own bugs. Many people I talked to over the past years considered haproxy to be the most solid piece of infrastructure in their stack but even there was a really &lt;a href='http://haproxy.1wt.eu/news.html'&gt;nasty bug&lt;/a&gt; recently (search for request queue handling).&lt;/p&gt;


  &lt;p&gt;We treat our server farm very similar to Shopify’s codebase. We are in this for the long haul and we cannot accept complex solutions when simple ones present themselves. Maintainability of our code and servers is paramount to the long term success of our product. Yes the Mongrel setup worked very well but Passenger allowed us to remove: Nginx, Haproxy, Runit and Monit. That’s a nice refactoring!&lt;/p&gt;


  &lt;p&gt;At the same time Passenger introduced some tangible improvements. We switched to enterprise ruby to get the full benefit of the &lt;acronym title='Copy on Write'&gt;COW&lt;/acronym&gt; memory characteristics and we can absolutely confirm the memory savings of 30%  some others have reported. This is many thousand dollars of savings even at today’s hardware prices. We allow Passenger to adaptively spawn more processes with demand but most of the time our application servers are running about 40 processes to handle more than a million dynamic requests a day. However, because passenger constantly despawns and respawns rails processes they always stay fresh, run short GC cycles and are generally a lot more responsive. All this means that the total amount of memory that is used by Shopify during normal operations went from average of 9GB to an average of 5GB. We evenly distributed the savings amongst more Shopify processes and more memcached space which moved our average response time from 210ms to 130ms while traffic grew 30% in the last few months.&lt;/p&gt;


  &lt;p&gt;In conclusion: I cannot see any reason to choose a different deployment strategy at this point. Its simple, complete, fast and well documented.&lt;/p&gt;
          
&lt;p&gt;&lt;a href='http://feeds.feedburner.com/%7Ea/too-biased/xml?a=ReWzZ7'&gt;&lt;img src='http://feeds.feedburner.com/%7Ea/too-biased/xml?i=ReWzZ7' border='0'/&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src='http://feeds.feedburner.com/%7Er/too-biased/xml/%7E4/454187351' height='1' width='1'/&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=JyEEN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=JyEEN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=jjg7n"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=jjg7n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=NI4FN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=NI4FN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=luApn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=luApn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=LMLrN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=LMLrN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=CJvYn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=CJvYn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Sat, 15 Nov 2008 18:14:00 -0600</pubDate>
      <guid>tag:blog.leetsoft.com,2008-11-15:4625</guid>
      <author>tobi</author>
      <source>http://feeds.feedburner.com/%7Er/too-biased/xml/%7E3/454187351/passenger</source>
      <link>http://feeds.feedburner.com/%7Er/too-biased/xml/%7E3/454187351/passenger</link>
      <category>code</category>
      <category>rails</category>
    </item>
    <item>
      <title>dhh: Myth #4: Rails is a monolith</title>
      <description>&lt;p&gt;Rails is often accused of being a big monolithic framework. The charges usually contend that its intense mass makes it hard for people to understand the inner workings, thus making it hard to patch the framework, and that it results in slow running applications. Oy, let's start at the beginning.&lt;/p&gt;

&lt;p&gt;Measuring lines of code is used to gauge the rough complexity of software. It's an easy but also incredibly crude way of measuring that rarely yields anything meaningful unless you apply intense rigor to the specifics. Most measurements of LOCs apply hardly any rigor and reduces what could otherwise be a somewhat useful indicator to an inverse dick measurement match.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Applying rigor to measuring LOCs in Rails&lt;/b&gt;
&lt;br/&gt;The measurements of LOC in Rails have not failed to live up to the low standards traditionally set for these pull-down-your-pants experiments. Let's look at a few common mistakes people commit when trying to measure the LOCs in Rails:&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;&lt;li&gt;They count all lines including comments and whitespace in Ruby files, thus punishing well-documented and formatted code&lt;/li&gt;&lt;li&gt;They count tests, thus punishing well-tested code&lt;/li&gt;&lt;li&gt;They count bundled dependencies, thus punishing dependency-free code&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Now let's take a simple example of committing all these mistakes against a part of Rails and see how misleading the results turn out to be. I'm going to use Action Mailer as an example here:&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;&lt;li&gt;12,406 lines including comments, whitespace, tests, and dependencies&lt;/li&gt;&lt;li&gt;7,912 lines including tests and dependencies&lt;/li&gt;&lt;li&gt;6,409 lines including dependencies (t-mail and text-format)&lt;/li&gt;&lt;li&gt;667 lines with none of the above&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;So the difference between committing all the mistakes and reality is a factor of 20. Even just the difference between committing the dependency mistake and reality is a factor of 10! In reality, if you were to work on Action Mailer for a patch, you would only have to comprehend a framework of 667 lines. A much less challenging task than digging into 12,406 lines.&lt;/p&gt;

&lt;p&gt;Rails measured with all it's six major components without the mistakes is 34,097 lines divided across Action Mailer at 667, Active Resource at 878, Active Support at 6,684, Active Record at 9,295, Action Pack at 11,117 (the single piece most web frameworks should be comparing themselves to unless they also ship as a full stack), and Rail Ties at 5,447.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Looking at the monolithic charge&lt;/b&gt;
&lt;br/&gt;That Rails is big in terms of lines of code is just one of the charges, though. More vague and  insidious is the charge that Rails is monolithic. That is one giant mass where all the pieces depend on each other and are intertwined in hard-to-understand ways. That it lacks coherence and cohesion.&lt;/p&gt;

&lt;p&gt;First, Rails can include almost as much or as little of the six major pieces as you prefer. If you're making an application that doesn't need Action Mailer, Active Resource, or Active Record, you can swiftly cut them out of your runtime by uncommenting the following statement in config/environment.rb:&lt;/p&gt;

&lt;p&gt;&lt;pre style='font-size: 10px;'&gt;# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Now you've reduced your reliance on Rails to the 23,248 lines in Action Pack, Active Support, and Rail Ties. But let's dig deeper and look at the inner workings of Action Pack and how much of that fits the monolithic charge. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Taking out the optional parts&lt;/b&gt;
&lt;br/&gt;The Action Controller part of Action Pack consists of 8,282 lines which breaks down into two major halves. The essential, stuff that's needed to run the bare minimum of controllers, and the optional that adds specific features, which you could do without.&lt;/p&gt;

&lt;p&gt;First the essentials of which there are 3,797 lines spread across these files and directories: base.rb, cgi_ext, cgi_ext.rb, cgi_process.rb, cookies.rb, dispatcher.rb, headers.rb, layout.rb, mime_type.rb, mime_types.rb, request.rb, response.rb, routing, routing.rb, session, session_management.rb, status_codes.rb, url_rewriter.rb.&lt;/p&gt;

&lt;p&gt;The more interesting part is the optional parts of which there are 3,481 lines spread across these files and directories: assertions, assertions.rb, benchmarking.rb, caching, caching.rb, components.rb, filters.rb, flash.rb, helpers.rb, http_authentication.rb, integration.rb, mime_responds.rb, performance_test.rb, polymorphic_routes.rb, rack_process.rb, record_identifier.rb, request_forgery_protection.rb, request_profiler.rb, rescue.rb, resources.rb, streaming.rb, test_case.rb, test_process.rb, translation.rb, verification.rb.&lt;/p&gt;

&lt;p&gt;All these optional parts can actually very easily be turned off as well, if you so please. If you look at actionpack/lib/action_controller.rb, you'll see something like the following:&lt;/p&gt;

&lt;p&gt;&lt;pre style='font-size: 10px; line-height: 6px;'&gt;ActionController::Base.class_eval do
&lt;br/&gt;  include ActionController::Flash
&lt;br/&gt;  include ActionController::Benchmarking
&lt;br/&gt;  include ActionController::Caching
&lt;br/&gt;  ...&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;This is where all the optional bits are being mixed into Action Pack. But they didn't need to be. If you really wanted to, you could just edit this 1 file and remove the optional bits you didn't need and you'd have some 3,500 lines of optional goodies to pick from.&lt;/p&gt;

&lt;p&gt;For example, let's say you didn't need caching in your application. You comment the &lt;code&gt;include ActionController::Caching&lt;/code&gt; line out and delete the associated files and that's 349 lines for the savings there. Or let's say that you don't like the flash, that's another 96 lines. &lt;/p&gt;

&lt;p&gt;The reason many of these pieces can be optional is because of a wonderful part of Active Support called alias_method_chain. With alias_method_chain, you can latch on to a method to embellish it with more stuff. For example, the Benchmarking module uses alias_method_chain like this to hook into perform_action and render:&lt;/p&gt;

&lt;p&gt;&lt;pre style='font-size: 10px; line-height: 6px;'&gt;
&lt;br/&gt;module Benchmarking
&lt;br/&gt;  def self.included(base)
&lt;br/&gt;    base.extend(ClassMethods)
&lt;br/&gt; 
&lt;br/&gt;    base.class_eval do
&lt;br/&gt;      alias_method_chain :perform_action, :benchmark
&lt;br/&gt;      alias_method_chain :render, :benchmark
&lt;br/&gt;    end
&lt;br/&gt;  end&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;ActionController::Base declares render and perform_action, but doesn't know anything about benchmarking (why should it?). The Benchmarking modules adds in these concerns when it's included similar to how aspects work. So as you can see, alias_method_chain is a great enabler for clearly defined modules in Rails.&lt;/p&gt;

&lt;p&gt;All the other frameworks in Rails works in a similar fashion. There's a handful of essential parts and then a handful of optional parts, which can use alias_method_chain if they need to decorate some of the essential pieces. This means that the code is very well defined and you can look at just a single piece in isolation.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;But why on earth would you bother?&lt;/b&gt;
&lt;br/&gt;The analysis above of how you can bring Action Controller down to some 3,500 lines carefully side-stepped one important question: Why would you bother? And that's an answer I don't quite have for you. &lt;/p&gt;

&lt;p&gt;The important part about being modular is that the pieces are understandable in isolation. That the individual modules have coherence and cohesion. Not that they're actually handed to you as a puzzle for you to figure out how to put together.&lt;/p&gt;

&lt;p&gt;I'd much rather give someone a complete picture, which they can then turn into a puzzle if they're so inclined. As I've shown you above, it's actually really simple to deconstruct the frameworks in Rails and you can make them much smaller really easily if you decide that's a good use of your time and energy.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;See the &lt;a href='http://www.loudthinking.com/posts/29-the-rails-myths'&gt;Rails Myths&lt;/a&gt; index for more myths about Rails.&lt;/i&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=cxj2N"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=cxj2N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=09Fqn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=09Fqn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=6twwN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=6twwN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=wG6qn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=wG6qn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=XDzHN"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=XDzHN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/planetrubyonrails?a=kmRpn"&gt;&lt;img src="http://feeds.feedburner.com/~f/planetrubyonrails?i=kmRpn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <pubDate>Sat, 15 Nov 2008 15:11:00 -0600</pubDate>
      <guid>tag:www.loudthinking.com,2007:Post33</guid>
      <author>dhh</author>
      <source>http://feeds.feedburner.com/%7Er/LoudThinking/%7E3/454069020/33-myth-4-rails-is-a-monolith</source>
      <link>http://feeds.feedburner.com/%7Er/LoudThinking/%7E3/454069020/33-myth-4-rails-is-a-monolith</link>
    </item>
  </channel>
</rss>
