<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>QuirkeyBlog</title>
	
	<link>http://www.quirkey.com/blog</link>
	<description>A Developer with too little time.</description>
	<lastBuildDate>Tue, 03 Nov 2009 15:57:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/quirkey" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Going to California: Nov 12-23</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/wQLcDq85FPQ/</link>
		<comments>http://www.quirkey.com/blog/2009/11/03/going-to-california-nov-12-23/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 15:57:55 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=381</guid>
		<description><![CDATA[	

	Let&#8217;s just say it was a crazy October, and we&#8217;ll leave it at that. There are big things afoot for November, though. I&#8217;m headed west for a multi-stop tour of Northern California with my wife from Nov 12-23. It&#8217;s going to be part business/part pleasure, but every time I&#8217;ve gone in recent years theres been [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://www.flickr.com/photos/katandaq/3169158878/" title="Sunset at Telegraph Hill by kat_and_aq, on Flickr"><img src="http://farm2.static.flickr.com/1292/3169158878_1ff1875661.jpg" width="500" height="375" alt="Sunset at Telegraph Hill" /></a></p>

	<p>Let&#8217;s just say it was a crazy October, and we&#8217;ll leave it at that. There are big things afoot for November, though. I&#8217;m headed west for a multi-stop tour of Northern California with my wife from Nov 12-23. It&#8217;s going to be part business/part pleasure, but every time I&#8217;ve gone in recent years theres been no shortage of fun. Though I wont be attending RubyConf, <strong>I&#8217;ll be in San Francisco during and around it Nov 19-23</strong>.</p>

	<p>First, If any dev shops/teams/meetup groups want to hear me talk/present about Sammy.js or any other projects I&#8217;m involved in I&#8217;d be happy to come by and drop some knowledge.</p>

	<p>Second, I would greatly appreciate anybody willing to let me office-crash and hang out with them in their workplaces.</p>

	<p>Finally, I would love to meet up with fellow Rubyists, Javascripters and foodies to do any one (or many) of the following things:</p>

	<ul>
		<li>eat delicious food</li>
		<li>write fun code</li>
		<li>talk about the future of the web</li>
		<li>drink and sing karaoke</li>
	</ul>

	<p>If you&#8217;re interested, just <a href="http://twitter.com/aq" title="@aq">hit me up on twitter </a> or email me at aaron at this domain.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=wQLcDq85FPQ:RWOAyeb60xo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=wQLcDq85FPQ:RWOAyeb60xo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=wQLcDq85FPQ:RWOAyeb60xo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=wQLcDq85FPQ:RWOAyeb60xo:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/11/03/going-to-california-nov-12-23/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/11/03/going-to-california-nov-12-23/</feedburner:origLink></item>
		<item>
		<title>Sammy.js: Tutorial – The JSON Store, Part I</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/-xpt0JZflkQ/</link>
		<comments>http://www.quirkey.com/blog/2009/10/12/sammy-js-tutorial-the-json-store-part-i/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 15:00:21 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=378</guid>
		<description><![CDATA[	Its a week late, but as promised I&#8217;ve started working on a series of tutorials for Sammy.js. The first series is based around a simple E-commerce front end with Sammy, &#8216;The JSON Store&#8217;. I&#8217;m starting out really basic, so if you&#8217;ve already dabbled with Sammy, this might be old hat, but you should breeze through [...]]]></description>
			<content:encoded><![CDATA[	<p>Its a week late, but as promised <a href="http://code.quirkey.com/sammy/tutorials/json_store_part1.html" title="">I&#8217;ve started working on a series of tutorials for Sammy.js.</a> The first series is based around a simple E-commerce front end with Sammy, &#8216;The <span class="caps">JSON </span>Store&#8217;. I&#8217;m starting out <em>really</em> basic, so if you&#8217;ve already dabbled with Sammy, this might be old hat, but you should breeze through quickly as you could learn a trick or two. For the more intermediate and advanced users, don&#8217;t worry, I have some ideas and things in progress for you as well.</p>

	<p>Quick note, I decided to use github pages instead of this here blog to post the tutorials. In the end, its just easier to post lots of inline code <span class="caps">AND</span> it will be easier to maintain with updates as the Sammy <span class="caps">API</span> changes.</p>

	<p>I hope you enjoy it! I&#8217;m always appreciative of feedback and constructive criticism, so fire away.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=-xpt0JZflkQ:AqiIW1mF8w4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=-xpt0JZflkQ:AqiIW1mF8w4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=-xpt0JZflkQ:AqiIW1mF8w4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=-xpt0JZflkQ:AqiIW1mF8w4:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/10/12/sammy-js-tutorial-the-json-store-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/10/12/sammy-js-tutorial-the-json-store-part-i/</feedburner:origLink></item>
		<item>
		<title>Sammy 0.3.0 Released: I gotta right to swing!</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/4O2UbMb4UVI/</link>
		<comments>http://www.quirkey.com/blog/2009/09/30/sammy-0-3-0-released-i-gotta-right-to-swing/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 14:57:57 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=371</guid>
		<description><![CDATA[


	I&#8217;m very happy to announce the next major release of Sammy.js. I&#8217;ve been working on this for over a month and the result has been a lot more changes then I expected but over all a smaller, cleaner core code base. Here&#8217;s a quick run through of the biggest changes. See HISTORY or the Commits [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/blog/uploads/igottarighttoswing.jpg" alt="Sammy 0.3.0: I gotta right to swing!" /></p>


	<p>I&#8217;m very happy to announce the next major release of <a href="http://code.quirkey.com/sammy">Sammy.js.</a> I&#8217;ve been working on this for over a month and the result has been a lot more changes then I expected but over all a smaller, cleaner core code base. Here&#8217;s a quick run through of the biggest changes. See <a href="http://github.com/quirkey/sammy/blob/master/HISTORY"><span class="caps">HISTORY</span></a> or the <a href="http://github.com/quirkey/sammy/commits/master">Commits</a> for a full list and more detail.</p>
<span id="more-371"></span>
	<h3>Plugins</h3>

	<p>The biggest change, that resulted in a lot of little changes is <code>Sammy.Application#use()</code> which allows you to package and resuse application level code into &#8216;Plugins&#8217;. See the <a href="http://code.quirkey.com/sammy/docs/plugins.html">documentation on plugins for more detail.</a> This also marks the start of an official selection of plugins, with two as part of this release and more on the way.</p>

<p>The default template system that used $.srender internally has been extracted out into a plugin. To enable <em>almost</em> the exact same functionality:</p>

<pre class="textmate-source"><span class="source source_js source_js_jquery"><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> somewhere in your HTML (after sammy.js): 
</span><span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> &lt;script src="plugins/sammy.template.js" type="text/javascript"&gt;&lt;/script&gt;
</span><span class="keyword keyword_operator keyword_operator_js">$</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>sammy<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> include the Sammy.Template plugin
</span>  <span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>use<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>Sammy<span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>Template<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  
<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span></span></pre>

	<h3>Events</h3>

	<p>Sammy.Application&#8217;s bind() and trigger() methods now use jQuery&#8217;s namespacing to bind to Events. This means that Sammy.Application can now easily catch events that bubble to it like &#8216;click&#8217; or &#8216;focus&#8217;. The big awesomeness is that the callbacks for these bind() methods are always evaluated within a Sammy.EventContext so that even events triggered from outside the app can be handled in the same way as internal events.</p>

  <pre class="textmate-source"><span class="source source_js source_js_jquery"><span class="storage storage_type storage_type_js">var</span> app <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="keyword keyword_operator keyword_operator_js">$</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>sammy<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>

    <span class="variable variable_language variable_language_js">this</span><span class="support support_function support_function_js support_function_js_jquery">.bind</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>custom-event<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
      <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> this == Sammy.EventContext
  </span>    <span class="support support_function support_function_js">alert</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>Custom Event<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span> <span class="keyword keyword_operator keyword_operator_js">+</span> <span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>params<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>wha<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

  <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>

  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span> the app is by default bound to 'body'
  </span><span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="punctuation punctuation_definition punctuation_definition_selector punctuation_definition_selector_begin punctuation_definition_selector_begin_js">'</span><span class="meta meta_selector meta_selector_css"><span class="entity entity_name entity_name_tag entity_name_tag_css">body</span></span><span class="punctuation punctuation_definition punctuation_definition_selector punctuation_definition_selector_end punctuation_definition_selector_end_js">'</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.trigger</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>custom-event<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>wha: <span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>ZUH?!<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>=&gt; system alert ZUH?!
  </span></span></pre>

	<h3>Cleanup</h3>

	<p>With the advent of plugins, Sammy Core is now even smaller (8.9k minified). This is also possible because I&#8217;ve removed the former &#8216;classical&#8217; inheritence code in favor of prototypal inheritence, which is a big win in terms of cleanlieness and global scope leakage.</p>


	<h3>See Also</h3>


	<p>I mentioned this on twitter, but I&#8217;m working on some new tutorials and screencasts about Sammy. If you have ideas/suggestions, dont hesitate to let me know. The first one should be up next week. I&#8217;m going to try to do them bi-weekly, we&#8217;ll see how that goes <img src='http://www.quirkey.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>


	<p>Again, I&#8217;ve tried to be as thorough with inline <span class="caps">API</span> docs as I could so any changes should be in the clear. Thanks again to everyone who helped with this release and has supported Sammy recently!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=4O2UbMb4UVI:deLvK9nU3NY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=4O2UbMb4UVI:deLvK9nU3NY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=4O2UbMb4UVI:deLvK9nU3NY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=4O2UbMb4UVI:deLvK9nU3NY:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/09/30/sammy-0-3-0-released-i-gotta-right-to-swing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/09/30/sammy-0-3-0-released-i-gotta-right-to-swing/</feedburner:origLink></item>
		<item>
		<title>Sammy.js, CouchDB, and the new web architecture</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/-4N1nckEuKw/</link>
		<comments>http://www.quirkey.com/blog/2009/09/15/sammy-js-couchdb-and-the-new-web-architecture/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 13:44:38 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=359</guid>
		<description><![CDATA[	UPDATE: My slides and a protected instance (will open up for play soon) or swinger, available here 

	I&#8217;ll be honest. When I created Sammy.js, It was more of an academic exercise then a means to an end. I had ideas for how it could be useful, and had some immediate uses for it, but the [...]]]></description>
			<content:encoded><![CDATA[	<p><em><span class="caps">UPDATE</span>: My slides and a protected instance (will open up for play soon) or swinger, available <a href="http://c.ixxr.net/swinger/_design/swinger/index.html#/preso/jqcon_09/display/1" title="">here</a> </em></p>

	<p>I&#8217;ll be honest. When I created <a href="http://code.quirkey.com/sammy" title="">Sammy.js,</a> It was more of an academic exercise then a means to an end. I had ideas for how it could be useful, and had some immediate uses for it, but the initial thought was &#8216;recreating Sinatra&#8217;s <span class="caps">API</span> in JavaScript&#8217;. Little did I know &#8211; with a little introduction and the work of some clever individuals, its real value would be revealed.</p>

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

	<p>We&#8217;re at the dawn of a new age on the web, or maybe or horizon, or a precipice; the metaphor doesn&#8217;t matter, the point is, things are changing. Specifically, as browsers become more and more powerful, as developers we&#8217;re given new opportunities to rethink how we architect web applications. Whether or not some of the predictions of &#8216;the death of the traditional desktop&#8217; are correct &#8211; whether or not the near future desktop is just the browser &#8211; we now have the power, without proprietary technologies (flash, etc) to create truly desktop like experiences on the web. Thats nothing mind-blowing, we&#8217;ve seen it coming for a little while now.</p>

	<p>Ok, then: let me <em>blow your mind.</em></p>

	<p>Because of the great power that modern browsers provide us as Javascript developers a new paradigm of web development is arising. Lets take a look at the current/traditional model:</p>

	<p><img src="http://img.skitch.com/20090915-6xfj7cp1kx6w884tqw29yk2k4.jpg" alt="Old Way" /></p>

	<p>Here we have a traditional stack. The &#8216;power&#8217; of the application lies on the server: our development platform of choice (Rails, <span class="caps">PHP</span>, etc) sits on top of our database of choice (probably relational, probably <span class="caps">SQL</span>). This server platform renders finished <span class="caps">HTML</span> and maybe decorates those pages with the use of our JS library and our application specific code (Your $(hit)). In this model we&#8217;re using probably at least 3 different programming languages and almost fully on the speed and reliability of our servers for getting data to the user. There&#8217;s probably also at least 3 steps in either direction between data and the user:</p>

	<ul>
		<li>User clicks a link on a page or follows a <span class="caps">URL</span></li>
		<li>The request is sent to the server</li>
		<li>App receives request passes it on to Model/ORM layer</li>
		<li><span class="caps">ORM</span> requests the data from the Database</li>
		<li>Database returns the data to the <span class="caps">ORM</span></li>
		<li><span class="caps">ORM</span> returns the data in a parse-able form to the App</li>
		<li>App converts it into user-readable format and displays it to user</li>
	</ul>

	<p>Obviously, Rails and most other languages frameworks abstract a lot of this away, so we don&#8217;t really have to think in all these steps. They&#8217;re there, though.</p>

	<p><img src="http://img.skitch.com/20090915-c8trr5mh7ukbhg6eukptwsuq3r.jpg" alt="The New Way" /></p>

	<p>Welcome to the new world. <span class="caps">HTTP </span>Databases and <span class="caps">JSON </span>Storage. The simple act of making the database and the browser more powerful on either end has destroyed the need for the middle tier. In the new architecture, Our database (JSON/HTTP based: <a href="http://couchdb.org" title="">CouchDB</a>, <a href="http://getcloudkit.com" title="">Cloudkit</a>) serves data as <span class="caps">JSON</span> directly to the browser. On the browser side we create a much smaller/tighter &#8216;controller&#8217; layer with JavaScript. This handles the directing of the user to the right place, the displaying of the data to the user, and the conversion of user interaction into state + data. This middle piece is jQuery + Sammy.js.</p>

	<p>In my presentation at jQuery Conf this past weekend (<a href="http://c.ixxr.net/swinger/_design/swinger/index.html#/preso/jqcon_09/display/1" title="">slides available here</a>) I demonstrated this concept in a rather meta-tastic way. The presentation tool I used was called <a href="http://github.com/quirkey/swinger" title="">Swinger</a> and it was written using CouchDB, <a href="http://github.com/couchapp/couchapp" title="">CouchApp,</a> and Sammy.js. The application logic was contained in a single JS file that used a Sammy application to do all the routing, getting data in and out of CouchDB and displaying it in a particularly pretty way. The coolest part about this whole thing is that even beyond taking out the middle layer, this implementation removes the traditional static file serving model, too. With the power of CouchApp and _attachments, the javascript and <span class="caps">HTML</span> files needed to serve the application are served directly out of the database. Its like CouchDB and Sammy.js were made for each other. Think about the new steps for this architecture:</p>

	<ul>
		<li>User clicks a link on the page or follows a <span class="caps">URL</span></li>
		<li>Data is requested via <span class="caps">AJAX</span> from the server</li>
		<li>The server proxies to the database or processes the request directly</li>
		<li>The data is returned to Sammy.js as <span class="caps">JSON</span></li>
		<li>Sammy.js uses the data it needs and displays it to the user</li>
	</ul>

	<p>There are a number really amazing and exciting things to note here. First, notice how the application is written in JavaScript <span class="caps">AND</span> the data is JavaScript. The <span class="caps">JSON</span> store might actually be written in another language (CouchDB is Erlang, Cloudkit is Ruby) but we don&#8217;t really ever have to touch those. Personally, I really like JavaScript. Sure, I miss some of Ruby&#8217;s syntax and niceties, but I&#8217;ll give that up pretty quickly for something that still shares some of the similar good features (closures, loose typing) and has a ubiquitous deployment environment (the browser). Second, the end result is probably similar if not better to the end user, as we eliminate the need to reload the page at every request, resulting in a better perceived speed.</p>

	<p>One of the provisions I gave for my talk is that &#8220;I&#8217;m less concerned with speed than awesomeness&#8221;. That rings pretty true here. I don&#8217;t have an architecture like this running in production and getting hit like twitter. I can&#8217;t really speak yet to how well it &#8216;scales&#8217; or how it preforms under load. <span class="caps">I CAN</span> tell you about how awesome it is and how easy and fun it was to develop swinger with Sammy. That&#8217;s really all <em>I</em> need to know right now.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=-4N1nckEuKw:vINMrvllKc0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=-4N1nckEuKw:vINMrvllKc0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=-4N1nckEuKw:vINMrvllKc0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=-4N1nckEuKw:vINMrvllKc0:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/09/15/sammy-js-couchdb-and-the-new-web-architecture/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/09/15/sammy-js-couchdb-and-the-new-web-architecture/</feedburner:origLink></item>
		<item>
		<title>jQueryConf 2009</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/bqKdKa-1Jdc/</link>
		<comments>http://www.quirkey.com/blog/2009/09/14/jqueryconf-2009/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 22:32:33 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=356</guid>
		<description><![CDATA[	First of all jQueryConf was straight up awesome. The organizers did a great job and I met a staggering number of cool, intellegent people. I think the key (at least for me) of why it was so much fun, was it wasn&#8217;t a ruby conference. What I mean by that is it wasn&#8217;t just other [...]]]></description>
			<content:encoded><![CDATA[	<p>First of all jQueryConf was straight up awesome. The organizers did a great job and I met a staggering number of cool, intellegent people. I think the key (at least for me) of why it was so much fun, was it wasn&#8217;t a ruby conference. What I mean by that is it wasn&#8217;t just other Rubyists, with similar day jobs, and similar interests. Thats fun of course, but the thing with jQuery and JavaScript in general, is it is very few peoples&#8217; full time jobs. That means that there were devs from every neck of the web development woods. That meant for me, hearing a ton of new and different perspectives and getting a whiff of all the cool stuff going on <span class="caps">OUTSIDE</span> of the Ruby world.</p>

	<p>I think my talk was pretty successful and besides not getting through all my slides, it seems like I got a lot of people excited about CouchDB and Sammy.js. I&#8217;m going to write a pretty in-depth recap of the talk and post it soon.</p>

	<p>Also, It sounds like there will be a lot more jQuery and JavaScript conferences in the near future. I can&#8217;t wait.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=bqKdKa-1Jdc:93i-5GN3te0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=bqKdKa-1Jdc:93i-5GN3te0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=bqKdKa-1Jdc:93i-5GN3te0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=bqKdKa-1Jdc:93i-5GN3te0:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/09/14/jqueryconf-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/09/14/jqueryconf-2009/</feedburner:origLink></item>
		<item>
		<title>Vegas: Rack it up</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/5QrQvQYwtds/</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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=5QrQvQYwtds:7c15Zpresgc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=5QrQvQYwtds:7c15Zpresgc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=5QrQvQYwtds:7c15Zpresgc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=5QrQvQYwtds:7c15Zpresgc:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/08/31/vegas-rack-it-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/08/31/vegas-rack-it-up/</feedburner:origLink></item>
		<item>
		<title>Rails Rumble: Please Tag Your Photos</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/495ARmXzXl4/</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 24 [...]]]></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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=495ARmXzXl4:3unHt5ZLug4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=495ARmXzXl4:3unHt5ZLug4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=495ARmXzXl4:3unHt5ZLug4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=495ARmXzXl4:3unHt5ZLug4:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/08/24/rails-rumble-please-tag-your-photos/</feedburner:origLink></item>
		<item>
		<title>Ruby Kaigi ‘09: Post-mortem</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/QqT_sH4aH_U/</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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=QqT_sH4aH_U:zbJEGgTm-lU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=QqT_sH4aH_U:zbJEGgTm-lU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=QqT_sH4aH_U:zbJEGgTm-lU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=QqT_sH4aH_U:zbJEGgTm-lU:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/07/31/ruby-kaigi-09-post-mortem/</feedburner:origLink></item>
		<item>
		<title>Headed out: What I’ve been up to June + Early July ‘09</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/0dCSktMx2BE/</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 usefulness [...]]]></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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=0dCSktMx2BE:T0K808uGuL4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=0dCSktMx2BE:T0K808uGuL4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=0dCSktMx2BE:T0K808uGuL4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=0dCSktMx2BE:T0K808uGuL4:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/07/15/headed-out-what-ive-been-up-to-june-early-july-09/</feedburner:origLink></item>
		<item>
		<title>Sammy.js hits a new milestone (0.2.0)</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/9DY-kzUOG2g/</link>
		<comments>http://www.quirkey.com/blog/2009/06/12/sammyjs-hits-a-new-milestone-020/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 17:40:15 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=325</guid>
		<description><![CDATA[Thanks to the support and help of an awesome community, Sammy.js hit 0.2.0 on Monday. You can see the full release notes here and the API doc has been updated to reflect the changes.

My favorite feature from this update might be the simplest. 

Rendering partials now uses a special swap() method on Sammy.Application. By default [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to the support and help of an awesome community, <a href="http://code.quirkey.com/sammy">Sammy.js</a> hit 0.2.0 on Monday. You can see the <a href="http://groups.google.com/group/sammyjs/browse_thread/thread/add71f66703fe74f">full release notes here</a> and the <a href="http://code.quirkey.com/sammy/docs/api.html">API doc</a> has been updated to reflect the changes.</p>

<p>My favorite feature from this update might be the simplest. </p>

<p>Rendering partials now uses a special <code>swap()</code> method on <code>Sammy.Application</code>. By default it just uses jQuery's <code>html()</code> method to swap out the old content of <code>$element</code> with the new content. The power though, is you easily override this to provide a cool transition when a new partial is rendered.</p>

<pre class="textmate-source"><span class="source source_js source_js_jquery"><span class="storage storage_type storage_type_js">var</span> app <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="keyword keyword_operator keyword_operator_js">$</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>sammy<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
  
  <span class="meta meta_function meta_function_js"><span class="support support_class support_class_js">this</span>.<span class="entity entity_name entity_name_function entity_name_function_js">swap</span> <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="storage storage_type storage_type_function storage_type_function_js">function</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_begin punctuation_definition_parameters_begin_js">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_js">content</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_end punctuation_definition_parameters_end_js">)</span></span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="storage storage_type storage_type_js">var</span> width <span class="keyword keyword_operator keyword_operator_js">=</span> <span class="support support_class support_class_js support_class_js_jquery">$</span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="support support_class support_class_js">window</span></span><span class="punctuation punctuation_section punctuation_section_class punctuation_section_class_js">)</span><span class="support support_function support_function_js support_function_js_jquery">.width</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
    <span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="keyword keyword_operator keyword_operator_js">$</span>element<span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span>
      <span class="support support_function support_function_js support_function_js_jquery">.wrapInner</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>&lt;div class="inner"&gt;&lt;/div&gt;<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
      <span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js support_function_js_jquery">children</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_js">(</span><span class="meta meta_selector meta_selector_jquery"><span class="punctuation punctuation_definition punctuation_definition_selector punctuation_definition_selector_begin punctuation_definition_selector_begin_js">'</span><span class="meta meta_selector meta_selector_css"><span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_class entity_other_attribute-name_class_css"><span class="punctuation punctuation_definition punctuation_definition_attribute-name punctuation_definition_attribute-name_css">.</span>inner</span></span><span class="punctuation punctuation_definition punctuation_definition_selector punctuation_definition_selector_end punctuation_definition_selector_end_js">'</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_js">)</span>
        <span class="support support_function support_function_js support_function_js_jquery">.animate</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>queue: <span class="constant constant_language constant_language_boolean constant_language_boolean_false constant_language_boolean_false_js">false</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>left: <span class="string string_quoted string_quoted_double string_quoted_double_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">"</span>-<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">"</span></span> <span class="keyword keyword_operator keyword_operator_js">+</span> width<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">400</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
        <span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span><span class="support support_function support_function_js support_function_js_jquery">remove</span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_js">()</span>
        <span class="support support_function support_function_js support_function_js_jquery">.end</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span>
      <span class="support support_function support_function_js support_function_js_jquery">.html</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span>content<span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
      <span class="support support_function support_function_js support_function_js_jquery">.css</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>left: width<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span>
      <span class="support support_function support_function_js support_function_js_jquery">.animate</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>left: <span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>0px<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span>width: width<span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="constant constant_numeric constant_numeric_js">400</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  
  <span class="variable variable_language variable_language_js">this</span><span class="support support_function support_function_js support_function_js_jquery">.get</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>#/user/:name<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="storage storage_type storage_type_js">function</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">()</span> <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>
    <span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>partial<span class="meta meta_brace meta_brace_round meta_brace_round_js">(</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>name.erb<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_delimiter meta_delimiter_object meta_delimiter_object_comma meta_delimiter_object_comma_js">, </span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">{</span>name: <span class="variable variable_language variable_language_js">this</span><span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js">.</span>params<span class="meta meta_brace meta_brace_square meta_brace_square_js">[</span><span class="string string_quoted string_quoted_single string_quoted_single_js"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js">'</span>name<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js">'</span></span><span class="meta meta_brace meta_brace_square meta_brace_square_js">]</span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  <span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span>
  
  <span class="comment comment_line comment_line_double-slash comment_line_double-slash_js"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_js">//</span>...
</span><span class="meta meta_brace meta_brace_curly meta_brace_curly_js">}</span><span class="meta meta_brace meta_brace_round meta_brace_round_js">)</span><span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js">;</span></span></pre>

<p>Now, when you go to '#/user/aq' or similar, it will use the swap method to do a nifty transition, instead of ye old <code>html()</code>.</p>

<p>Theres more examples and Sammy on the way. Come join the mailing list or hang out in irc to learn or contribute.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=9DY-kzUOG2g:NNzUqQj7PBw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=9DY-kzUOG2g:NNzUqQj7PBw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=9DY-kzUOG2g:NNzUqQj7PBw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=9DY-kzUOG2g:NNzUqQj7PBw:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/06/12/sammyjs-hits-a-new-milestone-020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/06/12/sammyjs-hits-a-new-milestone-020/</feedburner:origLink></item>
		<item>
		<title>What I’ve been up to: The End o’ May Edition</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/ccPX8wdC8Og/</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 far. [...]]]></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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=ccPX8wdC8Og:Y_39MmHk0BE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=ccPX8wdC8Og:Y_39MmHk0BE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=ccPX8wdC8Og:Y_39MmHk0BE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=ccPX8wdC8Og:Y_39MmHk0BE:D7DqB2pKExk" border="0"></img></a>
</div>]]></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" />
		<feedburner:origLink>http://www.quirkey.com/blog/2009/05/29/what-ive-been-up-to-the-end-o-may-edition/</feedburner:origLink></item>
		<item>
		<title>The (small) Fund</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/5X8yj-DeSGg/</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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=5X8yj-DeSGg:5bwX-G74ia0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=5X8yj-DeSGg:5bwX-G74ia0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=5X8yj-DeSGg:5bwX-G74ia0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=5X8yj-DeSGg:5bwX-G74ia0:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2009/05/27/the-small-fund/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/05/27/the-small-fund/</feedburner:origLink></item>
		<item>
		<title>Introducing Sammy: The tiny but swingin’ JavaScript Framework</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/itR5cUakYtE/</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 Docs
		Follow @sammy_js
		Join the mailing [...]]]></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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=itR5cUakYtE:7v09ksnmMp8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=itR5cUakYtE:7v09ksnmMp8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=itR5cUakYtE:7v09ksnmMp8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=itR5cUakYtE:7v09ksnmMp8:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>5</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" />
		<feedburner:origLink>http://www.quirkey.com/blog/2009/05/15/introducing-sammy-the-tiny-but-swingin-javascript-framework/</feedburner:origLink></item>
		<item>
		<title>RailsBridge: Moving the community forward</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/AEzUTBIep60/</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>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=AEzUTBIep60:9piMHbKyh0U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=AEzUTBIep60:9piMHbKyh0U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=AEzUTBIep60:9piMHbKyh0U:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=AEzUTBIep60:9piMHbKyh0U:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/05/04/railsbridge-moving-the-community-forward/</feedburner:origLink></item>
		<item>
		<title>Github Pages for Fun and Win</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/g6SJBve8AcE/</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 especially [...]]]></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>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=g6SJBve8AcE:U6Yt-PjU3qo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=g6SJBve8AcE:U6Yt-PjU3qo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=g6SJBve8AcE:U6Yt-PjU3qo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=g6SJBve8AcE:U6Yt-PjU3qo:D7DqB2pKExk" border="0"></img></a>
</div>]]></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>
		<feedburner:origLink>http://www.quirkey.com/blog/2009/05/01/github-pages-for-fun-and-win/</feedburner:origLink></item>
	</channel>
</rss>
