<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Article RSS Feed</title>
    <link>http://your-web-site.com/rss/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>The main blog feed for my Web site.</description>
    
    
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/rubypond/JXRc" type="application/rss+xml" /><item>
          <title>DataMapper Migrations</title>
          <description>&lt;p&gt;I&amp;#8217;ve been working on some merb related things of late, and I&amp;#8217;m planning on writing a more detailed article on creating a merb application from scratch as so many of the tutorials out there kind of leave you hanging. In the interim though, I&amp;#8217;m just going to touch on a little nugget of information that isn&amp;#8217;t very well publicised regarding DataMapper, one of the ORMs that gets used with merb.&lt;/p&gt;

&lt;h2&gt;ActiveRecord Style Migrations with DataMapper&lt;/h2&gt;

&lt;p&gt;That&amp;#8217;s right, you aren&amp;#8217;t left having to wrestle with the command line and &lt;em&gt;ALTER TABLE&lt;/em&gt; statements just because you&amp;#8217;ve left ActiveRecord behind. All the migration joy you&amp;#8217;ve come to love with ruby on rails can come and live with you happily with merb and DataMapper.&lt;/p&gt;

&lt;p&gt;First things first, you&amp;#8217;ll want to generate a new migration:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;merb-gen migration my_migration&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We should now have a file named &lt;em&gt;001_my_migration.rb&lt;/em&gt; and if we look at it, it won&amp;#8217;t be too foreign based on our ActiveRecord experiences:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;migration 2, :my_migration do
  up do
  end

  down do
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To pad it out with some code that is actually useful, add in the definitions for what you want done:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;migration 2, :my_migration do
  up do
    create_table(:posts) do
      column(:id, Integer, :serial =&gt; true)
      column(:title, String, :size =&gt; 255)
      column(:description, Text)
      column(:published, Boolean)
      column(:created_at, DateTime)
      column(:updated_at, DateTime)
    end
  end

  down do
    drop_table(:posts)
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Running the DataMapper Migration&lt;/h2&gt;

&lt;p&gt;And now that we&amp;#8217;ve got the migration we are happy with, applying it to our underlying database is just a matter of the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake dm:db:migrate&lt;/code&gt;&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=NA9JM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=NA9JM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=reG4m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=reG4m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=YVbcM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=YVbcM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=xeeQM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=xeeQM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=PJfpM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=PJfpM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=glr1M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=glr1M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=E0j4m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=E0j4m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=soahM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=soahM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=eNcnm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=eNcnm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Sun, 05 Oct 2008 21:20:20 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/10/05/datamapper-migrations/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195117/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/10/05/datamapper-migrations/</feedburner:origLink></item>
    
        <item>
          <title>Introducing Map.ly, collaborative mapping</title>
          <description>&lt;p&gt;From the necessity is the mother of all invention category, I introduce a new product I’ve hastily cobbled together over the past week or so. Map.ly is a means of “sharing directions, locations, and maps” with other people.&lt;/p&gt;


&lt;p&gt;It is still very much in development, I’m loathe to call it beta as it’s probably closer to alpha but still… So what is it’s purpose? My girlfriend is forever having to plan meetings and trips for the people in her team, and trying to herd these sheep &lt;strong&gt;ahem&lt;/strong&gt; I meant orientate her colleagues in foreign cities can be tricky. She needed something to accompany their printed itinerary showing all the various locations they’d need to be during their stay, and where they were in relation to each other. And print out a google map for each location seemed needlessly difficult and not that helpful, we wanted to plot everything on the one map if possible.&lt;/p&gt;


&lt;p&gt;Enter Map.ly. Double click where you want to place a marker, enter in the name and some details, and save. You’ll get a nice short URL back to the map that you can pass around and you can all add your own markers to it. I think support in IE might currently be a little bit flaky, I’ll check later today. And there are a number of features still in the pipeline (getting directions between points, entering in addresses, etc.) but I’m hoping it will prove to be something useful. So go &lt;a href="http://map.ly/"&gt;give someone some directions to somewhere&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;And most useful to the geeks out there, is that it’s forced me to resurrect a long since dead gem I once wrote for mapping as I felt YM4R and the other Map API gems just weren’t ruby enough. Once the feature set is locked in, I’ll release an updated version allowing you to do all the cool things that get implemented on Map.ly.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=mD7GM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=mD7GM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=9qJym"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=9qJym" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=cxp2M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=cxp2M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=s3UlM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=s3UlM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=vb3jM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=vb3jM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=EqdmM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=EqdmM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=Vka2m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=Vka2m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=31pFM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=31pFM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=tNG4m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=tNG4m" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Tue, 12 Aug 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/08/12/introducing-map-ly-collaborative-mapping/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195118/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/08/12/introducing-map-ly-collaborative-mapping/</feedburner:origLink></item>
    
        <item>
          <title>Nginx Intermediary SSL Certificates and Passphrases</title>
          <description>&lt;p&gt;I’ve had to do this 3 or 4 times in the past 12 months, and each time I waste a good chunk of time trying to re-discover how to do it. So this post is as much for my own documentation sake as it is sharing the love. If you’ve ever bought an SSL certificate from GoDaddy or a similar provider that provides and intermediary certificate to include, you might have run into a bit of a problem trying to work out how to include it in your nginx config. Well it’s actually pretty straight-forward, provided you remember the steps.&lt;/p&gt;


&lt;h2&gt;Merging the site and intermediary SSL certificates&lt;/h2&gt;


&lt;p&gt;First thing you’ll need to do is create a new certificate, which is just the one for your site and the intermediary merged together. In Apache you’d specify them both individually. Nginx only allows you to specify one, so lets put them in the same file:&lt;/p&gt;


&lt;pre&gt;&lt;code class="console"&gt;
cat rubypond.com.crt &gt;&gt; rubypond.com.crt.merged
cat intermediate_bundle.crt &gt;&gt; rubypond.com.crt.merged
&lt;/code&gt;
&lt;/pre&gt;

