<?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>OnRails.org: Category Ruby On Rails</title>
    <link>http://www.onrails.org/articles/category/ruby-on-rails</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Ruby On Rails and related matters.</description>
    <item>
      <title>MWRC 2010 - Day 1 Live Video</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/wanja/4424356701/" title="Moutains Pano + fingers by danielwanja, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2504/4424356701_61dae3c3b0.jpg" width="500" height="108" alt="Moutains Pano + fingers" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The conference is about to start in 30 minutes, the room starts to buzz. The confreaks guys have their camera and video recording equipment all setup. So you will be able to catch up the conference online soon. Somehow I really like single track conferences and the sessions seem really great and will be fast passed, 30 to 45 minutes. Check out the &lt;a href="http://mtnwestrubyconf.org/2010/schedule"&gt;schedule&lt;/a&gt;. So I will sit back and enjoy the show.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Follow it live on &lt;a href="http://www.justin.tv/mwrc#r=hcNHcJU~"&gt;Justin TV&lt;/a&gt;!!&lt;/strong&gt;&lt;/p&gt;


&lt;object type="application/x-shockwave-flash" height="300" width="400" id="live_embed_player_flash" data="http://www.justin.tv/widgets/live_embed_player.swf?channel=mwrc" bgcolor="#000000"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="allowNetworking" value="all" /&gt;&lt;param name="movie" value="http://www.justin.tv/widgets/live_embed_player.swf" /&gt;&lt;param name="flashvars" value="channel=mwrc&amp;#38;auto_play=false&amp;#38;start_volume=25" /&gt;&lt;/object&gt;&lt;a href="http://www.justin.tv/mwrc#r=-rid-&amp;#38;s=em" class="trk" style="padding:2px 0px 4px; display:block; width:345px; font-weight:normal; font-size:10px; text-decoration:underline; text-align:center;"&gt;Watch live video from Mountain West Ruby Conference on Justin.tv&lt;/a&gt;

	&lt;p&gt;Salt Lake City is definitively a beautiful city, surrounded by it&amp;#8217;s mountains&amp;#8230;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/wanja/4424356615/" title="Library by danielwanja, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2780/4424356615_71c2a0edc3.jpg" width="350" alt="Library" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/wanja/4424356225/" title="Library by danielwanja, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4022/4424356225_b242ec1275.jpg" width="350"  alt="Library" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 11 Mar 2010 15:53:46 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:5cc56f86-2325-4d27-8571-9905b0444afe</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2010/03/11/mwrc-2010</link>
      <category>Ruby On Rails</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>Rails 3: Rack Middleware</title>
      <description>&lt;p&gt;I&amp;#8217;m watching the &lt;a href="https://oreillymedia.webex.com/mw0306l/mywebex/default.do?siteurl=oreillymedia"&gt;Rails Online Conference&lt;/a&gt;, February 2010 Exploring Rails 3 and really like how they setup the rack middleware.&lt;/p&gt;


	&lt;p&gt;...From the slides.&lt;/p&gt;


&lt;h1&gt;Rack Middleware&lt;/h1&gt;

	&lt;p&gt;&lt;a href="http://github.com/rack/rack/tree/master/lib/rack"&gt;http://github.com/rack/rack/tree/master/lib/rack&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Content Modifying&lt;/h3&gt;

&lt;pre&gt;
Rack::Chunked
Rack::ContentLength
Rack::ConditionalGet
Rack::ContentType
Rack::Deflater
Rack::ETag
Rack::Head
Rack::MethodOverride
Rack::Runtime
Rack::Sendfile
Rack::ShowStatus
&lt;/pre&gt;

&lt;h3&gt;Behavioral&lt;/h3&gt;

&lt;pre&gt;
Rack::CommonLogger
Rack::Lint
Rack::Lock
Rack::Reloader
&lt;/pre&gt;

&lt;h3&gt;Routing&lt;/h3&gt;

&lt;pre&gt;
Rack::Cascade
Rack::Recursive
Rack::Static
Rack::URLMap
&lt;/pre&gt;

&lt;h1&gt;Rack::Contrib&lt;/h1&gt;

	&lt;p&gt;&lt;a href="http://github.com/rack/rack-contrib"&gt;http://github.com/rack/rack-contrib&lt;/a&gt;&lt;/p&gt;


&lt;pre&gt;
Rack::AcceptFormat
Rack::Access
Rack::Backstage
Rack::Callbacks
Rack::Config
Rack::Cookies
Rack::CSSHTTPRequest
Rack::Deflect
Rack::Evil
Rack::HostMeta
Rack::JSONP
Rack::LighttpdScriptNameFix
Rack::Locale
Rack::MailExceptions
Rack::NestedParams
Rack::NotFound
Rack::ProcTitle
Rack::Profiler
Rack::ResponseCache
Rack::ResponseHeaders
Rack::RelativeRedirect
Rack::Signals
Rack::SimpleEndpoint
Rack::TimeZone
&lt;/pre&gt;

&lt;h1&gt;Coderack.org&lt;/h1&gt;

	&lt;p&gt;Check also out &lt;a href="http://coderack.org/"&gt;http://coderack.org&lt;/a&gt; ...99 pieces of Rack Middleware&lt;/p&gt;


