<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Maximum Retro</title>
    <link>http://maximumretro.com/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>A Few Bits of Insight</description>
    <item>
      <title>Ruby on Rails: Override Attribute Assignment</title>
      <description>&lt;p&gt;ActiveRecord models used to provide access to their internal attribute data through the attributes method, but this doesn&amp;#8217;t seem to be the case any longer. Have a look at the current source code and you can see why. The attribute hash is cloned before being returned, so changes aren&amp;#8217;t applied.&lt;/p&gt;

&lt;p&gt;So the old method of reassigning is no longer applicable:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;m&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;MyModel&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="ident"&gt;m&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;attributes&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;   &lt;span class="comment"&gt;# Assigns to a clone of m's @attributes&lt;/span&gt;
&lt;span class="ident"&gt;m&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;
 &lt;span class="comment"&gt;# =&amp;gt; 'test'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This limits your options when trying to re-define an assignment method, but there is still a way. For example, to trigger some behaviour when a value is assigned, you can do this:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;name=&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="comment"&gt;# Always force to lower-case&lt;/span&gt;
        &lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;downcase&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Calling the base class method of the same name will allow ActiveRecord to handle the assignment properly, and there&amp;#8217;s still a way to extend the basic functionality in a model.&lt;/p&gt;</description>
      <pubDate>Thu, 05 Jul 2007 16:07:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:edf31718-5eb8-46fd-9dec-68d0b4be654e</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2007/07/05/ruby-on-rails-override-attribute-assignment</link>
      <category>rails</category>
      <category>model</category>
    </item>
    <item>
      <title>Ruby on Rails + Daemons</title>
      <description>&lt;p&gt;Getting a Rails script to run in the background shouldn&amp;#8217;t be hard, but there&amp;#8217;s a few issues with the stock configuration that need to be fixed before anything will work properly.&lt;/p&gt;

&lt;p&gt;First, the Daemons GEM will switch your current working directory to be &amp;#8216;/&amp;#8217; which will mean that whatever RAILS_ROOT you have will likely be incorrect. Usually it&amp;#8217;s something like &amp;#8220;../config/../&amp;#8221; which works only if you&amp;#8217;re in the &amp;#8220;correct&amp;#8221; location.&lt;/p&gt;

&lt;p&gt;A quick fix for that can be put into your &lt;code&gt;environment.rb&lt;/code&gt; file right up at the top, after RAILS&lt;em&gt;GEM&lt;/em&gt;VERSION. &lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expand_path&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dirname&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;__FILE__&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;..&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt; &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;getwd&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then you need to create a controller script in some directory. &lt;code&gt;scripts/&lt;/code&gt; is probably fine, but you may have a preference for something else.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s an example that launches &lt;code&gt;myscript.rb&lt;/code&gt; which resides in the same directory as the controller script.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;daemons&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="constant"&gt;Daemons&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;run&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dirname&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;__FILE__&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;myscript.rb&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt;
    &lt;span class="symbol"&gt;:dir&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;../log&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
    &lt;span class="symbol"&gt;:dir_mode&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:script&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
    &lt;span class="symbol"&gt;:backtrace&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
    &lt;span class="symbol"&gt;:monitor&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nothing special needs to be done in &lt;code&gt;myscript.rb&lt;/code&gt; but you must keep in mind that all output will be lost. To log it, you might do something like this before sending any output to STDOUT:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="global"&gt;$stdout&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;reopen&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{RAILS_ROOT}&lt;/span&gt;/log/agent.log&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;w&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;))&lt;/span&gt;
