<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Austin.rb - home</title>
  <id>tag:austinruby.com,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.0">Mephisto Noh-Varr</generator>
  <link href="http://austinruby.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://austinruby.com/" rel="alternate" type="text/html"/>
  <updated>2007-07-28T03:48:11Z</updated>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Mars</name>
    </author>
    <id>tag:austinruby.com,2007-07-28:36</id>
    <published>2007-07-28T03:45:00Z</published>
    <updated>2007-07-28T03:48:11Z</updated>
    <category term="Ruby"/>
    <link href="http://austinruby.com/2007/7/28/activerecord-with-not-null-columns" rel="alternate" type="text/html"/>
    <title>ActiveRecord with NOT NULL columns</title>
<summary type="html">&lt;p&gt;Using ActiveRecord with an unchangeable legacy database schema poses some interesting challenges. Most of the work is a new style (for me) of composing adapters to make non-Rails stuff work within Rails' conventions.&lt;/p&gt;

&lt;p&gt;ActiveRecord uses the database's native &lt;code&gt;NULL&lt;/code&gt; to indicate an unset attribute [Ruby's &lt;code&gt;nil&lt;/code&gt;]. This becomes a problem when the column definition enforces &lt;code&gt;NOT NULL&lt;/code&gt; on columns that you may or may not be setting values.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Using ActiveRecord with an unchangeable legacy database schema poses some interesting challenges. Most of the work is a new style (for me) of composing adapters to make non-Rails stuff work within Rails' conventions.&lt;/p&gt;