&lt;h2&gt;Removing SSL Passphrase&lt;/h2&gt;


&lt;p&gt;The next step, is to remove the passphrase off the key for the site. I’d love to keep it on, but it means nginx can’t be restarted without an operator at the console to enter in the passphrase every time which is definitely less than ideal. So to remove the passphrase from your key, I’ll first back it up and then take it off with openssl:&lt;/p&gt;


&lt;pre&gt;&lt;code class="console"&gt;
mv rubypond.key rubypond.key.passphrased
openssl rsa -in rubypond.key.passphrased -out rubypond.key
&lt;/code&gt;
&lt;/pre&gt;

&lt;h2&gt;Configuring Nginx to use your new SSL certificate&lt;/h2&gt;


&lt;p&gt;This config is taken straight from my earlier article on &lt;a href="http://rubypond.com/articles/2008/02/01/setting-up-nginx-ssl-and-virtual-hosts/"&gt;setting up nginx, ssl, and virtual hosts&lt;/a&gt;, but I’ll include it here just for good measure too:&lt;/p&gt;


&lt;pre&gt;&lt;code class="nginx"&gt;
server {
  listen 443;
  server_name myserver.com;  

  ssl on;
  ssl_certificate /etc/nginx/certs/rubypond.com.crt.merged; 
  ssl_certificate_key /etc/nginx/certs/rubypond.key; 

  # put the rest of your server configuration here.

  location / {
     proxy_set_header X-FORWARDED_PROTO https;

     # put your config here
  }
}
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Just be sure to point the certificate entry to the new merged certificate, the key at the now un-passphrased key, and restart nginx. Done.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=AmC0M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=AmC0M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=VOuum"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=VOuum" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=AOUxM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=AOUxM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=pt44M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=pt44M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=CeX0M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=CeX0M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=Xb3KM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=Xb3KM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=znN9m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=znN9m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=ldo0M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=ldo0M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=kmRwm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=kmRwm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Mon, 11 Aug 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/08/11/nginx-intermediary-ssl-certificates-and-passphrases/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195120/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/08/11/nginx-intermediary-ssl-certificates-and-passphrases/</feedburner:origLink></item>
    
        <item>
          <title>The complete guide to setting up Starling</title>
          <description>&lt;p&gt;We wanted to push some long running tasks off to the background so that we didn’t tie up a mongrel needlessly. I’ve wrestled (and won!) with backgroundrb in the past, but it just seemed like a chore. And they’ve since changed the API enough to mean it would be back to the drawing board, so we may as well assess some of the other options. So without too much further ado, the complete guide to installing, using, and monitoring starling.&lt;/p&gt;


&lt;p&gt;For those that haven’t heard &lt;a href="http://rubyforge.org/projects/starling/" rel="nofollow"&gt;Starling&lt;/a&gt; is the back-end queuing system that Twitter use. And despite the stability issues Twitter have, if initial impressions are anything to go by I don’t think Starling is the reason. It’s fairly light, sits on top of MemCache, and is very quick. The initial lure to Starling though was via the Workling plug-in. We could get a prototype out the door using just the Spawn workling, and then when a queue became important switch over.&lt;/p&gt;


&lt;h2&gt;Installing Workling&lt;/h2&gt;


&lt;p&gt;We’re going to take the same approach I did, and get a prototype background process happening with Spawn first. So let’s install Workling and Spawn:&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;
script/plugin install http://svn.playtype.net/plugins/workling/
script/plugin install http://spawn.rubyforge.org/svn/spawn/
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Now in your environment (environment.rb? an initializer? you decide) add the following:&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;
Workling::Remote.dispatcher = Workling::Remote::Runners::SpawnRunner.new
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;Done!&lt;/p&gt;


&lt;h2&gt;Creating A Workling Background Worker&lt;/h2&gt;


&lt;p&gt;Now it’s time to create a worker, basically to define what it is exactly that should be executed in the background. For the same of illustration, I’m just going to loop and create some records. I create the follow &lt;em&gt;app/workers/example_worker.rb&lt;/em&gt; file:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;class ExampleWorker &lt; Workling::Base

  def create_new_records
    1000.times do
      Item.create :some_name =&gt; options[:some_name]
    end
  end 

end&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Calling Your New Workling Background Worker&lt;/h2&gt;


&lt;p&gt;Now in whichever controller would normally need to start this task, you can place a call to the workling worker:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;ExampleWorker.async_create_new_records(:some_name =&gt; "This Person")&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Workling will create a new method for us to call, by prefixing out method name with &lt;em&gt;async_&lt;/em&gt; to allow us to call it asynchronously. Pass in a hash of values you want to use into the method, workling will add a key named &lt;em&gt;:uid&lt;/em&gt; containing the unique identifier assigned to this task.&lt;/p&gt;

&lt;p&gt;And now we’re done here too! This will use Spawn to fork the job, take it out of the mongrel process, and let your rails stack continue and not hold up your other users.&lt;/p&gt;

&lt;h2&gt;Installing Starling&lt;/h2&gt;

&lt;p&gt;Install Starling by grabbing the gem and the MemCache Client (which strangely has a dependency on ZenTest which I need to investigate…):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install memcache-client starling&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now the dependencies are installed, we need to start up the required services. You’re going to need the Starling daemon running, as well as the workling client. I’d rather not have Starling run as root so first I create a user, and then give it somewhere to create it’s pid and spool files (you can probably skip this and run as root on your local dev box):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /usr/sbin/adduser -s /sbin/nologin starling
sudo mkdir -p /var/spool/starling
sudo mkdir -p /var/run/starling
sudo chown starling:starling /var/spool/starling
sudo chown starling:starling /var/run/starling&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And now time to start up the services:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo -u starling starling -P /var/run/starling/starling.pid -d
script/workling_starling_client start&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A note of particular importance here. The workling_starling_client will run in whatever environment &lt;strong&gt;RAILS_ENV&lt;/strong&gt; is set to, and is not passed in via a command line option. It also does some fruity things with loading up your workers at run time, so if you’re running development and test on the one box you’ll need to stop the workling client and restart it each time you want to change environments (or best yet, set your rake:spec/rake:test task to do it for you).&lt;/p&gt;

