<?xml version="1.0"?>    <rss version="2.0">
    <channel>
            <title>romej dot com - the feed still burns</title>
            <link>http://www.romej.com/rss/blog</link>
            <description>The latest from romej dot com</description>
            <language>en-us</language>
            <generator>Romej RSS Engine</generator>    
                <item>
            <title> Peachtree Road Race, Determined to Finish </title>
            <link>http://www.romej.com/archives/596/peachtree-road-race-determined-to-finish</link>
            <description> 	&lt;p&gt;&lt;img src=&quot;/images/peachtree-road-race-08.jpg&quot; alt=&quot;peachtree road race 2008&quot; title=&quot;determined to finish&quot; /&gt;&lt;/p&gt;
	&lt;p&gt;On our way home from a late lunch on Peachtree, Michelle and I noticed two women helping an old man across the street.  They were moving very slowly and when the light opposite went green, they were still partly in the street.  &lt;/p&gt;
	&lt;p&gt;Fast forward about an hour; it's 7:20pm.  Michelle's cooking a July 4th meal and I'm reading a magazine at my desk.  I've been glancing out the window occasionally, and a few minutes ago I just happened to glance down to see the same two women and the man emerging from behind the parking deck by Juniper.  It suddenly became clear that they were completing the race, long after the others.&lt;/p&gt;
	&lt;p&gt;Michelle grabbed a couple Vitamin Waters from the fridge and suggested I take them down.&lt;/p&gt;
	&lt;p&gt;I rode the elevator down and approached them on Juniper, two cold bottles in hand.  At this point I could see that they all had their race numbers on, but still I asked if they were doing the course.  I think the women may have been a little tired (they must have been doing this all day), but the man seemed quite energetic.  They were also thirsty and looking for a place to get some drinks, so this was pretty awesome position to be in.&lt;/p&gt;
	&lt;p&gt;I came back upstairs and, from the balcony, could see them at the corner, sitting down and having a drink.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;update&lt;/b&gt; I guess there was &lt;a href=&quot;http://www.11alive.com/news/local/story.aspx?storyid=118165&amp;catid=39&quot;&gt;some coverage&lt;/a&gt; of this.
&lt;/p&gt;
 </description>
            <pubDate> Fri, 04 Jul 2008 16:35:05 -0700 </pubDate>
            </item>
                <item>
            <title> A complete lack of action </title>
            <link>http://www.romej.com/archives/595/a-complete-lack-of-action</link>
            <description> 	&lt;p&gt;Something must be said about the lack of updates.  We've been spending much time lately walking.  I have decided, it seems, that walking to work during the summer is &lt;i&gt;better&lt;/i&gt; than walking when the weather is nice, such as in the spring.  This doesn't make complete sense to me, profuse sweating suggests it shouldn't be done this way, and I can't say gas prices are a prime factor.  I will be healthy, maybe.&lt;/p&gt;
	&lt;p&gt;After work I do some more walking, this time with Michelle and &lt;a href=&quot;http://twitter.com/fitzwheeliam&quot;&gt;Fitzwheeeeliam&lt;/a&gt;.  We cut through the leafy neighborhood and head to Piedmont Park.  Fitz really enjoys seeing other dogs, and though this town is quite large we know many people there by now.&lt;/p&gt;
	&lt;p&gt;&lt;img src=&quot;/images/fitz-dog-park.jpg&quot; alt=&quot;fitz at the dog park in piedmont park&quot; /&gt;&lt;/p&gt;
	&lt;p&gt;If we're in the mood for something different we walk to Georgia Tech and let him off his leash.  The place, especially during the summer semester, is pretty quiet.  Students, sequestered off in the brick dorms, seldom come out.  We sometimes lay down on the sidewalk and try to see the stars.  Fitz plays with cockroaches and crickets.  He gently swipes a paw at them if they're uncooperative.  I fear one day he'll accidentally kill it, like Johnny 5 in Short Circuit, and spend minutes swiping still, not understanding.&lt;/p&gt;
	&lt;p&gt;After this walking, we relax some, watch TV or read.  Fitz stretches out and recharges just enough so that he can start &quot;playing&quot; at midnight as we're getting ready for bed.&lt;/p&gt;
	&lt;p&gt;&lt;img src=&quot;/images/fitz-chilling-bed.jpg&quot; alt=&quot;schnauzer on bed&quot; /&gt;
