<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://antoniocangiano.com/wp-atom.php">
	<title type="text">Zen and the Art of Programming</title>
	<subtitle type="text">By Antonio Cangiano, Software Engineer &amp; Technical Evangelist at IBM</subtitle>

	<updated>2008-08-05T21:58:37Z</updated>
	<generator uri="http://wordpress.org/" version="2.6">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://antoniocangiano.com" />
	<id>http://antoniocangiano.com/feed/atom/</id>
	

			<link rel="self" href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming" type="application/atom+xml" /><feedburner:emailServiceId>1052009</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[Ruby on Rails for Microsoft Developers available for pre-order on Amazon.com]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/356770615/" />
		<id>http://antoniocangiano.com/?p=209</id>
		<updated>2008-08-05T21:58:37Z</updated>
		<published>2008-08-05T21:58:37Z</published>
		<category scheme="http://antoniocangiano.com" term="Books" /><category scheme="http://antoniocangiano.com" term="Ruby" /><category scheme="http://antoniocangiano.com" term="Ruby on Rails" />		<summary type="html"><![CDATA[Ruby on Rails for Microsoft Developers is now available for pre-order on Amazon.com. Contrary to what the Amazon page states, the publication date is planned for the middle of December, not January. Similarly, the description is quite messed up and loosely based on the first outline. It almost makes it sound like a book on [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/08/05/ruby-on-rails-for-microsoft-developers-available-for-pre-order/">&lt;p&gt;Ruby on Rails for Microsoft Developers is now &lt;a href="http://antoniocangiano.com/my_ruby_on_rails_book.php"&gt;available for pre-order on Amazon.com&lt;/a&gt;. Contrary to what the &lt;a href="http://antoniocangiano.com/my_ruby_on_rails_book.php"&gt;Amazon page states&lt;/a&gt;, the publication date is planned for the middle of December, not January. Similarly, the description is quite messed up and loosely based on the first outline. It almost makes it sound like a book on Ruby as opposed to one on Rails. In reality, only two chapters are dedicated to Ruby, while all the others are Rails specific. A more accurate description should be up soon though.&lt;/p&gt;
&lt;p&gt;This is the cover, with the picture of yours truly. Ladies, easy on the emails, I&amp;#8217;m happily married. &lt;img src='http://antoniocangiano.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /&gt; Jokes aside, I&amp;#8217;ll share a bit of trivia about the picture with you. The few decent photographers in the area quoted me outrageously high numbers just for the one shot I needed for the cover. Being passionate about photography, I ended up shooting it myself, so it&amp;#8217;s a self-portrait. I wonder if it&amp;#8217;s a first in the world of Wrox covers.&lt;/p&gt;
&lt;div align="center"&gt;&lt;a href="http://antoniocangiano.com/my_ruby_on_rails_book.php" style="decoration: none;"&gt;&lt;img src="http://antoniocangiano.com/wp-content/uploads/2008/08/cover.jpg" alt="Cover of the Ruby on Rails for Microsoft Developers book" title="Ruby on Rails for Microsoft Developers" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Page-wise, I&amp;#8217;ve written roughly half the book, which is going to be about 450 pages, and I expect to finish writing sometime in October.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=MZfKtK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=MZfKtK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=DQTksk"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=DQTksk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=zkq45k"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=zkq45k" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=EKCp2K"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=EKCp2K" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=23mVlK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=23mVlK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=fM5SUk"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=fM5SUk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/356770615" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/08/05/ruby-on-rails-for-microsoft-developers-available-for-pre-order/#comments" thr:count="13" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/08/05/ruby-on-rails-for-microsoft-developers-available-for-pre-order/feed/atom/" thr:count="13" />
		<thr:total>13</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/08/05/ruby-on-rails-for-microsoft-developers-available-for-pre-order/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[This Week in Ruby (July 26, 2008)]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/346434516/" />
		<id>http://antoniocangiano.com/?p=207</id>
		<updated>2008-07-26T08:16:10Z</updated>
		<published>2008-07-26T08:10:59Z</published>
		<category scheme="http://antoniocangiano.com" term=".NET" /><category scheme="http://antoniocangiano.com" term="Ruby" /><category scheme="http://antoniocangiano.com" term="Ruby on Rails" /><category scheme="http://antoniocangiano.com" term="This Week in Ruby" />		<summary type="html"><![CDATA[This is the 13th episode of This Week in Ruby, please consider subscribing to my feed so as to not miss any weekly installments. Also, if you enjoy the series and this blog in general, please consider recommending me on Working With Rails.

JRuby 1.1.3 has been released. This version includes several bug fixes and major [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/26/this-week-in-ruby-july-26-2008/">&lt;p&gt;&lt;em&gt;This is the 13th episode of This Week in Ruby, please consider &lt;a href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming"&gt;subscribing to my feed&lt;/a&gt; so as to not miss any weekly installments. Also, if you enjoy the series and this blog in general, please consider &lt;a href="http://workingwithrails.com/recommendation/new/person/4723-antonio-cangiano"&gt;recommending me&lt;/a&gt; on Working With Rails.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.codehaus.org/display/JRUBY/2008/07/19/JRuby+1.1.3+Released"&gt;JRuby 1.1.3&lt;/a&gt; has been released. This version includes several bug fixes and major speed and memory improvements.&lt;br /&gt;
Satish Talim of RubyLearning has announced &lt;a href="http://rubylearning.com/satishtalim/jruby_course.html"&gt;a new course&lt;/a&gt; dedicated to the subject, and also interviewed Charles Nutter for the occasion, who provided some suggestions for &lt;a href="http://rubylearning.com/blog/2008/07/21/charles-nutter-talks-to-rubylearning-participants/"&gt;RubyLearning participants&lt;/a&gt;. This week, Satish also interviewed &lt;a href="http://rubylearning.com/blog/2008/07/23/guy-naor-cto-morph-labs/"&gt;Guy Naor&lt;/a&gt;, the &lt;span class="caps"&gt;CTO&lt;/span&gt; of Morph Labs, a prominent cloud computing Rails hosting company.&lt;/p&gt;
&lt;p&gt;On the .NET side, things are moving just as quickly. &lt;a href="http://rubyworld.wordpress.com/2008/07/25/great-ironruby-news-from-oscon-2008-cheer-up/"&gt;Some great news&lt;/a&gt; emerged from &lt;span class="caps"&gt;OSCON 2008&lt;/span&gt; regarding IronRuby, including the first binary release and the setting up of a project called ironruby-contrib on GitHub. This already includes the Rails plugin for Silverlight. Meanwhile, Peter Cooper published a great set of &lt;a href="http://www.rubyinside.com/ironruby-tutorials-by-justin-etheredge-964.html"&gt;IronRuby tutorials to bring C# developers into the Ruby fold&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the alternative framework world, &lt;a href="http://www.mackframework.com/2008/07/16/release-060/"&gt;Mack Framework 0.6&lt;/a&gt; was released, which includes DataMapper 0.9.2 and RSpec support, transactional tests, internationalization and other improvements. The &lt;a href="http://blog.merbivore.com/2008/07/21/charging-toward-1-0"&gt;roadmap to Merb 1.0&lt;/a&gt; was also posted on the official blog.&lt;/p&gt;
&lt;p&gt;I had previously mentioned a few well known issues with Ruby and &lt;span class="caps"&gt;XML&lt;/span&gt;. Well, it appears that there is hope regarding a &lt;a href="http://cfis.savagexi.com/articles/2008/07/16/resurrecting-libxml-ruby"&gt;libxml-ruby resurrection&lt;/a&gt; after all. &lt;a href="http://redcloth.org"&gt;RedCloth 4&lt;/a&gt; was also released this week.&lt;/p&gt;
&lt;p&gt;Two interesting articles were: &lt;a href="http://judofyr.net/posts/dont-forget-about-rubyforge.html"&gt;Don&amp;#8217;t forget about RubyForge&lt;/a&gt;, which covers the issue of mass migration towards GitHub, and &lt;a href="http://blog.jayfields.com/2008/07/ruby-underuse-of-modules.html"&gt;Modules underuse&lt;/a&gt; by Jay Fields.&lt;/p&gt;
&lt;p&gt;Toronto&amp;#8217;s sponsor-less conference &lt;a href="http://rethink.unspace.ca/2008/7/20/we-are-rubyfringe"&gt;RubyFringe&lt;/a&gt; is over and according to its participants it was fantastic. I truly regret not being able to participate in it. For those who were there, feel free to share your opinions in the comment section.&lt;/p&gt;
&lt;p&gt;One last thing before you go; I must give my &amp;#8220;caught-red-handed Ruby Community award&amp;#8221; this week to Thiyagarajan Veluchamy. This dude thought it was a good idea to &lt;a href="http://thiyagarajanveluchamy.wordpress.com/2008/07/23/top-10-ruby-on-rails-performance-tips"&gt;lift the entire content&lt;/a&gt; of &lt;a href="http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-performance-tips/"&gt;one of my most popular articles&lt;/a&gt; from more than a year ago, even hotlinking the image, and then attributing the post to himself. Did he really think that no one would notice? Its link became popular on Del.icio.us for the Rails tag, and I got all sorts of emails from people who recognized my old (and now somewhat outdated) article. After a brief investigation, it turns out that Thiyagarajan has a habit of stealing content. Other articles appear to be copied verbatim from various blogs. Thiyagarajan, a word of advice, gathering inspiration from a certain post is fine, copying it is not. Especially if you try to pull it off by copying from someone who reports on the most interesting and popular posts in the community. That&amp;#8217;s just a really dumb move.&lt;/p&gt;
&lt;p&gt;To keep the good times rolling, the fourth edition of &lt;a href="http://weblog.rubyonrails.org/2008/7/26/this-week-in-rails-july-26-2008"&gt;This Week in Rails&lt;/a&gt; is available on the official Rails blog.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=uLtUeJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=uLtUeJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=6wKZlj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=6wKZlj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=7XT0lj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=7XT0lj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=E1HoiJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=E1HoiJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=eIlGRJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=eIlGRJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=fROIzj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=fROIzj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/346434516" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/26/this-week-in-ruby-july-26-2008/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/26/this-week-in-ruby-july-26-2008/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/26/this-week-in-ruby-july-26-2008/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[Goodbye Randy]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/345725539/" />
		<id>http://antoniocangiano.com/?p=205</id>
		<updated>2008-07-25T17:58:27Z</updated>
		<published>2008-07-25T14:51:11Z</published>
		<category scheme="http://antoniocangiano.com" term="General" />		<summary type="html"><![CDATA[

My farewell to Randy, on Be Life Savvy.
]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/25/goodbye-randy-pausch/">&lt;div align="center"&gt;&lt;a href="http://www.cmu.edu/homepage/beyond/2008/summer/an-enduring-legacy.shtml"&gt;&lt;img src="http://antoniocangiano.com/wp-content/uploads/2008/07/randy.jpg" alt="Randy Pausch" title="Randy Pausch" width="500" height="340" class="alignnone size-full wp-image-206" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;My farewell to Randy, on &lt;a href="http://belifesavvy.com/2008/07/25/saying-goodbye-to-a-man-who-inspired-the-world/"&gt;Be Life Savvy&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=OaiCMJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=OaiCMJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=e2RUnj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=e2RUnj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=NNU4zj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=NNU4zj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=twLGlJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=twLGlJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=Kof4WJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=Kof4WJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=Ho49Zj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=Ho49Zj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/345725539" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/25/goodbye-randy-pausch/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/25/goodbye-randy-pausch/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/25/goodbye-randy-pausch/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[Be life savvy: my new non-programming blog]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/340748605/" />
		<id>http://antoniocangiano.com/?p=204</id>
		<updated>2008-07-20T16:12:58Z</updated>
		<published>2008-07-20T16:12:58Z</published>
		<category scheme="http://antoniocangiano.com" term="General" />		<summary type="html"><![CDATA[This is a short post to let you know that I&#8217;m starting a new non-programming blog. It&#8217;s called Be life savvy and it&#8217;s going to be about practical tips for modern living, without the typical mumbo jumbo of self-help blogs.
As you probably know I don&#8217;t have much spare time, but this is a project that [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/20/be-life-savvy-my-new-non-programming-blog/">&lt;p&gt;This is a short post to let you know that I&amp;#8217;m starting a new non-programming blog. It&amp;#8217;s called &lt;a href="http://belifesavvy.com"&gt;Be life savvy&lt;/a&gt; and it&amp;#8217;s going to be about practical tips for modern living, without the typical mumbo jumbo of self-help blogs.&lt;/p&gt;
&lt;p&gt;As you probably know I don&amp;#8217;t have much spare time, but this is a project that I&amp;#8217;ve thought about for a long time and it&amp;#8217;s good to take an hour, once in a while, to think and write about a different topic. Starting this blog, and other blogs in the past, has taught me that the writer ends up learning as much or more than their readers. I started the &lt;em&gt;Be life savvy&lt;/em&gt; to share my ideas, opinions, experiments and findings with other bright people.&lt;/p&gt;
&lt;p&gt;If you follow this blog and you are somewhat interested in these topics, feel free to head over to &lt;a href="http://belifesavvy.com"&gt;belifesavvy.com&lt;/a&gt; and &lt;a href="http://feeds.feedburner.com/BeLifeSavvy"&gt;subscribe to its feed&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=tiJrcJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=tiJrcJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=rhacgj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=rhacgj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=htomFj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=htomFj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=Et9AJJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=Et9AJJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=gYHnlJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=gYHnlJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=wqYTJj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=wqYTJj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/340748605" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/20/be-life-savvy-my-new-non-programming-blog/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/20/be-life-savvy-my-new-non-programming-blog/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/20/be-life-savvy-my-new-non-programming-blog/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[Rogers has reached a new low]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/339262903/" />
		<id>http://antoniocangiano.com/?p=202</id>
		<updated>2008-07-19T02:53:27Z</updated>
		<published>2008-07-18T19:18:38Z</published>
		<category scheme="http://antoniocangiano.com" term="General" />		<summary type="html"><![CDATA[If we exclude resellers, there aren&#8217;t too many Internet Service Providers (ISP) available to residential customers in Canada. It is in fact my understanding that the market of ISP who own their own infrastructure in Toronto is limited to a duopoly between Rogers and Bell.
I&#8217;ve been with Rogers for the past two and a half [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/18/rogers-has-reached-a-new-low/">&lt;p&gt;If we exclude resellers, there aren&amp;#8217;t too many Internet Service Providers (ISP) available to residential customers in Canada. It is in fact my understanding that the market of ISP who own their own infrastructure in Toronto is limited to a duopoly between Rogers and Bell.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been with Rogers for the past two and a half years and I must say their service has always been quite satisfactory in terms of speed and reliability. At $54.95 per month they are not exactly cheap, and they place a cap on the amount of monthly traffic, but otherwise they offer up pretty decent service.&lt;/p&gt;
&lt;p&gt;Rogers gained a bad rep though, because they do traffic shaping. This means you can forget about making Skype calls in peace, legally using non-throttled P2P systems or legitimately download, using BitTorrent at a decent speed (saving encryption workarounds). More recently, they also came under fire for proposing the second most expensive iPhone plans in the world.&lt;/p&gt;
&lt;p&gt;More importantly though, a while ago they started &lt;a href="http://www.boingboing.net/2007/12/10/rogers-isp-of-canada.html"&gt;rewriting the pages&lt;/a&gt; that their customers visited, in order to warn them of their high internet usage.&lt;/p&gt;
&lt;p&gt;Now however, they&amp;#8217;ve reached a new low. They figured out that hijacking their customers&amp;#8217; user experience can be a very lucrative thing. Today I discovered that if you type a non-existing URL, Rogers will automatically redirect you to a page chock-full of ads, and a few possible matches (in reality they are mostly unrelated results).&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://antoniocangiano.com/wp-content/uploads/2008/07/rogers.jpg" alt="Rogers' new low" title="Rogers' new low" width="500" height="487" /&gt;&lt;/p&gt;
&lt;p&gt;They&amp;#8217;re like the evil twin of OpenDNS, making money off of less Internet-savvy users who may not be aware that they can disable this &amp;#8220;feature&amp;#8221;. Clicking on &amp;#8220;Learn more about this page&amp;#8221; at the bottom of the page we&amp;#8217;re brought to a &amp;#8220;Click here  if you would no longer like to receive the Rogers Supported Search Results service.&amp;#8221; link, where any Internet-savvy user will opt out.&lt;/p&gt;
&lt;p&gt;This being an oligopoly, there aren&amp;#8217;t many choices available, but I&amp;#8217;m a big believer in &amp;#8220;voting with your money&amp;#8221;, so not only will I switch to a different ISP, but I&amp;#8217;ll also let them know why. At this stage the most likely candidate is &lt;a href="http://techsavvy.ca"&gt;Tech Savvy&lt;/a&gt;, but they&amp;#8217;re slower than Rogers and throttled by Bell anyway. Other ISP suggestions are definitely welcome.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=IJpPwJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=IJpPwJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=8isChj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=8isChj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=5dqnRj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=5dqnRj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=kCCv2J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=kCCv2J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=vzLw8J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=vzLw8J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=nM901j"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=nM901j" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/339262903" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/18/rogers-has-reached-a-new-low/#comments" thr:count="14" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/18/rogers-has-reached-a-new-low/feed/atom/" thr:count="14" />
		<thr:total>14</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/18/rogers-has-reached-a-new-low/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[A close look at three Rails 2.1 bugs]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/334928841/" />
		<id>http://antoniocangiano.com/?p=201</id>
		<updated>2008-07-14T12:43:00Z</updated>
		<published>2008-07-14T09:00:42Z</published>
		<category scheme="http://antoniocangiano.com" term="DB2" /><category scheme="http://antoniocangiano.com" term="Ruby" /><category scheme="http://antoniocangiano.com" term="Ruby on Rails" />		<summary type="html"><![CDATA[Ruby on Rails 2.1 has been out for six weeks now. Let&#8217;s take a closer look at three database related bugs that affect this release.
1. SQLite&#8217;s db creation generates false warnings
This is an innocuous bug, and if you work with SQLite I&#8217;m sure that you encountered and safely ignored it. When you create a Rails [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/14/a-close-look-at-three-rails-21-bugs/">&lt;p&gt;Ruby on Rails 2.1 has been out for six weeks now. Let&amp;#8217;s take a closer look at three database related bugs that affect this release.&lt;/p&gt;
&lt;h2&gt;1. SQLite&amp;#8217;s db creation generates false warnings&lt;/h2&gt;
&lt;p&gt;This is an innocuous bug, and if you work with SQLite I&amp;#8217;m sure that you encountered and safely ignored it. When you create a Rails application, the default adapter in use is sqlite3, unless you specify otherwise with the -d option. The config/database.yml will reference three databases by default: db/development.sqlite3, db/test.sqlite3 and db/production.sqlite3. Now if you try to create the databases through the db:create or db:create:all rake tasks, the database will be created, but you&amp;#8217;ll also get a warning:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;
$ rake db:create:all
db/development.sqlite3 already exists
db/production.sqlite3 already exists
db/test.sqlite3 already exists
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That warning message is not actually true. The three databases didn&amp;#8217;t exist before you ran rake, and were created by the task instead, as you&amp;#8217;d expect. This is a small annoyance, but one that pops up way too often for my taste. Let&amp;#8217;s see where things went wrong.&lt;/p&gt;
&lt;p&gt;The db:create and db:create:all tasks invoke the method create_database defined within the file railties/lib/tasks/database.rake in the repository (or the frozen vendor/rails folder). This is the definition of the method:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;
  &lt;span class="k"&gt;rescue&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adapter&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mysql&amp;#39;&lt;/span&gt;
      &lt;span class="vi"&gt;@charset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CHARSET&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;
      &lt;span class="vi"&gt;@collation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;COLLATION&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8_general_ci&amp;#39;&lt;/span&gt;
      &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:charset&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;charset&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@charset&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:collation&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collation&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@collation&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t create database for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, charset: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;charset&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@charset&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, collation: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collation&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@collation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (if you set the charset manually, make sure you have a matching collation)&amp;quot;&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;postgresql&amp;#39;&lt;/span&gt;
      &lt;span class="vi"&gt;@encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:encoding&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CHARSET&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;
      &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;postgres&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;schema_search_path&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;public&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;encoding&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="vi"&gt;@encoding&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backtrace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t create database for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sqlite&amp;#39;&lt;/span&gt;
      &lt;span class="sb"&gt;`sqlite &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;quot;`&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sqlite3&amp;#39;&lt;/span&gt;
      &lt;span class="sb"&gt;`sqlite3 &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;quot;`&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; already exists&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;At first glance, it looks OK: it tries to establish a successful connection, if it succeeds, it executes the else clause and prints a message stating that the database already exists; otherwise Ruby creates it in the rescue clause with the sqlite3 command line tool (or sqlite if using the sqlite adapter).&lt;/p&gt;
&lt;p&gt;What truly happens though, is that the rescue clause is never executed (short of Ruby raising an unrelated error). The reason for this is that the two lines of code between begin and rescue, not only attempt to connect to the given database, but will create the database if this doesn&amp;#8217;t exist already (well, the SQLite&amp;#8217;s Active Record adapter creates it). This means that regardless of whether the database existed or not, those two lines will be successfully run and won&amp;#8217;t raise any errors. The final outcome is that the database that didn&amp;#8217;t exist, gets created, and the else clause gets executed, wrongly warning us that the database already existed.&lt;/p&gt;
&lt;p&gt;I opened &lt;a href="http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/614-patch-fix-sqlite-s-db-creation-warnings"&gt;a ticket for this&lt;/a&gt; and submitted a patch. This is the new create_database method that works correctly:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adapter&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/sqlite/&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exist?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; already exists&amp;quot;&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="k"&gt;begin&lt;/span&gt;
          &lt;span class="c1"&gt;# Create the SQLite database&lt;/span&gt;
          &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;
        &lt;span class="k"&gt;rescue&lt;/span&gt;
          &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backtrace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t create database for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="c1"&gt;# Skip the else clause of begin/rescue    &lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;rescue&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adapter&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mysql&amp;#39;&lt;/span&gt;
      &lt;span class="vi"&gt;@charset&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CHARSET&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;   &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;
      &lt;span class="vi"&gt;@collation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;COLLATION&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8_general_ci&amp;#39;&lt;/span&gt;
      &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:charset&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;charset&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@charset&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:collation&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collation&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@collation&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t create database for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, charset: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;charset&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@charset&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, collation: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collation&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="vi"&gt;@collation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (if you set the charset manually, make sure you have a matching collation)&amp;quot;&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;postgresql&amp;#39;&lt;/span&gt;
      &lt;span class="vi"&gt;@encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:encoding&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CHARSET&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;
      &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;postgres&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;schema_search_path&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;public&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;encoding&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="vi"&gt;@encoding&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;rescue&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backtrace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t create database for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; already exists&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I removed the creation of the SQLite (2 and 3) database from the case statement inside the rescue clause, but the actual deal is in these lines:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adapter&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/sqlite/&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exist?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; already exists&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;begin&lt;/span&gt;
      &lt;span class="c1"&gt;# Create the SQLite database&lt;/span&gt;
      &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;
    &lt;span class="k"&gt;rescue&lt;/span&gt;
      &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backtrace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="vg"&gt;$stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t create database for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="c1"&gt;# Skip the else clause of begin/rescue    &lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If the specified adapter is sqlite or sqlite3 then Ruby checks if the database file exists or not. If it exists, the warning message is printed; if it doesn&amp;#8217;t, Ruby creates the database automatically by invoking the connection method after running establish_connection with the configuration as an argument. If there is an error during the creation of the database &amp;#8212; or the connection to the database, if this already exists &amp;#8212; the error and its backtrace are printed. Finally, we exit the method so as to not execute the else clause of the begin/rescue statement, which would erroneously print that the database already existed. If the adapter in use is any other adapter, then we just run the two lines as we did in the non-patched version of the method.&lt;/p&gt;
&lt;p&gt;Notice also that there was a second problem with the original code. I couldn&amp;#8217;t replace those connection lines with &lt;span class="sb"&gt;`sqlite3 &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;database&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;quot;`&lt;/span&gt; because they would open an SQLite3 shell which remains open, so the rake task waits forever for that shell to exit (you can actually see this if you use system rather than &amp;#8220;).&lt;/p&gt;
&lt;h2&gt;2. Preloading has_and_belongs_to_many associations generates non-standard SQL&lt;/h2&gt;
&lt;p&gt;This second bug is quite serious and relates to the generation of non-standard SQL in has_and_belongs_to_many associations. Imagine that you have two models and a finder as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Project&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:developers&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Developer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:projects&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:include&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:developers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That finder will generate a query like:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;developers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project_id&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;_parent_record_id&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;developers&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;developers_projects&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;developers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;developer_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project_id&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice that &lt;span class="n"&gt;_parent_record_id&lt;/span&gt;? That&amp;#8217;s problematic because an SQL identifier cannot begin with an underscore, and this is true for all three versions of the standard (92, 99 and 2003). You can verify the non-conformity of the generated SQL through &lt;a href="http://developer.mimer.com/validator/parser200x/index.tml#parser"&gt;this validator&lt;/a&gt;. That single underscore broke support for DB2 and Oracle, and possibly other standard compliant databases.&lt;/p&gt;
&lt;p&gt;I submitted &lt;a href="http://rails.lighthouseapp.com/projects/8994/tickets/394-patch-fixed-non-standard-sql-generated-by-preloading-has_and_belongs_to_many-associations"&gt;a patch&lt;/a&gt; for this some time ago and it was immediately applied by Jeremy Kemper, so Edge Rails and the next version of Rails aren&amp;#8217;t affected. Meanwhile the IBM_DB gem worked around the issue and I believe the Oracle enhanced adapter did the same.&lt;/p&gt;
&lt;h2&gt;3. DEFAULT NULL NULL&lt;/h2&gt;
&lt;p&gt;The third bug is somewhat similar to the second one and it&amp;#8217;s caused once again by non-standard SQL. This too, like the previous bug, breaks support for DB2, Oracle and possibly some other databases. Imagine that we have the following migration file:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreatePosts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Migration&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;up&lt;/span&gt;
    &lt;span class="n"&gt;create_table&lt;/span&gt; &lt;span class="ss"&gt;:posts&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ss"&gt;:body&lt;/span&gt;

      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamps&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;down&lt;/span&gt;
    &lt;span class="n"&gt;drop_table&lt;/span&gt; &lt;span class="ss"&gt;:posts&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;When the up method gets invoked by a rake task, the following query will be generated (this is the SQLite version of it):&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;posts&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTOINCREMENT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;&amp;quot;title&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;&amp;quot;body&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;&amp;quot;created_at&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;&amp;quot;updated_at&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Exclude for a moment the primary key, whose syntax is entirely adapter specific. The rest of the query still shows a problem. &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; is not standard SQL and will not be accepted by some databases. This is caused by the fact that in the column definition we didn&amp;#8217;t specify a :default option, so we have the equivalent of :default =&gt; nil, which translates into &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;. This precedes the second NULL, which is there to indicate that the column accepts nulls. Again, even the second NULL is not part of the SQL standard. A field is nullable by default, therefore we only need to specify something if it must not accept NULLs (i.e. by appending NOT NULL).&lt;/p&gt;
&lt;p&gt;The solution to this problem lies in changing the behavior of ColumnDefinition&amp;#8217;s instance method to_sql in activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb. This is the current definition:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_sql&lt;/span&gt;
  &lt;span class="n"&gt;column_sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote_column_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;sql_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;add_column_options!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:null&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_sym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="ss"&gt;:primary_key&lt;/span&gt;
  &lt;span class="n"&gt;column_sql&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice how the second argument of add_column_options! is a hash that sets the null and default values in every case. If these values are nil, the value NULL gets pushed into the final SQL query. We need to prevent this from happening by passing the two options only when they are not nil.&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_sql&lt;/span&gt;
  &lt;span class="n"&gt;column_sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote_column_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;sql_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;column_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="n"&gt;column_options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:null&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nil?&lt;/span&gt;
  &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:default&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nil?&lt;/span&gt;
  &lt;span class="n"&gt;add_column_options!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column_options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_sym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="ss"&gt;:primary_key&lt;/span&gt;
  &lt;span class="n"&gt;column_sql&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The migration file we saw above will now generate the following query (again, in the case of SQLite):&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;posts&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;&amp;quot;id&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTOINCREMENT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;&amp;quot;title&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;&amp;quot;body&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;&amp;quot;created_at&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;&amp;quot;updated_at&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is standard SQL, if we exclude the primary key syntax which is specific to SQLite. More importantly, this would work and be accepted by other database systems like DB2 and Oracle. Version 0.9.5 of the IBM_DB gem monkey patches the issue in a similar fashion, in order to work around this problem and provide support for Rails 2.1. It is possible that the Oracle enhanced adapter 1.1.1 does the same thing. I didn&amp;#8217;t submit a patch for this issue because several tickets regarding it are already open, and Nick Sieger already beat me to it. &lt;a href="http://rails.lighthouseapp.com/projects/8994/tickets/334-don-t-add-default-null-to-column-definitions"&gt;His patch&lt;/a&gt; was submitted more than a month ago but it hasn&amp;#8217;t received any attention yet. I hope that this post will contribute towards changing that.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I think the last two bugs highlight a valid lesson: the importance of adhering to the SQL standard, particularly when implementing an Object-Relational mapper that supports so many databases. ActiveRecord takes the approach of generating SQL queries by mixing common SQL bits, defined outside of a particular adapter, with dialect-specific parts which are defined by each adapter. It is therefore crucial to ensure that the bits that end up in the SQL queries, independently from the adapter in use, are based on the SQL standard and not on the behavior of SQLite or MySQL.&lt;/p&gt;
&lt;p&gt;The same principle applies when building a CMS system or a popular blog engine. If the project is aimed at being portable from one RDBMS to another with little hassle, attention should be payed to custom queries in order to keep them as close to the SQL standard as possible. Of course, it&amp;#8217;s perfectly fine to create projects that are database specific and take advantage of that particular database&amp;#8217;s strength. For example, &lt;a href="http://www-306.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&amp;#038;S_TACT=ACDB201"&gt;DB2 Express-C&lt;/a&gt; offers the ability to handle XML in a native manner through a technology called pureXML. This is a fantastic feature, which can&amp;#8217;t really be ported to a different RDBMS, but it&amp;#8217;s worth its weight in gold, particularly when working in Ruby.&lt;/p&gt;
&lt;p&gt;Lastly, don&amp;#8217;t let this reflect negatively on your judgment of Rails&amp;#8217; code quality. A large and ambitious project like Rails is bound to have bugs here and there, no matter how scrupulous its developers are.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=9HHDvJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=9HHDvJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=YTZlNj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=YTZlNj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=XXNsnj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=XXNsnj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=nGKtNJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=nGKtNJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=nDVt4J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=nDVt4J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=zhTU4j"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=zhTU4j" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/334928841" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/14/a-close-look-at-three-rails-21-bugs/#comments" thr:count="9" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/14/a-close-look-at-three-rails-21-bugs/feed/atom/" thr:count="9" />
		<thr:total>9</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/14/a-close-look-at-three-rails-21-bugs/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[This Week in Ruby (July 11, 2008)]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/333189068/" />
		<id>http://antoniocangiano.com/?p=200</id>
		<updated>2008-07-23T19:34:16Z</updated>
		<published>2008-07-12T02:05:57Z</published>
		<category scheme="http://antoniocangiano.com" term="Ruby" /><category scheme="http://antoniocangiano.com" term="Ruby on Rails" /><category scheme="http://antoniocangiano.com" term="This Week in Ruby" />		<summary type="html"><![CDATA[This is the 12th episode of This Week in Ruby, please consider subscribing to my feed so as to not miss any weekly installments. Also, if you enjoy the series and this blog in general, please consider recommending me on Working With Rails.
I&#8217;d like to start this edition by apologizing to my readers for the [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/11/this-week-in-ruby-july-11-2008/">&lt;p&gt;&lt;em&gt;This is the 12th episode of This Week in Ruby, please consider &lt;a href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming"&gt;subscribing to my feed&lt;/a&gt; so as to not miss any weekly installments. Also, if you enjoy the series and this blog in general, please consider &lt;a href="http://workingwithrails.com/recommendation/new/person/4723-antonio-cangiano"&gt;recommending me&lt;/a&gt; on Working With Rails.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d like to start this edition by apologizing to my readers for the delay in publishing this edition. Things got pretty hectic last week.&lt;/p&gt;
&lt;p&gt;As far as I know, there are no updates regarding Ruby&amp;#8217;s vulnerabilities, but if you&amp;#8217;re aware of any, feel free to state so in the comment section. Meanwhile, BreakingPoint Systems published a couple of extra problems that were discovered while analyzing those pesky security issues. You can read about them &lt;a href="http://www.breakingpointsystems.com/community/blog/ruby-vulns.odt"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As you may have inferred, I&amp;#8217;m quite interested in the optimization of Ruby code. Ilya Grigorik wrote 6 &lt;a href="http://www.igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri/"&gt;nice tips for optimizing Ruby &lt;span class="caps"&gt;MRI&lt;/span&gt;&lt;/a&gt;, which may come handy to you.&lt;/p&gt;
&lt;p&gt;A new chapter was added to &lt;em&gt;The Book of Ruby&lt;/em&gt; by Huw Collingbourne. Read more about it and &lt;a href="http://www.sapphiresteel.com/Book-Of-Ruby-New-Chapter"&gt;download it here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Ruby community is big on &lt;span class="caps"&gt;TDD&lt;/span&gt; and &lt;span class="caps"&gt;BDD&lt;/span&gt; and there is no doubt that testing is fundamental for good quality software. RailSpike opens a can of worms with its thought-provoking article, &lt;a href="http://railspikes.com/2008/7/11/testing-is-overrated"&gt;Testing is overrated&lt;/a&gt;. Whether you agree or not with its findings, it is definitely worth a read.&lt;/p&gt;
&lt;p&gt;Ethan Vizitei has had a couple of compelling entries lately. The first is about &lt;a href="http://codeclimber.blogspot.com/2008/06/using-ruby-for-imap-with-gmail.html"&gt;handling Gmail&amp;#8217;s imap from Ruby&lt;/a&gt; and the second deals with &lt;a href="http://codeclimber.blogspot.com/2008/07/refactoring-in-ruby.html"&gt;refactoring Ruby code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sinatra is an ultralight Web framework, while Datamapper is considered by many to be a valid substitute for Active Record. Nick Plante &lt;a href="http://blog.zerosum.org/2008/7/2/clone-pastie-with-sinatra-datamapper-redux"&gt;shows us how to use them together&lt;/a&gt; to create &lt;a href="http://paste.zerosum.org/"&gt;a Pastie clone&lt;/a&gt;. If you are into Datamapper or would like to just get a feel for it, consider reading over &lt;a href="http://cheat.errtheblog.com/s/datamapper/"&gt;this cheatsheet&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;In conclusion, InfoQ published a &lt;a href="http://www.infoq.com/news/2008/07/metaprogramming-roundup"&gt;Metaprogramming roundup&lt;/a&gt; and the second part of their &lt;a href="http://www.infoq.com/news/2008/07/rubykaigi"&gt;RubyKaigi 2008 coverage&lt;/a&gt;. The most interesting bit is about the exciting prospective of standardizing Ruby. That would be a leap forward for the language and our community.&lt;/p&gt;
&lt;p&gt;To keep the good times rolling, the third edition of &lt;a href="http://weblog.rubyonrails.org/2008/7/11/this-week-in-rails-july-11-2008"&gt;This Week in Rails&lt;/a&gt; is available on the official Rails blog.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=BYu1vJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=BYu1vJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=Ya7ouj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=Ya7ouj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=PrXqZj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=PrXqZj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=XHlPQJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=XHlPQJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=HSm9VJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=HSm9VJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=7xJ4tj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=7xJ4tj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/333189068" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/11/this-week-in-ruby-july-11-2008/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/11/this-week-in-ruby-july-11-2008/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/11/this-week-in-ruby-july-11-2008/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[Ruby Shootout Status Update]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/328614100/" />
		<id>http://antoniocangiano.com/?p=199</id>
		<updated>2008-07-07T06:17:08Z</updated>
		<published>2008-07-07T06:07:04Z</published>
		<category scheme="http://antoniocangiano.com" term="Ruby" /><category scheme="http://antoniocangiano.com" term="Ruby Benchmark Suite" /><category scheme="http://antoniocangiano.com" term="Ruby on Rails" />		<summary type="html"><![CDATA[I want to provide those who are waiting for the Ruby shootout with a heads up. The benchmark suite needs some substantial changes in order to ensure accuracy and fairness for all the VMs involved.
This will delay the execution (and reporting) of the shootout further, but it will be worth it. I definitely prefer a [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/07/07/shootout-status-update/">&lt;p&gt;I want to provide those who are waiting for the Ruby shootout with a heads up. The benchmark suite needs some substantial changes in order to ensure accuracy and fairness for all the VMs involved.&lt;/p&gt;
&lt;p&gt;This will delay the execution (and reporting) of the shootout further, but it will be worth it. I definitely prefer a shootout that&amp;#8217;s published later in July (or heck even August) that is realistic, fair and provides interesting metrics (e.g. CPU time and memory) over an inaccurate one that was put together in a rush just for the sake of publishing it tomorrow.&lt;/p&gt;
&lt;p&gt;For those interested in the technical details, we are trying to separate the parsing and &amp;#8220;compilation&amp;#8221; of definitions from the actual execution of the code (which needs to be timed). I accomplished this by creating a Proc for each benchmark, and then tested the time spent executing its &lt;code&gt;call&lt;/code&gt; method. The problem with this approach is that it penalizes VMs that don&amp;#8217;t JIT procs, like JRuby for example.&lt;/p&gt;
&lt;p&gt;We also thought about defining a method instead of a Proc, but &lt;code&gt;eval&lt;/code&gt; won&amp;#8217;t accept class definitions or constants within methods. The workaround would be using &lt;code&gt;MyClass.class_eval&lt;/code&gt; instead of &lt;code&gt;class MyClass&lt;/code&gt; in the benchmarks and &lt;code&gt;Module#const_set&lt;/code&gt; for the constants (or changing them to instance variables, for example). But we&amp;#8217;re shooting for a cleaner solution in which we divide definitions from their actual execution in separate files, and only time the latter.&lt;/p&gt;
&lt;p&gt;And of course, we also need to add cross-platform memory measurement into the picture. It may take a while, but stay tuned. &lt;img src='http://antoniocangiano.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=y5uEbJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=y5uEbJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=MWYrSj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=MWYrSj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=kLSIuj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=kLSIuj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=xcM4FJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=xcM4FJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=bq6foJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=bq6foJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=jOln4j"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=jOln4j" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/328614100" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/07/07/shootout-status-update/#comments" thr:count="11" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/07/07/shootout-status-update/feed/atom/" thr:count="11" />
		<thr:total>11</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/07/07/shootout-status-update/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[Ruby and Rails books, two years later (photo)]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/321634628/" />
		<id>http://antoniocangiano.com/?p=197</id>
		<updated>2008-06-27T22:39:22Z</updated>
		<published>2008-06-27T22:27:57Z</published>
		<category scheme="http://antoniocangiano.com" term="Books" /><category scheme="http://antoniocangiano.com" term="Ruby" /><category scheme="http://antoniocangiano.com" term="Ruby on Rails" />		<summary type="html"><![CDATA[Two years ago:

Today:

]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/06/27/ruby-and-rails-books-photo/">&lt;p&gt;Two years ago:&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://www.flickr.com/photos/anildigital/178961991/"&gt;&lt;img src='http://farm1.static.flickr.com/69/178961991_e78cf324f8_o.jpg' alt='Java vs. Ruby' style="border: 2px solid black;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today:&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href='http://flickr.com/photos/acangiano/2617051318/'&gt;&lt;img src="http://antoniocangiano.com/wp-content/uploads/2008/06/ruby-books.jpg" alt="" title="Ruby and Rails books" width="500" height="925" style="border: 2px solid black;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=1P5ypI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=1P5ypI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=ZcRnEi"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=ZcRnEi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=hb58Si"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=hb58Si" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=naZEoI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=naZEoI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=82p3TI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=82p3TI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=CLiH7i"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=CLiH7i" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/321634628" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/06/27/ruby-and-rails-books-photo/#comments" thr:count="25" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/06/27/ruby-and-rails-books-photo/feed/atom/" thr:count="25" />
		<thr:total>25</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/06/27/ruby-and-rails-books-photo/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Antonio Cangiano</name>
						<uri>http://antoniocangiano.com</uri>
					</author>
		<title type="html"><![CDATA[IBM&#8217;s crazy DB2 videos. What do you think?]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/320880464/" />
		<id>http://antoniocangiano.com/?p=196</id>
		<updated>2008-06-27T17:49:35Z</updated>
		<published>2008-06-26T23:18:17Z</published>
		<category scheme="http://antoniocangiano.com" term="DB2" /><category scheme="http://antoniocangiano.com" term="General" />		<summary type="html"><![CDATA[IBM is clearly synonymous with the term &#8220;Enterprise&#8221;, but I can testify that working here means interacting with many cool, down to earth people who are passionate about their profession. They are not the &#8220;corporate drones&#8221; that you&#8217;d expect. I sometimes think that there is a divide between the image of IBM and the reality [...]]]></summary>
		<content type="html" xml:base="http://antoniocangiano.com/2008/06/26/ibm-crazy-db2-videos/">&lt;p&gt;IBM is clearly synonymous with the term &amp;#8220;Enterprise&amp;#8221;, but I can testify that working here means interacting with many cool, down to earth people who are passionate about their profession. They are not the &amp;#8220;corporate drones&amp;#8221; that you&amp;#8217;d expect. I sometimes think that there is a divide between the image of IBM and the reality of a company that&amp;#8217;s mostly comprised of young people having fun while working hard.&lt;/p&gt;
&lt;p&gt;Reading comments on sites like Slashdot or Reddit I see that IBM is often unfairly treated, despite being a champion of Open Source, with contributions in excess of those of Google and Amazon combined.&lt;/p&gt;
&lt;p&gt;So I&amp;#8217;m glad to see that IBM is not &amp;#8220;taking itself too seriously&amp;#8221; with a series of ads, campaigns and initiatives that portray a less rigid image. The silly &amp;#8220;servers taking over&amp;#8221; ads are examples of this.&lt;/p&gt;
&lt;p&gt;More recently IBM has put out a few &amp;#8220;unusual&amp;#8221; videos about &lt;a href="http://www-306.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&amp;#038;S_TACT=ACDB201"&gt;DB2 Express-C&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://channeldb2.ning.com/video/video/show?id=807741:Video:9231"&gt;The Pitch Meeting - Monday (Part 1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channeldb2.ning.com/video/video/show?id=807741:Video:9428"&gt;The Pitch Meeting - Tuesday (Part 2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channeldb2.ning.com/video/video/show?id=807741%3AVideo%3A9562"&gt;The Pitch Meeting - Wednesday (part 3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://channeldb2.ning.com/video/video/show?id=807741%3AVideo%3A9425"&gt;Installing IBM DB2 Without Touching the Keyboard or Mouse&lt;/a&gt; (not a pro commercial)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I&amp;#8217;d like to ask you to share your opinions about them. Are they &amp;#8220;cool&amp;#8221; and funny, or are they goofy and just trying too hard?&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=rT34nI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=rT34nI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=uxaPji"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=uxaPji" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=NtZVIi"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=NtZVIi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=oO2fkI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=oO2fkI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=X1NGZI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=X1NGZI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?a=uAleGi"&gt;&lt;img src="http://feeds.feedburner.com/~f/ZenAndTheArtOfRubyProgramming?i=uAleGi" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~4/320880464" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://antoniocangiano.com/2008/06/26/ibm-crazy-db2-videos/#comments" thr:count="6" />
		<link rel="replies" type="application/atom+xml" href="http://antoniocangiano.com/2008/06/26/ibm-crazy-db2-videos/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	<feedburner:origLink>http://antoniocangiano.com/2008/06/26/ibm-crazy-db2-videos/</feedburner:origLink></entry>
	</feed>
