<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Jacob Elder]]></title>
  <link href="http://blog.jacobelder.com/atom.xml" rel="self"/>
  <link href="http://blog.jacobelder.com/"/>
  <updated>2012-05-12T15:25:54-04:00</updated>
  <id>http://blog.jacobelder.com/</id>
  <author>
    <name><![CDATA[Jacob Elder]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[3 Problems AWS Needs to Address]]></title>
    <link href="http://blog.jacobelder.com/2012/05/3-problems-aws-needs-to-address/"/>
    <updated>2012-05-08T23:03:00-04:00</updated>
    <id>http://blog.jacobelder.com/2012/05/3-problems-aws-needs-to-address</id>
    <content type="html"><![CDATA[<p>A few days ago, in a fit of pre-launch, late-night frustration, I issued the following 140-character missive.</p>

<div class='embed tweet'><blockquote class="twitter-tweet"><p>.@<a href="https://twitter.com/awscloud">awscloud</a> really needs to address:1) Access-Control-Allow-Origin (and more)2) Accept-Encoding: gzip3) Initial congestion window += 8</p>&mdash; Jacob Elder (@jelder) <a href="https://twitter.com/jelder/status/199295708635987968" data-datetime="2012-05-07T00:32:54+00:00">May 7, 2012</a></blockquote>
<script src="http://blog.jacobelder.com//platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<p>To my surprise, this actually got a response. Someone monitoring the @awscloud account opened a trouble ticket to my email address asking for clarification. The exchange was friendly and hopefully, and I think it&#8217;s worth sharing here.</p>

<!-- more -->


<p>It&#8217;s a pretty compelling situation: cloud service offerings and web browser technology have advanced to the point where S3 and CloudFront should be all one needs to deliver an incredibly performant and cost-effective user experience, letting small startups compete in the time-to-first-render game on an even playing field with the likes of Google and Yahoo. Instead, developers are forced to settle for ugly workarounds and outright hacks due to a few crucial shortcomings.</p>

<p>My team at <a href="http://boundless.com">Boundless</a> is has been working on a cutting edge single-page HTML5 app. We are hosting it on S3 and CloudFront, and its underlying API lives on EC2. Without getting into too much detail, the architecture is a lot like #newtwitter.</p>

<h2>1. S3 Restricts Response Headers</h2>

<p>Despite initial appearences, and without much justification from Amazon, the S3 API severely restricts which headers can be attached to an object.</p>

<ul>
<li><code>Cache-Control</code></li>
<li><code>Expires</code></li>
<li><code>Content-Disposition</code></li>
<li><code>Content-Type</code></li>
<li><code>Content-Language</code></li>
<li><code>Content-Encoding</code></li>
</ul>


<p>Users can apply their own metadata, but it will always be prefixed with <code>x-amz-meta</code>. CSS3 brings the ability to embed arbitrary fonts on the web. Fonts are the clothes words wear, and CSS3 is why the web is looking so sharp lately. The difficulty is that W3 puts fonts under a <a href="http://www.w3.org/TR/css3-fonts/#same-origin-restriction">same-origin restriction</a>. Thus, embedding these fonts requires these additional headers:</p>

<ul>
<li><code>Access-Control-Allow-Headers</code></li>
<li><code>Access-Control-Allow-Origin</code></li>
</ul>


<p>And the complete <a href="http://enable-cors.org/">CORS</a> specification has yet more headers to contend with:</p>

<ul>
<li><code>Access-Control-Max-Age</code></li>
<li><code>Access-Control-Allow-Methods</code></li>
<li><code>Access-Control-Allow-Credentials</code></li>
</ul>


<p>This leaves CloudFront users who wish to embed fonts with a handful of undesirable options.</p>

<ol>
<li><strong>Serve the entire domain through CloudFront.</strong> This is fine unless there&#8217;s anything on your domain which shouldn&#8217;t be cached, and I&#8217;m sure things get even more complicated if you throw SSL into the mix.</li>
<li><strong>Skip S3 and serve everything from EC2.</strong> S3 has <em>eleven</em> nines of durability. Go ahead, reproduce that with a couple of NginX boxes.</li>
<li><strong>Insert some proxy servers to add the headers.</strong> I think what you mean is, add yet another hop in your network while increasing your attack footprint <em>and</em> your EC2 bill.</li>
<li><strong>Mix fonts into stylesheets using <code>data:</code> URIs.</strong> Now every time you adjust a <code>&lt;div&gt;</code> tag, your visitors have to download your fonts again. You could break your CSS into multiple files, but this is in direct opposition to one of the tenants of website optimization: minimize the number of HTTP requests. Also, 7-bit encoding means your fonts are now 37% fatter on the wire.</li>
</ol>


<p>Here is a <a href="https://forums.aws.amazon.com/thread.jspa?threadID=34281">forum post from 2009</a> bringing this to Amazon&#8217;s highly dismissive attention. What really irks me about this is that Amazon chose to bless a few headers instead of letting the end-user decide what is best for our customers.</p>

<h2>2. S3 and CloudFront Won&#8217;t Compress Anything</h2>

<p>RFC2616 allows that a client may suggest to a server that it would like to have the response encoded as something other than raw bytes before transmission. One common encoding is <code>gzip</code>, and lots of HTTP traffic includes a header like <code>Accept-Encoding: gzip</code>. Most web servers will comply with this suggestion, reducing plain text like HTML, CSS, and JavaScript by well over 50%.</p>

<p>Two notable exceptions to &#8220;most web servers&#8221; are S3 and CloudFront. A possible workaround involves <code>Content-Encoding</code> being among the allowed HTTP headers for S3 objects. The image below has been compressed with <code>gzip -9</code> before uploading, and has <code>Content-Encoding: gzip</code> set in S3.</p>

<p><img src="http://s3-gzip-hack.jacobelder.com/success-kid.png" alt="Success Kid" /></p>

<p>If you can see Success Kid, this hack will work on your browser.</p>

<p>This exploits the fact that most browsers usually send <code>Accept-Encoding: gzip</code>, or they will handle <code>Content-Encoding: gzip</code> in the response even if they didn&#8217;t request it. Users of IE7 and previous versions will see a broken image icon. <code>wget</code> or <code>curl</code> will also result in corruption unless those tools are explicitly configured to always use compression. This is really a quasi-violation of <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3">RFC2616 Section 14.3</a>, but it does sort of work.</p>

<p>If you want to be compliant, you most choose between S3 and compression. CloudFront, at least, will cache both compressed and raw versions of each object depending on the clients which have requested it.</p>

<h2>3. CloudFront&#8217;s TCP Stack Lacks Tuning</h2>

<p>I have harped on this issue before, but Amazon CloudFront exhibits one of the smallest initial TCP congestion windows in the CDN marketplace. They&#8217;re at 2. Consensus is growing that it should be closer to 10. Rather than making an argument for it here, I&#8217;ll let some Googlers do it for me.</p>

<blockquote><p>An Argument for Increasing TCP&#8217;s Initial Congestion Window&#8221;, <a href="author39115.html">Nandita Dukkipati</a>, <a href="author38914.html">Tiziana Refice</a>, <a href="author27276.html">Yuchung Cheng</a>, <a href="author39277.html">Jerry Chu</a>, Tom Herbert, Amit Agarwal, <a href="author35943.html">Arvind Jain</a>, Natalia Sutin, <i>ACM SIGCOMM Computer Communications Review</i>, vol. 40 (2010), pp. 27-33.<br/> [<a href="http://ccr.sigcomm.org/drupal/?q=node/621"><strong>ccr.sigcomm.org</strong></a>] [<a href="archive/36640.pdf"><strong>pdf</strong></a>] [<a href="http://www.google.com/search?lr=&amp;ie=UTF-8&amp;oe=UTF-8&amp;q=An+Argument+for+Increasing+TCP%27s+Initial+Congestion+Window+Dukkipati+Refice+Cheng+Chu+Herbert+Agarwal+Jain+Sutin"><strong>search</strong></a>]</p></blockquote>