&lt;/p&gt;
 </description>
            <pubDate> Sat, 21 Jun 2008 17:41:07 -0700 </pubDate>
            </item>
                <item>
            <title> That must have been exciting </title>
            <link>http://www.romej.com/archives/594/that-must-have-been-exciting</link>
            <description> 	&lt;p&gt;A few years ago Michelle and I came up with a concept for a book we would call &lt;i&gt;That Must Have Been Exciting&lt;/i&gt; that would contain pictures of skid marks in very interesting places on the road.  The inspiration came from a set of marks we saw on the I-85 exit on I-75 South in Midtown.  At that exit, I-75 turns around 180 degrees and becomes I-85.  And right as you enter the turn there's a burm that curves along with the road to your left.  We noticed while slowing down to make the turn that someone had completely &lt;i&gt;not&lt;/i&gt; slowed down and ramped right off the road over the burm, apparently with their brakes applied (a little too late).  Michelle casually remarked &quot;that must have been exciting&quot; and I found it really funny.&lt;/p&gt;
	&lt;p&gt;Well tonight we took Fitz on a walk to Tech and on the way back while we were waiting to cross the street at Spring and 5th.  Some strange set of factors combined to produce one result: Fitz's leash somehow slipped from my hand and he began to move across the street, into oncoming traffic.&lt;/p&gt;
	&lt;p&gt;Michelle lunged after him and tried to get him to stop, but he got scared of us yelling and pressed on as a car sped past.  Pretty soon Michelle was following full speed behind him, yelling.  I was following her waving my hands at the oncoming cars to make sure they could see us.&lt;/p&gt;
	&lt;p&gt;We made it to the other side but Fitz was a little scared and started making his way back toward the road.  Some girls that were heading out to party helped us get him and then asked us where 14th St was.  We quickly settled into giving directions, as if what had just happened was a perfectly normal occurrence.&lt;/p&gt;
	&lt;p&gt;&lt;i&gt;Thank you for helping us catch him, and for pretending that we are normal.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;We just want to party.  Tell us where we need to go&lt;/i&gt;&lt;/p&gt;
	&lt;p&gt;That must have been exciting.