&lt;span class="global"&gt;$stderr&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;reopen&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{RAILS_ROOT}&lt;/span&gt;/log/agent.err&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;w&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 24 Nov 2006 22:46:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:78b3de17-24ae-4af1-a6b5-407dd6662aab</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/11/24/ruby-on-rails-daemons</link>
      <category>rails</category>
      <category>daemons</category>
    </item>
    <item>
      <title>Rails Migrations with Fixtures</title>
      <description>&lt;p&gt;When creating a model, in addition to creating the base class, Rails will create a fixture file in &lt;a href="http://yaml.org/"&gt;YAML&lt;/a&gt; format and a very rough migration class. In most cases you will want to import some data at first, for example, to create the &amp;#8220;Administrator&amp;#8221; user.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a simple way to automatically load in the fixtures within the migration file:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;active_record/fixtures&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CreateMyModel&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Migration&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.up&lt;/span&gt;
        &lt;span class="keyword"&gt;begin&lt;/span&gt;
            &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;transaction&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
                &lt;span class="ident"&gt;create_table&lt;/span&gt; &lt;span class="symbol"&gt;:my_models&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                    &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;column&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:string&lt;/span&gt;
                    &lt;span class="comment"&gt;# ...&lt;/span&gt;
                &lt;span class="keyword"&gt;end&lt;/span&gt;

                &lt;span class="constant"&gt;Fixtures&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create_fixtures&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;test/fixtures&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="symbol"&gt;:my_models&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
            &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="keyword"&gt;rescue&lt;/span&gt;
            &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;down&lt;/span&gt;
            &lt;span class="keyword"&gt;raise&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.down&lt;/span&gt;
        &lt;span class="ident"&gt;drop_table&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;my_models&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;MyModel&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;table_exists?&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that if there&amp;#8217;s an error in your YAML file you&amp;#8217;ll get a failure that might not make any sense. I spent a good fifteen minutes trying to track down a problem that was related to having an &amp;#8220;empty&amp;#8221; entry. In this case I had a value that looked like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
test:
  # ...
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With no data in there, the Fixture instance was being given &amp;#8216;nil&amp;#8217; instead of some data and threw an exception as a result. I think it&amp;#8217;s valid YAML, but not valid enough for Fixture.&lt;/p&gt;</description>
      <pubDate>Tue, 14 Nov 2006 17:51:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:cf16f860-88a0-4d97-aa54-c19a3fc1a897</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/11/14/rails-migrations-with-fixtures</link>
      <category>rails</category>
      <category>fixtures</category>
      <category>migrations</category>
    </item>
    <item>
      <title>Social Networking in Disarray</title>
      <description>&lt;p&gt;I&amp;#8217;ve been making an effort to find better sites in the &amp;#8220;Social Networking&amp;#8221; space beside Digg and Reddit, but few seem even close to that modest standard of usability and popularity.&lt;/p&gt;

&lt;p&gt;So many are derivative to the point of being unflattering clones of some other service, or are just so far off base as to be either impractical or inscrutable.  Blink this, Shadow that, they&amp;#8217;re all shades of bizarre, or worse, mere outlets for spam links.&lt;/p&gt;

&lt;p&gt;Delicious will be integrated with &lt;a href="http://popyula.com/"&gt;Popyula&lt;/a&gt; soon, all a matter of collecting the right data, but there&amp;#8217;s few others that seem so urgent to introduce.&lt;/p&gt;</description>
      <pubDate>Wed, 08 Nov 2006 23:28:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9dfb33c2-e652-459c-a685-ad6e44b4174e</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/11/08/social-networking-in-disarray</link>
      <category>popyula</category>
      <category>social networking</category>
    </item>
    <item>
      <title>Popyula: A Blogosphere Popularity Report</title>
      <description>&lt;p&gt;After a week of steady work I&amp;#8217;m finally able to launch my first quick application: &lt;a href="http://popyula.com/"&gt;Popyula&lt;/a&gt;, a site that reports on the ever changing popularity of pages as they appear in blogs.&lt;/p&gt;

&lt;p&gt;Right now it&amp;#8217;s covering &lt;a href="http://digg.com/"&gt;Digg&lt;/a&gt; and &lt;a href="http://reddit.com/"&gt;Reddit&lt;/a&gt; but that will be expanded to other popular services in the near future.&lt;/p&gt;

