<?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: Category Code Snippets</title>
    <link>http://crunchlife.com/articles/category/code-snippets</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>Subversion: Merging a Branch into Trunk</title>
      <description>&lt;p&gt;I can never remember how to merge a &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt; branch into trunk.  So for future reference, here is how it&amp;#8217;s done.&lt;/p&gt;

&lt;p&gt;First, get a working copy of the head revision of trunk.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;svn checkout svn://svnserver/project/trunk project&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next, merge the branch with your working copy.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;svn merge svn://svnserver/project/trunk svn://svnserver/project/branches/branch project&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, commit the results of the merge.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;cd project
svn commit -m &amp;quot;Merging branch X.X.X into trunk.&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can also specify a revision number in your merge.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;svn merge svn://svnserver/project/trunk@223 svn://svnserver/project/branches/branch@223 project&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That&amp;#8217;s it.&lt;/p&gt;</description>
      <pubDate>Tue, 25 Aug 2009 18:21:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:32e934ca-5772-409a-a579-b8c7692c38b4</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/08/25/subversion-merging-a-branch-into-trunk</link>
      <category>Code Snippets</category>
      <category>Oops</category>
      <category>SCM</category>
      <category>SVN</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>Multiple Subversion Services on Windows</title>
      <description>&lt;p&gt;&lt;img src="/files/subversion.jpg" class="right"&gt;It&amp;#8217;s possible, but not often necessary, to run multiple instances of the &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt; service on Microsoft Windows.  At work, the source code of IT staff and Engineers is kept on two different servers with a third hosting Subversion.  Since one of our Engineering departments recently decided to test Subversion as their &lt;a href="http://en.wikipedia.org/wiki/Source_Code_Management" target="_blank"&gt;SCM&lt;/a&gt; system, I had to install an additional service to manage their repositories.&lt;/p&gt;

&lt;p&gt;I have a horrible time remembering the syntax for creating a Subversion service.  That said, I&amp;#8217;ve posted my worst case scenario for future reference.  The arguments include UNC paths, ports, and lots of slashes.  Next time, with the help of Google, I&amp;#8217;ll remember.  Oh, and if you&amp;#8217;re receiving a 1053 error, it may be that you need to run the service under an account with sufficient rights to the UNC path used as the root (-r) Subversion repository.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;sc create svnserve_it binpath= &amp;quot;\&amp;quot;C:\Program Files\CollabNet Subversion Server\svnserve.exe\&amp;quot; --service -r \&amp;quot;\\ITFILESERVER\Repositories\&amp;quot; --listen-port 3690&amp;quot; displayname= &amp;quot;Subversion Server (IT)&amp;quot; depend= tcpip start= auto&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;sc create svnserve_engineering binpath= &amp;quot;\&amp;quot;C:\Program Files\CollabNet Subversion Server\svnserve.exe\&amp;quot; --service -r \&amp;quot;\\ENGFILESERVER\Repositories\&amp;quot; --listen-port 3691&amp;quot; displayname= &amp;quot;Subversion Server (Engineering)&amp;quot; depend= tcpip start= auto&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Jun 2009 13:13:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:e212a326-066b-4523-a6fe-1f75c8a3c8b1</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/06/10/multiple-subversion-services-on-windows</link>
      <category>Code Snippets</category>
      <category>SCM</category>
      <category>SVN</category>
      <enclosure type="image/jpeg" length="21456" url="http://crunchlife.com/files/subversion.jpg"/>
    </item>
    <item>
      <title>System.Net.Mail.SmtpFailedRecipientException and Exchange 2007</title>
      <description>&lt;p&gt;I&amp;#8217;d recently been struggling with a .NET application that sends email via SMTP through Exchange 2007 outside of my domain at work.  That is, until I found &lt;a href="http://stackoverflow.com/questions/444210/how-do-i-send-emails-outside-my-domain-with-exchange-2007-and-c" target="_blank"&gt;a workaround&lt;/a&gt; that uses the Exchange 2007 Pickup folder.  This eliminated my authentication hassles and resolved the dreaded &lt;strong&gt;Mailbox unavailable. The server response was: 5.7.1 Unable to relay&lt;/strong&gt; error.  I&amp;#8217;ve posted the solution here, but I also suggest reading &lt;a href="http://stackoverflow.com/questions/444210/how-do-i-send-emails-outside-my-domain-with-exchange-2007-and-c" target="_blank"&gt;the original post&lt;/a&gt;.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;SmtpClient smtpClient = new SmtpClient(&amp;quot;EXCHANGESRV&amp;quot;, 25) {
    DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory,
    PickupDirectoryLocation = &amp;quot;\\EXCHANGESRV\PickupFolder&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Keep in mind that you&amp;#8217;ll either need sufficient write permission on the Pickup folder or be able to impersonate somebody that does.  I happen to have &lt;a href="http://crunchlife.com/articles/2008/05/27/temporary-identity-impersonation-in-asp-net" target="_blank"&gt;written about identity impersonation&lt;/a&gt; a few months ago.  You&amp;#8217;re in luck.&lt;/p&gt;

