<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>crunchlife: Tag Ruby</title>
    <link>http://crunchlife.com/articles/tag/ruby</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Ruby Fractal Library and RMagick?</title>
      <description>&lt;p&gt;Sure, why not!  Thanks to Brian Jones, the &lt;a href="http://crunchlife.com/pages/ruby_fractal_library" target="_blank"&gt;Ruby Fractal Library&lt;/a&gt; now renders fractals with &lt;a href="http://rmagick.rubyforge.org/" target="_blank"&gt;RMagick&lt;/a&gt;.  Images can be saved in formats including, PNG, GIF, JPEG, and many others.  I was able to create an animated GIF displaying the magnification of the Feigenbaum point in less than 15 lines of code.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;feigenbaum&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mandelbrot&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;0.1528&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;1.0397&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;width&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;150&lt;/span&gt;
&lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;150&lt;/span&gt;
&lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;m&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;25&lt;/span&gt;
&lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;algorithm&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Algorithms&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;NormalizedIterationCount&lt;/span&gt;
&lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;theme&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Themes&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Water&lt;/span&gt;

&lt;span class="ident"&gt;image_list&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Magick&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;ImageList&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;span class="ident"&gt;image_list&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;delay&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;100&lt;/span&gt;
&lt;span class="ident"&gt;image_list&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;iterations&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;

&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;...&lt;/span&gt;&lt;span class="number"&gt;50&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;m&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;image_list&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Magick&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Image&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;from_blob&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;feigenbaum&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;draw&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;gif&lt;/span&gt;&lt;span class="punct"&gt;'))[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;

&lt;span class="ident"&gt;image_list&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;write&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;feigenbaum.gif&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;img src="/files/feigenbaum_loop.gif" class="photo" /&gt;
&lt;/center&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;The recent changes have caused a couple of breaking changes.  Now that RMagick is used, ImageMagick must be installed as a dependency.  I was against this at first, but RMagick&amp;#8217;s flexibility ultimately won me over (I couldn&amp;#8217;t resist the lure of animated fractals).  The Fractal.draw method now returns an image as a &lt;a href="http://en.wikipedia.org/wiki/BLOB" target="_blank"&gt;BLOB&lt;/a&gt;, but a save_as method has been provided to handle the writing of images to disk.  The curious can find that latest source code in the repo&amp;#8217;s trunk.  Stay tuned for more updates.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;svn checkout -r 10 http://svn.ryanbaxter.net/fractals/trunk fractals&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As always, I&amp;#8217;ll accept any comments, suggestions, or source code.  Thanks again to Brian for the RMagick submission.&lt;/p&gt;</description>
      <pubDate>Tue, 11 Nov 2008 12:06:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:149cb482-3711-40ad-999a-2c78389d5b7a</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/11/11/ruby-fractal-library-and-rmagick</link>
      <category>Code Snippets</category>
      <category>Fractals</category>
      <category>Ruby</category>
      <enclosure type="image/gif" length="511328" url="http://crunchlife.com/files/feigenbaum_loop.gif"/>
      <trackback:ping>http://crunchlife.com/articles/trackback/86</trackback:ping>
    </item>
    <item>
      <title>Ruby Fractal Library 1.1.0</title>
      <description>&lt;p&gt;&lt;img src="/files/feigenbaum.png" class="photo right"&gt;Between spending time with the baby and working on a new project (more to come), I&amp;#8217;ve found time to add a few features to the &lt;a href="http://crunchlife.com/pages/ruby_fractal_library"&gt;Ruby Fractal Library&lt;/a&gt;.  An Algorithms module now contains lambda expressions implementing both the &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set#Escape_time_algorithm" target="_blank"&gt;Escape Time&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set#Continuous_.28smooth.29_coloring" target="_blank"&gt;Normalized Iteration Count&lt;/a&gt; algorithms.  Users can also create their own lambda expressions and assign them to the Fractal class&#8217;s algorithm property. &lt;/p&gt;

&lt;p&gt;In the example below, I&#8217;ve show the difference between images rendered using the Escape Time and Normalized Iteration Count algorithms.  As you can see, the Normalized Iteration Count algorithm generates images without the color banding associated with the Escape Time algorithm. &lt;/p&gt;

&lt;p&gt;&lt;center&gt;
  &lt;table cellpadding="5"&gt;
    &lt;tr&gt;
      &lt;td&gt;Escape Time&lt;/td&gt;
      &lt;td&gt;Normalized Iteration Count&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;img src="/files/mandelbrot_escape_time.png" class=&#8221;photo&#8221;&gt;
      &lt;/td&gt;
      &lt;td&gt;
        &lt;img src="/files/mandelbrot_normalized.png" class=&#8221;photo&#8221;&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;A Themes module now serves as a home for all of the library&amp;#8217;s predefined color palettes. There are only two, but they&amp;#8217;re easy to make. Since themes are also expressed as lambdas they too can be created by users and applied to the Fractal class. Below is my attempt at creating a snowflake using the Julia set and a user-defined theme.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;snowflakes&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Julia&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;0.3007&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0.6601&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;width&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;350&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;350&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;m&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set_color&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Color&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;White&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;algorithm&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Algorithms&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;NormalizedIterationCount&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;theme&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;lambda&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;g&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;      
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="number"&gt;510&lt;/span&gt;
    &lt;span class="ident"&gt;r&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
    &lt;span class="ident"&gt;g&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt;
    &lt;span class="ident"&gt;b&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;
  &lt;span class="keyword"&gt;elsif&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;
    &lt;span class="ident"&gt;r&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
    &lt;span class="ident"&gt;g&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;
    &lt;span class="ident"&gt;b&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;
  &lt;span class="keyword"&gt;else&lt;/span&gt;    
    &lt;span class="ident"&gt;b&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;      
  &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;g&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;
&lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="ident"&gt;snowflakes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;draw&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;snowflakes.png&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Snowflakes was inspired by a colleague who wondered why I kept creating paisley.  The Fire theme will do that. :)&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
&lt;img src="/files/snowflakes.png" class="photo"&gt;
&lt;/center&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;When I get more time I&#8217;d like to implement some of the Escape Angle and Curvature Estimation algorithms as &lt;a href="http://math.unipa.it/~grim/Jbarrallo.PDF" target="_blank"&gt;outlined by Garcia, Fernandez, Barrallo, and Martin&lt;/a&gt;, but for now I&#8217;d gladly accept any user-contributed algorithms or themes. &lt;/p&gt;

&lt;p&gt;A fractal can now be instantiated with a single point rather than a range.  This is the biggest breaking change over version 1.0.0.  I believe that this makes the library easier to use and more similar to other fractal generating programs.  The Fractal type also contains a where_is? method.  This should help when trying to determine the complex coordinate of an x, y value pair.&lt;/p&gt;