<p>The @awscloud guys are apparently considering my request. If I get any answers back, I will be sure to post them here.</p>

<p><a id="update"/></a></p>

<h3>Update - May 12, 2012</h3>

<p>Amazon&#8217;s Senior Evangelist for AWS @jeffbar has reached out to me to clarify one point about my post.</p>

<div class='embed tweet'><blockquote class="twitter-tweet"><p>@<a href="https://twitter.com/jelder">jelder</a> - FYI, regarding your recent AWS blog post, CloudFront&#8217;s initcwnd is 10 and has been so since Feb 2012.</p>&mdash; Jeff Barr (@jeffbarr) <a href="https://twitter.com/jeffbarr/status/201093102914633728" data-datetime="2012-05-11T23:35:06+00:00">May 11, 2012</a></blockquote>
<script src="http://blog.jacobelder.com//platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<div class='embed tweet'><blockquote class="twitter-tweet" data-in-reply-to="201102750275211264"><p>@<a href="https://twitter.com/jelder">jelder</a> - I don&#8217;t know if we made a big deal about it. But it has been 10 since early this year. I&#8217;ve messaged the owner of that post.</p>&mdash; Jeff Barr (@jeffbarr) <a href="https://twitter.com/jeffbarr/status/201104664018690049" data-datetime="2012-05-12T00:21:02+00:00">May 12, 2012</a></blockquote>
<script src="http://blog.jacobelder.com//platform.twitter.com/widgets.js" charset="utf-8"></script></div>


