<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Schrade.Blog</title>
  <subtitle type="html">Tech and Business Ramblings by Kurt Schrader</subtitle>
  <id>tag:kurt.karmalab.org,2005:Typo</id>
  <generator uri="http://www.typosphere.org" version="4.0">Typo</generator>
  
  <link href="http://kurt.karmalab.org" rel="alternate" type="text/html" />
  <updated>2008-04-24T18:36:05-07:00</updated>
  <link rel="self" href="http://feeds.feedburner.com/Schradeblog" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:8e0bf6bc-a2aa-4302-8e62-c2742167f095</id>
    <published>2008-04-24T18:29:00-07:00</published>
    <updated>2008-04-24T18:36:05-07:00</updated>
    <title type="html">Monkey Patching Core Functionality == BAD, BAD, BAD</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/277299940/monkey-patching-core-classes-bad" rel="alternate" type="text/html" />
    <category term="general" scheme="http://kurt.karmalab.org/articles/category/general" label="General" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <category term="ruby" scheme="http://kurt.karmalab.org/articles/category/ruby" label="Ruby" />
    <summary type="html">&lt;p&gt;Yesterday, I finally got around to upgrading HAML in our Rails app to the newest stable version and the first thing that happened was that 20 completely unrelated specs broke.&lt;/p&gt;

&lt;p&gt;Why, you may ask?&lt;/p&gt;

&lt;p&gt;A monkey got into our code, that's why.&lt;/p&gt;

&lt;p&gt;You see, Ruby allows you to redefine any method of any class on the fly (monkey patching) and it turns out that the old version of HAML had the following code in it:&lt;/p&gt;

&lt;PRE&gt;
  unless String.methods.include? 'old_comp'
  class String # :nodoc
    alias_method :old_comp, :&lt;=&gt;

    def &lt;=&gt;(other)
      if other.is_a? NilClass
        -1
      else
        old_comp(other)
      end
    end
  end

  class NilClass # :nodoc:
    include Comparable

    def &lt;=&gt;(other)
      other.nil? ? 0 : 1
    end
  end
end
&lt;/PRE&gt;

&lt;p&gt;This, in turn, snuck into our codebase in all sorts of little unexpected places.  In one instance a test was comparing sorted Arrays of nils and returning true.  Not good.&lt;/p&gt;

&lt;p&gt;Luckily, in all of our cases this ended up being more of an irritant than anything else, but I can easily imagine any number of ways in which relying on the assumed behavior of these methods could have broken our app in any number of subtle and terrible ways.&lt;/p&gt;

&lt;p&gt;So I'm only going to say this once:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't modify core Ruby functionality in your plugins or Rubygems.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You will break your users' codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you do modify core functionality you deserve to be slapped around by those around you.&lt;/strong&gt;&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Yesterday, I finally got around to upgrading HAML in our Rails app to the newest stable version and the first thing that happened was that 20 completely unrelated specs broke.&lt;/p&gt;

&lt;p&gt;Why, you may ask?&lt;/p&gt;

&lt;p&gt;A monkey got into our code, that's why.&lt;/p&gt;

&lt;p&gt;You see, Ruby allows you to redefine any method of any class on the fly (monkey patching) and it turns out that the old version of HAML had the following code in it:&lt;/p&gt;

&lt;PRE&gt;
  unless String.methods.include? 'old_comp'
  class String # :nodoc
    alias_method :old_comp, :&lt;=&gt;

    def &lt;=&gt;(other)
      if other.is_a? NilClass
        -1
      else
        old_comp(other)
      end
    end
  end

  class NilClass # :nodoc:
    include Comparable

    def &lt;=&gt;(other)
      other.nil? ? 0 : 1
    end
  end
end
&lt;/PRE&gt;

&lt;p&gt;This, in turn, snuck into our codebase in all sorts of little unexpected places.  In one instance a test was comparing sorted Arrays of nils and returning true.  Not good.&lt;/p&gt;

&lt;p&gt;Luckily, in all of our cases this ended up being more of an irritant than anything else, but I can easily imagine any number of ways in which relying on the assumed behavior of these methods could have broken our app in any number of subtle and terrible ways.&lt;/p&gt;