&lt;h1&gt;RailsGuide: Rails On Rack&lt;/h1&gt;

	&lt;p&gt;&lt;a href="http://guides.rubyonrails.org/rails_on_rack.html"&gt;http://guides.rubyonrails.org/rails_on_rack.html&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 18 Feb 2010 19:14:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:3e8f97c0-1bc0-4ba4-9dd4-4a7892121e0d</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2010/02/18/rails-3-rack-middleware</link>
      <category>Ruby On Rails</category>
      <category>Rails3</category>
    </item>
    <item>
      <title>Time.onrails.org is closing!</title>
      <description>&lt;p&gt;I just send an email to thousands of users to notify them that time.onrails.org is closing down. I don&amp;#8217;t think many of these users are active but just in case I wanted everyone to be able to get their data out of the system if so they wished.&lt;/p&gt;


	&lt;p&gt;I will turn down the service on March 17th at 9pm.&lt;/p&gt;


	&lt;p&gt;Now why in the hell would I close this service. In brief I created it for myself on the plane to RubyConf 2005, thought it was cool and opened it to the public in April 2006. I haven&amp;#8217;t updated the code much since many years and just don&amp;#8217;t have the time to add new features, and trust me Rails code from 2005 looks slightly different than nowadays  Rails code.&lt;/p&gt;


	&lt;p&gt;For posterity here is the &amp;#8220;official&amp;#8221; announcement blog entry of the creation of the service:&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://onrails.org/articles/2006/04/13/new-background-color-yellow-color-rgb-0-0-0-launch-time-onrails-org-time-tracking-made-simple"&gt;April 13, 2006 &amp;#8211; &lt;span class="caps"&gt;LAUNCH&lt;/span&gt; time.onrails.org, time tracking made simple! &lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;And here are &lt;a href="http://onrails.org/articles/category/time-onrails-org"&gt;few more articles&lt;/a&gt; related to time.onrails.org.&lt;/p&gt;


	&lt;p&gt;Here is part of the email I send to the users:&lt;/p&gt;


	&lt;p&gt;&lt;cite&gt;
Time.onrails.org is closing down March 17th 2010 at 9pm Mountain time.&lt;/p&gt;


	&lt;p&gt;You can export your time entry for each project by clicking on the export buttons at the bottom of each project page or you can export your full account by just login and then go to this url:&lt;/p&gt;


	&lt;p&gt;    http://time.onrails.org/export/xml/user&lt;/p&gt;


	&lt;p&gt;This will export each of the projects will all sections including the notes.&lt;/p&gt;


	&lt;p&gt;Please start transitioning to a new service now.&lt;/p&gt;


	&lt;p&gt;As a replacement service I would suggest harvest (http://www.getharvest.com/) which offers a free plan which allows for 2 projects, 4 clients, unlimited invoicing for 1 user absolutely &lt;span class="caps"&gt;FREE&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Thank you to all the users over the years I hope you enjoyed this free service. Time.onrails.org enjoyed thousands of users and I received many nice complimenting emails for the service over the years. The main reason that I close this service is that I am starting to use harvestapp for my own time tracking. I wrote time.onrails.org back in 2005 just for fun and thought it could be useful to others. It fulfilled my needs of keeping track of time for the various customer projects I worked on over the last few years.&lt;/p&gt;


	&lt;p&gt;Since we moved to slicehost it was very stable and I just have good things to say about slicehost, they are just great. Recently one of the slice time.onrails.org was running on had issues and got moved twice over two days. Again slicehost was on top of that situation and I just sat back and they did all the work. But this also reminded me that I cannot just keep the service running without giving it the time and effort it deserves and just now I don&amp;#8217;t have that time as I am working on other projects, such as http://appsden.com.&lt;/p&gt;


	&lt;p&gt;So I went on the search for a replacement service and  looked at many out there. And Harvest just added the timestamp feature, which is exactly how I track time, their app is more fleshed out than time.onrails.org, so I decided to move over to use their services.&lt;/p&gt;


	&lt;p&gt;The great news is while I tweeted about my move to Harvest, Doug, which I knew from his time in Denver mentioned that he now works for Harvest. So he put me in contact with the cofounder and I asked him if they could get some deal for my current users, and they where very responsive and create a special promo code. Thanks for that and I hope you try and enjoy their services. Just for disclaimer I didn&amp;#8217;t ask for any monetization or anything for referring you to Harvest, the idea was just to have an alternate offering in case you needed one. But they offered me a free Solo plan, so hey, at least I got that out of this whole ordeal.&lt;/p&gt;


	&lt;p&gt;Please don&amp;#8217;t hesitate to contact me for any question at daniel@onrails.org.&lt;/p&gt;


	&lt;p&gt;Thank you again for having tried out or being a user of time.onrails.org over all these years.&lt;/p&gt;


	&lt;p&gt;Kind regards,
Daniel Wanja
&lt;/cite&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 18 Feb 2010 03:15:03 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:5c0e2eaf-58f6-4b19-be65-9c19a01b3969</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2010/02/18/time-onrails-org-is-closing</link>
      <category>Ruby On Rails</category>
      <category>Time.OnRails.org</category>
    </item>
    <item>
      <title>Amazon RDS: Amazon Relational Database Service or MySQL in the Cloud for Ruby On Rails.</title>
      <description>&lt;p&gt;For watchthatsite.com (not public yet) I have an instance on &lt;span class="caps"&gt;EC2&lt;/span&gt; with Rails and MySQL but was looking for a more solid hosting solution for MySQL. And how fortunate, Amazon came out with the solution I need this week. Basically with two command line instructions you can start a new server with mysql configured, tuned, and secured. In this blog entry I will go through the steps that perform to move my sql database to Amazon &lt;span class="caps"&gt;RDS&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;You can find more information on Amazon Relational Database Service (API Version 2009-10-16) &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=2927&amp;#38;categoryID=290"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Prerequisite: you need to &lt;a href="http://aws.amazon.com/"&gt;signup&lt;/a&gt; for an account on aws.amazon.com, it can be used for &lt;span class="caps"&gt;EC2&lt;/span&gt;, S3, SimpleDb and all the other services &lt;span class="caps"&gt;AWS&lt;/span&gt; provides.&lt;/p&gt;


&lt;h2&gt;1) Install the Command Line Toolkit&lt;/h2&gt;

	&lt;p&gt;First thing, go download the command line toolkit and read the &lt;span class="caps"&gt;README&lt;/span&gt;.TXT on how to install it. In short you unzip the files, I did put mine at /Developer/aws/RDSCli-1.0.001. Then you create a credential file which contains your &lt;span class="caps"&gt;AWS&lt;/span&gt; access key id and secret key. Then I configured my ~/.bash_profile as follows:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;export AWS_RDS_HOME=/Developer/aws/RDSCli-1.0.001