<p>There you have it. CloudFront definitely deserves credit for upping the amount of content websites can render before round trip latency starts getting in the way.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving on from LocaModa]]></title>
    <link href="http://blog.jacobelder.com/2012/03/moving-on-from-locamoda/"/>
    <updated>2012-03-04T09:09:00-05:00</updated>
    <id>http://blog.jacobelder.com/2012/03/moving-on-from-locamoda</id>
    <content type="html"><![CDATA[<blockquote><p>In the eyes of those lovers of perfection, a work is never finished&mdash;a word that for them has no sense&mdash;but abandoned; and this abandonment, whether to the flames or to the public (and which is the result of weariness or an obligation to deliver) is a kind of an accident to them, like the breaking off of a reflection, which fatigue, irritation, or something similar has made worthless.</p><footer><strong>Paul Valery</strong> <cite>Charmes. Le Cimetière Marin</cite></footer></blockquote>


<p>What&#8217;s the right amount of time to stay at a startup? My first startup (<a href="http://www.livewiremobile.com/">Livewire Mobile</a>, née Groove Mobile) was the fastest and most eye-opening 18 months of my life. Before that was six years of running IT for <a href="http://www.capecodvacation.com/">The Real Estate Company</a>, which was at the time the largest independently owned real estate agency in southeastern Massachusetts. That company was founded the year I was born and is still operating today. In my memory, Groove and T.R.E.C. occupy about the same amount of space.</p>

<p>Ultimately my four years at LocaModa was just the right amount of time. I am immensely proud of what I built while there. Some of it is open source (on <a href="https://www.github.com/jelder">my github</a> account, with more to be released later on theirs). In a later post I may write about some of the cool work we did with Solr, Chef, ActiveMQ, Varnish, HAProxy, and Nagios. There&#8217;s a lot to be excited about happening over there, but that will be for others to ship, not me.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[About migrating from Blogger to Octopress]]></title>
    <link href="http://blog.jacobelder.com/2012/03/about-migrating-from-blogger-to-octopress/"/>
    <updated>2012-03-02T12:57:00-05:00</updated>
    <id>http://blog.jacobelder.com/2012/03/about-migrating-from-blogger-to-octopress</id>
    <content type="html"><![CDATA[<p>Another way Octopress (and Jekyll) differs from Blogger is that we now have each post in its own directory. I can&#8217;t say I fully understand this, though it does look cleaner. It would make sense if there were also an easy way to have images for each post live in that same directory. Regardlss, this breaks all inbound links. Here&#8217;s the 404 page I created to solve this problem. If the original URL ended with <code>.html</code>, it suggests a link to the possible new URL.</p>

<p>Try it out <a href="http://blog.jacobelder.com/2010/07/tracking-request-queue-time-on-new-relic-rpm-with-varnish.html">here</a>.</p>

<div><script src='https://gist.github.com/1960042.js?file='></script>
<noscript><pre><code>---
layout: page
title: &quot;Not Found&quot;
sharing: false
footer: false
---

Sorry, that page doesn't exist. &lt;span id=&quot;suggestion&quot;/&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
if (window.location.pathname.indexOf(&quot;.html&quot;) &gt; 0) {
  text = &quot;The structure of this site changed recently. Could you be looking for &lt;a&gt;&lt;/a&gt; instead?&quot;
  guess = window.location.pathname.replace(/\.html/,&quot;/&quot;)
  $(&quot;#suggestion&quot;).html(text);
  $(&quot;#suggestion a&quot;).html(guess).attr(&quot;href&quot;, guess);
}
//]]&gt;
&lt;/script&gt;</code></pre></noscript></div>


<p>To complete the picture, you must also structure your permalinks like Blogger does.</p>

<figure class='code'><figcaption><span>_config.yml</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">permalink</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">/:year/:month/:title/</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress and Amazon CloudFront]]></title>
    <link href="http://blog.jacobelder.com/2012/03/octopress-and-cloudfront/"/>
    <updated>2012-03-01T21:42:00-05:00</updated>
    <id>http://blog.jacobelder.com/2012/03/octopress-and-cloudfront</id>
    <content type="html"><![CDATA[<p>As it turns out, getting your Octopress-hosted blog up and running on CloudFront is pretty easy. The only problem I ran into is that Octopress wants every post and page to be a directory with an <code>index.html</code>, but CloudFront only recognizes default objects at the root, not for subdirectories. The solution to that is to create a CloudFront distribution using a Custom Origin, which points to the <code>example.s3-website-us-east-1.amazonaws.com</code> URL rather than the S3 bucket itself. This way you end up using S3&#8217;s much more functional default object support. As of this writing, this blog is served by CloudFront.</p>

<p>I&#8217;m still looking for the right way to get <code>Cache-control</code> and <code>Expire</code> headers from <code>s3cmd sync</code>. Without that, the best YSlow score you can get on a default Octopress blog is about a C (76). CloudFront doesn&#8217;t do any transparent compression for you (no <code>Accept-Encoding</code> support) so that&#8217;s a no-go as well. It would also be nice if Amazon would acknowledge that initcwnd of 2 is nonsensical on today&#8217;s Internet. Nearly all other CDNs use something higher, with Akamai using up to 6, and Google using <em>10</em>.</p>

<p>See <a href="http://www.cdnplanet.com/blog/initcwnd-settings-major-cdn-providers/">Initcwnd settings of major CDN providers</a> for a comparison.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deploying Octopress to Amazon S3]]></title>
    <link href="http://blog.jacobelder.com/2012/03/deploying-octopress-to-amazon-s3/"/>
    <updated>2012-03-01T09:23:00-05:00</updated>
    <id>http://blog.jacobelder.com/2012/03/deploying-octopress-to-amazon-s3</id>
    <content type="html"><![CDATA[<p>I just submitted <a href="https://github.com/imathis/octopress/pulls/jelder">a pair of pull requests</a> which add explicit support for Amazon S3 to the awesome <a href="http://octopress.org/">Octopress</a> blogging platform. This is something I&#8217;ve been meaning to do for ages. There will be a followup post about some less-than-awesome things I discovered about the S3 ecosystem.</p>

<p>Here&#8217;s the documentation I submitted along with the (comparitively small) patch.</p>

<hr/><br/>


<p>Amazon Web Services (AWS) is a collection of web services that together make up a cloud computing platform, offered over the Internet by Amazon.com. The most central and well-known of these services are Amazon EC2 and Amazon S3. This page will walk you through setting up a blog on S3.</p>

<p>If you haven&#8217;t already, go <a href="http://aws.amazon.com/s3/">sign up for an Amazon AWS account</a> right now. It&#8217;s very inexpensive and you only pay for what you use.</p>

<p>You will need to install <code>s3cmd</code>. This is available in most Linux distributions, via <a href="http://aws.amazon.com/s3/">Homebrew</a>, or directly from <a href="http://s3tools.org/download">s3tools.org</a>. You&#8217;ll need to copy &amp; paste <code>access_key</code> and <code>secret_key</code> from the <a href="https://aws-portal.amazon.com/gp/aws/securityCredentials">Security Credentials</a> page into <code>s3cmd</code>&#8217;s configuration wizard.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>s3cmd --configure         <span class="c"># Begin interactive configuration</span>
</span></code></pre></td></tr></table></div></figure>


<p>When finished, your <code>~/.s3cfg</code> file should end up looking something like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ini'><span class='line'><span class="k">[default]</span>
</span><span class='line'><span class="c"># ...snip...</span>
</span><span class='line'><span class="na">access_key</span> <span class="o">=</span> <span class="s">ALRJCALDDZUDEGNSSIPE </span>
</span><span class='line'><span class="na">secret_key</span> <span class="o">=</span> <span class="s">9DJWHga1Y+uBAFXntDM1Ujd6FrnnUZb/9dLMOqzn</span>
</span><span class='line'><span class="c"># ...snip...</span>
</span></code></pre></td></tr></table></div></figure>


<p>S3 is really just a huge, fast, and <a href="http://aws.amazon.com/s3/faqs/#How_durable_is_Amazon_S3">very reliable</a>, key-value store which happens to be accessible over HTTP. It doesn&#8217;t recognize <code>index.html</code> as being special (or even the concept of directories, really) unless you enable &#8220;website hosting.&#8221;</p>

<p>Unfortunately, the latest version of <code>s3cmd</code> doesn&#8217;t let you do this yet, so you&#8217;ll have to use the <a href="https://console.aws.amazon.com/s3/home">AWS Console</a>. Create a bucket having the same name as the fully-qualified domain name of your blog (e.g., <code>blog.example.com</code>). Open the Properties pane for your bucket, and then the Website tab to turn this on. Make note of the &#8220;endpoint&#8221;, something like <code>blog.example.com.s3-website-us-east-1.amazonaws.com</code>. You can use this directly, but most people will create a DNS CNAME pointing to it instead.</p>

<p>In your <code>Rakefile</code>, set the deploy default to s3 and configure your bucket.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">deploy_default</span> <span class="o">=</span> <span class="s2">&quot;s3&quot;</span>
</span><span class='line'><span class="n">s3_bucket</span>      <span class="o">=</span> <span class="s2">&quot;blog.example.com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now if you run</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>rake deploy     <span class="c"># Syncs your blog to S3</span>
</span></code></pre></td></tr></table></div></figure>


<p>in your terminal, your <code>public</code> directory will be synced to your bucket.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving to S3]]></title>
    <link href="http://blog.jacobelder.com/2012/02/moving-to-s3/"/>
    <updated>2012-02-27T22:16:00-05:00</updated>
    <id>http://blog.jacobelder.com/2012/02/moving-to-s3</id>
    <content type="html"><![CDATA[<p>I&#8217;m on S3 now. Goodbye Blogger.</p>

<p>(In other words, testing was successful.)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tracking request queue time on New Relic RPM with Varnish]]></title>
    <link href="http://blog.jacobelder.com/2010/07/tracking-request-queue-time-on-new-relic-rpm-with-varnish/"/>
    <updated>2010-07-16T21:48:00Z</updated>
    <id>http://blog.jacobelder.com/2010/07/tracking-request-queue-time-on-new-relic-rpm-with-varnish</id>
    <content type="html"><![CDATA[<p>The nice folks at New Relic have added an under-hyped <a href="https://newrelic.com/docs/features/tracking-front-end-time">feature</a> to RPM which allows for the tracking of the time a given request spent in the server&#8217;s work queue before processing began. This information in crucial in determining when you need to add more workers. It only requires that your front-end add an <code>X-Request-Start</code> header containing the epoch time in microseconds when the request was received. They offer a patch for NginX and a one-line config change for Apache.</p>




<p>But what about the new hotness, Varnish?</p>




<div><script src='https://gist.github.com/494265.js?file='></script>
<noscript><pre><code>/*
 * Add X-Request-Start header so we can track queue times in New Relic RPM beginning at Varnish.
 *
 */

#include &lt;sys/time.h&gt;

struct timeval detail_time;
gettimeofday(&amp;detail_time,NULL);
char start[20]; 
sprintf(start, &quot;t=%lu%06lu&quot;, detail_time.tv_sec, detail_time.tv_usec);
VRT_SetHdr(sp, HDR_REQ, &quot;\020X-Request-Start:&quot;, start, vrt_magic_string_end);

</code></pre></noscript></div>




<p><em>That&#8217;s</em> what. Save this to <code>/etc/varnish/newrelic.h</code> and include it in your <code>vcl_recv</code> declaration.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Serving static files from Varnish]]></title>
    <link href="http://blog.jacobelder.com/2010/07/serving-static-files-from-varnish/"/>
    <updated>2010-07-16T21:30:00Z</updated>
    <id>http://blog.jacobelder.com/2010/07/serving-static-files-from-varnish</id>
    <content type="html"><![CDATA[<p>At <a href="http://locamoda.com">LocaModa</a>, most of our APIs are eventually consumed by ActionScript 3 applications run on large outdoor screens or in users&#8217; web browsers. Flash&#8217;s cross-domain request protection incurres some round-trip latency, which essentially means wasted screen time, which is money, and I&#8217;d like to share one way we optimize for this.</p>

<p>We use the excellent Varnish HTTP accelerator in front of our application servers. True, we could easily be serving crossdomain.xml from Tomcat, or Apache, or NginX, but Varnish is the only part of the infrastructure I&#8217;m really happy with for the long-term. This is why I decided to serve a static file from Varnish which, officially, doesn&#8217;t do this.</p>

<div><script src='https://gist.github.com/494303.js?file=crossdomain.xml'></script>
<noscript><pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head prefix=&quot;og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog: http://ogp.me/ns/fb/githubog#&quot;&gt;
    &lt;meta charset='utf-8'&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
        &lt;title&gt;404 · GitHub&lt;/title&gt;
    &lt;link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot; href=&quot;/opensearch.xml&quot; title=&quot;GitHub&quot; /&gt;
    &lt;link rel=&quot;fluid-icon&quot; href=&quot;https://github.com/fluidicon.png&quot; title=&quot;GitHub&quot; /&gt;
    &lt;link rel=&quot;shortcut icon&quot; href=&quot;/favicon.ico&quot; type=&quot;image/x-icon&quot; /&gt;

    
    

    

    &lt;link href=&quot;https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github-c4b3a1e3484da7dab93ea4f6caca07a0168ffa77.css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
    &lt;link href=&quot;https://a248.e.akamai.net/assets.github.com/stylesheets/bundles/github2-34d96ae148c427d3106177152ac475d7df36c780.css&quot; media=&quot;screen&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
    

    &lt;script src=&quot;https://a248.e.akamai.net/assets.github.com/javascripts/bundles/jquery-5b140862bd914d3619171dece9be92269c2b1fe1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://a248.e.akamai.net/assets.github.com/javascripts/bundles/github-1191d9500b9368ede4221610a2d9c453c0cb35f8.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
    

    
  &lt;/head&gt;


  &lt;body class=&quot;logged_out    env-production &quot; data-blob-contribs-enabled=&quot;yes&quot;&gt;
    
    
    

      &lt;div id=&quot;header&quot; class=&quot;true clearfix&quot;&gt;
        &lt;div class=&quot;container clearfix&quot;&gt;
          &lt;a class=&quot;site-logo&quot; href=&quot;https://github.com&quot;&gt;
            &lt;!--[if IE]&gt;
            &lt;img alt=&quot;GitHub&quot; class=&quot;github-logo&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7.png?1323882717&quot; /&gt;
            &lt;img alt=&quot;GitHub&quot; class=&quot;github-logo-hover&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7-hover.png?1324325359&quot; /&gt;
            &lt;![endif]--&gt;
            &lt;img alt=&quot;GitHub&quot; class=&quot;github-logo-4x&quot; height=&quot;30&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x.png?1323882717&quot; /&gt;
            &lt;img alt=&quot;GitHub&quot; class=&quot;github-logo-4x-hover&quot; height=&quot;30&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/header/logov7@4x-hover.png?1324325359&quot; /&gt;
          &lt;/a&gt;

                  &lt;!--
      make sure to use fully qualified URLs here since this nav
      is used on error pages on other domains
    --&gt;
    &lt;ul class=&quot;top-nav logged_out&quot;&gt;
        &lt;li class=&quot;pricing&quot;&gt;&lt;a href=&quot;https://github.com/plans&quot;&gt;Signup and Pricing&lt;/a&gt;&lt;/li&gt;
        &lt;li class=&quot;explore&quot;&gt;&lt;a href=&quot;https://github.com/explore&quot;&gt;Explore GitHub&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;features&quot;&gt;&lt;a href=&quot;https://github.com/features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt;
        &lt;li class=&quot;blog&quot;&gt;&lt;a href=&quot;https://github.com/blog&quot;&gt;Blog&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;login&quot;&gt;&lt;a href=&quot;https://github.com/login?return_to=%2Fgist%2F494303%2Fcrossdomain.xml&quot;&gt;Login&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;



          
        &lt;/div&gt;
      &lt;/div&gt;

      

        &lt;div class=&quot;site clearfix&quot;&gt;
          &lt;div class=&quot;container&quot;&gt;
            

&lt;style type=&quot;text/css&quot;&gt;
    #header{
        border-bottom: 0;
    }
    .site{
        padding: 0;
        margin-top: -20px;
    }
    * {
        margin: 0px;
        padding: 0px;
    }
    #parallax_field{
        overflow: hidden;
        position: absolute;
        left: 0;
        top: 0;
        height: 370px;
        width: 100%;
    }
    #parallax_field #parallax_bg {
        position: absolute;
        top: -20px;
        left: -20px;
        width: 110%;
        height: 425px;
        z-index: 1;
    }
    #parallax_illustration {
        display:block;
        width: 940px;
        height: 370px;
        position: relative;
        overflow: hidden;
        clear: both;
    }
    #parallax_illustration #parallax_error_text {
        position: absolute;
        top: 72px;
        left: 72px;
        z-index: 10;
    }
    #parallax_illustration #parallax_octocat {
        position: absolute;
        top: 94px;
        left: 356px;
        z-index: 9;
    }
    #parallax_illustration #parallax_speeder {
        position: absolute;
        top: 150px;
        left: 432px;
        z-index: 8;
    }
    #parallax_illustration #parallax_octocatshadow {
        position: absolute;
        top: 297px;
        left: 371px;
        z-index: 7;
    }
    #parallax_illustration #parallax_speedershadow {
        position: absolute;
        top: 263px;
        left: 442px;
        z-index: 6;
    }
    #parallax_illustration #parallax_building_1 {
        position: absolute;
        top: 73px;
        left: 467px;
        z-index: 5;
    }
    #parallax_illustration #parallax_building_2 {
        position: absolute;
        top: 113px;
        left: 762px;
        z-index: 4;
    }
    #footer {
        margin-top: 0px;
        z-index: 12;
    }
