<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>QuirkeyBlog &#187; Ruby</title>
	<atom:link href="http://www.quirkey.com/blog/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.quirkey.com/blog</link>
	<description>A Developer with too little time.</description>
	<lastBuildDate>Mon, 01 Aug 2011 16:07:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Coming to a town near you</title>
		<link>http://www.quirkey.com/blog/2010/02/09/coming-to-a-town-near-you/</link>
		<comments>http://www.quirkey.com/blog/2010/02/09/coming-to-a-town-near-you/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 12:00:50 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Talks]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=408</guid>
		<description><![CDATA[I&#8217;m very excited to announce some engagements coming up in the next couple of months. First and closest, I&#8217;ll be giving a talk today (Tues. Feb. 9th 2010) at my hometown Ruby Brigade, nyc.rb The talk will be about Resque and resque-status. Currently the event is &#8216;sold out&#8217; but if you ping the list or [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;m very excited to announce some engagements coming up in the next couple of months. First and closest, I&#8217;ll be giving a talk today (Tues. Feb. 9th 2010) at my hometown Ruby Brigade, <a href="http://nycruby.org/wiki/" title="">nyc.rb</a> The talk will be about <a href="http://github.com/defunkt/resque" title="">Resque</a> and <a href="http://github.com/quirkey/resque-status" title="">resque-status</a>. Currently the event is &#8216;sold out&#8217; but if you ping the list or someone in #irc before, you might be able to get a last minute spot. My slides are ready to go, so I&#8217;ll post them as soon as the talk is over.</p>

	<p>Second, I&#8217;m headed back to Edinburgh to speak at <a href="http://scottishrubyconference.com/" title="">the Scottish Ruby Conference.</a> I love this city, and the conference last year was very much above par. I&#8217;m excited to say I&#8217;ll be talking about JavaScript at a Ruby Conference. I&#8217;ve been working this talk out in my head for a long time, through lessons learned and taught to my colleagues and clients. There are also a lot of other great looking talks, including Tim Bray, Alexander Lang, Scott Chacon. Actually, the whole conference looks pretty incredible. I guarantee fun. As of writing this, there are still tickets available, <a href="http://scottishrubyconference.eventwax.com/scottish-ruby-conference-2010/register" title="">so register now</a>.</p>

	<p>Third, and possibly most exciting, I&#8217;m very proud <a href="http://jsconf.posterous.com/announcing-aaron-quinta" title="">to be chosen to speak</a> at <a href="http://jsconf.us/2010" title="">JSConf 2010.</a> I heard nothing but &#8220;AWESOME&#8221; about last years event, and I kept hitting myself for missing it. This year the esteemed <a href="http://twitter.com/voodootikigod" title="">Chris Williams</a> is putting together what promises to be the best techincal conference ever. I can&#8217;t even say how excited I am to be a part of it. The status is <a href="http://jsconf.posterous.com/the-soon-to-be-awkward-moment" title="">that the conference is already sold out,</a> but I would follow <a href="http://twitter.com/jsconf" title="">@jsconf</a> with a watchful eye to see if there are any announcements. Chris is also a lover of beer, so I cant promise anything, but some very very rare bottles might sway his favor.</p>

	<p>There are some other proposals out there as well, but these two confs were all I did this year, I&#8217;d be pretty happy.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2010/02/09/coming-to-a-town-near-you/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wejetset City Notes Interactive: Notes from Sammy.js in Production</title>
		<link>http://www.quirkey.com/blog/2009/12/16/wejetset-city-notes-interactive-notes-from-sammy-js-in-production/</link>
		<comments>http://www.quirkey.com/blog/2009/12/16/wejetset-city-notes-interactive-notes-from-sammy-js-in-production/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 16:50:51 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sammy]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=388</guid>
		<description><![CDATA[Last week I had the pleasure of launching a big new feature set into production for one of my favorite clients, Wejetset. The excitement was greatly enhanced by the fact that City Notes Interactive makes full use of my own special framework, Sammy.js. City Notes and the other features deployed were an almost ideal project. [...]]]></description>
			<content:encoded><![CDATA[<img src="http://img.skitch.com/20091216-nt27x3jx17jc8drh7x51aandhh.jpg" alt="wejetset - city notes"/><p>Last week I had the pleasure of launching a big new feature set into production for one of my favorite clients, <a href="http://www.wejetset.com">Wejetset.</a> The excitement was greatly enhanced by the fact that <a href="http://www.wejetset.com/city_notes">City Notes Interactive</a> makes full use of my own special framework, <a href="http://code.quirkey.com/sammy">Sammy.js.</a></p>
<p>City Notes and the other features deployed were an almost ideal project. The design and direction was an awesome back-and-forth collaboration between myself, Tom Ran of <a href="http://thescoutmag.com">The Scout</a> fame, and the face and brains behind Wejetset, Taj Reid. I could probably talk forever about how much fun it is to work with those guys, but in this post I&#8217;d rather dive deeper into the challenges and takeaways in the actual code.</p>
<span id="more-388"></span>
<p>I knew right from the beginning that Sammy would be a good fit for this. The question was how. Sammy let me think about the construction of the app in terms of routes and instantly gave me a way to create perma-links to specific notes and even specific filters.</p>
<h3>Templating</h3>
<p>One of the first decisions I made was to go with server-side templating. As much as I am and have been a proponent of pushing everything client-side, for this specific app it made much less sense. Specifically, there are other places throughout the site where I&#8217;m using the same templates and the benefits of re-using them were just too strong. Also, this gives the extra bonus of making the site a little more google friendly. In fact, without JavaScript the most recent notes still display and can link to the right destinations.</p>
<h3>Forms</h3>
<p>One thing that I wanted to streamline as much as possible is handling forms &#8211; posting them to the server and handling the responses without leaving the page. I came up with a useful method &#8211; <code>postFormDirectly()</code> &#8211; that handles the post route and submits it directly to the server, handling the response and sending it back to a callback.</p>
<p>Heres an example call, for positing the form to create city notes.</p>
<div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nx">postFormDirectly</span><span class="p">(</span><span class="s1">&#39;/city_notes&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span> <br />
  <span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span> <span class="o">==</span> <span class="s1">&#39;success&#39;</span><span class="p">)</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">redirect</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="p">);</span><br />
  <span class="p">}</span><br />
<span class="p">});</span><br />
</pre></div>
<p>Instantly, you can tell that a lot is abstracted and changed from a traditional route. Here we&#8217;re routing on an actual <span class="caps">URI</span> as opposed to just an anchor. This has the added benefit of allowing the form to work without JS. (<em>As an aside, I&#8217;ve personally found a key to making degradable and unit testable sites is to first make the process work (albeit without any flair) without JS and then add the code to push the interactions and the single page-ness.</em>)</p>
<p>To give a little more insight, heres the implementation:</p>
<div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nx">postFormDirectly</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</span><span class="o">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span><br />
  <span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="k">this</span><span class="o">;</span><br />
  <span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">path</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">context</span><span class="p">)</span> <span class="p">{</span><br />
    <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="k">this</span><span class="o">,</span><br />
        <span class="nx">post_path</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">path</span><span class="o">,</span> <br />
        <span class="nx">wrapped_callback</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">response</span><span class="p">)</span> <span class="p">{</span><br />
          <span class="nx"><span class="caps">WJS</span></span><span class="p">.</span><span class="nx">handleResponse</span><span class="p">(</span><span class="nx">response</span><span class="o">,</span> <span class="nx">context</span><span class="p">.</span><span class="nx">params</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">r</span><span class="p">)</span> <span class="p">{</span><br />
            <span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">callback</span><span class="p">))</span> <span class="p">{</span><br />
              <span class="nx">callback</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">context</span><span class="o">,</span> <span class="p">[</span><span class="nx">r</span><span class="p">]);</span><br />
            <span class="p">}</span><br />
          <span class="p">});</span><br />
        <span class="p">};</span><br />
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">post_path</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/js$/</span><span class="p">))</span> <span class="p">{</span> <span class="nx">post_path</span> <span class="o">=</span> <span class="nx">post_path</span> <span class="o">+</span> <span class="s1">&#39;?format=js&#39;</span><span class="o">;</span> <span class="p">}</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">[</span><span class="s1">&#39;$form&#39;</span><span class="p">].</span><span class="nx">find</span><span class="p">(</span><span class="s1">&#39;:input&#39;</span><span class="p">).</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">&#39;clear-errors&#39;</span><span class="p">);</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">[</span><span class="s1">&#39;$form&#39;</span><span class="p">].</span><span class="nx">ajaxSubmit</span><span class="p">({</span><br />
      <span class="nx">url</span><span class="o">:</span> <span class="nx">post_path</span><span class="o">,</span><br />
      <span class="nx">dataType</span><span class="o">:</span> <span class="s1">&#39;json&#39;</span><span class="o">,</span><br />
      <span class="nx">success</span><span class="o">:</span> <span class="nx">wrapped_callback</span><span class="o">,</span><br />
      <span class="nx">error</span><span class="o">:</span> <span class="nx">wrapped_callback</span><br />
    <span class="p">}).</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">&#39;show-loading&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