export AWS_CREDENTIAL_FILE=$AWS_RDS_HOME/credential-file-path.conf
export JAVA_HOME=/Library/Java/Home
export PATH=$AWS_RDS_HOME/bin:$PATH&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;to see that the command line toolkit is setup correctly type $rds&amp;#8212;help&lt;/p&gt;


	&lt;p&gt;You will need the command line tool to execute several commands described here after.&lt;/p&gt;


&lt;h2&gt;2) Create an Instance&lt;/h2&gt;

	&lt;p&gt;Let&amp;#8217;s create a MySQL Server instance. &lt;span class="caps"&gt;RDS&lt;/span&gt; offers the following 5 server instance classes:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;db.m1.small (1.7 GB of &lt;span class="caps"&gt;RAM&lt;/span&gt;, $0.11 per hour)&lt;/li&gt;
		&lt;li&gt;db.m1.large (7.5 GB of &lt;span class="caps"&gt;RAM&lt;/span&gt;, $0.44 per hour)&lt;/li&gt;
		&lt;li&gt;db.m1.xlarge (15 GB of &lt;span class="caps"&gt;RAM&lt;/span&gt;, $0.88 per hour)&lt;/li&gt;
		&lt;li&gt;db.m2.2xlarge (34 GB of &lt;span class="caps"&gt;RAM&lt;/span&gt;, $1.55 per hour)&lt;/li&gt;
		&lt;li&gt;db.m2.4xlarge (68 GB of &lt;span class="caps"&gt;RAM&lt;/span&gt;, $3.10 per hour)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I will choose a small instance which I will call dbserver1 with a database name db1 and allocate 5g of database space. I also set the master username as admin and password as secret.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ rds-create-db-instance --db-instance-identifier db1 --allocated-storage 5 --db-instance-class db.m1.small --engine MySQL5.1 --master-username admin --master-user-password secret --db-name db1 --headers&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The output is the following:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;DBINSTANCE  DBInstanceId  Class        Engine    Storage  Master Username  Status    Backup Retention
DBINSTANCE  db1           db.m1.small  mysql5.1  5        admin            creating  1               
      SECGROUP  Name     Status
      SECGROUP  default  active
      PARAMGRP  Group Name        Apply Status
      PARAMGRP  default.mysql5.1  in-sync&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Now you have a server running and you are being billed $0.11 per hour, that&amp;#8217;s like $80 a month without bandwidth but with backup&amp;#8230;and it took only 2 minutes to get going. Can&amp;#8217;t beat that.&lt;/p&gt;


	&lt;p&gt;To see all the instances you have you can issue the&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;rds-describe-db-instances --headers&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;3) Grant Network Access&lt;/h2&gt;

	&lt;p&gt;So I will grant access from my notebook, assuming the ip address is 24.19.0.48 (you can also specify ranges i.e. 24.19.0.0/50). (Note that access was revoked by &lt;span class="caps"&gt;AWS&lt;/span&gt;, not sure why??)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;rds-authorize-db-security-group-ingress default --cidr-ip 24.19.0.48 --headers&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I also have an ec2 instance which I want to grant access to&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;rds-authorize-db-security-group-ingress default --ec2-security-group-name watchthatsite --ec2-security-group-owner-id 526541544691&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Note the ec2-security-group-owner-id is your Amazon &lt;span class="caps"&gt;AWS&lt;/span&gt; account number, you can find it for example on you account activity page. To see your security configuration issue the following command: rds-describe-db-security-groups default&amp;#8212;headers&lt;/p&gt;


&lt;h2&gt;4) Using the Database&lt;/h2&gt;

	&lt;p&gt;To use your database you first need to find out the endpoint address of your new server. So describe you instances:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;rds-describe-db-instances --headers command&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;DBINSTANCE  DBInstanceId  Created                   Class        Engine    Storage  Master Username  Status     Endpoint Address                              Port  AZ          Backup Retention
DBINSTANCE  db1           2009-10-28T22:53:31.666Z  db.m1.small  mysql5.1  5        admin            available  db1.cyhik6zpub5c.us-east-1.rds.amazonaws.com  3306  us-east-1b  1               
      SECGROUP  Name     Status
      SECGROUP  default  active
      PARAMGRP  Group Name        Apply Status
      PARAMGRP  default.mysql5.1  in-sync&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You find out your endpoint address, for me db1.cyhik6zpub5c.us-east-1.rds.amazonaws.com&lt;/p&gt;


	&lt;p&gt;So now you can connect to your database:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;mysql -h db1.cyhik6zpub5c.us-east-1.rds.amazonaws.com -P 3306 -u admin -p db1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Let&amp;#8217;s configure my Rails application to point to that database and run a migration:&lt;/p&gt;


	&lt;p&gt;So I change my config/database.yml to point to the above database&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;development:
    adapter: mysql
    host: db1.cyhik6zpub5c.us-east-1.rds.amazonaws.com
    reconnect: false
    database: db1
    username: admin
    password: secret&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt; rake db:migrate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
Wow, seem to work.

	&lt;p&gt;Let connect to the mysql console and do a show tables;&lt;/p&gt;


&lt;pre&gt;
+-------------------+
| Tables_in_db1     |
+-------------------+
| schema_migrations | 
| users             | 
| watches           | 
+-------------------+
&lt;/pre&gt;

	&lt;p&gt;Yep, all there.&lt;/p&gt;


	&lt;p&gt;Now I still have to move my old production database to the new one, so let&amp;#8217;s dump the data from my old database:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;mysqldump watchthatsite_development -u admin &amp;gt; wts.sql&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;and reload that data in the new database:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;mysql -h db1.cyhik6zpub5c.us-east-1.rds.amazonaws.com -P 3306 -u admin -p db1 &amp;lt; wts.sql&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Restarting my Rails server…That&amp;#8217;s all!&lt;/p&gt;


	&lt;p&gt;Enjoy,
