<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0ENQXYyeyp7ImA9WxFUFkQ.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157</id><updated>2010-06-27T20:28:10.893-07:00</updated><title>Tim, the Enchanter</title><subtitle type="html">What manner of man are you that can summon up code without C# or Java?</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://tim.theenchanter.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TimTheEnchanter" /><feedburner:info uri="timtheenchanter" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0ENQXc6eSp7ImA9WxFUFkQ.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-2797948720810887216</id><published>2010-06-27T20:22:00.001-07:00</published><updated>2010-06-27T20:28:10.911-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-27T20:28:10.911-07:00</app:edited><title>A Series of Impossible Events</title><content type="html">&lt;p&gt;So, Saturday we hiked to Stewart Falls w/the kiddos.   Ok, Mikkie rode on my shoulders most of the way, and walked maybe 1/20th of the time (I had to teach her several times that my eyeballs were not a good place for her to cling to for support&amp;#8230; nor my mouth, my throat, my ears&amp;#8230;. where&amp;#8217;s a baby girl to hold on to?).&lt;/p&gt;


 &lt;p&gt;Anyways&amp;#8230; the strangest of coincidences.   Of the 20 odd people we must&amp;#8217;ve passed on the trail that Saturday Evening, one face struck a vein of familiarity, and the name &amp;#8220;Gwen&amp;#8221; came to mind. Risking an awkward moment of &amp;#8220;oh, I&amp;#8217;m sorry, I mistook you for someone I knew&amp;#8221;, I turned around and said her name aloud, waiting to see if she would respond. To my surprise, she stopped, turned around, and not only did it turn out to be her, she was there with both Brandon, and Jill (two other very prominent people in my childhood whom I hadn&amp;#8217;t seen nor talked to for at least 5 years)!   We talked for a bit, had a brief round of catching up, and both commented on the impossible odds that were beaten for us to both be on that trail, crossing at the same time, on that day.   And how funny it is was that I, Jill and Brandon passed us by without noticing (Jill and I were best of friends between the ages of 2 and 10, a friendship that unfortunately dwindled to the status of &amp;#8220;acquaintances&amp;#8221; when I moved to another neighborhood).&lt;/p&gt;


 &lt;p&gt;This isn&amp;#8217;t all: earlier that day I was helping my friend Ronny move into his new house. I became acquainted with another fellow helper, whose first name I&amp;#8217;d only asked: Jake. After some good conversation, the subject of where we lived came up, to which he said South Jordan, and I said Saratoga Springs. He said &amp;#8220;Saratoga Springs, I have a brother who lives in Saratoga Springs&amp;#8221;. &amp;#8220;Oh really?&amp;#8221; I asked, &amp;#8220;which part&amp;#8221;.   He couldn&amp;#8217;t remember the name, so I asked how far out. &amp;#8220;Way out there&amp;#8230; like passed Jacob&amp;#8217;s Ranch&amp;#8221; he replied (my memory faintly recalls the word &amp;#8220;boonies&amp;#8221; used to describe the distance).   I started naming the neighborhoods as I could remember them (Saratoga Springs is organized like that), and when I named ours, he said &amp;#8220;yeah, that&amp;#8217;s it.&amp;#8221; I felt certain that it must be someone I knew, so I asked what his brothers name was, and it turned out to be my next door neighbor!   And to comment on how further these seemingly impossible odds were aligned, in that very moment, after we made this connection, Mark called his brother Jake on his cell phone.   Wanting to capitalize on this moment, I asked Jake if he&amp;#8217;d let me answer it.   He agreed, and Mark was pretty confused as to why his neighbor was answering his brother&amp;#8217;s phone.   It turns out that Ronny&amp;#8217;s wife&amp;#8217;s family and my neighbor Mark&amp;#8217;s family were friends while growing up in California.&lt;/p&gt;


 &lt;p&gt;I&amp;#8217;m still somewhat amazed at how all of that came together yesterday, and not just one coincidence, but two, occurred.   I wonder how often we pass down the same road as a childhood friend, or pass each-other in a crowded mall, without giving notice to the occasion.&lt;/p&gt;


 &lt;p&gt;This isn&amp;#8217;t particularly edifying in anyway, but I suppose it could serve to remind one to toss a spark to kindle an old friendship, and take a moment to notice and admire the little things.&lt;/p&gt;


 &lt;p&gt;Anyways&amp;#8230;. as you were.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-2797948720810887216?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/2797948720810887216/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=2797948720810887216" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2797948720810887216?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2797948720810887216?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/GEK3XAfRVqY/series-of-impossible-events.html" title="A Series of Impossible Events" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>0</thr:total><feedburner:origLink>http://tim.theenchanter.com/2010/06/series-of-impossible-events.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQERX0zeyp7ImA9WxFXEUQ.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-5287783767422368260</id><published>2010-05-18T00:12:00.000-07:00</published><updated>2010-05-18T08:41:44.383-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-18T08:41:44.383-07:00</app:edited><title>Hyper Inflation in the USA?</title><content type="html">&lt;p&gt;
I found this documentary on our economy informative: &lt;a href="http://www.youtube.com/watch?v=eb1n1X0Oqdw"&gt;http://www.youtube.com/watch?v=eb1n1X0Oqdw&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I wouldn't ignore that there could be some sensationalism in the film to try and sell gold, but in spite of that I think the material in it is solid. Essentially, it's stating our economy hasn't recovered from the recession, any sign indicating that we have recovered is actually just inflation occurring, and our country can either make some radical changes now to cut spending and prevent the economic collapse and hyper inflation, or be forced to make some radical changes after our economy collapses.
&lt;/p&gt;

&lt;p&gt;
I'd encourage everyone to watch at least the first 10 minutes and evaluate whether or not you wish to invest a full 55 minutes of your life to watching the whole thing.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-5287783767422368260?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/5287783767422368260/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=5287783767422368260" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5287783767422368260?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5287783767422368260?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/vOWUDdGPqEY/hyper-inflation-in-usa.html" title="Hyper Inflation in the USA?" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>2</thr:total><feedburner:origLink>http://tim.theenchanter.com/2010/05/hyper-inflation-in-usa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFSXY8cCp7ImA9WxFQF0o.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-6459603480664286972</id><published>2010-05-12T19:32:00.000-07:00</published><updated>2010-05-13T11:31:58.878-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-13T11:31:58.878-07:00</app:edited><title>Whose Line Is It, Anyways?</title><content type="html">&lt;p&gt;Funny story: we decided to install a fence recently. A few days ago, I get a call from Mark (the guy installing the fence) saying that while he was digging fence-posts, he went straight through my neighbors sprinkler line which ran nice and snug along the property line. We comment about what a bad idea it is to install a sprinkler line there, and I call my neighbor to inform him of the misfortune and begin working towards a solution. He tells me there's no way his sprinkler line is on the property line, we assert that the line is indeed on the property line, have checked with the city, and have measured and verified that the property line is indeed where the markers say it is.&lt;/p&gt;

&lt;p&gt;Since I felt it was his fault for having the line so close to the property line, part of me didn't feel I was obligated to do anything to help fix it. However, wanting to keep good feelings between neighbors, and since it was in fact my idea to install the fence, I agreed to buy the material to fix the lines if he'll agree to help me do the work. Saturday comes, I bought the pipe and fittings, and my neighbor and I are digging up the grass to fix the line. Once again, I note how obviously close his sprinkler line is on the property line, and even in one spot it clearly comes into my yard an inch! Then, a thought comes to my mind: "what if it's really my sprinkler line? That would be kind of funny, wouldn't it?" I joke about this out loud. Then we look at each-other, and the joke quickly turns into a prime suspect (one that neither of us had thought of until this point). The city irrigation water was now turned on, so I run and flip on my irrigation valve and cycle through my sprinklers. Hilarity ensues as water sprays everywhere, clearly verifying that my neighbor was in fact right: his sprinkler line WASN'T close to the property line at all, but mine was!!!&lt;/p&gt;

&lt;p&gt;I told my neighbor he could go home, that this was my responsibility and I needed to fix it. However, he was really cool, stayed and helped anyways, saying "I don't care whose fault it is, just that it gets fixed". That was awesome of him and made me feel grateful to have such a good neighbor. More so, I'm extremely grateful that we were able to laugh about it instead of me feeling like a complete idiot (as opposed to just a partial idiot).&lt;/p&gt;

&lt;p&gt;A couple of things in retrospect:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;    When discussing what to do to fix the line, I was really glad I put into practice a few principles I'd learned from the fantastic book on negotiating "Getting to Yes". Had I engaged in positional bargaining (this is your fault so you fix it!) instead of principled negotiation (do you agree that it's fair if...), I would have felt like a lot bigger idiot in the end. Being slow to jump to positions saved a lot of face and made what could have been a big drama, a funny story instead. (trying to avoid "tooting my own horn" here while lending witness to the superiority of principled negotiation over positional bargaining, and the effectiveness of the mentioned book in teaching the subject)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If you must err (which, being human, we will), err on the side of mercy. I'm grateful to still have a good relationship with my neighbor, and even if it really was his line, how much is amicability between neighbors worth? I'm not advocating that we be soft negotiators and dart straight to any agreement that's unfair to us, there's a line there, somewhere :)
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;What's the worst neighborly dispute you've had with a neighbor?  How did you resolve it?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-6459603480664286972?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/6459603480664286972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=6459603480664286972" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/6459603480664286972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/6459603480664286972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/s_UxS6fTXWM/whose-line-is-it-anyways.html" title="Whose Line Is It, Anyways?" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>0</thr:total><feedburner:origLink>http://tim.theenchanter.com/2010/05/whose-line-is-it-anyways.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUER3w4eip7ImA9WxBVEko.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-5609930486807056328</id><published>2010-02-06T11:36:00.000-08:00</published><updated>2010-02-15T14:50:06.232-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-15T14:50:06.232-08:00</app:edited><title>Emacs baggage</title><content type="html">&lt;p&gt;In a prior post, I articulated why I liked Emacs. There are plenty of reasons, certainly! This week, however, I rethought of my decision to switch completely over to Emacs. It has a lot of baggage holding it into the past, and I get the feeling it needs to be reborn (an Emacs rewrite in clojure would be awesome). Leaving Emacs and returning back to my TextMate editing environment has turned out to be a relatively good experience: even though I miss a few features, I don't miss the fiddling. &lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;I really did give Emacs a fair shake. I wrote a campfire mode (a chat client for 37 signals campfire right within Emacs), contributed several improvements to a few scripts, submitted a variety of scripts to the ELPA, and otherwise invested a plethora of hours into learning it.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;At first, the cool features that Emacs has kept me going. It was a lot of investment, and I found myself thinking "it will get easier, the overhead will go away". After two months, it still hasn't.  Emacs is full of 80% complete features, so lots of things bugged me, constantly requiring my attention to fix. When you fiddle with Emacs, some issues don't manifest themselves until the next time you try to start it. Therefore, every time I started up Emacs, something would fail somewhere. In the end, this was throwing gravel into the engine of my productivity.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Another thing I noticed: my wrists seemed to have more problems when I was using Emacs. For whatever reason, TextMate seems to be easier on my wrists. TextMate might require more keystrokes then Emacs to perform certain editing tasks, but the movements aren't as awkward.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;There is no question that Emacs is more extensible than TextMate or vim. But, in the end, even after several months of usage, I still found myself more productive using simpler editors that just worked well out of the box.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;I will probably continue to use Emacs in some form or another, probably for LaTeX and Clojure. For really quick editing jobs, I still prefer vim, because it is really powerful and starts up fast. But, as far as Ruby on Rails development goes, I'm not sure it gets any better than TextMate.&lt;/p&gt;