&lt;p&gt;So I'm only going to say this once:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't modify core Ruby functionality in your plugins or Rubygems.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You will break your users' codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you do modify core functionality you deserve to be slapped around by those around you.&lt;/strong&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=dSmVBCG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=dSmVBCG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=YqXJTOG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=YqXJTOG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/277299940" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/04/24/monkey-patching-core-classes-bad</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:e88c625f-b5c2-4a64-897a-185eef675259</id>
    <published>2008-04-21T11:03:00-07:00</published>
    <updated>2008-04-21T11:37:48-07:00</updated>
    <title type="html">Startup School, DHH, and the Missing Marketing Piece</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/274873718/startup-school-dhh-and-the-missing-marketing-piece" rel="alternate" type="text/html" />
    <category term="business" scheme="http://kurt.karmalab.org/articles/category/business" label="Business" />
    <category term="general" scheme="http://kurt.karmalab.org/articles/category/general" label="General" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <summary type="html">&lt;p&gt;If you weren't at Startup School this weekend or haven't watched DHH's speech yet, you should go &lt;a href="http://www.37signals.com/svn/posts/981-the-secret-to-making-money-online"&gt;check it out&lt;/a&gt;. It was entertaining and a good counter-point to much of the ridiculous talk that you hear out here in the Valley.&lt;/p&gt;

&lt;p&gt;As I was watching it though, I had the same thought that I always seem to have when I hear someone from 37 Signals talk, and it came to me right when I saw the slide that said:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Great Application&lt;/li&gt;
&lt;li&gt;Price&lt;/li&gt;
&lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If only it were that easy. The thing that these guys always leave out seems to be step 1.5:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Market the hell out of your product, and get a bunch of people to use it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That step is really, really hard. &lt;/p&gt;

&lt;p&gt;I bet that if you asked DHH if he thought that 37 Signals would be just as successful if he hadn't invented Rails, and without the flood of free publicity that that got them, and he answered truthfully, the answer would be  "no".&lt;/p&gt;

&lt;p&gt;There are probably all sorts of great applications out there that would help me out on a daily basis, but I have little to no time to try out most of them.  I've tried out Basecamp though, simply because while learning Rails you hear again and again about how Rails was extracted from it.&lt;/p&gt;

&lt;p&gt;Would I (or you) know anything about 37 Signals if it wasn't for Rails? Probably not.&lt;/p&gt;

&lt;p&gt;Those guys do a great job of marketing themselves and getting things out in front of people, but just because you're having fun marketing your stuff, doesn't mean that marketing isn't work that you have to do.&lt;/p&gt;

&lt;p&gt;If you think that you don't have to market your app, no matter how great it is, you're living in a world similar to the one that DHH had on one his final slides where he said:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;500 * $40 = $125,000&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's right, an imaginary world.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;If you weren't at Startup School this weekend or haven't watched DHH's speech yet, you should go &lt;a href="http://www.37signals.com/svn/posts/981-the-secret-to-making-money-online"&gt;check it out&lt;/a&gt;. It was entertaining and a good counter-point to much of the ridiculous talk that you hear out here in the Valley.&lt;/p&gt;

&lt;p&gt;As I was watching it though, I had the same thought that I always seem to have when I hear someone from 37 Signals talk, and it came to me right when I saw the slide that said:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Great Application&lt;/li&gt;
&lt;li&gt;Price&lt;/li&gt;
&lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If only it were that easy. The thing that these guys always leave out seems to be step 1.5:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Market the hell out of your product, and get a bunch of people to use it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That step is really, really hard. &lt;/p&gt;

&lt;p&gt;I bet that if you asked DHH if he thought that 37 Signals would be just as successful if he hadn't invented Rails, and without the flood of free publicity that that got them, and he answered truthfully, the answer would be  "no".&lt;/p&gt;

&lt;p&gt;There are probably all sorts of great applications out there that would help me out on a daily basis, but I have little to no time to try out most of them.  I've tried out Basecamp though, simply because while learning Rails you hear again and again about how Rails was extracted from it.&lt;/p&gt;

&lt;p&gt;Would I (or you) know anything about 37 Signals if it wasn't for Rails? Probably not.&lt;/p&gt;

&lt;p&gt;Those guys do a great job of marketing themselves and getting things out in front of people, but just because you're having fun marketing your stuff, doesn't mean that marketing isn't work that you have to do.&lt;/p&gt;