&lt;p&gt;Kudos to &lt;a href="http://stackoverflow.com/" target="_blank"&gt;stackoverflow.com&lt;/a&gt;.  I only wish I had enough rep to upvote the submitter. :(&lt;/p&gt;</description>
      <pubDate>Fri, 30 Jan 2009 09:45:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:732e970b-8123-45a8-90e6-214f6938c382</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/01/30/system-net-mail-smtpfailedrecipientexception-and-exchange-2007</link>
      <category>Code Snippets</category>
      <category>Expect the Unexpected</category>
      <category>dotNET</category>
      <category>Oops</category>
    </item>
    <item>
      <title>And finally, kill Excel...</title>
      <description>&lt;p&gt;Everyone who&amp;#8217;s worked with Excel on the Microsoft .NET framework has dealt with the problem of hanging Excel processes. The C# solution below is not very elegant, but it stops those pesky Excel processes from hanging around.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;using System.Diagnostics;
using System.Runtime.InteropServices;

[DllImport(&amp;quot;user32.dll&amp;quot;)]
private static extern
    int GetWindowThreadProcessId(int hWnd, out int processId);

private static void CreateSpreadsheet()
{
    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

    try
    {
      // Create Excel spreadsheet.
    }
    catch (Exception ex)
    {
      // Do something with the exception.
    }
    finally
    {
      KillExcel(excel.hWnd);
    }
}

private static void KillExcel(int hWnd)
{
    int processId;
    int threadProcessId = GetWindowThreadProcessId(hWnd, out processId);

    Process.GetProcessById(processId).Kill();
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 14 Jan 2009 20:07:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:48876e48-1801-44ba-a6d2-73902582a453</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2009/01/14/and-finally-kill-excel</link>
      <category>Code Snippets</category>
      <category>CSharp</category>
      <category>dotNET</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>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>Yet Another Join Method</title>
      <description>&lt;p&gt;The .NET String type has a &lt;a href="http://msdn.microsoft.com/en-us/library/57a79xd0.aspx" target="_blank"&gt;Join method&lt;/a&gt;, but in my latest ASP.NET project I had the need for joining String array elements with additional prefix and suffix values. The method below delimits array elements with the provided separator and concatenates the elements with the prefix and suffix string parameters.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve found this particularly handy when creating SQL statements that require the IN keyword.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;string[] names = { &amp;quot;Bobby&amp;quot;, &amp;quot;Suzy&amp;quot; };

sql += &amp;quot;WHERE People.FirstName IN (&amp;quot; + Utility.Join(&amp;quot;,&amp;quot;, names, &amp;quot;'&amp;quot;, &amp;quot;'&amp;quot;) + &amp;quot;)&amp;quot;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add this method to your utility class or extended String type.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;public static string Join(string separator, string[] value, string
prefix, string suffix)
{
    string toReturn = String.Empty;

    int i;
    for (i = 0; i &amp;lt; value.Length; i++)
    {
        if (i != value.Length - 1)
            toReturn += prefix + value[i] + suffix + separator;
        else
            toReturn += prefix + value[i] + suffix;
    }

    return toReturn;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 12 Sep 2008 14:27:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:05392c66-db31-4f67-80a6-e73740c41523</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/09/12/yet-another-join-method</link>
      <category>Code Snippets</category>
      <category>CSharp</category>
      <category>dotNET</category>
    </item>
    <item>
      <title>Using LoginView on HyperLinkFields within a GridView</title>
      <description>&lt;p&gt;&lt;img src="/files/aspnet.gif" class="right"&gt;The title of this post is a bit misleading. Using a LoginView to manage the security of HyperLinkFields within a GridView does not work. There are, however, other means to achieve the same result.&lt;/p&gt;

&lt;p&gt;Using the GridView&amp;#8217;s OnRowDataBound event, I&amp;#8217;ve set my Cells containing HyperLinkFields, on DataRows with a RowIndex of -1, to an empty string if the user does not belong to the &amp;#8220;Administrators&amp;#8221; role. This hides my HyperLinkFields from underprivileged users and prevents elements of my GridView&amp;#8217;s header and footer from not appearing.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;protected void GridView1_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowIndex != -1)
    {
        if (!Page.User.IsInRole(&amp;quot;Administrators&amp;quot;))        
            e.Row.Cells[0].Text = String.Empty;
    }           
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;*Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I just found a &lt;a href="http://forums.asp.net/t/943849.aspx" target="_blank"&gt;thread&lt;/a&gt; on the ASP.NET forums that covers the same problem. In their solution, the GridView&amp;#8217;s RowType is checked before setting the Cell&amp;#8217;s Visibility property to false. This makes more sense than relying on the RowIndex property to determine whether or not a DataRow&amp;#8217;s Cell should be hidden. In the method below, I&amp;#8217;ve integrated the DataControlRowType enumeration as suggested by the ASP.NET forums. Since setting the Visibility property of Cells containing HyperLinkFields caused my GridView headings to not line up properly, I decided to assign the Cell&amp;#8217;s Text property to String.Empty as in my previous example.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;protected void GridView1_OnRowDataBound(object sender, GridViewRowEventArgs e)
{                  
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (!Page.User.IsInRole(&amp;quot;Administrators&amp;quot;))
            e.Row.Cells[0].Text = String.Empty;
    }   
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 13 Aug 2008 12:45:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:95cccc69-ac5a-417a-aa72-8d64168cd1ab</guid>
      <author>Ryan Baxter</author>
      <link>http://crunchlife.com/articles/2008/08/13/using-loginview-on-hyperlinkfields-within-a-gridview</link>
      <category>Code Snippets</category>
      <category>ASPNET</category>
      <enclosure type="image/gif" length="3597" url="http://crunchlife.com/files/aspnet.gif"/>
    </item>
  </channel>
</rss>