Daniel.&lt;/p&gt;</description>
      <pubDate>Thu, 29 Oct 2009 03:02:27 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:28dc0a82-86c6-4152-9bad-b962c5fd819f</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2009/10/29/amazon-rds-amazon-relational-database-service-or-mysql-in-the-cloud-for-ruby-on-rails</link>
      <category>Ruby On Rails</category>
    </item>
    <item>
      <title>RMagick (from source) on Snow Leopard</title>
      <description>&lt;p&gt;After the release of 10.5, I published an article about &lt;a href="http://onrails.org/articles/2007/11/03/installing-rmagick-on-leopard-without-macports-or-fink"&gt;building RMagick from source on Leopard&lt;/a&gt;.  I won&amp;#8217;t rehash the why, you can read the original article for that.  My clean install necessitated updating the RMagick script, so here&amp;#8217;s what worked for me to install from source on Snow Leopard!  For the impatient, here&amp;#8217;s the download link:  &lt;a href="http://onrails.org/files/rmagick-build.sh"&gt;rmagick-build.sh&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;First, we start with installing &lt;code&gt;wget&lt;/code&gt;, as it seems to be a bit more clever than &lt;code&gt;curl&lt;/code&gt; about dealing with mirrors, etc.  Then, we compile and install each prerequisite package.  Finally, we install the gem.&lt;/p&gt;


	&lt;p&gt;All the links in the script worked for me, but, depending on your location, network, conditions, etc, your mileage may vary.  Enjoy!&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;#!/bin/sh

# install wget, which is cleverer than curl
curl -O http://ftp.gnu.org/gnu/wget/wget-1.11.tar.gz
tar zxvf wget-1.11.tar.gz 
cd wget-1.11
./configure --prefix=/usr/local
make
sudo make install
cd /usr/local/src

# prerequisite packages
wget http://nongnu.askapache.com/freetype/freetype-2.3.9.tar.gz
tar zxvf freetype-2.3.9.tar.gz
cd freetype-2.3.9
./configure --prefix=/usr/local
make
sudo make install
cd /usr/local/src

wget http://superb-west.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.39.tar.gz
tar zxvf libpng-1.2.39.tar.gz
cd libpng-1.2.39
./configure --prefix=/usr/local
make
sudo make install
cd /usr/local/src

wget ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
tar xzvf jpegsrc.v6b.tar.gz
cd jpeg-6b
ln -s `which glibtool` ./libtool
export MACOSX_DEPLOYMENT_TARGET=10.6
./configure --enable-shared --prefix=/usr/local
make
sudo make install
cd /usr/local/src

wget ftp://ftp.remotesensing.org/libtiff/tiff-3.9.1.tar.gz
tar xzvf tiff-3.9.1.tar.gz
cd tiff-3.9.1
./configure --prefix=/usr/local
make
sudo make install
cd /usr/local/src

wget http://superb-west.dl.sourceforge.net/sourceforge/wvware/libwmf-0.2.8.4.tar.gz
tar xzvf libwmf-0.2.8.4.tar.gz
cd libwmf-0.2.8.4
make clean
./configure
make
sudo make install
cd /usr/local/src

wget http://www.littlecms.com/lcms-1.17.tar.gz
tar xzvf lcms-1.17.tar.gz
cd lcms-1.17
make clean
./configure
make
sudo make install
cd /usr/local/src

wget ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/gs870/ghostscript-8.70.tar.gz
tar zxvf ghostscript-8.70.tar.gz
cd ghostscript-8.70
./configure  --prefix=/usr/local
make
sudo make install
cd /usr/local/src

wget ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/gs860/ghostscript-fonts-std-8.11.tar.gz
tar zxvf ghostscript-fonts-std-8.11.tar.gz
sudo mv fonts /usr/local/share/ghostscript

# Image Magick
wget ftp://ftp.fifi.org/pub/ImageMagick/ImageMagick.tar.gz
tar xzvf ImageMagick.tar.gz
cd `ls | grep ImageMagick-`
export CPPFLAGS=-I/usr/local/include
export LDFLAGS=-L/usr/local/lib
./configure --prefix=/usr/local --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8 --with-gs-font-dir=/usr/local/share/ghostscript/fonts --disable-openmp
make
sudo make install
cd /usr/local/src

# RMagick
sudo gem install rmagick&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;&lt;b style="color:red"&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;&lt;/b&gt; There is a bug with libgomp that breaks the &lt;code&gt;convert&lt;/code&gt; utility (See comments below).  the &lt;code&gt;--disable-openmp&lt;/code&gt; configure option has been added to the script to fix this.&lt;/p&gt;


	&lt;p&gt;&lt;b style="color:red"&gt;&lt;span class="caps"&gt;UPDATE 2&lt;/span&gt;&lt;/b&gt; A new patchlevel of ImageMagick has been released that supersedes the original one referenced in this script, and the original has been removed from the server.  Thanks to Sebastian for this update that will grab the latest release.&lt;/p&gt;</description>
      <pubDate>Fri, 04 Sep 2009 00:31:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:08ef5102-472b-4108-9999-19810cf12917</guid>
      <author>Solomon White</author>
      <link>http://www.onrails.org/articles/2009/09/04/rmagick-from-source-on-snow-leopard</link>
      <category>Ruby</category>
      <category>Rails Tips</category>
      <category>Ruby On Rails</category>
      <category>Source</category>
      <category>leopard</category>
      <category>snow</category>
      <category>rmagick</category>
      <trackback:ping>http://www.onrails.org/articles/trackback/4780</trackback:ping>
    </item>
    <item>
      <title>Introducing Hashdown</title>
      <description>&lt;p&gt;If your database is normalized, you will almost always end up with small tables (often referred to as reference data or lookup tables) which provide a set of possible values for a particular attribute.  (e.g. Currency, Category, etc.)  A common pattern that emerges in many applications is accessing these records by a symbolic name (as opposed to by id) for purposes of clarity when reading the code.  In C (and friends), the database ids can be mapped to the positions of an enum datatype.  I recently released the &lt;a href="https://github.com/rubysolo/hashdown"&gt;hashdown&lt;/a&gt; plugin that provides hash-like access for reference data records, and also adds some dropdown option list generation support, since this data is often used to populate select list in forms.&lt;/p&gt;


	&lt;p&gt;As an example of what hashdown does, suppose we have the following model:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CardType&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;with the following data:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;+----+-------+------------------+