&lt;p&gt;If you think that you don't have to market your app, no matter how great it is, you're living in a world similar to the one that DHH had on one his final slides where he said:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;500 * $40 = $125,000&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's right, an imaginary world.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=misZzrG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=misZzrG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=xeTI2gG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=xeTI2gG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/274873718" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/04/21/startup-school-dhh-and-the-missing-marketing-piece</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:9cb440bf-d24d-48f9-b503-b8b68c7a8f8d</id>
    <published>2008-04-02T18:30:00-07:00</published>
    <updated>2008-04-02T18:56:58-07:00</updated>
    <title type="html">Rails is Moving to Git: Helpful Links For New Git Users</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/263027749/rails-is-moving-to-git-helpful-git-links-for-new-git-users" rel="alternate" type="text/html" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <category term="ruby" scheme="http://kurt.karmalab.org/articles/category/ruby" label="Ruby" />
    <summary type="html">&lt;p&gt;With the news today that &lt;a href="http://weblog.rubyonrails.com/2008/4/2/rails-is-moving-from-svn-to-git"&gt;Rails is moving from Subversion to Git&lt;/a&gt;, here are some helpful links for those of you that have never used Git before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://git.or.cz/"&gt;Git homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://utsl.gen.nz/talks/git-svn/intro.html"&gt;An introduction to git-svn for Subversion/SVK users and deserters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eagain.net/articles/git-for-computer-scientists/"&gt;Git for Computer Scientists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://evil.che.lu/projects/braid"&gt;Braid (A Piston clone for Git)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brian.maybeyoureinsane.net/blog/2008/01/31/git-sake-tasks"&gt;Git Sake Tasks (Rake tasks for performing git operations)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kurt.karmalab.org/articles/2008/02/18/the-power-of-git-git-stash"&gt;The Power of Git: git stash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kurt.karmalab.org/articles/2008/02/19/the-power-of-git-part-2"&gt;The Power of Git, Part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to add more in the comments and I'll update the list above as they come in.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;With the news today that &lt;a href="http://weblog.rubyonrails.com/2008/4/2/rails-is-moving-from-svn-to-git"&gt;Rails is moving from Subversion to Git&lt;/a&gt;, here are some helpful links for those of you that have never used Git before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://git.or.cz/"&gt;Git homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://utsl.gen.nz/talks/git-svn/intro.html"&gt;An introduction to git-svn for Subversion/SVK users and deserters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eagain.net/articles/git-for-computer-scientists/"&gt;Git for Computer Scientists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://evil.che.lu/projects/braid"&gt;Braid (A Piston clone for Git)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brian.maybeyoureinsane.net/blog/2008/01/31/git-sake-tasks"&gt;Git Sake Tasks (Rake tasks for performing git operations)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kurt.karmalab.org/articles/2008/02/18/the-power-of-git-git-stash"&gt;The Power of Git: git stash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kurt.karmalab.org/articles/2008/02/19/the-power-of-git-part-2"&gt;The Power of Git, Part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to add more in the comments and I'll update the list above as they come in.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=VOjXlvG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=VOjXlvG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=Nt5zkXG"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=Nt5zkXG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/263027749" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/04/02/rails-is-moving-to-git-helpful-git-links-for-new-git-users</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:d077cf86-736a-40d9-96ab-f2c362642b12</id>
    <published>2008-03-20T11:18:00-07:00</published>
    <updated>2008-03-20T11:40:56-07:00</updated>
    <title type="html">Free Up Disk Space and Make Your Machine Go Faster With A Time Machine Restore</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/255091134/free-up-disk-space-with-a-time-machine-restore" rel="alternate" type="text/html" />
    <category term="general" scheme="http://kurt.karmalab.org/articles/category/general" label="General" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <summary type="html">&lt;p&gt;The hard drive on Macbook Pro died again the yesterday, so I had it in to my friendly neighborhood Apple Store to replace it once again.&lt;/p&gt;

&lt;p&gt;Luckily, I was fully backed up through Time Machine this time, and when I got my machine back last night (note to self: always go to the flagship Apple store for repairs, they get your machine back to you &lt;em&gt;much&lt;/em&gt; faster than other Apple stores) and started it up, one of the new options during setup was "Restore from Time Machine Backup".  I chose that option, plugged in my disk, and when I woke up this morning my machine was back in exactly the same state that it was the day before.&lt;/p&gt;

&lt;p&gt;That's not all though, it appears as one of the unexpected side effects of doing this is to clear out all of the temporary and log files that have built up over the last year or so.  I went from 18 gigs of free space to over 30 gigs of free space just by going through the restore process.&lt;/p&gt;

