<?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 1.2.2</title>
      <description>&lt;p&gt;&lt;img src="/files/newton.png" class="photo right"&gt;The &lt;a href="http://crunchlife.com/pages/ruby_fractal_library" target="_blank"&gt;Ruby Fractal Library&lt;/a&gt; now uses &lt;a href="http://github.com/wvanbergen/chunky_png" target="_blank"&gt;ChunkyPNG&lt;/a&gt;.  Thanks to Willem van Bergen for creating a 100% pure Ruby PNG solution!  ChunkyPNG provides full read/write capabilities of PNG files without the dependency hassle of bigger image libraries.  Install fractals and enjoy the chunky goodness.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;sudo&lt;/span&gt; &lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="ident"&gt;install&lt;/span&gt; &lt;span class="ident"&gt;fractals&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Oh, and check out &lt;a href="http://blog.mostof.it/mandelbrot-set-in-ruby-and-haskell" target="_blank"&gt;this post&lt;/a&gt; at Implements Developer for another great way to create the Mandelbrot Set in Ruby.  &lt;/p&gt;</description>
      <pubDate>Mon, 08 Mar 2010 20:34:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:eb7618fa-56e5-422d-8811-7c9f21633975</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2010/03/08/ruby-fractal-library-1-2-2</link>
      <category>Code Snippets</category>
      <category>Fractals</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Hello MongoDB</title>
      <description>&lt;p&gt;In an effort to jump-start my creativity, I thought I&amp;#8217;d hop on the &lt;a href="http://en.wikipedia.org/wiki/NoSQL" target="_blank"&gt;NoSQL&lt;/a&gt; train and work up a little &amp;#8220;Hello World&amp;#8221; app using &lt;a href="http://mongodb.org" target="_blank"&gt;MongoDB&lt;/a&gt; with &lt;a href="http://www.sinatrarb.com/" target="_blank"&gt;Sinatra&lt;/a&gt; and &lt;a href="http://mongomapper.com/" target="_blank"&gt;MongoMapper&lt;/a&gt;.  In a later project I&amp;#8217;ll be throwing &lt;a href="" target="_blank"&gt;Haml&lt;/a&gt; into the mix and working completely outside of my comfort zone.  Dependencies be damned!&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;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;mongo_mapper&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;sinatra&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="constant"&gt;MongoMapper&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connection&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mongo&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Connection&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="string"&gt;localhost&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="constant"&gt;MongoMapper&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;database&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;messages&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;Message&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;MongoMapper&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Document&lt;/span&gt;
  &lt;span class="ident"&gt;key&lt;/span&gt; &lt;span class="symbol"&gt;:message&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt;
  &lt;span class="ident"&gt;key&lt;/span&gt; &lt;span class="symbol"&gt;:ip_address&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt;
  &lt;span class="ident"&gt;timestamps!&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;get&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="keyword"&gt;do&lt;/span&gt;
  &lt;span class="constant"&gt;Message&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;all&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&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="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;time&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="ident"&gt;created_at&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;localtime&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;On &lt;span class="expr"&gt;#{ time.strftime('%m/%d/%Y') }&lt;/span&gt; at &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;&lt;span class="expr"&gt;#{ time.strftime('%I:%M %p')}&lt;/span&gt; &amp;lt;strong&amp;gt;&lt;span class="expr"&gt;#{ m.ip_address }&lt;/span&gt;&amp;lt;/strong&amp;gt; said, &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;&amp;lt;strong&amp;gt;&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="expr"&gt;#{ m.message }&lt;/span&gt;&lt;span class="escape"&gt;\&amp;quot;&lt;/span&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="punct"&gt;}.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;get&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/:message&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="constant"&gt;Message&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:message&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:message&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="symbol"&gt;:ip_address&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@env&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;REMOTE_ADDR&lt;/span&gt;&lt;span class="punct"&gt;']).&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;
  &lt;span class="ident"&gt;redirect&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="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On 02/17/2010 at 10:13 PM &lt;strong&gt;127.0.0.1&lt;/strong&gt; said, &lt;strong&gt;&amp;#8220;Hello World!&amp;#8221;&lt;/strong&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 17 Feb 2010 20:11:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:d8efe6cb-4cee-4838-9fdb-333ee2157772</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2010/02/17/hello-mongodb</link>
      <category>Code Snippets</category>
      <category>Inspiration</category>
      <category>Ruby</category>
      <category>MongoDB</category>
      <category>Sinatra</category>
    </item>
    <item>
      <title>Ruby Fractal Library 1.2.0</title>
      <description>&lt;p&gt;&lt;img src="/files/burning_ship.png" class="photo right"&gt;I&amp;#8217;ve finally released version 1.2.0 of the &lt;a href="http://ryanbaxter.net/pages/ruby_fractal_library" target="_blank"&gt;Ruby Fractal Library&lt;/a&gt;.  It&amp;#8217;s still just as small and easy to use, but with a few new twists.  I&amp;#8217;ve removed most of the duplicate code, added Procs where appropriate, and made the syntax more consistent.  The result is much more readable and should be easier to maintain.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The source code has been split into multiple files.  One for each module.&lt;/li&gt;