<span class="p">};</span><br />
</pre></div>
<p>Lets take a little walk through. First and formost, we&#8217;re just adding a <code>post</code> route to our Sammy app. The contents of this route allow us to use jquery.form&#8217;s nifty <code>ajaxSubmit</code> to send the form to the server without reloading the page. We&#8217;re creating a response callback for the ajax request called <code>wrapped_callback</code> which takes the response from the server, passes it to <code>handleResponse</code> which then in turn calls our passed callback if it exists. <code>handleResponse</code> does a lot, too, but I&#8217;m not going to post the contents here (though I might make it into a plugin &#8230;). All you need to know is that the response from the server is <span class="caps">JSON</span> and looks something like:</p>
<div class="highlight"><pre><span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="o">:</span> <span class="s2">&quot;success&quot;</span><span class="o">,</span> <span class="s2">&quot;message&quot;</span><span class="o">:</span> <span class="s2">&quot;You&#39;re note was posted successfuly.&quot;</span><span class="p">}</span><br />
</pre></div>
<p><code>handleResponse</code> displays the little flash message and also highlights the form if there are errors. I use this pattern on a number of projects and it seems to work pretty well.</p>
<p>One neat Sammy tidbit you might not have known about, in post &amp; put routes, there is always a &#8216;$form&#8217; param which is a jQuery object containing the <span class="caps">HTML</span> form that submitted to the route. Very useful for cases like above.</p>
<h3>Modals</h3>
<p>If you play around with the app, you&#8217;ll notice that we make pretty good use of modal windows for actions (submit/share/email to friend). The cool thing about using Sammy for this is they&#8217;re just routes, so refreshing the page or linking jumps directly to them. I also wrote a little jQuery extension that I found extremely useful for them:</p>
<div class="highlight"><pre><span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">findOrAppend</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">selector</span><span class="o">,</span> <span class="nx">element</span><span class="p">)</span> <span class="p">{</span><br />
  <span class="kd">var</span> <span class="nx">$this</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">)</span><span class="o">,</span> <br />
      <span class="nx">$el</span> <span class="o">=</span> <span class="nx">$this</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span><br />
  <span class="k">if</span> <span class="p">(</span><span class="nx">$el</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="nx">$el</span><span class="o">;</span> <br />
  <span class="c">// el doesnt exist so lets make it</span><br />
  <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">element</span> <span class="o">==</span> <span class="s1">&#39;undefined&#39;</span><span class="p">)</span> <span class="p">{</span><br />
    <span class="c">// figure out how to build the element from the selector</span><br />
    <span class="kd">var</span> <span class="nx">parts</span> <span class="o">=</span> <span class="nx">selector</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">);</span><br />
    <span class="nx">$el</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;&lt;div&gt;&quot;</span><span class="p">);</span><br />
    <span class="k">if</span> <span class="p">(</span><span class="nx">parts</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span><br />
      <span class="c">// single selector so just added</span><br />
      <span class="nx">$el</span><span class="p">.</span><span class="nx">addSelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span><br />
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br />
      <span class="c">// selector with multiple depth so we just want the last selector</span><br />
      <span class="nx">$el</span><span class="p">.</span><span class="nx">addSelector</span><span class="p">(</span><span class="nx">parts</span><span class="p">.</span><span class="nx">pop</span><span class="p">());</span><br />
      <span class="c">// find this down the parts</span><br />
      <span class="nx">$this</span> <span class="o">=</span> <span class="nx">$this</span><span class="p">.</span><span class="nx">findOrAppend</span><span class="p">(</span><span class="nx">parts</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">));</span><br />
    <span class="p">}</span><br />
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br />
    <span class="c">// we provided a specific element</span><br />
    <span class="nx">$el</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span><br />
  <span class="p">}</span><br />
  <span class="c">// append it</span><br />
  <span class="nx">$this</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">$el</span><span class="p">);</span><br />
  <span class="c">// return it</span><br />
  <span class="k">return</span> <span class="nx">$el</span><span class="o">;</span><br />
<span class="p">};</span><br />
</pre></div>
<p><code>findOrAppend()</code> takes a selector (I used it mostly with #ids) and creates a series of nested divs (if needed) that matches that selector.</p>
<p>For example, given <span class="caps">HTML</span>:</p>
<div class="highlight"><pre><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span><br />
  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;&lt;/div&gt;</span><br />
<span class="nt">&lt;/div&gt;</span><br />
</pre></div>
<p>And we wanted to replace the contents of an element #submit_modal inside of it:</p>
<div class="highlight"><pre><span class="kd">var</span> <span class="nx">$modal</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">).</span><span class="nx">findOrAppend</span><span class="p">(</span><span class="s1">&#39;#main #submit_modal&#39;</span><span class="p">);</span><br />
</pre></div>
<p>The first time its called, it actually creates the neccesary #submit_modal div and returns it. However, if it exists already, it will just find it using <code>$.fn.find()</code> and return it.</p>
<p>For modals, this allows me to ensure that the container exists first, then replace it with the contents of the modal that I&#8217;m fetching from the server.</p>
<div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nx">helpers</span><span class="p">({</span><br />
  <span class="c">// &#8230;</span><br />
  <span class="nx">showModal</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</span><span class="o">,</span> <span class="nx">selector</span><span class="o">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span><br />
    <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="k">this</span><span class="o">;</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">showLoading</span><span class="p">();</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">loadNotesInBackground</span><span class="p">();</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="nx">path</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">form</span><span class="p">)</span> <span class="p">{</span><br />
      <span class="kd">var</span> <span class="nx">$el</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">$element</span><span class="p">()</span><br />
                <span class="p">.</span><span class="nx">findOrAppend</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span><br />
      <span class="kd">var</span> <span class="nx">$close</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;&lt;img src=&quot;/images/button_remove.gif&quot; alt=&quot;close&quot; class=&quot;close_modal&quot; /&gt;&#39;</span><span class="p">);</span>                    <br />
      <span class="nx">$el</span><span class="p">.</span><span class="nx">hide</span><span class="p">().</span><span class="nx">html</span><span class="p">(</span><span class="nx">form</span><span class="p">);</span><br />
      <span class="nx">$close</span><span class="p">.</span><span class="nx">prependTo</span><span class="p">(</span><span class="nx">$el</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
        <span class="nx">$el</span><span class="p">.</span><span class="nx">slideUp</span><span class="p">(</span><span class="mi">200</span><span class="p">);</span><br />
        <span class="nx">context</span><span class="p">.</span><span class="nx">redirect</span><span class="p">(</span><span class="s1">&#39;#&#39;</span><span class="o">,</span> <span class="nx">context</span><span class="p">.</span><span class="nx">conditionsToURL</span><span class="p">());</span><br />
      <span class="p">});</span><br />
      <span class="k">if</span> <span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> <span class="nx">callback</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">context</span><span class="o">,</span> <span class="p">[</span><span class="nx">$el</span><span class="p">]);</span> <span class="p">}</span><br />
      <span class="c">// bind error handlers</span><br />
      <span class="nx">context</span><span class="p">.</span><span class="nx">bindFormErrorHandlers</span><span class="p">();</span><br />
      <span class="nx">context</span><span class="p">.</span><span class="nx">hideLoading</span><span class="p">();</span><br />
      <span class="nx">$el</span><span class="p">.</span><span class="nx">slideDown</span><span class="p">();</span><br />
      <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#main&#39;</span><span class="p">).</span><span class="nx">slideTo</span><span class="p">();</span><br />
    <span class="p">});</span><br />
  <span class="p">}</span><br />
  <span class="c">//&#8230;</span><br />