&lt;p&gt;ActiveRecord uses the database's native &lt;code&gt;NULL&lt;/code&gt; to indicate an unset attribute [Ruby's &lt;code&gt;nil&lt;/code&gt;]. This becomes a problem when the column definition enforces &lt;code&gt;NOT NULL&lt;/code&gt; on columns that you may or may not be setting values.&lt;/p&gt;
&lt;p&gt;The following Ruby code allows a table with &lt;code&gt;NOT NULL&lt;/code&gt; columns to &quot;just work&quot; with ActiveRecord by setting them to reasonable default values.&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;OldBacon&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;ActiveRecord&lt;/span&gt;::&lt;span class='co'&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  before_validation &lt;span class='sy'&gt;:prep_not_null_columns&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;prep_not_null_columns&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='pc'&gt;self&lt;/span&gt;.class.columns.each &lt;span class='r'&gt;do&lt;/span&gt; |c|&lt;tt&gt;
&lt;/tt&gt;      &lt;span class='r'&gt;unless&lt;/span&gt; c.null&lt;tt&gt;
&lt;/tt&gt;        &lt;span class='r'&gt;if&lt;/span&gt; read_attribute(c.name).nil?&lt;tt&gt;
&lt;/tt&gt;          &lt;span class='r'&gt;case&lt;/span&gt; c.type&lt;tt&gt;
&lt;/tt&gt;          &lt;span class='r'&gt;when&lt;/span&gt; &lt;span class='sy'&gt;:date&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;            new_value = &lt;span class='co'&gt;Date&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;          &lt;span class='r'&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;            new_value = c.instance_values[&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;original_default&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;          &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          write_attribute(c.name, new_value)&lt;tt&gt;
&lt;/tt&gt;        &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Questionably defying good DBA practices? Perhaps. But sometimes you have to make the best with the hand your dealt.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Mars</name>
    </author>
    <id>tag:austinruby.com,2007-07-25:35</id>
    <published>2007-07-25T21:51:00Z</published>
    <updated>2007-07-25T22:24:43Z</updated>
    <category term="meta-talk"/>
    <link href="http://austinruby.com/2007/7/25/textmate-s-hidden-find-in-selection" rel="alternate" type="text/html"/>
    <title>TextMate's hidden "Find in Selection"</title>
<summary type="html">&lt;p&gt;[16:30] srogers:&lt;br /&gt;
So what's up with TextMate and replace string in selection?&lt;br /&gt;
i.e. why is it not there in the find dialog?&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;[16:30] srogers:&lt;br /&gt;
So what's up with TextMate and replace string in selection?&lt;br /&gt;
i.e. why is it not there in the find dialog?&lt;/p&gt;
&lt;p&gt;[16:37] marsipan:&lt;br /&gt;
srogers: hold down the option key while in the Find dialog&lt;br /&gt;
&quot;Replace All&quot; becomes &quot;in Selection&quot;&lt;/p&gt;

&lt;p&gt;[16:38] srogers:&lt;br /&gt;
cool&lt;br /&gt;
thanks&lt;br /&gt;
(seems like checkbox would be better though)&lt;/p&gt;

&lt;p&gt;[16:39] marsipan:&lt;br /&gt;
agreed.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Steven</name>
    </author>
    <id>tag:austinruby.com,2007-07-25:34</id>
    <published>2007-07-25T06:11:00Z</published>
    <updated>2007-07-25T06:18:29Z</updated>
    <category term="Ruby"/>
    <link href="http://austinruby.com/2007/7/25/using-your-fixture-data-in-development" rel="alternate" type="text/html"/>
    <title>Using Your Fixture Data in Development</title>
<summary type="html">&lt;p&gt;So you've spent hours putting together some sensible data for your tests in a bunch of tediously crafted YAML files, and you're staring at a blank development database. If only there were an easy way to slip that data from the test database back into development . . .&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;So you've spent hours putting together some sensible data for your tests in a bunch of tediously crafted YAML files, and you're staring at a blank development database. If only there were an easy way to slip that data from the test database back into development . . .&lt;/p&gt;
&lt;p&gt;Your strategies for managing data will probably evolve as your project progresses, but I find that in the early stages when I'm trying to be &quot;agile&quot;, I'm making frequent changes to the database and I don't really care about full-cycle management. In this stage, writing migrations for each change in DB is a drag, because I don't want to carry the kind of configuration management overhead during this rapid prototyping phase. Managing the data with migrations is even worse.&lt;/p&gt;

&lt;p&gt;That's why I find it so convenient to &lt;a href='http://austinruby.com/2007/7/1/diagrams-to-migrations-using-omnigraffle'&gt;prototype the DB grahically using OmniGraffle&lt;/a&gt; and just keep rolling back to migration zero, then recreating the database from the updated initial migration. You're thinking &quot;Gee, doesn't that mean you're blowing your tables and data away every time you make a change&quot;?  And indeed, that's what brings us to this point.&lt;/p&gt;

&lt;p&gt;Even in rapid-prototyping mode, I still have tests and fixture data. When I make a change to the DB, then I get the fixture data repaired, get the tests running, and then I want to &quot;play&quot; with the system in development. The data I want is in the test DB (because my tests loaded it from the fixtures). It's possible to trick a dump from the MySQL Administrator or command line to load in another database, but that's realy not convenient. To make this fast and easy, I created a script to copy the data from each table in the test DB to the development DB. It doesn't delete the table (which could change the options it was created with), it just moves the data.&lt;/p&gt;

&lt;pre&gt;
#!/bin/csh
echo &quot;Get tables . . .&quot;
mysql -u person -ppass -h localhost -D my_development &gt;table_list.tmp &amp;lt;&amp;lt; EOF
show tables from my_test 
EOF
foreach tableName ( `cat table_list.tmp | sed -e '1d' | sed -e '/schema_info/d' `)
  echo &quot;clean and load $tableName  . . .&quot;
  mysql -u person -ppass -h localhost -D my_development &amp;lt;&amp;lt; EOF
  delete from $tableName ;
EOF
  mysqldump -u person -ppass -c -n -t --skip-opt prototype_test $tableName | mysql -u person -ppass -h localhost -D my_development
end
rm table_list.tmp
echo &quot;Done.&quot;
&lt;/pre&gt;

&lt;p&gt;If you want to move the data from just one table, that's pretty easy too:&lt;/p&gt;

&lt;pre&gt;
#!/bin/csh
# clean and reload the specified table in development from table in test DB
# USAGE:  reload_table table-name
echo &quot;clean table $1  . . .&quot;
mysql -u person -ppass -h localhost -D my_development &amp;lt;&amp;lt; EOF
delete from $1 ;
EOF
echo load $1
mysqldump -u person -ppass -c -n -t --skip-opt my_test $1 | mysql -u person -ppass -h localhost -D my_development
&lt;/pre&gt;

&lt;p&gt;These two scripts should allow you to quickly change your DB, blow it away and re-run your initial migration, get your fixture data into the test DB as your work through the tests, and then slide the data back into development. Once you get beyond the early stages of development, you'll want to increase change control and encapsulate your changes in migrations, and this technique may become less useful. But while things are flying fast and loose in the early stages, it really helps to keep things loose, and test driven to have the test data be &lt;i&gt;the&lt;/i&gt; data in the system. If you get tired of writing YAML, once your prototype is running, you can use your system to help create test data and dump it to fixtures using the &lt;a href='http://nubyonrails.com/articles/dump-or-slurp-yaml-reference-data'&gt;ar_fixtures&lt;/a&gt; plugin.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Steven</name>
    </author>
    <id>tag:austinruby.com,2007-07-01:31</id>
    <published>2007-07-01T05:19:00Z</published>
    <updated>2007-07-04T22:22:34Z</updated>
    <category term="Ruby"/>
    <link href="http://austinruby.com/2007/7/1/diagrams-to-migrations-using-omnigraffle" rel="alternate" type="text/html"/>
    <title>Diagrams to Migrations using OmniGraffle</title>
<summary type="html">&lt;p&gt;Once you go through the pain of setting up SQL Fairy (CPAN, yikes!), you can be designing your database visually with OmniGraffle in collaboration with other non-Railsy folks, and then generate your Ruby migration and stick it directly into your Rails project. &lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Once you go through the pain of setting up SQL Fairy (CPAN, yikes!), you can be designing your database visually with OmniGraffle in collaboration with other non-Railsy folks, and then generate your Ruby migration and stick it directly into your Rails project. &lt;/p&gt;
&lt;p&gt;I'm in the process of embarking on a new Rails project with a moderate sized database. This project is based on an existing system, but with considerable redesign. I wanted to find a way to document the design so that other non-Railsy people can provide feedback on the design as it evolves, and do it in such a way that it would be natural to keep the documentation in sync with the Rails project.&lt;/p&gt;

&lt;p&gt;Most DB tools are designed around an old-school method for database configuration management - the larger tools directly manage the database schema by pumping SQL through an ODBC connection. The smaller tools are focused on just visualizing an existing database. Neither of these options is well suited to developing in Rails. I'd really like to use the diagram as part of the creative process of developing the database rather than a post-hoc documentation step, and I don't want to short-circuit the Rails development process of managing the database through migrations. &lt;/p&gt;

&lt;p&gt;After some searching I found &lt;a href='http://www.graffle2sql.com'&gt;graffle2sql.com&lt;/a&gt; - a site that takes database diagrams created with &lt;a href='http://www.omnigroup.com/applications/omnigraffle/'&gt;OmniGraffle&lt;/a&gt; and generates the SQL for the tables in the diagram. This is close, but what I really need is the Ruby for a migration, not SQL. I've been down this road enough to know that if the document requires a lot of tweaking to get it into the development process, it will quickly become stale and useless. A little more searching turned up &lt;a href='http://sqlfairy.sourceforge.net/'&gt;SQL Fairy&lt;/a&gt;. This is a parser-based project that provides a wide variety of tools for manipulating SQL. This allowed me to set up a pipeline from an OmniGraffle DB diagram to a Ruby migration file using the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make a DB diagram in OmniGraffle using the Graffle2SQL template
&lt;li&gt;Convert it to SQL at graffle2sql.com
&lt;li&gt;Use SQL Fairy to generate a YAML intermediate DB description
&lt;li&gt;Use the template tool to rearrange the schema data into the general structure of a Ruby migration
&lt;li&gt;Use string substitution to convert SQL type information into Ruby, yielding a Ruby migration file.
&lt;/ol&gt;

&lt;p&gt;The last step is the only imperfect part of the process. The type information from SQL Fairy is somewhat limited, so complex types like decimal(x,y) don't translate properly.  I'm not a Perl wizard (SQL Fairy is written in Perl) so there may be a better way to setup the template file to cover these cases.&lt;/p&gt;

&lt;p&gt;In order to set this up, you need to install SQL Fairy and the template module. The template file I used is:&lt;/p&gt;

&lt;pre&gt;
class InitialSchema &amp;lt; ActiveRecord::Migration
  # This file was auto-generated from SQL
  def self.up
[% FOREACH table IN schema.get_tables %]
    create_table &quot;[% table.name %]&quot; do |t|
  [% FOREACH field IN table.get_fields -%]
    t.column :[% field.name %],  :[% field.data_type %]  [% field.size %], :null =&gt; [% field.is_nullable %], :default =&gt; [% field.default_value %]
  [% END -%]
  end
[% END -%]
  end

  def self.down
[% FOREACH table IN schema.get_tables -%]
    drop_table &quot;[% table.name %]&quot;
[% END -%]
  end
end
&lt;/pre&gt;

&lt;p&gt;and the script that drives the whole conversion process (OK, it's not Ruby, so shoot me) is:&lt;/p&gt;

&lt;pre&gt;
#!/bin/csh
# syntax:  convert.csh file-root
# where the file to input is file-root.sql
# output will be in file-root.rb - the intermediate file file-root.yaml is removed

echo 'Generating YAML file . . .'
sqlt -f MySQL -t YAML $1.sql &gt; $1.yaml
echo 'generating Ruby file . . .'
sqlt -f YAML -t TTSchema --template migration.tt $1.yaml &gt; $1.txt
echo 'cleaning data type information . . .'
cat $1.txt | sed 's/:int  11/:integer/' | \
             sed 's/:varchar \([0-9]*\)/:string, :limit =&gt; \1/' | \
             sed 's/:char \([0-9]*\)/:string, :limit =&gt; \1/' | \
             sed 's/:tinytext  [0-9]*/:string/' | \
             sed 's/:timestamp  0/:timestamp/' | \
             sed 's/:date  0/:date/' | \
             sed 's/:float  ARRAY(0x1b06ac4)/:float/' | \
             sed 's/, :null =&gt; 1//' | \
             sed 's/, :default =&gt; $//' | \
             sed 's/, :null =&gt; 0/, :null =&gt; false/' | \
             sed 's/,  :string, :limit =&gt;  255/,  :string/' | \
             sed -e '/, :id =&gt; false do |t|/N' -e 's/, :id =&gt; false do |t|\n      t.column :id,  :integer, :null =&gt; false/ do |t|/' &gt; $1.rb
rm $1.yaml $1.txt
echo 'done.'
&lt;/pre&gt;

&lt;p&gt;Once you go through the pain of setting up SQL Fairy (CPAN, yikes!), you can be designing your database visually in collaboration with other non-Railsy folks, and then generate your Ruby migration and stick it directly into your Rails project. This approach doesn't detect differences, so it's best suited for cases when you're working out the base schema by migrating back to VERSION=0, making changes to the migration, then migrating forward to VERSION=1 again. OmniGraffle is free for diagrams with 20 objects or less, so you can play around with the process to find out whether it works for you.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Jim</name>
    </author>
    <id>tag:austinruby.com,2006-10-20:29</id>
    <published>2006-10-20T19:23:00Z</published>
    <updated>2006-10-21T03:07:19Z</updated>
    <category term="Ruby"/>
    <link href="http://austinruby.com/2006/10/20/more-irb-tips" rel="alternate" type="text/html"/>
    <title>More Irb Tips</title>
<content type="html">
            &lt;p&gt;I was talking to someone (can't remember who) at Rubyconf and 
they brought up &lt;code&gt;#local_variable&lt;/code&gt;. This method shows
you the names of all the local variables in scope. &lt;/p&gt;

&lt;p&gt;Funny, I don't remember this function, and if I did know it, I 
had forgotten about it. So, I fired up &lt;code&gt;irb&lt;/code&gt; and type
it in to see what I get back:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;local_variables   #=&amp;gt; [&quot;_&quot;]
x = 5             #=&amp;gt; 5
local_variables   #=&amp;gt; [&quot;_&quot;, &quot;x&quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Hmmm, this is interesting. I know there is a variable in &lt;code&gt;irb&lt;/code&gt;
that contains the value of the last expression, but it is not easy to
remember. But, it looks like &lt;code&gt;_&lt;/code&gt; will do the same thing.&lt;/p&gt;

&lt;p&gt;I'm always doing math expressions where I need the value of the previous
expression. So now, instead of up-arrow and add to the equation, I can
use &lt;code&gt;_&lt;/code&gt;. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;5/7.0    #=&amp;gt; 0.714285714285714
2*_      #=&amp;gt; 1.42857142857143
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Of course, you can you this for any irb expression, and best of all, it is
a variable name I can actually remember. :)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Mars</name>
    </author>
    <id>tag:austinruby.com,2006-10-06:23</id>
    <published>2006-10-06T16:38:00Z</published>
    <updated>2006-10-08T00:12:32Z</updated>
    <category term="Ruby"/>
    <link href="http://austinruby.com/2006/10/6/quieting-irb-s-return-value" rel="alternate" type="text/html"/>
    <title>Quieting irb's Return Value</title>
<summary type="html">&lt;p&gt;It's easy to be overwhelmed by &lt;a href='http://poignantguide.net/ruby/expansion-pak-1.html'&gt;irb&lt;/a&gt;'s automatic printing of return values, especially when dealing with collections of ActiveRecords in &lt;a href='http://wiki.rubyonrails.org/rails/pages/Console'&gt;Rails' script/console&lt;/a&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;It's easy to be overwhelmed by &lt;a href='http://poignantguide.net/ruby/expansion-pak-1.html'&gt;irb&lt;/a&gt;'s automatic printing of return values, especially when dealing with collections of ActiveRecords in &lt;a href='http://wiki.rubyonrails.org/rails/pages/Console'&gt;Rails' script/console&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This simple nugget will save you from an ocean of return values.&lt;/p&gt;

&lt;p&gt;At the &lt;code&gt;irb&lt;/code&gt; [or &lt;code&gt;script/console&lt;/code&gt;] prompt, type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;conf.return_format = &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The default (to print the return value) is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;conf.return_format = &quot;=&amp;gt; %s\n&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To answer Jim's question (in the comments): you can easily limit the number of characters put into the result string by sprintf:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;conf.return_format = &quot;=&amp;gt; %.512s\n&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Replace &lt;code&gt;512&lt;/code&gt; with your preferred return value character length limit.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Jim</name>
    </author>
    <id>tag:austinruby.com,2006-10-05:12</id>
    <published>2006-10-05T15:47:00Z</published>
    <updated>2006-10-06T14:30:22Z</updated>
    <category term="Ruby"/>
    <link href="http://austinruby.com/2006/10/5/autovivification-with-hashes" rel="alternate" type="text/html"/>
    <title>Autovivification with Hashes</title>
<summary type="html">&lt;p&gt;For you Perl folk, you may be familiar with the term autovivification.
In essence, that is where an empty data structure gets automatically created
if it is referenced, but does not exist.&lt;/p&gt;

&lt;p&gt;For example, consider a hash. Let's say we want a two dimensional
hash such that we can write:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;The problem here is that &lt;code&gt;points[1]&lt;/code&gt; must return 
a hash, and this hash is in turn accessed with the key '2'. It
would be the same thing if we wrote:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;    tmp = points[&lt;span class='i'&gt;1&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;    tmp[&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;</summary><content type="html">
            &lt;p&gt;For you Perl folk, you may be familiar with the term autovivification.
In essence, that is where an empty data structure gets automatically created
if it is referenced, but does not exist.&lt;/p&gt;

&lt;p&gt;For example, consider a hash. Let's say we want a two dimensional
hash such that we can write:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;The problem here is that &lt;code&gt;points[1]&lt;/code&gt; must return 
a hash, and this hash is in turn accessed with the key '2'. It
would be the same thing if we wrote:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;    tmp = points[&lt;span class='i'&gt;1&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;    tmp[&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;All this is fine and good except that it does not work. &lt;code&gt;points[1]&lt;/code&gt;
returns &lt;code&gt;nil&lt;/code&gt; because the default return argument for
a Hash when it is referenced with a non-existant key is &lt;code&gt;nil&lt;/code&gt;. But, we can change that.&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new(&lt;span class='co'&gt;Hash&lt;/span&gt;.new)&lt;tt&gt;
&lt;/tt&gt;    tmp = points[&lt;span class='i'&gt;1&lt;/span&gt;]                         &lt;span class='c'&gt;#=&amp;gt; {}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tmp[&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;                              &lt;span class='c'&gt;#=&amp;gt; 5&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    points                                  &lt;span class='c'&gt;#=&amp;gt; {}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Well, that wasn't such a good idea. &lt;code&gt;points[1]&lt;/code&gt; returned a hash, but it never got
applied to the original &lt;code&gt;points&lt;/code&gt; hash. Even if we write this as &lt;code&gt;points[1][2] = 5&lt;/code&gt;,
we still get &lt;code&gt;points&lt;/code&gt; to be an empty hash.&lt;/p&gt;

&lt;h2&gt;Blocks to the Rescue&lt;/h2&gt;

&lt;p&gt;What we need is to use the block form of &lt;code&gt;Hash.new&lt;/code&gt; If a block is supplied to &lt;code&gt;#new&lt;/code&gt;,
it will be called with hash object and the key. So, to repeat the above, but with a block, we write:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new { |h,k| h[k] = {} }&lt;tt&gt;
&lt;/tt&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;                        &lt;span class='c'&gt;#=&amp;gt; {1=&amp;gt;{2=&amp;gt;5}}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;If that was too quick to realize what just happend, we can break it down into two steps, 
like we did above, and see just what is happening:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new{ |h,k| h[k] = {}}&lt;tt&gt;
&lt;/tt&gt;    tmp = points[&lt;span class='i'&gt;1&lt;/span&gt;]                         &lt;span class='c'&gt;#=&amp;gt; {}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    points                                  &lt;span class='c'&gt;#=&amp;gt; {1=&amp;gt;{}}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tmp[&lt;span class='i'&gt;2&lt;/span&gt;] = &lt;span class='i'&gt;5&lt;/span&gt;                              &lt;span class='c'&gt;#=&amp;gt; 5&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    points                                  &lt;span class='c'&gt;#=&amp;gt; {1=&amp;gt;{2=&amp;gt;5}}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;The expression &lt;code&gt;points[1]&lt;/code&gt; actually creates a key-value pair and automatically
sets the value to &lt;code&gt;{}&lt;/code&gt;, just like we told it to inside the block that was
passed to &lt;code&gt;Hash.new&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Customizing Vivification&lt;/h2&gt;

&lt;p&gt;Now, that's all well and good, but what if we wanted to have our final value be an array.
For example:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class='i'&gt;5&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class='i'&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;For this, we just need to make a small addition to our block that we pass to &lt;code&gt;#new&lt;/code&gt;.&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new { |h,k| h[k] = &lt;span class='co'&gt;Hash&lt;/span&gt;.new { |hh,kk| hh[kk] = [] }}&lt;tt&gt;
&lt;/tt&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class='i'&gt;5&lt;/span&gt;      &lt;span class='c'&gt;#=&amp;gt; {1={2=&amp;gt;[5]}}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    points[&lt;span class='i'&gt;1&lt;/span&gt;][&lt;span class='i'&gt;2&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class='i'&gt;10&lt;/span&gt;     &lt;span class='c'&gt;#=&amp;gt; {1={2=&amp;gt;[5, 10]}}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Well, now that's pretty nifty.&lt;/p&gt;

&lt;h2&gt;Endless Vivification&lt;/h2&gt;

&lt;p&gt;What if we need a hash that has an arbitrary number of arguments. For example, say
we wanted to represent a directory tree with a hash. We could end up with something
like:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    tree[&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;etc&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;][&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;samba&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;][&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;smb.conf&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]              &lt;span class='c'&gt;#=&amp;gt; contents of &amp;quot;smb.conf&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tree[&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;home&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;][&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;me&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;][&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;.ssh&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;][&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;authorized_keys&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;] &lt;span class='c'&gt;#=&amp;gt; list of keys&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Here is where we enter into the magic and mysterious land of recursive lambda's.
In the example above, it would be equivalent to write the &lt;code&gt;Hash&lt;/code&gt; constructors as:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    blk =  lambda { |h,k| h[k] = {}}&lt;tt&gt;
&lt;/tt&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new &amp;amp;blk&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    blk =  lambda { |h,k| h[k] = &lt;span class='co'&gt;Hash&lt;/span&gt;.new { |hh,kk| hh[kk] = [] }}&lt;tt&gt;
&lt;/tt&gt;    points = &lt;span class='co'&gt;Hash&lt;/span&gt;.new &amp;amp;blk&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;But, to have a 'never ending' constructor, we define the block using recursion:&lt;/p&gt;

&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;    blk = lambda { |h,k| h[k] = &lt;span class='co'&gt;Hash&lt;/span&gt;.new &amp;amp;blk }&lt;tt&gt;
&lt;/tt&gt;    tree = &lt;span class='co'&gt;Hash&lt;/span&gt;.new &amp;amp;blk&lt;tt&gt;
&lt;/tt&gt;    tree = &lt;span class='co'&gt;Hash&lt;/span&gt;.new &amp;amp;blk   &lt;span class='c'&gt;#=&amp;gt; {}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tree[&lt;span class='sy'&gt;:a&lt;/span&gt;][&lt;span class='sy'&gt;:b&lt;/span&gt;][&lt;span class='sy'&gt;:c&lt;/span&gt;] = &lt;span class='i'&gt;4&lt;/span&gt;   &lt;span class='c'&gt;#=&amp;gt; 4&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tree[&lt;span class='sy'&gt;:x&lt;/span&gt;][&lt;span class='sy'&gt;:y&lt;/span&gt;] = &lt;span class='i'&gt;1&lt;/span&gt;       &lt;span class='c'&gt;#=&amp;gt; 1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tree[&lt;span class='sy'&gt;:fred&lt;/span&gt;] = &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;sally&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;  &lt;span class='c'&gt;#=&amp;gt; &amp;quot;sally&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    tree                   &lt;span class='c'&gt;#=&amp;gt; {:a=&amp;gt;{:b=&amp;gt;{:c=&amp;gt;4}}, :x=&amp;gt;{:y=&amp;gt;1}, :fred=&amp;gt;&amp;quot;sally&amp;quot;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Now, isn't that cool! &lt;/p&gt;

&lt;p&gt;It's not too bad once you get used to it, but it can be a bit confusing at first.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Jim</name>
    </author>
    <id>tag:austinruby.com,2006-10-04:8</id>
    <published>2006-10-04T15:02:00Z</published>
    <updated>2006-10-04T15:52:52Z</updated>
    <category term="meetings"/>
    <link href="http://austinruby.com/2006/10/4/rubyconf-2006" rel="alternate" type="text/html"/>
    <title>RubyConf 2006</title>
<content type="html">
            &lt;p&gt;Well, RubyConf 2006 is nearly upon us and it looks like
the state of Texas is going to be well represented by six
Austinites. &lt;/p&gt;

&lt;p&gt;Those attending are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jim F.&lt;/li&gt;
&lt;li&gt;Hal F.&lt;/li&gt;
&lt;li&gt;Matt&lt;/li&gt;
&lt;li&gt;Wayne W.&lt;/li&gt;
&lt;li&gt;David B.&lt;/li&gt;
&lt;li&gt;Robert R.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wayne must have made some kind of deal with a Leprechaun,
because he was able to purchase a ticket just this week from
zdennis. I bought mine ten minutes before the announcement
that registration was open, and consider myself lucky since
registration was only open for two hours.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Jim</name>
    </author>
    <id>tag:austinruby.com,2006-10-04:7</id>
    <published>2006-10-04T14:42:00Z</published>
    <updated>2006-10-04T15:53:34Z</updated>
    <category term="meta-talk"/>
    <link href="http://austinruby.com/2006/10/4/welcome" rel="alternate" type="text/html"/>
    <title>Welcome</title>
<content type="html">
            &lt;p&gt;Just wanted to welcome everyone to our Ruby website,
and give it a little test drive.&lt;/p&gt;

&lt;p&gt;Thanks to Mars for putting this together, with some help
from Wayne, and thanks to Wayne for providing the hosting.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Mars</name>
    </author>
    <id>tag:austinruby.com,2006-10-02:4</id>
    <published>2006-10-02T01:28:00Z</published>
    <updated>2006-10-09T04:04:55Z</updated>
    <category term="meta-talk"/>
    <link href="http://austinruby.com/2006/10/2/the-workings" rel="alternate" type="text/html"/>
    <title>The Workings</title>
<content type="html">
            &lt;p&gt;Our server set-up is as follows:&lt;/p&gt;

&lt;h3&gt;austinruby.com =&lt;/h3&gt;

&lt;p&gt;&lt;a href='http://httpd.apache.org/'&gt;apache&lt;/a&gt; (port 80) &amp;lt;-&gt; &lt;a href='http://www.apsis.ch/pound/'&gt;pound&lt;/a&gt; (load balancer) &amp;lt;-&gt; &lt;a href='http://mongrel.rubyforge.org/'&gt;mongrels&lt;/a&gt; (Rails servers)&lt;/p&gt;

&lt;p&gt;We're starting out with three mongrels in the pound. Time will tell if more are required.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The original plan to serve static files from a separate virtual host has been nixed by my impatience.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;See: &lt;a href='/2006/10/8/the-workings-r2'&gt;The Workings r2&lt;/a&gt; for updates since this article.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://austinruby.com/">
    <author>
      <name>Mars</name>
    </author>
    <id>tag:austinruby.com,2006-10-01:1</id>
    <published>2006-10-01T20:30:00Z</published>
    <updated>2006-10-01T22:48:11Z</updated>
    <category term="meta-talk"/>
    <link href="http://austinruby.com/2006/10/1/activate" rel="alternate" type="text/html"/>
    <title>activate</title>
<summary type="html">&lt;p&gt;We're finally on-line! &lt;strong&gt;I love progress.&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;We're finally on-line! &lt;strong&gt;I love progress.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Final web server configuration is imminent. Then, I'll start adding authors.&lt;/p&gt;
          </content>  </entry>
</feed>
