<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>building web applications. especially with ruby on rails</description><title>girders blog</title><generator>Tumblr (3.0; @girders)</generator><link>http://girders.org/</link><item><title>Color Picker for a 256-Color XTerm (xterm, konsole, iTerm). Here...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_kq34kl3aJv1qzre8po1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Color Picker for a 256-Color XTerm (xterm, konsole, iTerm). Here is a simple Perl script that prints out this lovely chart. It reminds me of my early years on my first 1982 IBM PC with the Color Card and Monitor. I am using these colors for tweaking vim colorscheme data.&lt;/p&gt;
&lt;p&gt;perl -e ‘foreach $i (0..255) {printf(“\e[38;5;$i”.”m%03d\e[0m “,$i); }’&lt;/p&gt;</description><link>http://girders.org/post/189680181</link><guid>http://girders.org/post/189680181</guid><pubDate>Wed, 16 Sep 2009 18:17:09 -0400</pubDate><category>unix</category></item><item><title>Changing postgres user info on OS X 10.6</title><description>&lt;p&gt;(How to change a service user account home directory in Apple OS X 10.6 Snow Leopard)&lt;/p&gt;
&lt;p&gt;I’m sure I did something differently than expected. After upgrading to Snow Leopard, my macports weren’t working. After installing the macports for snow leopard, it told me to do a `port upgrade outdated` but that didn’t work because of the variants. I added the —enforce-variants option but had other issues, I don’t recall which now. So I decided to just re-install the ports from scratch, and it worked very well. Until I tried to start postgres.&lt;/p&gt;
&lt;p&gt;The postgres user runs the database, and I had been using 8.3 under Leopard, and now using 8.4. Whenever I tried to initdb or do any postgres command, it complained that the home directory for the postgres user, the old 8.3 directory, was not found. Where was this setting, and how can I change it?&lt;/p&gt;
&lt;p&gt;My first stop was at ole /etc/passwd. A note at the top reminded me that it is unused except in single-user mode. The service is now provided by “Open Directory”. Oh joy, LDAP. There are no standard *NIX commands to add and modify the users, except on the Desktop GUI (what’s this called?), which wasn’t the answer. (Actually an old apple tutorial to install postgres says to create a log-in user to run your database instead of a system account.)&lt;/p&gt;
&lt;p&gt;A friend suggested something called “netinfo”. A little google-fu led me to this post&lt;/p&gt;
&lt;blockquote&gt;&lt;a href="http://forums.macosxhints.com/showthread.php?p=552033" title="http://forums.macosxhints.com/showthread.php?p=552033"&gt;&lt;a href="http://forums.macosxhints.com/showthread.php?p=552033"&gt;http://forums.macosxhints.com/showthread.php?p=552033&lt;/a&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;which showed me some commands! The `dscl` (Directory Services Command Line) was the one I wanted. I read the man page and switched my brain into LDAP mode temporarily. Then I issued this command:&lt;/p&gt;
&lt;blockquote&gt;&lt;span&gt;dscl localhost change /Local/Default/Users/postgres NFSHomeDirectory /opt/local/var/db/postgresql83 /opt/local/var/db/postgresql84&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;and then tried to be the postgres user&lt;/p&gt;
&lt;blockquote&gt;sudo -u postgres -i&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="white-space: pre;"&gt;A&lt;/span&gt;nd no errors! Then I was able to initialize the database and start it&lt;/p&gt;
&lt;blockquote&gt;sudo -u postgres /opt/local/lib/postgresql84/bin/initdb -D /opt/local/var/db/postgresql84/defaultdb -E UTF8&lt;br/&gt;sudo -u postgres /opt/local/lib/postgresql84/bin/pg_ctl -D /opt/local/var/db/postgresql84/defaultdb start&lt;/blockquote&gt;
&lt;p&gt;I hope you find this post if you are in a similar situation, and it will help you resolve it.&lt;/p&gt;
&lt;p&gt;Meow!&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;</description><link>http://girders.org/post/186338855</link><guid>http://girders.org/post/186338855</guid><pubDate>Sat, 12 Sep 2009 16:11:00 -0400</pubDate><category>mac</category><category>unix</category><category>ldap</category></item><item><title>Ruby YAML loads leading-zero numbers as Octal</title><description>&lt;p&gt;Watch out! I was innocently loading a YAML file in Ruby created by another system&lt;/p&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;value: 012&lt;/blockquote&gt;
&lt;p&gt;The Ruby YAML library interprets the 012 as octal, as it would in Ruby source code (and as Perl would do). To have this interpreted as string, you must quote the value.&lt;/p&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;value: “012”&lt;/blockquote&gt;
&lt;p&gt;In case you didn’t know, any number starting with a leading zero in C, Ruby, Perl, or Python, is assumed to be octal. “Of course!”, you say, “Everyone thinks and codes in octal”. The only time I use octal is using the unix permissions on the “chmod” command—but now there are modern alternatives to that.&lt;/p&gt;
&lt;p&gt;Hexadecimal numbers start with “0x” such as “0x12”. That is not a hard mistake to find as its not a valid integer. But innocent leading-zero numbers can cause syntax errors if the number contains a 9 (non-octal digit) such as “09”, or even floating point numbers  like “012.345”.&lt;/p&gt;
&lt;p&gt;You can test this in “irb”…&lt;/p&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;$ irb&lt;br/&gt;» 07&lt;br/&gt;=&gt; 7&lt;br/&gt;» 012&lt;br/&gt;=&gt; 10&lt;br/&gt;» 0x12&lt;br/&gt;=&gt; 18&lt;/blockquote&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;» 019&lt;br/&gt;SyntaxError: compile error…&lt;/blockquote&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;» 012.345&lt;/blockquote&gt;
&lt;blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"&gt;SyntaxError: compile error…&lt;/blockquote&gt;
&lt;p&gt;So this is error-prone and annoying in these languages.&lt;/p&gt;
&lt;p&gt;As it turns out, this behavior is part of the YAML specification, but I do not like it!  I doubt many people expect that behavior. Data encoding should not take these “short cuts”, as YAML files can be created by non-programmers who have never heard of octal and expect a leading-zero to be harmless.&lt;/p&gt;
&lt;p&gt;I’m finding the rule of thumb in YAML is to use quoted values when possible.&lt;/p&gt;</description><link>http://girders.org/post/162309268</link><guid>http://girders.org/post/162309268</guid><pubDate>Thu, 13 Aug 2009 17:29:59 -0400</pubDate></item><item><title>Install Ubuntu 9.04 Virtual Server With Passenger and Rails Application</title><description>&lt;p&gt;Install Ubuntu 9.04 Virtual Server With Passenger and Rails Application&lt;br/&gt;&lt;br/&gt;There have been a few post and code I referenced to set up my server. See gist &lt;a href="http://gist.github.com/111244"&gt;http://gist.github.com/111244&lt;/a&gt; for a raw install script, which you must adapt to your needs.&lt;br/&gt;&lt;br/&gt;I’ll assume we are started from a post-install state of the Server, with the proper networking, etc. in good working order. Here are the basic command line I entered.&lt;br/&gt;&lt;br/&gt;First, let’s get the system up to date&lt;/p&gt;
&lt;blockquote&gt;sudo ntpdate ntp.ubuntu.com&lt;br/&gt;sudo apt-get update&lt;br/&gt;sudo apt-get upgrade&lt;br/&gt;sudo ssh-keygen&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now to install the basic needs for the server&lt;/p&gt;
&lt;blockquote&gt;sudo apt-get -y install git-core openssh-server openssh-client build-essential \ &lt;br/&gt; wget ntp-simple&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br/&gt;This sets up the MRI 1.8.7 Ruby interpreter. I think you can skip this step if you want to run the Phusion Ruby Enterprise Edition instead (see next).&lt;/p&gt;
&lt;blockquote&gt;sudo apt-get -y install ruby rdoc irb libyaml-ruby libzlib-ruby ri libopenssl-ruby \ &lt;br/&gt; ruby1.8-dev libopenssl-ruby&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Install Phusion Ruby Enterprise Edition. Check that page for the current version. This installs executables into /opt/ruby-enterprise/bin, so you should either add that to your path or link those command into your path. I did the link, and since Ubuntu ruby installs into /usr/bin, and my default PATH puts /usr/local/bin before that, I simply created links for each command into that directory. This may not be the best way, but this was a proof of concept run.&lt;/p&gt;
&lt;blockquote&gt;wget &lt;a href="http://rubyforge.org/frs/download.php/55510/ruby-enterprise_1.8.6-20090421_i386.deb"&gt;http://rubyforge.org/frs/download.php/55510/ruby-enterprise_1.8.6-20090421_i386.deb&lt;/a&gt;&lt;br/&gt;sudo dpkg ruby-enterprise_1.8.6-20090421_i386.deb&lt;br/&gt;rm ruby-enterprise_1.8.6-20090421_i386.deb&lt;br/&gt;sudo ln -s /opt/ruby-enterprise/bin/* /usr/local/bin/&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Next, we need to install Ruby Gems, the heart of ruby library package management. You can install via the ubuntu ‘apt-get install rubygems’, but the version you install doesn’t like to upgrade itself. It is best to do it from the rubygems distrubution package. Download the current release from the rubygems download page. Since a lot of gems are released though github these days, add that source to the gems sources.&lt;/p&gt;
&lt;blockquote&gt;wget “http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz”&lt;br/&gt; tar -xvzf rubygems-1.3.1.tgz&lt;br/&gt; rm rubygems-1.3.1.tgz&lt;br/&gt; cd rubygems-1.3.1&lt;br/&gt; sudo ruby setup.rb&lt;br/&gt; cd ..&lt;br/&gt; rm -r rubygems-1.3.1&lt;br/&gt; sudo gem sources -a &lt;a href="http://gems.github.com"&gt;http://gems.github.com&lt;/a&gt;&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Install PostgreSQL. Its my database of choice, fast, robust, friendly (…except for replication). Set it up to accept connections from this server. After that, create the user accounts you require of your applications. Consult &lt;a href="https://help.ubuntu.com/9.04/serverguide/C/postgresql.html"&gt;https://help.ubuntu.com/9.04/serverguide/C/postgresql.html&lt;/a&gt; for more details.&lt;/p&gt;
&lt;blockquote&gt;sudo apt-get -y install postgresql libpq-dev&lt;br/&gt; sudo vi /etc/postgresql/8.3/main/postgresql.conf&lt;br/&gt; enable this setting:&lt;br/&gt; listen_addresses = ‘localhost,127.0.0.1’”&lt;br/&gt; sudo vi /etc/postgresql/8.3/main/pg_hba.conf&lt;br/&gt; Change md5 to trust in line:&lt;br/&gt; host all all 127.0.0.1/32 trust&lt;br/&gt; sudo /etc/init.d/postgresql-8.3 restart&lt;br/&gt; sudo -u postgres psql template1&lt;br/&gt; ALTER USER postgres with encrypted password ‘your_password’;&lt;br/&gt; create user appuser createdb createuser;&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alternatively, you can run MySQL. It’s also a nice database. You may want to verify this elsewhere to get everything up and running.&lt;/p&gt;
&lt;blockquote&gt;sudo apt-get install mysql-server mysql-client&lt;br/&gt; sudo apt-get install libmysql-ruby libmysqlclient15-dev&lt;br/&gt; sudo gem install mysql —no-rdoc —no-ri&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now to install the Apache2 web server and the Phusion Passenger (modrails) module. It instructs you to add some apache configurations, but this location is slightly different. Verify the passenger version numbering if using the “echo” command below.&lt;/p&gt;
&lt;blockquote&gt;sudo apt-get -y install apache2-mpm-prefork libapr1-dev apache2-prefork-dev&lt;br/&gt; sudo gem install passenger —no-rdoc —no-ri&lt;br/&gt; sudo /opt/ruby-enterprise/bin/passenger-install-apache2-module&lt;br/&gt; sudo echo “LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.1/ext/apache2/mod_passenger.so&lt;br/&gt; PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.1&lt;br/&gt; PassengerRuby /usr/bin/ruby1.8” &gt; /etc/apache2/mods-available/passenger.load&lt;br/&gt; sudo a2enmod passenger&lt;br/&gt; sudo a2enmod ssl&lt;br/&gt; sudo a2enmod rewrite&lt;br/&gt; sudo /etc/init.d/apache2 force-reload&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we are on the road to deployment. Let’s install Rails and some other basic gems.&lt;/p&gt;
&lt;blockquote&gt;sudo apt-get -y install libxml2 libxml2-dev&lt;br/&gt; sudo gem install rails rake rspec rspec-rails ruby-debug capistrano libxml-ruby \ fastercsv —no-rdoc —no-ri&lt;br/&gt; sudo gem install mislav-will_paginate —no-rdoc —no-ri&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Say we decide to host our app out of /var/app and set up up ready to go. I’m not sure about the chown command below, but saw it elsewhere and it didn’t hurt.&lt;/p&gt;
&lt;blockquote&gt;sudo mkdir /var/app&lt;br/&gt; sudo chown allen:allen /var/app&lt;br/&gt; cd /var/app&lt;br/&gt; git clone git://github.com/account/appname.git&lt;br/&gt; sudo chown www-data:www-data /var/app/k23/config/environment.rb&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chances are, you will deploy with a yummy capistrano or vlad recipe. That out out of the scope at this time, so we’ll create the database and test to make sure te connection is right. Play with your app and fix settings before going on..&lt;/p&gt;
&lt;blockquote&gt;cd /var/app/appname&lt;br/&gt; cp config/database.yml.example config/database.yml&lt;br/&gt; rake db:create RAILS_ENV=production&lt;br/&gt; rake db:migrate RAILS_ENV=production&lt;br/&gt; script/console production&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we install the app through Passenger.&lt;/p&gt;
&lt;blockquote&gt;sudo echo “&lt;VirtualHost *:80&gt;&lt;br/&gt; ServerName appname.com&lt;br/&gt; DocumentRoot /var/app/appname/public&lt;br/&gt; &lt;/VirtualHost&gt;” » /etc/apache2/sites-available/appname.com&lt;br/&gt; sudo a2ensite appname.com&lt;br/&gt; sudo /etc/init.d/apache2 reload&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;If we were successful, we should be able to load that site (assuming DNS is pointing here already).&lt;/p&gt;
&lt;blockquote&gt;Load &lt;a href="http://appname.com"&gt;http://appname.com&lt;/a&gt; on your workstation web browser.&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;I hope this helped you as much as it did me. I apologize for errors that crept into this script while converting it to a blog entry.&lt;/p&gt;</description><link>http://girders.org/post/107329254</link><guid>http://girders.org/post/107329254</guid><pubDate>Wed, 13 May 2009 15:39:00 -0400</pubDate></item><item><title>twitterdb - Using twitter as a database</title><description>&lt;p&gt;I just had this crazy idea. If you already read the title, then you already know! ;-)&lt;/p&gt;
&lt;p&gt;Twitter is crazy cool. You can tweet as much as you want (I think) and can create gigabytes of useless personal trivia… or you can store somthing kinda cool in it… DATA! As a result, you can get a free Small-Document-Oriented database you can access from the cloud.&lt;/p&gt;
&lt;p&gt;Sure, this is nuts, but its fun to consider, right?&lt;/p&gt;
&lt;p&gt;First, each “table” is a twitter “account”, call it “app.table” or whatever. Each “tweet” to the table is a record. Ok, twitter posts can only be 140 characters—a limit I otherwise appreciate. We can store the record as any parsable key/value store.&lt;/p&gt;
&lt;p&gt;Perhaps we could use JSON:{“ircEvent”: “PRIVMSG”, “method”: “newURI”, “regex”: “^http://.*”}&lt;/p&gt;
&lt;p&gt;Or a Ruby Hash: {:key=&gt;”value”, …}&lt;/p&gt;
&lt;p&gt;Or Python Dictionary: {‘jack’: 4098, ‘sape’: 4139}&lt;/p&gt;
&lt;p&gt;Insert the data by tweeting the record to the table. Now you are storing it. You can’t update it, only supercede a record.  How would we access it? Feeds, api, searches, and mashups.My twitter-fu on this isn’t so strong as I never had a need for it before.&lt;/p&gt;
&lt;p&gt;But still… could be interesting, right? And you could even SHARE data by posting it to public databases like this. For sanity, you would validate and post this through a gateway service of your own devising.&lt;/p&gt;
&lt;p&gt;I wonder now much this could be like CouchdB, SimpleDB, or the Google App Engine Datastore this is?&lt;/p&gt;
&lt;p&gt;Perhaps this could be work exploring. Maybe I could even write ActiveRecord (Ruby on Rails) bindings to emulate this. Someday.&lt;/p&gt;
&lt;p&gt;I’ll keep you posted…&lt;/p&gt;</description><link>http://girders.org/post/88618438</link><guid>http://girders.org/post/88618438</guid><pubDate>Sat, 21 Mar 2009 21:28:13 -0400</pubDate></item><item><title>Updating a PostgreSQL view</title><description>&lt;p&gt;In PostgreSQL (8.2), we can create a view to access a join of two tables.&lt;/p&gt;
&lt;blockquote&gt;create view join_view as SELECT p.id, p.group, c.parent_id, c.status FROM child c JOIN parent p ON c.parent_id = p.id ;&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we can do&lt;/p&gt;
&lt;blockquote&gt;select * from join_view where group = 1;&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, if we try to update the view, we can not.&lt;/p&gt;
&lt;blockquote&gt;update join_view set status=4 where group=1;&lt;br/&gt;ERROR:  cannot update a view&lt;br/&gt;HINT:  You need an unconditional ON UPDATE DO INSTEAD rule.&lt;/blockquote&gt;
&lt;p&gt;So we need to create this rule to execute this trigger-like command&lt;/p&gt;
&lt;blockquote&gt;create rule join_view_update as on update to join_view do instead (update child set status=NEW.status where id=NEW.id and parent_id=NEW.parent_id );&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we can execute the update!&lt;/p&gt;
&lt;blockquote&gt;update join_view set status=4 where group=1;&lt;br/&gt;UPDATE 1&lt;br/&gt;select * from join_view where group = 1;&lt;br/&gt;
&lt;/blockquote&gt;
&lt;p&gt;And see the results!&lt;/p&gt;
&lt;p&gt;Note: I changed internal conditions and naming, and hope I have no inadvertently mis-typed something. Apologies in advance if this had a simple syntax error.&lt;/p&gt;</description><link>http://girders.org/post/68729255</link><guid>http://girders.org/post/68729255</guid><pubDate>Tue, 06 Jan 2009 10:56:19 -0500</pubDate></item><item><title>ActiveRecord#find using :include=&gt;association no longer necessarily joins the association</title><description>Before Rails 2.1, adding an :include=&gt;[:association] in your find method caused ActiveRecord to generate SQL using a join. Since 2.1, it MAY NOT execute as a join.
&lt;p&gt;The join executes a large query and returned potentially duplicate records for a one-to-many association. After 2.1, the query is broken down and eager-loaded using an additional query per association, passing the set of id‘s to load, and avoiding the duplicate rows.&lt;/p&gt;
&lt;p&gt;The new method eliminates duplicates, but can incur more database overhead. If you are loading a very large set of records (more than a “page”), you may need to “force” the join or use find_by_sql instead.&lt;/p&gt;
&lt;p&gt;When you specify a “table.column” syntax within a&lt;/p&gt;
&lt;pre&gt; :conditions=&gt;["child.name=?", name]&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt; :order=&gt;'child.name'&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;then ActiveRecord will build the older, full query with the join because you are referencing columns from another table to build. This will cause the duplicate rows to reappear.&lt;/p&gt;
&lt;p&gt;Whenever you reference a column from another table in a condition or order clause, ALWAYS use the table name to prefix the column, even if it not ambiguous among the tables involved. Otherwise the query will not be executed as a join and you will receive an SQL error referencing the “missing” column.&lt;/p&gt;
&lt;p&gt;You can “force” a join by adding a reference to the other tables in your :conditions or :options parameters, even if the test or sort is irrelevant.&lt;/p&gt;</description><link>http://girders.org/post/57114075</link><guid>http://girders.org/post/57114075</guid><pubDate>Thu, 30 Oct 2008 11:01:33 -0400</pubDate></item><item><title>Merb 0.9 on Ubuntu Linux 7.10 </title><description>&lt;p&gt;The &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt; application framework is getting close to a 1.0 release. Merb takes many of the ideas of Ruby on Rails and does them one better. RoR was designed for developers and applications, but has not been the best to run in production. Merb was written from the ground up with performance and scalability. But as a result, its like travelling abroad in that things are similar but not exactly the same as you are used to developing with RoR.&lt;/p&gt;
&lt;p&gt;The platform of choice of most rubyists these days is OS X, with its fine unixy-goodness and groovy Textmate editor. Ubuntu Linux provides most of these features for a fraction of the price! Also, since these applications are generally deployed on the Linux OS, it makes sense to know how to get things running on that platform as well. Let’s roll up our sleeves and get to work.&lt;/p&gt;
&lt;p&gt;I used &lt;a href="http://blog.kineticweb.com/articles/2008/02/09/soar-with-merb-core-and-merb-more-0-9"&gt;Justin’s post&lt;/a&gt; as a starting point on what to do. Open up a terminal window and start.&lt;/p&gt;
&lt;h2&gt;Get the Git&lt;/h2&gt;
&lt;p&gt;First, we install the &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; version control system which merb uses. Note the current Debian git package has a minor bug requiring the /etc/mailname file. Create that file with your hostname in it for now.&lt;/p&gt;
&lt;pre&gt;sudo apt-get install git-core&lt;br/&gt;vi /etc/mailname&lt;br/&gt;&lt;/pre&gt;
&lt;h2&gt;Gems&lt;/h2&gt;
&lt;p&gt;I assume you have been using Ruby before and have a modern Ruby and RubyGems installed. If not, go do that now. I’ll wait.&lt;/p&gt;
&lt;p&gt;Justin recommends having these gems. All seem a good idea, but mongrel erubus and rspec seem more necessary if you are trying to cut down. Merb requires rack, and a ORM like Rails’ ActiveRecord, Sequel, or Datamapper, which it looks like it prefers. Merb is built upon the Rack web server abstraction library.&lt;/p&gt;
&lt;p&gt;Like Merb, &lt;a href="http://datamapper.org/"&gt;Datamapper&lt;/a&gt; is thread-safe to allow multiple requests being handled. However, it is not yet fully developed like ActiveRecord and may not be as production-ready. If you are porting an application from Rails, you may want to continue using ActiveRecord.&lt;/p&gt;
&lt;pre&gt;sudo gem install mongrel json json_pure erubis mime-types rspec hpricot mocha rubigen haml markaby mailfactory Ruby2Ruby -y&lt;br/&gt;sudo gem install rack&lt;br/&gt;sudo gem install datamapper -y&lt;br/&gt;&lt;/pre&gt;
&lt;h2&gt;Install Merb&lt;/h2&gt;
&lt;p&gt;Merb is available in gem form, but they may not be as up to date as we would like. So let’s git them from the git repository. If you are having problems, try the http:// protocol instead of the git:// protocol. Merb in divided up into merb-core, merb-more, and merb-plugins in order to let you craft the server with just the parts you need. We need to go into each repository and “install” it in your gems.&lt;/p&gt;
&lt;pre&gt;mkdir trymerb&lt;br/&gt;cd trymerb&lt;br/&gt;&lt;br/&gt;git clone git://github.com/wycats/merb-core.git&lt;br/&gt;git clone git://github.com/wycats/merb-more.git&lt;br/&gt;git clone git://github.com/wycats/merb-plugins.git&lt;br/&gt;&lt;br/&gt;cd merb-core&lt;br/&gt;sudo rake install&lt;br/&gt;&lt;br/&gt;cd ../merb-more&lt;br/&gt;sudo rake install&lt;br/&gt;# has link_to, etc&lt;br/&gt;cd ../merge-assets &lt;br/&gt;sudo rake install&lt;br/&gt;&lt;br/&gt;cd ../../merb-plugins/merb_helpers/&lt;br/&gt;sudo rake install&lt;br/&gt;cd ../merb_activerecord/&lt;br/&gt;sudo rake install&lt;br/&gt;cd ../merb_datamapper/&lt;br/&gt;sudo rake install&lt;br/&gt;cd ../merb_rspec/&lt;br/&gt;sudo rake install&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Whew! That’s going to get old fast. The upcoming gems will be better.&lt;/p&gt;
&lt;h2&gt;Merb with PostgreSQL&lt;/h2&gt;
&lt;p&gt;PostgreSQL is my RDBMS of choice. MySQL would work similarly. Ubuntu needs your PostgreSQL header files, so we load them first.&lt;/p&gt;
&lt;pre&gt;sudo apt-get install libpq-dev&lt;br/&gt;sudo gem install do_postgres&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Now let’s go roll an app!&lt;/p&gt;
&lt;h2&gt;The MyBlog Merb Application&lt;/h2&gt;
&lt;p&gt;To show off our merby goodness, we will build the “hello world” of ruby web applications, the blog.&lt;/p&gt;
&lt;pre&gt;cd trymerb&lt;br/&gt;merb-gen myblog&lt;br/&gt;cd myblog&lt;br/&gt;createdb myblog_development&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;The createdb command is for postgresql, please substitute the create database for your db of choice.&lt;/p&gt;
Edit config/init.rb file and enable the following configurations.
&lt;pre&gt;  ### Uncomment for DataMapper ORM&lt;br/&gt;  use_orm :datamapper&lt;br/&gt;&lt;br/&gt;  use_test :rspec&lt;br/&gt;&lt;br/&gt;  ### Add your other dependencies here&lt;br/&gt;  dependencies "merb_helpers", "merb-assets" &lt;br/&gt;&lt;/pre&gt;
Now create your /config/database.yml
&lt;pre&gt;  ---&lt;br/&gt;  # This is a sample database file for the DataMapper ORM&lt;br/&gt;  :development: &amp;defaults&lt;br/&gt;    :adapter: postgresql&lt;br/&gt;    :database: myblog_development&lt;br/&gt;    :username: the_user&lt;br/&gt;    :password: secrets&lt;br/&gt;    :host: localhost&lt;br/&gt;&lt;br/&gt;  :test:&lt;br/&gt;    &lt;&lt;: *defaults&lt;br/&gt;    :database: myblog_test&lt;br/&gt;&lt;br/&gt;  :production:&lt;br/&gt;    &lt;&lt;: *defaults&lt;br/&gt;    :database: myblog_production&lt;br/&gt;&lt;/pre&gt;
&lt;h3&gt;Merbful Authentication&lt;/h3&gt;
&lt;p&gt;Optionally, we add in authentication, the “Restful Authentication” plugin port to merb. Read me about &lt;a href="http://hassox.blogspot.com/search?q=merbful_authentication"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;cd trymerb&lt;br/&gt;git clone git://github.com/hassox/restful-authentication.git&lt;br/&gt;cd restful-authentication&lt;br/&gt;git checkout -b merbful_authentication origin/merbful_authentication&lt;br/&gt;sudo rake install&lt;br/&gt;&lt;br/&gt;cd trymerb/myblog&lt;br/&gt;merb-gen authenticated user_model session_controller&lt;br/&gt;&lt;/pre&gt;
&lt;h3&gt;Our post resource&lt;/h3&gt;
Restful merb resource that is. This creates the controller, model, and view. If you are using ActiveRecord, I would also expect a migration. For Datamapper, the columns are defined in the model. Use rake to create the tables from the model. (For Postgres, use the datetime type instead of the timestamp type you would use in Rails.)
&lt;pre&gt;merb-gen resource post title:string content:text created_at:datetime&lt;br/&gt;rake dm:db:automigrate&lt;br/&gt;&lt;/pre&gt;
Edit config/router.rb to enable these actions:
&lt;pre&gt;  # RESTful routes&lt;br/&gt;  r.resources :posts&lt;br/&gt;&lt;br/&gt; # Change this for your home page to be available at /&lt;br/&gt;  r.match('/').to(:controller =&gt; 'posts', :action =&gt;'index')&lt;br/&gt;&lt;/pre&gt;
&lt;h3&gt;Starting Merb&lt;/h3&gt;
Open a new terminal window and start merb from your app directory
&lt;pre&gt;cd trymerb/myblog&lt;br/&gt;merb&lt;br/&gt;&lt;/pre&gt;
Now point your brower to http://localhost:4000/ and you should be able to see it. The resource generator does not yet build the ERB files out like Rails’ scaffolding. So we have to write that ourselves.
&lt;p&gt;Note that this is where some of the differences between Rails and Merb shows up. Merb has its own routing using the url() helper. Read more about it &lt;a href="http://toolmantim.com/article/2008/1/22/merb_routing_in_0_5"&gt;here&lt;/a&gt; .&lt;/p&gt;
&lt;pre&gt;url(:posts)       #=&gt; "/posts" &lt;br/&gt;url(:new_post) #=&gt; "/posts/new" &lt;br/&gt;&lt;br/&gt;@post = Post[1]&lt;br/&gt;url(:post, @post) #=&gt; "/posts/1" &lt;br/&gt;&lt;/pre&gt;
Edit the app/views/posts/index.html.erb and add in a simple post listing.
&lt;pre&gt;&lt;h1&gt;My Blog&lt;/h1&gt;&lt;br/&gt;&lt;br/&gt;&lt;% @posts.each do |n| %&gt;&lt;br/&gt;  &lt;h2&gt;&lt;%= n.title %&gt;&lt;/h2&gt;&lt;br/&gt;  &lt;div2&gt;&lt;%= n.content %&gt;&lt;/div&gt;&lt;br/&gt;&lt;% end %&gt;&lt;br/&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;  &lt;%= link_to "Write new", url(:new_post) %&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Edit the app/views/posts/new.html.erb and add in the compose form. Feel free to embellish your HTML. I added the hidden field to remember how to do it if I need to figure it out again.&lt;/p&gt;
&lt;p&gt;As you see, the field control helpers are different, but self-explanatory. They were actually the hardest part to figure out since they needed to be installed from the proper repository and enabled in the init.rb file. The source code also shows more of what you need to do.&lt;/p&gt;
&lt;pre&gt;&lt;h1&gt;Write a new post&lt;/h1&gt;&lt;br/&gt;&lt;%= error_messages_for :post %&gt;&lt;br/&gt;&lt;br/&gt;&lt;% form_for(@post, :action=&gt;url(:posts), :method=&gt;"post") do %&gt;&lt;br/&gt;  &lt;%= hidden_field :name=&gt;:wave, :value=&gt;'hello' %&gt;&lt;br/&gt;  &lt;%= text_control :title, :label=&gt;"Title", :size=&gt;50, &lt;br/&gt;    :maxlength=&gt;250, :style=&gt;"font-weight:bold;" %&gt;&lt;br/&gt;  &lt;br /&gt;&lt;%= text_area_control :content, :label=&gt;"Rant", :rows=&gt;15, :cols=&gt;50 %&gt;&lt;br/&gt;  &lt;br /&gt;&lt;%= submit_button  "Save" %&gt;&lt;br/&gt;&lt;% end %&gt;&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;That should do it! Enjoy your new merb blog app.&lt;/p&gt;
&lt;h2&gt;More Things with merb&lt;/h2&gt;
&lt;h3&gt;The Merb console&lt;/h3&gt;
The merb object has some things worth exploring, like the app object in Rails.
&lt;pre&gt;merb -i&lt;br/&gt;irb(main):001:0&gt; merb.show_routes&lt;br/&gt;&lt;/pre&gt;
&lt;h3&gt;Debugger&lt;/h3&gt;
Like with Rails 2.0, call the “debugger” function where you want a breakpoint. and start merb like this:
&lt;pre&gt;merb -D&lt;br/&gt;&lt;/pre&gt;
&lt;h3&gt;Merb on Thin&lt;/h3&gt;
You can run the &lt;a href="http://code.macournoyer.com/thin/"&gt;Thin&lt;/a&gt; web server with Merb.
&lt;pre&gt;sudo gem install thin&lt;br/&gt;merb -a thin&lt;br/&gt;&lt;/pre&gt;
&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;This was my first experiment using Merb on Ubuntu, and I am thrilled that it works so well already. This is not quite a recipe for starting from scratch. Some instructions may be convoluted, unnnecessary, copied here incorrectly, or just plain wrong.&lt;/p&gt;
&lt;p&gt;Merb is the exciting new direction for developing ruby applications. Ezra is addressing the shortcomings we have in developing and deploying robust applications in ruby. The Rubinius and Merb projects are doing a lot to make this happen.&lt;/p&gt;</description><link>http://girders.org/post/60710200</link><guid>http://girders.org/post/60710200</guid><pubDate>Sun, 02 Mar 2008 00:00:00 -0500</pubDate></item><item><title>Email on Rails </title><description>&lt;p&gt;I am giving a talk this evening at the &lt;a href="http://phillyonrails.org/"&gt;Philly On Rails&lt;/a&gt; meeting on an introduction to email and sending and receiving email with a Ruby on Rails application.&lt;/p&gt;
&lt;p&gt;I am referencing the &lt;a href="http://allenfair.com/email-on-rails.pdf"&gt;slides&lt;/a&gt; and a &lt;a href="http://allenfair.com/mailapp.tgz"&gt;sample application&lt;/a&gt; in case anyone needs to reference them!&lt;/p&gt;</description><link>http://girders.org/post/60710338</link><guid>http://girders.org/post/60710338</guid><pubDate>Mon, 06 Aug 2007 00:00:00 -0400</pubDate></item><item><title>Email Basics</title><description>&lt;p&gt;What is &lt;a href="http://en.wikipedia.org/wiki/Email"&gt;email&lt;/a&gt; exactly? It is quite different from the view we see in our MUA, (Thunderbird, gmail, mutt, pine, etc.). Let’s review the basic of email mechanics, shall we?&lt;/p&gt;
&lt;p&gt;Email consists on an Envelope and the Message Data. The &lt;b&gt;envelope&lt;/b&gt; is&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Return Path: The email address to return the message if undeliverable&lt;/li&gt;
&lt;li&gt;Recipients: The email address(es) of the recipients of the message&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;b&gt;Message Data&lt;/b&gt; is the meat of the mail,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RFC822 &lt;a href="http://www.iana.org/assignments/message-headers/perm-headers.html"&gt;Headers&lt;/a&gt; such as Subject, From, To, Date, etc. Headers can span multiple lines by starting the subsequent line with a white-space. A blank line signals the end of the header and the start of the body follows. Non-standard header names begin with the “X-” prefix, used to denote experimental features. These usually have meaning only to the software that placed them there. &lt;/li&gt;
&lt;li&gt;Body, text, html, etc. Using the MIME standard, the body can be made to include alternate versions of the message based on markup, and also attach files to the message.&lt;/li&gt;
&lt;li&gt;File Attachments. Usually, binary files are encoded in Base64 no non-printable characters. This increases the file size by about 33% when encoded in the message.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that the From and To headers in the headers are really informational. It is the envelope recipient list that determines who it was from.&lt;/p&gt;
&lt;p&gt;Also, since the From header can be virtually anything, it is easy to spoof the sender or even the full message. Even the recipient return path can be bogus. Therefore, email is not secure as such (except for PGP/GPG signings), and should not be trusted outright.&lt;/p&gt;
&lt;p&gt;Since each email server that passes the message along prepends a &lt;i&gt;Received&lt;/i&gt; header to the top of the message, you can generally trace its path to see if it came from a source server that is a proper MTA for the sender. Of course, you can only trust the received headers from servers as far back as you trust; they can also be tampered with.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br/&gt;To: you@example.com&lt;br/&gt;From: me@example.com&lt;br/&gt;Date: 20 Jul 2007 09:21:51 -0700&lt;br/&gt;Message-ID: &lt;521.1090340511@example.com&gt;&lt;br/&gt;Subject: Simple Email Message&lt;br/&gt;&lt;br/&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas&lt;br/&gt;ultrices sem sed urna accumsan cursus. &lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Content-Type and MIME Types&lt;/h3&gt;
&lt;p&gt;When you want to create more complex email messages, say with alternative content or attachments, you need to construct your message using MIME containers and body parts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Content-Type:&lt;/b&gt; Use this header in your email message to identify the MIME type of your content&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;text/plain&lt;/b&gt; is the default MIME type of email. This is viewable by all mail clients.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;text/html&lt;/b&gt; denotes an HTML formatted body or part. This is only viewable in GUI-based clients that support HTML.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;multipart/alternative&lt;/b&gt; is a MIME container that holds the text, HTML or other versions of the main message. Only one of these (the best one it can show) is viewable by the user’s mail client.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;multipart/alternative&lt;/b&gt; is a MIME container used for attaching files to the message body. The first part is the body part (which can also be another container), and the rest are attachments.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;multipart/related&lt;/b&gt; is a MIME container that wraps included graphics referenced from an HTML body. These graphics are shown “in place”, such as a logo in the letterhead, instead of being seen as attachments.&lt;/li&gt;
&lt;li&gt;The &lt;b&gt;boundary&lt;/b&gt; parameter of the Content-Type header is used to provide a unique identifier to define the start and end of the body parts within a MIME container. Lines starting with two hyphens followed by the boundary value is the split point in the message. The final boundary line is the two hyphens, boundary value, and two more hyphens.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;image/png&lt;/b&gt; is a PNG graphic file, also a image/gif or image/jpeg could be used.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;application/pdf&lt;/b&gt; is a pdf attachment, which could be any application-defined file&lt;/li&gt;
&lt;li&gt;Stir to combine…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each MIME body part (attachment, container, or message version) itself has a small MIME header set to indicate its content-type, encoding, and other information.&lt;/p&gt;
&lt;p&gt;Here is an example message that is composed of a text and HTML body alternatives, with an image attachment called out from the HTML version, plus another image as a regular attachment. The structure of the MIME parts is&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br/&gt;multipart/mixed (Holds the body part plus attachments)&lt;br/&gt;    multipart/alternative (groups the different version of the message body)&lt;br/&gt;        text/plain&lt;br/&gt;        multipart/related (groups the HTML part with images it references)&lt;br/&gt;            text/html&lt;br/&gt;            image/jpeg&lt;br/&gt;    image/png (attachment)&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is how this looks in the email message.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br/&gt;To: you@example.com&lt;br/&gt;From: me@example.com&lt;br/&gt;Date: 20 Jul 2007 09:21:51 -0700&lt;br/&gt;Message-ID: &lt;521.1090340511@example.com&gt;&lt;br/&gt;Subject: Complex Email Message&lt;br/&gt;MIME-Version: 1.0&lt;br/&gt;Content-Type: multipart/mixed;&lt;br/&gt;        boundary="mm001" &lt;br/&gt;&lt;br/&gt;This is a multi-part message in MIME format.&lt;br/&gt;&lt;br/&gt;--mm001&lt;br/&gt;Content-Type: multipart-alternative; boundary=mb001&lt;br/&gt;&lt;br/&gt;--ma001&lt;br/&gt;Content-Type: text/plain&lt;br/&gt;&lt;br/&gt;This is the plain text body&lt;br/&gt;&lt;br/&gt;--ma001&lt;br/&gt;Content-Type: multipart-related; boundary="mr001" &lt;br/&gt;&lt;br/&gt;--mr001&lt;br/&gt;Content-Type: text/html&lt;br/&gt;Content-Transfer-Encoding: quoted-printable&lt;br/&gt;&lt;br/&gt;This is the &lt;em&gt;HTML&lt;/em&gt; body&lt;br/&gt;&lt;IMG=20SRC=3D"No%20AttachName"=20alt=3D"Picture=20(Metafile)"&gt;&lt;br/&gt;&lt;br/&gt;--mr001&lt;br/&gt;Content-Type: image/jpeg; name="logo.jpg" &lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-Description: Picture (Metafile)&lt;br/&gt;Content-Location: No%20AttachName&lt;br/&gt;&lt;br/&gt;Qk2ewgIAAAAAADYAAAAoAAAAJAIAAG4AAAABABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////&lt;br/&gt;....&lt;br/&gt;&lt;br/&gt;--mr001-- &lt;br/&gt;&lt;br/&gt;--ma001--&lt;br/&gt;&lt;br/&gt;--mm001&lt;br/&gt;Content-Type: image/png; &lt;br/&gt;    name="elroy-jetson.png" &lt;br/&gt;Content-Transfer-Encoding: base64&lt;br/&gt;Content-Disposition: attachment;&lt;br/&gt;    filename="elroy-jetson.png" &lt;br/&gt;&lt;br/&gt;R0lGODlhMgAvAPcAAAAAAJQAAPfOjP//////////////////////////////////////////////&lt;br/&gt;.....&lt;br/&gt;&lt;br/&gt;--mm001-- &lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Content-Transfer-Encoding&lt;/h3&gt;
&lt;p&gt;Note the use of &lt;b&gt;quoted-printable&lt;/b&gt; in the above HTML segment. &lt;a href="http://en.wikipedia.org/wiki/Quoted-printable"&gt;Quoted-printable&lt;/a&gt; encoding escapes special characters with an equal symbol (=) followed by the 2-character hexadecimal ASCII representation of the character value. For example, any equal symbols in the body are replaced with ”=3D”, where 3D is the hexadecimal representation of the equal symbol in the ASCII collating sequence.&lt;/p&gt;
&lt;p&gt;Web browsers do something similar when sending special characters in the URL, but using a percent (%) symbol as the escape symbol.&lt;/p&gt;
&lt;p&gt;Quoted-printable also wraps text so lines do not become too long. An equal symbol at the end of the line (=\n) indicates the line is wrapped. Email standards define the maximum length of a line to be 77 (?) characters, but since this is not a hard limit, most email software is flexible about this limit.&lt;/p&gt;
&lt;p&gt;Binary files are usually encoded in &lt;b&gt;Base64&lt;/b&gt;. The &lt;a href="http://en.wikipedia.org/wiki/Base64"&gt;Base64&lt;/a&gt; method maps every 6 bits to a printable character. Ruby has a Base64 helper class&lt;/p&gt;
&lt;pre&gt;&lt;code class="ruby"&gt;&lt;br/&gt;require "base64" &lt;br/&gt;enc   = Base64.encode64('Send reinforcements') # -&gt; "U2VuZCByZWluZm9yY2VtZW50cw==\n" &lt;br/&gt;plain = Base64.decode64(enc)  # -&gt; "Send reinforcements" &lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SMTP: How Email is Tranferred&lt;/h3&gt;
&lt;p&gt;Email is delivered via &lt;a href="http://en.wikipedia.org/wiki/Smtp"&gt;SMTP&lt;/a&gt;, Simple Mail Transport Protocol. This is a simple state-machine which accepts email through a “command line” interface, usually over port 25. Open a telnet connection to any MX(mail exchanger) host on port 25 to try your hand at delivering a mail manually.&lt;/p&gt;
Here you can really see that the email envelope is powerful, it requires 3 part of the email message: 	
&lt;ul&gt;
&lt;li&gt;Return Path (MAIL FROM)&lt;/li&gt;
&lt;li&gt;Recipients: (RCPT TO)&lt;/li&gt;
&lt;li&gt;Message: (DATA), which is ended by a single period on the last line.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;br/&gt;220 example.com mailfront ESMTP&lt;br/&gt;MAIL FROM: &lt;me@yahoo.com&gt;&lt;br/&gt;250 2.1.0 Sender accepted.&lt;br/&gt;RCPT TO: &lt;you@example.org&gt;&lt;br/&gt;250 OK&lt;br/&gt;DATA&lt;br/&gt;354 End your message with a period on a line by itself.&lt;br/&gt;Subject: Hello there&lt;br/&gt;From: Me &lt;me@yahoo.com&gt;&lt;br/&gt;&lt;br/&gt;I just love SMTP!&lt;br/&gt;.&lt;br/&gt;250 2.6.0 Accepted message qp 16590 bytes 226&lt;br/&gt;QUIT&lt;br/&gt;221 2.0.0 Good bye.&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;</description><link>http://girders.org/post/60710411</link><guid>http://girders.org/post/60710411</guid><pubDate>Sun, 05 Aug 2007 00:00:00 -0400</pubDate></item></channel></rss>