&lt;li&gt;Each of the fractals has been distilled to a single block passed to the Fractal base class&amp;#8217; constructor.  This makes it easy to construct new orbits fractals by either inheriting from Fractal or instantiating it directly.&lt;/li&gt;
&lt;li&gt;Classes have been added for the Burning Ship and Newton fractals.&lt;/li&gt;
&lt;li&gt;A &amp;#8216;Winter&amp;#8217; theme has been added.&lt;/li&gt;
&lt;li&gt;Users can now choose which dependancy nightmare they&amp;#8217;d prefer.  PNG, RMagick and JRuby each have their own renderer.  PNGRenderer is the default, but is easy to override with the renderer= method.&lt;/li&gt;
&lt;li&gt;bailout and max_iterations are no longer constructor parameters.  This is the biggest breaking change.&lt;/li&gt;
&lt;li&gt;Unit tests have been added for each fractal.&lt;/li&gt;
&lt;li&gt;Several rake tasks have been added to make installation and gem creation easier.&lt;/li&gt;
&lt;li&gt;RDoc &lt;a href="http://ryanbaxter.net/fractals-1.2.1/doc/index.html" target="_blank"&gt;documentation&lt;/a&gt; is now available.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A &lt;a href="http://rubyforge.org/projects/fractals/" target="_blank"&gt;project&lt;/a&gt; for this library has been created at RubyForge, but the source code can still be found at &lt;a href="http://ryanbaxter.net/pages/ruby_fractal_library" target="_blank"&gt;the same old place&lt;/a&gt;.  I&amp;#8217;m considering a move to github, but I&amp;#8217;ll make an announcement if that happens.  If you decide to download the Ruby Fractal Library, be sure to check out examples.rb in the project&amp;#8217;s source.  You should also take a look at the README file and &lt;a href="http://ryanbaxter.net/fractals-1.2.1/doc/index.html" target="_blank"&gt;documentation&lt;/a&gt; before getting started.  Make some fractals and enjoy!  Bugs can be filed at the &lt;a href="http://rubyforge.org/tracker/?group_id=8893" target="_blank"&gt;RubyForge tracker&lt;/a&gt;. &lt;/p&gt;</description>
      <pubDate>Wed, 26 Aug 2009 19:36:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:07858846-0184-44c0-9760-a64e04d44862</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/08/26/ruby-fractal-library-1-2-0</link>
      <category>Fractals</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Installing RMagick on Ubuntu*</title>
      <description>&lt;p&gt;Because I always forget how&amp;#8230;&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;sudo apt-get install libmagickwand-dev
sudo gem install rmagick&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and you reference it in code like so:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;# Don't forget the capital &amp;quot;RM&amp;quot;!&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;RMagick&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;RMagick&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;*I&amp;#8217;ve only done this using Ubuntu 9.04.  Your mileage may vary.&lt;/strong&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 20 Aug 2009 10:00:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:dbbef41a-92fd-4d04-85ad-a13ee582e634</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/08/20/installing-rmagick-on-ubuntu</link>
      <category>Code Snippets</category>
      <category>Oops</category>
      <category>Ruby</category>
      <category>Ubuntu</category>
    </item>
    <item>
      <title>Where is _why?</title>
      <description>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff" target="_blank"&gt;Why the lucky stiff&lt;/a&gt; speaking at the Carnegie Mellon Art and Code Symposium.  If &lt;a href="http://news.ycombinator.com/item?id=773108" target="_blank"&gt;the rumors&lt;/a&gt; are true, you&amp;#8217;ll be missed.&lt;/p&gt;