&lt;p&gt;For example, here&amp;#8217;s a list of &lt;a href="http://popyula.com/reports/domain/youtube.com"&gt;all links to YouTube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While I haven&amp;#8217;t gone so far as to slap the Web2.0 requisite &amp;#8220;Beta&amp;#8221; decal on the site, it is a work in progress.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s great is that with &lt;a href="http://www.rubyonrails.com/"&gt;Ruby on Rails&lt;/a&gt;, &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt; and &lt;a href="http://httpd.apache.org/"&gt;Apache 2.2&lt;/a&gt; I was able to make this run really fast on a really low-budget server.&lt;/p&gt;</description>
      <pubDate>Tue, 10 Oct 2006 22:36:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:3a3f889b-be8e-40c4-ac97-4d4871d3dc5e</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/10/10/popyula-a-blogosphere-popularity-report</link>
    </item>
    <item>
      <title>Quick Ruby on Rails SQL Shell Tool</title>
      <description>&lt;p&gt;This is a simple Ruby script that I put together to launch a MySQL shell for a rails application. It looks within the current directory and parent directories for a &lt;code&gt;database.yml&lt;/code&gt; configuration file to read.&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="comment"&gt;#!/usr/bin/env ruby&lt;/span&gt;

&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;yaml&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;optparse&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="ident"&gt;config&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;

&lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;.&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;length&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists?&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{path}&lt;/span&gt;/config/database.yml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;))&lt;/span&gt;
                &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{path}&lt;/span&gt;/config/database.yml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
                        &lt;span class="ident"&gt;config&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;YAML&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;load&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
                &lt;span class="keyword"&gt;end&lt;/span&gt;
        &lt;span class="keyword"&gt;else&lt;/span&gt;
                &lt;span class="ident"&gt;path&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;../&lt;span class="expr"&gt;#{path}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Could not find database.yml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="ident"&gt;exit&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;command&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;mysql&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;verbose&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;

&lt;span class="ident"&gt;opts&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;OptionParser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;on&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;-v&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;--verbose&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;verbose&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;on&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;-d&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;--dump&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;command&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;mysqldump&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;

&lt;span class="ident"&gt;args&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;(*&lt;/span&gt;&lt;span class="constant"&gt;ARGV&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="ident"&gt;environ&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="keyword"&gt;or&lt;/span&gt; &lt;span class="constant"&gt;ENV&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="keyword"&gt;or&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;development&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;

&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;config&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;environ&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
        &lt;span class="ident"&gt;config&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;environ&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;

        &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inspect&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;verbose&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

        &lt;span class="ident"&gt;exec&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;command&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;--user=&lt;span class="expr"&gt;#{config['username']}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;--password=&lt;span class="expr"&gt;#{config['password']}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;--host=&lt;span class="expr"&gt;#{config['host']}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;--port=&lt;span class="expr"&gt;#{config['port'] or 3306}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                &lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;database&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
        &lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;elsif&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Could not find environment &lt;span class="expr"&gt;#{environ}&lt;/span&gt; in configuration file&lt;span class="escape"&gt;\n&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="ident"&gt;exit&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;else&lt;/span&gt;
        &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Could not find or read Rails configuration file&lt;span class="escape"&gt;\n&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="ident"&gt;exit&lt;/span&gt;&lt;span class="punct"&gt;(-&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For example, to save a database backup:&lt;/p&gt;

&lt;pre&gt;
% cd svn/myapp/db
% rsql --dump &gt; dev.sql
&lt;/pre&gt;</description>
      <pubDate>Tue, 10 Oct 2006 16:30:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:6434f5f2-494e-490c-9bed-fb6eb9898713</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/10/10/quick-ruby-on-rails-sql-shell-tool</link>
      <category>rails</category>
      <category>sql</category>
    </item>
    <item>
      <title>Ruby on Rails Migrations</title>
      <description>&lt;p&gt;Although I&amp;#8217;m a big fan of the concept of migrations, one of the things I&amp;#8217;m not especially enamoured with is the way Rails implements them. Each migration is an atomic thing that proceeds, in specific sequence, from others. There&amp;#8217;s no room for branching or conditions.&lt;/p&gt;

&lt;p&gt;When I&amp;#8217;m working in a group development environment I might be producing code that requires a migration alongside another developer doing much the same. Without some degree of co-ordination regarding migration numbers, this will cause a conflict, even if the actual migrations themselves are entirely independent..&lt;/p&gt;

&lt;p&gt;It would be  nice if the migrations had not only some kind of sequence identifier number but a prerequisites column so that two could share a number and yet be applied correctly.&lt;/p&gt;

&lt;p&gt;I wonder if developing an improved migrations system would yield any tangible benefits.&lt;/p&gt;</description>
      <pubDate>Tue, 10 Oct 2006 14:50:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:001467b5-4b14-49d5-bb4a-c2e674902acf</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/10/10/ruby-on-rails-migrations</link>
      <category>rails</category>
    </item>
    <item>
      <title>Mongrel Rails Launcher</title>
      <description>&lt;p&gt;Here&amp;#8217;s a quick &lt;code&gt;init.d&lt;/code&gt;-type script to launch &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt; with the appropriate options:&lt;/p&gt;

&lt;pre&gt;
#!/bin/sh

case "$1" in
        start)
                mongrel_rails start -d -e demo -p 4101 -P log/mongrel-dev.pid
                ;;
        stop)
                mongrel_rails stop -P log/mongrel-dev.pid
                ;;
        *)
                echo $"Invalid option"
                exit 1
