Feb 27 2007


Ignoring the Big Problem

Well, the big move to Apache/Capistrano/Mongrel went well for, um, most of my internal sites that you don't care about anyway.

But, as the intermittent 4xx and 5xx errors coming out of over the last few days indicate, things didn't go so well for the main public site. Basically this boils down to a Big Problem and a small problem:

  • Big Problem: Under even modest loads, the new stack blows up. Apache CPU usage skyrockets until we have to reset the box. There is some corner case in effect here, as both we and lots of other people are using this stack successfully in other deployments.
  • small problem: We have a lot of cruft from website moves in the past. We have old URLs from our Typo days, and old URLs from our Wordpress days, and on and on. Because these URLs do not match anything, they all pass through Apache and hit Mephisto. The small problem magnifies the load, which triggers the Big Problem very quickly.

I know how to fix the small problem--just watch the logs and add some RewriteRules. But that wouldn't be sporting, and besides, it would just make it harder for me to trigger the Big Problem. So I spent most of yesterday exploring the Big Problem. Some people would say that my explorations were unsuccessful, but I am a glass-half-full kind of guy. I now know a lot about various deployment issues that are not causing my problem.

This morning I took a different tack, and created the RewriteRules to solve the small problem. Surprise! With the small problem solved, the Big Problem doesn't happen anymore. (And even if it does, it happens rarely enough that the monit instance I installed yesterday is an acceptable workaround, plus a warning should the problem ever worsen.)

Sometimes it makes sense to ignore the Big Problem. Since I have isolated the problem so that it no longer does harm, there is no business need to solve the problem at all.

Feb 27 2007


Streamlined lives at

We are adding some sanity to our domains, hosts, and ports. Streamlined's official home is I am adding permanent redirects for old URLs.

Some of the top-level URLs are not yet redirecting correctly. I think this may be upstream of my Apache config because things look fine there. Apologies for the inconvenience until we get all the redirects in place.

Update: Fixed the link. Without that being right the post didn't have a lot going for it.

Feb 26 2007


Farewell, Codecite

During 2005 and 2006, we developed a simple Rails application called Codecite that we used to deliver presentations and training materials at our private training classes, and at the No Fluff, Just Stuff Java symposiums. As of 2007, codecite is mothballed. Our new course delivery system for 2007 uses a combination of TiddlyWiki and Prototype to present course materials and lab exercises.

If you are looking for Ruby and Rails samples, we have a more polished set of samples with the book Rails for Java Developers. The sample code is a free download.

We will be moving some of the old codecite material into the Code section of the website. If you are looking for some specific code sample that we have not updated yet, contact us and we will get it to you.

Feb 23 2007


Apache/Cap/Mongrel day at Relevance

Today I am moving 14 Rails applications in various states of very-oldness up to either (1) the dustbin or (2) the modern world of Apache/Capistrano/Mongrel. If you are reading this, the main site is back online, for the moment.

Feb 22 2007


rcov doesn't like vanilla, digs mocha

The solution to yesterday's rcov problem, it turns out, is to yank flexmock from our test suites. This is a shame, because we like the library so much. However, by removing it and replacing it with mocha/stubba, we were able to get rcov running again. Now, if I could just convince it to quit saying "60.8%"..........

Feb 21 2007


The rcov that ate Durham

We depend pretty heavily on rcov for keeping us sane in our Ruby projects. To our mild surprise and massive consternation, rcov started failing on us yesterday. Somehow or another, we're getting a Bus error thrown out of the c code. It seems to have something to do with multiple aliases of the initialize method in an AR model. It happens across platforms, and it seems that the only other people to experience it are the rspec folks, and the only solution they've found is to turn off the c-level bindings. Which is PAIIINNNFFFULLLLL.

If anybody has any solutions, please let us know, because right now, we're bummed.

Feb 21 2007


Relevance is Hiring Two Ruby Developers

Relevance, LLC is seeking Ruby developers in the Durham/Chapel Hill, NC area. We will begin with two full-time contract positions around April 1 and May 1, 2007.

The ideal candidate would have experience with several of the following items, and a passion to learn the rest:

  • Ruby
  • Object-Oriented Design
  • Domain-Specific Languages
  • Test::Unit
  • Rails
  • Streamlined
  • Subversion
  • Trac
  • FlexMock
  • Rcov
  • Mac OS X
  • TextMate

Relevance is a leading developer of enterprise Ruby and Rails applications. Relevance's partners are authors of Rails for Java Developers and Pragmatic Ajax.

Do you want to work with a small, talented team, and develop your skills with the technologies above? Please send a resume and a one-page writing sample to, subject line "Ruby position."

Feb 20 2007


Show us your gems