&lt;p&gt;&lt;object width="400" height="220"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5047563&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5047563&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="220"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/5047563"&gt;ART &amp;amp;&amp;amp; CODE Symposium: Hackety Hack, why the lucky stiff&lt;/a&gt; from &lt;a href="http://vimeo.com/sfci"&gt;STUDIO for Creative Inquiry&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 20 Aug 2009 06:20:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:e25abfe2-f960-4f5e-9771-925530b1e98d</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/08/20/where-is-_why</link>
      <category>Expect the Unexpected</category>
      <category>Inspiration</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>A Couple New Fractals</title>
      <description>&lt;p&gt;&lt;img src="/files/burning_ship.png" class="photo right"&gt;I&amp;#8217;ve created types for both the &lt;a href="http://en.wikipedia.org/wiki/Burning_Ship_fractal" target="_blank"&gt;Burning Ship&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Newton_fractal" target="_blank"&gt;Newton&lt;/a&gt; fractals and added them to trunk of the &lt;a href="http://crunchlife.com/pages/ruby_fractal_library" target="_blank"&gt;Ruby Fractal Library&lt;/a&gt; repository. The Newton fractal was a little tricky since its formula requires the derivative of a polynomial p(z). A private &amp;#8220;derivative&amp;#8221; method yields the results of the expression, (f(x + dx) - f(x)) / dx when dx is provided as a parameter and p(z) is passed to the block.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;private&lt;/span&gt;
&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;derivative&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;dx&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;x&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; 
    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;yield&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;dx&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="keyword"&gt;yield&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="ident"&gt;dx&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;Before making an official release, I&amp;#8217;m going to do a few creative things with blocks and add one or two new coloring algorithms. &lt;/p&gt;

&lt;p&gt;&lt;img src="/files/newton.png" class="photo right"&gt;After the release, I&amp;#8217;d like to begin experimenting with iterated functions and random fractals in hopes of making the library more well rounded. I&amp;#8217;m also thinking about abstracting the rendering logic in an attempt to make RMagick less of a dependency. We&amp;#8217;ll see how that goes.&lt;/p&gt;

&lt;p&gt;The following code was used to render the fractals seen here:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;burningShip&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;BurningShip&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;1.75&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;0.04&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
&lt;span class="ident"&gt;burningShip&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;magnification&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;32&lt;/span&gt;
&lt;span class="ident"&gt;burningShip&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;burning_ship.png&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;

&lt;span class="ident"&gt;newton&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Newton&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;newton&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="number"&gt;0.5&lt;/span&gt;
&lt;span class="ident"&gt;newton&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;pz&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;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;3&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;newton&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;Winter&lt;/span&gt;
&lt;span class="ident"&gt;newton&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;newton.png&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once that is all said and done I&amp;#8217;ll be taking a break from fractals to work on another pet project. I&amp;#8217;ll post more on that when I have something to show. Cheers.&lt;/p&gt;</description>
      <pubDate>Mon, 12 Jan 2009 12:46:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:9deaef6e-5f49-4e3e-9b24-c41f47a08117</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/01/12/a-couple-new-fractals</link>
      <category>Code Snippets</category>
      <category>Fractals</category>
      <category>Ruby</category>
      <enclosure type="image/png" length="10264" url="http://crunchlife.com/files/newton.png"/>
    </item>
    <item>
      <title>Another Ruby Image Scraper</title>
      <description>&lt;p&gt;I&amp;#8217;ve been pouring over a lot of vintage Willys pictures since starting the restoration of &lt;a href="http://crunchlife.com/articles/2008/10/27/the-cj-5" target="_blank"&gt;my 58&amp;#8217; CJ-5&lt;/a&gt; and anyone that has worked with me knows that I tend to obsess over detail. The few quality images I&amp;#8217;ve found has been driving me crazy and I&amp;#8217;m amazed at how much contradicting information I&amp;#8217;ve found about a vehicle that is &lt;strong&gt;only&lt;/strong&gt; 50 years old. Given my career in technology, I&amp;#8217;m always surprised when a Google search returns little or nothing of value.&lt;/p&gt;