&lt;a title="View EmacsBaggage on Scribd" href="http://www.scribd.com/doc/26485105/EmacsBaggage" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;EmacsBaggage&lt;/a&gt; &lt;object id="doc_251845017454112" name="doc_251845017454112" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="FlashVars" value="document_id=26485105&amp;access_key=key-80aiq3gl0bdmbula0jy&amp;page=1&amp;viewMode=list"&gt;  &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-5609930486807056328?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/5609930486807056328/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=5609930486807056328" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5609930486807056328?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5609930486807056328?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/IA177bcNBxU/emacs-baggage.html" title="Emacs baggage" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>4</thr:total><feedburner:origLink>http://tim.theenchanter.com/2010/02/emacs-baggage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGQXoycCp7ImA9WxBVFE8.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-7228932803134256762</id><published>2010-01-30T14:19:00.000-08:00</published><updated>2010-02-17T08:47:00.498-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T08:47:00.498-08:00</app:edited><title>Getting ruby to use readline instead of libedit</title><content type="html">I prefer readline for a variety of reasons:
&lt;ul&gt;&lt;li&gt;I'm used to it, it's the same command editor that powers bash
&lt;/li&gt;&lt;li&gt;It's very powerful.&lt;/li&gt;&lt;li&gt;In Ruby, it doesn't block other threads from running while waiting for input.&lt;/li&gt;&lt;/ul&gt;When I installed ruby 1-9 using rvm, it got compiled against libedit.  I didn't feel like reinstalling, so I followed &lt;a href="http://www.jorgebernal.info/development/fixing-snow-leopard-ruby-readline"&gt;these instructions over here&lt;/a&gt;.

&lt;p&gt;I'd thought that `&lt;code&gt;port install readline&lt;/code&gt;` would suffice, but it didn't.  I had to install &lt;code&gt;readline-6.0&lt;/code&gt; from source.  Ruby doesn't compile against &lt;code&gt;readline-5.0&lt;/code&gt;, it just spits out a load of errors. The following is what I did, if you would like to follow along:&lt;/p&gt;

Install readline: (copied from &lt;a href="http://www.jorgebernal.info/development/fixing-snow-leopard-ruby-readline"&gt;here&lt;/a&gt;)
&lt;pre&gt;curl -O ftp://ftp.cwru.edu/pub/bash/readline-6.0.tar.gz
tar xvf readline-6.0.tar.gz
cd readline-6.0
./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; sudo make install

&lt;/pre&gt;Then, go into the src folder where rvm built your ruby.  Mine was &lt;code&gt;~/.rvm/src/ruby-1.9.1-p378/ext/readline&lt;/code&gt;.

&lt;pre&gt;
cd ~/.rvm/src/ruby-1.9.1-p378/ext/readline # &amp;lt;- your path will vary
ruby extconf.rb
&lt;/pre&gt;

Make sure you see this line in the output:

&lt;pre&gt;
checking for readline/readline.h... yes
&lt;/pre&gt;

If it says no, it didn't find your readline.  You might have luck trying to set the &lt;code&gt;C_INCLUDE_PATH=/usr/local/include&lt;/code&gt;

Then, build it:

&lt;pre&gt;
make
&lt;/pre&gt;

When it finishes, run &lt;code&gt;otool -l readline.bundle&lt;/code&gt;.  You should see this:

&lt;pre&gt;
       name /usr/local/lib/libreadline.6.0.dylib (offset 24)
 time stamp 2 Wed Dec 31 17:00:02 1969
    current version 6.0.0
compatibility version 6.0.0
&lt;/pre&gt;

If you see &lt;code&gt;libedit&lt;/code&gt; anywhere in that output, it didn't link against &lt;code&gt;libreadline&lt;/code&gt;.  Failure.

Now, if it's all successful, install the new readline.bundle.

&lt;pre&gt;
  mv readline.bundle ../../../../rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/i386-darwin9.8.0/readline.bundle
&lt;/pre&gt;

&lt;p&gt;
(as usual, your path will vary)
&lt;/p&gt;

Good luck!

&lt;hr /&gt;

&lt;p&gt;Update:&lt;/p&gt;

&lt;p&gt;I tried to do these instructions with Ruby 1.8.7, and didn't have any luck. After googling around some, I found that while &lt;code&gt;extconf.rb&lt;/code&gt; was finding &lt;code&gt;/usr/local/include/readline/readline.h&lt;/code&gt;, it was in fact using &lt;code&gt;/usr/include/libedit/readline.h&lt;/code&gt; during buildtime, causing this:&lt;/p&gt;

&lt;pre&gt;
  gcc -I. -I. -I/Users/timcharper/.rvm/rubies/ruby-1.8.7-p248/lib/ruby/1.8/i686-darwin9.8.0 -I. -DHAVE_READLINE_READLINE_H -DHAVE_READLINE_HISTORY_H -DHAVE_RL_DEPREP_TERM_FUNCTION -DHAVE_RL_COMPLETION_APPEND_CHARACTER -DHAVE_RL_BASIC_WORD_BREAK_CHARACTERS -DHAVE_RL_COMPLETER_WORD_BREAK_CHARACTERS -DHAVE_RL_BASIC_QUOTE_CHARACTERS -DHAVE_RL_COMPLETER_QUOTE_CHARACTERS -DHAVE_RL_FILENAME_QUOTE_CHARACTERS -DHAVE_RL_ATTEMPTED_COMPLETION_OVER -DHAVE_RL_LIBRARY_VERSION -DHAVE_RL_EVENT_HOOK -DHAVE_RL_CLEANUP_AFTER_SIGNAL -DHAVE_REPLACE_HISTORY_ENTRY -DHAVE_REMOVE_HISTORY  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -fno-common -g -O2 -pipe -fno-common   -c readline.c
  readline.c: In function ‘filename_completion_proc_call’:
  readline.c:703: error: ‘filename_completion_function’ undeclared (first use in this function)
  readline.c:703: error: (Each undeclared identifier is reported only once
  readline.c:703: error: for each function it appears in.)
  readline.c:703: warning: assignment makes pointer from integer without a cast
  readline.c: In function ‘username_completion_proc_call’:
  readline.c:730: error: ‘username_completion_function’ undeclared (first use in this function)
  readline.c:730: warning: assignment makes pointer from integer without a cast
  make: *** [readline.o] Error 1
&lt;/pre&gt;

&lt;p&gt;To resolve it, I signaled &lt;code&gt;extconf.rb&lt;/code&gt; to force it to use &lt;code&gt;/usr/local/include&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;
  ruby extconf.rb --with-readline-dir=/usr/local
  make clean
  make
&lt;/pre&gt;

&lt;hr /&gt;
&lt;p&gt;Update 2:&lt;/p&gt;

&lt;p&gt;If another version of Ruby is used to run the extconf.rb then the target version of Ruby for which you are compiling read line, you will get another stream of build errors, perhaps something like this:&lt;/p&gt;

&lt;pre&gt;
gcc -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -DHAVE_READLINE_READLINE_H -DHAVE_READLINE_HISTORY_H -DHAVE_RL_DEPREP_TERM_FUNCTION -DHAVE_RL_COMPLETION_APPEND_CHARACTER -DHAVE_RL_BASIC_WORD_BREAK_CHARACTERS -DHAVE_RL_COMPLETER_WORD_BREAK_CHARACTERS -DHAVE_RL_BASIC_QUOTE_CHARACTERS -DHAVE_RL_COMPLETER_QUOTE_CHARACTERS -DHAVE_RL_FILENAME_QUOTE_CHARACTERS -DHAVE_RL_ATTEMPTED_COMPLETION_OVER -DHAVE_RL_LIBRARY_VERSION -DHAVE_RL_EVENT_HOOK -DHAVE_RL_CLEANUP_AFTER_SIGNAL -DHAVE_REPLACE_HISTORY_ENTRY -DHAVE_REMOVE_HISTORY -I/usr/local/include   -fno-common -arch ppc -arch i386 -Os -pipe -fno-common  -c readline.c
readline.c: In function ‘readline_readline’:
readline.c:82: error: ‘rb_io_t’ undeclared (first use in this function)
readline.c:82: error: (Each undeclared identifier is reported only once
readline.c:82: error: for each function it appears in.)
readline.c:82: error: ‘ofp’ undeclared (first use in this function)
readline.c:82: error: ‘ifp’ undeclared (first use in this function)
readline.c: In function ‘filename_completion_proc_call’:
readline.c:703: error: ‘filename_completion_function’ undeclared (first use in this function)
readline.c:703: warning: assignment makes pointer from integer without a cast
readline.c: In function ‘username_completion_proc_call’:
readline.c:730: error: ‘username_completion_function’ undeclared (first use in this function)
readline.c:730: warning: assignment makes pointer from integer without a cast
readline.c: In function ‘readline_readline’:
readline.c:82: error: ‘rb_io_t’ undeclared (first use in this function)
readline.c:82: error: (Each undeclared identifier is reported only once
readline.c:82: error: for each function it appears in.)
readline.c:82: error: ‘ofp’ undeclared (first use in this function)
readline.c:82: error: ‘ifp’ undeclared (first use in this function)
readline.c: In function ‘filename_completion_proc_call’:
readline.c:703: error: ‘filename_completion_function’ undeclared (first use in this function)
readline.c:703: warning: assignment makes pointer from integer without a cast
readline.c: In function ‘username_completion_proc_call’:
readline.c:730: error: ‘username_completion_function’ undeclared (first use in this function)
readline.c:730: warning: assignment makes pointer from integer without a cast
lipo: can't open input file: /var/folders/jz/jzGJ6Q4BFumSODlDitruR++++TM/-Tmp-//ccvDT283.out (No such file or directory)
make: *** [readline.o] Error 1
&lt;/pre&gt;