&lt;/style&gt;


&lt;div id=&quot;parallax_field&quot;&gt;
    &lt;img alt=&quot;building&quot; class=&quot;js-plaxify&quot; data-invert=&quot;true&quot; data-xrange=&quot;0&quot; data-yrange=&quot;20&quot; height=&quot;415&quot; id=&quot;parallax_bg&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_bg.jpg?1315937507&quot; width=&quot;940&quot; /&gt;
&lt;/div&gt;
&lt;div id=&quot;parallax_illustration&quot;&gt;
  &lt;img alt=&quot;404 | &amp;ldquo;This is not the web page you are looking for&amp;rdquo;&quot; class=&quot;js-plaxify&quot; data-xrange=&quot;20&quot; data-yrange=&quot;10&quot; height=&quot;249&quot; id=&quot;parallax_error_text&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_errortext.png?1315937507&quot; width=&quot;271&quot; /&gt;
  &lt;img alt=&quot;Octobi Wan Catnobi&quot; class=&quot;js-plaxify&quot; data-xrange=&quot;10&quot; data-yrange=&quot;10&quot; height=&quot;230&quot; id=&quot;parallax_octocat&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_octocat.png?1315937507&quot; width=&quot;188&quot; /&gt;
  &lt;img alt=&quot;land speeder&quot; class=&quot;js-plaxify&quot; data-xrange=&quot;10&quot; data-yrange=&quot;10&quot; height=&quot;156&quot; id=&quot;parallax_speeder&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_speeder.png?1315937507&quot; width=&quot;440&quot; /&gt;
  &lt;img alt=&quot;Octobi Wan Catnobi's shadow&quot; class=&quot;js-plaxify&quot; data-xrange=&quot;10&quot; data-yrange=&quot;10&quot; height=&quot;49&quot; id=&quot;parallax_octocatshadow&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_octocatshadow.png?1315937507&quot; width=&quot;166&quot; /&gt;
  &lt;img alt=&quot;land speeder's shadow&quot; class=&quot;js-plaxify&quot; data-xrange=&quot;10&quot; data-yrange=&quot;10&quot; height=&quot;75&quot; id=&quot;parallax_speedershadow&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_speedershadow.png?1315937507&quot; width=&quot;430&quot; /&gt;
  &lt;img alt=&quot;building&quot; class=&quot;js-plaxify&quot; data-invert=&quot;true&quot; data-xrange=&quot;50&quot; data-yrange=&quot;20&quot; height=&quot;123&quot; id=&quot;parallax_building_1&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_building_1.png?1315937507&quot; width=&quot;304&quot; /&gt;
  &lt;img alt=&quot;building&quot; class=&quot;js-plaxify&quot; data-invert=&quot;true&quot; data-xrange=&quot;75&quot; data-yrange=&quot;30&quot; height=&quot;50&quot; id=&quot;parallax_building_2&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/404/parallax_building_2.png?1315937507&quot; width=&quot;116&quot; /&gt;