&lt;p&gt;My hard drive is steadily filling with what I have found and the old &lt;i&gt;&amp;#8220;Right-click, Save Image As&amp;#8230;&amp;#8221;&lt;/i&gt; has become tedious. Late last night I remembered a little &lt;a href="http://crunchlife.com/articles/2007/08/13/code-snippet-ruby-image-scraper" target="_blank"&gt;image scraping script&lt;/a&gt; I wrote back in August of 2007. I&amp;#8217;ve since cleaned it up, added a nifty progress bar, and replaced scrAPI with the &lt;a href="http://github.com/why/hpricot/tree/master" target="_blank"&gt;Hpricot&lt;/a&gt; HTML parser. Neat!&lt;/p&gt;

&lt;p&gt;I plan on doing some web crawling with it soon. Stay tuned for that. Without further ado:&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;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;hpricot&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;progressbar&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;attributes&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;href&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;src&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
&lt;span class="ident"&gt;file_extensions&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;tiff&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fetch_extension&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="keyword"&gt;return&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;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="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fetch_file&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;uri&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;progress_bar&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;uri&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:proxy&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
    &lt;span class="symbol"&gt;:content_length_proc&lt;/span&gt; &lt;span class="punct"&gt;=&amp;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;length&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;length&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;length&lt;/span&gt;
        &lt;span class="ident"&gt;progress_bar&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ProgressBar&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;uri&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&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="punct"&gt;},&lt;/span&gt;
    &lt;span class="symbol"&gt;:progress_proc&lt;/span&gt; &lt;span class="punct"&gt;=&amp;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;progress&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;progress_bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;progress&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;progress_bar&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="keyword"&gt;return&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;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;def &lt;/span&gt;&lt;span class="method"&gt;save_file&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;file_uri&lt;/span&gt;&lt;span class="punct"&gt;)&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;file_uri&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&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;[&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="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="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;fetch_file&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;file_uri&lt;/span&gt;&lt;span class="punct"&gt;));&lt;/span&gt; &lt;span class="ident"&gt;puts&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;scrape_urls&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;attributes&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;      
  &lt;span class="constant"&gt;Hpricot&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;buffer_size&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;262144&lt;/span&gt;
  &lt;span class="ident"&gt;attributes&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;attribute&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="constant"&gt;Hpricot&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;search&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;[@&lt;span class="expr"&gt;#{attribute}&lt;/span&gt;]&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;).&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;tag&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="keyword"&gt;yield&lt;/span&gt; &lt;span class="ident"&gt;tag&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{attribute}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt;
    &lt;span class="punct"&gt;}&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;to_absolute_uri&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;original_uri&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;url&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;URI&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&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;downcase&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;original_uri&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt; &lt;span class="keyword"&gt;if&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;relative?&lt;/span&gt;  
  &lt;span class="keyword"&gt;return&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;normalize&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;Enter a URL:&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;original_uri&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;URI&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&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;html&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;

&lt;span class="keyword"&gt;begin&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;original_uri&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:proxy&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;nil&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="ident"&gt;scrape_urls&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;attributes&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;url&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;file_extensions&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;fetch_extension&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="keyword"&gt;then&lt;/span&gt;
      &lt;span class="ident"&gt;save_file&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;to_absolute_uri&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;original_uri&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="keyword"&gt;end&lt;/span&gt;
  &lt;span class="punct"&gt;}&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;e&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;e&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 07 Jan 2009 16:22:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:32992b2b-63b9-4751-bdc2-cfc4aae59484</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/01/07/another-ruby-image-scraper</link>
      <category>Code Snippets</category>
      <category>CJ5</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Fork Ruby?</title>
      <description>&lt;p&gt;Dave Thomas speaking at the 2008 RubyConf.
&lt;br /&gt;&lt;br /&gt;
&lt;embed src='http://rubyconf2008.confreaks.com/player.swf' height='260' width='640' allowscriptaccess='always' allowfullscreen='true' flashvars='image=images%2Fkeynote-preview.jpg&amp;amp;file=http%3A%2F%2Frubyconf2008.confreaks.com%2Fvideos%2Fkeynote-small.mp4&amp;amp;plugins=viral-1'/&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 29 Dec 2008 07:49:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:f327e414-ed8b-41f9-b8a1-ec03825d48b9</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/12/29/fork-ruby</link>
      <category>Inspiration</category>
      <category>Ruby</category>
    </item>
    <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;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;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
$ sudo ln -s /opt/ruby1.8/bin/gem1.8 /usr/local/bin&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>
  </channel>
</rss>