&lt;p&gt;To resolve, run extconf.rb with the same version of Ruby for which you are recompiling readline.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Update 3:&lt;/p&gt;

&lt;p&gt;ruby 1.8.6 and ruby 1.8.7 appear to have their threads (and signals) blocked by readline now.  This seems to be a recent development as I have used readline with ruby 1.8.6 without blocking threads in a past build.&lt;/p&gt;

&lt;p&gt;Ruby 1.9.1 doesn't currently block threads with readline&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-7228932803134256762?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/7228932803134256762/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=7228932803134256762" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/7228932803134256762?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/7228932803134256762?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/oltzW2DBSow/getting-ruby-to-use-readline-instead-of.html" title="Getting ruby to use readline instead of libedit" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>4</thr:total><feedburner:origLink>http://tim.theenchanter.com/2010/01/getting-ruby-to-use-readline-instead-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IER3g5fip7ImA9WxBRGEk.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-1431638936148750672</id><published>2010-01-06T22:00:00.001-08:00</published><updated>2010-01-06T22:25:06.626-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-06T22:25:06.626-08:00</app:edited><title>Open in Emacs finder droplet</title><content type="html">Here's a handy finder droplet to open a file in Emacs (for MacOS X):

&lt;a href="http://www.mediafire.com/file/zmzqbwoyozz/OpenInEmacs.zip"&gt;OpenInEmacs&lt;/a&gt;

Here's how you install it / use it: 

&lt;a href="http://screencast.com/t/MWM4ZTQ0N"&gt;Demo Video&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-1431638936148750672?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/1431638936148750672/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=1431638936148750672" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/1431638936148750672?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/1431638936148750672?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/VxYgjCgHL1s/open-in-emacs-finder-droplet.html" title="Open in Emacs finder droplet" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>1</thr:total><feedburner:origLink>http://tim.theenchanter.com/2010/01/open-in-emacs-finder-droplet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMCQnY9eip7ImA9WxBTGU8.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-9022714180889015641</id><published>2009-12-12T12:26:00.000-08:00</published><updated>2009-12-15T16:31:03.862-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T16:31:03.862-08:00</app:edited><title>Bash Commandline editing</title><content type="html">&lt;p&gt;Back when I was at Lone Star Ruby Conference, &lt;a href="http://adamstacoviak.com/"&gt;Adam Stacoviak&lt;/a&gt;, a friend of mine that I met there, told me that I needed to do a screencast about bash. I didn't act on it until recently, at church, we had a lesson about how important it is to share with others what we know. That was enough to get me off my rear end and put something together.&lt;/p&gt;

&lt;p&gt;One of my goals was to make it concise, trying to avoid wasting a lot of time saying things that didn't really contribute to the concepts conveyed. I've got to tell you, trying to produce a high-quality screencast is a lot of hard work! I managed to produce one that is only 13 minutes long, so I can't imagine the amount of effort that goes into producing a one-hour long screencast -- writing the script, recording this material, editing, polishing, and ensuring that the information is clear. If you have ever pirated a screencast, you are a really, REALLY big jerk :-) they deserve to get paid every penny they earn. (I'm going to be giving mine away for free, so you don't have to worry about that here.  If it benefits you, pay it forward and do share something you know with the world)&lt;/p&gt;

&lt;p&gt;I had the honor of publishing it through a site that my friend Eric Berry operates, &lt;a href="http://teachmetocode.com/"&gt;teachmetocode.com&lt;/a&gt;, joining the ranks of a few other fine gentleman as publishers there. I recorded it with Camstasia studio for the Mac, having received a sponsorship license through teachmetocode.com. Overall, it did the job, but I think it lacked a lot of key features that would have made editing less tedious. (Like being able to group clips together, for example)&lt;/p&gt;

Click here to view the screencast: &lt;a href="http://teachmetocode.com/screencasts/bash-command-line-editing"&gt;Bash Command Line Editing&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-9022714180889015641?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/9022714180889015641/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=9022714180889015641" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/9022714180889015641?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/9022714180889015641?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/W3KSetjSa-M/bash-commandline-editing.html" title="Bash Commandline editing" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>2</thr:total><feedburner:origLink>http://tim.theenchanter.com/2009/12/bash-commandline-editing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YCQ3o5eip7ImA9WxJWEkw.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-949183681469299966</id><published>2009-06-16T20:57:00.000-07:00</published><updated>2009-06-16T20:59:22.422-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-16T20:59:22.422-07:00</app:edited><title>Universal Healthcare</title><content type="html">&lt;p&gt;In response to those who claim that Universal Healthcare is our right because it promotes the general public welfare: I&amp;#8217;m with you that there are some issues with our current health care system.  But do you really thing that letting the government take it over is the way to go?&lt;/p&gt;
&lt;p&gt;From my perspective it seems that less government interference (and less big pharma special interests group pushing policies that big them a leg up on others) would best promote the general welfare you speak of.  Consider veterinarians.  Or, contrast private and public health care service in any country that has implemented the scheme.  Consider the benefits of competition.&lt;/p&gt;
&lt;p&gt;It seems that placing it all in the hands of a bureaucracy would be much worse that what we have now: no accountability to produce and no competition to innovate = less health care available, less efficiency, and less (virtually no) medical advances. Also, why would you want to become a doctor, only to become a slave to what will sure to be a bureaucratic mess, especially one where your rights are considered to be inferior to those who are ill. Thus we lose the incentive to attract (and reward) the best talent.&lt;/p&gt;
&lt;p&gt;I believe we have a right to choose whom to exchange with to acquire health care, and even to study medicine ourselves and provide for ourselves and our family healthcare.  But, when we start to claim right to the fruits of the labor of others, we are on dangerous ground.  We are only respecting freedom so long as it applies to us, and we are infringing on the blessings of liberty of those around us.&lt;/p&gt;
&lt;p&gt;I believe we both have the same values and want to bless the lives of others &amp;#8211; no-one wants more people to go hungry or sick.  This is sincerely what I believe on the subject.&lt;/p&gt;
&lt;p&gt;Thanks for sharing your opinion.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-949183681469299966?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/949183681469299966/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=949183681469299966" title="24 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/949183681469299966?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/949183681469299966?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/Zx4ZfAs-670/universal-healthcare.html" title="Universal Healthcare" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>24</thr:total><feedburner:origLink>http://tim.theenchanter.com/2009/06/universal-healthcare.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4FRXg4fCp7ImA9WxVWEUo.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-2816649910785487170</id><published>2009-02-20T16:16:00.000-08:00</published><updated>2009-02-20T16:41:54.634-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-20T16:41:54.634-08:00</app:edited><title>How to escape arguments in bash</title><content type="html">&lt;p&gt;Today I was trying to write a convenience wrapper script that ran commands remotely on a server (for one of the people we work with).  But, for some reason, ssh handles arguments in a completely suprising (and annoyingly inconvenient) manner that completely ignores quotes.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;
timcharper@timcharper:~ $ ssh my_server grep "4 5 6" ./
grep: 5: No such file or directory
grep: 6: No such file or directory
&lt;/pre&gt;
&lt;p&gt;Grrr&amp;#8230;. this made me feel &lt;span class="caps"&gt;ANGRY&lt;/span&gt;.  Because of this, I couldn&amp;#8217;t use the &amp;#8220;$@&amp;#8221; trick to splat all the arguments on the end and just move on with life.  But it&amp;#8217;s cool, because I&amp;#8217;ve got a thick table to bang my head against, combined with an overly-aggressive problem-solving drive that won&amp;#8217;t accept no for an answer.&lt;/p&gt;
&lt;p&gt;So, I came across an &lt;a href="http://stackoverflow.com/questions/407523/bash-escape-a-string-for-sed-search-pattern"&gt;awk trick&lt;/a&gt; to escape every character in a string, and another trick to iterate over arguments.  Combining the two techniques did the trick, and I can now properly pass command line arguments through an ssh wrapper script.  Since it depends on bash and awk, and bash and awk are on &lt;span class="caps"&gt;EVERY&lt;/span&gt; &lt;span class="caps"&gt;POSIX&lt;/span&gt; system out there, it&amp;#8217;s a winner.&lt;/p&gt;
&lt;h1&gt;The working script:&lt;/h1&gt;
&lt;pre&gt;
#!/bin/sh
CMD=""