&lt;h2&gt;Switching Over To Starling For Background Processing&lt;/h2&gt;

&lt;p&gt;Switching between background processing systems is pretty simple, we just update the environment setting we made earlier to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Workling::Remote.dispatcher = Workling::Remote::Runners::StarlingRunner.new&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And that’s it, business as usual!&lt;/p&gt;

&lt;h2&gt;Monitoring the sucker&lt;/h2&gt;

&lt;p&gt;It is all fine and dandy having it up and running now, but it’d be nice to keep it that way. That’s where god comes in and some tomfoolery with our &lt;em&gt;app.god&lt;/em&gt; config. If you’ve not already done so, I suggest you read my previous article on &lt;a href="http://rubypond.com/articles/2008/04/07/rails-god-config/"&gt;monitoring rails with god&lt;/a&gt; which talks about creating a generic config file in your rails app so you don’t need to manage god configs for each instance.&lt;/p&gt;

&lt;p&gt;I’m going to change the example &lt;em&gt;app.god&lt;/em&gt; in that article to look like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Rubypond
  attr_reader :ports, :server_names, :workling_client

  def initialize
    @ports = [5000, 5001]
    @server_names = "www.rubypond.com rubypond.com" 
    @workling_client = true
  end
end

@apps &lt;&lt; Rubypond.new&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And within the &lt;em&gt;god.conf&lt;/em&gt; on the server I’ll add the following methods:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def configure_workling_client(w, rails_root,  app_name)
  w.uid = "mongrel" 
  w.gid = "webserver" 
  w.name = "#{app_name}-workling" 
  w.group = "#{app_name}" 
  w.interval = 30.seconds
  w.start = "RAILS_ENV=production #{rails_root}/script/workling_starling_client start" 
  w.stop = "#{rails_root}/script/workling_starling_client stop" 
  w.restart = "#{rails_root}/script/workling_starling_client restart" 
  w.pid_file = "#{rails_root}/log/workling.pid" 

  w.behavior(:clean_pid_file)
end

def monitor_app(w)
  start_if_not_running(w)
  restart_if_resource_hog(w)
  monitor_lifecycle(w)
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Okay, so &lt;em&gt;monitor_app&lt;/em&gt; is actually just renaming &lt;em&gt;monitor_rails_app&lt;/em&gt; to be more generic. Make sure you change references everywhere though. Elsewhere in the &lt;em&gt;god.conf&lt;/em&gt; file we had a block similar to the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@apps.each do |app|
  app_name = app.class.name.downcase
  rails_root = "/var/www/apps/#{app_name}/current" 

  app.ports.each do |port|
    God.watch do |w|
      configure_mongrel(w, rails_root, app_name, port)
      monitor_rails_app(w)
    end
  end

  God.watch do |w|
    configure_workling_client(w, rails_root, app_name)
    monitor_app(w)
  end if app.respond_to? :workling_client
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The last &lt;em&gt;God.watch&lt;/em&gt; there is where the magic happens. It will look at the app we’ve defined in &lt;em&gt;app.god&lt;/em&gt;, and if we’ve provided an attribute called :workling_client then it will automatically monitor a workling client for this app. We’re not quite done yet though. We also need Starling to be running, but that’s not on a per app basis we just have one for the server. So I’m just going to insert this directly into &lt;em&gt;god.conf&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;God.watch do |w|
  w.name = "starling" 
  w.group = "starlings" 
  w.uid = "starling" 
  w.gid = "starling" 
  w.interval = 30.seconds # default
  w.start = "/usr/bin/starling -P /var/run/starling/starling.pid -d" 
  w.start_grace = 20.seconds
  w.restart_grace = 20.seconds
  w.pid_file = "/var/run/starling/starling.pid" 
  w.behavior(:clean_pid_file)

  monitor_app(w)
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now restart god to take the new config, deploy you changes to your rails app, and cross your fingers ;)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=LyUCM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=LyUCM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=Xoksm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=Xoksm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=aKZ4M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=aKZ4M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=kOEuM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=kOEuM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=i8XCM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=i8XCM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=NrhjM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=NrhjM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=GBUxm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=GBUxm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=AT6IM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=AT6IM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=IrO2m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=IrO2m" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Thu, 17 Jul 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/07/17/the-complete-guide-to-setting-up-starling/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195121/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/07/17/the-complete-guide-to-setting-up-starling/</feedburner:origLink></item>
    
        <item>
          <title>Sexy Forms in Rails</title>
          <description>&lt;p&gt;I’ve been meaning to release this for quite a while now, I’ve finally got around to packaging it up for some form of public consumption. Basically, I got sick of having to manually create label tags for each of my form inputs. They should be there by default so that users with visual or other impairments have enough additional information to use the site. I’m also lazy, and would have a tendency to forget to put them in otherwise. I also wanted a consistent way to display any additional contextual information, so here it is.&lt;/p&gt;

&lt;p&gt;I’ll go through the code in detail here, but I’ll keep it updated with any changes and available for download at the &lt;a href="http://github.com/rubypond/semantic_form_builder/tree" rel="nofollow"&gt;semantic form builder git repo&lt;/a&gt;. So now on to the code.&lt;/p&gt;