esac
&lt;/pre&gt; 

&lt;p&gt;This is useful if there&amp;#8217;s more than one instance of mongrel running in a particular directory.&lt;/p&gt;</description>
      <pubDate>Mon, 09 Oct 2006 00:01:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:5d325956-0db8-4891-b64a-4bdfd6a46f1f</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/10/09/mongrel-rails-launcher</link>
      <category>mongrel</category>
      <category>rails</category>
    </item>
    <item>
      <title>Subversion 1.4 and Apache 2.2</title>
      <description>&lt;p&gt;The Apache development team has upgraded the &lt;code&gt;apr&lt;/code&gt; interface for &lt;code&gt;httpd&lt;/code&gt; from version 0 to version 1, where &lt;code&gt;httpd-2.2.3&lt;/code&gt; is now using &lt;code&gt;apr-1.2.7&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This means that a lot of modules not only have to be recompiled, but they need to use the correct &lt;code&gt;apr&lt;/code&gt; or they&amp;#8217;ll be left hanging.&lt;/p&gt;

&lt;p&gt;I thought I had compiled it correctly but I was using the wrong one, as an upgrade from 2.0 to 2.2 had carelessly left them behind.&lt;/p&gt;

&lt;p&gt;This is how I got it to hold together on a Fedora system:&lt;/p&gt;

&lt;pre&gt;
./configure --with-apxs=/httpd/bin/apxs \
 --with-apr=/usr/local/apache2/bin/apr-1-config \
 --with-apr-util=/usr/local/apache2/bin/apu-1-config
&lt;/pre&gt;</description>
      <pubDate>Sat, 07 Oct 2006 19:20:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:850bea5b-9295-4c67-9717-f39a3ebe7626</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/10/07/subversion-1-4-and-apache-2-2</link>
      <category>apache</category>
      <category>subversion</category>
    </item>
    <item>
      <title>Disabling Caps Lock on OS X</title>
      <description>&lt;p&gt;Eclipsed perhaps only by the regretful Windows Key, &amp;#8220;Caps Lock&amp;#8221; is a perpetual nuisance on many keyboards. It exists merely to annoy.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.matias.ca/"&gt;Matias&lt;/a&gt; keyboard I have doesn&amp;#8217;t put the button in its usual place, instead opting to tuck it away down by the right Control key. There it is less of a pest but it will still get bumped and nudged from time to time.&lt;/p&gt;

&lt;p&gt;The best way to eliminate this button altogether, short of prying it from the keyboard, is to map it out using the Keyboard control panel.&lt;/p&gt;

&lt;p&gt;&lt;img src="/files/NoCapsLock.gif"&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 06 Oct 2006 19:14:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:946b5765-f831-4437-83da-fffd7a6b7037</guid>
      <author>Tadman</author>
      <link>http://maximumretro.com/articles/2006/10/06/disabling-caps-lock-on-os-x</link>
      <category>os x</category>
      <enclosure url="http://maximumretro.com/files/NoCapsLock.gif" length="27161" type="image/gif"/>
    </item>
  </channel>
</rss>