for (( i = 1; i &amp;lt;= $# ; i++ )); do
  eval ARG=\$$i
  CMD="$CMD $(echo "$ARG" | awk '{gsub(".", "\\\\&amp;amp;");print}')"
done

ssh my_server cd /path/to/app \&amp;amp;\&amp;amp; RAILS_ENV=production $CMD
&lt;/pre&gt;
&lt;p&gt;Surprisingly, this is quite bullet broof, and properly escapes strings and preserves arguments like:&lt;/p&gt;
&lt;pre&gt;
./remote.sh grep "hello there" . -R
./remote.sh grep "So I says to the typewriter, \"Hey, I'm in quotes\"" . -R
./remote.sh grep "\"" . -R
&lt;/pre&gt;
&lt;p&gt;I wish somebody had posted a solution like this for me to find, so, here you go.  If you came here looking for this solution, I probably saved you an hour of your life, and a lot of stress to boot.  You&amp;#8217;re welcome.&lt;/p&gt;
&lt;p&gt;Have you ever wasted more than an hour on a trivial problem like this?  Is there an easier way to do this?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-2816649910785487170?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/2816649910785487170/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=2816649910785487170" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2816649910785487170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2816649910785487170?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/h4eY_2hmoE8/how-to-escape-arguments-in-bash.html" title="How to escape arguments in bash" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>4</thr:total><feedburner:origLink>http://tim.theenchanter.com/2009/02/how-to-escape-arguments-in-bash.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MNR3o7fyp7ImA9WxRUFE0.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-8749122769438327402</id><published>2008-11-22T01:30:00.001-08:00</published><updated>2008-11-22T19:04:56.407-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-22T19:04:56.407-08:00</app:edited><title>The Most Rockin' Carpool Site on the Web</title><content type="html">&lt;p&gt;&lt;a href="http://mycarpoolrocks.com/"&gt;&lt;img src="http://img81.imageshack.us/img81/2981/mycarpoolrocksgv5.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Introducing &lt;a href="http://mycarpoolrocks.com/"&gt;MyCarpoolRocks.com&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This blog post marks the second launch party for &lt;a href="http://mycarpoolrocks.com/"&gt;MyCarpoolRocks.com&lt;/a&gt;, a ride sharing site so easy to use your 80 year old grandma could figure it out, and so awesome it&amp;#8217;s going to be the talk of every college and work party.&lt;/p&gt;
&lt;h2&gt;Why ride sharing is awesome&lt;/h2&gt;
&lt;p&gt;For the past several months I&amp;#8217;ve been actively pursuing ride sharing.  My reasons are more economic than environmental (interestingly enough the two intersect here).  Here&amp;#8217;s why I think ride-sharing is awesome:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;We (my wife and I) continue saving an extra car payment, and get along just fine with our vehicle which we&amp;#8217;ve completely paid off&lt;/li&gt;
 &lt;li&gt;Save wear and tear on said vehicle&lt;/li&gt;
 &lt;li&gt;Lower monthly payment for auto insurance&lt;/li&gt;
 &lt;li&gt;Less gas money&lt;/li&gt;
 &lt;li&gt;The ability to be productive during my commute time (I&amp;#8217;ve got a stomach of steel when it comes to getting car sick, my stomach is awesome!)&lt;/li&gt;
 &lt;li&gt;Opportunities to socialize with car-pool partners.&lt;/li&gt;
 &lt;li&gt;Helping to shrink government by being less dependent on government to make my transportation more cost effective. (OK, this will not be a political post)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why I created a ride sharing site&lt;/h2&gt;
&lt;p&gt;Months ago when I was searching for a carpooling website to organize carpools in my church and community, and I found myself in Goldie Locks&amp;#8217; shoes, except the baby cub spit in his porridge and wet his bed.  I couldn&amp;#8217;t find a carpooling site that was &amp;#8220;just right&amp;#8221; &amp;#8211; one I could recommend without any reservations.  They were either difficult to figure out, or it was difficult to modify your commute once you&amp;#8217;ve recorded it, or protect your privacy without listing your house as 5 miles away, or required &lt;span class="caps"&gt;WAY&lt;/span&gt; &lt;span class="caps"&gt;TOO&lt;/span&gt; &lt;span class="caps"&gt;MUCH&lt;/span&gt; information to sign up.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t pretend to be so smart that I can create the perfect carpooling site, but I decided I was certainly going to try.  I started out with these objectives in mind:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;Any user must be able to &lt;span class="caps"&gt;INSTANTLY&lt;/span&gt; understand the tool&lt;/li&gt;
 &lt;li&gt;The sign up form should be as short and quick as possible (no email verifications!)&lt;/li&gt;
 &lt;li&gt;It should be fun&lt;/li&gt;
 &lt;li&gt;It should use be very visual (IE &amp;#8211; if you can convey the information visually on a map, or control input visually without using a drop down box, do it)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How I built &lt;a href="http://mycarpoolrocks.com/"&gt;MyCarpoolRocks.com&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I used the following libraries / gems&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;a href="http://github.com/rails/open_id_authentication/tree/master"&gt;open_id_authentication&lt;/a&gt; (with &lt;a href="http://openidenabled.com/ruby-openid/"&gt;ruby-openid&lt;/a&gt;) &amp;#8211; providing services to authenticate against open id servers.  This plug-in is &lt;span class="caps"&gt;FANTASTIC&lt;/span&gt;.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://github.com/technoweenie/restful-authentication/tree/master"&gt;restful_authentication&lt;/a&gt; &amp;#8211; very great plugin by technoweenie to handle user authentication.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://gravatarplugin.rubyforge.org/"&gt;gravatar&lt;/a&gt; &amp;#8211; Does the job to display user gravatars on your site.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://github.com/timcharper/indicator/tree/master"&gt;indicator&lt;/a&gt; &amp;#8211; indicator helper methods and javascript.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.loonsoft.com/recaptcha/"&gt;recaptcha&lt;/a&gt; &amp;#8211; Put recaptcha&amp;#8217;s on your website.  Worked great!&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://rspec.info/"&gt;rspec and rspec story runner&lt;/a&gt; to test.&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://github.com/timcharper/uber-builder/tree/master"&gt;uber-builder&lt;/a&gt; &amp;#8211; A fine form builder library.  Render the same form partial as a static form and get your view for free.  Supports various layout styles like tables, ul / li, etc. and does not get in your way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;To host, I got a Linode slice.  They&amp;#8217;ve been really great so far.&lt;/li&gt;
 &lt;li&gt;Bought the domain from http://danggood.com/&lt;/li&gt;
 &lt;li&gt;I made heavy use of rails ActiveRecord named_scopes.  Man they are awesome.&lt;/li&gt;
 &lt;li&gt;As for Google maps, I coded straight against their JavaScript &lt;span class="caps"&gt;API&lt;/span&gt;.  I wrote a resizable rectangle control for Google Maps even (contact me if you&amp;#8217;re interested in it).  Google Maps&amp;#8217; &lt;span class="caps"&gt;API&lt;/span&gt; is very awesome and does not need any Ruby on Rails helpers to work with maps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Lessons Learned (so far)&lt;/h2&gt;
&lt;h3&gt;User case studies are &lt;span class="caps"&gt;KING&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;I can&amp;#8217;t tell you how important this is: after you implement any idea, find somebody who has never seen what you&amp;#8217;ve been working on, and preferably is not well acquainted with what you have been doing.  Watch them try to go through the site, take notes on what confused them, and try to see things from their point of view as they are stumbling through it.  Resist the urge to help them, unless they get totally frustrated.  Just sit back and quietly observe.  Then, take feedback by the shovel-full.&lt;/p&gt;
&lt;p&gt;After &lt;span class="caps"&gt;EXCRUCIATING&lt;/span&gt; user testing from my good friends and family (thanks, you guys so rock), I was able to iron out some pretty serious road blocks that would not have even been aware of otherwise.&lt;/p&gt;
&lt;h3&gt;Don&amp;#8217;t fall in love with your own ideas&lt;/h3&gt;
&lt;p&gt;Your love affair with your ideas will almost inevitably lead to failure.  Why?  Because we all have blind spots, and it often takes the collaboration of several minds to get a clear picture.&lt;/p&gt;
&lt;p&gt;When you get feedback from your user case studies, don&amp;#8217;t be afraid to throw away code, or completely rearrange or restructure things.&lt;/p&gt;
&lt;p&gt;For example: at first, the sign up process consisted of two parts: &amp;#8220;search for matches&amp;#8221; and &amp;#8220;register your commute&amp;#8221;.  I really liked it that way &amp;#8211; it provided flexibility.  I even had the search address being stored in a session and auto-populating in the commute registration form.&lt;/p&gt;
&lt;p&gt;When my tester got very confused, and couldn&amp;#8217;t understand why she was being asked for her address twice, I was tempted to explain to her why it was so awesome that way.  Instead, I sought to understand her point of view.  Her view was more enlightened than mine, and I saw that the flexibility I as in love with was ultimately wasn&amp;#8217;t adding value but detracting from it by complicating things.  The refactoring was painful, but was also one of the greatest improvements I&amp;#8217;d made since the first prototype of the site.&lt;/p&gt;
&lt;h3&gt;Be an information elitist&lt;/h3&gt;
&lt;p&gt;Don&amp;#8217;t be afraid to scrap things &amp;#8211; put every piece of information on trial, especially when you are asking your user for information: are you needed to get the job done, is your existence warranted?  Persecute without mercy.&lt;/p&gt;
&lt;h3&gt;Make a clear path for the user that involves sign up.&lt;/h3&gt;
&lt;p&gt;I believe you&amp;#8217;ve got to guide a user down a path that leads them to sign up.  In my first launch attempt, I just showed a search form and let them search.  Not wanting to force people to register, people got on the site, searched, and said &amp;#8220;oh, that&amp;#8217;s cool&amp;#8221;.  Then they missed the tiny &amp;#8220;add your commute now!&amp;#8221; link and closed their browser.  Gone, probably never to return again.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Building &lt;a href="http://mycarpoolrocks.con/"&gt;MyCarpoolRocks.com&lt;/a&gt; has been a fun and rewarding.  I hope it gets to live up to its potential and create widespread value in my community wherever it finds itself getting heavy use.&lt;/p&gt;
&lt;p&gt;Feedback and criticism in the spirit of peer review is most welcome.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-8749122769438327402?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/8749122769438327402/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=8749122769438327402" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/8749122769438327402?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/8749122769438327402?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/KdHye01wwkE/most-rockin-carpool-site-on-web.html" title="The Most Rockin' Carpool Site on the Web" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>7</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/11/most-rockin-carpool-site-on-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkACRno5eSp7ImA9WxFRGU0.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-8319838924136580175</id><published>2008-10-03T10:14:00.001-07:00</published><updated>2010-05-03T08:32:47.421-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-03T08:32:47.421-07:00</app:edited><title>My support for proposition #8</title><content type="html">&lt;p&gt;This post was originally on how to change your default search engine to Yahoo, because of my disappointment in Google on taking an official position on proposition #8.&lt;/p&gt;
&lt;p&gt;After a day, I&amp;#8217;ve decided that joining a boycott on Google search would not be an effective way to promote traditional families.  After all, Google still remains neutral on the content hosted by it&amp;#8217;s many wonderful services.&lt;/p&gt;
&lt;p&gt;Still, my position on defending marriage as being defined between man and woman remains in effect.  Strong, functional families are the backbone for any society.  With out them, the world crumbles.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;If you wish to make Safari use yahoo to search, here&amp;#8217;s the script to do it:&lt;/p&gt;
&lt;pre&gt;
  cd /Applications/Safari.app/Contents/MacOS/ &amp;amp;&amp;amp; 
    [ ! -f Safari.google ] &amp;amp;&amp;amp; 
    sed -i .google 's|http://%@.google.com/%@?q=%@&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8|http://search.yahoo.com/bin/search?%@%@=0\&amp;amp;p=%@|' Safari
&lt;/pre&gt;
&lt;p&gt;Just open up a terminal and paste the whole command.  It&amp;#8217;ll create a backup, Safari.google.  If you want to go back, you can undo it with this:&lt;/p&gt;
&lt;pre&gt;
  cd /Applications/Safari.app/Contents/MacOS/ &amp;amp;&amp;amp; mv Safari.google Safari
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-8319838924136580175?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/8319838924136580175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=8319838924136580175" title="53 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/8319838924136580175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/8319838924136580175?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/bJXEYVm70xc/change-safaris-default-search-engine-to.html" title="My support for proposition #8" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>53</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/10/change-safaris-default-search-engine-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EDRHk8eCp7ImA9WxRQEEw.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-705595117810406094</id><published>2008-10-02T22:27:00.000-07:00</published><updated>2008-10-03T00:41:15.770-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-03T00:41:15.770-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><title>How to has_many :through a has_many :through</title><content type="html">&lt;p&gt;So, I&amp;#8217;ve got 3 models:&lt;/p&gt;
&lt;pre&gt;
  User -&amp;lt; UserConversation &amp;gt;- Conversation -&amp;lt; Message

  (where -&amp;lt; is has many, &amp;gt;- is belongs to, ... etc)
&lt;/pre&gt;
&lt;p&gt;I wanted, in this application, to be able to filter to all messages for a given user.&lt;/p&gt;
&lt;pre&gt;
  User#messages.find(message_id)
&lt;/pre&gt;
&lt;p&gt;So, naturally, I first reached for this:&lt;/p&gt;
&lt;pre&gt;
  class User &amp;lt; ActiveRecord::Base
    ...
    has_many :user_conversations
    has_many :conversations, :through =&amp;gt; :user_conversations
    has_many :messages, :through =&amp;gt; :conversations
  end 

  class UserConversation &amp;lt; ActiveRecord::Base
    belongs_to :user
    belongs_to :conversation
  end

  class Conversation &amp;lt; ActiveRecord::Base
    has_many :user_conversations, :dependent =&amp;gt; :destroy
    has_many :messages, :dependent =&amp;gt; :destroy
  end

  class Message &amp;lt; ActiveRecord::Base
    belongs_to :conversation
  end
&lt;/pre&gt;
&lt;p&gt;Which&amp;#8230; is completly &lt;span class="caps"&gt;WRONG&lt;/span&gt; and yields results like the following:&lt;/p&gt;
&lt;pre&gt;

  &amp;gt;&amp;gt; User.first.messages

  ActiveRecord::StatementInvalid: SQLite3::SQLException: no such
  column: conversations.user_id: SELECT "messages".* FROM "messages"
  INNER JOIN conversations ON messages.conversation_id =
  conversations.id    WHERE (("conversations".user_id = 1)) 
&lt;/pre&gt;
&lt;p&gt;So, apparently ActiveRecord doesn&amp;#8217;t support joins like that.  Sure, I could resort to manually specifying the finder_sql in the join and skip the has_many :through business, but then I&amp;#8217;d lose the that cool ability to apply additional scopes after this &amp;#8211; major &lt;span class="caps"&gt;FAIL&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;So, I came up with a clever way to get around it.&lt;/p&gt;
&lt;pre&gt;
  class User &amp;lt; ActiveRecord::Base
    ...
    has_many :user_conversations
    has_many :conversations, :through =&amp;gt; :user_conversations

    def messages
      Message.for_user(self)
    end
  end

  class Message &amp;lt; ActiveRecord::Base
    belongs_to :conversation
    
    named_scope :for_user, lambda { |user| user = user.id if user.is_a?(User); { :joins =&amp;gt; {:conversation =&amp;gt; :user_conversations}, :conditions =&amp;gt; ["user_conversations.user_id = ?", user]}}
  end
&lt;/pre&gt;
&lt;p&gt;And&amp;#8230; now we can do things like:&lt;/p&gt;
&lt;pre&gt;
  user.messages.find(1)
  user.messages.matching_subject("boogy man")
&lt;/pre&gt;
&lt;p&gt;etc., etc.  Hurray for named_scope.  So.. there's still a few issues.  Namely, it's not REALLY an association - no "create" or "build" methods.&lt;/p&gt;
&lt;p&gt;Dear web: what do think about this?  Got a better way to implement the above scenario?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-705595117810406094?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/705595117810406094/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=705595117810406094" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/705595117810406094?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/705595117810406094?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/fA0gLzx7B1I/how-to-hasmany-through-hasmany-through.html" title="How to has_many :through a has_many :through" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>3</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/10/how-to-hasmany-through-hasmany-through.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUECSXY7fip7ImA9WxdaFk8.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-6167505886467848283</id><published>2008-08-24T18:25:00.001-07:00</published><updated>2008-08-24T18:27:48.806-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-24T18:27:48.806-07:00</app:edited><title>Now we know they're lying</title><content type="html">&lt;p&gt;
&lt;a href="http://img48.imageshack.us/img48/8625/boogerbobnowweknowtheyrvo0.png"&gt;&lt;img src='http://img223.imageshack.us/img223/3702/boogerbobnowweknowtheyruw8.png'/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-6167505886467848283?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/6167505886467848283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=6167505886467848283" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/6167505886467848283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/6167505886467848283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/Qg0uyjqP-94/now-we-know-theyre-lying.html" title="Now we know they're lying" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>1</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/08/now-we-know-theyre-lying.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcGQno-fip7ImA9WxBTGUQ.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-3148019768316538840</id><published>2008-08-23T23:07:00.000-07:00</published><updated>2009-12-16T11:50:23.456-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-16T11:50:23.456-08:00</app:edited><title>Autoscroll in Safari, Firefox</title><content type="html">&lt;h1&gt;The Autoscroll Bookmarklet&lt;/h1&gt;
&lt;p&gt;Bookmarklets are actually a cool little concept &amp;#8211; make a link that runs a JavaScript command and inject code into any web-page.  Brilliant!  Combine this with an obsessive computer nerd with some free time on a Saturday evening (for example, me), and you get following:&lt;/p&gt;
&lt;p style='margin-top:40px;'&gt;&lt;span style='font-size:70px;'&gt;&lt;a href="javascript:/*The%20Autoscroll%20Bookmarket:Tim%20Harper:http://tim.theenchanter.com*/var%20_ss_interval_pointer;_ss_speed=1;_ss_speed_pairs=[[0,0],[1,200.0],[1,120.0],[1,72.0],[1,43.2],[1,25.9],[2,31.0],[4,37.2],[8,44.8],[8,26.4],[16,32.0]];_ss_last_onkeypress%20=%20document.onkeypress;_ss_stop=function(){clearTimeout(_ss_interval_pointer)};_ss_start=function(){_ss_abs_speed=Math.abs(_ss_speed);_ss_direction=_ss_speed/_ss_abs_speed;_ss_speed_pair=_ss_speed_pairs[_ss_abs_speed];_ss_interval_pointer=setInterval(%27scrollBy(0,%27+_ss_direction*_ss_speed_pair[0]+%27);%20if((pageYOffset%3c=1)||(pageYOffset==document.height-innerHeight))%20_ss_speed=0;%27,_ss_speed_pair[1]);};_ss_adj=function(q){_ss_speed+=q;if(Math.abs(_ss_speed)%3e=_ss_speed_pairs.length)_ss_speed=(_ss_speed_pairs.length-1)*(_ss_speed/Math.abs(_ss_speed))};_ss_quit=function(){_ss_stop();document.onkeypress=_ss_last_onkeypress;};document.onkeypress=function(e){if((e.charCode==113)||(e.keyCode==27)){_ss_quit();return;};if(e.charCode%3e=48&amp;&amp;e.charCode%3c=57)_ss_speed=e.charCode-48;else%20switch(e.charCode){case%2095:_ss_adj(-2);case%2045:_ss_adj(-1);break;case%2043:_ss_adj(2);case%2061:_ss_adj(1);break;};_ss_stop();_ss_start();};_ss_stop();_ss_start();"&gt;Autoscroll&lt;/a&gt;&lt;/span&gt; &amp;#8211; &lt;small&gt;The Bookmarklet&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Works in Safari and Firefox.  If you&amp;#8217;re lucky it might work in Opera, Camino, and Konqueror.  If you&amp;#8217;re at least as lucky as &lt;a href="http://www.youtube.com/watch?v=uW7im0RbEEc"&gt;this guy&lt;/a&gt;, it might work in IE.&lt;/small&gt;&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;Click the really big link above to activate auto-scroll (you may want to make your window small enough to have significant scroll space&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the buttons to push:&lt;/p&gt;
&lt;table&gt;
 &lt;tr&gt;
  &lt;td&gt; 0-9       &lt;/td&gt;
  &lt;td&gt; : Set scroll speed, 0 being stand-still and 9 being skim-speed &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt; &amp;#8211;         &lt;/td&gt;
  &lt;td&gt; : Decrease speed                                               &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt; =         &lt;/td&gt;
  &lt;td&gt; : Increase speed                                               &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt; shift + &amp;#8211; &lt;/td&gt;
  &lt;td&gt; : Decrease speed quickly                                       &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt; shift + = &lt;/td&gt;
  &lt;td&gt; : Increase speed quickly                                       &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt; q    &lt;/td&gt;
  &lt;td&gt; : Quit                                                         &lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;
&lt;h2&gt;Installation:&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;d like to pack this sweet action with you, drag the &amp;#8220;Autoscroll&amp;#8221; link to your bookmarks tool bar.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-3148019768316538840?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/3148019768316538840/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=3148019768316538840" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/3148019768316538840?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/3148019768316538840?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/ahyjnyzeuQU/autoscroll-in-safari-firefox.html" title="Autoscroll in Safari, Firefox" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>21</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/08/autoscroll-in-safari-firefox.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMESXo5fyp7ImA9WxdaFU8.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-1891824018073645180</id><published>2008-08-23T14:19:00.000-07:00</published><updated>2008-08-23T14:20:08.427-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-23T14:20:08.427-07:00</app:edited><title>How to Daemonize Any Process</title><content type="html">&lt;p&gt;I&amp;#8217;ve been passively looking for a tip like this for a while.  Often times, I&amp;#8217;ll need to run a command on a server that takes a good 30 minutes to run (like loading a database dump for example).  Normally, I&amp;#8217;ll run the command in the background, followed by this:&lt;/p&gt;
&lt;pre&gt;
while true; do sleep 60; date; done
&lt;/pre&gt;
&lt;p&gt;This has been my timeout prevention to keep commands from dying &amp;#8211; yes it&amp;#8217;s a pretty stinking lame solution.&lt;/p&gt;
&lt;p&gt;Especially lame when the server drops the connection anyways.&lt;/p&gt;
&lt;h2&gt;nohup saves the day&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://img98.imageshack.us/img98/4028/nohupch6.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;If you need to run a &lt;span class="caps"&gt;REALLY&lt;/span&gt; long command remotely that won&amp;#8217;t die with an &lt;span class="caps"&gt;SSH&lt;/span&gt; time out, then &amp;#8220;nohup&amp;#8221; is your friend.&lt;/p&gt;
&lt;p&gt;nohup shields the commands from &amp;#8220;&lt;span class="caps"&gt;HUP&lt;/span&gt;&amp;#8221; signals &amp;#8211; a signal that is sent to all child processes upon disconnecting from a terminal, that normally will stop your process (gracefully).&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;
nohup cat the_entire_internet.sql.bz2 | bunzip2 | mysql the_internet_production &amp;amp;
&lt;/pre&gt;
&lt;p&gt;And then, nohup will probably say something like &lt;code&gt;"nohup: ignoring input and redirecting stderr to stdout"&lt;/code&gt;, but it&amp;#8217;s of little consequence.  You&amp;#8217;re safe to quit your terminal and your process will be safely fostered by &lt;code&gt;/sbin/launchd&lt;/code&gt; after you take it&amp;#8217;s parent away.  Ya big mean lug.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-1891824018073645180?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/1891824018073645180/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=1891824018073645180" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/1891824018073645180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/1891824018073645180?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/CJxQkIwczuM/how-to-daemonize-any-process.html" title="How to Daemonize Any Process" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>2</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/08/how-to-daemonize-any-process.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUENR3c5fSp7ImA9WxdUFUg.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-2619112354878451113</id><published>2008-07-31T17:30:00.000-07:00</published><updated>2008-07-31T18:21:36.925-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-31T18:21:36.925-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><category scheme="http://www.blogger.com/atom/ns#" term="solutions" /><title>crontab: temp file must be edited in place</title><content type="html">&lt;p&gt;This is an error message I ran into after upgrading vim from 7.0 to 7.1, after editing a crontab file:&lt;/p&gt;


&lt;pre&gt;
  crontab: temp file must be edited in place
&lt;/pre&gt;

 &lt;p&gt;What was weird is this error message went away if I deleted my &lt;code&gt;~/.vimrc&lt;/code&gt; file.  If &lt;code&gt;~/.vimrc&lt;/code&gt; was blank, the error message was still there, so it wasn&amp;#8217;t caused by any command in particular.&lt;/p&gt;


 &lt;p&gt;It turned out to have something to do with vim&amp;#8217;s backup strategy.  I am supposing there is a default vimrc file somewhere that gets loaded if &lt;code&gt;~/.vimrc&lt;/code&gt; doesn&amp;#8217;t exist.&lt;/p&gt;


 &lt;p&gt;After some googling, I fixed it by adding the following to my &lt;code&gt;~/.vimrc&lt;/code&gt; file:&lt;/p&gt;


&lt;pre&gt;
  set backupskip=/tmp/*,/private/tmp/*" 
&lt;/pre&gt;

 &lt;p&gt;&lt;span class="caps"&gt;VIM&lt;/span&gt; already defaulted this value to &amp;#8221;/tmp/&lt;strong&gt;&amp;#8221;.  I don&amp;#8217;t know why defining my own .vimrc made vim not recognize /private/tmp/&lt;/strong&gt; as a temp directory any more, but I don&amp;#8217;t care enough to find out right now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-2619112354878451113?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/2619112354878451113/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=2619112354878451113" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2619112354878451113?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2619112354878451113?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/LgdSpVkKzM0/crontab-temp-file-must-be-edited-in.html" title="crontab: temp file must be edited in place" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>6</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/07/crontab-temp-file-must-be-edited-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YERXkyeip7ImA9WxdVF0Q.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-3371309579644253699</id><published>2008-07-22T22:25:00.000-07:00</published><updated>2008-07-23T00:45:04.792-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-23T00:45:04.792-07:00</app:edited><title>VIM rocks at Textile</title><content type="html">&lt;p&gt;OK, so I am enamorated with &lt;span class="caps"&gt;VIM&lt;/span&gt;!&lt;/p&gt;


 &lt;p&gt;It so turns out editing Textile in &lt;span class="caps"&gt;VIM&lt;/span&gt; is quite awesome.  Put your cursor over &amp;#8220;h1.&amp;#8221;, press &lt;em&gt;&lt;span class="caps"&gt;CTRL&lt;/span&gt;-a&lt;/em&gt;, and whazam: you get &amp;#8220;h2.&amp;#8221; .  If you use the surround.vim&lt;sup&gt;1&lt;/sup&gt; plugin, and want to bold the last three words: &amp;#8216;v3bs&amp;lowast;&amp;#8217; (start selecting text, back three words, surround with &amp;lowast;).  If you want to turn 3 words into a link: v3es&amp;#8221;f&amp;#8221;a:http://google.com.  Convert a series of lines (single spaced) into a list: &amp;lt;Ctrl-v&amp;gt;}I&amp;lowast;&amp;lt;Space&amp;gt;&amp;lt;Esc&amp;gt;.&lt;/p&gt;


 &lt;p&gt;What is &lt;span class="caps"&gt;VIM&lt;/span&gt; lacking then?  Well, how about Textile highlighting and a command to quickly preview or render your Textile you may say?  Good thing there&amp;#8217;s a &lt;span class="caps"&gt;TOTALLY AWESOME PLUGIN&lt;/span&gt; (shameless plug) for &lt;span class="caps"&gt;VIM&lt;/span&gt; to make that a thing of yesteryear!&lt;/p&gt;


 &lt;h2&gt;And Now, Ladies and Gentlement, I Bring You:&lt;/h2&gt;


 &lt;p&gt;&lt;a href="http://www.vim.org/scripts/script.php?script_id=2305"&gt;Textile for &lt;span class="caps"&gt;VIM&lt;/span&gt;&lt;/a&gt; &amp;#8211; Fun for the whole family!&lt;/p&gt;


 &lt;h2&gt;Featuring:&lt;/h2&gt;


 &lt;ul&gt;
 &lt;li&gt;&lt;strong&gt;Syntax highlighting&lt;/strong&gt; (Thanks to the work of two very cool dudes, &lt;a href="http://happygiraffe.net/blog/"&gt;Dominic Mitchell&lt;/a&gt; and &lt;a href="http://blog.aaronbieber.com/"&gt;Aaron Bieber&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Preview Textile&lt;/strong&gt; (\tp &amp;#8211; whamo!  See texile rendered in your browser!  No need to save your file first)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Render Textile&lt;/strong&gt; (\tr &amp;#8211; open a new &lt;span class="caps"&gt;VIM&lt;/span&gt; tab with the rendered &lt;span class="caps"&gt;HTML&lt;/span&gt;, so you can paste it into your favorite blogging software that doesn&amp;#8217;t support Textile, like Blogger, for example)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Render Textile to a file!&lt;/strong&gt; (\tf)&lt;/li&gt;
 &lt;/ul&gt;


 &lt;p&gt;&lt;small&gt;1. if you use &lt;span class="caps"&gt;VIM&lt;/span&gt; and don&amp;#8217;t have surround.vim installed, you really should &lt;span class="caps"&gt;DROP EVERYTHING&lt;/span&gt; and go &lt;a href="http://www.vim.org/scripts/script.php?script_id=1697"&gt;install it&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-3371309579644253699?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/3371309579644253699/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=3371309579644253699" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/3371309579644253699?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/3371309579644253699?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/Az4rz2f3RrE/vim-rocks-at-textile.html" title="VIM rocks at Textile" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>2</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/07/vim-rocks-at-textile.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8MSXo7eCp7ImA9WxdVF0Q.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-6169511778335270236</id><published>2008-07-22T22:00:00.001-07:00</published><updated>2008-07-23T00:24:48.400-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-23T00:24:48.400-07:00</app:edited><title>The vertical climb to VIM</title><content type="html">&lt;p&gt;A good friend of mine posted an &lt;a href="http://chalain.livejournal.com/74234.html"&gt;article&lt;/a&gt; that finally inspired me to learn another editor (even though I was, and still am, quite happy with TextMate).&lt;/p&gt;


 &lt;p&gt;What resulted was a &lt;a href="http://bemrose.us/images/curves.jpg"&gt;direct vertical climb up the the learning curve of &lt;span class="caps"&gt;VIM&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;


 &lt;p&gt;&lt;img src="http://unix.rulez.org/~calver/pictures/curves.jpg" alt="" /&gt;&lt;/p&gt;


 &lt;p&gt;And, painful it was!  There were times when I felt obligated to keep using it, even though I longed for the simpicity of TextEdit or TextMate.  Why did I do it?  Well, when I learned how to chain commands together I was addicted!  And then there was finding out that &lt;span class="caps"&gt;VIM&lt;/span&gt; does all the things I&amp;#8217;ve wanted an editor to do for a long time.&lt;/p&gt;


 &lt;p&gt;A few of the features I love:&lt;/p&gt;


 &lt;ul&gt;
 &lt;li&gt;Ability to chain commands together (d3w, di&amp;#8221;, c/Word&lt;CR&gt;, g~e etc)&lt;/li&gt;
  &lt;li&gt;Visual block mode&lt;/li&gt;
  &lt;li&gt;&lt;span class="caps"&gt;VIM&lt;/span&gt; plugins&lt;/li&gt;
  &lt;li&gt;Complete from words in doc&lt;/li&gt;
  &lt;li&gt;Lots of navigation keys to get you precisely where you want to be in less than 3 key strokes&lt;/li&gt;
  &lt;li&gt;&lt;span class="caps"&gt;VIM&lt;/span&gt; follows me everywhere &amp;#8211; Desktop, terminal, linux, unix, windows, &lt;span class="caps"&gt;OS X&lt;/span&gt;)&lt;/li&gt;
  &lt;li&gt;Multiple registers (clipboards)&lt;/li&gt;
  &lt;li&gt;Macros&lt;/li&gt;
  &lt;li&gt;The &amp;#8221;.&amp;#8221; key (repeat last edit)&lt;/li&gt;
  &lt;li&gt;Many more&lt;/li&gt;
 &lt;/ul&gt;


 &lt;p&gt;I now really fancy this old-timer &lt;span class="caps"&gt;VIM&lt;/span&gt;, and as my friend described, I can shovel around text by the shovel-full.  It&amp;#8217;s an amazing feeling!  I still feel all warm inside and excited when I go to edit a bunch of text and get to hop around, move stuff around, make spelling corrections, all without moving my hands off the middle of the keyboard!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-6169511778335270236?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/6169511778335270236/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=6169511778335270236" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/6169511778335270236?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/6169511778335270236?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/JgcnoXy2yI0/vertical-climb-to-vim.html" title="The vertical climb to VIM" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>2</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/07/vertical-climb-to-vim.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcEQHo4eyp7ImA9WxdXFE0.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-4070005626998817444</id><published>2008-06-23T19:48:00.000-07:00</published><updated>2008-06-25T07:26:41.433-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-25T07:26:41.433-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="nerd" /><title>Can you find the exclusive lock?</title><content type="html">&lt;p&gt;Here's the quiz of the day:  Can you find the exclusive lock in this code?&lt;/p&gt;

&lt;p&gt;&lt;a target="_blank" href="http://pastie.org/220881"&gt;Mysql#query&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(hint: it begins on line 2, and ends on line 36)&lt;/p&gt;

&lt;p&gt;It seemed reasonable that ActiveRecord.allow_currency would make my application be able to run concurrent queries.  Well, that's what I thought :)  Until I had discovered my 6 threads (which properly formed 6 new connections to the database) were still executing queries serially, instead of in parallel!   When investigating what the hold up was, I found my culprit: Ruby 1.8's &lt;a href="http://en.wikipedia.org/wiki/Green_threads"&gt;green threads&lt;/a&gt; lose control when you run native C functions, well at least Mysql#query anyways.&lt;/p&gt;  

&lt;p&gt;So, note to self and world: any time you run a native function that takes a long time, look forward to a big, exclusive lock down.&lt;/p&gt;

&lt;p&gt;All the more reason I'm excited for Ruby 1.9's native threads&lt;/p&gt;

&lt;p&gt;So, web, do you know if there's a way to "poll" ruby's thread scheduler while in a native C function while waiting for some other task to finish?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-4070005626998817444?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/4070005626998817444/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=4070005626998817444" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/4070005626998817444?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/4070005626998817444?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/TtR2zpnm1Dc/ruby-threads-are-close-to-useless.html" title="Can you find the exclusive lock?" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>5</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/06/ruby-threads-are-close-to-useless.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8HSX4yeyp7ImA9WxdQFU0.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-2077761519725023687</id><published>2008-06-14T22:14:00.000-07:00</published><updated>2008-06-14T22:30:38.093-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-14T22:30:38.093-07:00</app:edited><title>Quiz of the day:</title><content type="html">&lt;p style='text-align:center'&gt;&lt;img src="http://img184.imageshack.us/img184/4412/demolish02bmzd6.jpg"&gt;&lt;/p&gt;

&lt;p&gt;What does this wrecking ball and a developer who neglects to create and maintain an automated test suite have in common?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-2077761519725023687?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/2077761519725023687/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=2077761519725023687" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2077761519725023687?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2077761519725023687?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/3cmz3VUDs9U/quiz-of-day.html" title="Quiz of the day:" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>0</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/06/quiz-of-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QERX04eyp7ImA9WxdQE0w.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-5434904962625894998</id><published>2008-06-12T16:18:00.000-07:00</published><updated>2008-06-12T17:01:44.333-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-12T17:01:44.333-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Garbage collect every git repository on your machine</title><content type="html">&lt;p&gt;One of the things I really like about &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; is that it doesn't automatically garbage collect and compact repositories.  It's kind of like how you don't clean your room and take out the garbage (or at least I don't) every time you make a mess or throw something away.  If you accidently throw something away, you can pull it out of the trash before it goes to the dump.  You don't have to be slowed down by a clean up operation when you're focusing on getting things done.&lt;/p&gt;

&lt;p&gt;However, there is a draw back to this.  Git repositories DO start to slow down after a while if you aren't "cleaning your room".  And, they won't be as efficient in disk space utilization.&lt;/p&gt;

&lt;p&gt;Lucky for us, since we are working with computers here, we don't have to clean our rooms by hand.  The following little bash script will crawl your whole hard drive, look for any git repositories, and then garbage collect, prune, and pack them, regaining your disk space and making your repositories operate faster:&lt;/p&gt;

&lt;pre&gt;
#!/bin/sh
find . -type d -name .git | while read dir; do pushd "$dir"; git gc --prune; popd; done
&lt;/pre&gt;

&lt;p&gt;PS: ref logs keep objects from being pruned.  More on ref logs in a future post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-5434904962625894998?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/5434904962625894998/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=5434904962625894998" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5434904962625894998?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5434904962625894998?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/sCctbQGGLmk/garbage-collect-every-git-repository-on.html" title="Garbage collect every git repository on your machine" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>4</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/06/garbage-collect-every-git-repository-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YFQnY5fip7ImA9WxdRGUQ.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-2718798578559424490</id><published>2008-06-05T23:16:00.000-07:00</published><updated>2008-06-08T22:58:33.826-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-08T22:58:33.826-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="essays" /><title>Tyrants and Deceivers</title><content type="html">&lt;em&gt;The following essay is a draft of the roughest kind. I welcome any sincere, rational criticism to challenge my ideas and statements. Thank you.&lt;/em&gt;

&lt;h2&gt;Benevolent Tyrants and Deceivers&lt;/h2&gt;

&lt;p&gt;Tyrants come in all shapes and sizes.  Throughout history they've been known as brutal, heartless, merciless and cruel - and rightly so.  Tyrants are easier to identify and stand out like a sore thumb, whether from the inside or the out.  Everyone knows a tyrant.&lt;/p&gt;

&lt;p&gt;Deceivers, on the other hand, are not as easy to identify from the outside.  But, they are more destructive to freedom than tyrants that use physical force.  A lie is the worst form of physical force - if you get someone to believe a lie, you can get them to freely choose evil, thinking they are choosing good.  I believe this is why Lucifer is known as "The father of lies" in many religions.&lt;/p&gt;

&lt;p&gt;In our day, tyranny is alive and well just as in days of past.  However, it may not look the same - it's disguised in benevolence.  I'm not much into conspiracy theory - I think the greatest threat to freedom is right before our very eyes.  It's not difficult to see, when you have eyes to see it, and ears to hear it.  The benevolent tyrants of our day have taken a great hold upon our government, exploiting the ignorant to gain political favor.  In my opinion, all 3 of the major presidential candidates fall under this category.  I'll fully explain why I think this way in a future essay.&lt;/p&gt;

&lt;h2&gt;Robin Hood&lt;/h2&gt;

  &lt;p style="padding-left: 45px"&gt;To relieve the misfortunes of our fellow creatures is concurring with Deity, 'tis god-like, but if we provide encouragements for Laziness and supports for Folly, may it not be found fighting against the order of God and Nature, which perhaps has appointed Want and Misery as the proper Punishment for, and Caution against as well as necessary consequence of Idleness and Extravagancy.  Whenever we attempt to mend the scheme of Providence and to interfere in the Government of the World, we had need to be very circumspect lest we do more harm than good (Benjamin Franklin, Letter to Peter Collinson May 9, 1753).&lt;/p&gt;

&lt;p&gt;"Steal from the rich and give to the poor" - you've heard it before.  It sounds so nice, doesn't it?  After all, the poor wouldn't be poor if it weren't for those greedy rich people, so they should be punished (end sarcasm).  I would invite you to consider why many of those rich people are rich, and why many of those poor people are poor.  I would, in the process, suggest you be slow to condemn the poor - it is true, they haven't been taught, and you would likely be the same if you had only their experience and knowledge.&lt;/p&gt;

&lt;p&gt;When I was in Argentina, I saw a lot of poor people.  One town was a prime example of poverty.  The earth was rich there: you could throw seeds down and grow crops almost spontaneously.  There was relative peace and order.  There was hunger.  Why?  Because most of the population, rather than being industrious and taking advantage of the favorable circumstances for prosperity God had given them, they sat around, drinking their hot steaming mate in the 100% humidity 106 degree Fahrenheit weather, waiting for their government welfare check to come in (which, of course, they depended on).  I wondered if the government welfare checks were helping to improve the situation, or to worsen it.&lt;/p&gt;

&lt;p&gt;In our country, when laws are passed that redistribute wealth, our economic liberty is greatly infringed.  Because of this common tyranny in our day, I have much less abundance to give freely, and the resources which are taken from me through taxation are used in many ways of which I don't approve (not all ways, just most).  For example, I don't get to choose what schools my tax dollars support, nor welfare programs they go towards, nor social programs that are created.  I disagree with most all of the way the aforementioned are run, and can identify other places where those same dollars could be put to, in my opinion, much better use.  If that were to happen, I could in theory do the same good with less money, and have more to give and more to enjoy (our economy thrives when people generally have abundance).  Unfortunately, we live in a day and age where our government has become so addicted to an originally temporary tax measure that there seems to be no end in sight.  I don't like that these programs are entitled to my dollars without my strings attached by the votes of me the donor.  &lt;/p&gt;

&lt;h2&gt;Deceivers&lt;/h2&gt;

&lt;p&gt;Deceivers (and the deceived) exploit our democratic society and our bleeding hearts by using them to put these tyrannical measures in place.  Of Hilary, Barrack, and John McCain, I personally like Barrack Obama the best.  He's charismatic.  His policies give you a sense of hope.  They seem to ring true.  But one look with a rational mind at most any of his policies reveals the absolute tyranny he is advocating!&lt;/p&gt;

&lt;p&gt;From Obama's website:&lt;/p&gt;

&lt;p style='padding-left: 45px;'&gt;  "Americans turning 65 this year have grown our economy by 4.5 times over the course of their working lives. They have tilled our soil, defended our country, taught our children, worked in our factories, and raised a new generation to build upon their successes. And yet, many struggle to get by. Threats to Social Security and Medicare, skyrocketing health costs, and abuse and neglect of seniors all jeopardize our unspoken covenant: our seniors worked hard to take care of us, and now we must be here for them." (Barack Obama, on Senior Citizens)&lt;/p&gt;

&lt;p&gt;I agree with this statement.  It is a sad thing that so many senior citizens are struggling.  But why does the government need to be involved?  First off, are we not stewards over making our own preparations for retirement?  Would this perhaps incentivize us to be wiser in our expenses during our working years, and to be more productive, so we can store up plenty?  If retirement was guaranteed, how would it change your financial habits?  If people generally agree that they should take care of their elderly, then WHY would we need a law passed to get it done?&lt;/p&gt;

&lt;p&gt;Another policy from Barack's website:&lt;/p&gt;

  &lt;p style="padding-left: 45px"&gt;"Let us be the generation that reshapes our economy to compete in the digital age. Let's set high standards for our schools and give them the resources they need to succeed. Let's recruit a new army of teachers, and give them better pay and more support in exchange for more accountability. Let's make college more affordable, and let's invest in scientific research, and let's lay down broadband lines through the heart of inner cities and rural towns all across America." (Barack Obama, on Technology)&lt;/p&gt;

&lt;p&gt;I agree with his stance on higher pay in exchange for more accountability - it would be great to see a teacher have a real job and be rewarded to produce results, and let go for not.  However, hiring a "new army" of teachers suggests that the current staff is incompetant.  I'm certain that we already have wonderful and capable people enduring our system.  And, I'm certain its true there are many employed by the system that in other circumstances would not be employed in their current positions (given that the judge of competance are the ones paying for his or her employment).  I would first look at what conditions have created the situation to begin with.  And, if "a new army" of teachers is indeed what was needed, how will you entice them to teach in our government schools, when I know many of the best teachers have been otherwise driven away by the bureacracy of the system?&lt;/p&gt;

&lt;p&gt;Additionally, how many scientific advances have truly been brought about by government investing in scientific research?  And, how many of those advances would have been made anyways, or could have been made, without the governments help?  Now, I'm not talking about advances in scientific research related to the department of defense.  I'm talking about consumer / health innovation.  There is plenty of incentive for producers to innovate and discover, without the government getting in the way.&lt;/p&gt;

&lt;p&gt;What happens when government starts investing in "scientific" research?  How much accountability is there in the money?  In most other private circumstances, the risks taken are adequately balanced with the potential to profit (which means, the potential to create value for people).  If you lose your investment, no-one is going to hold your hand and say "it's not your fault, you did your best, here's your money back."  With that in mind, you are going to be a LOT MORE motivated to make sure those resources are put to their best use.&lt;/p&gt;

&lt;p&gt;But what if the government subsidizes the investment, and the investment fails.  How incentivized will you be to stay up every night, losing sleep many times, working diligently for a solution to work things out?  I would suggest that you will not have nearly as much incentive.&lt;/p&gt; 

&lt;p&gt;These are a few of many subtle deceptions in Mr. Obama's plan for change.  Now - I'm sure he's a great guy, and a sincere guy, and I don't believe it's his intention to deceive.  But his ideas are very, very flawed, and will contribute much to our country's economic suffering and stagnation.  He may be good, but he is not wise.&lt;/p&gt;

&lt;h2&gt;Collective Immorality and Source of Government Power&lt;/h2&gt;

&lt;p&gt;Now, I'd like to relate to you what in my mind spells out one of the greatest threats to human liberty.  Canton Ohio passed a law which makes 2nd time offenders who let their grass grow more than 8 inches long be subject to a $250 fine and 30 days in jail.  Reflecting on it, I concluded I wouldn't personally feel justified in throwing my neighbor in jail for failing to take care of his lawn.  I don't know what motivated the citizens to pass that law, but I would venture a guess and say they know it's wrong to go bind their neighbor up themselves because they don't like their lawn, but if they can pass a law and get the government to do it, it's OK.  As if there is a separation between "The Government" and "The Citizens", that somehow the Government gets to execute with impunity because it's the government, and when they're doing things to enforce the law it all of the sudden becomes moral.  Our country's founding fathers penned it quite well in our Declaration of Independence from whence our government gets it's power: "Governments are instituted among Men, deriving their just powers from the consent of the governed."  Those citizens of Ohio are acting collectively immoral!&lt;/p&gt;

&lt;h2&gt;Change&lt;/h2&gt;

&lt;p&gt;With so much talk and hype about change, what can we truly do to change for the better?  How can we combat the influences of tyranny, both via physical force and deception, and reverse the adverse affects on our freedom?&lt;/p&gt;

&lt;p&gt;We can write our congress-men and representatives and let our voice be heard.  We can become involved in government at the most basic level - in our local communities.  We can run to become a state delegate (it's a lot easier than you may think).  We can work to let our voices be known, in a rational, non-alarmist fashion.  We should be careful not to apply the same tactics as the deceivers when trying to persuade our fellow men.&lt;/p&gt;

&lt;p&gt;To combat the effects of deception in our personal lives, we can become well acquainted with the principles that govern the universe.  We can seek to reform our own lives by bringing them in order with absolute truth.  We can question the assumptions of our society: Research them, ponder them, are they really true?  Why or why not?  Can you back it up with facts?&lt;/p&gt;

&lt;p&gt;We can strive to make that which is sound and good popular, and help educate our fellow beings on the fundamental principles of proper government (I've found it completely ineffective and counter-productive to debate about "issues" when there isn't a common understanding and acceptance of basic principles).  If others don't agree with us, we should still be respectful of their freedom to think and believe like they do.  See and praise the good in them, and identify common ground - it will leave a much more fertile ground for future opportunities to plant bits of truth.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I would humbly invite you consider this quote by Henry Grady Weaver: &lt;/p&gt;

&lt;p style="padding-left: 45px"&gt;"Most of the major ills of the world have been caused by well-meaning people who ignored the principle of individual freedom, except as applied to themselves, and who were obsessed with fanatical zeal to improve the lot of mankind-in-the-mass through some pet formula of their own....THE HARM DONE BE ORDINARY CRIMINALS, MURDERERS, GANGSTERS, AND THIEVES IS NEGLIGIBLE IN COMPARISON WITH THE AGONY INFLICTED UPON HUMAN BEINGS BY THE PROFESSIONAL 'DO-GOODERS', who attempt to set themselves up as gods on earth and who would ruthlessly force their views on all others - with the abiding assurance that the end justifies the means." (The Mainspring of Human Progress; p. 40-1; P.P.N.S., p. 313)&lt;/p&gt;


&lt;p&gt;Whether you agree with me 100%, or partially, may we all do our best to advocate that which is sound and true in our families, our neighborhood and communities.  It is active rational minds of the wise that will tend us back towards freedom again.  May we all seek wisdom and learning from the best books.  Thank you for reading.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-2718798578559424490?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/2718798578559424490/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=2718798578559424490" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2718798578559424490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2718798578559424490?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/GaUTP5k-J7Y/tyrants-and-deceivers.html" title="Tyrants and Deceivers" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>4</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/06/tyrants-and-deceivers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4CRns8fyp7ImA9WxdRFUg.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-5038468160427401724</id><published>2008-06-03T20:21:00.000-07:00</published><updated>2008-06-03T21:16:07.577-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-03T21:16:07.577-07:00</app:edited><title>Tainted Love</title><content type="html">&lt;center&gt;&lt;p style='font-size: 20px;'&gt;"love".taint&lt;/p&gt;

&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gVY04NQUpxk&amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gVY04NQUpxk&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-5038468160427401724?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/5038468160427401724/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=5038468160427401724" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5038468160427401724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/5038468160427401724?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/hIF0qeVxjAg/tainted-love.html" title="Tainted Love" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>1</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/06/tainted-love.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMGSH44cCp7ImA9WxdSFE4.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-2923602053089236796</id><published>2008-05-17T14:52:00.000-07:00</published><updated>2008-05-21T22:33:49.038-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T22:33:49.038-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="plugins rails" /><title>activescaffold_sortable updated (with a delightful screencast)</title><content type="html">&lt;p&gt;After some long neglect, I finally had a reason to use the &lt;a href="http://github.com/activescaffold/active_scaffold_sortable/"&gt;active_scaffold_sortable&lt;/a&gt; plugin again.  Getting in to the code, I was ashamed at how broken it was.  But, after about an hour of polishing and cleanup, it's good as new and ready to be used again.&lt;/p&gt;

&lt;p&gt;Here's a screencast to show you exactly what it is:&lt;/p&gt;

&lt;embed src="http://www.jumpcut.com/media/flash/jump.swf?id=37B7EC2A246A11DDA3B8000423CEF5F6&amp;asset_type=movie&amp;asset_id=37B7EC2A246A11DDA3B8000423CEF5F6&amp;eb=1" width="408" height="324" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;

&lt;p&gt;See: activescaffold with sorted lists is fun!&lt;/p&gt;

&lt;hr/&gt;
&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: the urls for the repositories have been moved since this screencast was made.  The new home for active scaffold repositories can be found here: &lt;a href="http://github.com/activescaffold"&gt;http://github.com/activescaffold&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-2923602053089236796?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/2923602053089236796/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=2923602053089236796" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2923602053089236796?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/2923602053089236796?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/6RKRppJGGmI/activescaffoldsortable-updated-with.html" title="activescaffold_sortable updated (with a delightful screencast)" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>5</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/05/activescaffoldsortable-updated-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YBQHozeCp7ImA9WxdSEEs.&quot;"><id>tag:blogger.com,1999:blog-7625526986034013157.post-8005314625706020597</id><published>2008-05-17T12:41:00.000-07:00</published><updated>2008-05-17T14:52:31.480-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-17T14:52:31.480-07:00</app:edited><title>Webrat with RSpec story runner does indeed == chunky bacon</title><content type="html">&lt;p&gt;Ben Mabey, a stellar &lt;a href="http://urug.org/"&gt;URUG&lt;/a&gt; member here, has posted some amazing content for the RSpec Story Runner and using Webrat:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.benmabey.com/2008/02/04/rspec-plain-text-stories-webrat-chunky-bacon/"&gt;rspec plain text stories + webrat = chunky bacon!&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.benmabey.com/2008/05/10/slides-and-code-from-my-bddrspec-presentation/"&gt;Slides and code from Ben Mabey's BDD/rspec presentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you haven't heard of the RSpec Story Runner or Webrat, and are interested in integration testing for your website, you really should be checking these articles out.&lt;/p&gt;

&lt;p&gt;Webrat can be found over on the &lt;a href="http://github.com/brynary/webrat/"&gt;Webrat Git Repository&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7625526986034013157-8005314625706020597?l=tim.theenchanter.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tim.theenchanter.com/feeds/8005314625706020597/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7625526986034013157&amp;postID=8005314625706020597" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/8005314625706020597?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7625526986034013157/posts/default/8005314625706020597?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TimTheEnchanter/~3/JlHzl-M3Izw/webrat-with-rspec-story-runner-does.html" title="Webrat with RSpec story runner does indeed == chunky bacon" /><author><name>Tim Harper</name><uri>http://www.blogger.com/profile/03349408198556972919</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12115662323304547997" /></author><thr:total>0</thr:total><feedburner:origLink>http://tim.theenchanter.com/2008/05/webrat-with-rspec-story-runner-does.html</feedburner:origLink></entry></feed>