&lt;/p&gt;
 </description>
            <pubDate> Fri, 30 May 2008 20:20:57 -0700 </pubDate>
            </item>
                <item>
            <title> Assurance Hosting out of business and lost domains </title>
            <link>http://www.romej.com/archives/593/assurance-hosting-out-of-business-and-lost-domains</link>
            <description> 	&lt;p&gt;Back in 2002 (and again over the years) I've registered domains through Assurance Hosting.  One of my domains was up for renewal so I went to their site only to see a landing page.  It appears they've gone out of business and any attempts to contact them have failed.&lt;/p&gt;
	&lt;p&gt;If you're going through this and think you're about to lose your domain, here's what  you can do:  Assurance Hosting was an &lt;a href=&quot;http://www.enom.com/&quot;&gt;eNom reseller&lt;/a&gt;, so you can contact eNom and they'll work to unlock your domain so that you can transfer it elsewhere (during the process, which has been going very quickly for me, you'll need to verify your identity and proof of domain ownership).
&lt;/p&gt;
 </description>
            <pubDate> Sat, 24 May 2008 17:42:06 -0700 </pubDate>
            </item>
                <item>
            <title> Pain threshold </title>
            <link>http://www.romej.com/archives/592/pain-threshold</link>
            <description> 	&lt;p&gt;Michelle was reading a book called &lt;a href=&quot;http://amazon.com/exec/obidos/ASIN/0805063196/romej-20&quot;&gt;Complications&lt;/a&gt; that mentions an experiment to test your pain threshold.  It involves filling a bowl with room temperature water and another with ice water.  You put your hand into the room temperature water for 20 seconds and then shift it to the ice water.  With a stopwatch (preferably someone else is timing it) you report when you first feel some pain.  This is  your threshold.  Then you keep your hand in as long as you can stand, up to two minutes.   Across people, the pain threshold is pretty similar, but the time it takes before you simply can't stand it anymore varies widely.&lt;/p&gt;
	&lt;p&gt;The experiment (and some others) is mentioned in &lt;a href=&quot;http://outside.away.com/outside/culture/200708/out-of-bounds-pain-1.html&quot;&gt;this Outside article&lt;/a&gt;.  There's also a lot of information at &lt;a href=&quot;http://painlab.stanford.edu/&quot;&gt;Stanford's Pain Lab&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;In our trial tonight I lasted the full 2 minutes but felt pain at around 6-9 seconds.  The amount of discomfort was surprising actually.  My wrist felt like it was kinking up.  Michelle went to 24 seconds, but after her bridge work she still has some residual pain that probably affected her &quot;score&quot;.  The average, according to the Outside article, is about 20 seconds.&lt;/p&gt;
 </description>
            <pubDate> Mon, 19 May 2008 21:17:15 -0700 </pubDate>
            </item>
                <item>
            <title> Hide and seek with Fitzwheeliam </title>
            <link>http://www.romej.com/archives/591/hide-and-seek-with-fitzwheeliam</link>
            <description> 	&lt;p&gt;One thing we enjoy doing with our dogs (first &lt;a href=&quot;http://www.romej.com/archives/539/goodbye-buzzle&quot;&gt;Buzzle&lt;/a&gt;, and now &lt;a href=&quot;http://twitter.com/fitzwheeliam&quot;&gt;Fitz&lt;/a&gt;) is playing hide-and-seek.  They're quite good at this despite what you might first think. &lt;/p&gt;
	&lt;p&gt;Last night we took Fitz to Tech for a walk.  He loves running ahead, far enough so that it's fun for him but not too far to turn and run quickly toward us should we bolt.  He lives with a constant suspicion, something our games do nothing to allay.&lt;/p&gt;
	&lt;p&gt;We were near Skiles when an opportunity to hide presented itself.  Fitz continued confidently towards the Library and we jumped up on one of the benches along the walkway and then jumped up onto the grass behind the bench.  Fitz came running back and saw us up there, apparently out of range.  He immediately took off the way he had originally been going.  We heard a lot of rustling in the bushes and he tried to press through and cut us off from another direction.&lt;/p&gt;
	&lt;p&gt;&lt;i&gt;Fitz, that's not the way.  The bushes, they are too dense.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;I know, father, I sense this now.  I have failed.&lt;/i&gt;&lt;/p&gt;
	&lt;p&gt;He came screaming around the corner again and this time jumped up on the bench and then up onto the grassy area where we were, panting with pride.&lt;/p&gt;
	&lt;p&gt;&lt;i&gt;I have succeeded in this game.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;You are still a failure, you went the long way and tried to run through holly bush&lt;/i&gt;&lt;/p&gt;
	&lt;p&gt;This is the sort of thing we do.
&lt;/p&gt;
 </description>
            <pubDate> Sun, 18 May 2008 07:48:47 -0700 </pubDate>
            </item>
                <item>
            <title> Programming Collective Intelligence with Ruby </title>
            <link>http://www.romej.com/archives/590/programming-collective-intelligence-with-ruby</link>
            <description> 	&lt;p&gt;&lt;img src=&quot;/images/collective-intelligence-cover.jpg&quot; alt=&quot;cover&quot; title=&quot;Programming Collective Intelligence&quot; /&gt;&lt;br /&gt;
There's a lot of data out there, and &lt;a href=&quot;http://www.youtube.com/watch?v=nU8DcBF-qo4&quot;&gt;paying attention to it&lt;/a&gt; in order to make decisions is a good idea.  But where do you begin?&lt;/p&gt;
	&lt;p&gt;I began by browsing through some of the preview chapters (don't think they're up anymore) of &lt;a href=&quot;http://www.cs.colorado.edu/~martin/slp2.html&quot;&gt;Speech and Language Processing&lt;/a&gt;.  I didn't get far.  I also found some of &lt;a href=&quot;http://www.amazon.com/review/R3GSYXSKRU8V17/ref=cm_cr_rdp_perm&quot;&gt;Norvig's reviews on Amazon&lt;/a&gt;, one which pertained to &lt;a href=&quot;http://romej.com/amazon/0262133601&quot;&gt;this gem&lt;/a&gt; (the sell: &lt;i&gt;&quot;But if someone told me I had to make a million bucks in one year, and I could only refer to one book to do it, I'd grab a copy of this book and start a web text-processing company.&quot;&lt;/i&gt;).  After previewing it online, I knew that sans a whip at my back, it wouldn't help me get any better.&lt;/p&gt;
	&lt;p&gt;What I really wanted was something that was &lt;a href=&quot;http://www.acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=143&quot;&gt;written like this&lt;/a&gt;, but with some examples.&lt;/p&gt;
	&lt;p&gt;I ordered a copy of Toby Segaran's &lt;a href=&quot;http://romej.com/amazon/0596529325&quot;&gt;Programming Collective Intelligence&lt;/a&gt; after browsing the table of contents and reading some reviews. In 330 pages, the author covers building a link recommendation engine, building a search engine, stochastic optimization (&lt;a href=&quot;http://code.google.com/p/hybrid-3dap-solver/&quot;&gt;wheeee&lt;/a&gt;), spam filters,  and genetic programming (list not exhaustive).  &lt;/p&gt;
	&lt;p&gt;What makes the above fun is that in each case you're working with data from sites you're probably very familiar with already (del.icio.us, kayak, ebay, facebook).&lt;/p&gt;
	&lt;p&gt;Still, much of the book &lt;i&gt;is code&lt;/i&gt;, so to get the most out of it, you should really &lt;i&gt;try&lt;/i&gt; the examples.  You can, of course, download the source code to the book.  The examples are written in Python, which concise and readable.&lt;/p&gt;
	&lt;p&gt;I decided to comprehend the book by writing the examples in Ruby as I went along.  While I've flipped through a few of the chapters already, I've only actually &lt;i&gt;worked&lt;/i&gt; through Chapter 2 (Chapter 1 is intro stuff).  &lt;/p&gt;
	&lt;p&gt;It took me an embarrassing amount of time to work through Chapter 2, which surprised me.  Ruby and Python are similar syntactically, but a few weird bugs in my translation tied me up.&lt;/p&gt;
	&lt;p&gt;One thing Segaran makes much use of is Python's &lt;a href=&quot;http://en.wikipedia.org/wiki/List_comprehension&quot;&gt;list comprehensions&lt;/a&gt;, which I &lt;a href=&quot;http://www.romej.com/archives/574/interviewing-at-google-part-iii&quot;&gt;once attempted&lt;/a&gt; to dazzle (nay distract!) my Google interviewers with, to no avail.&lt;/p&gt;
	&lt;p&gt;Not having list comprehensions in Ruby made things a little rough, but there are good methods in &lt;a href=&quot;http://www.ruby-doc.org/core/classes/Enumerable.html&quot;&gt;Enumerable&lt;/a&gt; that come to the rescue.&lt;/p&gt;
	&lt;p&gt;I also didn't have the pydelicious library for writing the del.icio.us recommendation engine.  It wasn't very hard to implement the necessary functions though.  I didn't spend any time looking for a Ruby version, if there is one.&lt;/p&gt;
	&lt;p&gt;The link to the MovieLens dataset didn't work; it seems to have &lt;a href=&quot;http://www.grouplens.org/node/73&quot;&gt;moved&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;I also had some trouble with passing a function as a parameter.  I know there are blocks, procs, and beats, but the solution wasn't apparent.  I settled on passing a symbol and just picking the right scoring method based on its value.&lt;/p&gt;
	&lt;p&gt;Interested brethren, you can grab the &lt;a href=&quot;http://romej.com/downloads/collective/recommendations.rb&quot;&gt;Ruby code for Chapter 2&lt;/a&gt; &lt;-- there.
&lt;/p&gt;
 </description>
            <pubDate> Sun, 04 May 2008 09:09:44 -0700 </pubDate>
            </item>
                <item>
            <title> Practical comparison of Rails 2.0.2 with Rails 1.2.6  </title>
            <link>http://www.romej.com/archives/589/practical-comparison-of-rails-202-with-rails-126-</link>
            <description> 	&lt;p&gt;After testing at home and resolving various warnings, I finally upgraded &lt;a href=&quot;http://rankforest.com&quot;&gt;Rankforest&lt;/a&gt; to Rails 2.0.2.  Rankforest allows authors and publishers to keep track of the sales rank of their books.  The site has about 2,000 users, and many keep up to date with rankings through RSS feeds or by exporting rankings every couple of days.&lt;/p&gt;
	&lt;p&gt;I was interested to see how the latest version of Rails would perform, especially after reading the posts &lt;a href=&quot;http://weblog.rubyonrails.org/2008/3/18/comparing-rails-2-0-to-1-2-for-speed&quot;&gt;mentioned here&lt;/a&gt;.&lt;/p&gt;
	&lt;p&gt;I allowed the site to run for a good full week before running &lt;a href=&quot;http://rubyforge.org/frs/?group_id=2517&amp;release_id=15246&quot;&gt;rawk&lt;/a&gt; on them.  I already had many megabytes of logs from the site running on Rails 1.2.6.&lt;/p&gt;
	&lt;p&gt;Here's a slim rundown, focusing on the average time required to complete a request.&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;The detail view&lt;/b&gt; - This view is the dashboard for a given item.  It contains a product image, a chart showing sales ranks, and some running averages.  Each log contained 1500-3000 sample requests.&lt;br /&gt;
Before: 0.45s&lt;br /&gt;
After: 0.42s&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Hourly RSS feed&lt;/b&gt; - The hourly RSS feed gives authors a sales rank update every hour.  I also had a couple thousand requests for this page in each log.&lt;br /&gt;
Before: 0.07s&lt;br /&gt;
After: 0.04s&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Daily RSS feed&lt;/b&gt; - The daily RSS feed has a sales rank for the past 10 days.&lt;br /&gt;
Before: 0.40s&lt;br /&gt;
After: 0.30s&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Cached charts&lt;/b&gt; - This is how long it takes to render a cached sales rank chart.&lt;br /&gt;
Before: 0.71s&lt;br /&gt;
After: 0.50s&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Items listing&lt;/b&gt; - This view shows all of the items Rankforest is tracking and allows the user to paginate through them.  I only had a few hundred requests for this.  I think the difference must be due to updating the &lt;a href=&quot;http://cardboardrocket.com/pages/paginating_find&quot;&gt;plugin&lt;/a&gt; I use for pagination.  Prior to seeing these results I debated moving to will_paginate, but this is fine for now.&lt;br /&gt;
Before: 1.40s&lt;br /&gt;
After: 0.18s&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;Item compare&lt;/b&gt; - This is a view that allows a user to compare their book to similar items on Amazon.com.  I had a couple hundred requests in each log.&lt;br /&gt;
Before: 0.11s&lt;br /&gt;
After: 0.15s&lt;/p&gt;
	&lt;p&gt;&lt;b&gt;The collection view&lt;/b&gt; - Logged in users can view all of their books and sort them using various criteria.&lt;br /&gt;
Before: 0.05s&lt;br /&gt;
After: 0.09s&lt;/p&gt;
	&lt;p&gt;The last two areas of the site showed tiny slowdowns for some reason, but the gains in the more heavily-trafficked portions of the site outweigh the decrease.&lt;/p&gt;
	&lt;p&gt;The top line of the rawk script output shows the average for &lt;i&gt;all requests&lt;/i&gt;.  Here's how that worked out (86K requests under Rails 2.0.2 and 58K under 1.2.6).&lt;br /&gt;
Before: 0.17s&lt;br /&gt;
After: 0.07s&lt;/p&gt;
	&lt;p&gt;In terms of requests/second, that's going from 352req/sec to 857req/sec, which sounds substantial.  In addition to updating the pagination plugin, I think a lot of the performance gain stems from the move from &lt;a href=&quot;http://railsexpress.de/blog/articles/2005/12/19/roll-your-own-sql-session-store&quot;&gt;SqlSessionStore&lt;/a&gt; to the new cookie-based sessions.&lt;/p&gt;
	&lt;p&gt;The migration was mostly painless.  I didn't have to change much code, the VPS hasn't changed, and now Rankforest can serve up even more information than before.  &lt;/p&gt;
 </description>
            <pubDate> Sat, 26 Apr 2008 13:33:06 -0700 </pubDate>
            </item>
                <item>
            <title> Accessing the scope of the calling object in a block </title>
            <link>http://www.romej.com/archives/588/accessing-the-scope-of-the-calling-object-in-a-block</link>
            <description> 	&lt;p&gt;There's an interesting question over &lt;a href=&quot;http://blog.subwindow.com/articles/15&quot;&gt;at subWindow&lt;/a&gt; about accessing the scope of the calling object in a block.&lt;/p&gt;
	&lt;p&gt;If access to local variables is desired, you can yield a Binding object from within the method.  Just doing this would require writing things like &lt;i&gt;eval &quot;baz&quot;, context&lt;/i&gt;, where &lt;i&gt;context&lt;/i&gt; is the Binding object returned from a call to &lt;i&gt;binding&lt;/i&gt;. I used method_missing on Binding to make things a little more readable in the calling code.  &lt;/p&gt;
	&lt;p&gt;To get at instance variables, it seems &lt;i&gt;instance_variable_get&lt;/i&gt; is the way to go.  Internally, it calls &lt;i&gt;instance_eval&lt;/i&gt; on the string that's passed in, which is very similar to what's happening below.&lt;/p&gt;
	&lt;pre&gt;
class BindingTest
  attr_accessor :accessible_baz
  def bar
    baz = \&quot;qux\&quot;
    foonum = 23
    @instance_baz = \&quot;instance_baz\&quot;
    @accessible_baz = \&quot;accessible_baz\&quot;
    yield(binding)
  end
end
	
# Extends the binding object
class Binding
  def method_missing( method, *args )
    eval method.to_s, self
  end
end
	
binder = BindingTest.new
	
puts binder.bar { |context| context.foonum.to_s }
puts binder.bar { |context| context.baz }
puts binder.bar { |context| context.accessible_baz }
#the following line fails; only locals work
#puts binder.bar { |context| puts context.instance_baz }
	
puts binder.instance_variables
&lt;/pre&gt;
	&lt;p&gt;You could also use &lt;i&gt;instance_variables&lt;/i&gt; and &lt;i&gt;local_variables&lt;/i&gt; to return lists of those respective variables and evaluate them against the binding.&lt;/p&gt;
	&lt;p&gt;I haven't actually needed anything like this (and I'm sure it's open to abuse), but it's an interesting question that provides an opportunity to explore some of Ruby's reflection facilities.
&lt;/p&gt;
 </description>
            <pubDate> Wed, 23 Apr 2008 20:01:02 -0700 </pubDate>
            </item>
                <item>
            <title> Slow gem updates </title>
            <link>http://www.romej.com/archives/587/slow-gem-updates</link>
            <description> 	&lt;p&gt;I was experiencing extremely slow gem updates on my Slicehost VPS.  gem would max out the memory usage and sit there, doing a bulk update on the index but never actually updating.&lt;/p&gt;
	&lt;p&gt;After a few attempts at a server software upgrade, I found success with the following commands.&lt;/p&gt;
	&lt;p&gt;&lt;code&gt;&lt;br /&gt;
gem1.8 update --system --source &lt;a href=&quot;http://segment7.net&quot;&gt;http://segment7.net&lt;/a&gt;/&lt;br /&gt;
gem1.8 update --no-rdoc --no-ri&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
	&lt;p&gt;I don't think the first command really helped, but I mention it because I did run it tonight.  The second command issues the update, but without downloading the rubygems docs, etc.  This sped things up, though the whole process still took about 30 minutes.
&lt;/p&gt;
 </description>
            <pubDate> Mon, 21 Apr 2008 23:23:40 -0700 </pubDate>
            </item>
        </channel>
    </rss>