&lt;/div&gt;

          &lt;/div&gt;
          &lt;div class=&quot;context-overlay&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;

      &lt;!-- footer --&gt;
      &lt;div id=&quot;footer&quot; &gt;
        
  &lt;div class=&quot;upper_footer&quot;&gt;
     &lt;div class=&quot;container clearfix&quot;&gt;

       &lt;!--[if IE]&gt;&lt;h4 id=&quot;blacktocat_ie&quot;&gt;GitHub Links&lt;/h4&gt;&lt;![endif]--&gt;
       &lt;![if !IE]&gt;&lt;h4 id=&quot;blacktocat&quot;&gt;GitHub Links&lt;/h4&gt;&lt;![endif]&gt;

       &lt;ul class=&quot;footer_nav&quot;&gt;
         &lt;h4&gt;GitHub&lt;/h4&gt;
         &lt;li&gt;&lt;a href=&quot;https://github.com/about&quot;&gt;About&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;https://github.com/blog&quot;&gt;Blog&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;https://github.com/features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;https://github.com/contact&quot;&gt;Contact &amp;amp; Support&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;https://github.com/training&quot;&gt;Training&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://enterprise.github.com/&quot;&gt;GitHub Enterprise&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://status.github.com/&quot;&gt;Site Status&lt;/a&gt;&lt;/li&gt;
       &lt;/ul&gt;

       &lt;ul class=&quot;footer_nav&quot;&gt;
         &lt;h4&gt;Tools&lt;/h4&gt;
         &lt;li&gt;&lt;a href=&quot;http://get.gaug.es/&quot;&gt;Gauges: Analyze web traffic&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://speakerdeck.com&quot;&gt;Speaker Deck: Presentations&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;https://gist.github.com&quot;&gt;Gist: Code snippets&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://mac.github.com/&quot;&gt;GitHub for Mac&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://mobile.github.com/&quot;&gt;Issues for iPhone&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://jobs.github.com/&quot;&gt;Job Board&lt;/a&gt;&lt;/li&gt;
       &lt;/ul&gt;

       &lt;ul class=&quot;footer_nav&quot;&gt;
         &lt;h4&gt;Extras&lt;/h4&gt;
         &lt;li&gt;&lt;a href=&quot;http://shop.github.com/&quot;&gt;GitHub Shop&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://octodex.github.com/&quot;&gt;The Octodex&lt;/a&gt;&lt;/li&gt;
       &lt;/ul&gt;

       &lt;ul class=&quot;footer_nav&quot;&gt;
         &lt;h4&gt;Documentation&lt;/h4&gt;
         &lt;li&gt;&lt;a href=&quot;http://help.github.com/&quot;&gt;GitHub Help&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://developer.github.com/&quot;&gt;Developer API&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://github.github.com/github-flavored-markdown/&quot;&gt;GitHub Flavored Markdown&lt;/a&gt;&lt;/li&gt;
         &lt;li&gt;&lt;a href=&quot;http://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;
       &lt;/ul&gt;

     &lt;/div&gt;&lt;!-- /.site --&gt;
  &lt;/div&gt;&lt;!-- /.upper_footer --&gt;

&lt;div class=&quot;lower_footer&quot;&gt;
  &lt;div class=&quot;container clearfix&quot;&gt;
    &lt;!--[if IE]&gt;&lt;div id=&quot;legal_ie&quot;&gt;&lt;![endif]--&gt;
    &lt;![if !IE]&gt;&lt;div id=&quot;legal&quot;&gt;&lt;![endif]&gt;
      &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;https://github.com/site/terms&quot;&gt;Terms of Service&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;https://github.com/site/privacy&quot;&gt;Privacy&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&quot;https://github.com/security&quot;&gt;Security&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;&amp;copy; 2012 &lt;span title=&quot;0.01938s from fe10.rs.github.com&quot;&gt;GitHub&lt;/span&gt; Inc. All rights reserved.&lt;/p&gt;
    &lt;/div&gt;&lt;!-- /#legal or /#legal_ie--&gt;

      &lt;div class=&quot;sponsor&quot;&gt;
        &lt;a href=&quot;http://www.rackspace.com&quot; class=&quot;logo&quot;&gt;
          &lt;img alt=&quot;Dedicated Server&quot; height=&quot;36&quot; src=&quot;https://a248.e.akamai.net/assets.github.com/images/modules/footer/rackspaces_logo.png?1329521039&quot; width=&quot;38&quot; /&gt;
        &lt;/a&gt;
        Powered by the &lt;a href=&quot;http://www.rackspace.com &quot;&gt;Dedicated
        Servers&lt;/a&gt; and&lt;br/&gt; &lt;a href=&quot;http://www.rackspacecloud.com&quot;&gt;Cloud
        Computing&lt;/a&gt; of Rackspace Hosting&lt;span&gt;&amp;reg;&lt;/span&gt;
      &lt;/div&gt;
  &lt;/div&gt;&lt;!-- /.site --&gt;
&lt;/div&gt;&lt;!-- /.lower_footer --&gt;

      &lt;/div&gt;&lt;!-- /#footer --&gt;

    