&lt;p&gt;So now I'm thinking that I might do just do a full reinstall of OS X and restore from Time Machine a couple of times a year to repeat this process.  So far I haven't seen any downsides.  Everything that I use in a normal day seems to be working perfectly (and actually, some things are going faster, I'm assuming because whatever trail of temp files they create over time has been cleaned up).  If your machine is running slow or is low on space, doing a reinstall and a restore might be worth a try.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;The hard drive on Macbook Pro died again the yesterday, so I had it in to my friendly neighborhood Apple Store to replace it once again.&lt;/p&gt;

&lt;p&gt;Luckily, I was fully backed up through Time Machine this time, and when I got my machine back last night (note to self: always go to the flagship Apple store for repairs, they get your machine back to you &lt;em&gt;much&lt;/em&gt; faster than other Apple stores) and started it up, one of the new options during setup was "Restore from Time Machine Backup".  I chose that option, plugged in my disk, and when I woke up this morning my machine was back in exactly the same state that it was the day before.&lt;/p&gt;

&lt;p&gt;That's not all though, it appears as one of the unexpected side effects of doing this is to clear out all of the temporary and log files that have built up over the last year or so.  I went from 18 gigs of free space to over 30 gigs of free space just by going through the restore process.&lt;/p&gt;

&lt;p&gt;So now I'm thinking that I might do just do a full reinstall of OS X and restore from Time Machine a couple of times a year to repeat this process.  So far I haven't seen any downsides.  Everything that I use in a normal day seems to be working perfectly (and actually, some things are going faster, I'm assuming because whatever trail of temp files they create over time has been cleaned up).  If your machine is running slow or is low on space, doing a reinstall and a restore might be worth a try.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=2qChBDF"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=2qChBDF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=iw3dFKF"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=iw3dFKF" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/255091134" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/03/20/free-up-disk-space-with-a-time-machine-restore</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:1f3e1339-e352-4d28-97b3-4382d061938a</id>
    <published>2008-03-04T15:54:00-08:00</published>
    <updated>2008-03-04T16:26:20-08:00</updated>
    <title type="html">Running the Rspec spec task as the default task in Rails</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/245803748/running-the-rspec-spec-task-as-the-default-task-in-rails" rel="alternate" type="text/html" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <category term="ruby" scheme="http://kurt.karmalab.org/articles/category/ruby" label="Ruby" />
    <summary type="html">&lt;p&gt;Whenever I start a new Rails project, one of the first things I do is install Rspec and delete the Rails default test directory.  Even with that directory missing, however, Rails continues to waste my time by trying to run its various testing tasks.&lt;/p&gt;

&lt;p&gt;To make it stop, just add the following:&lt;/p&gt;

&lt;PRE&gt;Rake::Task[:default].prerequisites.clear
task :default =&gt; :spec&lt;/PRE&gt;

&lt;p&gt;to the bottom of the Rakefile in the root application directory. &lt;/p&gt;

&lt;p&gt;Obviously, if you want to have a default task other than spec, just change the right side of the second line to whatever task you want it to run.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Whenever I start a new Rails project, one of the first things I do is install Rspec and delete the Rails default test directory.  Even with that directory missing, however, Rails continues to waste my time by trying to run its various testing tasks.&lt;/p&gt;

&lt;p&gt;To make it stop, just add the following:&lt;/p&gt;

&lt;PRE&gt;Rake::Task[:default].prerequisites.clear
task :default =&gt; :spec&lt;/PRE&gt;

&lt;p&gt;to the bottom of the Rakefile in the root application directory. &lt;/p&gt;

&lt;p&gt;Obviously, if you want to have a default task other than spec, just change the right side of the second line to whatever task you want it to run.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=9AgbDOF"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=9AgbDOF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=McaQaJF"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=McaQaJF" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/245803748" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/03/04/running-the-rspec-spec-task-as-the-default-task-in-rails</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:a26b2bce-bd7d-4350-8fa5-5b4dabda1042</id>
    <published>2008-02-27T17:17:00-08:00</published>
    <updated>2008-02-27T17:36:03-08:00</updated>
    <title type="html">Selenium RC, Ruby, and Leopard == Pain</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/242435478/selenium-rc-ruby-and-leopard-pain" rel="alternate" type="text/html" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <category term="ruby" scheme="http://kurt.karmalab.org/articles/category/ruby" label="Ruby" />
    <summary type="html">&lt;p&gt;At &lt;a href="http://www.collaborativedrug.com"&gt;CDD&lt;/a&gt; we use Selenium RC and spec_selenium to run our acceptance tests.  Selenium is a slow way to test in general, but lately for us it's become excruciatingly painful.&lt;/p&gt;

&lt;p&gt;For some some unknown reason under Leopard, our tests would seem to randomly slow to a crawl.  Tests that usually take 4 seconds to run would suddenly be taking 170+ seconds.  &lt;/p&gt;

&lt;p&gt;Even worse, this would persist across reboots, and then suddenly go away while we were trying to diagnose the problem.&lt;/p&gt;

&lt;p&gt;It was at the point this morning where we were using DTrace to try to figure out what was going on.&lt;/p&gt;

&lt;p&gt;Luckily, it doesn't seem to have anything to do with our code, and it looks like I've solved it (or at least worked around it) for now.  &lt;/p&gt;

&lt;p&gt;Selenium RC communicates over network sockets. It appears that Ruby network communication performance under Leopard is, in a word, &lt;a href="http://www.ruby-forum.com/topic/138634"&gt;terrible&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This problem can be most easily seen when doing a 'gem update' and then waiting forever while the metadata updates.&lt;/p&gt;

&lt;p&gt;There seems to be a problem with DNS resolution somewhere in the chain that pops up intermittently.&lt;/p&gt;

&lt;p&gt;For now, our workaround is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turn off IPv6&lt;/li&gt;
&lt;li&gt;Use OpenDNS for lookups.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;as suggested by the Ruby Forum thread linked above.  That seems to fix things on all of our machines here.&lt;/p&gt;

&lt;p&gt;I would file a bug report for this, but I'm not sure if this is a Ruby thing or an OS X thing. If anyone can shed some further light on this issue it would be appreciated.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;At &lt;a href="http://www.collaborativedrug.com"&gt;CDD&lt;/a&gt; we use Selenium RC and spec_selenium to run our acceptance tests.  Selenium is a slow way to test in general, but lately for us it's become excruciatingly painful.&lt;/p&gt;

&lt;p&gt;For some some unknown reason under Leopard, our tests would seem to randomly slow to a crawl.  Tests that usually take 4 seconds to run would suddenly be taking 170+ seconds.  &lt;/p&gt;

&lt;p&gt;Even worse, this would persist across reboots, and then suddenly go away while we were trying to diagnose the problem.&lt;/p&gt;

&lt;p&gt;It was at the point this morning where we were using DTrace to try to figure out what was going on.&lt;/p&gt;

&lt;p&gt;Luckily, it doesn't seem to have anything to do with our code, and it looks like I've solved it (or at least worked around it) for now.  &lt;/p&gt;

&lt;p&gt;Selenium RC communicates over network sockets. It appears that Ruby network communication performance under Leopard is, in a word, &lt;a href="http://www.ruby-forum.com/topic/138634"&gt;terrible&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This problem can be most easily seen when doing a 'gem update' and then waiting forever while the metadata updates.&lt;/p&gt;

&lt;p&gt;There seems to be a problem with DNS resolution somewhere in the chain that pops up intermittently.&lt;/p&gt;

&lt;p&gt;For now, our workaround is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Turn off IPv6&lt;/li&gt;
&lt;li&gt;Use OpenDNS for lookups.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;as suggested by the Ruby Forum thread linked above.  That seems to fix things on all of our machines here.&lt;/p&gt;

&lt;p&gt;I would file a bug report for this, but I'm not sure if this is a Ruby thing or an OS X thing. If anyone can shed some further light on this issue it would be appreciated.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=F6zkUAE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=F6zkUAE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=E3HcHwE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=E3HcHwE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/242435478" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/02/27/selenium-rc-ruby-and-leopard-pain</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:88bf6151-93c4-4fb0-939c-f66fb2cdc2f0</id>
    <published>2008-02-26T16:00:00-08:00</published>
    <updated>2008-02-26T16:27:37-08:00</updated>
    <title type="html">I'm Running for Congress!</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/241797664/im-running-for-congress" rel="alternate" type="text/html" />
    <category term="humor" scheme="http://kurt.karmalab.org/articles/category/humor" label="Humor" />
    <category term="general" scheme="http://kurt.karmalab.org/articles/category/general" label="General" />
    <category term="ruby" scheme="http://kurt.karmalab.org/articles/category/ruby" label="Ruby" />
    <summary type="html">&lt;p&gt;I'm announcing today that I've decided to run for US Congress!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3083/2295154188_47dc9e4bf3_o.gif" alt="Congress"/&gt;&lt;/p&gt;

&lt;p&gt;No, not really, but someone else named &lt;a href="http://www.leg.state.or.us/schrader/home.htm"&gt;Kurt Schrader&lt;/a&gt; &lt;a href="http://www.oregonlive.com/clackamascounty/index.ssf/2008/02/kurt_schrader_to_run_for_congr.html"&gt;is&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This, however, is a blog about &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://www.techcrunch.com/"&gt;internet startups&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Welcome.&lt;/p&gt;

&lt;p&gt;Please read &lt;a href="http://poignantguide.net/ruby/"&gt;this book&lt;/a&gt; before continuing.&lt;/p&gt;

&lt;p&gt;And if you live in Oregon, vote for that guy.  He's got a name you can trust.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I'm announcing today that I've decided to run for US Congress!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3083/2295154188_47dc9e4bf3_o.gif" alt="Congress"/&gt;&lt;/p&gt;

&lt;p&gt;No, not really, but someone else named &lt;a href="http://www.leg.state.or.us/schrader/home.htm"&gt;Kurt Schrader&lt;/a&gt; &lt;a href="http://www.oregonlive.com/clackamascounty/index.ssf/2008/02/kurt_schrader_to_run_for_congr.html"&gt;is&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This, however, is a blog about &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://www.techcrunch.com/"&gt;internet startups&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Welcome.&lt;/p&gt;

&lt;p&gt;Please read &lt;a href="http://poignantguide.net/ruby/"&gt;this book&lt;/a&gt; before continuing.&lt;/p&gt;

&lt;p&gt;And if you live in Oregon, vote for that guy.  He's got a name you can trust.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=uDDq90E"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=uDDq90E" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=wN1YPBE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=wN1YPBE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/241797664" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/02/26/im-running-for-congress</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:e1afc743-178b-4861-a58d-3086183b6dae</id>
    <published>2008-02-19T22:57:00-08:00</published>
    <updated>2008-02-19T23:55:23-08:00</updated>
    <title type="html">The Power of Git, Part 2</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/238029683/the-power-of-git-part-2" rel="alternate" type="text/html" />
    <category term="agile" scheme="http://kurt.karmalab.org/articles/category/agile" label="Agile" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <summary type="html">&lt;p&gt;My friend Jay wrote &lt;a href="http://blog.jayfields.com/2008/02/using-patch-as-subversion-stash.html"&gt;a blog post&lt;/a&gt; today that says that you can use 'svn patch' as poor man's replacement for git-stash.  Fair enough, I've heard of places that use patch as full-on replacement for source control and integration as well. :-)&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2007/2279225750_82f8f11981_m.jpg" alt="Patch Trader"/&gt; &lt;/p&gt;

&lt;p&gt;First of all, I want to point out that we still use Subversion as our main &lt;a href="http://utsl.gen.nz/talks/git-svn/intro.html#sux"&gt;code ghetto&lt;/a&gt; at work.  &lt;/p&gt;

&lt;p&gt;Git &lt;a href="http://utsl.gen.nz/talks/git-svn/intro.html" title="An introduction to git-svn for Subversion/SVK users and deserters"&gt;fully supports&lt;/a&gt; updating from svn and pushing changes back, so even if you have to use Subversion at work, you don't have to use it on your local machine.&lt;/p&gt;

&lt;p&gt;The difference is that I have our entire history of source code commits on my machine in not even twice the space than it takes for my Subversion checkout (969M vs 578M).  I also can do fast local branching and checkins, without worrying about being connected to the network.&lt;/p&gt;

&lt;p&gt;Here's a real example of how we used git today at work that I never would have done with Subversion.  &lt;/p&gt;

&lt;p&gt;I started working on a feature yesterday on my laptop that is going to take a few days to finish.  When I got to work today I decided to pair with my coworker Krishna to continue working on it.&lt;/p&gt;

&lt;p&gt;In the pre-git world we would have had to either huddle around my laptop, check in the broken code to Subversion to check it out on our other machine, or do a patch of just the changes related to that feature and transfer it to and apply it on the pairing machine.&lt;/p&gt;

&lt;p&gt;Not today though. Today I just fired up git-daemon on my machine and did a 'git pull' of the feature branch onto the pairing machine. At the end of the day I just did a 'git push' back to my machine to get all of the changes we made today back so that I could continue working on it tonight.&lt;/p&gt;

&lt;p&gt;Even better than that though, I can &lt;em&gt;not&lt;/em&gt; continue working on it tonight. &lt;/p&gt;

&lt;p&gt;Git makes branching and merging so fast and easy that I can rewind all of the changes that I've made to the code base to support that feature, fix a showstopper bug, check that change into the subversion repo, and then merge the feature branch back on top without even worrying about it.&lt;/p&gt;

&lt;p&gt;Git is starting to change the way that I do development.  I can finally use branches the way that I've always wanted to. I can finally have several features in development at once on different branches, because it's so easy to switch and merge between them.&lt;/p&gt;

&lt;p&gt;Even if you're stuck with Subversion as your backbone, you can still grow outside of it.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;My friend Jay wrote &lt;a href="http://blog.jayfields.com/2008/02/using-patch-as-subversion-stash.html"&gt;a blog post&lt;/a&gt; today that says that you can use 'svn patch' as poor man's replacement for git-stash.  Fair enough, I've heard of places that use patch as full-on replacement for source control and integration as well. :-)&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2007/2279225750_82f8f11981_m.jpg" alt="Patch Trader"/&gt; &lt;/p&gt;

&lt;p&gt;First of all, I want to point out that we still use Subversion as our main &lt;a href="http://utsl.gen.nz/talks/git-svn/intro.html#sux"&gt;code ghetto&lt;/a&gt; at work.  &lt;/p&gt;

&lt;p&gt;Git &lt;a href="http://utsl.gen.nz/talks/git-svn/intro.html" title="An introduction to git-svn for Subversion/SVK users and deserters"&gt;fully supports&lt;/a&gt; updating from svn and pushing changes back, so even if you have to use Subversion at work, you don't have to use it on your local machine.&lt;/p&gt;

&lt;p&gt;The difference is that I have our entire history of source code commits on my machine in not even twice the space than it takes for my Subversion checkout (969M vs 578M).  I also can do fast local branching and checkins, without worrying about being connected to the network.&lt;/p&gt;

&lt;p&gt;Here's a real example of how we used git today at work that I never would have done with Subversion.  &lt;/p&gt;

&lt;p&gt;I started working on a feature yesterday on my laptop that is going to take a few days to finish.  When I got to work today I decided to pair with my coworker Krishna to continue working on it.&lt;/p&gt;

&lt;p&gt;In the pre-git world we would have had to either huddle around my laptop, check in the broken code to Subversion to check it out on our other machine, or do a patch of just the changes related to that feature and transfer it to and apply it on the pairing machine.&lt;/p&gt;

&lt;p&gt;Not today though. Today I just fired up git-daemon on my machine and did a 'git pull' of the feature branch onto the pairing machine. At the end of the day I just did a 'git push' back to my machine to get all of the changes we made today back so that I could continue working on it tonight.&lt;/p&gt;

&lt;p&gt;Even better than that though, I can &lt;em&gt;not&lt;/em&gt; continue working on it tonight. &lt;/p&gt;

&lt;p&gt;Git makes branching and merging so fast and easy that I can rewind all of the changes that I've made to the code base to support that feature, fix a showstopper bug, check that change into the subversion repo, and then merge the feature branch back on top without even worrying about it.&lt;/p&gt;

&lt;p&gt;Git is starting to change the way that I do development.  I can finally use branches the way that I've always wanted to. I can finally have several features in development at once on different branches, because it's so easy to switch and merge between them.&lt;/p&gt;

&lt;p&gt;Even if you're stuck with Subversion as your backbone, you can still grow outside of it.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=EkgoMcE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=EkgoMcE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=c3KZZJE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=c3KZZJE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/238029683" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/02/19/the-power-of-git-part-2</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:50295818-d75c-4e7a-9b97-b1018f0b74a5</id>
    <published>2008-02-18T22:47:00-08:00</published>
    <updated>2008-02-18T23:14:18-08:00</updated>
    <title type="html">The Power of Git: git-stash</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/237408313/the-power-of-git-git-stash" rel="alternate" type="text/html" />
    <category term="general" scheme="http://kurt.karmalab.org/articles/category/general" label="General" />
    <category term="agile" scheme="http://kurt.karmalab.org/articles/category/agile" label="Agile" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <summary type="html">&lt;p&gt;I converted my Subversion repository at work to a git repository recently, and today I had my first real "aha" moment.&lt;/p&gt;

&lt;p&gt;I was working on a feature this morning when I realized that some code I checked in about an hour before had broken the build. In the old Subversion world, I would have needed to keep track of what I was changing to fix the bug, and then make sure to just check that in to ensure that none of my half-finished new feature got into the trunk.&lt;/p&gt;

&lt;p&gt;Not anymore.  Today I just did a:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;git-stash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and it stashed away all of my changes in a temporary branch.  Then I fixed the build, checked in my fix out main Subversion repo (using git-svn), and did a:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;git-stash apply&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to unroll my earlier changes back on top of the now fixed code. It's not the world's biggest saving of time, but it's one less thing that I needed to think about during development, and using git I'm seeing more and more little things that are starting to add up to a big change in the way I'm doing development.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I converted my Subversion repository at work to a git repository recently, and today I had my first real "aha" moment.&lt;/p&gt;

&lt;p&gt;I was working on a feature this morning when I realized that some code I checked in about an hour before had broken the build. In the old Subversion world, I would have needed to keep track of what I was changing to fix the bug, and then make sure to just check that in to ensure that none of my half-finished new feature got into the trunk.&lt;/p&gt;

&lt;p&gt;Not anymore.  Today I just did a:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;git-stash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and it stashed away all of my changes in a temporary branch.  Then I fixed the build, checked in my fix out main Subversion repo (using git-svn), and did a:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;git-stash apply&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to unroll my earlier changes back on top of the now fixed code. It's not the world's biggest saving of time, but it's one less thing that I needed to think about during development, and using git I'm seeing more and more little things that are starting to add up to a big change in the way I'm doing development.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=h7s9ZeE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=h7s9ZeE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=3VRapzE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=3VRapzE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/237408313" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/02/18/the-power-of-git-git-stash</feedburner:origLink></entry>
  <entry>
    <author>
      <name>Kurt Schrader</name>
    </author>
    <id>urn:uuid:93eb9c75-37c8-4a9b-8f87-1ab60a294111</id>
    <published>2008-02-13T03:37:00-08:00</published>
    <updated>2008-02-13T03:58:57-08:00</updated>
    <title type="html">Cells: Bringing Components Back Into Rails</title>
    <link href="http://feeds.feedburner.com/~r/Schradeblog/~3/234319142/bringing-components-back-into-rails-with-cells" rel="alternate" type="text/html" />
    <category term="smalltalk" scheme="http://kurt.karmalab.org/articles/category/smalltalk" label="Smalltalk" />
    <category term="tech" scheme="http://kurt.karmalab.org/articles/category/tech" label="Tech" />
    <category term="ruby" scheme="http://kurt.karmalab.org/articles/category/ruby" label="Ruby" />
    <summary type="html">&lt;p&gt;Whenever I get I get tired of dealing with all of the disconnected layers of Rails, I think about how I should really write a decent component architecture that works well on top of it.  Luckily, someone has already done it for me.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cells.rubyforge.org/RailsCells_files/cells_logo.jpg" alt="Cells"/&gt;&lt;/p&gt;

&lt;p&gt;From the &lt;a href="http://cells.rubyforge.org/"&gt;Cells homepage&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Cells brings the benefits of component-oriented development to the Ruby on Rails web application platform, without the performance problems that had been associated with Rails' own, deprecated, component subsystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each Cell is like a little lightweight controller (with associated views) that you can embed anywhere in your app.  I've been playing with it tonight, and while it's not on the level of say, &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt;, it seems like a fairly good baseline for building a more component oriented system for your apps.&lt;/p&gt;

&lt;p&gt;I know from a &lt;a href="http://groups.google.com/group/ruby-component-web-frameworks/"&gt;mailing list&lt;/a&gt; that I'm on that some people are kicking around taking this and building a stateful component framework with real object binding underneath. That would really take Ruby web frameworks to the next level. (And be a ton of work to get right, I'm sure. :-) )&lt;/p&gt;