| id | code  | name             |
+====+=======+==================+
| 1  | visa  | Visa             |
| 2  | mc    | MasterCard       |
| 3  | disc  | Discover         |
| 4  | amex  | American Express |
+----+-------+------------------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;By adding the following line to the model:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CardType&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;finder&lt;/span&gt; &lt;span class="symbol"&gt;:code&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You get the functionality of a hash-like square-bracket accessor for the model that will let you do something like:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="attribute"&gt;@order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;card_type&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;CardType&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:visa&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The underlying implementation is similar to:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;CardType&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.[]&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;find_by_code&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;...except it adds a caching layer to boost performance by preventing repeated database access.&lt;/p&gt;


	&lt;p&gt;Adding the following directive:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;CardType&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;selectable&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;to the model gives you a class method called &lt;code&gt;select_options&lt;/code&gt; that can be used to populate a select list like this:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; form.select :card_type_id, CardType.select_options %&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;produces:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_html "&gt;&amp;lt;input type=&amp;quot;select&amp;quot; name=&amp;quot;order[card_type_id]&amp;quot; id=&amp;quot;order_card_type_id&amp;quot;&amp;gt;
  &amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;Visa&amp;lt;/option&amp;gt;
  &amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;MasterCard&amp;lt;/option&amp;gt;
  &amp;lt;option value=&amp;quot;3&amp;quot;&amp;gt;Discover&amp;lt;/option&amp;gt;
  &amp;lt;option value=&amp;quot;4&amp;quot;&amp;gt;American Express&amp;lt;/option&amp;gt;
&amp;lt;/input&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;By default, this will use the &lt;code&gt;id&lt;/code&gt; attribute as the submitted value of the option and call a &lt;code&gt;display_name&lt;/code&gt; method (if it exists) for the displayed value of the option, falling back to the &lt;code&gt;name&lt;/code&gt; method/attribute.  Each of these can be overridden by passing a symbol attribute / method name, or a lambda that will be executed to generate the value.  For (a contrived) example:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; form.select :card_type_id, CardType.select_options(:key &lt;/span&gt;&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:code&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:value&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="ident"&gt;card_type&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;card_type&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;reverse&lt;/span&gt; &lt;span class="punct"&gt;})&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;produces:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_html "&gt;&amp;lt;input type=&amp;quot;select&amp;quot; name=&amp;quot;order[card_type_id]&amp;quot; id=&amp;quot;order_card_type_id&amp;quot;&amp;gt;
  &amp;lt;option value=&amp;quot;visa&amp;quot;&amp;gt;asiV&amp;lt;/option&amp;gt;
  &amp;lt;option value=&amp;quot;mc&amp;quot;&amp;gt;draCretsaM&amp;lt;/option&amp;gt;
  &amp;lt;option value=&amp;quot;disc&amp;quot;&amp;gt;revocsiD&amp;lt;/option&amp;gt;
  &amp;lt;option value=&amp;quot;amex&amp;quot;&amp;gt;sserpxE naciremA&amp;lt;/option&amp;gt;