&lt;div id=&quot;keyboard_shortcuts_pane&quot; class=&quot;instapaper_ignore readability-extra&quot; style=&quot;display:none&quot;&gt;
  &lt;h2&gt;Keyboard Shortcuts &lt;small&gt;&lt;a href=&quot;#&quot; class=&quot;js-see-all-keyboard-shortcuts&quot;&gt;(see all)&lt;/a&gt;&lt;/small&gt;&lt;/h2&gt;

  &lt;div class=&quot;columns threecols&quot;&gt;
    &lt;div class=&quot;column first&quot;&gt;
      &lt;h3&gt;Site wide shortcuts&lt;/h3&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;s&lt;/dt&gt;
        &lt;dd&gt;Focus site search&lt;/dd&gt;
      &lt;/dl&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;?&lt;/dt&gt;
        &lt;dd&gt;Bring up this help dialog&lt;/dd&gt;
      &lt;/dl&gt;
    &lt;/div&gt;&lt;!-- /.column.first --&gt;

    &lt;div class=&quot;column middle&quot; style='display:none'&gt;
      &lt;h3&gt;Commit list&lt;/h3&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;j&lt;/dt&gt;
        &lt;dd&gt;Move selection down&lt;/dd&gt;
      &lt;/dl&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;k&lt;/dt&gt;
        &lt;dd&gt;Move selection up&lt;/dd&gt;
      &lt;/dl&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;c &lt;em&gt;or&lt;/em&gt; o &lt;em&gt;or&lt;/em&gt; enter&lt;/dt&gt;
        &lt;dd&gt;Open commit&lt;/dd&gt;
      &lt;/dl&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;y&lt;/dt&gt;
        &lt;dd&gt;Expand URL to its canonical form&lt;/dd&gt;
      &lt;/dl&gt;
    &lt;/div&gt;&lt;!-- /.column.first --&gt;

    &lt;div class=&quot;column last&quot; style='display:none'&gt;
      &lt;h3&gt;Pull request list&lt;/h3&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;j&lt;/dt&gt;
        &lt;dd&gt;Move selection down&lt;/dd&gt;
      &lt;/dl&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;k&lt;/dt&gt;
        &lt;dd&gt;Move selection up&lt;/dd&gt;
      &lt;/dl&gt;
      &lt;dl class=&quot;keyboard-mappings&quot;&gt;
        &lt;dt&gt;o &lt;em&gt;or&lt;/em&gt; enter&lt;/dt&gt;
        &lt;dd&gt;Open issue&lt;/dd&gt;
      &lt;/dl&gt;
    &lt;/div&gt;&lt;!-- /.columns.last --&gt;

  &lt;/div&gt;&lt;!-- /.columns.equacols --&gt;

  &lt;div style='display:none'&gt;
    &lt;div class=&quot;rule&quot;&gt;&lt;/div&gt;

    &lt;h3&gt;Issues&lt;/h3&gt;

    &lt;div class=&quot;columns threecols&quot;&gt;
      &lt;div class=&quot;column first&quot;&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;j&lt;/dt&gt;
          &lt;dd&gt;Move selection down&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;k&lt;/dt&gt;
          &lt;dd&gt;Move selection up&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;x&lt;/dt&gt;
          &lt;dd&gt;Toggle selection&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;o &lt;em&gt;or&lt;/em&gt; enter&lt;/dt&gt;
          &lt;dd&gt;Open issue&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;&lt;!-- /.column.first --&gt;
      &lt;div class=&quot;column middle&quot;&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;I&lt;/dt&gt;
          &lt;dd&gt;Mark selection as read&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;U&lt;/dt&gt;
          &lt;dd&gt;Mark selection as unread&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;e&lt;/dt&gt;
          &lt;dd&gt;Close selection&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;y&lt;/dt&gt;
          &lt;dd&gt;Remove selection from view&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;&lt;!-- /.column.middle --&gt;
      &lt;div class=&quot;column last&quot;&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;c&lt;/dt&gt;
          &lt;dd&gt;Create issue&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;l&lt;/dt&gt;
          &lt;dd&gt;Create label&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;i&lt;/dt&gt;
          &lt;dd&gt;Back to inbox&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;u&lt;/dt&gt;
          &lt;dd&gt;Back to issues&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;/&lt;/dt&gt;
          &lt;dd&gt;Focus issues search&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div style='display:none'&gt;
    &lt;div class=&quot;rule&quot;&gt;&lt;/div&gt;

    &lt;h3&gt;Issues Dashboard&lt;/h3&gt;

    &lt;div class=&quot;columns threecols&quot;&gt;
      &lt;div class=&quot;column first&quot;&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;j&lt;/dt&gt;
          &lt;dd&gt;Move selection down&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;k&lt;/dt&gt;
          &lt;dd&gt;Move selection up&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;o &lt;em&gt;or&lt;/em&gt; enter&lt;/dt&gt;
          &lt;dd&gt;Open issue&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;&lt;!-- /.column.first --&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div style='display:none'&gt;
    &lt;div class=&quot;rule&quot;&gt;&lt;/div&gt;

    &lt;h3&gt;Network Graph&lt;/h3&gt;
    &lt;div class=&quot;columns equacols&quot;&gt;
      &lt;div class=&quot;column first&quot;&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;&lt;span class=&quot;badmono&quot;&gt;←&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; h&lt;/dt&gt;
          &lt;dd&gt;Scroll left&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;&lt;span class=&quot;badmono&quot;&gt;→&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; l&lt;/dt&gt;
          &lt;dd&gt;Scroll right&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;&lt;span class=&quot;badmono&quot;&gt;↑&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; k&lt;/dt&gt;
          &lt;dd&gt;Scroll up&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;&lt;span class=&quot;badmono&quot;&gt;↓&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; j&lt;/dt&gt;
          &lt;dd&gt;Scroll down&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;t&lt;/dt&gt;
          &lt;dd&gt;Toggle visibility of head labels&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;&lt;!-- /.column.first --&gt;
      &lt;div class=&quot;column last&quot;&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;shift &lt;span class=&quot;badmono&quot;&gt;←&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; shift h&lt;/dt&gt;
          &lt;dd&gt;Scroll all the way left&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;shift &lt;span class=&quot;badmono&quot;&gt;→&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; shift l&lt;/dt&gt;
          &lt;dd&gt;Scroll all the way right&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;shift &lt;span class=&quot;badmono&quot;&gt;↑&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; shift k&lt;/dt&gt;
          &lt;dd&gt;Scroll all the way up&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;shift &lt;span class=&quot;badmono&quot;&gt;↓&lt;/span&gt; &lt;em&gt;or&lt;/em&gt; shift j&lt;/dt&gt;
          &lt;dd&gt;Scroll all the way down&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;&lt;!-- /.column.last --&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div style='display:none'&gt;
    &lt;div class=&quot;rule&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;columns threecols&quot;&gt;
      &lt;div class=&quot;column first&quot; style='display:none'&gt;
        &lt;h3&gt;Source Code Browsing&lt;/h3&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;t&lt;/dt&gt;
          &lt;dd&gt;Activates the file finder&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;l&lt;/dt&gt;
          &lt;dd&gt;Jump to line&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;w&lt;/dt&gt;
          &lt;dd&gt;Switch branch/tag&lt;/dd&gt;
        &lt;/dl&gt;
        &lt;dl class=&quot;keyboard-mappings&quot;&gt;
          &lt;dt&gt;y&lt;/dt&gt;
          &lt;dd&gt;Expand URL to its canonical form&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;div id=&quot;markdown-help&quot; class=&quot;instapaper_ignore readability-extra&quot;&gt;
  &lt;h2&gt;Markdown Cheat Sheet&lt;/h2&gt;

  &lt;div class=&quot;cheatsheet-content&quot;&gt;

  &lt;div class=&quot;mod&quot;&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;h3&gt;Format Text&lt;/h3&gt;
      &lt;p&gt;Headers&lt;/p&gt;
      &lt;pre&gt;
# This is an &amp;lt;h1&amp;gt; tag
## This is an &amp;lt;h2&amp;gt; tag
###### This is an &amp;lt;h6&amp;gt; tag&lt;/pre&gt;
     &lt;p&gt;Text styles&lt;/p&gt;
     &lt;pre&gt;
*This text will be italic*
_This will also be italic_
**This text will be bold**
__This will also be bold__

*You **can** combine them*
&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;h3&gt;Lists&lt;/h3&gt;
      &lt;p&gt;Unordered&lt;/p&gt;
      &lt;pre&gt;
* Item 1
* Item 2
  * Item 2a
  * Item 2b&lt;/pre&gt;
     &lt;p&gt;Ordered&lt;/p&gt;
     &lt;pre&gt;
1. Item 1
2. Item 2
3. Item 3
   * Item 3a
   * Item 3b&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;h3&gt;Miscellaneous&lt;/h3&gt;
      &lt;p&gt;Images&lt;/p&gt;
      &lt;pre&gt;
![GitHub Logo](/images/logo.png)
Format: ![Alt Text](url)
&lt;/pre&gt;
     &lt;p&gt;Links&lt;/p&gt;
     &lt;pre&gt;