&lt;p&gt;It started with a custom FormBuilder.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class SemanticFormBuilder &lt; ActionView::Helpers::FormBuilder
  include SemanticFormHelper

  def field_settings(method, options = {}, tag_value = nil)
    field_name = "#{@object_name}_#{method.to_s}" 
    default_label = tag_value.nil? ? "#{method.to_s.gsub(/\_/, " ")}" : "#{tag_value.to_s.gsub(/\_/, " ")}" 
    label = options[:label] ? options.delete(:label) : default_label
    options[:class] ||= "" 
    options[:class] += options[:required] ? " required" : "" 
    label += "&lt;strong&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/strong&gt;" if options[:required]
    [field_name, label, options]
  end

  def text_field(method, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("text", field_name, label, super, options)
  end

  def file_field(method, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("file", field_name, label, super, options)
  end

  def datetime_select(method, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("datetime", field_name, label, super, options)
  end

  def date_select(method, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("date", field_name, label, super, options)
  end

  def radio_button(method, tag_value, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("radio", field_name, label, super, options)
  end

  def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
    field_name, label, options = field_settings(method, options)
    wrapping("check-box", field_name, label, super, options)
  end

  def select(method, choices, options = {}, html_options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("select", field_name, label, super, options)
  end

  def time_zone_select(method, choices, options = {}, html_options = {})
    field_name, label, options = field_settings(method, options)
    # wrapping("time-zone-select", field_name, label, super, options)
    select_box = this_check_box = @template.select(@object_name, method, choices, options.merge(:object =&gt; @object), html_options)
    wrapping("time-zone-select", field_name, label, select_box, options)    
  end

  def password_field(method, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("password", field_name, label, super, options)
  end

  def text_area(method, options = {})
    field_name, label, options = field_settings(method, options)
    wrapping("textarea", field_name, label, super, options)
  end

  def submit(method, options = {})
    field_name, label, options = field_settings(method, options.merge( :label =&gt; "&amp;amp;nbsp;"))
    wrapping("submit", field_name, label, super, options)
  end

  def submit_and_cancel(submit_name, cancel_name, options = {})
    submit_button = @template.submit_tag(submit_name, options)
    cancel_button = @template.submit_tag(cancel_name, options)
    wrapping("submit", nil, "", submit_button+cancel_button, options)
  end

  def radio_button_group(method, values, options = {})
    selections = []
    values.each do |value|
      if value.is_a?(Hash)
        tag_value = value[:value]
        label = value[:label]
        help = value.delete(:help)
      else
        tag_value = value
        value_text = value
      end
      radio_button = @template.radio_button(@object_name, method, tag_value, options.merge(:object =&gt; @object, :help =&gt; help))
      selections &lt;&lt; boolean_field_wrapper(
                        radio_button, "#{@object_name}_#{method.to_s}",
                        tag_value, value_text)
    end
    selections    
    field_name, label, options = field_settings(method, options)
    semantic_group("radio", field_name, label, selections, options)    
  end

  def check_box_group(method, values, options = {})
    selections = []
    values.each do |value|
      if value.is_a?(Hash)
        checked_value = value[:checked_value]
        unchecked_value = value[:unchecked_value]
        value_text = value[:label]
        help = value.delete(:help)
      else
        checked_value = 1
        unchecked_value = 0
        value_text = value
      end
      check_box = @template.check_box(@object_name, method, options.merge(:object =&gt; @object), checked_value, unchecked_value)
      selections &lt;&lt; boolean_field_wrapper(
                        check_box, "#{@object_name}_#{method.to_s}",
                        checked_value, value_text)
    end
    field_name, label, options = field_settings(method, options)
    semantic_group("check-box", field_name, label, selections, options)    
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Personally I think they are a terribly underused aspect of the Rails framework. Anyway, stepping through what we’ve got here. We inherit from &lt;em&gt;ActionView::Helpers::FormBuilder&lt;/em&gt; and then begin overriding the various tags that will be called within a &lt;em&gt;form_for&lt;/em&gt;. All we do for most methods is call &lt;em&gt;field_settings&lt;/em&gt; followed by &lt;em&gt;wrapping&lt;/em&gt;. In the method &lt;em&gt;field_settings&lt;/em&gt; we set the name of the field to the standard rails convention like person_first_name (&lt;em&gt;@object&lt;/em&gt; is created for us automatically by &lt;em&gt;form_for&lt;/em&gt; so we don’t need to worry about it here). Next we set the label text to display for this form input, it will default to something sensible (generally the name of the field you are generating the input for) or you can override it per input by passing &lt;em&gt;:label&lt;/em&gt; in as an option. And finally, we check if you have passed &lt;em&gt;:required =&gt; true&lt;/em&gt; in and if so we set a required class so we can style it differently. All the relevant info gets returned, so we can pass it into the &lt;em&gt;wrapping&lt;/em&gt; method.&lt;/p&gt;

&lt;p&gt;So where exactly is wrapping? I’ve moved it out into a helper, as I wanted to use this functionality in regular &lt;em&gt;form_tag&lt;/em&gt; calls as well as &lt;em&gt;form_for&lt;/em&gt;. So take a look in &lt;em&gt;semantic_form_helper&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module SemanticFormHelper

  def wrapping(type, field_name, label, field, options = {})
    help = %Q{&lt;span class="help"&gt;#{options[:help]}&lt;/span&gt;} if options[:help]
    to_return = []
    to_return &lt;&lt; %Q{ &lt;div class="#{type}-field #{options[:class]}"&gt;}
    to_return &lt;&lt; %Q{&lt;label for="#{field_name}"&gt;#{label}#{help}&lt;/label&gt;} unless ["radio","check", "submit"].include?(type)
    to_return &lt;&lt; %Q{&lt;div class="input"&gt;}
    to_return &lt;&lt; field
    to_return &lt;&lt; %Q{&lt;label for="#{field_name}"&gt;#{label}&lt;/label&gt;} if ["radio","check"].include?(type)    
    to_return &lt;&lt; %Q{&lt;/div&gt;&lt;/div&gt;}
  end

  def semantic_group(type, field_name, label, fields, options = {})
    help = %Q{&lt;span class="help"&gt;#{options[:help]}&lt;/span&gt;} if options[:help]
    to_return = []
    to_return &lt;&lt; %Q{&lt;div class="#{type}-fields #{options[:class]}"&gt;}
    to_return &lt;&lt; %Q{&lt;label for="#{field_name}"&gt;#{label}#{help}&lt;/label&gt;}
    to_return &lt;&lt; %Q{&lt;div class="input"&gt;}    
    to_return &lt;&lt; fields.join
    to_return &lt;&lt; %Q{&lt;/div&gt;&lt;/div&gt;}
  end

  def boolean_field_wrapper(input, name, value, text, help = nil)
    field = []
    field &lt;&lt; %Q{&lt;label&gt;#{input} #{text}&lt;/label&gt;}
    field &lt;&lt; %Q{&lt;div class="help"&gt;#{help}&lt;/div&gt;} if help
    field
  end

  def check_box_tag_group(name, values, options = {})
    selections = []
    values.each do |item|
      if item.is_a?(Hash)
        value = item[:value]
        text = item[:label]
        help = item.delete(:help)
      else
        value = item
        text = item
      end
      box = check_box_tag(name, value)
      selections &lt;&lt; boolean_field_wrapper(box, name, value, text)
    end
    label = options[:label]
    semantic_group("check-box", name, label, selections, options)    
  end      

end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are 3 cases to look at initially. Wrapping a normal input, wrapping a boolean input (like a check box), and wrapping a group of check boxes. For wrapping a normal input, we create a label on the left and insert the field into a div on the right. I’ve got the boolean one there for the “remember me?” type of scenario on a login page, where it looked to make more sense to have the label to the right of the checkbox rather than the left. And finally, wrapping a group of elements which isn’t handled at all well in the current Rails setup. Overwhelmed yet? Let’s just look at how you use it then:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;% form_for @document do |f|
  field_set_tag "Form Details" do %&gt;
    &lt;%= f.date_select :date, :required =&gt; true, :help =&gt; "date the something happened" %&gt;
    &lt;%= f.text_field :number, :required =&gt; true, :help =&gt; "the reference number for this thing" %&gt;
    &lt;%= f.select :external_id, [["Choose an option...",""]] + @externals.map{|c| [c.name, c.id]}, :required =&gt; true, :label =&gt; "options", :help =&gt; "select something from the list" %&gt;
    &lt;%= check_box_tag_group "document[other_items][]", @others.map{|u| { :value =&gt; u.id, :label =&gt; u.description }}, :label =&gt; "including these?", :help =&gt; "tick the whatever boxes are appropriate for this&amp;amp;nbsp;thing" %&gt;
    &lt;%= f.text_field :name, :help =&gt; "what was Willis talkin' about?" %&gt;
    &lt;%= f.check_box :list, :label =&gt; "mailing list", :help =&gt; "can we send you a bunch of spam?" %&gt;
    &lt;%= f.submit_and_cancel("save", "cancel") %&gt;
&lt;% end %&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You’ll see we can pass in &lt;em&gt;:required =&gt; true&lt;/em&gt; to visually identify required fields to the user. If we don’t like the form name (like the generic &lt;strong&gt;“list”&lt;/strong&gt; attribute, then we can override with &lt;em&gt;:label =&gt;&lt;/em&gt;. And if there is additional contextual help to provide, we’ve got &lt;em&gt;:help =&gt;&lt;/em&gt;. We’ve also got a pretty way of showing a selection of check boxes with &lt;em&gt;check_box_tag_group&lt;/em&gt;, but you’ll have to specify the field name yourself. I’ve also put a convenience method in called &lt;em&gt;submit_and_cancel&lt;/em&gt; that takes the text for a submit, and cancel button respectively. Catching the cancel action is up to you though.&lt;/p&gt;

&lt;a href="http://s3.amazonaws.com:/rubypond/page_attachments/214/sexy-forms-in-rails.png" rel="nofollow"&gt; &lt;img src="http://s3.amazonaws.com:/rubypond/page_attachments/214/sexy-forms-in-rails_preview.png" size="preview"&gt;&lt;/a&gt;

&lt;p&gt;And voila! The finished product. Any problems with it, please let me know or fork and fix/pull request on github. I’ve tested it on Safari 3, Firefox 2/3, and IE7. No idea what it looks like on IE6 just yet.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt;: It’s now a plugin, &lt;a href="http://rubypond.com/articles/2008/08/01/pluginized-sexy-forms-in-rails/"&gt;sexy and semantic forms are now available as a plugin&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=kFE3M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=kFE3M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=Wkmnm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=Wkmnm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=7gMLM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=7gMLM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=4BieM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=4BieM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=nVJVM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=nVJVM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=KBq9M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=KBq9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=SD8mm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=SD8mm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=WSlxM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=WSlxM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=cTyfm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=cTyfm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Wed, 16 Jul 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/07/16/sexy-forms-in-rails/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195122/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/07/16/sexy-forms-in-rails/</feedburner:origLink></item>
    
        <item>
          <title>Useful Flash Messages in Rails</title>
          <description>&lt;p&gt;Inevitably somewhere in your rails app you display flash messages to your users to inform them that an action has (or hasn’t) taken place. Sometimes they need to provide more info, maybe you’ve just created some new information for them. Why make them sit around, or wonder where they need to go next when you can take them straight to it in the message itself?&lt;/p&gt;

&lt;p&gt;I’ve ripped this code out of a project I’ve been working on and made it a little more generic. Initially I was going to just insert a link in the flash message, but as I was rightly pointed out by my pair and &lt;a href="http://effectif.com/" rel="nofollow"&gt;elegant coder extraordinaire&lt;/a&gt;, that would mean I’d be polluting my controller with logic and content that should be handled by the view. How do we solve a problem like pollution?&lt;/p&gt;

&lt;p&gt;First, we updated the controller so that the flash message now looked something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;flash[:error] = "Username and password do not match. If you have 
                   forgotten your password you can %s"&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;em&gt;%s&lt;/em&gt; is there to use a string substitution later. If you wanted to insert your link somewhere else, move the &lt;em&gt;%s&lt;/em&gt;. Next, we created a new key in flash to hold our additional information (the link path and text):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;flash[:error_item] = ["reset it&amp;amp;nbsp;here", forgot_path]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Quite simply, it’s an array with the first item being the text and the second the path. Now for handling it within our view, here’s what I’ve got in &lt;strong&gt;application_helper.rb&lt;/strong&gt;:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;FLASH_NOTICE_KEYS = [:error, :notice, :warning]

  def flash_messages
    return unless messages = flash.keys.select{|k| FLASH_NOTICE_KEYS.include?(k)}
    formatted_messages = messages.map do |type|      
      content_tag :div, :class =&gt; type.to_s do
        message_for_item(flash[type], flash["#{type}_item".to_sym])
      end
    end
    formatted_messages.join
  end

  def message_for_item(message, item = nil)
    if item.is_a?(Array)
      message % link_to(*item)
    else
      message % item
    end
  end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The reason for the constant is that I don’t use just &lt;em&gt;:error&lt;/em&gt; and &lt;em&gt;:notice&lt;/em&gt;, I’ve also got &lt;em&gt;:warning&lt;/em&gt; for times when something needs action but not because of something the user has done wrong (I don’t want to make them feel bad when they’ve not had the opportunity to be good!). In flash messages I exit out on the first line if we don’t have content to process for the flashes I expect to output (&lt;em&gt;:error&lt;/em&gt;, &lt;em&gt;:notice&lt;/em&gt;, and &lt;em&gt;:warning&lt;/em&gt;) otherwise I loop over each and create a &lt;em&gt;div&lt;/em&gt; to contain the message. The class on the &lt;em&gt;div&lt;/em&gt; will be either &lt;em&gt;error&lt;/em&gt;, &lt;em&gt;notice&lt;/em&gt; or &lt;em&gt;warning&lt;/em&gt; so you can style it properly. We defer working out the content to &lt;em&gt;message_for_item&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;em&gt;message_for_item&lt;/em&gt; I check if the input is an Array, and if so I use the build in string substitution method to insert the link in the relevant place. As you may notice, I’ve called splat on &lt;strong&gt;item&lt;/strong&gt; by putting an asterisk in front of it. That means your array can essentially just be the parameters you’d pass in to &lt;strong&gt;link_to&lt;/strong&gt;, allowing you to add additional classes or options if you wish. If it’s not an array, I skip the link to and just to the substitution. This will handle traditional flash messages as well as some that might want substitution of a string or other object. Wherever you’d previously inserted your flash messages, now you call:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;%= flash_messages%&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and the end result is something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://s3.amazonaws.com:/rubypond/page_attachments/210/Picture_3.png" rel="nofollow"&gt; &lt;img src="http://s3.amazonaws.com:/rubypond/page_attachments/210/Picture_3_preview.png" size="preview"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;So what else could you do with this? Well we extended it to be a little more intelligent based on the object that was passed in. You could also use it as part of a before filter if you’ve got flash messages that are relatively similar across actions on controllers. Just put &lt;em&gt;%s&lt;/em&gt; in the bit to substitute, and then at the relevant part of your action you can insert the a string into &lt;em&gt;flash[:error_item]&lt;/em&gt; or the appropriate key, and have it displayed. Like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_filter :set_message, :only =&gt; [:create, :update]

  def create
    @order = Order.create!(params[:order])
    flash[:notice_item] = "#{@order.items} items" 
  end

  def update
    @order = Order.find(params[:id])
    @order.update_attributes(params[:order])
    flash[:notice_item] = "#{@order.items} items" 
  end

  private
    def set_message

      flash[:notice] = "Thank you, we have updated your order with %s" 
    end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I hope it helps. Coming up next, my sexy form builder!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=8pMeM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=8pMeM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=T1wjm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=T1wjm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=1xEJM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=1xEJM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=6ZkiM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=6ZkiM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=jw9FM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=jw9FM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=8OFtM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=8OFtM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=TcP1m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=TcP1m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=mnSaM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=mnSaM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=w4Eym"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=w4Eym" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Fri, 11 Jul 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/07/11/useful-flash-messages-in-rails/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195125/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/07/11/useful-flash-messages-in-rails/</feedburner:origLink></item>
    
        <item>
          <title>Make your own IM bot in Ruby, and interface it with your Rails app</title>
          <description>&lt;p&gt;In a super secret project I’m currently working on, I’ve been looking for ways of making it easier for people to interact with the system without the need to log in to the website. That’s included the obvious things like having a RESTful API so they can put their own services and interfaces on top, but that only works for developers or 3rd party application providers. What about your average Joe on the street, how come they get forced into having to log in to the site to update their data, etc.? Why not provide a means of carrying out simple tasks in an application they probably already have? And so an Instant Messaging interface was designed to send a instruction to a robot, and it’s relatively simple to get setup.&lt;/p&gt;


&lt;p&gt;The best thing about it is that we help give more control and time back to the user, hopefully making the system more appealing to use. No more breaking your train of thought while you go log into a site to check something, just a quick message to a bot and you can forget about it. Or conversely, you wont defer the task because the overhead in writing a reminder is possibly more than the time it would take to just do it. And for those fans of the Getting Things Done (GTD) approach to task management, it means a whole range of tasks can be suddenly just “get done” in the &lt;a href="http://en.wikipedia.org/wiki/Getting_Things_Done#Process" rel="nofollow"&gt;process phase&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;So how do we give such amazing power and flexibility to our users? First you’re going to need to install the &lt;a href="http://github.com/ln/xmpp4r/tree/master" rel="nofollow"&gt;xmpp4r gem&lt;/a&gt; which at the time of writing doesn’t seem to play nice with the new version of rubygems (I think it’s to do with the way new rubygems preserves permissions). The problem appears to be fixed in version 0.3.2.99, but only 0.3.2 is available as a gem. So in the interim, we are going to have to download it directly from the git repository and build it ourselves:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone git://github.com/ln/xmpp4r.git xmpp4r
cd xmpp4r
rake gem:install
sudo gem install xmpp4r-simple&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And now some ruby code. Connecting is straight-forward:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'rubygems'  
require 'xmpp4r-simple'
messenger = Jabber::Simple.new('my-bot@gmail.com', "bot-password")&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As is sending a message:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;messenger.deliver("a-real-person@gmail.com", "Why hello there Mr. Person, your bot is here now!")&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you wish to have your service sit around and respond to messages, then something you’ll need something like the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;while true
  messenger.received_messages do |msg|  
    puts msg.body  
    messenger.deliver("a-real-person@gmail.com", "Got your message, thanks!")  
  end  
  sleep 2  
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now just to point out for those that aren’t paying close attention, the above code does the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creates a loop that we will continually go over&lt;/li&gt;
&lt;li&gt;Call &lt;strong&gt;received_messages&lt;/strong&gt; and pass any messages into a block, iterating over each one at a time&lt;/li&gt;
&lt;li&gt;Stop processing for 2 seconds so the system can take a break and we don’t use up all of the resources&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Of particular importance once again, I’ve created an infinite loop here to listen to incoming messages. &lt;b&gt;DO NOT put this code in a rails app&lt;/b&gt;, this is the kind of process that needs to be handled outside of rails as a supporting but background task. If you try and kick it off via rails it will process indefinitely and tie up one of your mongrel instances until it dies and likely degrade the performance of your site in the process.&lt;/p&gt;


&lt;p&gt;That’s all well and good, but wasn’t the whole point of this to give our users a more convenient way to interface with our site and &lt;strong&gt;their&lt;/strong&gt; data? Let us have a look a a slightly more useful implementation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'rubygems'  
require 'xmpp4r-simple'
messenger = Jabber::Simple.new('my-bot@gmail.com', "bot-password")
while true
  messenger.received_messages do |msg|
    user = User.find_by_im_name(msg.from)
    if user
      case msg.body
      when /^help /i
        messenger.deliver(msg.from, "Valid commands are......")  
      when /^status /i
        user.status = msg.body.sub(/^status /i)
        user.save
        messenger.deliver(msg.from, "Thanks #{user.first_name}, your status has been updated")  
      when /^balance\?/i
        messenger.deliver(msg.from, "#{user.first_name}, your current remaining balance is #{user.remaining_balance}")  
      else
        messenger.deliver(msg.from, "Sorry #{user.first_name}, I didn't understand that. Message me with 'help' for a list of commands")  
      end
    else
      messenger.deliver(msg.from, "Sorry, but we've not got this account registered on our system. Sign-up or update your details at http://www.mysite.com/")  
    end    
  end  
  sleep 2  
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The easiest way to have this run now is to call it via &lt;strong&gt;script/runner&lt;/strong&gt; so that we can get access to our ActiveRecord models and interface with the underlying data. All you need to do is kick this off with an init script, setup something like &lt;a href="http://rubypond.com/articles/2007/12/28/touched-by-god-process-monitoring/"&gt;god for process monitoring&lt;/a&gt; to ensure it stays alive and keeps within some same memory and CPU constraints.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=UbMMM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=UbMMM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=Du8Am"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=Du8Am" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=POO2M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=POO2M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=07NyM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=07NyM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=u9ndM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=u9ndM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=ggQwM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=ggQwM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=WYYJm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=WYYJm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=FkMoM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=FkMoM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=xm6Zm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=xm6Zm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Thu, 26 Jun 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/06/26/make-your-own-im-bot-in-ruby-and-interface-it-with-your-rails-app/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195132/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/06/26/make-your-own-im-bot-in-ruby-and-interface-it-with-your-rails-app/</feedburner:origLink></item>
    
        <item>
          <title>Ruby and Microformats</title>
          <description>&lt;p&gt;Heard about &lt;a href="http://microformats.org/" rel="nofollow"&gt;microformats&lt;/a&gt; ? Want to know how to consume them within your rails app? It’s a suprisingly simple task. But why would you bother? Well lets take a somewhat practical example. What if on your site you wanted to include a list of upcoming events that you were either attending or might be of use to your users? Say for example, &lt;a href="http://upcoming.yahoo.com/search/?quick_date=next_7_days&amp;amp;search_placeid=DevLebebApj4RVbtaQ&amp;amp;rt=0" rel="nofollow"&gt;events in the UK for the next 30 days&lt;/a&gt;&lt;/p&gt;

            
&lt;p&gt;The first thing you need to do, is go grab &lt;a href="http://mofo.rubyforge.org/" rel="nofollow"&gt;mofo&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install mofo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And now include it in your ruby/ruby on rails application:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'mofo'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next, find the URL of the page you want to consume that is exposing it’s data as a microformat (read the &lt;a href="http://www.microformats.org/" rel="nofollow"&gt;microformats&lt;/a&gt; website for various formats that are available and details on how they are implemented). And within our controller method, we will go and fetch the appropriate information from &lt;a href="http://upcoming.yahoo.com/search/?quick_date=next_7_days&amp;amp;search_placeid=DevLebebApj4RVbtaQ&amp;amp;rt=0" rel="nofollow"&gt;Upcoming&lt;/a&gt;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;@events = hCalendar.find 'http://upcoming.yahoo.com/search/?quick_date=next_7_days&amp;amp;search_placeid=DevLebebApj4RVbtaQ&amp;amp;rt=0'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And within our view we could do something like the following (ignore the lack of partials and other useful things, this is just for demonstration purposes):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;ol&gt;
&lt;% @events.each do |event| %&gt;
  &lt;li&gt;
    &lt;h1&gt;&lt;a href="&lt;%event.url%&gt;"&gt;&lt;%=event.summary%&gt;&lt;/a&gt;&lt;/h1&gt;
    &lt;p&gt;&lt;%=event.location%&gt;&lt;/p&gt;
    &lt;p&gt;&lt;%=event.dtstart.strftime("%d %B")%&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;% end %&gt;
&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;

Of course, being good little net citizens we should probably also make the list into a microformat too just in case someone else wants to try and consume it from our site, so the addition of a few class attributes and a title tag or two will sort that out:

&lt;pre&gt;&lt;code&gt;&lt;ol class="vcalendar"&gt;
&lt;% @events.each do |event| %&gt;
  &lt;li class="vevent"&gt;
    &lt;h1&gt;&lt;a href="&lt;%event.url%&gt;" class="url summary"&gt;&lt;%=event.summary%&gt;&lt;/a&gt;&lt;/h1&gt;
    &lt;p class="location"&gt;&lt;%=event.location%&gt;&lt;/p&gt;
    &lt;p class="dtstart" title="&lt;%=event.dtstart.strftime("%Y-%m-%d")%&gt;"&gt;&lt;%=event.dtstart.strftime("%d %B")%&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;% end %&gt;
&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Keep in mind, the current implementation will send off a request to &lt;a href="http://upcoming.yahoo.com/" rel="nofollow"&gt;upcoming.yahoo.com&lt;/a&gt; every time someone loads your page and could seriously harm performance, I’d recommend caching the results either to file or directly into a model/table and then having a process that regularly checks and updates the data at a certain interval.&lt;/p&gt;

&lt;p&gt;The possibilities here and endless, and you don’t have to consume and re-display but you could create your own mashup for your personal use. Many shopping sites now include review information as a microformat, TripIt makes all of my itineraries available the same way. My recent interest has been spurred on by a site I’m working on where most of the data will be available as a microformat, hopefully letting 3rd parties develop uses for the site that I’d never imagined.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=2SpyM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=2SpyM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=FDuTm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=FDuTm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=PHhNM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=PHhNM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=zOE3M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=zOE3M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=H0MvM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=H0MvM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=WF7OM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=WF7OM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=MIEUm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=MIEUm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=W3kdM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=W3kdM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=P8PZm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=P8PZm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Thu, 19 Jun 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/06/19/ruby-and-microformats/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195135/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/06/19/ruby-and-microformats/</feedburner:origLink></item>
    
        <item>
          <title>Bulk insertion of data with ActiveRecord</title>
          <description>&lt;p&gt;Apologies to all for the extended hiatus, I was in the US for a month on holiday… and then I just got lazy. Anyway, I’m back and plugging someone else’s extension. I came across ActiveRecord Extension last night, and was quite frankly dumbfounded that 1) I hadn’t come across it before, and 2) More people weren’t using it. In short, it will let you use ActiveRecord to batch insert multiple rows in a single query, rather than looping over the Model#create method and getting all the overhead that comes with it (and the hundred insert statements).&lt;/p&gt;
            
&lt;p&gt;Zach Dennis has written a great little plugin called &lt;a href="http://www.continuousthinking.com/tags/arext" rel="nofollow"&gt;ActiveRecord::Extensions&lt;/a&gt; which makes the bulk inserts almost as painless as your regular create.&lt;/p&gt;

&lt;p&gt;First, install the gem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install ar-extensions&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Include it in your app (you could put it in &lt;em&gt;environment.rb&lt;/em&gt; if you’re going to use it a lot, for now I’ll place it in my model definition in &lt;em&gt;user.rb&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'ar-extensions'
class User
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then to use it, it really couldn’t be more straightforward. Use the following in your controller or rake task to import your data:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;fields = [:first_name, :last_name, :email]
data = [["glenn", "gillen", "foo@bar.com"],
        ["john", "jones", "jim@bar.com"],
        ["steve", "smith", "bar@foo.com"]]

User.import fields, data&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And we’re done, 3 new rows have been inserted into the &lt;em&gt;users&lt;/em&gt; table, with just the single query. Any more questions, the &lt;a href="http://continuous.rubyforge.org/ar-extensions/rdoc/" rel="nofollow"&gt;RDocs are here&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=3JMZM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=3JMZM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=8hY6m"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=8hY6m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=0LI5M"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=0LI5M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=VpLsM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=VpLsM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=HYNrM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=HYNrM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=WbJdM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=WbJdM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=6IScm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=6IScm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=oYqCM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=oYqCM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=0vYEm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=0vYEm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Wed, 18 Jun 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/06/18/bulk-insertion-of-data-with-activerecord/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195137/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/06/18/bulk-insertion-of-data-with-activerecord/</feedburner:origLink></item>
    
        <item>
          <title>Monitoring Backgroundrb with God</title>
          <description>I mentioned yesterday that I’d elaborate on how to extend our &lt;em&gt;app.god&lt;/em&gt; config so that god process monitoring automatically becomes aware of our changes. Well for those that can’t wait, Graham who I pair with on the majority of my work beat me to the punch with with his post on &lt;a href="http://effectif.com/2008/4/8/monitoring-backgroundrb-with-god" rel="nofollow"&gt;Monitoring BackgroundRB with God&lt;/a&gt;. And at the end of the day English is his native language, so it’s probably an easier read (I speak Australian).&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=jUWrM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=jUWrM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=e67Cm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=e67Cm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=yxGQM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=yxGQM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=zutXM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=zutXM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=L5nhM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=L5nhM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=ty6MM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=ty6MM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=3R6zm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=3R6zm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=U8NKM"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=U8NKM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/rubypond/JXRc?a=0CqSm"&gt;&lt;img src="http://feeds.feedburner.com/~f/rubypond/JXRc?i=0CqSm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
          <pubDate>Wed, 09 Apr 2008 09:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://your-web-site.com/articles/2008/04/09/monitoring-backgroundrb-with-god/</guid>
          <link>http://feeds.feedburner.com/~r/rubypond/JXRc/~3/412195154/</link>
        <feedburner:origLink>http://your-web-site.com/articles/2008/04/09/monitoring-backgroundrb-with-god/</feedburner:origLink></item>
    
    
  </channel>
</rss>