&lt;p&gt;In testing the library, I attempted to generate a few of the fractals found in the &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set" target="_blank"&gt;Mandelbrot set Wikipedia entry&lt;/a&gt;. The images found at Wikipedia were rendered using Ultra Fractal 3 and are beautiful.  Knowing Ruby, I didn&#8217;t expect to generate images with the same quality, but I was pleasantly surprised.  Here is &amp;#8220;Satellite&amp;#8221; followed by the Misiurewicz point.  Both were rendered with the &lt;a href="http://crunchlife.com/pages/ruby_fractal_library"&gt;Ruby Fractal Library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;/p&gt;

&lt;table cellpadding="5"&gt;
    &lt;tr&gt;
      &lt;td&gt;Satellite&lt;/td&gt;
      &lt;td&gt;Misiurewicz point&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;img src="/files/satellite.png" class=&#8221;photo&#8221;&gt;
      &lt;/td&gt;
      &lt;td&gt;
        &lt;img src="/files/misiurewicz.png" class=&#8221;photo&#8221;&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p&gt;&lt;/center&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Satellite can be found where c = -0.743643135, 0.131825963i at around 200k magnification. I had to set max_iterations = 1500 to get this level of detail.  It still took a few minutes to render using the latest YARV interpreter on an Intel Core 2 Duo 2.6Ghz.  Overall I&#8217;ve noticed that YARV finishes rendering the Mandelbrot set in approximately half the time of the old Matz interpreter. Not a bad gain.  It&#8217;ll never be as quick as C, but I still look forward to Ruby 2.0!&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://crunchlife.com/pages/ruby_fractal_library"&gt;Ruby Fractal Library&lt;/a&gt; can be found under the &amp;#8220;Projects&amp;#8221; section of this website.  Feel free to send me any feedback.  I&#8217;d love to see some new color themes or algorithms.&lt;/p&gt;</description>
      <pubDate>Fri, 24 Oct 2008 11:49:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:6dfbe339-553c-42c6-b854-6cae91137aed</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/10/24/ruby-fractal-library-1-1-0</link>
      <category>Code Snippets</category>
      <category>Fractals</category>
      <category>Ruby</category>
      <enclosure type="image/png" length="108876" url="http://crunchlife.com/files/satellite.png"/>
      <trackback:ping>http://crunchlife.com/articles/trackback/83</trackback:ping>
    </item>
    <item>
      <title>Installing Ruby 1.8 and 1.9 on Ubuntu from Source</title>
      <description>&lt;p&gt;&lt;img src="/files/ruby.png" class="right"&gt;I&amp;#8217;ve begun testing &lt;a href="http://crunchlife.com/articles/2008/07/03/ruby-fractal-library" target="_blank"&gt;my fractal library&lt;/a&gt; with the latest source code from the Ruby 1.9 trunk. Since 1.9 is a development release and I still need 1.8 for my Rails applications, I&amp;#8217;ve checked out both versions and configured them to run side-by-side on Ubuntu, Hardy Heron.&lt;/p&gt;

&lt;p&gt;Before you begin, make sure you have the autoconf, build-essential, and subversion packages installed.&lt;/p&gt;