&lt;p&gt;Hopefully that project will get started soon.  I'm extremely interested in watching and helping it develop.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Whenever I get I get tired of dealing with all of the disconnected layers of Rails, I think about how I should really write a decent component architecture that works well on top of it.  Luckily, someone has already done it for me.  &lt;/p&gt;

&lt;p&gt;&lt;img src="http://cells.rubyforge.org/RailsCells_files/cells_logo.jpg" alt="Cells"/&gt;&lt;/p&gt;

&lt;p&gt;From the &lt;a href="http://cells.rubyforge.org/"&gt;Cells homepage&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;Cells brings the benefits of component-oriented development to the Ruby on Rails web application platform, without the performance problems that had been associated with Rails' own, deprecated, component subsystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each Cell is like a little lightweight controller (with associated views) that you can embed anywhere in your app.  I've been playing with it tonight, and while it's not on the level of say, &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt;, it seems like a fairly good baseline for building a more component oriented system for your apps.&lt;/p&gt;

&lt;p&gt;I know from a &lt;a href="http://groups.google.com/group/ruby-component-web-frameworks/"&gt;mailing list&lt;/a&gt; that I'm on that some people are kicking around taking this and building a stateful component framework with real object binding underneath. That would really take Ruby web frameworks to the next level. (And be a ton of work to get right, I'm sure. :-) )&lt;/p&gt;

&lt;p&gt;Hopefully that project will get started soon.  I'm extremely interested in watching and helping it develop.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=Ia1TeNE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=Ia1TeNE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Schradeblog?a=hF34tCE"&gt;&lt;img src="http://feeds.feedburner.com/~f/Schradeblog?i=hF34tCE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Schradeblog/~4/234319142" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://kurt.karmalab.org/articles/2008/02/13/bringing-components-back-into-rails-with-cells</feedburner:origLink></entry>
</feed>
