<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>andy_delcambre_rss</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=578cb9002c52f2a2ed7d498e17aa2db3</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=578cb9002c52f2a2ed7d498e17aa2db3&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 23:26:19 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Bloggin'</title>
         <link>http://andy.delcambre.com/2007/02/27/bloggin.html</link>
         <description>&lt;p&gt;Well I got my uncle (the delcambre.com master) to give me control of andy.delcambre.com and I installed mephisto &lt;span class=&quot;caps&quot;&gt;YAY&lt;/span&gt;!&lt;/p&gt;
&lt;p&gt;Haven&amp;#8217;t really done the bloggin thing before but I thought i would give it a try.&lt;/p&gt;
&lt;p&gt;I am currently finishing up my BS in Computer Science from Portland State University and I am looking for a job.  I current work at &lt;span class=&quot;caps&quot;&gt;PSU&lt;/span&gt; doing system administration for the Maseeh College of Engineering and Computer Science.  It is a pretty good job (except the pay&amp;#8230;) but I have decided I want to give development a try.&lt;/p&gt;
&lt;p&gt;Anyway, keep your eye here for random stuff that interests me.  I will try to stay away from being a link aggregator and stick to actually writing stuff.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/02/27/bloggin</guid>
         <pubDate>Tue, 27 Feb 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Planet Argon and Rspec musings</title>
         <link>http://andy.delcambre.com/2007/06/05/planet-argon-and-rspec-musings.html</link>
         <description>&lt;p&gt;Started work at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://planetargon.com&quot;&gt;Planet Argon&lt;/a&gt; today.  I have been chatting with them for about 6 weeks, and I am extremely excited to start working with them.  Today was pretty slow to start (as I expected), getting accounts going, getting mysql working properly on my laptop, getting subversion checkouts, etc, etc.  Then I got started working on some actual coding.&lt;/p&gt;
&lt;p&gt;I am starting out writing some specs for the project I am working on.  I have used &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rspec.rubyforge.org/&quot;&gt;rspec&lt;/a&gt; for a few different projects but I hadn&amp;#8217;t had a chance to play with the new syntax yet.  It is basically exactly the same as when I used it just with different method names, but it really makes a huge difference in the style it forces you into.&lt;/p&gt;
&lt;p&gt;With the old method, how to describe the specs was always a bit weird to me.  For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;a new group with no users&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;specify&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;group should not be valid&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;#...&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the new style everything seems to flow naturally.  For example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;describe&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot; with no users&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;should not be valid&amp;quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
        &lt;span class=&quot;vi&quot;&gt;@group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;should_not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be_valid&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Interesting is that I often feel like I write the same thing twice, once in english, then again in the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Domain-specific_programming_language&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt;&lt;/a&gt; of rspec.  But if you read them out loud, they are basically the same:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;should have four elements&amp;quot;&lt;/span&gt; 
&lt;span class=&quot;vi&quot;&gt;@thing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;should&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;have&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elements&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also often find that I can guess the right syntax which is &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;HUGE&lt;/span&gt;&lt;/strong&gt; for rapid development times.  I really like rspec, and I think I am really going to like working for Planet Argon.&lt;/p&gt;
&lt;p&gt;P.S. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.backspace.bz/&quot;&gt;Backspace&lt;/a&gt; has awesome sandwiches.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/06/05/planet-argon-and-rspec-musings</guid>
         <pubDate>Tue, 05 Jun 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Rspec with Cookies</title>
         <link>http://andy.delcambre.com/2007/06/15/rspec-with-cookies.html</link>
         <description>&lt;p&gt;Rails cookies are weird.  In the controller you interact with them like they are a hash, but in fact it is not nearly that simple.  The &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://api.rubyonrails.org/classes/ActionController/Cookies.html&quot;&gt;rdocs&lt;/a&gt; gives some hints to the fact that weird things are going on but it wasn&amp;#8217;t enough for me to figure it out.  The hash abstraction works pretty well when you are setting the cookies, but when trying to test them things become more complicated.&lt;/p&gt;
&lt;p&gt;Lets take this simple example of setting an auth_token cookie.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;cookies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auth_token&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;token&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:expires&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expires&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This might happen in the login method of an authentication controller.  So now you want to test that the cookie is actually getting set.  So you think, ok this is a hash, I can just do something like:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;cookies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auth_token&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;should_not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be_nil&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This in fact doesn&amp;#8217;t work but, (and here is the nasty part), there is still a cookies object defined. What happens as far as I can tell (and correct me if I am wrong) is that once the post request is made, the cookies object is gone.  Then you can access the cookies that were set using the response object.  But the &lt;code&gt;response.cookies&lt;/code&gt; object isn&amp;#8217;t the same as the cookies object you were dealing with earlier.  It is the cookies as they are seen from the browser.   Therefore it is no longer a ruby hash, but an array of values, and the expiration time no longer exists (that is internal to the browser).   It is also no longer keyed by symbols, but is now keyed by strings.  So the correct way to spec that cookies are set looks like:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cookies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;auth_token&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;should_not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be_nil&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, because of the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://api.rubyonrails.org/classes/ActionController/TestProcess.html#M000071&quot;&gt;cookies alias&lt;/a&gt; alias in the ActionController test suite, you can also use the response.cookies object as just cookies.&lt;/p&gt;
&lt;p&gt;Hopefully this will save you the hour I just spent beating my head against this.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/06/15/rspec-with-cookies</guid>
         <pubDate>Fri, 15 Jun 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Disabling nfsv4 on Ubuntu</title>
         <link>http://andy.delcambre.com/2007/06/25/disabling-nfsv4-on-ubuntu.html</link>
         <description>&lt;p&gt;We had an issue where the nfs server on linux didn&amp;#8217;t play nice with solaris client because the solaris clients will try nfsv4 first then fall back to nfsv3.  The problem is that by default most linux nfs servers do both v3 and v4 so it answers the v4 request witha  failure, so the solaris clients never fall back. Unfortunately it isn&amp;#8217;t well documented how to disable v4.&lt;/p&gt;
&lt;p&gt;The basic solution is to pass &amp;#8212;no-nfs-version 4 to rpc.nfsd when it starts.  The normal place to add this is /etc/default/nfs-kernel-server, but there is no &lt;span class=&quot;caps&quot;&gt;NFSDARGS&lt;/span&gt; variable in there.  A quick look in the init script shows that the contents of $&lt;span class=&quot;caps&quot;&gt;RPCNFSDCOUNT&lt;/span&gt; are passed directly to rpc.nfsd.&lt;/p&gt;
&lt;pre&gt;
start-stop-daemon --start --oknodo --quiet &amp;#92;
   --nicelevel $RPCNFSDPRIORITY &amp;#92;
   --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
&lt;/pre&gt;
&lt;p&gt;So it was simply a case of tacking &amp;#8212;no-nfs-version 4 onto &lt;span class=&quot;caps&quot;&gt;RPCNFSDCOUNT&lt;/span&gt; in /etc/default/nfs-kernel-server giving me:&lt;/p&gt;
&lt;pre&gt;
# Number of servers to start up
RPCNFSDCOUNT='8 --no-nfs-version 4'
&lt;/pre&gt;
&lt;p&gt;(Eight is the default number of servers)&lt;/p&gt;
&lt;p&gt;I hope this helps if you need to do the same.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/06/25/disabling-nfsv4-on-ubuntu</guid>
         <pubDate>Mon, 25 Jun 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Authenticated rss proxy</title>
         <link>http://andy.delcambre.com/2007/08/17/authenticated-rss-proxy.html</link>
         <description>&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.planetargon.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt;&lt;/a&gt; we use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt; for project tracking.  Basecamp offers rss feeds of any new posts either globally  or per project which is very handy for keeping track of things.  The problem is that the rss feeds use http authentication which many feed readers (especially web based ones) don&amp;#8217;t support.  As a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://reader.google.com/&quot;&gt;Google Reader&lt;/a&gt; user, I was out of luck.&lt;/p&gt;
&lt;p&gt;After suffering through using email as my notification system, I decided to write a quick script to convert parameters to the url into http authentication.  I initially considered doing this with cgi, but eventually decided to write a quick &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mongrel.rubyforge.org/&quot;&gt;mongrel&lt;/a&gt; handler for the task.  It actually turned out to be a lot easier than I thought it would be.&lt;/p&gt;
&lt;p&gt;Here is the code:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;mongrel&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;net/http&amp;#39;&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;HOSTNAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;your basecamp url&amp;#39;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SimpleHandler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Mongrel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HttpHandler&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;QUERY_STRING&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;param&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HOSTNAME&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;basic_auth&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Mongrel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;HttpServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;0.0.0.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;9898&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/feed&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;SimpleHandler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It works really well, just run the script and point your feed reader at:&lt;br /&gt;
&lt;code&gt;http://hostname:9898/feed?user=&amp;lt;username&amp;gt;&amp;amp;password=&amp;lt;password&amp;gt;&amp;amp;url=&amp;lt;path of the rss feed&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;for a normal global basecamp feed, it would look like:&lt;br /&gt;
&lt;code&gt;http://hostname:9898/feed?user=andy.delcambre&amp;amp;password=mypassword&amp;amp;url=/feed/recent_items_rss&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://robbyonrails.com&quot;&gt;Robby&lt;/a&gt; has confirmed that this works with open id basecamp logins as well.&lt;/p&gt;
&lt;p&gt;This could be easily used with any authenticated rss feed you wanted.  My goal was to make it general enough and easy enough for everyone at &lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt; to use.&lt;/p&gt;
&lt;p&gt;I had no idea it was so easy to add an http server to your script with mongrel.  Zed Shaw is the man.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/08/17/authenticated-rss-proxy</guid>
         <pubDate>Fri, 17 Aug 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>PLANET ARGON does Dedicated Hosting!</title>
         <link>http://andy.delcambre.com/2007/09/04/planet-argon-does-dedicated-hosting.html</link>
         <description>&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1118/1325009910_c9e13bad3e_m_d.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;For some time now &lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt; has been providing dedicated hosting service for clients who ask.  We really enjoy this work and have decided to advertise it a bit more publicly.&lt;/p&gt;
&lt;p&gt;What does this mean?&lt;/p&gt;
&lt;p&gt;This means you provide a server and we provide a place to put it, somewhere to plug it in and a fast internet connection.&lt;/p&gt;
&lt;p&gt;This is not just a colocation service though.&lt;/p&gt;
&lt;p&gt;We also provide many services for your hosting needs.  We will load the boxes for you and keep them running and patched.  We can also provide support for anything up to multiple virtualized instances on your server with complex deployment layouts which we can help configure and deploy.&lt;/p&gt;
&lt;p&gt;If this is something you or your company might be interested, please contact us at contact@planetargon.com, +1 503 445 2457, or +1 877 55 &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt;[toll free]&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/09/04/planet-argon-does-dedicated-hosting</guid>
         <pubDate>Tue, 04 Sep 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Migration Conflicts</title>
         <link>http://andy.delcambre.com/2007/09/19/migration-conflicts.html</link>
         <description>&lt;h1&gt;The problem&lt;/h1&gt;
&lt;p&gt;Here at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.planetargon.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt;&lt;/a&gt; we use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt; for managing our rails projects.  There is often concurrent development from different developers on different aspects of a project.  It seems that whenever we are adding a lot of new features, we inevitably end up with multiple migrations with the same number.  The developer who is the second to commit ends up having to fix the migrations so they can be checked in.&lt;/p&gt;
&lt;p&gt;My basic strategy for resolving the conflict is to rollback to a version before the conflict, move my migrations past all of the new migrations and then migrate up to the newest version.  The issue with this system is that if you have multiple migrations with the same number, they won&amp;#8217;t run at all, so you can&amp;#8217;t revert.&lt;/p&gt;
&lt;h1&gt;The Solution&lt;/h1&gt;
&lt;p&gt;Lets assume that you are starting a new project which has a blog component.  Another developer creates the post model and checks it in, you start working on a user model and create the migration (and run it).  In the meantime, the other developer checks in the tag model with a migration.  So what you have now is:&lt;/p&gt;
&lt;pre&gt;
001_create_posts.rb
002_create_tags.rb
002_create_users.rb
&lt;/pre&gt;
&lt;p&gt;The posts and users tables are created in your database, the tags table is not.  The tags migration is checked into subversion and users isn&amp;#8217;t yet.  Basically you want to revert to version 1, change users to version 3 then re-migrate.  First, to revert to version 1, you need to perform the down operation of the users migration.  This can be done with script/console.  You require the migration file, then run the migrate method on the class.&lt;/p&gt;
&lt;pre&gt;
Loading development environment.
&amp;gt;&amp;gt; require 'db/migrate/002_create_users.rb'
=&amp;gt; [&quot;CreateUsers&quot;]
&amp;gt;&amp;gt; CreateUsers.migrate(:down)
== CreateUsers: reverting =====================================================
-- drop_table(:users)
   -&amp;gt; 0.0854s
== CreateUsers: reverted (0.0856s) ============================================
=&amp;gt; []
&lt;/pre&gt;
&lt;p&gt;Running the migration directly also doesn&amp;#8217;t change the schema info table so you will need to use a bit of sql to update that as well.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;UPDATE schema_info SET version = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now simply move the create_users migration to version 3,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mv db/migrate/002_create_users.rb db/migrate/003_create_users.rb&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and run &lt;code&gt;rake db:migrate&lt;/code&gt; and you should be happy again.&lt;/p&gt;
&lt;h1&gt;Solutions for Avoiding the Conflicts in the First Place&lt;/h1&gt;
&lt;p&gt;There are basically three options that I have seen for avoiding migration conflicts.&lt;/p&gt;
&lt;h3&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.caboo.se/articles/2007/3/27/independent-migrations-plugin&quot;&gt;Independent Migrations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This looks to be a cool plugin that allows you to define your migrations as &amp;#8220;Independent&amp;#8221;.  You subclass the migrations from &lt;code&gt;ActiveRecord::IndependentMigration&lt;/code&gt; rather than the normal &lt;code&gt;ActiveRecord::Migration&lt;/code&gt;.  What this does is if you have two migrations subclassed from IndependentMigration with the same version number, they will both run.  This assumes that any dependent migrations will still be numbered differently.  It is already available as a plugin at: &lt;code&gt;svn://caboo.se/plugins/court3nay/independent_migrations&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.teksol.info/articles/2006/12/13/timestamped-migrations-status&quot;&gt;Timestamped Migrations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This patch (it isn&amp;#8217;t a plugin yet) simply replaces the migration version numbers with timestamps, therefore making it much less likely that there will be conflicts.  Rather than storing a version number in the schema info table, it stores which migrations have been run. This seems to be a well thought out solution that could work well.  I am interested to see this when it becomes a plugin.&lt;/p&gt;
&lt;h3&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://errtheblog.com/post/12447&quot;&gt;Auto Migrations&lt;/a&gt; (aka Drop Dead Gorgeous Migrations)&lt;/h3&gt;
&lt;p&gt;This plugin from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://errtheblog.com/&quot;&gt;Err&lt;/a&gt; does away with migrations entirely and makes use of the much maligned db/schema.rb file.  You simply change that file to reflect how you want your database to look and run &lt;code&gt;rake db:auto:migrate&lt;/code&gt;.  The plugin compares the file and your database and applies changes to update your database.  This means you can use normal merging/conflict resolution tools you are already used to for changing schema.rb.&lt;/p&gt;
&lt;p&gt;This plugin is really new and doesn&amp;#8217;t yet support every possible change you could make, it doesn&amp;#8217;t yet support type changes and indexes were recently added.  It also has some limitations, if you change the name of a column there is no good way for it to detect that.  So you end up dropping the old column and creating the new one.&lt;/p&gt;
&lt;p&gt;Are there any other solutions that we might not be aware of now?&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/09/19/migration-conflicts</guid>
         <pubDate>Wed, 19 Sep 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>RubyURL Bookmarklet - Now with Google Maps Support</title>
         <link>http://andy.delcambre.com/2007/11/07/better-rubyurl-bookmarklet.html</link>
         <description>&lt;p&gt;I use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubyurl.com/&quot;&gt;RubyURL&lt;/a&gt; fairly extensively for linking to long urls.  It was written internally here at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://planetargon.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt;&lt;/a&gt; by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://chriszgriffin.com/&quot;&gt;Chris Griffin&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://robbyonrails.com/&quot;&gt;Robby Russell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The RubyURL bookmarklet is a god send, want to link somewhere that has a long url? Just click the RubyURL this link button and copy the address, the problem that I had is that it didn&amp;#8217;t work with google maps, which have extremely long urls and requires many steps to generate a RubyURL.  First you click, &amp;#8220;link to this page&amp;#8221;, copy the text from the little popup, go to rubyurl.com, paste the text and get your RubyURL.&lt;/p&gt;
&lt;div class=&quot;thumbnail&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://myskitch.com/adelcambre/dock-20071107-153539/&quot;&gt;&lt;img src=&quot;http://myskitch.com/adelcambre/dock-20071107-153539.jpg/preview.jpg&quot; alt=&quot;Dock&quot;/&gt;&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; style=&quot;font-family:Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial;font-size:10px;color:#808080;&quot; target=&quot;_blank&quot; href=&quot;http://plasq.com/skitch&quot;&gt;Uploaded with Skitch!&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I figured that there must be a way to grab that link from the document itself on the Google Maps site.  I whipped out my Javascript book and got it working in short order.&lt;/p&gt;
&lt;p&gt;The code looks like&lt;/p&gt;
&lt;pre&gt;
javascript:void(location.host=='maps.google.com'?location.href='http://rubyurl.com/rubyurl/remote?website_url='+encodeURIComponent(document.getElementById('link').href):location.href='http://rubyurl.com/rubyurl/remote?website_url='+encodeURIComponent(location.href))
&lt;/pre&gt;
&lt;p&gt;Which is ugly as it&amp;#8217;s a bookmarklet.  Drag this to your bookmark bar if you want to start using it: &lt;a rel=&quot;nofollow&quot;&gt;RubyURL this Link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You don&amp;#8217;t even need to click the &amp;#8220;Link to this page&amp;#8221; link on google maps before using it, it grabs it right out of the document.  I will try to get this added to the RubyURL site as the official bookmarklet as well.&lt;/p&gt;
&lt;p&gt;Are there other sites that don&amp;#8217;t work well with the bookmarklet? Let me know in the comments!&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/11/07/better-rubyurl-bookmarklet</guid>
         <pubDate>Wed, 07 Nov 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Masochistic Connection Proxy with Observers</title>
         <link>http://andy.delcambre.com/2007/11/15/masochistic-connection-proxy-with-observers.html</link>
         <description>&lt;p&gt;On a recent project here at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://planetargon.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt;&lt;/a&gt; we needed to use ActiveRecord with a master and slave database setup. We started out using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://revolutiononrails.blogspot.com/2007/04/plugin-release-actsasreadonlyable.html&quot;&gt;ActsAsReadonlyable&lt;/a&gt; but quickly ran into some nasty performance issues.  After asking around a bit, the code ninjas over at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://activereload.net/&quot;&gt;ActiveReload&lt;/a&gt; mentioned that they had a plugin for splitting the ActiveRecord reads and writes to separate databases called &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ar-code.svn.engineyard.com/plugins/masochism/README&quot;&gt;Masochism&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This worked much better than ActsAsReadonlyable from a performance perspective but there was an issue with some of our observers.  Specifically observers that had conditionals which were contigent on the update that triggered the observer.  Take the following (somewhat contrived) example:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Beehive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Base&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;has_many&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:bees&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Bee&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Base&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;belongs_to&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:beehive&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Bee&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Observer&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;after_destroy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;beehive&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;destroy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;beehive&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;beehive&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty?&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, destroy the behive when the last bee in the beehive is destroyed.  The problem is that the beehive will only be destroyed if all of the bees have been destroyed but there is a race condition when the last bee is destroyed.  The database replication has to push the &lt;span class=&quot;caps&quot;&gt;DELETE&lt;/span&gt; down to the slave database before the observer gets run (which basically never happens).&lt;/p&gt;
&lt;p&gt;The first solution was to simply wrap the observer in a with_master call (with_master is a method on the connection object in masochism to perform any database queries against the master database).  It looked something like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Bee&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Observer&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;after_destroy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;Comment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;with_master&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;beehive&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;destroy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;beehive&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bees&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty?&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This solved the problem perfectly, the conditional now happens against the master database and will pass at all the right times.  But it is a bit ugly to have the with_master call in the observer, the observer shouldn&amp;#8217;t care whether it is using masochism or not.  Also, we are only using masochism in production, so this breaks on our development copies (the connection only has the with_master method in production).&lt;/p&gt;
&lt;p&gt;So after a bit of thinking, and a bit of hacking, I just added the with_master call to ActiveRecord::Observer itself when the plugin is loaded.  Here is the patch I used:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;gh&quot;&gt;Index: vendor/plugins/masochism/lib/active_reload/connection_proxy.rb&lt;/span&gt;
&lt;span class=&quot;gh&quot;&gt;===================================================================&lt;/span&gt;
&lt;span class=&quot;gd&quot;&gt;--- vendor/plugins/masochism/lib/active_reload/connection_proxy.rb	(revision 2039)&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+++ vendor/plugins/masochism/lib/active_reload/connection_proxy.rb	(working copy)&lt;/span&gt;
&lt;span class=&quot;gu&quot;&gt;@@ -20,6 +20,10 @@&lt;/span&gt;
     def self.setup_for(master, slave = nil)
       slave ||= ActiveRecord::Base
       slave.send :include, ActiveRecordConnectionMethods
&lt;span class=&quot;gi&quot;&gt;+      # extend observer to always use the master database&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      # observers only get triggered on writes, so shouldn&amp;#39;t be a performance hit&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      # removes a race condition if you are using conditionals in the observer&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      ActiveRecord::Observer.send :include, ActiveReload::ObserverExtensions&lt;/span&gt;
       ActiveRecord::Base.active_connections[slave.name] = new(master, slave)
     end
 
&lt;span class=&quot;gu&quot;&gt;@@ -60,4 +64,21 @@&lt;/span&gt;
       connection.with_master { reload_without_master }
     end
   end
&lt;span class=&quot;gi&quot;&gt;+  &lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+  module ObserverExtensions&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+    def self.included(base)&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      base.alias_method_chain :update, :masterdb&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+    end&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+    &lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+    # Send observed_method(object) if the method exists.&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+    def update_with_masterdb(observed_method, object) #:nodoc:&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      if object.class.connection.respond_to?(:with_master)&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+        object.class.connection.with_master do&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+          update_without_masterdb(observed_method, object)&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+        end&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      else&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+        update_without_masterdb(observed_method, object)&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+      end&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+    end&lt;/span&gt;
&lt;span class=&quot;gi&quot;&gt;+  end&lt;/span&gt;
 end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There shouldn&amp;#8217;t be much performance hit as observers should only be run during a database write (i.e. hitting the master database) anyway.&lt;/p&gt;
&lt;p&gt;I am planning on sending it over to Rick Olson and maybe it will be included in masochism itself soon.&lt;/p&gt;
&lt;p&gt;Are you using masochism? Are there other issues with observers? Is there a better way to do this (one thing I thought of is to just run observers in a transaction which masochism runs against the master_db as well)? Let me know in the comments.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/11/15/masochistic-connection-proxy-with-observers</guid>
         <pubDate>Thu, 15 Nov 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Google vs. Yahoo</title>
         <link>http://andy.delcambre.com/2007/12/17/google-vs-yahoo.html</link>
         <description>&lt;p&gt;I have recently had to sign up for both a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/apis/maps/&quot;&gt;Google&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://developer.yahoo.com/maps/ajax/index.html&quot;&gt;Yahoo!&lt;/a&gt; maps api key.  There is a world of difference between the two sign up processes.  First we have yahoo.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://myskitch.com/adelcambre/register_your_application_on_the_yahoo__developer_network-20071217-144042/&quot;&gt;&lt;img src=&quot;http://myskitch.com/adelcambre/register_your_application_on_the_yahoo__developer_network-20071217-144042.jpg/preview.jpg&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are &lt;strong&gt;eight&lt;/strong&gt; required form fields.  Some of which I don&amp;#8217;t even necessarily have an answer for.  Product name? Description? I want to just play with some maps!&lt;/p&gt;
&lt;p&gt;Then there is the authentication section, apparently connect to the non-authentication web services with the generic option,  is maps non-authenticated? Kinda hard to know.  And there is another question about access scopes which to the uninitiated seems to be asking the same thing as authentication.  Over all very confusing (and I consider myself to be fairly technical).&lt;/p&gt;
&lt;p&gt;Now, compare to the Google Maps Api Key form.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://myskitch.com/adelcambre/sign_up_for_the_google_maps_api_-_google_maps_api_-_google_code-20071217-144302.jpg&quot;&gt;&lt;img src=&quot;http://myskitch.com/adelcambre/sign_up_for_the_google_maps_api_-_google_maps_api_-_google_code-20071217-144302.jpg/preview.jpg&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We have two fields, and one is a checkbox agreeing to the terms of service.  Couldn&amp;#8217;t get any simpler.&lt;/p&gt;
&lt;p&gt;What is the lesson here? Only ask for as much information as you absolutely need to allow the user to start using your application.  If I wasn&amp;#8217;t using Yahoo! Maps for a client project, I would have given up and gone back to Google.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/12/17/google-vs-yahoo</guid>
         <pubDate>Mon, 17 Dec 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Macworld '08 Predictions</title>
         <link>http://andy.delcambre.com/2007/12/18/macworld-08-predictions.html</link>
         <description>&lt;p&gt;I was chatting with some friends today about Macworld 2008, and we discussed what we were expecting to see.  I thought I would put my predictions here for posterity&amp;#8217;s sake.&lt;/p&gt;
&lt;p&gt;So here we go, in no particular order:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;iPhone &lt;span class=&quot;caps&quot;&gt;SDK&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Mentioned, but not released&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;No new iPhone hardware mentioned (new hardware with 3g and gps announced at wwdc, released in October)&lt;br /&gt;
&lt;b&gt;Correct (no new hardware, software update though)&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;No new ipods&lt;br /&gt;
&lt;b&gt;Correct&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;Refresh to the whole portable line, speed bumps, led backlit displays&lt;br /&gt;
&lt;b&gt;Wrong (not yet anyway)&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;Ultra portable macbook, 13&amp;quot; screen, 3 lbs, &lt;span class=&quot;caps&quot;&gt;SSD&lt;/span&gt; (flash disk drive), led backlit display, no optical drive, base $1600, top of the line $2000&lt;br /&gt;
&lt;b&gt;Pretty damn accurate, although way off on the top end price. &lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;Mac Pro refesh, maybe all new look&lt;br /&gt;
&lt;b&gt;Refresh a week before, same look&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;Appletv refresh&lt;br /&gt;
&lt;b&gt;Correct&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do you think? I am drooling over the ultra portable, really hoping to see that one.  Also very curious what the iPhone sdk will be like.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Updated with results, these predictions were made on December 18th&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;What did I miss?&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;iTunes movie rentals&lt;/li&gt;
	&lt;li&gt;Time Capsule&lt;/li&gt;
&lt;/ul&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2007/12/18/macworld-08-predictions</guid>
         <pubDate>Tue, 18 Dec 2007 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Automated Time Tracking using git</title>
         <link>http://andy.delcambre.com/2008/02/06/git-time-tracking.html</link>
         <description>&lt;p&gt;My git workflow usually involves creating a branch for the feature I am working on (or just a bugfix branch) making commits there until the feature is done, then merging back into my master branch and pushing to our subversion server.  I started thinking about the fact that if I could simply keep track of all of the time that I spent in the branch it would be a fairly good approximation of the time spent working on the feature.  I did successfully implement this and it works fairly well with a few small exceptions.&lt;/p&gt;
&lt;p&gt;First, I am using a post-checkout hook in git which is not implemented until version 1.5.4 which is currently at rc4.  Luckily the git-checkout script is just a shell script so it was trivial to backport support for the hook.  Second, I am using zsh to implement some of the features, and I am not sure if similar things could be accomplished with bash or tcsh.&lt;/p&gt;
&lt;p&gt;This technique has three main parts: recording when you enter and leave a branch, calculating the total time spent in the branch, and a system to automatically switch you out of a branch after a few minutes of inactivity.&lt;/p&gt;
&lt;p&gt;First the time logging feature.  This is the part that uses the post-checkout hook to function.  Basically, every time you do a checkout of a branch, the post-checkout script records a timestamp in a log file for the branch you are entering and the branch you are leaving.  After a while you build up a log of timestamps in the file.  It looks something like this (I standardised again the ISO8601 date format).  The post-checkout script is available &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fido.cat.pdx.edu/blog_files/post-checkout.sh&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;
in 2008-01-25T12:36:36-08:00
out 2008-01-25T12:42:43-08:00
in 2008-01-25T13:20:41-08:00
out 2008-01-25T13:29:57-08:00
in 2008-01-25T15:13:47-08:00
out 2008-01-25T15:15:08-08:00
in 2008-01-25T16:56:03-08:00
out 2008-01-25T16:58:09-08:00
&lt;/pre&gt;
&lt;p&gt;Now that you have this time log of the time you spent in the branch, you can calculate how long the feature took you to implement.  I used a commit-msg hook to do this.  This adds the amount of time the commit took you directly to the commit message.  I created this as a script in /usr/local/bin called git-time so you can also run it manually, (the hook is just a symlink).  The script also reset the time log file (with just one entry for the current time).  The script is a available &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fido.cat.pdx.edu/blog_files/commit-msg.sh&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you commit it adds the time to the commit message:&lt;/p&gt;
&lt;pre&gt;
commit 7e739f01377806be8b93ef181fc99c54058bcd89
Author: Andy Delcambre &amp;lt;andy.delcambre@planetargon.com&amp;gt;
Date:   Wed Feb 6 14:17:57 2008 -0800

    test commit
    This commit took 1.35 hours
&lt;/pre&gt;
&lt;p&gt;The last piece ensures that you don&amp;#8217;t simply keep the branch checked out all the time and that you switch back to master when you aren&amp;#8217;t actually working in the branch.  It uses the zsh feature of having a shell &lt;span class=&quot;caps&quot;&gt;TMOUT&lt;/span&gt; (which triggers a &lt;span class=&quot;caps&quot;&gt;SIGALRM&lt;/span&gt; after the number of seconds specified elapsed), then trapping the alarm and switching to the master branch if you are in a git repository and not already in the master branch.&lt;/p&gt;
&lt;p&gt;Here is what you should add to your .zshrc:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;TRAPALRM &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;# Used to do time tracking for git commits&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt; -d .git &lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;git branch &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; grep &lt;span class=&quot;s1&quot;&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; awk &lt;span class=&quot;s1&quot;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; !&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;master&amp;#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
			git co master
		&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TMOUT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;300&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It seems to work fairly well, but there are a few issues.  First, the time log can get screwed up: you can put your laptop to sleep while still in a branch.  This results in having a greatly exagerated time in the commit message.  I always check with git log to see if the time estimate is approximately accurate, and just reset and recommit (with a greatly under-exaggerated time).  There is also always the extra few minutes of work that get done after doing the actual commit (resolving the todo item, merging and committing to the subversion server, etc) so I usually add a bit.  But overall it works fairly well for me.  Are the other tools that you use to help you with tracking your time?&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/02/06/git-time-tracking</guid>
         <pubDate>Wed, 06 Feb 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Dinner with Matz</title>
         <link>http://andy.delcambre.com/2008/02/25/dinner-with-matz.html</link>
         <description>&lt;p&gt;Last Thursday (February 21, 2008), I attended a dinner sponsored by the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.opentechcenter.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OTBC&lt;/span&gt;&lt;/a&gt;. The dinner was a chance for people in the open source community in Portland to meet a delegation of open source advocates from Shimane Prefecture in Japan, specifically Matsue.&lt;/p&gt;
&lt;p&gt;Included in the delegation were professors from the university in Matsue, representatives from Hitachi and Sun Microsystems, and members of the open source community in Japan including the former head of the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; user&amp;#8217;s group in Japan.&lt;/p&gt;
&lt;p&gt;The highlight of the dinner was Yukihiro &amp;#8220;Matz&amp;#8221; Matsumoto, the creator of the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; programming language.  There were about 50 people in attendance at the dinner, but I was very lucky in that I was able to sit at the same table as Matz.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://flickr.com/photos/strangecontext/1850262566/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2111/1850262566_fb4cf68fb6.jpg?v=0&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It was very cool to have such amazing access to Matz at this small dinner.  We had a good mix of people and backgrounds at our table.  Other than Matz and myself, there was Monty Williams from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gemstone.com/&quot;&gt;Gemstone&lt;/a&gt; and his wife, Ben Matasar from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://dabbledb.com/&quot;&gt;DabbleDB&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://dyepot-teapot.com/&quot;&gt;Audrey Eschright&lt;/a&gt; a local community evangelist and member of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pdxruby.org/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PDX&lt;/span&gt;.rb&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://orderofr.net/michael/&quot;&gt;Michael Bunsen&lt;/a&gt; another &lt;span class=&quot;caps&quot;&gt;PDX&lt;/span&gt;.rb member and creator of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://urbanedibles.org/&quot;&gt;Urban Edibles&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hook.org/&quot;&gt;Anselm Hook&lt;/a&gt; from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://meedan.org/&quot;&gt;Meedan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This group allowed for some interesting discussions, we had Monty and Ben who are both smalltalk guys giving some insight into that side of the current sphere of programming.  This included some discussions of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.seaside.st/&quot;&gt;Seaside&lt;/a&gt; the smalltalk web framework.&lt;/p&gt;
&lt;p&gt;I had the chance to ask Matz some questions that I have been curious about for some time.  Primarily involving the seeming current major transition period for Ruby where we are going from one interpreter which Matz wrote himself, at least 4 or 5 different virtual machines (old &lt;span class=&quot;caps&quot;&gt;MRI&lt;/span&gt;, new &lt;span class=&quot;caps&quot;&gt;MRI&lt;/span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.atdot.net/yarv/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;YARV&lt;/span&gt;&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ironruby.net/&quot;&gt;IronRuby&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jruby.codehaus.org/&quot;&gt;jRuby&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rubini.us/&quot;&gt;Rubinius&lt;/a&gt;), most of which Matz hasn&amp;#8217;t worked on.  For the first time since Ruby was started, the mainline virtual machine was primarily not written by Matz.  It was very interesting to see how he feels about this transition.&lt;/p&gt;
&lt;p&gt;Overall the evening was a ton of fun. Lots of excellent discussions, and some amazing access to the creator my favorite programming language on the planet.&lt;/p&gt;
&lt;p&gt;Was anybody else there?  What was your experience like?  Also, if I forgot anybody who was sitting at our table, please post a comment.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/02/25/dinner-with-matz</guid>
         <pubDate>Mon, 25 Feb 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Git SVN Workflow</title>
         <link>http://andy.delcambre.com/2008/03/04/git-svn-workflow.html</link>
         <description>&lt;p&gt;I know, I know, this is blog post number one million about Git and git-svn.  This is primarily for my co-workers who are wanting to switch to git for our &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt; based projects like I have.  (If I get them with git-svn, next we can start hosting with git directly, Muhahaha!)&lt;/p&gt;
&lt;p&gt;First, a bit of background.  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://git.or.cz/&quot;&gt;Git&lt;/a&gt; was written by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Linus_Torvalds&quot;&gt;Linus Torvalds&lt;/a&gt; specifically for use by the linux kernel team.  He had very specific ideas about how the version control system should work, and none of the offerings at that time satisfied his needs.  Git is designed to be distributed (every clone is a full fledged git repository) and very very fast.  It is also designed to be very easy not only to branch, but also to merge.&lt;/p&gt;
&lt;p&gt;Disclaimer: This is not intended to be the &amp;#8220;correct&amp;#8221; way to use git + svn, only the way that I use it.  That said, here we go.&lt;/p&gt;
&lt;p&gt;First, we assume that you have a subversion repository at &lt;code&gt;http://example.com/svn/my_proj&lt;/code&gt;.  You will need to create the git repo setup to pull from this repo.&lt;/p&gt;
&lt;pre&gt;
git svn init -s http://example.com/svn/my_proj
&lt;/pre&gt;
&lt;p&gt;This will initialize the git repo for pulling from svn.  The &lt;code&gt;-s&lt;/code&gt; indicates that you have a &amp;#8220;standard&amp;#8221; setup for your subversion repository.  I.e. &lt;code&gt;trunk/&lt;/code&gt; &lt;code&gt;branches/&lt;/code&gt; and &lt;code&gt;tags/&lt;/code&gt;.  This command will not yet import anything from subversion.&lt;/p&gt;
&lt;pre&gt;
git svn fetch
&lt;/pre&gt;
&lt;p&gt;This command will fetch all revisions from subversion that you have not yet received.  The first time you run this could take quite a while.  There are options to only fetch some of the revisions, but I prefer to fetch the whole history the first time.  This way blame and log show the whole thing.&lt;/p&gt;
&lt;p&gt;Now you will have both the whole revision history for trunk, but also all of the branches on the svn server.  You can see all of the branches with&lt;/p&gt;
&lt;pre&gt;
git branch -a
&lt;/pre&gt;
&lt;p&gt;This will show all branches, including the remote branches.&lt;/p&gt;
&lt;p&gt;Now that you have the entire subversion history stored locally, it can be useful to repack the repository.  Right now, each revision has it&amp;#8217;s own file, this command will pack those into bigger &amp;#8220;pack&amp;#8221; files. This will make the repository smaller, but also with many many fewer files&lt;/p&gt;
&lt;pre&gt;
git repack -d
&lt;/pre&gt;
&lt;p&gt;Next you will want to do some actual work on the repository.  It is not recommended to make changes in your master branch, so lets make a branch for the new feature.&lt;/p&gt;
&lt;pre&gt;
git checkout -b new_feature
&lt;/pre&gt;
&lt;p&gt;This will make a new branch (the &lt;code&gt;-b&lt;/code&gt;) and switch to it (checkout).  Once you have your new branch you make a bunch of changes and add a new file or two.  You need to add any new files so git knows to track them.  You can do this with:&lt;/p&gt;
&lt;pre&gt;
git add path/to/new_file
&lt;/pre&gt;
&lt;p&gt;Now, once you are happy with this new feature and have it tested. You can commit it to git.  This is one place where git diverges from subversion. Files you have changed aren&amp;#8217;t automatically staged for committing.  So right now if you try to commit, you will commit the file that you added in the above command, but nothing you changed (adding a file stages it).  So you have two options at this point, you can manually stage each file you want to commit, you will want to do it this way if you don&amp;#8217;t want to commit all the changes you have made. That will look something like&lt;/p&gt;
&lt;pre&gt;
git add path/to/edited_file
git add another/edited/file
git commit -m &quot;commit message&quot;
&lt;/pre&gt;
&lt;p&gt;If you want to commit all of the changes you have made, and you have added all of the new files, you can automatically commit all changes, no need to stage.  This is how I normally do things. That looks like:&lt;/p&gt;
&lt;pre&gt;
git commit -a -m &quot;commit message&quot;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-a&lt;/code&gt; tells git to commit all staged and unstaged changes.&lt;/p&gt;
&lt;p&gt;So now you have these commits in git but they have not been pushed to subversion yet.  You will need to get this commit into master first.  You need to checkout the master repo, then merge back with the new feature.&lt;/p&gt;
&lt;pre&gt;
git checkout master
git merge new_feature
&lt;/pre&gt;
&lt;p&gt;It is likely this merge will work without any conflicts, but if not you will need to fix the conflicts then commit.&lt;/p&gt;
&lt;p&gt;Once you have the commit back in the master repo, you will need to resync the master branch to the svn repo to make sure you don&amp;#8217;t commit conflicts.&lt;/p&gt;
&lt;pre&gt;
git svn rebase
&lt;/pre&gt;
&lt;p&gt;This will rebase the master branch to the subversion trunk.  Next, you need to push the commit to subversion.&lt;/p&gt;
&lt;pre&gt;
git svn dcommit
&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s it!  That is the basic circle between an initial checkout back to a commit.  I will be going through the different git commands in the next few weeks to go over how they work in more detail.  Here are the things I am planning on covering:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot;&gt;git reset&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;git rebase&lt;/li&gt;
	&lt;li&gt;git log&lt;/li&gt;
	&lt;li&gt;git stash&lt;/li&gt;
	&lt;li&gt;git merge&lt;/li&gt;
	&lt;li&gt;git mergetool&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Did I miss anything major? Let me know how you use git with svn in the comments.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/03/04/git-svn-workflow</guid>
         <pubDate>Tue, 04 Mar 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>git reset In depth</title>
         <link>http://andy.delcambre.com/2008/03/12/git-reset-in-depth.html</link>
         <description>&lt;p&gt;This is the second part of a series of articles on Git.  This post is primarily going to focus on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.kernel.org/pub/software/scm/git/docs/git-reset.html&quot;&gt;&lt;code&gt;git reset&lt;/code&gt;&lt;/a&gt; command and how to track multiple remote subversion branches.&lt;/p&gt;
&lt;p&gt;First, a bit of background on &lt;code&gt;git reset&lt;/code&gt;.  In my opinion it is one of the cooler git commands that I use regularly, it&amp;#8217;s function is a bit odd, there is no equivalent in subversion to compare to.  What &lt;code&gt;git reset&lt;/code&gt; does at a very high level is move a tag in the git graph that makes up the revision history.&lt;/p&gt;
&lt;p&gt;So lets take the following sequence of commands as an example.&lt;/p&gt;
&lt;pre&gt;
git init
touch README
git add README
git commit -a -m &quot;initial import&quot;
git checkout -b new_branch
vi README
git commit -a -m &quot;modified README&quot;
git checkout master
vi README
git commit -a -m &quot;updated README&quot;
touch blah
git add blah
git commit -a -m &quot;added blah&quot;
&lt;/pre&gt;
&lt;p&gt;So we create a git repository, make a commit, branch from the commit.  Make a change in the branch, and make two changes back in master.  The git directed graph now looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fido.cat.pdx.edu/git.png&quot;&gt;&lt;img src=&quot;http://fido.cat.pdx.edu/git.png&quot; width=&quot;622&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can see that there are two branches. Right now we are in the master branch so the current &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; tag points to the &lt;code&gt;31281c1&lt;/code&gt; commit.  (This is important, &lt;code&gt;git reset&lt;/code&gt; moves the current &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt;.)&lt;/p&gt;
&lt;pre&gt;
adelcambre@hiro:/tmp/blah% cat .git/refs/heads/master
31281c194e505bf000f1d67c07b76255ac9370e9
adelcambre@hiro:/tmp/blah% cat .git/refs/heads/new_branch
0b6f5c586c257820f2ce94981f71a860107184ed
&lt;/pre&gt;
&lt;p&gt;So now, lets say we want to make master follow the new_branch branch.  (This is a bit contrived, bear with me.)  So you use &lt;code&gt;git reset --hard new_branch&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
adelcambre@hiro:/tmp/blah% git reset --hard new_branch
HEAD is now at 0b6f5c5... modified README
&lt;/pre&gt;
&lt;p&gt;So the current &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; in the master branch is pointing at the same commit as the new_branch branch.  Let&amp;#8217;s make a commit in each branch and see what happens.&lt;/p&gt;
&lt;pre&gt;
vi README
git commit -a -m &quot;changed README&quot;
git checkout new_branch
touch new_file
git add new_file
git commit -a -m &quot;added new file&quot;
&lt;/pre&gt;
&lt;p&gt;Which gets us this graph:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fido.cat.pdx.edu/git2.png&quot;&gt;&lt;img src=&quot;http://fido.cat.pdx.edu/git2.png&quot; width=&quot;622&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, you basically just moved the master branch to be a branch of the new_branch branch.  But what happened to those commits against the old master.  Well, they aren&amp;#8217;t reachable, so would get garbage collected if you did a repack (more on that in a later edition).  But for now, they are still there, just not reachable from a tag.  We happen to know the commit-id of the old master branch, but if you didn&amp;#8217;t, you could use &lt;code&gt;git lost-found&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
adelcambre@hiro:/tmp/blah% git lost-found
[31281c194e505bf000f1d67c07b76255ac9370e9] added blah
&lt;/pre&gt;
&lt;p&gt;So it found the old master branch! Let&amp;#8217;s merge our current master back into the new_branch, and move master back to the old master.&lt;/p&gt;
&lt;pre&gt;
git checkout new_branch
git merge master
git checkout master
git reset --hard 31281c1
&lt;/pre&gt;
&lt;p&gt;Which results in the graph looking like:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://fido.cat.pdx.edu/git3.png&quot;&gt;&lt;img src=&quot;http://fido.cat.pdx.edu/git3.png&quot; width=&quot;622&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So you can see that we recovered the unreachable commit, and merged back the changes we made on the master branch while it followed the new_branch.&lt;/p&gt;
&lt;p&gt;Now, there are no unreachable commits, &lt;code&gt;git lost-found&lt;/code&gt; doesn&amp;#8217;t return anything, and we are good to go.&lt;/p&gt;
&lt;h1&gt;git reset options&lt;/h1&gt;
&lt;p&gt;There are three main options to use with &lt;code&gt;git reset&lt;/code&gt;: &lt;code&gt;--hard&lt;/code&gt;, &lt;code&gt;--soft&lt;/code&gt; and &lt;code&gt;--mixed&lt;/code&gt;.  These affect what get&amp;#8217;s reset in addition to the &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; pointer when you reset.&lt;/p&gt;
&lt;p&gt;First, &lt;code&gt;--hard&lt;/code&gt; resets everything.  Your current directory would be exactly as it would if you had been following that branch all along.  The working directory and the index are changed to that commit.  This is the version that I use most often.  This is what we used in the above examples.  It just says make the current &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; and working directory exactly like commit &amp;#8220;x&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Next, the complete opposite, &amp;#8212;soft, does not reset the working tree nor the index.  It &lt;strong&gt;only&lt;/strong&gt; moves the &lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt; pointer.  This leaves your current state with any changes different than the commit you are switching to in place in your directory, and &amp;#8220;staged&amp;#8221; for committing.  I use this for only every once in a while, and mostly for correcting a commit message.  If you make a commit locally but haven&amp;#8217;t pushed the commit to the git server or subversion server, you can reset to the previous commit, and recommit with a good commit message. This would look something like:&lt;/p&gt;
&lt;pre&gt;
touch test
git add test
git commit -m &quot;bad commit&quot;
git reset --soft HEAD^
git commit -m &quot;good commit&quot;
&lt;/pre&gt;
&lt;p&gt;So, because &lt;code&gt;git reset --soft&lt;/code&gt; doesn&amp;#8217;t reset the index nor the working tree, you can just re-commit without having to add anything.&lt;/p&gt;
&lt;p&gt;Finally, &lt;code&gt;--mixed&lt;/code&gt; resets the index, but not the working tree.  So the changes are all still there, but are &amp;#8220;unstaged&amp;#8221; and would need to be &lt;code&gt;git add&lt;/code&gt;&amp;#8217;ed or &lt;code&gt;git commit -a&lt;/code&gt;.   I use this sometimes if I committed more than I meant to with &lt;code&gt;git commit -a&lt;/code&gt;, I can back out the commit with &lt;code&gt;git reset --mixed&lt;/code&gt;, add the things that I want to commit and just commit those.&lt;/p&gt;
&lt;p&gt;The place that I really use &lt;code&gt;git reset&lt;/code&gt; a fair amount is with remote branches.  If I have a branch that I want to track a specific remote subversion branch, I can simply &lt;code&gt;git reset --hard svn_branch_name&lt;/code&gt; and then &lt;code&gt;git svn&lt;/code&gt; does the right thing.  I have seen issues where for some reason the git master branch ended up following a subversion tag rather than trunk.  A quick &lt;code&gt;git reset --hard trunk&lt;/code&gt; cleaned everything up.&lt;/p&gt;
&lt;p&gt;I really started liking this command once I realized what was happening.  You really need to be aware of the nature of git&amp;#8217;s directed graph to take full advantage of &lt;code&gt;git reset&lt;/code&gt;, but once you do, you are really able to exploit git quite a lot further.&lt;/p&gt;
&lt;p&gt;This is part of a series on git, other articles in the series are:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot;&gt;Git &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;git rebase&lt;/li&gt;
	&lt;li&gt;git log&lt;/li&gt;
	&lt;li&gt;git stash&lt;/li&gt;
	&lt;li&gt;git merge&lt;/li&gt;
	&lt;li&gt;git mergetool&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do you have any git reset success stories? Horror stories? Lost work? Saved work?  Let me know in the comments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Changed the terminology to only refer to the current branch as &amp;#8220;&lt;span class=&quot;caps&quot;&gt;HEAD&lt;/span&gt;&amp;#8221;, per comment from Bob.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/03/12/git-reset-in-depth</guid>
         <pubDate>Wed, 12 Mar 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Hanselminutes Git Podcast</title>
         <link>http://andy.delcambre.com/2008/04/11/hanselminutes-git-podcast.html</link>
         <description>&lt;p&gt;A few of us from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://planetargon.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PLANET&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ARGON&lt;/span&gt;&lt;/a&gt; were interviewed for a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.hanselminutes.com/default.aspx?showID=126&quot;&gt;podcast&lt;/a&gt; by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.hanselman.com/&quot;&gt;Scott Hanselman&lt;/a&gt; earlier this week primarily talking about our use of Git and git-svn.  Planet Argon is currently in the process of moving from Subversion to git.  Most of us are using git-svn internally with our central subversion server for now but we are going to be moving to using Git for our central server soon.  In preparing for the podcast I thought a lot about what makes git special. I came up with three major reasons.&lt;/p&gt;
&lt;h1&gt;Branching and Merging&lt;/h1&gt;
&lt;p&gt;This is my personal number one favorite feature about git.  In subversion branching is very easy.  It does a shallow copy and is very fast.  But merging things back together is a major pain in the butt.  You have to keep track of the revision that you branched from just so you can merge them back together.&lt;/p&gt;
&lt;p&gt;In git all you do is create a new branch, work as long or as much as you like, then git merge new_branch to merge the changes back into master.  There is no need to keep track of  revision numbers and the default git merge strategy tends to only have conflicts where there are two changes to the same file in the same place.&lt;/p&gt;
&lt;h1&gt;Everybody can have their own repo&lt;/h1&gt;
&lt;p&gt;With subversion or other centralized tools, there is only one main server for each project.  I can check the code out on my computer, but I am still tied to that central server for updates.  I need to have commit rights to that server to publish my changes.  With git, rather than just checking out the code from your repository I can just clone it to my own repo.  I will probably have at least one clone on my development computer. But I can also have a complete clone on a server of my own.&lt;/p&gt;
&lt;p&gt;I can then make all the radical changes I want and people can pull from me instead of you to get the new stuff.  I can then send you an email requesting you to pull from my repo merging my new changes back into the &amp;#8220;main&amp;#8221; repository.&lt;/p&gt;
&lt;p&gt;This is a feature that &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com&quot;&gt;github&lt;/a&gt; really capitalizes on.  The built in fork and pull request features are truly top notch.&lt;/p&gt;
&lt;h1&gt;Offline Commits&lt;/h1&gt;
&lt;p&gt;As your clone is a full repository just like any other, you can commit directly to it without the need for any central server.  This is probably the feature of distributed version control system&amp;#8217;s you have heard of the most.  The proverbial commit from an airplane.  Although it gets repeated a lot, this is actually a very cool feature, and not just for the offline commit.&lt;/p&gt;
&lt;p&gt;This all gives you the ability to make commits you might not otherwise make to a central server so as to not clutter up the revision history with your playing around.  You can feel free to try things out, commit them, back up to a previous commit, without the central server ever knowing about it.&lt;/p&gt;
&lt;p&gt;Thanks again to Scott Hanselman for this opportunity to chat with him. I really enjoyed doing the interview.  I think we talked about some good stuff and I am looking forward to listening to it when it gets posted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The podcast has been posted.  Take a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.hanselminutes.com/default.aspx?showID=126&quot;&gt;listen&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Also, I just forked &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/rails/rails&quot;&gt;rails&lt;/a&gt; on github!&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone git://github.com/rails/rails.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can read my other articles about git here:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot;&gt;Git &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a rel=&quot;nofollow&quot;&gt;git reset&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;git rebase&lt;/li&gt;
	&lt;li&gt;git log&lt;/li&gt;
	&lt;li&gt;git stash&lt;/li&gt;
	&lt;li&gt;git merge&lt;/li&gt;
	&lt;li&gt;git mergetool&lt;/li&gt;
&lt;/ul&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/04/11/hanselminutes-git-podcast</guid>
         <pubDate>Fri, 11 Apr 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Top 10 Places for Good Beer in Portland</title>
         <link>http://andy.delcambre.com/2008/05/29/beer-in-portland.html</link>
         <description>&lt;p&gt;If anyone is in Portland for RailsConf/Cabooseconf (or any other reason) and wants somewhere to grab some fantastic local beer, the following is a list of my top picks.&lt;/p&gt;
&lt;p&gt;1. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://pdxgreendragon.com/&quot;&gt;The Green Dragon&lt;/a&gt;&lt;br /&gt;
Lots of fantastic beers on tap, pretty decent food I hear but I have never eaten there.&lt;/p&gt;
&lt;p&gt;2. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.hopworksbeer.com/&quot; title=&quot;aka The HUB&quot;&gt;Hopworks Urban Brewery&lt;/a&gt;&lt;br /&gt;
Serves locally brewed hopworks beer. Have had the beer lots of times, haven’t been out to the actual pub yet but have been meaning to make the trek.&lt;/p&gt;
&lt;p&gt;3. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://beeradvocate.com/beer/profile/7893&quot;&gt;Produce Row&lt;/a&gt; (no website of their own apparently)&lt;br /&gt;
Usually has really good beer on tap and an excellent menu. Good atmosphere as well, across from Tazo so you can often smell them making Tea from the back patio.&lt;/p&gt;
&lt;p&gt;4. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.baileystaproom.com/&quot;&gt;Baileys Taproom&lt;/a&gt;&lt;br /&gt;
Twenty taps of fantastic beers (usually including a few burly IPA’s, one Nitro tap, and a couple of barleywines).&lt;br /&gt;
Also has an extensive bottle menu and wine I think. No food except Cheese and Chocolate but my favorite place to get a beer in Portland.  They also have a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://baileystaproom.wordpress.com&quot;&gt;blog&lt;/a&gt; and are baileystaproom on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/baileystaproom&quot;&gt;twitter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://beeradvocate.com/beer/profile/9685&quot;&gt;Amnesia Brewing&lt;/a&gt;&lt;br /&gt;
Serves their own beer, the Desolation &lt;span class=&quot;caps&quot;&gt;IPA&lt;/span&gt; is fantastic. The food selection is rather limited, they just have a grill out front that they throw sausages and a few other things on. I always just get a very tasty braut. They have veggie brauts as well.&lt;/p&gt;
&lt;p&gt;6. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.newoldlompoc.com/&quot;&gt;Lompoc Bars&lt;/a&gt;&lt;br /&gt;
These guys used to be one of my favorites but I feel like they are rapidly turning into the next McMenamins (Lots of locations, mediocre food, beer not as good as it used to be). Still not bad, I like the original and the 5th quadrant.&lt;/p&gt;
&lt;p&gt;7. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.bridgeportbrew.com/&quot;&gt;Bridgeport&lt;/a&gt;&lt;br /&gt;
The local big brewery in Town. Good beer, good food, fairly upscale setting.&lt;/p&gt;
&lt;p&gt;8. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.deschutesbrewery.com/&quot;&gt;Deschutes&lt;/a&gt;&lt;br /&gt;
Another big brewery located in Bend, OR. Has some good beers and the very new Portland pub is fantastic. The Black Butte Porter is probably Deschutes most famous beer.&lt;/p&gt;
&lt;p&gt;9. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.fullsailbrewing.com/&quot;&gt;Pilsner Room&lt;/a&gt;&lt;br /&gt;
Full Sail brewing is a relatively large brewery in Hood River, OR. Their Portland outpost is the Pilsner Room, on the waterfront. It is the bar attached to McCormicks and Schmicks Harborside restaurant and you can get the full dinner menu in the bar. Many of the specialty beers from Full Sail are brewed right there in the bar.&lt;/p&gt;
&lt;p&gt;10. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.barflymag.com/bar/etcetera-tavern.html&quot;&gt;Concordia&lt;/a&gt;&lt;br /&gt;
An excellent place to grab a beer in Northeast.  Haven&amp;#8217;t been there myself but I hear the food is really good as well.&lt;/p&gt;
&lt;p&gt;Any other favorites that I missed (and yes, McMenamins isn&amp;#8217;t on my list, I am not a huge fan, and there is much better beer to be had in Portland- see above).&lt;/p&gt;
&lt;p&gt;Update: Two suggestions from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://alternateidea.com/&quot;&gt;Justin Palmer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.barflymag.com/bar/life-of-riley-tavern.html&quot;&gt;Life of Riley&lt;/a&gt; in the Pearl has good beer selections and good food (Close to Cabooseconf as well).&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.laurelwoodbrewpub.com/&quot;&gt;Laurelwood Brewing&lt;/a&gt; has a few Portland Locations and makes their own beer.  The Pizza place in the Hollywood District is &amp;#8220;Family Friendly&amp;#8221; (aka over run with kids) but the one on 23rd is much better from what I have heard.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/05/29/beer-in-portland</guid>
         <pubDate>Thu, 29 May 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Engine Yard</title>
         <link>http://andy.delcambre.com/2008/07/14/engine-yard.html</link>
         <description>&lt;p style=&quot;float:right;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://engineyard.com/&quot;&gt;&lt;img src=&quot;http://engineyard.com/images/logo_ey.png&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lots of big changes in my life recently.   The biggest news is that I accepted a new position at Engine Yard.  My first day was last Monday and this has been a very full and extremely fun week.  I am really enjoying the technical side of things but the culture at this company is really what does it for me.  I have hung out with or grabbed a beer with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://danp.net/&quot;&gt;Dan Peterson&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://yehudakatz.com/&quot;&gt;Yehuda Katz&lt;/a&gt;, Leah Silber, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://atmos.org/&quot;&gt;Corey Donohoe&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://souja.net/&quot;&gt;Jayson Vantuyl&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://icanhazdowntime.org/&quot;&gt;Ed Muller&lt;/a&gt;, Lance Walley, Tom Mornini, Michelle Champlin, Nick French, Ben De Jesus and many more I am sure I am forgetting (21st Amendment will do that to you).&lt;/p&gt;
&lt;p&gt;As for my actual job at Engine Yard, I am still ramping up, but I am going to be working on internal applications using Ruby, Merb and Datamapper.  I am really excited to be using Merb and Datamapper.  It is so amazing to work down hall from the guys that invented these frameworks, a truly invaluable resource.&lt;/p&gt;
&lt;p&gt;Finally, it was just announced today that Engine Yard has closed their Series B venture capital funding. This round was for $15 million and led by New Enterprise Associates, Inc. (&lt;span class=&quot;caps&quot;&gt;NEA&lt;/span&gt;), with participation from Amazon.com and current investor Benchmark Capital.  You can see the press release &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.engineyard.com/2008/7/14/engine-yard-closes-15-million-in-series-b-financing&quot;&gt;here&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;These are very exciting time for both myself and Engine Yard.  I am looking forward to finding a permanent place to live down in the bay area and the coming adventures at Engine Yard.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/07/14/engine-yard</guid>
         <pubDate>Mon, 14 Jul 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Merbalicious</title>
         <link>http://andy.delcambre.com/2008/10/18/merbalicious.html</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://flickr.com/photos/adelcambre/2945201668/in/set-72157607970474681/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3010/2945201668_6f206cae92.jpg?v=0&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last weekend was the first ever Merb Camp (and first ever merb conference to my knowledge).  The conference itself was absolutely amazing. The talks were fantastic across the board and the venue was amazing. Those guys really bumped up the bar a bit on conference organizing.  (A barbeque 10 miles away from the conference venue, with shuttles to get us there, and the food was just coming off the grill as we arrived, amazing.)&lt;/p&gt;
&lt;p&gt;The state of merb is at a fairly good place right now.  Things have changed a lot in the past few weeks and months, but things are finally beginning to stabilize.  The &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is frozen now that rc1 is out and things are just in bug fix mode.  Merb 1.0 rc2 should be out today with support for windows with the merb stack.  The last thing that needed to be fixed was a version of do-sqlite3 that compiled on windows.&lt;/p&gt;
&lt;p&gt;It was a blast to get to work with all of the merb guys at the Merb sprint.  I was working on getting the inline documentation a bit more polished and solidifying what belongs in the public and plugin apis.  It was a fairly challenging problem, there are apis that you would have every reason to think are private but one of the plugins in more uses it.&lt;/p&gt;
&lt;p&gt;The venue for both the sprint and the conference were amazing.  The sprint was down on the beach in beautiful La Jolla.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://flickr.com/photos/adelcambre/2932375566/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3296/2932375566_86c6c0077f.jpg&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/10/18/merbalicious</guid>
         <pubDate>Sat, 18 Oct 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Growl Notifications with Irssi</title>
         <link>http://andy.delcambre.com/2008/12/06/growl-notifications-with-irssi.html</link>
         <description>&lt;p&gt;&lt;img src=&quot;http://img.skitch.com/20081206-8tpe5hw4hukgeipsdgkhjpijrw.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I am a big fan of using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gnu.org/software/screen/&quot;&gt;Screen&lt;/a&gt; + &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://irssi.org/&quot;&gt;Irssi&lt;/a&gt; on the terminal for all of my irc needs.  I have a setup I have been tweaking for years and I am not planning on switching any time soon.  The one thing that I have always missed was the ability to have notifications on my local computer.  There is the option to send growl notifications over tcp, but that would require having a public ip address for my laptop.  This is a non-starter at work and a pain at home.&lt;/p&gt;
&lt;p&gt;A friend and I came up with a technique that works pretty well.  It uses the fnotify irssi plugin, growl with the command line tools installed, and some ssh tricks.&lt;/p&gt;
&lt;p&gt;First, you will need to install the fnotify plugin for irssi.  Download it &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.leemhuis.info/files/fnotify/fnotify&quot;&gt;here&lt;/a&gt;  and put it in your &lt;code&gt;~/.irssi/scripts&lt;/code&gt; directory and call it &lt;code&gt;fnotify.pl&lt;/code&gt;.  Then, to load the script into irssi, you need to first load perl support, then load the script itself:&lt;/p&gt;
&lt;p&gt;This little script writes out to a file every time somebody /msg&amp;#8217;s you or says your name in a channel (or anything else you have a /hilight set for).  Now that we have this info in a file we can read the file and setup the notification.&lt;/p&gt;
&lt;p&gt;Next, we need to setup growl.  If you don&amp;#8217;t already have Growl installed, you can get it from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://growl.info/&quot;&gt;here&lt;/a&gt;, just download the dmg and run the installer inside.  This will install the growl preference pane where you can control the functionality. Second, you will need to install the growlnotify command line script.  This is located inside the dmg under &lt;code&gt;extras/growlnotify&lt;/code&gt;.  You should cd to that directory (&lt;code&gt;/Volumes/Growl-1.1.4/Extras/growlnotify/&lt;/code&gt;), and run &lt;code&gt;bash install.sh&lt;/code&gt;.  This will put the script into /usr/local/bin so you will need to add that to your path if you haven&amp;#8217;t done so already.&lt;/p&gt;
&lt;p&gt;Finally, we need a script to grab the notifications from the server and call growlnotify for you.  You can see the script below, it ssh&amp;#8217;s to the server and tail&amp;#8217;s the fnotify file, piping it back to the client computer and running a loop to do the actual notification.  I put this script into my ~/bin folder, but you can put it wherever you like.  Just remember where you put it for the next step.&lt;/p&gt;
&lt;p&gt;Finally, using the LocalCommand option in your ssh_config, you can have the notification script automatically run whenever you ssh to your screen server.  I also have a few other tweaks in the host section to make my life a bit easier.  The important part is the LocalCommand option and the PermitLocalCommand.  Note that I also pass -o PermitLocalCommand=no in the ssh command in the script above to prevent a fork bomb.&lt;/p&gt;
&lt;p&gt;There are a few issues with this technique. The main one that I may try to fix soon is that the command doesn&amp;#8217;t die when you close the ssh connection to the screen server.  So if you disconnect and reconnect, you have two copies of the script running (and double notifications as well). I tend to open my laptop and connect to the screen server, then leave it running until I close my laptop again so it isn&amp;#8217;t a huge deal for me.&lt;/p&gt;
&lt;p&gt;I hope you found this useful, I am really enjoying having desktop notifications for irc.  Do you have any cool screen + irssi tricks?  I am always looking for new tricks for my old tools.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/12/06/growl-notifications-with-irssi</guid>
         <pubDate>Sat, 06 Dec 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Merb 2 == Rails 3</title>
         <link>http://andy.delcambre.com/2008/12/24/merb-2-rails-3.html</link>
         <description>&lt;p style=&quot;float:left;&quot;&gt;&lt;img src=&quot;http://rubyonrails.org/images/pages/merb/yehuda.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Unless you have been under a rock all day,  I am sure you have heard about the Rails and Merb merger announced earlier.  I am very excited about this turn of events.  It seemed so incredibly improbable merely one week ago.  The more I think about it and hear the plans, the more optimistic I become about the future of Ruby on the web.&lt;/p&gt;
&lt;p&gt;You can read the details of the merger at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://yehudakatz.com&quot;&gt;Yehuda&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3&quot;&gt;David&amp;#8217;s&lt;/a&gt; blogs.  There is also coverage from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://splendificent.com/2008/12/the-merb-rails-merger-announcement-an-inside-opinion/&quot;&gt;Carl Lerche&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mornini.wordpress.com/2008/12/23/rails-2x-merb-1x-rails-30/&quot;&gt;Tom Mornini&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://merbist.com/2008/12/23/rails-and-merb-merge/&quot;&gt;Matt Aimonetti&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://brainspl.at/articles/2008/12/23/merb-is-rails&quot;&gt;Ezra Zygmuntowicz&lt;/a&gt;.  I am not going to speak to the technical aspects of the merger as David and Yehuda have outlined those plans thoroughly.  I am more concerned about the community facets of the merger.&lt;/p&gt;
&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://loudthinking.com/images/headshot150.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Assuming the technical issues can be worked out with the merging of ideas and code bases, this is absolutely fantastic news for the ruby community at large.  There is huge mind share that rails has already garnered in the past four years.  Merb has been gaining ground, but unfortunately primarily from the existing rails community.  It has grown since it&amp;#8217;s inception two years ago and has experimented with many new concepts and ideas that will find an excellent new home in Rails.  There will be some stumbling blocks along the way.  Almost assuredly more so for merb apps than rails apps, due primarily to the sheer volume of rails code out there, especially in comparison to merb.  There will be migration paths from both frameworks to Rails 3.0 that should be fairly painless.&lt;/p&gt;
&lt;p&gt;My biggest concern for the moment is people who are currently working on Merb applications.  I know that the Merb core team has committed to making point releases leading up to the transition to Rails 3.0,  but until we get there I worry that major forward progress on merb will stop (understandably so).  This just leaves those of us working with current merb apps with a bit of an unmaintained framework for the moment.  This will end up with everybody in a better place, but will leave things a bit painful for the moment.&lt;/p&gt;
&lt;p&gt;Overall I am very excited for the coming months of ruby web development.  It is so cool to see the communities come back together like this and truly allow us to get the best of both worlds.  I am looking forward to what the new core team can come up with.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2008/12/24/merb-2-rails-3</guid>
         <pubDate>Wed, 24 Dec 2008 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>These yuppies have gotten their bay windows pierced</title>
         <link>http://andy.delcambre.com/2009/09/09/mission-hipsters.html</link>
         <description>&lt;embed src=&quot;http://www.youtube.com/v/V9f8QPtwBBs&amp;amp;hl=en&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;560&quot; height=&quot;340&quot;/&gt;

&lt;p&gt;Hilarious report on Mission hipsters. &lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2009/09/09/mission-hipsters</guid>
         <pubDate>Wed, 09 Sep 2009 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Rubyconf 2009 Schedule iCal File</title>
         <link>http://andy.delcambre.com/2009/11/13/rubyconf-ical.html</link>
         <description>&lt;p&gt;I was inspired by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.hasmanythrough.com&quot;&gt;Josh Susser&lt;/a&gt;’s reworking of the Rubyconf schedule and I wanted an iCal version so I could peruse it on my iPhone. I transcribed the schedule onto a calendar and uploaded it.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andy.delcambre.com/files/rubyconf.ics&quot;&gt;http://andy.delcambre.com/files/rubyconf.ics&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/geemus&quot;&gt;Wesley Beary&lt;/a&gt; added descriptions.  I have updated the file accordingly.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://andy.delcambre.com/2009/11/13/rubyconf-ical</guid>
         <pubDate>Fri, 13 Nov 2009 00:00:00 +0000</pubDate>
      </item>
      <item>
         <title>I want one. Chris Glass » bathtime</title>
         <link>http://adelcambre.tumblr.com/post/466775883</link>
         <description>&lt;img src=&quot;http://36.media.tumblr.com/tumblr_kzpmibFRku1qz6d7do1_500.jpg&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I want one. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://chrisglass.com/album/2010/03/20/bathtime/&quot;&gt;Chris Glass » bathtime&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/466775883</guid>
         <pubDate>Tue, 23 Mar 2010 00:54:11 +0000</pubDate>
      </item>
      <item>
         <title>Absolutely insane. 
John Nack on Adobe: Video: Sneak peek of...</title>
         <link>http://adelcambre.tumblr.com/post/470520849</link>
         <description>&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Absolutely insane. &lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.adobe.com/jnack/2010/03/caf_in_ps.html&quot;&gt;John Nack on Adobe: Video: Sneak peek of Content-Aware Fill in Photoshop&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/470520849</guid>
         <pubDate>Wed, 24 Mar 2010 17:09:10 +0000</pubDate>
      </item>
      <item>
         <title>&quot;it does crack me up that someone responsible for some pretty influential pieces of the java world...&quot;</title>
         <link>http://adelcambre.tumblr.com/post/485036658</link>
         <description>“it does crack me up that someone responsible for some pretty influential pieces of the java world was like “fuck this shit, ima go take pictures””&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;jason_watkins in IRC.  About &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://journal.duncandavidson.com&quot;&gt;James Duncan Davidson&lt;/a&gt;. &lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/485036658</guid>
         <pubDate>Tue, 30 Mar 2010 21:42:40 +0000</pubDate>
      </item>
      <item>
         <title>&quot;It’s a bit like changing the tires on your car while still driving, and it works beautifully.&quot;</title>
         <link>http://adelcambre.tumblr.com/post/487371086</link>
         <description>“It’s a bit like changing the tires on your car while still driving, and it works beautifully.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;Twitter switches to Unicorn. &lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://engineering.twitter.com/2010/03/unicorn-power.html&quot;&gt;The Twitter Engineering Blog: Unicorn Power&lt;/a&gt; &lt;/p&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/487371086</guid>
         <pubDate>Wed, 31 Mar 2010 20:55:56 +0000</pubDate>
      </item>
      <item>
         <title>&quot;You play differently when you’re on stage by yourself than when you’re in a 300-piece...&quot;</title>
         <link>http://adelcambre.tumblr.com/post/495200707</link>
         <description>“You play differently when you’re on stage by yourself than when you’re in a 300-piece marching band. Each breath you take — and each you don’t take — will be scrutinized by an audience with its attention solely on you and you alone.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://zachholman.com/2010/04/the-soloist/&quot;&gt;The Soloist&lt;/a&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/495200707</guid>
         <pubDate>Sun, 04 Apr 2010 07:27:42 +0000</pubDate>
      </item>
      <item>
         <title>&quot;We will deploy the release to production after we obtain some sustenance.&quot;</title>
         <link>http://adelcambre.tumblr.com/post/505049969</link>
         <description>“We will deploy the release to production after we obtain some sustenance.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/halorgium&quot;&gt;Tim Carey-Smith&lt;/a&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/505049969</guid>
         <pubDate>Thu, 08 Apr 2010 05:56:59 +0000</pubDate>
      </item>
      <item>
         <title>HTML5 presentation in HTML5</title>
         <link>http://adelcambre.tumblr.com/post/535010321</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://apirocks.com/html5/html5.html#slide1&quot;&gt;HTML5 presentation in HTML5&lt;/a&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/535010321</guid>
         <pubDate>Tue, 20 Apr 2010 04:51:17 +0000</pubDate>
      </item>
      <item>
         <title>&quot;@atmos oh yes. “This might explode but I don’t care, keep calm and carry on.”&quot;</title>
         <link>http://adelcambre.tumblr.com/post/554116988</link>
         <description>“@atmos oh yes. “This might explode but I don’t care, keep calm and carry on.””&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/mattly/status/12962764337&quot;&gt;Twitter / matthew lyon: @atmos oh yes. “This might …&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Inline rescue nil is the &quot;Keep Calm and Carry On” of Ruby&lt;/p&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/554116988</guid>
         <pubDate>Tue, 27 Apr 2010 20:35:36 +0000</pubDate>
      </item>
      <item>
         <title>via newcomicreviews.com</title>
         <link>http://adelcambre.tumblr.com/post/619788681</link>
         <description>&lt;img src=&quot;http://41.media.tumblr.com/tumblr_l2s99a8ZAZ1qz6d7do1_500.jpg&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;via &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://newcomicreviews.com/unsorted/21/dr5h83.jpg&quot;&gt;newcomicreviews.com&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/619788681</guid>
         <pubDate>Fri, 21 May 2010 18:41:33 +0000</pubDate>
      </item>
      <item>
         <title>Peter Dudas ‘Hi-Bike’ Concept - Josh Spear, Trendspotting</title>
         <link>http://adelcambre.tumblr.com/post/631782994</link>
         <description>&lt;img src=&quot;http://41.media.tumblr.com/tumblr_l2zl2kxynw1qz6d7do1_500.jpg&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://joshspear.com/item/peter-dudas-hi-bike-concept/&quot;&gt;Peter Dudas ‘Hi-Bike’ Concept - Josh Spear, Trendspotting&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/631782994</guid>
         <pubDate>Tue, 25 May 2010 17:39:56 +0000</pubDate>
      </item>
      <item>
         <title>&quot;If you want to keep something intimate and if you want to keep something sacred, you probably...&quot;</title>
         <link>http://adelcambre.tumblr.com/post/631873432</link>
         <description>“If you want to keep something intimate and if you want to keep something sacred, you probably shouldn’t post it [online].”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/We_Live_in_Public&quot;&gt;We Live in Public - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/631873432</guid>
         <pubDate>Tue, 25 May 2010 18:25:22 +0000</pubDate>
      </item>
      <item>
         <title>&quot;Contrary to some Western beliefs, Dr. Blair says, many of Russia’s nuclear-armed missiles in...&quot;</title>
         <link>http://adelcambre.tumblr.com/post/672118025</link>
         <description>“Contrary to some Western beliefs, Dr. Blair says, many of Russia’s nuclear-armed missiles in underground silos and on mobile launchers can be fired automatically.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Dead_Hand_(nuclear_war)&quot;&gt;Dead Hand (nuclear war) - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/672118025</guid>
         <pubDate>Mon, 07 Jun 2010 05:35:21 +0000</pubDate>
      </item>
      <item>
         <title>Korean Elevator</title>
         <link>http://adelcambre.tumblr.com/post/813003312</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://safari.nat.org/post/812670857&quot;&gt;natfriedman&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The elevator in our hotel is the first I’ve ever seen which allows you to deselect a floor by pressing the button again. I’ve always talked about that, and here it is.&lt;/p&gt;
&lt;p&gt;Stay tuned for further deep cultural insights from our travels.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The elevator in my office has the same feature if you double tap the button.  So awesome.  I actually use it every now and then.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/813003312</guid>
         <pubDate>Thu, 15 Jul 2010 00:51:46 +0000</pubDate>
      </item>
      <item>
         <title>&quot;Murdered and placed on trial after his death, sentenced to life.&quot;</title>
         <link>http://adelcambre.tumblr.com/post/826095004</link>
         <description>“Murdered and placed on trial after his death, sentenced to life.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Most_prolific_murderers_by_number_of_victims&quot;&gt;List of murderers by number of victims - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About &lt;span&gt;&lt;a rel=&quot;nofollow&quot; title=&quot;Giuseppe Greco&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Giuseppe_Greco&quot;&gt;Giuseppe Greco&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/em&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/826095004</guid>
         <pubDate>Sun, 18 Jul 2010 03:19:57 +0000</pubDate>
      </item>
      <item>
         <title>Werktrein  in  Overpelt.wmv (via raimcameddy)
Train track repair...</title>
         <link>http://adelcambre.tumblr.com/post/885859178</link>
         <description>&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=qFE8nmKpmXY&amp;feature=player_embedded&quot;&gt;Werktrein  in  Overpelt.wmv&lt;/a&gt; (via &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://youtube.com/user/raimcameddy&quot;&gt;raimcameddy&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Train track repair machines.  Pretty freaking amazing. &lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/885859178</guid>
         <pubDate>Sat, 31 Jul 2010 22:13:20 +0000</pubDate>
      </item>
      <item>
         <title>Pencil Tip Micro Sculptures By Dalton Ghetti:: Kidrobot’s...</title>
         <link>http://adelcambre.tumblr.com/post/940296660</link>
         <description>&lt;img src=&quot;http://41.media.tumblr.com/tumblr_l70sllF5pa1qz6d7do1_500.jpg&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kronikle.kidrobot.com/pencil-tip-micro-sculptures-by-dalton-ghetti/&quot;&gt;Pencil Tip Micro Sculptures By Dalton Ghetti:: Kidrobot’s Blog, The KRonikle&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/940296660</guid>
         <pubDate>Thu, 12 Aug 2010 03:34:32 +0000</pubDate>
      </item>
      <item>
         <title>[daily dose of imagery] colour wheels</title>
         <link>http://adelcambre.tumblr.com/post/979477181</link>
         <description>&lt;img src=&quot;http://41.media.tumblr.com/tumblr_l7fb71nUgG1qz6d7do1_500.jpg&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wvs.topleftpixel.com/10/08/15/&quot;&gt;[daily dose of imagery] colour wheels&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/979477181</guid>
         <pubDate>Thu, 19 Aug 2010 23:42:34 +0000</pubDate>
      </item>
      <item>
         <title>FUCK YOU (via CeeLoGreen)</title>
         <link>http://adelcambre.tumblr.com/post/986824514</link>
         <description>&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=CAV0XrbEwNc&quot;&gt;FUCK YOU&lt;/a&gt; (via &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://youtube.com/user/CeeLoGreen&quot;&gt;CeeLoGreen&lt;/a&gt;)&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/986824514</guid>
         <pubDate>Sat, 21 Aug 2010 08:59:41 +0000</pubDate>
      </item>
      <item>
         <title>Double Rainbow intense throw pillow by sewtara on Etsy

That was...</title>
         <link>http://adelcambre.tumblr.com/post/989864629</link>
         <description>&lt;img src=&quot;http://41.media.tumblr.com/tumblr_l7j2j4o1Ur1qz6d7do1_500.jpg&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.etsy.com/listing/51855404/double-rainbow-intense-throw-pillow&quot;&gt;Double Rainbow intense throw pillow by sewtara on Etsy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was fast. &lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/989864629</guid>
         <pubDate>Sun, 22 Aug 2010 00:25:52 +0000</pubDate>
      </item>
      <item>
         <title>Everything you've learned in life. In five words. GO. : AskReddit</title>
         <link>http://adelcambre.tumblr.com/post/1074023305</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.reddit.com/r/AskReddit/comments/c90ip/everything_youve_learned_in_life_in_five_words_go/&quot;&gt;Everything you've learned in life. In five words. GO. : AskReddit&lt;/a&gt;: &lt;p&gt;Cliche but so great. Some of my favorites:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;Whole truth offends all parties.”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;Don’t be afraid to fail.”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;“&lt;span&gt;Never assume there’s toilet paper.”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;“&lt;span&gt;Whatever you do, have passion.”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;Never stop learning about everything.”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;“&lt;/span&gt;&lt;span&gt;Godammit you’ve gotta be kind”&lt;/span&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://adelcambre.tumblr.com/post/1074023305</guid>
         <pubDate>Mon, 06 Sep 2010 06:31:44 +0000</pubDate>
      </item>
   </channel>
</rss>
<!-- fe4.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 23:26:19 UTC 2015 -->