Mike, Chad and Bruce have all opened up their inner repositories and showed us what lies within; I thought I'd show mine too. Here's what's installed on my box:

  action_profiler (1.0.0)
  actionmailer (1.3.2, 1.3.1, 1.3.0,, 1.2.5, 1.2.3, 1.2.1, 1.2.0)
  actionpack (1.13.2, 1.13.1, 1.13.0,, 1.12.5, 1.12.3, 1.12.1, 1.12.0)
  actionwebservice (1.2.2, 1.2.1, 1.2.0,, 1.1.6, 1.1.4, 1.1.2, 1.1.0)
  activerecord (1.15.2, 1.15.1, 1.15.0,, 1.14.4, 1.14.3, 1.14.2, 1.14.0)
  activesupport (1.4.1, 1.4.0,, 1.3.1, 1.3.0)
  acts_as_ferret (0.3.1)
  aws-s3 (0.3.0, 0.0.8952)
  builder (2.0.0)
  capistrano (1.3.1, 1.2.0, 1.1.0)
  cgi_multipart_eof_fix (2.0.2)
  color-tools (1.3.0)
  creditcard (1.0)
  daemons (1.0.4, 0.4.4)
  director (0.1)
  facets (1.8.8, 1.7.46)
  fastercsv (1.2.0)
  fastthread (0.6.3, 0.6.2)
  fcgi (0.8.7,
  ferret (0.10.14)
  flexmock (0.5.0, 0.4.5, 0.4.3, 0.3.0)
  gem_plugin (0.2.2, 0.2.1)
  google-geocode (1.2.1, 1.2.0)
  gruff (0.2.8, 0.1.1)
  hoe (1.1.7)
  icalendar (0.98, 0.97, 0.96.4)
  json (0.4.3)
  Linguistics (1.0.3)
  mailfactory (1.2.3)
  markaby (0.5)
  mime-types (1.15)
  mocha (0.4.0)
  model_security_generator (0.0.9)
  mongrel (1.0.1, 1.0,,
  mongrel_cluster (0.2.1)
  mysql (2.7)
  needle (1.3.0)
  net-sftp (1.1.0)
  net-ssh (1.0.10, 1.0.8)
  payment (1.0.1)
  pdf-writer (1.1.3)
  rails (1.2.2, 1.2.1, 1.2.0,, 1.1.6, 1.1.4, 1.1.2, 1.1.0)
  rake (0.7.1)
  rc-rest (2.2.1, 2.1.0, 1.0.0)
  rcov (
  RedCloth (3.0.4, 3.0.3)
  redgreen (1.2)
  rspec (
  ruby-growl (1.0.1)
  ruby-prof (0.4.1)
  rubycas-client (0.11.0, 0.10.1)
  rubyforge (0.4.0)
  rubygems-update (0.9.2)
  rubyzip (0.9.1)
  ruport (0.8.10)
  s33r (0.5.2, 0.4.1)
  scruffy (0.2.2)
  Selenium (1.0.1)
  simple-rss (1.1)
  sources (0.0.1)
  sparklines (0.4.1, 0.2.7)
  sqlite3-ruby (1.2.0, 1.1.0)
  stomp (1.0.5, 1.0.4, 1.0.2)
  streamlined_generator (0.0.6)
  syntax (1.0.0)
  tattle (1.0.1)
  termios (0.9.4)
  test-spec (0.3.0)
  transaction-simple (1.4.0, 1.3.0)
  trestle_generator (, 1.1.2)
  tzinfo (0.3.3, 0.2.1)
  xml-simple (1.0.10)
  ZenTest (3.4.3)

That's 73 gems, for those counting at home. Special notes:

  • even though streamlined_generator is still in there, it shouldn't be because we moved to a plugin model with 0.0.7
  • the trestle generator is redundant if you have Rails 1.2
  • there's a bunch of gems in there I've rarely used more than once, but only one designed to be that way

Feb 20 2007


The Ruby Way

Summary: If you want to be a serious Ruby programmer and have already devoured the Pickaxe, you should read The Ruby Way.

When reading a programming language book, I look for two things:

  1. Big ideas: What make this language unique? What styles of programming might it enable?
  2. Little details: Any interesting language has hundreds of little idioms, tricks, and quirky corners.

When I finally cracked my copy of The Ruby Way (2nd ed.), I did not expect to find much that was new to me--big or little. After all, I have been using Ruby daily for years, and have worn out the electrons in my PDF copy of the Pickaxe. My expectations bumped up a notch when I saw this in the introduction: "[The Ruby Way] was carefully designed to be complementary to [the Pickaxe] rather than overlapping it." When Chapter 1 jumped into reflection, singletons vs. eigenclass, threequals, and method_missing, I knew I was in for a fun ride.

There is a ton of stuff in The Ruby Way that I have not seen elsewhere in book form. The sections on core classes are not afraid to visit the dimly-lit corners. For example, collection coverage includes not only inject, but also partition and how to write your own n-way partition method. This "how to write you own" theme recurs throughout the book, as Hal moves past what Ruby does into what you might coax Ruby to do.

The Ruby Way covers many things that you might not use every day, but give you a complete utility belt for when you face an unusual challenge. You'll learn about Madeleine, Rinda, ZenTest, GUI toolkits, Rcov, web toolkits (not just R**ls), RMagick, PDF::Writer, and internationalization.

There are a few nits to pick. There could be more about Rake, which is vastly more important than anyone seems to realize. The material on metaprogramming is excellent, but the idioms in a few places are "old school", e.g. append_features is used where included is more appropriate in Ruby 1.8+.

I usually take a page or two of notes when reading a book on a familiar topic. With The Ruby Way I took about fifteen pages. There is a lot of good food for thought here. Dig in.

Feb 15 2007


4000 requests per second with Mongrel

It is certainly helpful for FUDbusting when people post numbers like this.

Popular Tags