&lt;p&gt;It may also be a good idea to include the Ruby1.8 and Ruby1.9 build dependencies from Ubuntu&amp;#8217;s package repository. This could prevent some headaches later on.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ sudo apt-get build-dep ruby1.8 ruby1.9&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Create a directory for the Ruby source code.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ mkdir /home/ryan/source
$ cd /home/ryan/source&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Check out the code from the 1.8 branch. Since this branch includes patches, you can always update your source and recompile when new patches are released.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ svn co http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8 ruby1.8&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next, create a configuration, configure, and compile.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ cd ruby1.8
$ autoconf
$ ./configure --prefix=/opt/ruby1.8 --program-suffix=1.8
$ sudo make
$ sudo make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;One of the best parts of Ruby is &lt;a href="http://www.rubygems.org/" target="_blank"&gt;Rubygems&lt;/a&gt;! Download and install it. &lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
$ tar -xvzf rubygems-1.2.0.tgz
$ cd rubygems-1.2.0
$ sudo ruby1.8 setup.rb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, link your new binaries to the /usr/local/bin directory.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ sudo ln -s /opt/ruby1.8/bin/* /usr/local/bin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Typing ruby1.8 -v in a new console should yield something similar to the following:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ ruby1.8 -v
ruby 1.8.7 (2008-09-15 revision 19348) [i686-linux]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The current source for Ruby 1.9 requires version 1.8 to compile, but if you&amp;#8217;ve followed my directions up to this point you should be ready to download and compile the latest Ruby 1.9 source code. &lt;/p&gt;

&lt;p&gt;Go back to your source directory and check out the latest code from the 1.9 trunk.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ cd /home/ryan/source
$ svn co http://svn.ruby-lang.org/repos/ruby/trunk ruby1.9
$ cd ruby1.9&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This time use the &amp;#8211;with-baseruby switch when configuring. Set this option to the new Ruby 1.8 binary and then compile.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ autoconf
$ ./configure --with-baseruby=/usr/local/bin/ruby1.8 --prefix=/opt/ruby1.9 --program-suffix=1.9
$ sudo make
$ sudo make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finish by linking your new Ruby 1.9 binaries to /usr/local/bin.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ sudo ln -s /opt/ruby1.9/bin/* /usr/local/bin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Typing ruby1.9 -v in your console should yield something similar to the following:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ ruby1.9 -v
ruby 1.9.0 (2008-09-15 revision 19351) [i686-linux]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ruby 1.9 includes Rubygems! We&amp;#8217;re done!&lt;/p&gt;

&lt;p&gt;Since the binaries we&amp;#8217;ve created have been suffixed with either 1.8 or 1.9, you must remember to execute them with their proper name ie (gem1.8, gem1.9, ruby1.8, ri1.9).&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve written these instructions from memory so if you have any problems, please post them and I&amp;#8217;ll try to help out as best I can. Please be warned, however, that not all code written for Ruby 1.8 will work in 1.9.&lt;/p&gt;</description>
      <pubDate>Sun, 14 Sep 2008 13:30:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:122f8a10-a010-40fb-9010-b102dc451ac3</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/09/14/installing-ruby-1-8-and-1-9-on-ubuntu-from-source</link>
      <category>Code Snippets</category>
      <category>Ruby</category>
      <category>Ubuntu</category>
    </item>
    <item>
      <title>Ruby Fractal Library</title>
      <description>&lt;p&gt;&lt;strong&gt;*Update: Version 1.1.0 of the &lt;a href="http://crunchlife.com/pages/ruby_fractal_library"&gt;Ruby Fractal Library&lt;/a&gt; has been released.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;
&lt;img src="/files/mandelbrot1.png" class="photo right"&gt;Last October, I wrote a small &lt;a href="http://crunchlife.com/articles/2007/10/30/code-snippet-ruby-walks-with-shoes" target="_blank"&gt;fractal rendering program&lt;/a&gt; in Ruby using the &lt;a href="http://code.whytheluckystiff.net/shoes/" target="_blank"&gt;Shoes&lt;/a&gt; windowing toolkit written by &lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff" target="_blank"&gt;why the lucky stiff&lt;/a&gt;. It&amp;#8217;s sole purpose was to test Shoes. The code was painfully slow at rendering the Mandelbrot set, but it did, however, begin a small obsession of mine with fractals. &lt;/p&gt;

&lt;p&gt;Since I couldn&amp;#8217;t find a fractal library for Ruby, I decided to write one. Over the last two weeks I&amp;#8217;ve written some code to generate both the &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set" target="_blank"&gt;Mandelbrot&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Julia_set" target="_blank"&gt;Julia set&lt;/a&gt; fractals using the escape time algorithm. The code is still slow, but within a couple weeks I hope to replace the slow portions with inline C.&lt;/p&gt;

&lt;p&gt;There may still be some bugs and I haven&amp;#8217;t added any error handling, but here it is. An &amp;#8220;almost&amp;#8221; pure Ruby fractal library. Once this is cleaned up I&amp;#8217;ll repost the code. I suppose a gem could be possible as well. Happy 4th!&lt;/p&gt;

&lt;p&gt;&lt;a href="/files/fractals.rb"&gt;fractals.rb&lt;/a&gt;&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;# RB&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;complex&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;png&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Fractals&lt;/span&gt;
  &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Fractal&lt;/span&gt;
    &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:begin_range&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:end_range&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;begin_range&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;end_range&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@begin_range&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@end_range&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;begin_range&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;end_range&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;draw&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;width&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;m&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;1.0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;save_as&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;fractal.png&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
        &lt;span class="ident"&gt;canvas&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Canvas&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;width&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

        &lt;span class="comment"&gt;# Find the complex coordinate for each pixel.&lt;/span&gt;
        &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
          &lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;y&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@end_range&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;image&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="attribute"&gt;@begin_range&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;image&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="ident"&gt;height&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;
          &lt;span class="attribute"&gt;@begin_range&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;image&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;m&lt;/span&gt;
          &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;width&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
            &lt;span class="ident"&gt;r&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@end_range&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;real&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="attribute"&gt;@begin_range&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;real&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="ident"&gt;width&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;
            &lt;span class="attribute"&gt;@begin_range&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;real&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;m&lt;/span&gt;
            &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;in_set?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;
              &lt;span class="ident"&gt;canvas&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Color&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Black&lt;/span&gt;
            &lt;span class="keyword"&gt;else&lt;/span&gt;
              &lt;span class="ident"&gt;canvas&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;fetch_color&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;last_iteration&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;max_iterations&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="keyword"&gt;end&lt;/span&gt;                    
          &lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="punct"&gt;}&lt;/span&gt;

        &lt;span class="ident"&gt;png&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;canvas&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;png&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;save_as&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;  

    &lt;span class="ident"&gt;private&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fetch_color&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;last_iteration&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_iterations&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  
      &lt;span class="ident"&gt;divisor&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;765&lt;/span&gt;&lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;last_iteration&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;max_iterations&lt;/span&gt;
      &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="ident"&gt;divisor&lt;/span&gt;
        &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;..&lt;/span&gt;&lt;span class="number"&gt;254&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt; &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Color&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;divisor&lt;/span&gt;&lt;span class="punct"&gt;%&lt;/span&gt;&lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;..&lt;/span&gt;&lt;span class="number"&gt;509&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt; &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Color&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;divisor&lt;/span&gt;&lt;span class="punct"&gt;%&lt;/span&gt;&lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="number"&gt;510&lt;/span&gt;&lt;span class="punct"&gt;..&lt;/span&gt;&lt;span class="number"&gt;765&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt; &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;PNG&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Color&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;divisor&lt;/span&gt;&lt;span class="punct"&gt;%&lt;/span&gt;&lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;)&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;class &lt;/span&gt;&lt;span class="class"&gt;Julia&lt;/span&gt;
    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Fractal&lt;/span&gt;
    &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:seed&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:max_iterations&lt;/span&gt;
    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="symbol"&gt;:last_iteration&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;seed&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0.36&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0.1&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="ident"&gt;bailout&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_iterations&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
    &lt;span class="ident"&gt;begin_range&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;2.25&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;1.5&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="ident"&gt;end_range&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0.75&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;1.5&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
      &lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;begin_range&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;end_range&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@seed&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@max_iterations&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;seed&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_iterations&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;in_set?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;z&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@max_iterations&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;z&lt;/span&gt;&lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="attribute"&gt;@seed&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@bailout&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;
          &lt;span class="attribute"&gt;@last_iteration&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt;
          &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;      
      &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="keyword"&gt;return&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;end&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Mandelbrot&lt;/span&gt;
    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Fractal&lt;/span&gt;  
    &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:max_iterations&lt;/span&gt;
    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="symbol"&gt;:last_iteration&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;bailout&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_iterations&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;begin_range&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;2.25&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
    &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;1.5&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="ident"&gt;end_range&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0.75&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;1.5&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
      &lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;begin_range&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;end_range&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@max_iterations&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_iterations&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;in_set?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
      &lt;span class="attribute"&gt;@max_iterations&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;z&lt;/span&gt;&lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@bailout&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;
          &lt;span class="attribute"&gt;@last_iteration&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt;
          &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;            
      &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="keyword"&gt;return&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;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Using this library is as simple as the following:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fractals&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;mandelbrot&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Fractals&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Mandelbrot&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;span class="ident"&gt;mandelbrot&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;draw&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Any suggestions/bug fixes can be posted here. Thanks.&lt;/p&gt;</description>
      <pubDate>Thu, 03 Jul 2008 14:26:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:c65638d5-d30a-4340-a3f4-34b9ec4eb55f</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/07/03/ruby-fractal-library</link>
      <category>Code Snippets</category>
      <category>Ruby</category>
      <category>Fractals</category>
      <enclosure type="image/png" length="9532" url="http://crunchlife.com/files/mandelbrot1.png"/>
      <trackback:ping>http://crunchlife.com/articles/trackback/70</trackback:ping>
    </item>
    <item>
      <title>Compiling the Gosu Game Development Library on Ubuntu Feisty</title>
      <description>&lt;p&gt;I&amp;#8217;ve had the itch this week to try out a few of Ruby&amp;#8217;s game development libraries.  I decided to start with &lt;a href="http://code.google.com/p/gosu/" target="_blank"&gt;Gosu&lt;/a&gt;.  Gosu is a 2D game development library for the Ruby and C++ programming languages.  It&amp;#8217;s available for the Mac OS X, Windows, and Linux platforms and integrates with both the &lt;a href="http://rmagick.rubyforge.org/" target="_blank"&gt;RMagick&lt;/a&gt; image processing library and the &lt;a href="http://wiki.slembcke.net/main/published/Chipmunk" target="_blank"&gt;Chipmunk&lt;/a&gt; physics library.&lt;/p&gt;

&lt;p&gt;Unfortunately the library is only available as a gem for Mac OS X and Windows.  As a Linux user I&amp;#8217;ve become accustom to compiling my own libraries, but this often means downloading and compiling dependencies, swearing, and a lot of Googling.  I was lucky.  Compiling Gosu only caused a few hairs to fall out.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re an Ubuntu Feisty user, you&amp;#8217;ll need to add the following line to the LargeImageData.hpp file located in the gosu-source-0.7.7/Gosulmpl/Graphics directory:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;#include &amp;lt;boost/none.hpp&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This line adds a reference needed on line 31 of the LargeImageData class.  With this addition, you can then execute the commands below from the gosu-source-0.7.7/linux directory to compile the Gosu game development library.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ autoconf
$ ./configure
$ make&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The make file provided with the source does not add the compiled gosu.so file to the Ruby lib directory.  I chose to do this manually rather than edit the make file.  Just issue the following command from the gosu-source-0.7.7/linux directory to add your newly compiled library.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ sudo cp gosu.so /usr/lib/ruby/1.8/i486-linux/gosu.so&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With a little elbow grease I successfully compiled the &lt;a href="http://code.google.com/p/gosu/" target="_blank"&gt;Gosu&lt;/a&gt; game development library on Ubuntu Feisty.  I&amp;#8217;ll dig into some tutorials next and post back with my results.&lt;/p&gt;

&lt;p&gt;Be sure to check out Gosu&amp;#8217;s, &lt;a href="http://code.google.com/p/gosu/wiki/GettingStartedOnLinux" target="_blank"&gt;Getting Started on Linux&lt;/a&gt;, for a list of dependencies and compilation instructions.&lt;/p&gt;</description>
      <pubDate>Tue, 20 Nov 2007 17:40:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:aa8da804-fb55-4b36-9a9a-50f001b259af</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/11/20/compiling-the-gosu-game-development-library-on-ubuntu-feisty</link>
      <category>Ruby</category>
      <category>Ubuntu</category>
    </item>
    <item>
      <title>/usr/lib/ruby/1.8/rinda/ring.rb:212:in `lookup_ring_any': RingNotFound (RuntimeError)</title>
      <description>&lt;p&gt;If you&amp;#8217;re experiencing the error message above while using the &lt;a href="http://stdlib.rubyonrails.org/libdoc/rinda/rdoc/index.html" target="_blank"&gt;Rinda&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Distributed_computing" target="_blank"&gt;distributed computing&lt;/a&gt; module in your Ruby script then try defining a Domain name in your Network Settings configuration.  This has worked in my experience using Rinda and Ruby on Ubuntu Feisty.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src="/files/network_settings.png"&gt;&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 18 Nov 2007 15:44:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:d2120313-5449-4ba0-9e2c-39456ac98c6c</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/11/18/usr-lib-ruby-1-8-rinda-ring-rb-212-in-lookup_ring_any-ringnotfound-runtimeerror</link>
      <category>Ruby</category>
      <category>Ubuntu</category>
    </item>
    <item>
      <title>Code Snippet: Ruby Walks with Shoes</title>
      <description>&lt;p&gt;&lt;img src="/files/shoes-icon.png" class="right"&gt;&lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff" target="_blank"&gt;_Why&lt;/a&gt; of &lt;a href="http://www.poignantguide.net/ruby/" target="_blank"&gt;Why&amp;#8217;s (Poignant) Guide to Ruby&lt;/a&gt; has announced the publication of a 52 page comic style &lt;a href="http://www.lulu.com/content/1365064" target="_blank"&gt;book&lt;/a&gt; illustrating the ins and outs of his new windowing toolkit, &lt;a href="http://code.whytheluckystiff.net/shoes/" target="_blank"&gt;Shoes&lt;/a&gt;.  In his words, &amp;#8220;Shoes is a very informal graphics and windowing toolkit. It&amp;#8217;s for making regular old apps that run on Windows, Mac OS X and Linux. It&amp;#8217;s a blend of my favorite things from the Web, some Ruby style, and a sprinkling of cross-platform widgets.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Using the the latest Shoes revision, I&amp;#8217;ve written some code to generate a &lt;a href="http://en.wikipedia.org/wiki/Mandelbrot_set" target="_blank"&gt;Mandelbrot fractal&lt;/a&gt;.  Try it out with the following command (assuming your script is located in the Shoes samples directory):&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;./shoes samples/mandelbrot.rb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You may want to go make a sandwich while you wait.  Here is a sample of the output:&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src="/files/mandelbrot.png"&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Here is the code:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;# RB&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;complex&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Mandelbrot&lt;/span&gt;  
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;bailout&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;iterations&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@iterations&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;bailout&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;iterations&lt;/span&gt;   
  &lt;span class="keyword"&gt;end&lt;/span&gt;  

  &lt;span class="comment"&gt;# A method for determining if a point is within&lt;/span&gt;
  &lt;span class="comment"&gt;# the Mandelbrot set.&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;in_set?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Complex&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
    &lt;span class="attribute"&gt;@iterations&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;z&lt;/span&gt;&lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;                       
      &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;z&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@bailout&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;return&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;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Generator&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Shoes&lt;/span&gt;
  &lt;span class="ident"&gt;url&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:index&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;    
    &lt;span class="ident"&gt;render&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;rgb&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;205&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;102&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&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="method"&gt;render&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;width&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;color&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;rgb&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
    &lt;span class="ident"&gt;nostroke&lt;/span&gt;
    &lt;span class="ident"&gt;fill&lt;/span&gt; &lt;span class="ident"&gt;color&lt;/span&gt;   

    &lt;span class="ident"&gt;mandelbrot&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mandelbrot&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;

    &lt;span class="comment"&gt;# Render the fractal.&lt;/span&gt;
    &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;height&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;width&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;scaled_x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="ident"&gt;width&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_f&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;scaled_y&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="ident"&gt;height&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_f&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;mandelbrot&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;in_set?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;scaled_x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;scaled_y&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;        
          &lt;span class="ident"&gt;rect&lt;/span&gt; &lt;span class="symbol"&gt;:left&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:top&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:width&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:height&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;
          &lt;span class="comment"&gt;# oval :left =&amp;gt; x, :top =&amp;gt; y, :radius =&amp;gt; 1, :center =&amp;gt; true                           &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;span class="constant"&gt;Shoes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;app&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Mandelbrot&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:height&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;250&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:width&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;250&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 30 Oct 2007 07:30:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:d741a6d4-d9eb-4068-893b-e5ce494f7920</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/10/30/code-snippet-ruby-walks-with-shoes</link>
      <category>Code Snippets</category>
      <category>Ruby</category>
      <enclosure type="image/png" length="6771" url="http://crunchlife.com/files/shoes-icon.png"/>
    </item>
    <item>
      <title>The NetBeans Ruby IDE</title>
      <description>&lt;p&gt;&lt;img src="/files/ruby.png" class="right"&gt;Some time ago I wrote about &lt;a href="http://crunchlife.com/articles/2007/08/09/i-want-my-ide" target="_blank"&gt;my search&lt;/a&gt; for the perfect Ruby IDE.  I understand that the criteria for perfect is different for everyone, but in my &lt;a href="http://crunchlife.com/articles/2007/08/09/i-want-my-ide" target="_blank"&gt;previous article&lt;/a&gt; I outlined the eleven features that best describe &lt;strong&gt;my&lt;/strong&gt; perfect Ruby IDE. I will admit that I haven&amp;#8217;t kept up with my analysis.  Like everyone else, I have a lot of other things to do and evaluating a dozen IDEs takes a lot of time.  Apologies aside &amp;#8211; I have found an IDE that fits all of my expectations. My search might be over.&lt;/p&gt;

&lt;p&gt;Roman Strobl&amp;#8217;s recently published article, &lt;a href="http://www.infoq.com/articles/netbeans-rubyide1" target="_blank"&gt;NetBeans: Ruby Developer&amp;#8217;s New Best Friend&lt;/a&gt;, highlights the features and improvements of NetBeans&amp;#8217; efforts in the Ruby IDE arena.  I&amp;#8217;m consistently amazed by the quality of writing published by &lt;a href="http://www.infoq.com/" target="_blank"&gt;InfoQ&lt;/a&gt; and Strobl&amp;#8217;s work is a fine example.  I recommend reading his article and then &lt;a href="http://deadlock.netbeans.org/hudson/job/ruby/" target="_blank"&gt;downloading the NetBeans Ruby IDE&lt;/a&gt; to test drive it yourself.&lt;/p&gt;

&lt;p&gt;NetBean&amp;#8217;s Ruby IDE has the best code completion I&amp;#8217;ve found in a Ruby IDE.  It rivals Visual Studio on the .NET platform.  The IDE is lightweight.  At no point during my testing did it ever slow down.  Its source control integration works well.  The default font is easy on the eyes and compliments the Ruby syntax highlighting scheme.  My favorite feature is the garbage collection button located in the upper right-hand corner of the application.  Some developers might think the application poorly designed for needing this feature, but coming from Visual Studio, I applaud it.&lt;/p&gt;

&lt;p&gt;The NetBean&amp;#8217;s Ruby IDE is still in development, but the testing I&amp;#8217;ve done hasn&amp;#8217;t uncovered any issues worth mentioning.  While working on one of my side projects I haven&amp;#8217;t noticed any appreciable difference between the Windows and Linux versions.  Have I mentioned yet that the NetBean&amp;#8217;s Ruby IDE is free?  I&amp;#8217;ve found my new daily driver.  Kudos NetBeans!&lt;/p&gt;

&lt;p&gt;Download it &lt;a href="http://deadlock.netbeans.org/hudson/job/ruby/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Oct 2007 07:26:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:dca7aa17-1b20-4747-a50f-01172bc97da6</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/10/25/the-netbeans-ruby-ide</link>
      <category>Reviews</category>
      <category>Rails</category>
      <category>Ruby</category>
      <category>IDE</category>
    </item>
    <item>
      <title>I Want My IDE Update</title>
      <description>&lt;p&gt;I started writing some Ruby code this past weekend for a new project that I&amp;#8217;m involved in.  Rather than download an IDE mentioned in my previous article, &lt;a href="http://crunchlife.com/articles/2007/08/09/i-want-my-ide" target="_blank"&gt;I Want My IDE&lt;/a&gt;, I decided to use the &lt;a href="http://www.gnome.org/projects/gedit/" target="_blank"&gt;gedit&lt;/a&gt; text editor that comes bundled with Ubuntu Linux.&lt;/p&gt;

&lt;p&gt;Attempting to capture the experience Mac users get from using &lt;a href="http://macromates.com/" target="_blank"&gt;TextMate&lt;/a&gt;, I installed the Class Browser, File Browser Pane, Project Manager, Snap open, and Snippets plugins from &lt;a href="http://live.gnome.org/Gedit/Plugins" target="_blank"&gt;live.gnome.org&lt;/a&gt;.  I also enabled line numbers, current line highlighting, and bracket matching.  It&amp;#8217;s not quite TextMate, but it&amp;#8217;s not a bad choice either.&lt;/p&gt;

&lt;p&gt;I had initially stated that my top two needs of an IDE were Subversion (SVN) integration and code completion.  I didn&amp;#8217;t have either of these with gedit, but I didn&amp;#8217;t find myself missing them either.  I&amp;#8217;ve grown accustomed to using SVN from the command-line and &lt;a href="http://www.ruby-doc.org/" target="_blank"&gt;ruby-doc.org&lt;/a&gt; didn&amp;#8217;t slow me down too much while looking up class definitions.&lt;/p&gt;

&lt;p&gt;Overall I&amp;#8217;m quite pleased, but I have to admit that installing gedit plugins was a bit tricky and I never did get my fonts to look like those found in the &lt;a href="http://grigio.org/textmate_gedit_few_steps" target="_blank"&gt;TextMate-like Gedit&lt;/a&gt; tutorial.&lt;/p&gt;</description>
      <pubDate>Mon, 20 Aug 2007 21:14:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:48347c3e-cc06-447c-91bf-11c56ec35968</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/08/20/i-want-my-ide-update</link>
      <category>IDE</category>
      <category>Rails</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Code Snippet: Ruby Image Scraper</title>
      <description>&lt;p&gt;I stumbled upon a &lt;a href="http://en.wikipedia.org/wiki/Screen_scraping" target="_blank"&gt;screen scraping&lt;/a&gt; library for Ruby last week called &lt;a href="http://blog.labnotes.org/2006/07/11/scraping-with-style-scrapi-toolkit-for-ruby/" target="_blank"&gt;scrAPI&lt;/a&gt;.  It&amp;#8217;s extremely flexible and can be seen in action on the &lt;a href="http://co.mments.com/" target="_blank"&gt;co.mments&lt;/a&gt; blog post scraper.  The scrAPI library can be installed by issuing the following command from your console:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;gem install scrapi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Testing scrAPI was fairly easy once I figured out how to define a scraper.  With that aside, I wrote a small script that saves images from a URL provided by the user.  The scrAPI library could be used for good or evil, but only you can decide.   &lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/ruby&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;fileutils&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;open-uri&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;pathname&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;scrapi&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="comment"&gt;# Get the URL input.&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Enter a URL:&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;url&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;gets&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chomp&lt;/span&gt;

&lt;span class="comment"&gt;# Get the HTML source.&lt;/span&gt;
&lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;
&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;()}&lt;/span&gt;

&lt;span class="comment"&gt;# Define the scraper.&lt;/span&gt;
&lt;span class="ident"&gt;scraper&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Scraper&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;define&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;array&lt;/span&gt; &lt;span class="symbol"&gt;:images&lt;/span&gt;
  &lt;span class="ident"&gt;process&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;img&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:images&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;@src&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;result&lt;/span&gt; &lt;span class="symbol"&gt;:images&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="comment"&gt;# Scrape the HTML for images.&lt;/span&gt;
&lt;span class="ident"&gt;images&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;scraper&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;scrape&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="comment"&gt;# Create a directory to save the images in.&lt;/span&gt;
&lt;span class="ident"&gt;directory&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;http:&lt;span class="escape"&gt;\/\/&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;/,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="constant"&gt;FileUtils&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;mkdir&lt;/span&gt; &lt;span class="ident"&gt;directory&lt;/span&gt;

&lt;span class="ident"&gt;images&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;image_path&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="comment"&gt;# Determine if image_path is absolute or relative. &lt;/span&gt;
  &lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Pathname&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;image_path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  
  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="keyword"&gt;not&lt;/span&gt; &lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;relative?&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt; &lt;span class="ident"&gt;image_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;image_path&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="comment"&gt;# Write the image to disk.&lt;/span&gt;
  &lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;image_path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;file_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;image_path&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;split&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;/&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;last&lt;/span&gt;
    &lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;directory&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;file_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;wb&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;write&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;())}&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Finished...&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 13 Aug 2007 20:46:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:f2568aba-5b0b-4ca4-b4c7-f1f47c11d88d</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/08/13/code-snippet-ruby-image-scraper</link>
      <category>Code Snippets</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>I Want My IDE</title>
      <description>&lt;p&gt;&lt;img src="/files/i_want_my_mtv.jpg" class="photo right"&gt;The majority of my academic and professional programming career has been spent writing code using an &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank"&gt;integrated development environment&lt;/a&gt; (IDE).  I&#8217;ve dabbled with Eclipse, Microsoft Visual Studio, Macrodobe Dreamweaver, and various Borland products.  Rather than juggle multiple text editors and source control consoles, I find it easier to stay organized using an IDE on large projects.  When editing config files or writing scripts I prefer a lightweight text editor.  In Linux, &lt;a href="http://en.wikipedia.org/wiki/Vi" target="_blank"&gt;vi&lt;/a&gt; or gedit is my choice.  &lt;a href="http://www.flos-freeware.ch/notepad2.html" target="_blank"&gt;Notepad2&lt;/a&gt; is at the top of my Windows list.&lt;/p&gt;

&lt;p&gt;A few months ago I decided to learn &lt;a href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; and the &lt;a href="http://www.rubyonrails.org/" target="_blank"&gt;Ruby on Rails&lt;/a&gt; framework.  I began with the obligatory &lt;a href="http://en.wikipedia.org/wiki/Hello_World" target="_blank"&gt;Hello World program&lt;/a&gt; and quickly progressed through a series of tutorials using vi and gedit to get the job done.  Since then, I&#8217;ve begun some larger projects and am quickly finding myself losing focus and missing the benefits of an IDE.  Consulting Google, I compiled a list of prospective IDEs to begin my evaluation.  I&#8217;m willing to give each of them a fair chance at becoming my Rails development environment, but have a few questions before I begin.  What, if any, IDEs have I missed?  How long should I try each one?&lt;/p&gt;

&lt;p&gt;Needs (in order of importance):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Linux compatible&lt;/li&gt;
  &lt;li&gt;Project Browsing&lt;/li&gt;
  &lt;li&gt;SVN integration&lt;/li&gt;
  &lt;li&gt;Syntax Highlighting&lt;/li&gt;
  &lt;li&gt;Code Completion&lt;/li&gt;
  &lt;li&gt;Active Community&lt;/li&gt;
  &lt;li&gt;Unit Testing&lt;/li&gt;
  &lt;li&gt;Debugging&lt;/li&gt;
  &lt;li&gt;Auto-indent&lt;/li&gt;
  &lt;li&gt;Plugin support&lt;/li&gt;
  &lt;li&gt;Less than $100&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The list:&lt;br /&gt;
*Each IDE/editor was capable of Project Browsing, Syntax Highlighting, and compatible with Linux.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://www.aptana.com/" target="_blank"&gt;Aptana RadRails&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;Good SVN integration.&lt;/li&gt;
      &lt;li&gt;The latest Beta has working Code Completion.&lt;/li&gt;
      &lt;li&gt;Built on Eclipse.&lt;/li&gt;
      &lt;li&gt;More Rails features than Eclipse + DLTK.&lt;/li&gt;
      &lt;li&gt;Many plugins inherited from Eclipse&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;Code Completion is broken in the current stable release.&lt;/li&gt;
      &lt;li&gt;Built on Eclipse.&lt;/li&gt;      
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.eclipse.org/" target="_blank"&gt;Eclipse&lt;/a&gt; + &lt;a href="http://www.eclipse.org/dltk/" target="_blank"&gt;DLTK&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;SVN integration.&lt;/li&gt;
      &lt;li&gt;DLTK has Code Completion.&lt;/li&gt;
      &lt;li&gt;Tried and true.&lt;/li&gt;
      &lt;li&gt;Vast library of plugins.&lt;/li&gt;
      &lt;li&gt;Active community.&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;Eclipse is slow and consumes a lot of memory.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://freeride.rubyforge.org/wiki/wiki.pl" target="_blank"&gt;FreeRIDE&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;Auto-indenting.&lt;/li&gt;
      &lt;li&gt;Debugging.&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;No SVN integration.&lt;/li&gt;
      &lt;li&gt;No Code Completion.&lt;/li&gt;
      &lt;li&gt;Performance could be an issue b/c it&amp;#8217;s a native Ruby application.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.gnome.org/projects/gedit/" target="_blank"&gt;gedit&lt;/a&gt; + &lt;a href="http://live.gnome.org/Gedit/Plugins" target="_blank"&gt;plugins&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;Lightweight.&lt;/li&gt;
      &lt;li&gt;Plugins.&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;No SVN integration.&lt;/li&gt;
      &lt;li&gt;No Code Completion.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.jedit.org/" target="_blank"&gt;jEdit&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;SVN integration.&lt;/li&gt;
      &lt;li&gt;Code Completion.&lt;/li&gt;
      &lt;li&gt;Plugins.&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;Not user friendly.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.jetbrains.com/idea/index.html" target="_blank"&gt;IntelliJ IDEA 6.0&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;SVN integration.&lt;/li&gt;
      &lt;li&gt;Code Completion.&lt;/li&gt;
      &lt;li&gt;Debugging.&lt;/li&gt;
      &lt;li&gt;Unit Testing.&lt;/li&gt;
      &lt;li&gt;Plugins.&lt;/li&gt;
      &lt;li&gt;Much more&amp;#8230;&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;$249.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.activestate.com/Products/komodo_ide/" target="_blank"&gt;Komodo IDE 4.1&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;SVN integration.&lt;/li&gt;
      &lt;li&gt;Code Completion.&lt;/li&gt;
      &lt;li&gt;Debugging.&lt;/li&gt;
      &lt;li&gt;Built specifically for Ruby on Rails.&lt;/li&gt;
      &lt;li&gt;Much more&amp;#8230;&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;$295&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.mondrian-ide.com/" target="_blank"&gt;Mondrian Ruby IDE&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;Lightweight.&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;No SVN integration.&lt;/li&gt;
      &lt;li&gt;No Code Completion.&lt;/li&gt;
      &lt;li&gt;Performance could be an issue b/c it&amp;#8217;s a native Ruby application.&lt;/li&gt;
      &lt;li&gt;Spam in support &lt;a href="http://www.mondrian-ide.com/support.php" target="_blank"&gt;forum&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.netbeans.org/" target="_blank"&gt;NetBeans Beta 6.0 Milestone 10+&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;SVN integration.&lt;/li&gt;
      &lt;li&gt;Code Completion.&lt;/li&gt;
      &lt;li&gt;Debugging.&lt;/li&gt;
      &lt;li&gt;Plugins.&lt;/li&gt;
      &lt;li&gt;Free.&lt;/li&gt;
      &lt;li&gt;Much more&amp;#8230;&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;Beta.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.codegear.com/products/rubyide" target="_blank"&gt;Ruby IDE from CodeGear&lt;/a&gt;&lt;br /&gt;
    Pros
    &lt;ul&gt;
      &lt;li&gt;CodeGear experience.&lt;/li&gt;
    &lt;/ul&gt;
    Cons
    &lt;ul&gt;
      &lt;li&gt;Feature set not yet released.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I&amp;#8217;ll be evaluating each of the IDEs/editors in turn and publishing my results as a series.  Feel free to leave feedback and check back soon!&lt;/p&gt;</description>
      <pubDate>Thu, 09 Aug 2007 19:32:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:d22e0c9a-9739-490c-ba03-5f35f317296a</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/08/09/i-want-my-ide</link>
      <category>IDE</category>
      <category>Rails</category>
      <category>Ruby</category>
      <enclosure type="image/jpeg" length="12028" url="http://crunchlife.com/files/i_want_my_mtv.jpg"/>
    </item>
    <item>
      <title>Code Snippet: Ruby Word Masher</title>
      <description>&lt;p&gt;I can be extremely indecisive about things.  So much, in fact, that I even wrote a script to help me choose a name for this website.  Is it strange that a &lt;a href="http://en.wikipedia.org/wiki/Random_number_generator"&gt;random number generator&lt;/a&gt; can make me feel better about making decisions?  My wife thinks I&amp;#8217;m crazy, but she also calls domain names, donames.  Besides, I think there is something novel in a computer choosing a name for itself.  Anyway&amp;#8230;  Given some user input, the code below will read words from a file and then mash them together to provide unique combinations.  Here is a &lt;a href="/files/words.dat" target="_blank"&gt;words.dat&lt;/a&gt; file to help get you started.  Happy mashing.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/ruby&lt;/span&gt;

&lt;span class="ident"&gt;words&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;mash_words&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;mash_count&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;new_word&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

  &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;mash_count&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;new_word&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;rand&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;length&lt;/span&gt;&lt;span class="punct"&gt;)]&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;new_word&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;begin&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;How many mashed words would you like to create?&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;word_count&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;gets&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chomp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_i&lt;/span&gt;  

  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;How many words would you like to mash?&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;mash_count&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;gets&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chomp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_i&lt;/span&gt;  

  &lt;span class="ident"&gt;input_file&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;words.dat&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
  &lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;line&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;input_file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gets&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;    
    &lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;i&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;line&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;chomp&lt;/span&gt;    
    &lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;  

  &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;upto&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;word_count&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;    
    &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;mash_words&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;words&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;mash_count&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;  

  &lt;span class="ident"&gt;input_file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&lt;/span&gt;  
&lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;err&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Exception: &lt;span class="expr"&gt;#{err}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;err&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 28 Jul 2007 13:54:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:489d4ec9-5bce-4e51-af6d-e3365a0af8e3</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/07/28/code-snippet-ruby-word-masher</link>
      <category>Code Snippets</category>
      <category>Ruby</category>
      <category>crunchlife</category>
      <enclosure type="chemical/x-mopac-input" length="239" url="http://crunchlife.com/files/words.dat"/>
    </item>
    <item>
      <title>Code Snippet: Fibonacci with IronRuby &amp;amp; WPF</title>
      <description>&lt;p&gt;On Tuesday, John Lam &lt;a href="http://www.iunknown.com/2007/07/a-first-look-at.html"&gt;announced&lt;/a&gt; the Pre-Alpha Release of IronRuby.  To satisfy my curiosity, I downloaded and compiled the source code found on his blog.  A simple Build.cmd file was provided and made the compilation a breeze.  Rather than write another Hello World, I decided to kick the tires by writing a simple application to calculate &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number"&gt;Fibonacci numbers&lt;/a&gt;.  I didn&amp;#8217;t use many of the niceties that make Ruby what it is, but I did, however, uncover some oddities between Ruby and .NET types.  I coded around a few of the problems only to find other features that were either broken or missing.  The release was labeled &#8220;Pre-Alpha&#8221; for a reason so don&amp;#8217;t be surprised if you have a similar experience with IronRuby.&lt;/p&gt;

&lt;p&gt;I have to admit that I felt a bit dirty hacking together bits of the Windows Presentation Foundation (WPF) with Ruby only to achieve a single, ugly window with one text box, some words, and a button.  It wouldn&amp;#8217;t have been so bad if only I could have managed to use the .NET HorizontalAlignment enumeration with the controls on my window.  Every effort I made in aligning a control caused an Exception.  Defining the Orientation of my StackPanel also resulted in an Exception.  Taking input was easy.  Performing validation on the input was not.  I could not get a string comparison to work between .NET and Ruby string types.  I tried a half dozen combinations of .ToString, to_s, and Convert.ToString with no success.  I gave up and wrapped my problem expression in a begin-rescue block.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;begin&lt;/span&gt;
  &lt;span class="ident"&gt;fibonacci_label&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;fetch_iterative_fibonacci&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Convert&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ToInt32&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input_text_box&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Text&lt;/span&gt;&lt;span class="punct"&gt;)).&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt; 
&lt;span class="keyword"&gt;rescue&lt;/span&gt;
  &lt;span class="constant"&gt;MessageBox&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Please enter an integer.&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If Microsoft creating their own implementation of Ruby isn&amp;#8217;t interesting enough, John Lam has said that IronRuby will be hosted at RubyForge.  His reason for this is simple.  John believes that Open Source developers have more experience using Subversion rather than Microsoft&amp;#8217;s Team Foundation Server.  I agree and believe this decision will only benefit IronRuby by involving the whole Ruby community.  This will most likely cause those non-Microsoft developers to contribute who otherwise wouldn&amp;#8217;t if the project were hosted at CodePlex.  Check out episode &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=254"&gt;254&lt;/a&gt; of .NET Rocks! for more on this and John Lam&amp;#8217;s work on IronRuby and the Dynamic Language Runtime.&lt;/p&gt;

&lt;p&gt;I am not disappointed with the status of this release.  Since IronRuby will be open for community contribution, the code will be reviewed by many eyes and the bugs that I did encounter will be fixed quickly.  The integration of IronRuby and WPF was not pleasant, but I do believe that over time the two technologies could compliment each other nicely.  The power of the presentation foundation combined with Ruby&amp;#8217;s syntax sugar will undoubtedly make for an impressive stack that could give others a run for their money.  Now can I have this in Mono please?&lt;/p&gt;

&lt;p&gt;Both an iterative and recursive solution can be found within my source.  I provided both in the odd chance that somebody reading this might want to try a rudimentary O(2^n) performance test between the Ruby interpretor and IronRuby.  The source code for my Fibonacci example can be downloaded from the links below.&lt;/p&gt;

&lt;p&gt;&lt;a href="/files/Fibonacci.tar.gz"&gt;Fibonacci.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;a href="/files/Fibonacci.zip"&gt;Fibonacci.zip&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 25 Jul 2007 21:28:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:49ef81bb-2fa7-4ea4-a192-2e63932308cd</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/07/25/code-snippet-fibonacci-with-ironruby-wpf</link>
      <category>Code Snippets</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Code Snippet: Turning Oops into Ahah with Ruby.</title>
      <description>&lt;p&gt;&lt;a href="http://www.creativememories.com/" target="_blank"&gt;Scrapbooking&lt;/a&gt; is my wife&amp;#8217;s favorite hobby (stay with me). To fuel her passion, she takes hundreds of pictures at each family function with her digital camera. She edits the pictures, uploads them to &lt;a href="http://www.yorkphoto.com" target="_blank"&gt;yorkphoto.com&lt;/a&gt;, and then checks and rechecks our mailbox daily for the printed pictures. With the pictures finally in hand, she manages to combine the photos, bits of paper, stickers, and collected mementos to create a beautifully designed scrapbook page. Each page in her album is an original work. I&amp;#8217;m constantly amazed and secretly jealous of her improving sense of design. &lt;/p&gt;

&lt;p&gt;The Oops:&lt;/p&gt;

&lt;p&gt;The camera my wife uses is a &lt;a href="http://www.usa.canon.com/consumer/controller?act=ModelInfoAct&amp;amp;fcategoryid=145&amp;amp;modelid=9449" target="_blank"&gt;Canon PowerShot A80&lt;/a&gt;. It names each digital image with a sequential number that starts at 1 with the very first picture taken. In exploring the camera&amp;#8217;s settings, I managed to reset the picture count. So rather than her next picture having a file name of IMG&lt;em&gt;_&lt;/em&gt;103995837284942 it was named IMG_1. No big deal. Wrong! This messed up her entire workflow. Apparently my wife used the image&amp;#8217;s file name as a unique identifier. Copying newly taken pictures to her working directory would have overwritten hundreds of files. Oops!&lt;/p&gt;

&lt;p&gt;The Ahah:&lt;/p&gt;

&lt;p&gt;To fix my blunder, I planned on renaming all of her archived images with a &lt;a href="http://en.wikipedia.org/wiki/Universally_Unique_Identifier" target="_blank"&gt;UUID&lt;/a&gt;. That way none of her images would be overwritten when adding the new pictures. Normally I would have written a bash script to handle this, but since I&amp;#8217;d been spending some time with Ruby I thought I&amp;#8217;d take the opportunity to learn from my mistake. It worked! The code from my image renaming script can be found below.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/ruby&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;uuid&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;file_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/home/wifename/Desktop/Pictures&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;destination_path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/home/wifename/Pictures&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;file_types&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;jpg&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;jpeg&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;gif&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;png&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;xcf&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;

&lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;file_path&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/*.*&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;file_extension&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;split&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;.&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;last&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;downcase&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;file_types&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;file_extension&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;then&lt;/span&gt;
        &lt;span class="ident"&gt;file_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;UUID&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
        &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rename&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;destination_path&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;file_name&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;.&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;file_extension&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Finished...&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With the above script, I was able to undo my mistake and learn while doing so. Now if only she didn&amp;#8217;t have to use the command-line to run the code. Does anyone have experience with widget toolkits in Ruby? If so, contact me.&lt;/p&gt;</description>
      <pubDate>Thu, 12 Jul 2007 08:49:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:5e210883-0419-446b-baa1-f223a21475e3</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2007/07/12/code-snippet-turning-oops-into-ahah-with-ruby</link>
      <category>Code Snippets</category>
      <category>Oops</category>
      <category>Ruby</category>
    </item>
  </channel>
</rss>