<span class="p">});</span><br />
</pre></div>
<p>Here I have a helper that fetches the view/template from the server using <code>partial()</code> and then situates its content using <code>findOrAppend()</code>. It also does me the favor of adding the little close icon in the upper right corner. A typical use is for the login screen:</p>
<div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/login&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">context</span><span class="p">)</span> <span class="p">{</span><br />
 <span class="k">this</span><span class="p">.</span><span class="nx">showModal</span><span class="p">(</span><span class="s1">&#39;/account/login&#39;</span><span class="o">,</span> <span class="s1">&#39;#main #login_signup.modal&#39;</span><span class="p">)</span><br />
<span class="p">});</span><br />
</pre></div>
<h3>Analytics</h3>
<p>It has to be said as well that I&#8217;m really excited about the burgeoning Sammy.js community. I&#8217;m lucky enough to have some other really smart individuals working on Sammy projects and sharing some of their code through plugins. Thanks to <a href="http://britg.com/">Brit Gardner</a> and his <a href="http://github.com/britg/sammy-google-analytics">Sammy.GoogleAnalytics</a> plugin, adding analytics to the app was as easy as dropping in the file and adding one line to my app. That felt really really good. I hope more people will start sharing some plugins soon.</p>
<h3>A lot more</h3>
<p>There were a lot more discoveries over the months building this app then I can really share in a little blog post but needless to say, I&#8217;m going to try to bring the usefull and reusable stuff back into Sammy and plugins for everyone to use. If you want to hear more about it or have specific questions, dont hesitate to ping me on <span class="caps">IRC</span> or twitter or email the <a href="http://groups.google.com/group/sammyjs">Sammy mailing list.</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/12/16/wejetset-city-notes-interactive-notes-from-sammy-js-in-production/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What I&#8217;ve been up to: The last forever (Oct, Nov 09)</title>
		<link>http://www.quirkey.com/blog/2009/12/09/what-ive-been-up-to-the-last-forever-oct-nov-09/</link>
		<comments>http://www.quirkey.com/blog/2009/12/09/what-ive-been-up-to-the-last-forever-oct-nov-09/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 20:09:37 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sammy]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=385</guid>
		<description><![CDATA[The two week trip to California was nothing less than a great success. A fine blend of business and pleasure (with an emphasis on the relaxing). Highlights included: Going to RubyConf without actually going. Eating and drinking fine food and wine in Napa/Sonoma for 4 days non-stop. (Full list of vineyards and restaurants with menus [...]]]></description>
			<content:encoded><![CDATA[	<p>The two week trip to California was nothing less than a great success. A fine blend of business and pleasure (with an emphasis on the relaxing).</p>

	<p>Highlights included:</p>

	<ul>
		<li>Going to RubyConf without actually going.</li>
		<li>Eating and drinking fine food and wine in Napa/Sonoma for 4 days non-stop. (Full list of vineyards and restaurants with menus on request).</li>
		<li>Spending time with my lovely wife.</li>
		<li>Seeing friends I don&#8217;t get to see enough.</li>
	</ul>

	<p>Though this blog may tell a different story, I actually have been writing a lot of code as well:</p>

	<ul>
		<li>Most notably, the production, public-facing Sammy.js application I&#8217;ve been working so diligently on finally launched: <a href="http://www.wejetset.com/city_notes" title="">Wejetset City Notes Interactive.</a> I learned a ton writing and deploying it, and I promise to share a bunch of those lessons, soon.</li>
		<li>With the help of <a href="http://rvm.beginrescueend.com/" title="">the amazing rvm</a> I&#8217;ve started getting all my gems tested and working on Ruby 1.9. I think everyone should be doing the same, so if people are interested in my approach, maybe I&#8217;ll write a tutorial.</li>
		<li>I&#8217;ve even been porting other peoples gems to 1.9. Specifically <a href="http://github.com/quirkey/oauth/tree/1.9-nodeps" title="">I have a fork of the oauth gem</a> that works on Ruby 1.9.1 without any dependencies. It should be merged and released to the master oauth gem shortly.</li>
		<li>It&#8217;s been a long time coming, but I&#8217;ve been <a href="http://github.com/quirkey/qadmin/commits/master" title="">working on a big rewrite of qadmin</a> thats being used in production in a couple places. Its a lot easier to configure and extend and really just needs to have its documentation thoroughly updated before I can do a real release.</li>
		<li>I&#8217;ve also <a href="http://portfolio.quirkey.com" title="">updated my portfolio</a> to include links to my talks and some other new projects.</li>
	</ul>

	<p>I&#8217;m hoping to get some more blogging done and <span class="caps">OSS</span> releases out in the next couple of days so stay tuned!</p>

 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/12/09/what-ive-been-up-to-the-last-forever-oct-nov-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vegas: Rack it up</title>
		<link>http://www.quirkey.com/blog/2009/08/31/vegas-rack-it-up/</link>
		<comments>http://www.quirkey.com/blog/2009/08/31/vegas-rack-it-up/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 14:41:06 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=350</guid>
		<description><![CDATA[Even though I&#8217;ve done some presentations on it already, for some reason, Vegas, the simple sinatra starter, hasn&#8217;t gotten much press here. Maybe it was because I was a little embarrassed about its lack of test coverage, or just how simple it was. No longer, as of today, not only does it have some test [...]]]></description>
			<content:encoded><![CDATA[<p>Even though I&#8217;ve done some presentations on it already, for some reason, <a href="http://code.quirkey.com/vegas">Vegas, the simple sinatra starter</a>, hasn&#8217;t gotten much press here. Maybe it was because I was a little embarrassed about its lack of test coverage, or just how simple it was. No longer, as of today, not only does it have some test coverage, but its actually awesome enough to talk about.</p>
<span id="more-350"></span>
<p>Vegas::Runner is dirt simple. Basically, take your existing (or brand new) Sinatra, create a bin/ file and pass your app class to Vegas::Runner. Now when you run the bin, Vegas takes care of <span class="caps">PID</span>&#8217;s, options, finding a suitable Rack::Handler, etc. (More information <a href="http://code.quirkey.com/vegas">here</a>). <a href="http://code.quirkey.com/gembox">Gembox</a> is the canonical example, but there are others out there.</p>


<p>Before today, even though I claimed otherwise, Vegas was pretty dependent on Sinatra. I was O.K. with that. Sinatra had some niceties for starting up that I found it easier to rely on. Then I realized the potential of mounting/launching other, non-Sinatra Rack applications.</p>


<p>For example, <a href="http://getcloudkit.com">Cloudkit</a> is pretty cool. With the newest version of Vegas and Cloudkit, I can create a single file, command-line launch-able data based web service.</p>


<p>First, I create a bin. Lets call it &#8216;cloudcity&#8217;. The first thing I need to do is tell the bin that we&#8217;re going to execute this with ruby:</p>


<pre class="textmate-source"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>!/usr/bin/env ruby</span></span></pre>

<p>Next, lets require Cloudkit and Vegas.</p>

<pre class="textmate-source"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>!/usr/bin/env ruby
</span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>rubygems<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>vegas<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>cloudkit<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
</span></pre>

<p>OK, now that our env, is setup, we just have to build a little <span class="caps">JSON</span> schemaless data storage. Rack::Builder lets us just group all of the Rack middlewares and extensions we want into an &#8216;app&#8217;:</p>

<pre class="textmate-source"><span class="source source_ruby">app <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="support support_class support_class_ruby">Rack</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">Builder</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span> <span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby">do
</span>  expose <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>people</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>places</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
</span></pre>

<p>Next we just need to pass this app to Vegas::Runner and give it a name:</p>

<pre class="textmate-source"><span class="source source_ruby"><span class="support support_class support_class_ruby">Vegas</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">Runner</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>app<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>cloudcity<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
</span></pre>

<p>Thats it. Heres the whole app:</p>

<pre class="textmate-source"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>!/usr/bin/env ruby
</span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>rubygems<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>vegas<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
<span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>cloudkit<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>

app <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="support support_class support_class_ruby">Rack</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">Builder</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span> <span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby">do
</span>  expose <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>people</span><span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>places</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="support support_class support_class_ruby">Vegas</span><span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby">::</span><span class="support support_class support_class_ruby">Runner</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span>app<span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby">,</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>cloudcity<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span></span></pre>

<p>Now if we run: cloudcity in the terminal, Vegas will find an open port and launch us directly into the app. For now, we get this informative but semi-useless message:</p>


<p><img src="http://img.skitch.com/20090830-rd7fp6xya3utrdtd35frasnwja.jpg" alt="" /></p>


<p>Buuuuut, if we hit &#8217;/people&#8217; we get a friendly <span class="caps">JSON</span> delivery:</p>


<pre>{"total":0,"offset":0,"uris":[]}</pre>

<p>So that was a pretty trivial example. Vegas didnt add that much to Cloudkit&#8217;s existing awesomeness. However, take this as a prod to think about the possibilites. You could build a javascript app, that uses cloudkit as storage, package it as a gem, with a Vegas powered bin, and have an easily distributable browser-based application with <span class="caps">JSON</span> storage. The beauty of Cloudkit, is that besides Rack and Ruby, there arent really any other dependencies to worry about. I haven&#8217;t tried it yet, but potentially, you could use Vegas to distribute a modern (Rack-based) Rails app (the database part might be a little tough, though).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/08/31/vegas-rack-it-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails Rumble: Please Tag Your Photos</title>
		<link>http://www.quirkey.com/blog/2009/08/24/rails-rumble-please-tag-your-photos/</link>
		<comments>http://www.quirkey.com/blog/2009/08/24/rails-rumble-please-tag-your-photos/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 04:42:29 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=345</guid>
		<description><![CDATA[After a mere 48 hours, Rails rumble and the app we (@mrb_bk and I) set out to build, Please Tag Your Photos is launched. This was both of our first &#8216;rumble and I was really excited to participate after 2 years of sitting on the side-lines. Somehow, with not enough planning and really only about [...]]]></description>
			<content:encoded><![CDATA[	<p><img src="http://img.skitch.com/20090824-kdn6ewggrm9yw9q61627kt4sxy.jpg" alt="Please Tag Your Photos" /></p>

	<p>After a mere 48 hours, <a href="http://railsrumble.com" title="">Rails rumble</a> and the app we (<a href="http://twitter.com/mrb_bk" title="">@mrb_bk</a> and I) set out to build, <a href="http://pleasetagyourphotos.com" title="">Please Tag Your Photos</a> is launched.</p>

	<p><span id="more-345"></span></p>

	<p>This was both of our first &#8216;rumble and I was really excited to participate after 2 years of sitting on the side-lines. Somehow, with not enough planning and really only about 24 hours of coding we were able to get something functional up.</p>

	<p>What is <a href="http://pleasetagyourphotos" title="">Please Tag Your Photos?</a> Well, a while ago I realized that I had over 1000 photos on Flickr and half of them didn&#8217;t even have real titles. Sure, I remember the moments the photos have captured now, but what about 5 years from now? I tried to do the tagging and updating in Flickr, but unfortunately, the interface made it really difficult to breeze through a lot of photos. The idea was to make an interface that would guide you and encourage you to give your photos a proper dose of data. We got pretty far in our idea, but given the time and opportunity to work on it some more in the future, I think it could actually be really useful.</p>

	<h4>What works now:</h4>

	<ul>
		<li>Flickr authentication</li>
		<li>Some fancy background fetching and scoring of all your photos</li>
		<li>Updating the title, description, and tags of a photo (updates to flickr too)</li>
		<li>Simple &#8216;recent tags&#8217; interface</li>
		<li>Live score updates</li>
	</ul>

	<h4>What we wanted to work:</h4>

	<ul>
		<li>Geo-tagging interface</li>
		<li>Some nice flashy JS page loading to make it a single page app (<a href="http://code.quirkey.com/sammy" title="">Sammy</a>, duh)</li>
	</ul>

	<h4>What we knew we knew we werent going to get to this weekend but would like to play with at some point:</h4>

	<ul>
		<li>Image scanning (using OpenCV) to do facial recognition/tagging.</li>
		<li>Collaborative Photo tagging &#8211; earn &#8216;points&#8217; for suggesting tags for other peoples photos</li>
	</ul>

	<p>All in all, decently successful. We used MongoDB for this project and it boosted productivity in some places (not worrying about changing schemas) and was a big road block in others (getting it to work with DelayedJob). Either way it was cool to get to know it, I&#8217;ll definitely be using it for future projects. Somehow, in this exhaustive weekend of coding, I did manage to pack in: Curry Making, Two brunches, a <span class="caps">BBQ</span>, and some decent sleep. Not too shabby.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/08/24/rails-rumble-please-tag-your-photos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby Kaigi &#8217;09: Post-mortem</title>
		<link>http://www.quirkey.com/blog/2009/07/31/ruby-kaigi-09-post-mortem/</link>
		<comments>http://www.quirkey.com/blog/2009/07/31/ruby-kaigi-09-post-mortem/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 22:10:54 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=335</guid>
		<description><![CDATA[I consider myself very lucky that I was given an amazing opportunity to go to Japan and speak about Sinatra and Vegas (slides here). I attended all 3 days of the conference, and though I didn&#8217;t understand all of the Japanese talks (Leonard Chin did a great job translating the keynotes and some of the [...]]]></description>
			<content:encoded><![CDATA[	<p>I consider myself very lucky that I was given an amazing opportunity to go to Japan and speak about Sinatra and Vegas (<a href="http://www.slideshare.net/quirkey/aaron-quint-ruby-kaigi-presentation" title="">slides here</a>). I attended all 3 days of the conference, and though I didn&#8217;t understand all of the Japanese talks (<a href="http://twitter.com/lchin" title="">Leonard Chin</a> did a great job translating the keynotes and some of the other major talks) it gave me a whole new perspective on Ruby and the Ruby community.</p>

	<h3>The Hierarchy of the Ruby Community</h3>

	<p>As a Rubyist, I use the Ruby language almost every day. I know most of the stdlib and its methods without thinking. There are certain things I love about it and certain things I hate. Have I ever thought about submitting a patch to the Ruby language? No. There are a couple reasons for this: I don&#8217;t really know C; Ruby&#8217;s openness lets me change the stdlib without changing the language itself. Something I hadn&#8217;t really thought about before, though, is that I&#8217;m not a language implementer. In fact, this applies to basically every Rubyist outside of Japan. Rubyists in the US and the rest of the world fit into different parts of the Ruby Hierarchy. Japan, and Ruby Kaigi, however, is the home of language implementers. There&#8217;s something completely and utterly different about language vs framework vs plugin vs app. The discussions on a language level are on a much higher level. As Matz revealed in his keynote, there are a bunch of language feature branches that he&#8217;s been just toying with, some that have been sitting there for months. Most of them might never be part of Ruby. Thinking about the implications of a new feature, or a change in Ruby&#8217;s <span class="caps">API</span>, made me realize just how different the thought processes are within the different levels of the community.</p>

	<p>When I thought about this more I realized that there a some pretty clear delineations between different groups within the community. It started to look something like this:</p>

	<p><img src="http://www.quirkey.com/blog/uploads/ruby-triangle.jpg" alt="ruby-triangle" title="ruby-triangle" width="500" height="291" class="alignnone size-full wp-image-339" /></p>

	<p>The size of the section represents the relative pct of people involved. Each section feeds off each other, but the general flow of information and code is downwards.</p>

	<p>I&#8217;m sure people have theorized about this before. <a href="http://yehudakatz.com" title="">Yehuda Katz</a> has talked similarly about different groups of Rails users, App Developers, Plugin Developers, and something in between. Personally, I&#8217;d consider myself as a plugin and app developer, which is nothing to be ashamed of, its just interesting to actually think about the fact that even above rails core, there&#8217;s the interpreter implementers and above them an even smaller group of the ruby core. I&#8217;m not really complaining about this at all, its just an interesting way to look at the community that I hadn&#8217;t before.</p>

	<p>Being a fly on the wall to Yehuda talk to Matz about issues the Rails team is having refactoring, I was witness to an unfortunately rare moment. Knowledge traveling up the chain. This certainly happens to an extent already, but at the language level, for whatever reasons (language barrier, physical distance) the Japanese side of the Ruby community is doing some awesome things that we in the US don&#8217;t hear about and vice-versa. I&#8217;m hoping more people can make the trip out to the Kaigi and maybe more Japanese Rubyists could come to some of the conferences in the states or abroad.</p>

	<h3>Ruby for <strike>Fun</strike> <strike>Profit</strike> fun</h3>

	<p>Another theme that I heard again and again is that before Rails, Ruby was a language for hobbyists. Rails changed it, and the community into something else, driven by different needs and goals. I came in with the Rails crew so I cant speak to what Ruby was really like before, but I sensed a sort of dismay about this with some of the Japanese Rubyists. To a lot of them, Ruby may never be their full time jobs. While hacking away at <span class="caps">COBOL</span> during the day, Ruby is a wonderful escape. It seems trying to shove Ruby in to the enterprise any way you can, has resulted in a loss of the initial ingenious spark, to do this because its fun. I love that Ruby and Rails are primarily my day job, however, I think in order to stay motivated and continue to like what I do, its important to do some things just for the fun of it. Personally, I forget this a lot: the best way to get re-inspired is often to build something completely useless. Speed, security, unit-tests, and other features we consider important in production code are often the things that bog us down from creating inspired works of code. I think the community as a whole could benefit from a little more fucking around.</p>

	<p>Matz told a story in his keynote about how is father gave him a very large sharp knife to bring to school to sharpen his pencils. Sure it was dangerous, but he quickly learned how to use it and it gave him a great advantage over other students. He likened this to not wanting to have to dumb down Ruby so people couldn&#8217;t hurt themselves. In the end its better to have a sharp knife and learn how to use it. I would go further and say its important to push the limits of your own comfort with the tool in order to better learn how to use it. As Rubyists of all levels of experience, its important to challenge ourselves and the community for the sake of the challenge and fun, without always worrying about &#8216;is this secure?&#8217; or &#8216;hows the test coverage?&#8217;.</p>

	<p>In general the trip was a great success, I met a lot of people, got to hang out with some good friends and travel around a beautiful country I had never seen before (<a href="http://flickr.com/photos/katandaq/collections/72157621903151012/" title="">pictures here</a>). I strongly urge people to make the trip out for Ruby Kaigi &#8216;10!</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/07/31/ruby-kaigi-09-post-mortem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Headed out: What I&#8217;ve been up to June + Early July &#8217;09</title>
		<link>http://www.quirkey.com/blog/2009/07/15/headed-out-what-ive-been-up-to-june-early-july-09/</link>
		<comments>http://www.quirkey.com/blog/2009/07/15/headed-out-what-ive-been-up-to-june-early-july-09/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 13:50:06 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=330</guid>
		<description><![CDATA[I&#8217;m headed out to Japan for Ruby Kaigi and some real vacation and touring today. I&#8217;m teeming with excitement and nerves and in the interest of tying up some loose ends and making myself feel a little more ready for the trip, here&#8217;s another list of fun things happening/in progress. Sinatra-Sammy: Inspired half by potential [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;m headed out to Japan for <a href="http://rubykaigi.org/2009/en" title="">Ruby Kaigi</a> and some real vacation and touring today. I&#8217;m teeming with excitement and nerves and in the interest of tying up some loose ends and making myself feel a little more ready for the trip, here&#8217;s another list of fun things happening/in progress.</p>

	<ul>
		<li><a href="http://github.com/quirkey/sinatra-sammy" title="">Sinatra-Sammy:</a> Inspired half by potential usefulness and half by a dare from <a href="http://twitter.com/binary42" title="">binary42</a> at the first meeting of <span class="caps">NYC</span>.js, sinatra-sammy is a sinatra module/plugin that includes sammy.js makes multi-page apps appear to be single page (with deep-linking etc) while maintaining the <span class="caps">SEO</span> and other benefits of a multi-paged, normal app. Make sense? No? Yeah, OK. I&#8217;m working on putting up a good example, for now you can clone the repo and checkout the included test app.</li>
		<li>Speaking of <span class="caps">NYC</span>.js, I was honored to be the first speaker and did a little presentation about Sammy. <a href="http://quirkey.com/sammy-presentations/nyc.js_june3/slides.html" title="">Slides are viewable here</a></li>
		<li><a href="http://code.quirkey.com/vegas" title="">Vegas</a> + <a href="http://code.quirkey.com/gembox" title="">Gembox</a> are now windows friendly. It took a bunch of hacking, specifically around the daemon-ization (Kernel.fork is not natively implemented on win32) but windows users can now use Gembox just like their Unix based brethren. Windows users can now also, and should, make use of Vegas for creating Rack based executables.</li>
		<li>I&#8217;m giving an updated version of the talk I gave at GoGaRuCo &#8220;Sinatra: The Framework Within&#8221; at Ruby Kaigi. I&#8217;ve been hacking on a secret and useful project and hopefully I can wrap it up on the plane and present it at the conference.</li>
		<li>I got a new camera. I&#8217;ll be posting a lot of drool worthy food photography on <a href="http://flickr.com/photos/katandaq/" title="">flickr.</a></li>
	</ul>

	<p>For anybody attending RubyKaigi, please come find me and lets hack/talk/eat ramen.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/07/15/headed-out-what-ive-been-up-to-june-early-july-09/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What I&#8217;ve been up to: The End o&#8217; May Edition</title>
		<link>http://www.quirkey.com/blog/2009/05/29/what-ive-been-up-to-the-end-o-may-edition/</link>
		<comments>http://www.quirkey.com/blog/2009/05/29/what-ive-been-up-to-the-end-o-may-edition/#comments</comments>
		<pubDate>Fri, 29 May 2009 14:59:08 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sammy]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=321</guid>
		<description><![CDATA[Another busy couple of weeks and a lot more &#8230; Stuff! Two weeks ago I released Sammy and since then its been getting a lot of great feedback. It was mentioned in a github rebase and Nick Plante wrote a great post on DDJ. I&#8217;m really impressed with what people have done with it so [...]]]></description>
			<content:encoded><![CDATA[	<p>Another busy couple of weeks and a lot more &#8230; Stuff!</p>

	<ul>
		<li>Two weeks ago <a href="http://www.quirkey.com/blog/2009/05/15/introducing-sammy-the-tiny-but-swingin-javascript-framework/" title="">I released Sammy</a> and since then its been getting a lot of great feedback. It was mentioned in a <a href="http://github.com/blog/433-github-rebase-21" title="">github rebase</a> and <a href="http://dobbscodetalk.com/index.php?option=com_myblog&#038;show=Sammy---A-jQuery-Web-Framework.html&#038;Itemid=29" title="">Nick Plante wrote a great post on <span class="caps">DDJ</span>.</a> I&#8217;m really impressed with what people have done with it so far. <a href="http://twitter.com/langalex" title="">Alex Lang,</a> especially, has fulfilled a vision I had by embedding <a href="http://github.com/langalex/couchdb_example_wiki/tree/4edff3ed2750a19bf57e74d19dc3e9153e461762/couchapp" title="">Sammy as the client controller for a couch app.</a> Also make sure to check out his <a href="http://github.com/langalex/boom_amazing/tree/master" title="">Boom Amazing</a> presentation tool using Sammy as the proxy for controlling a slideshow contained in a massive <span class="caps">SVG</span>. I&#8217;m crossing my fingers that they&#8217;ll be a video of his <a href="http://railswaycon.com/" title="">RailsWayCon</a> presentation. Sammy also has <a href="http://groups.google.com/group/sammyjs" title="">a mailing list now</a> and (hopefully) soon a dedicated <span class="caps">IRC</span> room.</li>
	</ul>

	<ul>
		<li><a href="http://code.quirkey.com/gembox" title="">Gembox</a> was <a href="http://www.rubyinside.com/rdoc-some-alternative-ways-of-looking-at-documentation-1785.html" title="">featured as a great tool for viewing RDocs on RubyInside.</a> This inspired a little flurry of activity and commits with more to come. Thanks to <a href="http://twitter.com/lenary" title="lenary">Samuel Elliot </a> Gembox works in passenger pane.</li>
	</ul>

	<ul>
		<li>EngineYard finally posted <a href="http://www.engineyard.com/blog/community/scotland-on-rails/" title="">the videos</a> from <a href="http://scotlandonrails.com" title="">Scotland on Rails</a> and you can <a href="http://scotland-on-rails.s3.amazonaws.com/2A02_AaronQuint-SOR.mp4" title="">view my talk in full quicktime glory.</a> Really you should just take the whole weekend and watch all the videos. <span class="caps">LOTS</span> of fantastic talks.</li>
	</ul>

	<ul>
		<li><a href="http://www.goruco.com" title="">Goruco</a> is tomorrow! If you&#8217;re attending and reading this, please come find me. I&#8217;ll probably be milling around with a bearded dude (<a href="http://twitter.com/mrb_bk" title="">@mrb_bk</a>).</li>
	</ul>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/05/29/what-ive-been-up-to-the-end-o-may-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://scotland-on-rails.s3.amazonaws.com/2A02_AaronQuint-SOR.mp4" length="195213333" type="video/mp4" />
		</item>
		<item>
		<title>The (small) Fund</title>
		<link>http://www.quirkey.com/blog/2009/05/27/the-small-fund/</link>
		<comments>http://www.quirkey.com/blog/2009/05/27/the-small-fund/#comments</comments>
		<pubDate>Wed, 27 May 2009 19:33:24 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=317</guid>
		<description><![CDATA[If you can believe it (I barely can) the month of May is coming to a close. For me, and this blog, that means something specific. A short 4 weeks ago I proposed raising some money for the cause of teaching Ruby and getting more women involved in our community. Since then, Rails Bridge was [...]]]></description>
			<content:encoded><![CDATA[	<p>If you can believe it (I barely can) the month of May is coming to a close. For me, and this blog, that means something specific. A short 4 weeks ago I proposed raising some money for the cause of teaching Ruby and getting more women involved in our community. Since then, <a href="http://railsbridge.org/" title="">Rails Bridge</a> was formed and an amazing group of people are now devoted to a number of different initiatives. Its very exciting for me on a personal and professional level to be involved in something so positive. So now, a month later, its come time to settle and figure out exactly what to do with the generous amount we&#8217;ve collected.</p>

	<p>After consulting the Rails Bridge mailing list and with the great recommendations from the community I&#8217;ve decided to split the money in half. 50% will go to the <a href="http://anitaborg.org/" title="">Anita Borg Foundation</a> who have a number of great projects to support women in the development/programming communities. The rest will be donated to Rails Bridge itself. Even though its not a huge amount of money, hopefully it will make a little impact and help with some of some of these awesome initiatives.</p>

	<p>The fund is still open until the end of the week. Please donate!</p>

	<p><a href='http://www.pledgie.com/campaigns/4003'><img alt='Click here to lend your support to: For the future Ruby Community and make a donation at www.pledgie.com !' src='http://www.pledgie.com/campaigns/4003.png?skin_name=chrome' border='0' /></a></p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/05/27/the-small-fund/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Introducing Sammy: The tiny but swingin&#8217; JavaScript Framework</title>
		<link>http://www.quirkey.com/blog/2009/05/15/introducing-sammy-the-tiny-but-swingin-javascript-framework/</link>
		<comments>http://www.quirkey.com/blog/2009/05/15/introducing-sammy-the-tiny-but-swingin-javascript-framework/#comments</comments>
		<pubDate>Fri, 15 May 2009 15:42:37 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=308</guid>
		<description><![CDATA[After a couple months of off-hours hacking, I present to you Sammy. Sammy is an easy to use JavaScript framework that allows you to build simple front end applications using &#8216;routes&#8217; and &#8216;events&#8217;. It&#8217;s also very tiny. Using the YUI Compression its only 7Kb. Get Started Watch a Screencast (iPhone) Read the Introduction Read the [...]]]></description>
			<content:encoded><![CDATA[	<p>After a couple months of off-hours hacking, I present to you <a href="http://code.quirkey.com/sammy" title="">Sammy.</a> Sammy is an easy to use JavaScript framework that allows you to build simple front end applications using &#8216;routes&#8217; and &#8216;events&#8217;. It&#8217;s also very tiny. Using the <span class="caps">YUI </span>Compression its only 7Kb.</p>

	<h3>Get Started</h3>

	<ul>
		<li><a href="http://s3.amazonaws.com/sammy-js/screencasts/sammy-screencasts-01/sammy-screencasts-01.mov" title="">Watch a Screencast</a> (<a href="http://s3.amazonaws.com/sammy-js/screencasts/sammy-screencasts-01/sammy-screencasts-01-iPhone.m4v" title="">iPhone</a>)</li>
		<li><a href="http://code.quirkey.com/sammy" title="">Read the Introduction</a></li>
		<li><a href="http://code.quirkey.com/sammy/docs/index.html" title="">Read the Docs</a></li>
		<li><a href="http://twitter.com/sammy_js" title="">Follow @sammy_js</a></li>
		<li><a href="http://groups.google.com/group/sammyjs" title="">Join the mailing list</a></li>
	</ul>

	<p><span id="more-308"></span></p>

	<h3>The Story</h3>

	<p>About three months ago, when I was knee deep in hacking and playing with <a href="http://sinatrarb.com" title="">Sinatra</a> I had this weird moment as I woke up one morning: &#8220;What if I could build Sinatra in JavaScript?&#8221; At that point it was just a challenge &#8211; I had just started doing almost full-time JS for a client and it seemed like a fun project.</p>

	<p>As I started to actually implement it (slowly in short spurts on the weekends), I realized that using the power of JavaScript&#8217;s closures and jQuery&#8217;s powerful event system, this could be something more then just a &#8216;clone&#8217;. It could actually be . . . useful!</p>

	<p>With that in mind, I set out to actually make is usable. I cleaned up the code, I wrote some <a href="http://github.com/quirkey/sammy/tree/master/examples" title="">example implementations</a>, and most importantly &#8211; I <a href="http://code.quirkey.com/sammy/docs/index.html" title="">documented the shit out of it.</a></p>

	<p>I&#8217;m pretty excited about it (can&#8217;t you tell?) especially about its possible uses for structuring applications on the front-end for <span class="caps">RES</span>Tful Databases and services. Embed it in a <a href="http://github.com/jchris/couchapp/tree" title="">CouchApp</a> to build an entire application in JavaScript while having access to a full range of documents/querying abilities.</p>

	<h3>The Future</h3>

	<p>I&#8217;m going to continue refining and adding examples. Please feel free to email me or contact me through github with questions/feedback.</p>

	<p>Happy Friday!</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/05/15/introducing-sammy-the-tiny-but-swingin-javascript-framework/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
<enclosure url="http://s3.amazonaws.com/sammy-js/screencasts/sammy-screencasts-01/sammy-screencasts-01.mov" length="197" type="video/quicktime" />
<enclosure url="http://s3.amazonaws.com/sammy-js/screencasts/sammy-screencasts-01/sammy-screencasts-01-iPhone.m4v" length="12437032" type="video/x-m4v" />
		</item>
		<item>
		<title>RailsBridge: Moving the community forward</title>
		<link>http://www.quirkey.com/blog/2009/05/04/railsbridge-moving-the-community-forward/</link>
		<comments>http://www.quirkey.com/blog/2009/05/04/railsbridge-moving-the-community-forward/#comments</comments>
		<pubDate>Mon, 04 May 2009 17:39:10 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=305</guid>
		<description><![CDATA[Some exciting news, a little less then a week ago, I tried to take an initiative and do something to move the community out of the negative mindset and towards something more positive. I found out that I wasn&#8217;t alone. Not surprisingly, there are a ton of amazing, talented, and ambitious people who are trying [...]]]></description>
			<content:encoded><![CDATA[	<p>Some exciting news, a little less then a week ago, I <a href="http://www.quirkey.com/blog/2009/04/27/the-ghetto-of-the-mind/" title="">tried to take an initiative</a> and do something to move the community out of the negative mindset and towards something more positive. I found out that I wasn&#8217;t alone. Not surprisingly, there are a ton of amazing, talented, and ambitious people who are trying really hard to do a lot of things to try to make the Rails and Ruby communities of now and the future &#8211; awesome.</p>

	<p>Officially, as of today, the work is being grouped and promoted through <a href="http://railsbridge.org" title="">RailsBridge.</a><br />
Thanks to everyone involved. I wont be there in person, so good luck to everyone at RailsConf!</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/05/04/railsbridge-moving-the-community-forward/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Github Pages for Fun and Win</title>
		<link>http://www.quirkey.com/blog/2009/05/01/github-pages-for-fun-and-win/</link>
		<comments>http://www.quirkey.com/blog/2009/05/01/github-pages-for-fun-and-win/#comments</comments>
		<pubDate>Fri, 01 May 2009 16:01:30 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=292</guid>
		<description><![CDATA[Stop what you&#8217;re doing and make your project a github page. For the love of god, your project has no documentation. RDoc is cool, READMEs are decent, but descriptive websites with examples? Oh, they RULE. At first, I was skeptical. Pages looked cool, but it seemed like a lot of effort to create a page [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img.skitch.com/20090501-qj4ujstmue2y7gcupuptpa2n13.jpg" alt="sinatra-gen" /></p>

<p>Stop what you&#8217;re doing and make your project a github page. For the love of god, your project has no documentation. RDoc is cool, READMEs are decent, but <a href="http://code.quirkey.com/restful_query">descriptive websites with examples?</a> Oh, they <span class="caps">RULE</span>.</p><span id="more-292"></span>

	<p>At first, I was skeptical. Pages looked cool, but it seemed like a lot of effort to create a page especially one for each project. Then two things happened:</p>


	<ol>
	<li><a href="http://twitter.com/mojombo/statuses/1209150272">Tom yelled at me/us</a></li>
		<li>I discovered the power of <a href="http://github.com/mojombo/jekyll/tree/master">jekyll</a></li>
	</ol>


	<p>The main problem that jekyll solves for github pages is the ability to have a general &#8216;layout&#8217; that eliminates the <span class="caps">HTML</span> copy and paste you would have to do if you were managing pages for more then one project. Having a unified layout also allows you&#8217;re project pages to have a unified brand and feel &#8211; something I believe is important.</p>


	<p>There other things that are truly great about using jekyll.</p>


	<h3>Easy code highlighting.</h3>


	<p>Highlighting a block of code is as easy as:</p>


<pre><code>{% highlight ruby %}
def awesome
  "for real. I know."
end
{% endhighlight %}
</code></pre>

<p>Then all you have to do is grab a syntax stylesheet. You can <a href="http://code.quirkey.com/stylesheets/syntax.css">grab mine here</a></p>


	<h3>Ability to write pages in textile or markdown.</h3>


	<p>I&#8217;ve been doing all my blogging in textile for a long time now, and being able to write an easy to read page that I can easily find and edit text in makes it more likely that I&#8217;ll continue to update the pages with new releases.</p>


	<h3>Ability to pass variables from individual pages into your layout to make your layout <em>even more</em> reusable.</h3>


	<p>This is underused, but because jekyll interprets the layout file <em>after</em> its read the variables from the top of your document it means you can stick variables in your <span class="caps">YAML</span> head that the layout can use.</p>


	<p>For example: In my github project pages, the <span class="caps">YAML</span> head looks something like:</p>


<pre><code>---
layout: quirkey_code
title: sinatra-gen
github_name: sinatra-gen
current_version: 0.3.0
nav:
  - name: What
    link: "#what"
  - name: Why
    link: "#why"
  - name: Usage
    link: "#usage"
  - name: Options
    link: "#options"
  - name: Dependencies
    link: "#dependencies"
---
</code></pre>

<p>Beyond passing the page title, I&#8217;m also passing a ton of other variables. The github_name is used to link to the downloads of the project on github &#8211; a reusable piece of code that exists at the foot of every page. In the layout it looks like:</p>

<pre class="textmate-source"><span class="text text_html text_html_basic"><span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">h3</span> <span class="meta meta_attribute-with-value meta_attribute-with-value_id meta_attribute-with-value_id_html"><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_id entity_other_attribute-name_id_html">id</span><span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_html">=</span><span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span><span class="meta meta_toc-list meta_toc-list_id meta_toc-list_id_html">installing</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>Installing<span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">h3</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">div</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">class</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>highlight<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">pre</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>sudo gem install {{ page.github_name }}
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">pre</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">div</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">p</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>Or directly from github:<span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">p</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">div</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">class</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>highlight<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">pre</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>sudo gem install quirkey-{{ page.github_name }} -s http://gems.github.com
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">pre</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">div</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">p</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>Github in thier infinite awesomeness also lets you download the source in multiple formats.<span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">p</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">div</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">class</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>download<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
          <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">href</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>http://github.com/quirkey/{{ page.github_name }}/zipball/master<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
            <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">img</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">border</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">width</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>90<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">src</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>http://github.com/images/modules/download/zip.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html"> /&gt;</span></span>
          <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
          <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">href</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>http://github.com/quirkey/{{ page.github_name }}/tarball/master<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
            <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">img</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">border</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">width</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>90<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">src</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>http://github.com/images/modules/download/tar.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html"> /&gt;</span></span>
          <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
        <span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">div</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span></span></pre>
        
<p><code>current_version</code> and <code>nav</code> work the same way. <code>nav</code> uses a little more liquid magic to get the job done:</p>

<pre class="textmate-source"><span class="text text_html text_html_ruby">{% if page.nav %}
<span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">ul</span> <span class="meta meta_attribute-with-value meta_attribute-with-value_id meta_attribute-with-value_id_html"><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_id entity_other_attribute-name_id_html">id</span><span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_html">=</span><span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span><span class="meta meta_toc-list meta_toc-list_id meta_toc-list_id_html">pagenav</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
  {% for nav in page.nav %}
  <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">href</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>{{ nav['link'] }}<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>{{ nav['name'] }}<span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
  {% endfor %}
  <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">href</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>#installing<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>Installing<span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
  <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">href</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>#requests<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>Bugs/Feature<span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">br</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html"> /&gt;</span></span>Requests<span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
  <span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span> <span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html">href</span>=<span class="string string_quoted string_quoted_double string_quoted_double_html"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html">"</span>#contact<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html">"</span></span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>Contact<span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">a</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html">li</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
<span class="meta meta_tag meta_tag_block meta_tag_block_any meta_tag_block_any_html"><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html">&lt;/</span><span class="entity entity_name entity_name_tag entity_name_tag_block entity_name_tag_block_any entity_name_tag_block_any_html">ul</span><span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html">&gt;</span></span>
{% endif %}</span></pre>

<p>This way I can have a super flexible nav menu, changing what I need and what I don&#8217;t in the page instead of in the layout. You can see the <a href="http://github.com/quirkey/sinatra-gen/raw/98801bf6737c2f3178bc512f7c248c40c78b423d/index.textile">full code for the sinatra-gen page</a> or the <a href="http://github.com/quirkey/jekyll_layouts/blob/master/quirkey_code.html">full quirkey_code layout.</a></p>


	<h3>Submodules for the ultimate stoke factor.</h3>


	<p>After building a couple of these project pages, I thought &#8220;Hey! I can just put my layout in its own repo and when I start a new project page, I can just submodule it!&#8221;. Great idea, unfortunately at the time, github didn&#8217;t support it. However,<a href="http://twitter.com/aq/status/1517715589">after nagging PJ a bit</a> <a href="http://github.com/blog/410-pages-2-0">now they do!</a></p>


	<p>My workflow, is I&#8217;ve set up a <a href="http://github.com/quirkey/jekyll_layouts/">jekyll_layouts repository</a> and when I first create my <code>gh-pages</code> branch (<a href="http://pages.github.com/">described in detail here</a>), I just run:</p>


<pre><code>git submodule add git://github.com/quirkey/jekyll_layouts.git _layouts
</code></pre>

	<p>Then, the next time I push, github graciously pulls my submodule before building my page with jekyll. Sweet. 
Some things to note:</p>


	<ul>
	<li>You have to have a public repository for the layouts and you have to submodule with a globally accessible <span class="caps">URL</span> (as in the &#8216;public&#8217; clone url instead of &#8216;your&#8217; clone <span class="caps">URL</span>).</li>
		<li>When you switch back to your master branch, the <code>_layouts</code> directory wont disappear automatically. You can add it to your .gitignore OR just delete it and it will reappear when you switch back to <code>gh-pages</code>.</li>
	</ul>


	<p>Using the power of git, there is also a way to continue editing your submodule&#8217;d layouts while in a pages branch. The trick is that while you use the public clone <span class="caps">URL</span> for the &#8216;origin&#8217; server of the submodule, you can add your private <span class="caps">URL</span> as another remote for the cloned repository.</p>


	<p>For example:
If I&#8217;m in my sinatra-gen repository at the <code>gh-pages</code> branch, I can cd into the _layouts submodule:</p>


<pre><code>[10:47 AM:sinatra-gen(gh-pages)] $ cd _layouts
[11:23 AM:_layouts(master)] $ 
</code></pre>

	<p>If I inspect the branches I see:</p>


<pre><code>[11:23 AM:_layouts(master)] $ git branch -a
* master
  origin/HEAD
  origin/master
</code></pre>

	<p>From here I can add another remote, which is actually the same repository &#8211; just the <strong>private</strong> clone <span class="caps">URL</span>.</p>


<pre><code>[11:24 AM:_layouts(master)] $ git remote add upstream git@github.com:quirkey/jekyll_layouts.git
[11:26 AM:_layouts(master)] $ git fetch upstream
From git@github.com:quirkey/jekyll_layouts
 * [new branch]      master     -&gt; upstream/master
[11:26 AM:_layouts(master)] $ git branch -a
* master
  origin/HEAD
  origin/master
  upstream/master
</code></pre>

	<p>Now If I make a change in the _layouts directory, its as easy as:</p>


<pre><code>[11:28 AM:_layouts(master)] $ git commit -am "Moved around title" 
Created commit 5726d5e: Moved around title
 1 files changed, 1 insertions(+), 1 deletions(-)
[11:28 AM:_layouts(master)] $ git push upstream master
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 314 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:quirkey/jekyll_layouts.git
   5013157..5726d5e  master -&gt; master
</code></pre>

	<p>All of my pages code is under the <a href="http://github.com/quirkey/quirkey.github.com/blob/ff31f1db35338b779a847597a427fd6e13b6e239/LICENSE"><span class="caps">MIT</span> license</a> so feel free to use and manipulate. If your nice and or grateful, you can link back to this site in your footer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/05/01/github-pages-for-fun-and-win/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>On the Ruby on Rails Podcast</title>
		<link>http://www.quirkey.com/blog/2009/04/29/on-the-ruby-on-rails-podcast/</link>
		<comments>http://www.quirkey.com/blog/2009/04/29/on-the-ruby-on-rails-podcast/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 17:17:30 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Press]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=288</guid>
		<description><![CDATA[Thanks to Geoff of Peepcode fame I was interviewed about Sinatra and my talk at GoGaRuCo on the Ruby on Rails Podcast. The episode also features Rich Kilmer &#8211; whose talk about MacRuby and HotCocoa totally blew my mind.]]></description>
			<content:encoded><![CDATA[	<p>Thanks to <a href="http://www.peepcode.com" title="">Geoff of Peepcode fame</a> I was interviewed about <a href="http://podcast.rubyonrails.org/programs/1/episodes/gogaruco" title="">Sinatra and my talk at GoGaRuCo on the Ruby on Rails Podcast.</a></p>

	<p>The episode also features <a href="http://richkilmer.blogs.com/" title="">Rich Kilmer</a> &#8211; whose talk about <a href="http://www.macruby.org/" title="">MacRuby and HotCocoa</a> totally blew my mind.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/04/29/on-the-ruby-on-rails-podcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The ghetto of the mind</title>
		<link>http://www.quirkey.com/blog/2009/04/27/the-ghetto-of-the-mind/</link>
		<comments>http://www.quirkey.com/blog/2009/04/27/the-ghetto-of-the-mind/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 16:10:16 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Ranting]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=280</guid>
		<description><![CDATA[I&#8217;m sorry. Rails is not a ghetto. Ruby is not a ghetto. The ghetto is your mind. WTF This weekend after reading a couple posts and a lot of tweets I started getting really frustrated about the situation surrounding Matt&#8217;s talk at GoGaRuCo. My frustration and anger did not stem from being offended by Matt&#8217;s [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;m sorry. Rails is not a ghetto. Ruby is not a ghetto. <a href="http://www.youtube.com/watch?v=RwHP_vQtPcM" title="">The ghetto is your mind.</a></p>

	<h3><span class="caps">WTF</span></h3>

	<p>This weekend after reading <a href="http://dyepot-teapot.com/2009/04/25/dear-fellow-rubyists/" title="">a</a> <a href="http://www.rubyrailways.com/rails-is-still-a-ghetto/" title="">couple</a> <a href="http://www.ultrasaurus.com/sarahblog/2009/04/gender-and-sex-at-gogaruco/" title="">posts</a> and <a href="http://search.twitter.com/search?q=gogaruco" title="">a lot of tweets</a> I started getting really frustrated about the situation surrounding <a href="http://themerbist.com" title="">Matt&#8217;s</a> talk at <a href="http://gogaruco.com" title="">GoGaRuCo.</a> My frustration and anger did not stem from being offended by Matt&#8217;s talk, nor did it stem from thinking that everyone who was offended was wrong. It came from a gut reaction to all this horrible negativity thats spreading like wildfire.</p>

	<p>I was at GoGaRuCo. In fact I was also speaking. I watched every talk, attended the after-parties and had one of the best conference experiences I&#8217;ve had. I learned a ton, met a ton of interesting people, and heard about things from a ton of different perspectives. I&#8217;m not going to say more then that. It was awesome.</p>

	<p>The &#8216;controversy&#8217; around Matt&#8217;s talk started as a couple smart individuals being angry and frustrated at another smart individual for making a mistake. It&#8217;s become a blame game and a reason for people to blame a single talk for the ails of an entire community that had the same issues before. I want to stay positive, so here are three simple rules of <span class="caps">ANY</span> community:</p>

	<ul>
		<li>You can not fault an entire community for the actions of a single individual.</li>
		<li>In any community there will be opposing opinions on definitions of moral correctness for n issues.</li>
		<li>If you actually want to change the community, you have a better chance of influencing the future community through education then the current community through preaching.</li>
	</ul>

	<p>Going from the last one, lets define a problem set and move forward.</p>

	<h3>The Problem Set</h3>

	<p>Lets rip open this silver lining. If anything good comes out of this let it be that it brought a bunch of long standing issues back in to the limelight. The big complaint out of this all has been that there are not enough women in the Ruby community. It&#8217;s pretty obvious that this is an issue. I mean, out of conference of 200+ there were less then 10 women. In fact, this conference probably had more women then any other Ruby conference I&#8217;ve been to.</p>

	<p>I&#8217;m not going to try to deduce the myriad of reasons why this is true, instead just mention something that might lead to this situation.</p>

	<p><em>Ruby is not taught in Schools.</em> If we really want to make Ruby a language and community for everyone, the only way to ensure that people actually get exposure is to get it into schools. It would be awesome if I learned Ruby in college, but beyond that &#8211; it would have been <span class="caps">AMAZING</span> if I had <a href="http://hacketyhack.net/" title="">HacketyHack</a> when I was a kid. I whole-heartedly believe that Ruby is a great first language and the veritable cornucopia of implementations and uses could convince anyone with a slight inclination to do great things with it.</p>

	<h3><span class="caps">FTW</span></h3>

	<p>Let&#8217;s actually make this happen. How can we get more women in software development? How can we bring more women into the Ruby community? I don&#8217;t have the answer and honestly, I&#8217;m not a fantastic teacher or community organizer. However, I&#8217;m a pretty decent developer and as a freelancer I&#8217;m making some decent money so that I can give some of that money to people who are much better teachers and community organizers. With that said, <a href="http://pledgie.com/campaigns/4003" title="">I&#8217;ve started a pledgie and put $500 dollars in it.</a> After 1 month, I&#8217;m going to donate any money I&#8217;ve collected there to a charity to support either teaching Ruby/development in schools, or supporting women in development. Depending on how much we raise, I might donate to multiple organizations. If you have suggestions about specific organizations please tweet @aq or email me at aaron at this domain.</p>

	<p><a href='http://www.pledgie.com/campaigns/4003'><img alt='Click here to lend your support to: For the future Ruby Community and make a donation at www.pledgie.com !' src='http://www.pledgie.com/campaigns/4003.png?skin_name=chrome' border='0' /></a></p>

	<p>Please donate! Even if its only $2. I&#8217;ll be posting updates to twitter and here to.</p>

	<p>Let&#8217;s try to ensure that GoGaRuCo 2025 is an awesome gathering <img src='http://www.quirkey.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>

 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/04/27/the-ghetto-of-the-mind/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>GoGaRuCo &#8217;09</title>
		<link>http://www.quirkey.com/blog/2009/04/20/gogaruco-09/</link>
		<comments>http://www.quirkey.com/blog/2009/04/20/gogaruco-09/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 00:31:12 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=269</guid>
		<description><![CDATA[I haven&#8217;t even returned to NY yet &#8211; I&#8217;m writing this in Pivotal Labs SF - who were nice enough to let me steal a desk and some WIFI for an afternoon. GoGaRuCo was amazing. Another awesome conference. Thanks to Josh Susser, Leah Silber, and the other organizers and volunteers for making a fantastic weekend [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://www.flickr.com/photos/pivotallabs/3453792796/"><img src="http://farm4.static.flickr.com/3366/3453792796_679527b12a.jpg?v=0" /></a></p>

	<p>I haven&#8217;t even returned to NY yet &#8211; I&#8217;m writing this in Pivotal Labs <span class="caps">SF </span>- who were nice enough to let me steal a desk and some <span class="caps">WIFI</span> for an afternoon.</p>

	<p>GoGaRuCo was amazing. Another awesome conference. Thanks to <a href="http://blog.hasmanythrough.com/" title="">Josh Susser,</a> Leah Silber, and the other organizers and volunteers for making a fantastic weekend of nerding out. I&#8217;m going to be posting my slides soon, and there should be a full video recording of it within the next couple of weeks. You can see a quick rundown (via live-blogging of my talk) <a href="http://pivotallabs.com/users/chad/blog/articles/780-gogaruco-09-sinatra-the-framework-within-aaron-quint" title="">at the Pivotal site.</a></p>

	<p>(Some of) The highlights of the weekend:</p>

	<ul>
		<li>Getting a real explanation of <a href="http://getcloudkit.com" title="">CloudKit</a> from Jon Crosby. Once I understood what it was &#8211; a fully compliant <span class="caps">REST</span> interface that abuses <span class="caps">HTTP</span> to create a standardized &#8216;appliance&#8217; that sits on type of Rack. Think: Rack CouchDB.</li>
		<li>Talking to <a href="http://yehudakatz.com/" title="">Yehuda Katz</a> about why Javascript/jQuery is awesome and why the next version of rubygems will solve all my problems.</li>
		<li>Seeing <a href="http://brighter.net/" title="">Jaqui Maher</a> talk about solving <span class="caps">REAL</span> problems with ruby/rails.</li>
		<li><a href="http://twitter.com/atduskgreg" title="">Greg Borenstein</a> blowing my mind with the knowledge that I could use Ruby to hack an Arduino.</li>
	</ul>

	<p>Most importantly: I met some very cool, extremely friendly, and super-fun people in this beautiful city. I can&#8217;t wait to come back.</p>

	<p><strong>Update:</strong> I <a href="http://www.scribd.com/doc/14599553/Sinatra-The-Framework-Within-GoGaRuCo-09" title="">posted my slides from the talk at scribd</a></p>

 ]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/04/20/gogaruco-09/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