&amp;lt;/input&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Again, the &lt;code&gt;select_option&lt;/code&gt; results are cached for better performance.&lt;/p&gt;


	&lt;p&gt;This is a pretty small plugin that I&amp;#8217;m using to &lt;span class="caps"&gt;DRY&lt;/span&gt; up some code in a current project I&amp;#8217;m working on.  Let me know if you have feature requests (or fork and patch it on &lt;a href="https://github.com/rubysolo/hashdown"&gt;GitHub&lt;/a&gt;!)&lt;/p&gt;</description>
      <pubDate>Tue, 04 Aug 2009 23:51:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:29e2df29-fe41-438e-84c9-87fe7e5bbded</guid>
      <author>Solomon White</author>
      <link>http://www.onrails.org/articles/2009/08/04/introducing-hashdown</link>
      <category>Ruby On Rails</category>
    </item>
    <item>
      <title>Behind the scene: Quiltivate.com a beautiful Flex on Rails website.</title>
      <description>I met Phil several years ago at Derailed, the (Denver Ruby on Rails user group, and for a long time he was curious about how Flex can be integrated with Rails, about the graphical possibilities that Flex offers, the advantages over plain HTML/CSS/Javascript. Then he told me Kacie, his wife, had an idea about a website. She is passionate about quilts and has an eye for details and excellence. Phil is a geek that loves Rails, Kacie loves quilts,  it's like Quilting meets Web 2.0 and &lt;a href="http://quiltivate.com/"&gt;quiltivate.com&lt;/a&gt; was born. In fact Phil and Kacie hired me to create a Quilt Builder that integrates with &lt;a href="http://quiltivate.com/"&gt;Quiltivate.com&lt;/a&gt;. Kacie had the vision for the whole concept, a simple to use quilt builder that removes lots of the hassle of calculating how much fabric of what color is needed and allows to play with blocks, shapes and colors. She drew a paper prototype that really highlights the tag line of their site" Innovating Traditional Quilting". &lt;a href="http://quiltivate.com/"&gt;Quiltivate.com&lt;/a&gt; offer much more than a Quilt Builder, it's a blog and a community centered around the art and craft of quilting. Over the last year I spent a couple of hours here and there, well a little more than that, to transform the  paper prototype into a real Flex application.  Rather than writing about what the tool does and how it does it, let's have a little look at behind the scene of the Quilt Builder with this video:

&lt;object width="400" height="300"&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=5619106&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=5619106&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="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/5619106"&gt;Behind the scene: Quiltivate.com a beautiful Flex on Rails website.&lt;/a&gt; from &lt;a href="http://vimeo.com/user507500"&gt;daniel wanja&lt;/a&gt;.&lt;/p&gt;

Check out &lt;a href="http://quiltivate.com/"&gt;quiltivate.com&lt;/a&gt; for a video on how to really use the Quilt Builder and go try it out. As it's fresh out of the gates their may be a little quirks here and there, so please let me know what you find. So thank you Kacie and Phil for getting me on this project, it was really fun!

Enjoy,
Daniel.</description>
      <pubDate>Thu, 16 Jul 2009 04:20:01 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:e6c62462-fc1c-4913-be89-f856ed58e8c1</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2009/07/16/behind-the-scene-quiltivate-com-a-beautiful-flex-on-rails-website</link>
      <category>Flex</category>
      <category>Ruby On Rails</category>
    </item>
    <item>
      <title>Screencast: Testing Flex Apps with Cucumber - Take 2</title>
      <description>I was not really happy with &lt;a href="http://onrails.org/articles/2009/07/08/screencast-testing-flex-apps-with-cucumber"&gt;last week's screencast&lt;/a&gt; I did on testing Flex with Cucumber.  Effectively doing screencast is not an easy endeavor and trying to it myself is making me appreciate all the other screencast I watch so much more. So last week I just wasn't comfortable while I recorded it, not sure why, but I thought I should try to capture it again. And the second time around I felt better, maybe I should alway take two takes (or even more :-). So here is the new one...

&lt;object width="400" height="300"&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=5577569&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=5577569&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="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/5577569"&gt;Screencast: Testing Flex Apps with Cucumber - Take 2&lt;/a&gt; from &lt;a href="http://vimeo.com/user507500"&gt;daniel wanja&lt;/a&gt;.&lt;br/&gt;


To run this code you need to have all the gems installed. So config your Rails to run Cucumber with FunFx (in config/environments/test.rb):

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;rspec&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:lib&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:version&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;gt;= 1.2.7&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;rspec-rails&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:lib&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:version&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;gt;= 1.2.7&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;webrat&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:lib&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:version&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&amp;gt;= 0.4.4&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;cucumber&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:lib&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;
&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;funfx&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;safariwatir&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Config Cucumber to have @flex available (in features/support/env.rb)

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;funfx&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;funfx/browser/safariwatir&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;browser&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Watir&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Safari&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;browser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;goto&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;

&lt;span class="constant"&gt;Before&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="attribute"&gt;@flex&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;browser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;flex_app&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;flashContent&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;flashContent&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;at_exit&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;browser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

In the same file disable transactional fixtures

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="constant"&gt;Cucumber&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Rails&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;use_transactional_fixtures&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Ensure that your Flex application is compiled with the funfx library and the automation library linked in.

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;notextile&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;flex-config&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;compiler&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
	&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;include-libraries&lt;/span&gt; &lt;span class="attribute"&gt;append&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;../../lib/funfx-0.2.2.swc&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;../../lib/automation.swc&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;../../lib/automation_agent.swc&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;../../lib/automation_dmv.swc&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;../../lib/automation_agent_rb.swc&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;library&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
	&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;include-libraries&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;compiler&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;flex-config&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 13 Jul 2009 17:04:11 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:47902dcc-c61b-4d52-aeac-6ac2e5606b15</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2009/07/13/screencast-testing-flex-apps-with-cucumber-take-2</link>
      <category>Ruby On Rails</category>
      <category>Flex</category>
    </item>
    <item>
      <title>Screencast: Testing Flex Apps with Cucumber</title>
      <description>I was playing with Cucumber and FunFx to drive a Flex application and it's really cool and created this screencast to show how this all works together. The first 5 minutes  I build a Restfulx scaffolded Flex application. The following 5 minutes I configure the Flex app with FunFx, which is required to be able to drive the app from Cucumber. Then the main part which is 20 minutes of creating three cucumber scenarios that drives the Flex application. Check it out:

&lt;object width="400" height="300"&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=5502928&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=5502928&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="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/5502928"&gt;Testing Flex Apps with Cucumber&lt;/a&gt; from &lt;a href="http://vimeo.com/user507500"&gt;daniel wanja&lt;/a&gt;

The source code can be found on &lt;a href="http://github.com/danielwanja/cucumberwithflex/tree/master"&gt;github&lt;/a&gt;

Enjoy!
Daniel

&lt;br/&gt;
UPDATE:  An updated version (and slightly) different version of the screencast can be found &lt;a href="http://onrails.org/articles/2009/07/13/screencast-testing-flex-apps-with-cucumber-take-2"&gt;here&lt;/a&gt;.</description>
      <pubDate>Wed, 08 Jul 2009 07:03:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:a3296360-b6e8-4c4a-9d0c-0cf218b65c22</guid>
      <author>Daniel Wanja</author>
      <link>http://www.onrails.org/articles/2009/07/08/screencast-testing-flex-apps-with-cucumber</link>
      <category>Flex</category>
      <category>Ruby On Rails</category>
    </item>
    <item>
      <title>RailsConf 2009 Day Two</title>
      <description>&lt;p&gt;Day Two got off to a good start.  Engine Yard did a promotional pitch&amp;#8212;the speakers could have been a bit more polished, but it was interesting stuff about their one-button-deployment, and overall not bad for an advertisement.&lt;/p&gt;


	&lt;p&gt;Next up was Chris Wanstrath.  He started with a lead in regarding how to become a famous Rails developer&amp;#8212;focusing on yourself, your blog readership numbers, your twitter follower count, etc.  Later, he talked about how he went from being an unemployed college dropout to co-founder of the very successful GitHub, due to &lt;strong&gt;sharing code&lt;/strong&gt;.  His point was that in his eyes, it&amp;#8217;s better to focus more on the community: share code, contribute to open source projects, even write documentation for existing projects.  Being a &lt;strong&gt;good&lt;/strong&gt; developer trumps being a famous developer.  The complete text of the talk is &lt;a href="https://gist.github.com/0a2655aed6a26fa15a02"&gt;online here&lt;/a&gt; .&lt;/p&gt;


	&lt;p&gt;For the first session of the day, it was a tough call between Rack/Sinatra and Metric Fu.  I finally went with:&lt;/p&gt;


	&lt;h2&gt;Using metric_fu to Make Your Rails Code Better  &amp;#8211; Jake Scruggs&lt;/h2&gt;


	&lt;p&gt;The central theme of this talk was how to use automated code analysis to direct you on where to spend your refactoring cycles.  He used Carlin&amp;#8217;s law (Anyone going slower than me is stupid; anyone going faster than me is crazy), but applied to programming.  As your programming skills change over time, you see the same code differently.&lt;/p&gt;


	&lt;p&gt;He touched on coverage as a baseline that you should be doing as a part of your code analysis, then went on to complexity analysis, reviewing two tools available to analyze the &amp;#8220;complexity&amp;#8221; of your code:  Flog and Saikuro.  Flog examines your code (&lt;code&gt;flog -g app&lt;/code&gt; for a Rails app) and gives you a (somewhat arbitrary) numeric range measuring the relative complexity of your code.  Basically, 0-10 is awesome (and practically unatainable), 11-20 is okay for real world methods, and it goes downhill from there.  If you have 200+ complexity scores, refactor immediately!  Flog is somewhat opinionated about what is good/bad or more/less complex, but generally does a good job in helping you avoid the &amp;#8220;icebergs&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Saikuro gives a more concrete result&amp;#8212;the &amp;#8220;score&amp;#8221; is the number of branches through a method, including tertiary operators, foo if/unless bar, etc.  This is a plus over Flog, and usually indicates about how many tests you should have (one per branch).  The downside to Saikuro is that it does not pick up on dynamically defined methods, where Flog does.&lt;/p&gt;


	&lt;p&gt;Next, we walked through a refactoring example, where Jake showed using high Flog scores as a hit list of where to refactor next.  He also mentioned that better readability trumps lower complexity scores, one thing to keep in mind&amp;#8212;as being generated by automated tools, the scores should be taken as a guide, not a law.  A good point was brought up during Q&amp;#38;A: there is currently no way to &amp;#8220;flag&amp;#8221; a high-scoring method as acceptable, so if you have a justifiably complex method that you choose to live with (e.g. for readability), then you&amp;#8217;ll have to live with the flogging you will receive.  I&amp;#8217;m sure patches would be welcome if someone wanted to fix this!&lt;/p&gt;


	&lt;p&gt;On to code smell and Reek and Roodi, tools to identify smells (overly large methods, etc.)  Reek tends to warn over smaller issues than Roodi, and can indicate false positives.  Roodi generally tends to have fewer complaints&amp;#8212;if it warns about something, it should probably be fixed!&lt;/p&gt;


	&lt;p&gt;Next up was Flay, which detects non-DRY-ness in code, anything from strict copy-n-paste to functionally identical blocks with different variable names to do..end blocks matching curly-brace blocks.&lt;/p&gt;


	&lt;p&gt;Also covered was a way to track source control churn.  At this point, you&amp;#8217;re probably thinking &amp;#8220;How can I keep up with all this?&amp;#8221;  Luckily, there&amp;#8217;s metric_fu, a way to wrap all this up into one package and get all this code analysis goodness in your project.  Install the gem, then run &lt;code&gt;rake metrics:all&lt;/code&gt;.  For more info, installation instructions, etc., see: &lt;a href="http://metric-fu.rubyforge.org/"&gt;http://metric-fu.rubyforge.org/&lt;/a&gt;  Looking forward to adding this bag of tricks to our CI toolset.&lt;/p&gt;


	&lt;h2&gt;Rails 3: Step off of the Golden Path &amp;#8211; Matt Aimonetti&lt;/h2&gt;


	&lt;p&gt;Matt started off with a history of programming languages and how Ruby came to be, including some of Matz&amp;#8217; core philosophies embodied in the language.  Moving along to Rails, he talked about the growth of Rails and the desire for increased performance and options that led to the split between Rails and Merb.  This led us in to the discussion of the current and future state of affairs for Rails 3.&lt;/p&gt;


Currently, as &lt;span class="caps"&gt;DHH&lt;/span&gt; mentioned in the opening keynote, there is no official release for Rails 3.  However, much work has been done, and a direction / ideas are emerging that will be implemented once an official release is ready.  These include:
	&lt;ul&gt;
	&lt;li&gt;improved performance&lt;/li&gt;
		&lt;li&gt;increased modularity&lt;/li&gt;
		&lt;li&gt;agnosticism&lt;/li&gt;
		&lt;li&gt;public api&lt;/li&gt;
		&lt;li&gt;mountable apps&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Matt emphasized that there will be no drastic changes, and by default, &lt;code&gt;rails app&lt;/code&gt; will generate a very similar application to what you would get today under 2.x.  However, there will no longer be the idea of &amp;#8220;the one true Rails way&amp;#8221; of building an app&amp;#8212;the framework will be less opinionated.  However, you should go through a process of justification to see if you really &lt;strong&gt;need&lt;/strong&gt; something different than the default stack.&lt;/p&gt;


Some of the options you will be able to choose from:
	&lt;ul&gt;
	&lt;li&gt;JavaScript frameworks, including jQuery, &lt;span class="caps"&gt;YUI&lt;/span&gt;, ExtJS, MooTools, Prototype, or the ability to write your own, and plug it in.&lt;/li&gt;
		&lt;li&gt;Different templating engines:  &lt;span class="caps"&gt;HAML&lt;/span&gt;, ERb (this is already doable in Rails)&lt;/li&gt;
		&lt;li&gt;Different ORMs:  ActiveRecord, DataMapper, &lt;span class="caps"&gt;SEQUEL&lt;/span&gt;, Hibernate, non-RDBMS stores like CouchDB, Tokyo Cabinet, etc.&lt;/li&gt;
	&lt;/ul&gt;


At this point, Matt gave a demo of some of the nicer features in DataMapper, contrasted with ActiveRecord:
	&lt;ul&gt;
	&lt;li&gt;DataMapper re-uses existing Ruby object for both sides of a &lt;code&gt;has_many&lt;/code&gt; / &lt;code&gt;belongs_to&lt;/code&gt; relationship.  In other words, if I load parent and child records from the database, and look at &lt;code&gt;parent.object_id&lt;/code&gt; as compared to &lt;code&gt;child.parent.object_id&lt;/code&gt;, under DataMapper, these will point to the same object automatically, while with ActiveRecord, these will be separate objects.  (Note that &lt;a href="http://github.com/rails/rails/commit/ccea98389abbf150b886c9f964b1def47f00f237"&gt;inverse_of&lt;/a&gt; was recently checked into rails, which enables this in ActiveRecord as well )&lt;/li&gt;
		&lt;li&gt;DataMapper does automatic lazy loading as well as strategic eager loading, so in this scenario:&lt;/li&gt;
	&lt;/ul&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;@parent = Parent.find(12345)
@parent.children.each do |child|
  puts child.name
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

ActiveRecord would need some hints (&lt;code&gt;:include =&amp;gt; :children&lt;/code&gt;) to be added to the original query to avoid the N+1 iteration problem, where DataMapper is clever enough to figure that out and generate 2 &lt;span class="caps"&gt;SQL&lt;/span&gt; queries for you automatically.
	&lt;ul&gt;
	&lt;li&gt;The ability to have multiple repositories (which looks like it means databases), and a &lt;code&gt;copy&lt;/code&gt; method on models to clone data from one database to another&amp;#8212;one use case would be an automatic archive or backup process that copies data generated within the last week to a backup database.&lt;/li&gt;
		&lt;li&gt;Query Path, allowing more flexibility in &lt;span class="caps"&gt;SQL&lt;/span&gt; condition generation (WHERE name &lt;span class="caps"&gt;LIKE&lt;/span&gt; &amp;#8216;&lt;span&gt;foo&lt;/span&gt;&amp;#8216;)&lt;/li&gt;
		&lt;li&gt;one potential gotcha that was mentioned: DataMapper does not support &lt;span class="caps"&gt;STI&lt;/span&gt; and Polymorphic associations as well as ActiveRecord does&lt;/li&gt;
	&lt;/ul&gt;


Finally, he highlighted some options that would be available for even further customization, such as defining your own:
	&lt;ul&gt;
	&lt;li&gt;file structure&lt;/li&gt;
		&lt;li&gt;router &lt;span class="caps"&gt;DSL&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;request handling
But he voiced the opinion that the vast majority of Rails apps will not need anything like this&amp;#8212;make sure your need justifies coloring outside the lines.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;All in all a good presentation, maybe a bit much focus on DataMapper specifically.  However, I personally enjoyed the DataMapper bits, and might have to try it out on a project, if it&amp;#8217;s a fit.&lt;/p&gt;


	&lt;h2&gt;Art of the Ruby Proxy for Scale, Performance, and Monitoring &amp;#8211; Ilya Grigorik&lt;/h2&gt;


	&lt;p&gt;I skipped out on the afternoon sessions, so my next talk was Ilya&amp;#8217;s&amp;#8212;never disappointing.  Ilya spoke about EM-Proxy, his event machine based proxy.  He gave good example code of how EM proxy could be used to implement transparent and intercepting proxies.&lt;/p&gt;


	&lt;p&gt;It started with an itch at PostRank, Ilya&amp;#8217;s blog aggregation solution.  An effective staging environment should closely resemble the production environment&amp;#8212;the problem was that their production environment spanned nearly 80 (virtual) servers on &lt;span class="caps"&gt;EC2&lt;/span&gt;&amp;#8217;s cloud.  Spinning up that many servers just as a staging environment was an expensive proposition.  Also, simulating production traffic then becomes a challenge, as you end up trying to store production logs and &amp;#8220;replay&amp;#8221; them into the staging environment.  The way that they chose to solve the problem was to separate a group of the servers into a staging app server pool, set up a proxy that would transparently (to the end user) intercept incoming requests, send them to both the production and staging pools simultaneously, then return only the production response to the user, using the staging response internally for benchmarking, testing output, etc.  With this strategy, the more static parts of the system (web servers, load balancers, etc.) can be shared across environments, and the staging environment is testing the part that actually changes (the application servers).&lt;/p&gt;


	&lt;p&gt;The first example code was a transparent proxy that simply forwarded a request from one port to another.  Ilya built on this to show how you could dynamically alter request/response data on the fly.  Finally, he built up to the original scenario: duplexing a single request across two (or multiple) backend servers, but returning only a specific response.  As he mentioned in the talk, one strategy for servicing a specific request as fast as possible might be to send the request to all machines in your pool, then respond with whichever request completed first.&lt;/p&gt;


	&lt;p&gt;These examples were centered around &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests, but he went on to show some other examples of how this is not protocol-specific:  you are just dealing with data over a socket connection, so as long as you understand the underlying protocol, EM-Proxy could be useful.  His examples showed &lt;span class="caps"&gt;SMTP&lt;/span&gt; proxies for accepting/rejecting incoming mail by email address and implementing a spam filter by forwarding the incoming mail to Defensio before passing it along to your real &lt;span class="caps"&gt;SMTP&lt;/span&gt; server.  The final example was pretty clever:  an implementation of EM-Proxy to reduce the memory overhead of beanstalkd by selectively delaying queue inserts based on the scheduled execution time&amp;#8212;basically buffering far future jobs into the database instead of immediately inserting into the work queue.&lt;/p&gt;


	&lt;p&gt;Slides are available here: &lt;a href="http://bit.ly/ruby-proxy"&gt;http://bit.ly/ruby-proxy&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Another packed day at RailsConf 09, one more to go!&lt;/p&gt;</description>
      <pubDate>Thu, 07 May 2009 03:13:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:a053057f-09a5-48ee-b24d-c3cf5cea290b</guid>
      <author>Solomon White</author>
      <link>http://www.onrails.org/articles/2009/05/07/railsconf-2009-day-two</link>
      <category>Ruby On Rails</category>
      <category>RailsConf</category>
    </item>
  </channel>
</rss>