http://github.com - automatic!
[GitHub](http://github.com)&lt;/pre&gt;
&lt;p&gt;Blockquotes&lt;/p&gt;
     &lt;pre&gt;
As Kanye West said:

&gt; We're living the future so
&gt; the present is our past.
&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;rule&quot;&gt;&lt;/div&gt;

  &lt;h3&gt;Code Examples in Markdown&lt;/h3&gt;
  &lt;div class=&quot;col&quot;&gt;
      &lt;p&gt;Syntax highlighting with &lt;a href=&quot;http://github.github.com/github-flavored-markdown/&quot; title=&quot;GitHub Flavored Markdown&quot; target=&quot;_blank&quot;&gt;GFM&lt;/a&gt;&lt;/p&gt;
      &lt;pre&gt;
```javascript
function fancyAlert(arg) {
  if(arg) {
    $.facebox({div:'#foo'})
  }
}
```&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;p&gt;Or, indent your code 4 spaces&lt;/p&gt;
      &lt;pre&gt;
Here is a Python code example
without syntax highlighting:

    def foo:
      if not bar:
        return true&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;p&gt;Inline code for comments&lt;/p&gt;
      &lt;pre&gt;
I think you should use an
`&amp;lt;addr&amp;gt;` element here instead.&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;/div&gt;
&lt;/div&gt;


    &lt;div class=&quot;ajax-error-message&quot;&gt;
      &lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;/span&gt; Something went wrong with that request. Please try again. &lt;a href=&quot;javascript:;&quot; class=&quot;ajax-error-dismiss&quot;&gt;Dismiss&lt;/a&gt;&lt;/p&gt;
    &lt;/div&gt;

    
    
    
    &lt;span id='server_response_time' data-time='0.02685' data-host='fe10'&gt;&lt;/span&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre></noscript></div>


<p>&#8220;Error 843? What the hell is that?&#8221; <code>vcl_recv</code> is intercepting requests for crossdomain.xml and returning an illegal, non-standard, stupid error. 843 is meaningful to those familiar with Flash socket connections as the TCP port number for socket policy requests. (I wrote a <a href="http://github.com/jelder/flashpolicyd/">server</a> for this a while ago.)</p>

In <code>vcl_error</code>, we catch 843&#8217;s and synthesize a response. The response has a far-future expiration and a 200 response code. These requests are served even faster than Varnish&#8217;s already blindingly fast cache hits.
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fun with SSL]]></title>
    <link href="http://blog.jacobelder.com/2009/08/fun-with-ssl/"/>
    <updated>2009-08-25T19:59:00Z</updated>
    <id>http://blog.jacobelder.com/2009/08/fun-with-ssl</id>
    <content type="html"><![CDATA[<p>I&#8217;m sure you love renewing SSL certificates almost as much as I do. Nothing beats the satisfaction of&#8230; slogging through a bunch of complicated commands you haven&#8217;t typed in years just to maintain status quo. Right.</p>
<p>Having had an opportunity to take better notes on this process for my employer, I present to you a few brief commands to make renewing your SSL certificates almost painless.</p>
<ol>
<li>First, check your expiration date.
<br />
<br />
<pre>openssl s_client -connect host01.example.com:443 &lt; /dev/null 2&gt; /dev/null |\
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |\
   openssl x509 -enddate

</pre>
</li>
<li>Renewal time is an great opportunity to rotate your key. This is technically optional but it&#8217;s good practice:
<br />
<br />
<pre>openssl genrsa -out example_com.key 1024
</pre>
</li>
<li>You&#8217;ll need both the key and the about-to-expire certificate in the current directory for the next step. This will create a new CSR with all of the same parameters you used last time. Take this over to your preferred certificate authority and begin their renewal process.
<br />
<br />
<pre>openssl x509 \
    -x509toreq \
    -signkey example_com.key \
    -in example_com.crt
</pre>
</li>
</ol>
If you only need the key and certificate pair for your application (eg, Apache, NginX, slapd&#8230; most applications), you&#8217;re done. However, if you need to use this certificate with Java servers as well, keep reading (wildcard certificates for the win). This procedure is recommended for ActiveMQ but should be directly applicable to Tomcat et al.
<br />
<ol start="4">
<li>
The Java <code>keytool</code> command doesn&#8217;t offer any way to import an x.509 key by itself. The workaround is to first merge the x.509 certificate and key to a new PKCS12.
<br />
<br />
<pre>openssl pkcs12 \
    -export \
    -in example_com.crt \
    -inkey example_com.key \
    -out example_com.p12
</pre>
</li>
<li>
Now use <code>keytool</code> to convert that PKCS12 file into a Java keystore file. 
<br />
<br />
<pre>keytool \
    -importkeystore \
    -deststorepass changeme \
    -destkeypass changeme \
    -destkeystore keystore.jks \
    -srckeystore example_com.p12 \
    -srcstoretype PKCS12 \
    -srcstorepass changeme \
    -alias 1
</pre>
</li>
</ol>
That&#8217;s it. Like I said, I highly recommend wildcard certificates if you can afford the initial expense. I hate having to justify the expense and effort buying a new certificate each time I bring up a new service. Keeping your certificates in a git repository also takes away some of the stress here: no fears of screwing something up and deleting a file that cost you hundreds of dollars to generate.
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting busy with INFORMATION_SCHEMA]]></title>
    <link href="http://blog.jacobelder.com/2009/04/getting-busy-with-information_schema/"/>
    <updated>2009-04-08T19:13:00Z</updated>
    <id>http://blog.jacobelder.com/2009/04/getting-busy-with-information_schema</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been wanting to use this trick forever. Here&#8217;s how to quickly, effortlessly, and I should add, destructively, convert all tables in a given database to UTF8.</p>

<p><code>
mysql --batch information_schema -e "select concat('ALTER TABLE ', TABLE_NAME,' ONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as '--' from TABLES where TABLE_SCHEMA='somedb' and TABLE_COLLATION not like '%utf8%'" | mysql somedb
</code></p>

<p>The addition of INFORMATION_SCHEMA combined with CONCAT makes it possible to do arbitrarily cool things with MySQL. Love it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mushrooms tell us "the internet was inevitable" and something about fractal supertrees]]></title>
    <link href="http://blog.jacobelder.com/2009/01/mushrooms-tell-us-the-internet-was-inevitable-and-something-about-fractal-supertrees/"/>
    <updated>2009-01-21T04:56:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/mushrooms-tell-us-the-internet-was-inevitable-and-something-about-fractal-supertrees</id>
    <content type="html"><![CDATA[<object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talks/embed/PaulStamets_2008-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/PaulStamets-2008.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=258" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/PaulStamets_2008-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/PaulStamets-2008.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=258"></embed></object><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talks/embed/RichardPreston_2008-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/RichardPreston-2008.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=409" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/RichardPreston_2008-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/RichardPreston-2008.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=409"></embed></object>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Imogen Heap is proof that the future worked]]></title>
    <link href="http://blog.jacobelder.com/2009/01/imogen-heap-is-proof-that-the-future-worked/"/>
    <updated>2009-01-21T04:30:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/imogen-heap-is-proof-that-the-future-worked</id>
    <content type="html"><![CDATA[<p>I was promised the future. By that I mean, yes, it went almost without question (statistically) that I would still be alive in 2009. The future was something more; something with a recognizable taste. As a child I knew without question that as I grew up, even more so could the world I may inherit. I mean something more than just years when I say <em>the future</em>.</p><p>Superman, The Jetsons, James Kirk and a black and white TV told me things, beautiful things. Adventure and possibility beyond imagination. Perfect worldwide peace without disease or poverty. Ubiquitous, effortless flight. Probably, a black president with a stage presence like Morgan Freeman. Above all, I expected to see the limitless reach of human exploration and expression. I want to talk about that last point for a second.</p><p>Imogen Heap confirms for me that the future has not only already arrived, but has delivered fully on one promise. Here we see a young woman controlling a fantastic array of electronic equipment. Any single component, if presented to NASA&#8217;s best engineers in 1969, would have seemed impossibly sophisticated. She, alone on stage, uses this future artifact not to explore space or design pharmaceuticals, but to project without restraint her imagination onto our consciousness.</p><p><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/dHk2lLaDzlM&amp;hl=en&amp;fs=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/dHk2lLaDzlM&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object></p><p>That&#8217;s the highest quality recording I can find on YouTube. I strongly suggest you go support this artist in any way you can, and with that being said, here&#8217;s my favorite rendition of <a href="http://jelder.s3.amazonaws.com/Hide%20and%20Seek.mp3">Hide and Seek</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Female Vocalists on YouTube]]></title>
    <link href="http://blog.jacobelder.com/2009/01/female-vocalists-on-youtube/"/>
    <updated>2009-01-21T02:56:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/female-vocalists-on-youtube</id>
    <content type="html"><![CDATA[<p>I&#8217;ve had a post on female vocalists brewing for a while and this isn&#8217;t it. However, you really should take a listen to <a href="http://www.youtube.com/user/natalydawn">Nataly Dawn</a>. She has that timeless, ethereal sort of sound which I find mesmerizing, and I won&#8217;t lie; when she makes eye contact with the camera I fall apart a little.</p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/OvYZMqQffQE&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/OvYZMqQffQE&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

</p>On a somewhat related note, seeing Barack Obama&#8217;s <a href="http://www.whitehouse.gov/assets/presidents/896x504/44bo_header2.jpg">face</a> on the new <a href="http://whitehouse.gov">WhiteHouse.gov</a> is like watching boobs bounce in slow motion.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Huygens' Titan descent telemetry, visualized]]></title>
    <link href="http://blog.jacobelder.com/2009/01/huygens-titan-descent-telemetry-visualized/"/>
    <updated>2009-01-18T21:30:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/huygens-titan-descent-telemetry-visualized</id>
    <content type="html"><![CDATA[<img src="http://www.nasa.gov/images/content/148082main_PIA08117-516.jpg" /><blockquote>This movie, built with data collected during the European Space Agency&#8217;s Huygens probe on Jan. 14, 2005, shows the operation of the Descent Imager/Spectral Radiometer camera during its descent and after touchdown. The camera was funded by NASA. </blockquote><p>The article doesn&#8217;t do justice to how much beauty exists in this visualization of data. The brief and glorious life of the Huygens lander, dropped from the Cassini probe into the atmosphere of Titan, is compressed from 4 hours to just a few minutes. A unique chime as if from a child&#8217;s xylophone accompanies each sensor reading. As Huygens&#8217; last meters close, the final intrusion of poetry into science is utterly disarming.</p><p>If anyone can find a higher resolution form of this video it would be greatly appreciated.</p>
<a href="http://www.nasa.gov/mission_pages/cassini/multimedia/pia08117.html">Link</a>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Life imitating art: WALL&bull;M]]></title>
    <link href="http://blog.jacobelder.com/2009/01/life-imitating-art-wallm/"/>
    <updated>2009-01-18T21:00:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/life-imitating-art-wallm</id>
    <content type="html"><![CDATA[<img style="margin: 0pt 0pt 10px 10px; float: right; width: 180px; height: 166px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Sojourner_on_Mars_PIA01122.jpg/180px-Sojourner_on_Mars_PIA01122.jpg" alt="" border="0" />
Meanwhile, at the Carl Sagan Memorial Station (née Pathfinder) on Mars:<blockquote><p>Unlike Spirit and Opportunity, Sojourner could not directly communicate with Earth and had to rely on the lander to transmit messages about its health and travels. So when contact with the lander, which was designed to last one month, was lost after three months, ground controllers were not sure what became of Sojourner.</p><p>Now, it seems the rover kept moving, apparently trying to reach its companion. &#8220;The rover was programmed so that if it didn&#8217;t get commands from the lander, it would assume it somehow got out of radio contact behind a ridge or rock,&#8221; Parker told New Scientist. &#8220;So it would drive to the lander as best it could and keep trying to re-establish contact&#8221;, circling it as it got close, he says.</p><p>When it was last seen, the rover was 13 metres away from the Pathfinder lander. Now, it appears to be about 6 metres away, according to the new MRO images. &#8220;I think the simplest explanation is it started to drive back, got about half way, and stopped for whatever reason - it may have thought it got there,&#8221; says Parker. &#8220;The other possibility is it <em>drove around and around for who knows how long and simply failed at that location</em>.&#8221;</p></blockquote>
Emphasis mine. <a href="http://www.newscientist.com/article/dn10945">Full article at New Scientist.</a>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Shackleton Crater and the "shit knife"]]></title>
    <link href="http://blog.jacobelder.com/2009/01/shackleton-crater-and-the-shit-knife/"/>
    <updated>2009-01-11T04:03:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/shackleton-crater-and-the-shit-knife</id>
    <content type="html"><![CDATA[<object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talks/embed/BillStone_2007-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/BillStone-2007.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=141" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/BillStone_2007-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/BillStone-2007.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=141"></embed></object>
<object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talks/embed/WadeDavis_2003-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/WadeDavis-2003.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=69" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/WadeDavis_2003-embed_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/WadeDavis-2003.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=69"></embed></object>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Here's something for the before-you-die list]]></title>
    <link href="http://blog.jacobelder.com/2009/01/heres-something-for-the-before-you-die-list/"/>
    <updated>2009-01-10T04:36:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/heres-something-for-the-before-you-die-list</id>
    <content type="html"><![CDATA[Of course, it would be wise to put this at the very end of the list.
<object width="400" height="219"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1778399&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1778399&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="219"></embed></object><br /><a href="http://vimeo.com/1778399">wingsuit base jumping</a> from <a href="http://vimeo.com/thedoctor">Ali</a> on <a href="http://vimeo.com">Vimeo</a>.
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Unofficial Git & GitNub for MacOS Leopard]]></title>
    <link href="http://blog.jacobelder.com/2009/01/unofficial-git-gitnub-for-macos-leopard/"/>
    <updated>2009-01-07T18:36:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/unofficial-git-gitnub-for-macos-leopard</id>
    <content type="html"><![CDATA[<p>I have made available a completely unofficial but functional MacOS Leopard build of git and the excellent <a href="http://wiki.github.com/Caged/gitnub">GitNub</a> viewer. To install, pretend I&#8217;m a trustworthy individual and run:</p><p><span style="font-family:courier new;">curl http://jelder.s3.amazonaws.com/git-1.6.1-leopard.tar.gz | sudo tar xvzf - -C /</span></p><p>This will put git in /usr/local/bin/git (with other support files in /usr/local/libexec and /usr/local/share). The nub script in /usr/local/bin/nub will launch GitNub from the current directory.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mint needs a better workflow]]></title>
    <link href="http://blog.jacobelder.com/2009/01/mint-needs-a-better-workflow/"/>
    <updated>2009-01-03T15:30:00Z</updated>
    <id>http://blog.jacobelder.com/2009/01/mint-needs-a-better-workflow</id>
    <content type="html"><![CDATA[Just posted this to the Mint.com user forums.
<blockquote><p>Most of my Mint&#8217;s value for us users comes from knowing how our money is getting spent, but one critical part of that use case is missing: a workflow for rapid categorization.</p><p>Mint needs a really slick way to let me sit down once a month and quickly categorize all of my uncatagorized transactions. I should be presented with a queue of transactions from unknown merchants and some method for applying labels, splitting bills, etc. Ideally, I should be able to keep my hands on the keyboard for this, and it should take like 5 minutes a month or less.</p><p>This can be done manually now, of course, but it&#8217;s far from efficient. The ajax stuff in the transactions tab has improved but it&#8217;s still too chunky and slow on a modern MacBook Pro and Firefox 3.0. The experience should be less hunt-pick-wait and more next-next-next.</p><p>With more complete vendor preference profiles for each user, Mint should be able to monetize via more focused opportunities. Good luck guys! Mint is great but it&#8217;s not complete!</blockquote>
The thread is <a href="http://forums.mint.com/showthread.php?t=5990">here</a>.
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Git is Exquisite]]></title>
    <link href="http://blog.jacobelder.com/2008/12/git-is-exquisite/"/>
    <updated>2008-12-29T22:44:00Z</updated>
    <id>http://blog.jacobelder.com/2008/12/git-is-exquisite</id>
    <content type="html"><![CDATA[<p>Possibly the best thing about git is that you can <a href="http://www.kernel.org/pub/software/scm/git/docs/git-init.html">start from an existing directory</a>. This makes it amazing for tracking configuration files.</p><p><span style="font-family:courier new;">cd /etc/ldap ; git init ; git add . ; git commit -m &#8220;got some config religion&#8221;</span></p><p>Too bad one can&#8217;t use <a href="http://github.com/">GitHub</a> for this, but remote backups and batch config changes get really elegant with kind of setup.
</p>
]]></content>
  </entry>
  
</feed>
