<?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>Thu, 14 Mar 2013 20:51:12 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/quirkey" /><feedburner:info uri="quirkey" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><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><item>
		<title>People</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/ouE0IbRiMXk/</link>
		<comments>http://www.quirkey.com/blog/2013/03/14/people/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 16:34:29 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=581</guid>
		<description><![CDATA[A few weeks ago, when I was in San Francisco, my good friend @mikeal asked me to sit down with him and do an informal interview by the bay. When he asked me, &#8220;What&#8217;s the hardest part about moving from the position of being a developer to being a CTO and a manager?&#8221; this was [...]]]></description>
			<content:encoded><![CDATA[	<p><p>A few weeks ago, when I was in San Francisco, my good friend <a href="http://twitter.com/mikeal">@mikeal</a> asked me to sit down with him and do an informal interview by the bay. When he asked me, &#8220;What&#8217;s the hardest part about moving from the position of being a developer to being a <span class="caps">CTO</span> and a manager?&#8221; this was my response:</p></p>

	<p><iframe src="http://player.vimeo.com/video/60470540?byline=0&#038;portrait=0" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><br />
<span id="more-581"></span><br />
<p>At this point I&#8217;ve been &#8220;managing people&#8221; at Paperless Post for more than three years. We&#8217;ve grown from a team of 5 to almost 55 as of writing this, and my team, the Dev Team, makes up half of that. The act of working with people takes up a large majority of my time. In the early days it was hard to reconcile my own desire for productivity with that of my team, and I&#8217;m not going to lie that I still have days where I want to just put on my headphones, and write some fucking code and not talk to people. In the past year or so, I realized that I was always searching for big challenges, and there in front of me was the biggest challenge of all, People.</p></p>

	<p><p>People suck, it&#8217;s true. I don&#8217;t want to hide the fact that a lot of people in this world, this country, this city, are not really pleasant and wether or not their good people or not, I don&#8217;t really want to deal with them. I also want to be clear, that while I consider the people I work with some of the best people on Earth, they can still be cruel, annoying, and downright difficult sometimes. I&#8217;ve started to believe that managing people isn&#8217;t trying to change them into better people, or even try to mold them to some ideal &#8220;EMPLOYEE&#8221; &#8211; managing people is the art of dealing with the fact that every single person is a <em>special snowflake</em> and helping them work efficiently within the confines of who they are.</p></p>

	<p><p>This is fundamentally different then how I thought about this in the beginning. When I left my first job, where at the end I was &#8220;managing a small team&#8221;, I was shooting like an arrow aimed at doing the opposite of everything I thought my former bosses did wrong. The one thing I didn&#8217;t see as wrong, though, was this idea that People are &#8220;Resources&#8221;. This in some way implies that different developers, designers, etc, are interchangeable &#8211; wether or not they are capable of all doing the same thing you can <em>shuffle them</em> until they fit. While this is a lovely idea, it&#8217;s truly fantasy, a vision that a manager at a nice desk dreamed up so many years ago. When you&#8217;re working with people who spend their entire days thinking, its beyond just fitting a square peg in a round hole &#8211; its trying to shove a thinking human being in a hole of any size &#8211; it simply won&#8217;t work. The symptoms of this are people who are tasked with the wrong work, spend a lot of time fighting back, and are generally just not getting much done.</p></p>

	<p><p>At this realization my work changed into &#8220;So if they don&#8217;t fit without shoving, how can I change my approach to guide them into the right place?&#8221;. Ah, the classic art of Inception. This works, sometimes. You&#8217;re not changing People, you&#8217;re still thinking of them as <em>Resources</em>, as puzzle pieces. However, the approach is different. You subtly direct and assist people into position. It takes a large amount of effort from the manager side, as you spend a most of your time planting ideas, checking in, and generally making gentle pushes in the right direction. This worked for me. For the most part, it worked for our team, too. People were convinced that they were working on the right things, we became generally more efficient, and we were able to grow. There were still outliers, though. People who, no matter how gently we nudged, they were just not getting things done.</p></p>

	<p><p>Every 6 months, at Paperless Post we go through an internal review process where peers write reviews of peers, managers, and themselves, and then managers have one-on-one meetings with the people they manage. For me, this is a lot of people. This round (which is taking place this week, which is most definitely why this topic is on my mind) I&#8217;m meeting with 18 people. It&#8217;s a lot of talking, and for me is very emotionally draining. At its core, It&#8217;s because I care a lot about these people that I&#8217;m responsible for, and want to see them succeed. I&#8217;m lucky in that most of these conversations are very easy. Every round though, there are at least a couple hard conversations.</p></p>

	<p><p>What I&#8217;ve realized now, in dealing with these wonderful human beings, is that there is a clear limit to inception, and when as a wrangler, you&#8217;ve reached that limit, its important to be decisive. For me the challenge is being firm in what needs to happen next, but the options are clear: Either this person is in the wrong role and there is a better place for them inside the company; They are having difficulty working with people and need direct feedback that they need to try another approach; or sadly, theres not a place for them in the current company. This is hard for me, because I want to believe that good people can work on any problem, but in the end of the day, the company has a goal and a vision and if they can&#8217;t help achieve that in the current set up, then it&#8217;s best to be clear about that, and make the break.</p></p>

	<p><p>The point of all this, is to treat people like people. People are so much more complicated then any other person can actually reason about, and teams of people just multiply the variables. Then work and projects and the pressure that comes along with that, just adds another huge set of factors. I&#8217;ve learned a ton being a manager the past couple of years. It&#8217;s still very challenging and there are new wonderful and crazy things every day. I get to see young developers grow into seasoned pros and feel like I had a part in it. I get to see them mentor someone else, and get to feel it doubly. And its because I&#8217;ve spent the time to know these people, to help them, to push them, that I get to really take any credit for their and this company&#8217;s success. In this world the only way to work with others is to know them, try not to assume anything, give them feedback, and figure out how you, as two <em>special snowflakes</em> can be a team.</p></p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=ouE0IbRiMXk:kg_PK_2uTsw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=ouE0IbRiMXk:kg_PK_2uTsw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=ouE0IbRiMXk:kg_PK_2uTsw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=ouE0IbRiMXk:kg_PK_2uTsw:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2013/03/14/people/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2013/03/14/people/</feedburner:origLink></item>
		<item>
		<title>Back East</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/P2ZVbc0AnmI/</link>
		<comments>http://www.quirkey.com/blog/2012/11/29/back-east/#comments</comments>
		<pubDate>Thu, 29 Nov 2012 20:29:30 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=576</guid>
		<description><![CDATA[This is an un-edited email that I sent to my team at Paperless Post a little while ago. TL;DR I&#8217;m moving back to Brooklyn, and I&#8217;m really going to miss the west coast but it&#8217;s for the best. Hey Paperless Family There have been little bits of information floating around and I wanted to finally [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is an un-edited email that I sent to my team at Paperless Post a little while ago. TL;DR I&#8217;m moving back to Brooklyn, and I&#8217;m really going to miss the west coast but it&#8217;s for the best.</em></p>

<p>Hey Paperless Family</p>

<p>There have been little bits of information floating around and I
wanted to finally come out and announce my intentions in my own words.
Over the next couple of months I am moving back to my birthplace and
the home of Paperless Post, New York City.</p>

<p>To give some background to people who joined since I&#8217;ve been away, a
little over two years ago, I moved all of my stuff and my cats to the
San Francisco Bay Area so that my wife, Kat, could follow her dreams
and get her MFA at Mills College. She has completed classes and is now
working on her final thesis project (which will be on display in
Oakland in February).</p>

<p>Over the past two and a half years I&#8217;ve travelled over 263,000 miles
to be alternately with her and with you, my other family. Being a
remote CTO has not been very easy, but I&#8217;ve really tried my best.
Despite everyone&#8217;s effort to make the best of a hard situation, it
more often than not felt like Cat Stevens&#8217; &#8220;Cat&#8217;s Cradle&#8221; instead of
Journey&#8217;s &#8220;Don&#8217;t Stop Believin&#8221;. Which
is to say, I&#8217;ve felt more like an estranged parent watching my little
dev team grow up without me than a small town boy going anywhere. I
couldnt hold on to that feeling.</p>

<p>Which brings me to now. I want to see this company really, truly
succeed. I know this company can. We are already succeeding in so many
ways, and I am coming back with a mission to make this the best
company in NYC. I know we can do it.</p>

<p>This trip brings me to the crossroads: from now on I will be spending
more time in NYC than in SF, spending 9 of the next 12 weeks here,
ultimately moving back for good in the begining of December.</p>

<p>I am looking forward to not missing any more beer o&#8217; clocks, doing
tons of movie nights, and more than anything participating actively
and face to face in the daily goings-on of this team.</p>

<p>I can&#8217;t wait.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=P2ZVbc0AnmI:THcNHY526F8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=P2ZVbc0AnmI:THcNHY526F8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=P2ZVbc0AnmI:THcNHY526F8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=P2ZVbc0AnmI:THcNHY526F8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2012/11/29/back-east/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2012/11/29/back-east/</feedburner:origLink></item>
		<item>
		<title>Client-side frameworks suck</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/jBgmjgwE6og/</link>
		<comments>http://www.quirkey.com/blog/2012/09/04/client-side-frameworks-suck/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 15:45:55 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Ranting]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=559</guid>
		<description><![CDATA[Almost a year ago I gave a talk at JSConf.eu after spending a long time thinking about what had been irking me so much about client side frameworks and the JS community in general. The premise for the talk was simple: frameworks are not the answer and certainly not the goal. I noticed how much [...]]]></description>
			<content:encoded><![CDATA[<p>Almost a year ago I gave a talk at JSConf.eu after spending a long time thinking about what had been irking me so much about client side frameworks and the JS community in general. The premise for the talk was simple: frameworks are not the answer and certainly not the goal. I noticed how much time people spent debating the merits and qualities of frameworks and it seemed like no one was actually <em>shipping</em>.</p>

<span id="more-559"></span>

<p>You can watch the full talk here:</p>

<iframe src="http://blip.tv/play/hq0KgtrnAQI.html?p=1" width="550" height="443" frameborder="0" allowfullscreen></iframe>

<p><embed type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#hq0KgtrnAQI" style="display:none"></embed></p>

<h3>There is no BEST</h3>

<p>I think the thing that had bothered me the most was that people kept wanting to elect the &lsquo;BEST&rsquo; framework, like that was a prize to be won. It just made so little sense to me. The concept of <em>best</em> is so silly in the development world. Not only do standards and best practices change constantly (much faster than frameworks can or do) but the idea that there is a single library or system that could satisfy the needs of a majority of projects is just absurd. Some apps are structured around pages, some around events; some are simple single page information holders, some are complex intertwined real-time emotion recorders. Any level of complexity in a framework is going to make it not useful for a majority of cases and any level of simplicity is going to make the framework not that helpful. The fact that someone would go into a project with the goal of using a specific framework seems so backwards.</p>

<p>Obviously, different applications/sites/businesses have different goals, but for 99% of them that goal has very little to do with the technology used, especially the technology chosen to power the client side.</p>

<h3>Sammy lost</h3>

<p>To the outside world, though, Sammy lost this war to be the best. The funny thing to me is that I was never trying to fight. Over and over again, people tried to pull me into the battle of &ldquo;What&rsquo;s better, Sammy or X?&rdquo; and I refused to answer. Not only was trying to defend something that I wrote for myself and gave to the community as a gift, just straight exhausting, it was futile. 

Sammy isn't the best. It is good for a number of use cases and not very good at all for others. It&rsquo;s an idea and a tool, not a religion, and definitely not a messiah. The smart people out there should look up and realize that niether is any other framework.</p>

<h3>It&rsquo;s fucking JavaScript</h3>

<p>In the client side especially, the fact is that however complex your app is and how fully featured your framework is, you&rsquo;re going to be writing JavaScript. JavaScript is a constrained and pretty crazy language running in a wacky ever changing environment. If you expect your framework to hold your hand through the battle field, you&rsquo;re going to end up hitting a mine at some point and if you don&rsquo;t understand or know how to write vanilla JavaScript, you will never escape.</p>

<p>I really, really love JavaScript (especially in the browser). It&rsquo;s bizzare but it&rsquo;s powerful. I created a framework to help me have a basic layer on which to build JavaScript applications, that fit the style of applications I wanted to and was building. Its goal was to help me ship interesting things faster, and it definitely succeeds in that. In all of those applications though, Sammy was maybe 5% of the final application. The rest - it was just fucking JavaScript.</p>

<h3>Where to</h3>

<p>Sammy.js quietly turned 3 years old in May of this year. It was a moment that passed without fanfare or celebrations. I reflected on what I&rsquo;d accomplished since then, and though Sammy has changed a lot since the begining I know for a fact that the JS world has changed more around it. It will continue to change and whatever is hot now, will look like the stupidest idea ever very soon. Thats the nature of this crazy world we work in.</p>

<p>I&rsquo;ve stepped back a lot from maintaining Sammy day to day and <a href="https://github.com/endor">Frank Prößdorf aka endor</a> has been doing a great job pushing the project forward.</p>

<p>Sammy is still here, and will still be here. Whether or not the actual code is still in use, the ideas live on in a ton of other projects and frameworks and that I can certainly be happy about.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=jBgmjgwE6og:LMbWW73yCEA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=jBgmjgwE6og:LMbWW73yCEA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=jBgmjgwE6og:LMbWW73yCEA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=jBgmjgwE6og:LMbWW73yCEA:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2012/09/04/client-side-frameworks-suck/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2012/09/04/client-side-frameworks-suck/</feedburner:origLink></item>
		<item>
		<title>Sammy 0.7: Boy Meets Girl</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/jiPRkK57cHI/</link>
		<comments>http://www.quirkey.com/blog/2011/08/01/sammy-0-7-boy-meets-girl/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 13:00:07 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=541</guid>
		<description><![CDATA[Another long time in the making, Sammy 0.7 is here and its sexy. Check out the HISTORY and the full Changes to get the full details. The Boy of &#8220;Boy meets Girl&#8221; is Sammy, and the Girl is HTML5. Download it! It&#8217;s probably seemed like Sammy development had stopped a while ago. With all the [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.quirkey.com/skitch/boymeetsgirl-20110730-170414.png" alt="" /></p>
<p>Another long time in the making, Sammy 0.7 is here and its sexy. Check out the <a href="https://github.com/quirkey/sammy/blob/master/HISTORY.md"><span class="caps">HISTORY</span></a> and the full <a href="https://github.com/quirkey/sammy/compare/v0.6.3...v0.7.0">Changes</a> to get the full details. The Boy of &#8220;Boy meets Girl&#8221; is Sammy, and the Girl is HTML5.</p>
<p><a href="http://github.com/quirkey/sammy/tarball/v0.7.0">Download it!</a></p>
<span id="more-541"></span>
<p>It&#8217;s probably seemed like Sammy development had stopped a while ago. With all the other similar frameworks bouncing around these days, I&#8217;ll admit there were some dark days of doubt leading up to this release. In fact, most of the code that comprises Sammy 0.7 has been in the master branch for over 4 months. However, development and my belief in this project hasn&#8217;t wained, its more just that I&#8217;ve been completely consumed by my work at <a href="http://www.paperlesspost.com">Paperless Post</a> (and in a very good way). One of the benefits of leading the team there has been the ability to push the boundaries of what we can do with our code and our libraries. We use Sammy extensively at PP and I was super excited to have a use case and a way to develop and test this latest version and all its power. The big addition of HTML5 History support has made the big new app we&#8217;ve been working on for the past 6 months seamlessly deep-link between full urls and hash urls between multiple browsers. We&#8217;re pretty psyched about it.</p>
<h3>History is History</h3>
<p>Despite which side you fell in on in the <a href="http://www.quirkey.com/blog/2011/02/10/ish/">Great hashchange debacle of '11</a> you can&#8217;t argue with the pure fact that regular <span class="caps">URI</span> paths are just better than hash (#) paths. The makers of the great browsers of the world and the HTML5 History spec have a solution that attempts to appeal to everyone. The premise is simple &#8211; create a JS <span class="caps">API</span> for manipulating the full path of the current browsers location without forcing a page reload. Meaning, you can tell the url to change from <code>http://www.example.org/one</code> to <code>http://www.example.org/two</code> without having to reload the window, and allowing you to then manipulate the state of the page. Seems sort of like a dream, doesn&#8217;t it? Not only that but it really is a perfect fit for the way Sammy manages state and how Sammy applications are already built around routes and paths. I knew this was the case the first time I saw it, but I was unsure how to mix it with the existing hash based routing that works (and would have to persist) across every browser, not just the latest and greatest.</p>
<p>I believe Sammy 0.7 presents a pretty solid solution. Now, instead of routing on paths that look like <code>#/mypath</code> you just route on paths that look like a server side path <code>/mypath</code></p>
<div class="highlight"><pre><span class="kd">var</span> <span class="nx">Sammy</span><span class="p">(</span><span class="s1">&#39;#container&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s1">&#39;Mustache&#39;</span><span class="p">);</span><br />
<br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;templates/index.mustache&#39;</span><span class="p">);</span> <br />
  <span class="p">});</span><br />
<br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/:user&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;users/&#39;</span> <span class="o"><ins></span> <span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">user</span> <span class="o"></ins></span> <span class="s1">&#39;.json&#39;</span><span class="p">)</span><br />
        <span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;user.mustache&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
<br />
<span class="p">});</span><br />
</pre></div>
<p>The beauty and magic of above is a those routes will match both <code>quirkey.com/#!/aq</code> and <code>quirkey.com/aq</code> and execute the user route as expected. I&#8217;ve created a simple working example for you to play with at <a href="http://pushstate.quirkey.com/">http://pushstate.quirkey.com/</a> (source <a href="https://github.com/quirkey/sammy-pushstate">here</a>). We&#8217;ve been using and testing this for the past months and I can say its pretty solid (and pretty awesome).</p>
<p>There are some known caveats:</p>
<ul>
	<li>History only works in latest and greatest browsers (Chrome, FF5, Safari 4) but support for it is growing. Ben Cherry and the team at twitter also found some issues with certain versions of <a href="https://bugs.webkit.org/show_bug.cgi?id=42940">webkit and URLs getting out of sync (though its been resolved</a></li>
	<li>Your server side needs to be able to handle whatever urls you&#8217;re changing to. This means that if you route/redirect to something like <code>/path/one/two</code> in Sammy, the server better be able to handle that url as well and point you in the right direction. Otherwise, refreshing the browser will lead users to a 404 or worse. The <a href="https://github.com/quirkey/sammy-pushstate">sammy-pushstate</a> example has a pretty clever way of dealing with this in couchapps. It uses CouchDB rewrite rules to route any url request (minus the key files) to the index.html page (and hence allows sammy to handle the routing).</li>
	<li>Currently, mobile webkit (aka Mobile Safari and the Android browser) report support for pushState/History when in fact they don&#8217;t have it. Since I&#8217;ve tried to keep browser sniffing out of the core Sammy repo, it currently doesn&#8217;t detect for this. You can manually disable push state per application, though, and do the browser sniff yourself if you plan to use your app on mobile.</li>
	<li>This causes some possible breaking changes for upgrading Sammy apps. If you previously did any routing (or path checking) the path reported in a route (EventContext.prototype.path) is now the full path starting at <code>/</code> not just the path beyond the hash. Also HashLocationProxy was renamed to DefaultLocationProxy.</li>
</ul>
<p>That being said, its a pretty awesome feature and it makes writing Sammy apps really powerful when exposed to the full path. Theres more information in the <span class="caps">API</span> docs <a href="http://sammyjs.org/docs/api/0.7.0/all#Sammy.DefaultLocationProxy">here</a>.</p>
<h3>Templating engines are so 2010</h3>
<p>One thing thats frustrated a number of Sammy users is that previously all the template plugins (aka Sammy.Mustache, Sammy.Handlebars, etc) included the source for the engine in the plugin. In the beginning, I thought this was a great idea because it reduced the number of potential headaches and complaints of &#8216;Mustache isn&#8217;t working (because I didn&#8217;t include the source)&#8217;. However, what turned out to be a bigger issue was keeping up with all the plugins and their individual rapid development cycles. Because of this, all templating plugins (with the exception of Sammy.Template and Sammy.Meld) are now just simple wrappers and expect you to include the respective templating library in your own source. This also makes the case of using Mustache outside of Sammy in the same source/app as a Sammy.Mustache application a lot easier. For the sake of making the transition easier, the latest version of all of the engines is included in the repo (in <a href="https://github.com/quirkey/sammy/tree/master/vendor/templating">vendor/templating</a>).</p>
<h3>More!</h3>
<p>Those are  certainly the biggest things with this release but its also not the whole deal. There were <a href="https://github.com/quirkey/sammy/blob/master/HISTORY.md">12 other changes, bug fixes, and new plugins written by 10 different contributors!</a> I can&#8217;t thank the people who use and contribute patches and ideas back to Sammy, enough. You guys rock.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=jiPRkK57cHI:PDanNEopPM4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=jiPRkK57cHI:PDanNEopPM4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=jiPRkK57cHI:PDanNEopPM4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=jiPRkK57cHI:PDanNEopPM4:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/08/01/sammy-0-7-boy-meets-girl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/08/01/sammy-0-7-boy-meets-girl/</feedburner:origLink></item>
		<item>
		<title>Artists not Hackers</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/44oNUvKYNiM/</link>
		<comments>http://www.quirkey.com/blog/2011/05/26/artists-not-hackers/#comments</comments>
		<pubDate>Thu, 26 May 2011 21:52:40 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=534</guid>
		<description><![CDATA[A couple of weeks ago I gave a short presentation mockingly titled &#8220;John Tesh does Client Side Javascript&#8221;. The real thesis of the talk has nothing to do with John Tesh, in fact it has little to do with client side JavaScript. The thesis I&#8217;m trying to present is that artists, not hackers, are where [...]]]></description>
			<content:encoded><![CDATA[	<p>A couple of weeks ago I gave a <a href="http://swinger.quirkey.com/#/preso/aq-jsconf2011/display/1" title="">short presentation</a> mockingly titled &#8220;John Tesh does Client Side Javascript&#8221;. The real thesis of the talk has nothing to do with John Tesh, in fact it has little to do with client side JavaScript. The thesis I&#8217;m trying to present is that artists, not hackers, are where we should put our ambitions.  Unfortunately, the irony was lost on a bunch of people and regardless I think its an apt subject for a good old fashioned blog post.</p>

	<h3>Art is passion</h3>

	<blockquote>Technique alone is never enough. You have to have passion. Technique alone is just an embroidered pot holder.<br />
&#8212;<a href="http://en.wikipedia.org/wiki/Raymond_Chandler" title="">Raymond Chandler</a></blockquote>

	<p>Programming and web development is often a cold silent world. We sit in front of ever larger screens, growing ever more quiet as we move all our conversations, all our lives even, on to a souless &#8216;cloud&#8217; of information. It can be pretty bleak. The push towards this empty void is accelerated by some constant code mantras. Often progress means faster; it means raw numbers and a race towards small benchmarkable improvements. Its a society of technique, of sharpening blades and micro-optimizations. For me, at least, theres something missing. It&#8217;s what Raymond Chandler points to above. Passion here is the difference between Technique and Craft, between Hacking and Art.</p>

	<h3>Hacking is so 1998</h3>

	<p>I want to retire the word hacking.</p>

	<p>I&#8217;m sick of it. It implies the completely wrong metality that I would aspire to. hacking conveys butchery, it suggests unproffesionalism. Most of all it suggests a &#8216;git it done&#8217; attitude that is pretty opposite the idea of making <em>art</em>. Is code <em>art</em>? I&#8217;m not going to go in to the &#8216;what is art?&#8217; circle &#8211; its a trap. The art is almost irrelevant, it is the act thats import. The act of creating.</p>

	<p>I don&#8217;t want to be hacking &#8211; I want to be creating.</p>

	<h3>Art is balance</h3>

	<p>The more I think about it, life itself is really about balance &#8211; or at least the pursuit there of. Not to get all Geoge Lucas &#8211; but there are a lot of forces at work and in ourselves that drive what our lives &#8211; our art, our work &#8211; are about. Here, I believe that the artist, above all, is able to stradle the line between these powers and emotions.</p>

	<p>As a programmer here are some of the tightropes you&#8217;ll have to walk:</p>
	<ul>
		<li>Pride vs Humility: Taking pride in your craft while being humble about its origins. We&#8217;re all just re-formulating old ideas.</li>
		<li>Winning vs Respect: The drive to win and be the best is productive until it means sacrificing knowledge you can gain from your competitora</li>
		<li>Shipping vs Perfection: This is also similar to Quality vs Speed. The need to get <em>something</em> out often is more important then the need to atain perfection in your work. Artists face this every day and the knowledge of self in this respect is often what create uniquness. Jackson Pollock once famously said, when asked about when he knew one of his <a href="http://www.google.com/search?q=jackson+pollock&#038;hl=en&#038;prmd=ivnso&#038;tbm=isch&#038;tbo=u&#038;source=univ&#038;sa=X&#038;ei=ssreTd8ykemBB_Ki9fgK&#038;ved=0CDQQsAQ&#038;biw=1337&#038;bih=1079" title="">iconic paintings was &#8216;finished&#8217;</a> &#8211; &#8220;how do you know when you&#8217;re finished making love?&#8221;. Artists rely on thier insticts, not their critics for &#8220;shipping&#8221;.</li>
	</ul>

	<h3>Striving</h3>

	<p>To be an artist is to <em>make</em> art. Where hacking is an act, <strong>art</strong> is a lifelong goal.</p>

	<p>I&#8217;m not an artist, but I&#8217;d like to think I&#8217;m trying.</p>

 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=44oNUvKYNiM:n00QmY8yu4w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=44oNUvKYNiM:n00QmY8yu4w:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=44oNUvKYNiM:n00QmY8yu4w:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=44oNUvKYNiM:n00QmY8yu4w:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/05/26/artists-not-hackers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/05/26/artists-not-hackers/</feedburner:origLink></item>
		<item>
		<title>Code for Other People</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/BzmFR3FiOno/</link>
		<comments>http://www.quirkey.com/blog/2011/05/03/code-for-other-people/#comments</comments>
		<pubDate>Tue, 03 May 2011 22:30:37 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Ranting]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=527</guid>
		<description><![CDATA[I know this is going to sound crazy &#8211; but not so long ago &#8211; I heard a voice. It was at a Allman Brothers concert. I was 18, sitting in the balcony, and Dicky Betts was wailing up and down the fretboard. And in that brief moment, the music stopped. All I heard was [...]]]></description>
			<content:encoded><![CDATA[	<p>I know this is going to sound crazy &#8211; but not so long ago &#8211; I heard a voice. It was at a Allman Brothers concert. I was 18, sitting in the balcony, and <a href="http://en.wikipedia.org/wiki/Dickey_Betts" title="">Dicky Betts</a> was wailing up and down the fretboard. And in that brief moment, the music stopped. All I heard was the guitar &#8211; and it spoke to me. It said, &#8220;Live life for other people&#8221;. I&#8217;ve told this story over the years to mixed reactions (understandably), no one can really argue with the message, though. I&#8217;ve tried to live it, often failing, and constantly reinterpreting what it means. I&#8217;ve never felt it really meant straight volunteerism. Volunteerism is great and all, but in terms of comparative advantage, it would be hard to argue that its worth my time to be digging up weeds in a community garden versus what I can provide in terms of my unique skills. For a while this has meant living and working for my wife, letting her pursue her dreams, and working my ass off so we can have all the things and experiences that we want. She just finished her first year of Graduate school at Mills College in Oakland and I couldn&#8217;t be more proud.</p>

	<p>Open source in itself is in some ways for other people. It&#8217;s one of the things that got me into <span class="caps">OSS</span> in the first place. Other people in this context means a community of people looking to solve a collection of problems. When you release an <span class="caps">OSS</span> project you&#8217;re gifting it to these other people and hopefully they&#8217;ll return the favor at some point by allowing you to be the <em>other people</em> side of this equation. That&#8217;s not always true or possible, though, and thats OK. It&#8217;s part of the <span class="caps">OSS</span> contract that its a community, and you should try, but aren&#8217;t required to always give back to the people and projects that help you.</p>

	<p>A while ago, GitHub allowed an option on projects to allow for creating a pledgie per-project. The idea being that people could donate a couple bucks to a project and its creator so they could buy themselves a beer. Just a little way of saying thank you. I think it wasnt that succesfull, maybe because remote beer buying just isnt <em>there</em> yet. Or maybe because its a question of what you&#8217;re actually buying? I never did this on Sammy.js or any of my other projects because, really, I don&#8217;t need the $5 for beer (thats not to say I wont take a free beer if you want to meet up at a conference or meetup and buy me one <img src='http://www.quirkey.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). I just didnt see the point. Save your money, I thought, I&#8217;m doing this for the community.</p>

	<p>Heres the new idea &#8211; I will take your money. In fact, I <em>really, really</em> want to take your money. Not for me. For <em>other people</em>. I&#8217;m starting a rotating <a href="http://pledgie.com/campaigns/15239" title="">Code for Other People fund</a>. Every time we hit $500, well donate the money and rotate to a new charity. I&#8217;m very open to suggestions on that front as well. For example the first charity is the <a href="http://anitaborg.org" title="">Anita Borg Organization</a>. I&#8217;ve worked with them before, and they are consistently doing awesome things for women and diversity in the tech community. Other charities on the horizon are <a href="http://donorschoose.org" title="">DonorsChoose</a> and the <a href="http://www.it.northwestern.edu/greenberg/index.html" title="">Gary Greenberg Fund</a>.</p>

	<p>If you have an open source project, consider linking to this fund or promoting it on your blog or site. Your work on Open Source can not only help people in the <span class="caps">OSS</span> community, but help raise money for causes that need and appreciate it.</p>

	<p>If you&#8217;re a developer or a user of other people&#8217;s code, consider donating some of your (probably healthy) paycheck &#8211; even a single dollar &#8211; to the fund. It shows your support for the different projects you use and also shows the communities commitment to the greater good.</p>

	<p>I have $220 dollars of surplus from the recently awesome <a href="http://codefoodbar.org/2011/04/14/codefoodbar-x-jsconf-2011.html" title="">CodeFoodBar x JSConf Dinner</a>. that I&#8217;m donating to kick off the fund.</p>

	<p>Now when I release or work on an open source project, I&#8217;ll be working for something bigger &#8211; for other people.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=BzmFR3FiOno:15fpG1IqLzA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=BzmFR3FiOno:15fpG1IqLzA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=BzmFR3FiOno:15fpG1IqLzA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=BzmFR3FiOno:15fpG1IqLzA:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/05/03/code-for-other-people/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/05/03/code-for-other-people/</feedburner:origLink></item>
		<item>
		<title>Get your Sammy.js Stickers</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/dzHEiFdiXAc/</link>
		<comments>http://www.quirkey.com/blog/2011/03/17/get-your-sammy-js-stickers/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 23:47:15 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Geekery]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=517</guid>
		<description><![CDATA[Thanks to the awesome folks at stickermule I now have a big stack of Sammy.js stickers I want to share with all you fine folks. There are a couple ways to get them: I&#8217;ll be at JSConf (duh) and a bunch of other meetups and get togethers until then, so just harass me for one [...]]]></description>
			<content:encoded><![CDATA[	<p><img src="http://farm6.static.flickr.com/5097/5536057210_5af9a85a17.jpg" alt="" border="0" /></p>

	<p>Thanks to the awesome folks at <a href="http://stickermule.com" title="">stickermule</a> I now have a big stack of Sammy.js stickers I want to share with all you fine folks. There are a couple ways to get them:</p>

	<ul>
		<li>I&#8217;ll be at JSConf (duh) and a bunch of other meetups and get togethers until then, so just harass me for one when you see me.</li>
		<li>If you live outside of <span class="caps">NYC</span> or the Bay Area, just send a self-addressed stamped envelope (MAIL &#8211; <span class="caps">I KNOW CRAZY</span>) to:</li>
	</ul>

	<p><blockquote><br />
Sammy.js Stickers<br />
c/o Paperless Post<br />
3130 24th St, Unit C<br />
San Francisco, <span class="caps">CA 94110</span><br />
</blockquote></p>

	<p>I&#8217;ll send you more than one, and you can sport it on your laptop like yours truly:</p>

	<p><img src="http://farm6.static.flickr.com/5054/5535479767_98c28bb67b.jpg" alt="" border="0" /></p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=dzHEiFdiXAc:5P1yN0o3RQ8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=dzHEiFdiXAc:5P1yN0o3RQ8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=dzHEiFdiXAc:5P1yN0o3RQ8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=dzHEiFdiXAc:5P1yN0o3RQ8:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/03/17/get-your-sammy-js-stickers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/03/17/get-your-sammy-js-stickers/</feedburner:origLink></item>
		<item>
		<title>Flash Rules</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/41gA2wMvXIo/</link>
		<comments>http://www.quirkey.com/blog/2011/03/08/flash-rules/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 23:44:34 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Geekery]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=503</guid>
		<description><![CDATA[I&#8217;m probably going to get in trouble for this, but I&#8217;ll let you in on a little secret. Your hatred of Flash is wrong and misplaced. I love web standards and I love the magical unicorn that is HTML5. I don&#8217;t hate Flash. Sure, I have my disagreements with it, but the &#8220;FLASH SUCKS&#8221; mantra [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;m probably going to get in trouble for this, but I&#8217;ll let you in on a little secret. Your hatred of Flash is wrong and misplaced. I love web standards and I love the magical unicorn that is <span class="caps">HTML5</span>. I don&#8217;t hate Flash. Sure, I have my disagreements with it, but the &#8220;FLASH <span class="caps">SUCKS</span>&#8221; mantra that was spawned with the iPhone and only gets louder and louder these days is just silly. Actually, it goes beyond that &#8211; not only is it pointless but its actually hurting the JavaScript and development community at large.</p>

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

	<p>I&#8217;ve been around the block when it comes to web development and I&#8217;ve witnessed this sea change first hand. I&#8217;m not going to go in and recount war stories, but I&#8217;ve had my ups and downs working with Flash and Flash developers. I can&#8217;t really pinpoint a specific moment when people started to question it, but I remember working on a site for a high end fashion client and seeing early versions of script.aculo.us and just being blown away. It seemed so simple: this animated dropdown menu didnt need to be designed and compiled in an entirely different environment! It could all be <em>one thing</em>. Sure the animation was pretty chunky and yeah it might have crashed the occasional Firefox, but it seemed like magic &#8211; and I wanted more. It took some convincing, but we started to build out more and more outside of Flash and it felt great. Then there was the iPhone, and soon enough it all seemed so repulsive. You mean, I can&#8217;t see what kind of noodles this Thai Fusion place sells!? <em>argh</em>. I dont know how Apple did it, but wow, what a spin. Instead of blaming the device, or even better, the authors of these restaurant&#8217;s websites &#8211; we all started blaming Flash itself. <em><span class="caps">FLASH SUCKS</span></em> became the new mantra and we all went along with it. Like an angry mob with iPitchforks we stormed Flash&#8217;s castle.</p>

	<p>The result of all this yelling and vigorous finger pointing is in some ways what we all call <a href="http://www.html5rocks.com/" title=""><span class="caps">HTML5</span></a>. This glory train of hope, a beacon from a distant land where <em>everything</em> is a standard and you can order thai food from your phone. The hilarious thing however, is that as JavaScript developers the joke is on us.</p>

	<h3>Why People Hate Flash</h3>

	<p>Beyond the pure cargo-culting and the flash-blockers, some people at the heart of the argument do have their reasons. Lets take a brief detour from the main story to examine some of them.</p>

	<h4>It&#8217;s a proprietery product with a single owner</h4>

	<p>This is the con that most open source developers take issue with and something that hurts somewhere deep inside. As a very active open source developer, not only on my own projects, but as part of the community at large, I really don&#8217;t want to work on closed platforms. Since my first experience with open source and my first experience reporting, finding and fixing a bug, I haven&#8217;t turned back. Ruby, Rails, jQuery, etc. the benefits of open source are more than I can extol here. As a user, though, the core of <span class="caps">OSS</span> is transparency. It&#8217;s discovering a nasty bug and being able to effect change. This factor is obviously a range between projects but at some level, even if you don&#8217;t report a bug, it&#8217;s just knowing it&#8217;s there. It&#8217;s the knowledge that a <em>community</em> of people is willing and able to <em>fix</em> things. The lack of this is what instills fear in me when using software these days. As part of a team we&#8217;ve experienced bugs in Flash and reported them, and waited for a fix. When it&#8217;s something critical, sometimes you just want to be able to poke at the source. Even if it&#8217;s just to leave and say not my problem. I get this, it is a problem. I can&#8217;t really excuse this, other than saying that this same problem exists with <em>most</em> software and tools people use on a daily basis. Open Source is the exception, not the rule. Apple and the iPhone <span class="caps">SDK</span> is as much of a problem in this regard as Flash. Steve Jobs&#8217; saying that they&#8217;re commited to open source and standards by supporting Mobile Safari and Webkit doesnt mean that the <span class="caps">SDK</span> or the tools to compile iPhone apps are going to be open source any time soon.</p>

	<h4>It doesn&#8217;t work on my iPhone</h4>

	<p>This is true, it doesnt and that&#8217;s a problem. In <a href="http://www.apple.com/hotnews/thoughts-on-flash/" title="">Steve Jobs&#8217; angry missive</a> he blamed unreliable performance and battery draining as well as other things in their lack of support for Flash. I have an Android these days, and it is slow, but at the same time, it&#8217;s pretty useful to have Flash running on the device. Does it drain battery? Probably? No more than watching a video or checking Twitter every 20 seconds. Clearly there were other factors at work there, and I&#8217;m not blaming Apple really. It <strong>is</strong> annoying that a lot of sites <em>rely</em> on Flash at their core (in part Paperless Post is not exempt) but really that&#8217;s an issue with developement practices, not with Flash or the device.</p>

	<p>With or without Flash mobile is really a seperate concern. On mobile devices making something interactive, fast, and compatible is really the challenge.<br />
(In fact <strong>Interactive, Fast, Compatible</strong> is really the <a href="http://en.wikipedia.org/wiki/CAP_theorem" title=""><span class="caps">CAP</span></a> of mobile applications). Unfortunately the promise of <span class="caps">HTML5</span> only sort of solves this at this point. Have you used canvas on an iPad? It feels like you&#8217;re running Flash in <span class="caps">IE6</span> on a Pentium II. <span class="caps">SLOW</span>. Sure, there&#8217;s <span class="caps">CSS </span>Animation, but that really only takes you so far. I guarantee this will change in the next short while (years not months), but we&#8217;re talking about <em>now</em>.</p>

	<h4>It&#8217;s not crawlable by search engines</h4>

	<p>At its core this is true, but its just as true as with <span class="caps">AJAX</span> applications, as can be seen by the recent <a href="http://www.quirkey.com/blog/2011/02/10/ish/" title="">hash-bang hubub.</a> With Flash or JS you have the same challenges and roughly the same solutions. The most complete solution at this point is just to make a mobile or JS and Flash-free version that the more interactive version is a layer on top of. The fact that your restaurant&#8217;s website doesnt have an <span class="caps">HTML</span> menu is not Flash&#8217;s fault, its the developer&#8217;s fault for not making it accessible.</p>

	<h4>Its slow and crashy and makes my fans turn on</h4>

	<p>Yes, there are slow and buggy sites out there. Yes a lot of them have .swfs on them. Is Flash as a tool and platform really at fault here? Flash openened up the web to interactivity, high quality streaming video, and robust applications. As a tool it&#8217;s very very powerful. With great power comes great responsibility. It&#8217;s pretty easy to invoke a memory leak in Flash and it&#8217;s up to the developers to contain and optimize their apps. Again, this is really a problem of education and the development community at large. The most common target of this complaint are Flash based advertisements and banners. So an ad for body spray takes over your page, and seems to slow your whole computer down. Thats pretty annoying. Well just wait for <span class="caps">DOM</span>/canvas based ads. They&#8217;re coming, and they&#8217;re manipulating your entire page and breaking your JS. Just you wait.</p>

	<h3>A couple of reasons to love Flash</h3>

	<p>At the same time, and despite all the yelling, there are some clear reasons to still love Flash. It was the first to do a lot of these things we now call <span class="caps">HTML5</span> on the web. In many and maybe most cases it&#8217;s still better at doing them. In particular, while <span class="caps">HTML5</span> video works pretty well on certain devices and browsers, it&#8217;s pretty far behind its Flash counterpart in terms of speed and general functionality. Fonts as well. One of the sticking points we&#8217;ve had at Paperless Post is the lack of detailed font controls and especially interactivity with fonts. Sure @font-face is nice, but it has its limitations and compatibility issues when it comes to pixel perfect rendering. Canvas fonts are even worse.</p>

	<p>Flash is also pretty much everywhere. Besides the iThings, Android, your browser (every browser) its there and works almost exactly the same. That&#8217;s pretty sweet. It was one of Flash&#8217;s original promises and it still rings true (with one major exception). The proprietary thing also comes in handy in this respect, too. I&#8217;m not agreeing with it, but when a bug is fixed or a security hole is patched, updates come rather quickly to your end users. This is as compared to the wide range of browser release cycles.</p>

	<p>From a development standpoint, ActionScript is  close to something we know and love (presumably): <span class="caps">ECMA</span>Script. Newer versions have added more Java-like package management but a lot of the syntax (; and {}) et al will be very familiar. If you have only ever programmed on the Flash timeline, you would also know that most ActionScript apps are coded in a normal editor of your choosing and compiled on the command line. In fact, there&#8217;s a pretty cool project generation and build tool for ActionScript in Ruby called <a href="http://projectsprouts.org/" title="">sproutes</a>. Its syntax tends to lean more towards the Java and less towards the script, but it&#8217;s still very easy to pick up. In fact, I jumped in to one of our projects at Paperless recently and was able to code up a bunch of a module in a single day with only passing help from our resident <span class="caps">AS3</span> expert.</p>

	<h3>There is hope: quit being an asshole.</h3>

	<p>That all is great, but it misses the biggest and best thing that Flash has &#8211; a thriving community of extremely talented developers. Its not uncommon to find a Flash developer at this point with > 10 years experience coding in Flash for the web. 10+ years! How many years have you been programming JavaScript professionally? For how many years has it been your primary focus? How many large scale interactive applications have you built? My guess is that the average Flash developer has built 20 times that. For good reasons. Not only have they had better tools for most of that time, but they&#8217;ve also been in heavy demand for that whole time, and building applications non-stop. Many of the challenges that JS and <span class="caps">HTML5</span> developers are facing when building these large scale interactive apps, the Flash developers have already solved. They have those algorithms, that knowledge of 3D, that ability to turn code into motion and excitement.</p>

	<p>As a talented Flash developer, you&#8217;re probably starting to explore the world of <span class="caps">HTML5</span> and canvas and in some cases Cocoa and Objective-C. You&#8217;re starting to learn how to adapt your Flash expertise to this brave new world. In some cases you&#8217;re pretty put-off by the attitude of the JS community and its blind hatred of a tool and framework that you&#8217;ve devoted a portion of your career to up to this point. Understandably. A lot of these people are being assholes. If you devoted a lot of your waking hours to Java, it was and is really hard to want to ease into Ruby due to the bile and anti-you sentiment coming from the Ruby community. Over time, Ruby has adapted to its community and its forebearers (see <a href="http://jruby.org/" title="">JRuby</a>).</p>

	<p>As a JavaScript developer, it&#8217;s now your responsibility to stop the hate and welcome these super smart developers with open arms. Ask them questions, lean on them for advice, for hacks, for problem-solving. Hire them, even! They will appreciate it and they will blow your socks off. The best Flash developers aren&#8217;t tied to a language or technology, they&#8217;re just really interested in making awesome, boundary-pushing applications for the web. The fact is that they&#8217;re moving this way with or without you. If you help them, and respect them, and learn from them, your app and eventually the entire web will be a better place. If you shun them, they&#8217;ll just do what you do, but do it better. They&#8217;ve already done all the things that you&#8217;re trying to accomplish.</p>

	<p>Flash isn&#8217;t going anywhere for a little while, and complaining about it doesn&#8217;t help. Instead let&#8217;s all quit being assholes and work together to push the open web and open standards. Most importantly, let&#8217;s learn from all our mistakes and triumphs and hacks and continue to make the <em>now</em> web more fun.</p>

 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=41gA2wMvXIo:mIim0qLEmGI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=41gA2wMvXIo:mIim0qLEmGI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=41gA2wMvXIo:mIim0qLEmGI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=41gA2wMvXIo:mIim0qLEmGI:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/03/08/flash-rules/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/03/08/flash-rules/</feedburner:origLink></item>
		<item>
		<title>#-ish</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/dxoagdvhCfM/</link>
		<comments>http://www.quirkey.com/blog/2011/02/10/ish/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 23:19:15 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ranting]]></category>
		<category><![CDATA[Sammy]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=494</guid>
		<description><![CDATA[I&#8217;ve been sitting back and watching from the sidelines this week as a lot of smart people [de]ride the hash (or more specifically the #!). Most of this has come from the recent switchover of the gawker media properties to using a new URL structure based on the !# and a JavaScript app to load [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;ve been sitting back and watching from the sidelines this week as <a href="http://simonwillison.net/tags/hashbanghell/" title="">a lot of smart people [de]ride the hash</a> (or more specifically the #!). Most of this has come from the recent switchover of the gawker media properties to using a new <span class="caps">URL</span> structure based on the !# and a JavaScript app to load content. As someone <a href="http://sammyjs.org" title="">who&#8217;s invested a lot of time into the #</a> I want to make something clear &#8211; as with many things in life, the hash is no different: It&#8217;s not broken, its how you use it.</p>

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

	<h3>Deep Linking</h3>

	<p>Let&#8217;s take a little trip down memory lane, shall we? My first interaction with the &#8216;#&#8217; as a method for getting at specific content (not as an anchor tag) was working in the ad/interactive space and with a lot of Flash developers. On every proposal or statement of work was a line about &#8216;Deep Linking&#8217;. In this case it meant plugging in <a href="http://www.asual.com/swfaddress/" title="">swfaddress</a> and wiring it up to your fancy Flash slideshow or fashion showcase. The point of this all was that when you clicked on the 8pt text in the menu that said &#8216;MENS <span class="caps">BLOUSES</span>&#8217; you would be taken to the photo of a puffy shirt and the url would change to &#8216;#/items/puffy-shirt&#8217;. When you refreshed the page, or sent the link to your friend you would be taken immediately to the puffy shirt and be able to bask in its frilly glory without navigating through the 8pt menu again.</p>

	<p>This was a big thing! Big, as in exciting and awesome, because it meant you could build relatively complex Flash applications, felt &#8216;stateful&#8217; somehow. You would navigate somewhere and you&#8217;d be <em>there</em>, not in the middle of nowhere.</p>

	<p>An important thing to note here is that this was not for Google. It was Flash. Google can&#8217;t crawl Flash. The point was allowing people to &#8216;Skip intro&#8217; and have them feeling that this crazy interactive experience wasn&#8217;t all that different from there normal browsing. For crawling and <span class="caps">SEO</span> there were a host of other strategies &#8211; <span class="caps">META</span> tags, &#8216;ghost&#8217; static <span class="caps">HTML</span> sites, etc. &#8211; and these were deployed alongside &#8216;Deep Linking&#8217; as two different strategies trying to accomplish different things.</p>

	<h3><span class="caps">AJAX FOR THE PEOPLE</span></h3>

	<p>We&#8217;ve moved on (sort of) from the days of 8pt menus and pixel fonts. The old problem is new all over again. Now we&#8217;ve built these applications that rely on JavaScript being enabled to construct our site and fetch our data and animate our menus. Awesome! Its <span class="caps">HTML5</span>-tastic. At some point, we discovered the same problems that we had with Flash. Namely, when you&#8217;re loading all your content with <span class="caps">AJAX</span> and loading it onto the page based on clicks, you get lost in a sea of asynchronicity. What <strong>state</strong> are you in? Clearly, there&#8217;s an easy way to solve this &#8211; use the &#8216;#&#8217; to <strong>route</strong> URLs without reloading the page and <strong>Deep Linking</strong> directly into content. I created and continue to work on <a href="http://sammyjs.org" title="">Sammy.js</a>, partly, as a solution to this problem. You want your application to feel interactive and fluid, you want to avoid page reloads, but <em>when</em> the user does reload, or copy the link, they should be taken back to the same place.</p>

	<p>Then, confusion sets in. In a world where <a href="http://www.readwriteweb.com/archives/facebook_wants_to_be_your_one_true_login.php" title="">the only way people get to Facebook is by Googling Facebook</a> you want your site to be &#8216;googleable&#8217;. This presents a problem: your application is dependent on javascript and &#8216;#&#8217; and google don&#8217;t know about those. Well then, brotha, Google&#8217;s <a href="http://code.google.com/web/ajaxcrawling/docs/getting-started.html" title="">got your back</a>. All you have to do is put a little ! after your # and tell google where to fetch your content and it&#8217;s like <span class="caps">BLAM</span>: <strong><span class="caps">SEO</span></strong>.</p>

	<p>Except, no.</p>

	<p>This is the part where I want to shake everyone. Like physically shake and be like &#8220;YOU! <span class="caps">YOU</span>&#8217;RE <span class="caps">MISSING THE POINT</span>&#8221;.</p>

	<p>There are two different things. Crawlability and Deep Linking are two different things. For different reasons and different goals, and conflating them not only makes it hard on users, but also makes it hard on developers. You end up doing neither of them right.</p>

	<p>I&#8217;ve been asked about a million times now, &#8220;How do you do <span class="caps">SEO</span> with Sammy?&#8221;. The answer is never simple, because its the wrong question. The question should really be &#8211; &#8220;If I&#8217;m really concerned about <span class="caps">SEO</span>, the crawlability of my site, and the persitance of my links should I use Sammy?&#8221;. The answer without a doubt is <strong>No</strong>. I&#8217;ll be the first one to say that Sammy and other similar frameworks are not for every site. <strong>Period</strong>. Theres no reason that your blog or your news site needs to load all its content with <span class="caps">AJAX</span> or needs to use &#8216;#&#8217; to route for state. An important disctinction in what I&#8217;m trying to say is that its &#8220;you shouldnt have to&#8221; not &#8220;you never should&#8221;. If you&#8217;re building a site like Gizmodo you should pretty much always at least <span class="caps">START</span> with good ol&#8217; semi-static pages that dont require JavaScript and load at old-fashioned URLs. This is not to say that you can&#8217;t build an application <em>on top of</em> these static pages that is more dynamic and interactive and relies on JavaScript.</p>

	<p>Sammy and the &#8216;#&#8217; are for applications. It provides a way to maintain state in a world where you <em>can</em> require JavaScript and even require the presence of certain browsers. If you&#8217;re an application, that requires login/signup you can make a number of demands of your users. You also probably dont even <em>want</em> the crawlability. You&#8217;re using &#8216;#&#8217; to maintain state for a specific user in a specific session.</p>

	<p>Outside of the world of the &#8216;application&#8217; you really, really shouldn&#8217;t rely on JavaScript being there for your site to work (at least at a basic level). <a href="http://jsconf.eu/2010/speaker/javascript_web_standards_ii_th.html" title="">Jen Lukas has already talked really eloquently about why thats the case.</a> I believe that this is where a lot of the recent frustration has come from, and really it should be directed at the use case, not the overall usage of &#8216;#&#8217; for state. There have been some fingers pointed at Google for making this conflation possible, and I tend to agree.</p>

	<h3>How to do this right</h3>

	<p>I&#8217;m not going to go into detail about what framework you should use or how to lay out your app. Those are fairly complicated and my opinions could take up a couple blog posts. However, the basics are straightforward.</p>

	<p>First, you need to determine some things about the structure of what you&#8217;re building and what your content is. Are you building an &#8216;application&#8217; or a site? Does your content need to be searchable and reachable by the entire web? Do your links require true permanance and will changing them in the future &#8220;break&#8221; traffic to your site?</p>

	<p>If you need searchability and permancance and you&#8217;re <em>not</em> building an application, the real best way to approach is to build your site as if JavaScript doesn&#8217;t exist. The fact is that there&#8217;s still a chunk of users for which that will be true. Not only because they&#8217;re using old browsers, but they&#8217;re on phones, or they&#8217;re on assistive devices or they just turn JavaScript off for &#8216;security&#8217; reasons. If your site works this way and looks pretty decent (meaning its readable and the content is accessible) then basically you&#8217;re good. Golden. Your site works as expected, but maybe not all <span class="caps">AJAAAAZZAY</span>. It&#8217;s at this point that it&#8217;s acceptable to build a layer on top of your existing site, sprinkle the magic dust.</p>

	<p>Twitter is an interesting example here because they took what was at its core really an information site, not all that different from a blog and turned it into an application. The questions of <span class="caps">URL</span> permanence are really gray here but I dont find myself hating it at all.</p>

	<p>Web standards are at the core of this debate. Many make a strong argument that concept of the <span class="caps">URL</span> and <span class="caps">HTTP</span> is here for a reason, that URLs have worked and continue to work. I think instead of fueling <span class="caps">FUD</span>, we should get back to the work of building a better standard and a better web.</p>

	<p><hr /></p>

	<h4>A brief epilogue on pushState/HTML5 History</h4>

	<p>A lot of people are pointing to the new <span class="caps">HTML5 </span>History <span class="caps">API</span> as a much better solution to this problem. I agree with reservations. First, the browser support for this currently isn&#8217;t very wide, and certain browsers that do support it have buggy/broken implementations. The bottom line is that it will work in some places, but not most, and this will probably be the case for years to come. That said, it <strong>is</strong> really exciting and I&#8217;m working on built in support for it in the next version of Sammy.js. I have other reservations, too &#8211; namely I think that not all hashes are created equal and in some cases the state you want to represent is really the state of a specific page <em>not</em> a seperate page that really requires a fully seperate <span class="caps">URL</span>.</p>

 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=dxoagdvhCfM:yMVU_ZTAxGA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=dxoagdvhCfM:yMVU_ZTAxGA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=dxoagdvhCfM:yMVU_ZTAxGA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=dxoagdvhCfM:yMVU_ZTAxGA:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/02/10/ish/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/02/10/ish/</feedburner:origLink></item>
		<item>
		<title>SammyJS.org</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/Vzex986Xv4w/</link>
		<comments>http://www.quirkey.com/blog/2011/01/27/sammyjs-org/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 19:50:12 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=486</guid>
		<description><![CDATA[Sammy.js is finally official because now we have a real dedicated website: http://sammyjs.org. It only took two years. Along with the website the logo I designed before JSConf.eu last year now has an official place to proudly be displayed. Since we&#8217;re a REAL project now, we&#8217;re also starting up the SWAG train, so logo stickers [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://sammyjs.org"><img src="http://www.quirkey.com/skitch/Sammy.js___A_Small_Web_Framework_with_Class___RESTFul_Evented_JavaScript-20110127-114132.jpg" alt="sammyjs.org" width="550" height="386" /></a></p>

	<p>Sammy.js is finally official because now we have a real dedicated website: <a href="http://sammyjs.org" title="">http://sammyjs.org</a>. It only took two years.</p>

	<p>Along with the website the logo I designed before JSConf.eu last year now has an official place to proudly be displayed. Since we&#8217;re a <span class="caps">REAL</span> project now, we&#8217;re also starting up the <span class="caps">SWAG</span> train, so logo stickers are on their way.</p>

	<p>The biggest change with the new site is the <span class="caps">API</span> documentation has been <a href="http://sammyjs.org/docs/api/stable" title="">significantly cleaned up</a>. The text is still being generated from the code itself, but now we have easier navigation, the ability to keep multiple versions of the docs (generated per release) and probably the most fun &#8211; method level comments powered by Sammy users and contributors, <a href="http://disqus.com" title=""><span class="caps">DISQUS</span></a>. I&#8217;ve made good use of the method level comments featured in sites like <a href="http://apidock.com" title="">apidock</a> so I&#8217;m very excited to see if the community participates here.</p>

	<p>Sammy.js is growing up and its been so much fun to see how and where people use it. I don&#8217;t see that many big changes in the future for it before we push a real 1.0 (See a <a href="http://groups.google.com/group/sammyjs/browse_frm/thread/cd17332e9e82abc6" title="">brief roadmap on the mailing list</a>) and a big goal is to get push the big one oh before this year&#8217;s <a href="http://2011.jsconf.us" title="">JSConf in Portland.</a></p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=Vzex986Xv4w:U50pcK-Qy2o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=Vzex986Xv4w:U50pcK-Qy2o:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=Vzex986Xv4w:U50pcK-Qy2o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=Vzex986Xv4w:U50pcK-Qy2o:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2011/01/27/sammyjs-org/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2011/01/27/sammyjs-org/</feedburner:origLink></item>
		<item>
		<title>Getting to know Sammy.js: Helpers</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/4ppCBEMOktk/</link>
		<comments>http://www.quirkey.com/blog/2010/11/04/getting-to-know-sammy-js-helpers/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 12:07:08 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=475</guid>
		<description><![CDATA[For part of this month&#8217;s writing I&#8217;m going to write focused posts about features of Sammy.js that people may not know about or have used. In the end I hope to compile these into part of the new Sammy.js site. A question came up on the mailing list recently about overriding previously defined routes after [...]]]></description>
			<content:encoded><![CDATA[<p><em>For part of this month&#8217;s writing I&#8217;m going to write focused posts about features of Sammy.js that people may not know about or have used. In the end I hope to compile these into part of the new Sammy.js site.</em></p>
<p>A question came up on the <a href="http://groups.google.com/group/sammyjs/browse_frm/thread/8234ef63d20c99ae/580e66ac59a483cf">mailing list recently about overriding previously defined routes</a> after struggling thinking of how to do this with the current codebase, the answer was simple: Use helpers!</p>
<p>Coming from Sinatra or Rails the idea of <code>helpers</code> might be associated with just &#8220;view helpers&#8221; &#8211; methods added to the controller which are passed down to the view to help refactor/encapsulate common view logic. In Sammy.js helpers are really a way of refactoring common logic out of routes and into a reusable named method.</p>
<span id="more-475"></span>
<h3>Refactorin&#8217;</h3>
<p>In any app you&#8217;ll have startup code or code that needs to be run for every or multiple pages (routes). In Sammy this might looks like:</p>
<div class="highlight"><pre><span class="nx">$</span><span class="p">.</span><span class="nx">sammy</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">grid</span><span class="p">)</span> <span class="p">{</span><br />
      <span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">().</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br />
      <span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">().</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
    <span class="p">}</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;index.html&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/user&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">grid</span><span class="p">)</span> <span class="p">{</span><br />
      <span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">().</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br />
      <span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">().</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
    <span class="p">}</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;user.html&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
  <br />
<span class="p">})</span><br />
</pre></div>
<p>A contrived example, but you can tell we&#8217;re doing almost the exactly same thing in each of the routes. A common JS convention and something you could do pretty easily here, would just be to extract the functionality out into a closure/function and call it for each route.</p>
<div class="highlight"><pre><span class="nx">$</span><span class="p">.</span><span class="nx">sammy</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <br />
  <span class="kd">var</span> <span class="nx">displayGrid</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$element</span><span class="o">,</span> <span class="nx">display</span><span class="p">)</span> <span class="p">{</span><br />
    <span class="k">if</span> <span class="p">(</span><span class="nx">display</span><span class="p">)</span> <span class="p">{</span><br />
      <span class="nx">$element</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br />
      <span class="nx">$element</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
    <span class="p">}</span><br />
  <span class="p">};</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="nx">displayGrid</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">()</span><span class="o">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">grid</span><span class="p">);</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;index.html&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/user&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="nx">displayGrid</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">()</span><span class="o">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">grid</span><span class="p">);</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;user.html&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
  <br />
<span class="p">})</span><br />
</pre></div>
<p>This works, it prevents global leakage by declaring it inside the app, and it gets rid of a number of lines of repetitive code. However, we&#8217;re still passing a bunch of route attributes into the closure. This is where helpers can shine.</p>
<div class="highlight"><pre><span class="nx">$</span><span class="p">.</span><span class="nx">sammy</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">helpers</span><span class="p">({</span><br />
    <span class="nx">displayGrid</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">grid</span><span class="p">)</span> <span class="p">{</span><br />
        <span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">().</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br />
        <span class="k">this</span><span class="p">.</span><span class="nx">$element</span><span class="p">().</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;grid&#39;</span><span class="p">);</span><br />
      <span class="p">}</span><br />
  <span class="p">});</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">displayGrid</span><span class="p">();</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;index.html&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/user&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">displayGrid</span><span class="p">();</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;user.html&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
  <br />
<span class="p">});</span><br />
</pre></div>
<p>This looks a lot cleaner to me. You might not love <code>this</code> but it makes some things really magical. By making <code>displayGrid</code> a helper it automagically has access to the context of the current route. That means that just like the route&#8217;s callback, it has access to everything in the <code>EventContext</code> including <code>params</code>, <code>redirect</code>, <code>render</code> and <em>other helpers</em>. This is important, because it basically allows you to extract common code from routes into helpers and then refactor those helpers even further into <em>other</em> helpers.</p>
<h3>stOOPid inheritance and mixins</h3>
<p>Helpers are actually just methods on the app&#8217;s <code>EventContext</code> prototype, and event though there&#8217;s no classical inheritance with <code>super</code>&#8217;s and all that jazz we can do some fun <span class="caps">OOP</span>-like magic.</p>
<p>In the example from the mailing list, we wanted to override an application&#8217;s existing route with a new route. Though the way routes are stored and handled makes it difficult on the app level, doing it on the helper level is EZ:</p>
<div class="highlight"><pre><span class="c">// initializing a new app</span><br />
<span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">sammy</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">helpers</span><span class="p">({</span><br />
    <span class="c">// define a helper to load the index as the default behavior</span><br />
    <span class="nx">loadIndex</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
      <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;index.html&#39;</span><span class="p">);</span><br />
    <span class="p">}</span><br />
  <span class="p">});</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">loadIndex</span><span class="p">();</span><br />
  <span class="p">});</span><br />
<span class="p">});</span><br />
<br />
<span class="c">// override the specific helper, and hence the index route</span><br />
<span class="c">// we can also do this by calling `helpers()`</span><br />
<span class="nx">app</span><span class="p">.</span><span class="nx">helper</span><span class="p">(</span><span class="s1">&#39;loadIndex&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;specialindex.html&#39;</span><span class="p">);</span><br />
<span class="p">});</span><br />
</pre></div>
<p><code>use()</code> is how Sammy includes a plugin in an app. A plugin is really just another app function, though, that get&#8217;s evaluated at the time you <code>use()</code> it. In fact, when you call <code>$.sammy()</code> you&#8217;re just creating a new instance of <code>Sammy.Application</code> and then calling <code>use()</code> on it with the app function. This is a simple way of doing &#8220;mixin&#8221; style inheritance. A plugin can do anything an app can, including and <em>especially</em> helpers. So with multiple apps we be all like tag team:  <a href="http://www.youtube.com/watch?v=Z-FPimCmbX8"><span class="caps">OOP</span> there it is</a></p>
<div class="highlight"><pre><span class="nx">$</span><span class="p">.</span><span class="nx">sammy</span><span class="p">(</span><span class="s1">&#39;#hiphop&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">helpers</span><span class="p">({</span><br />
    <span class="nx">playCatchPhrase</span><span class="o">:</span> <span class="nx">$</span><span class="p">.</span><span class="nx">noop</span><br />
    <span class="c">// noop there it is </span><br />
    <span class="c">// this is sort of like an abstract method</span><br />
  <span class="p">});</span><br />
  <br />
  <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/catchphrase&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="k">this</span><span class="p">.</span><span class="nx">playCatchPhrase</span><span class="p">();</span><br />
  <span class="p">})</span><br />
<span class="p">});</span><br />
<br />
<span class="kd">var</span> <span class="nx">atlanta</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">helper</span><span class="p">(</span><span class="s1">&#39;playCatchPhrase&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;whoomp there it is!&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
<span class="p">};</span><br />
<br />
<span class="kd">var</span> <span class="nx">la</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">helper</span><span class="p">(</span><span class="s1">&#39;playCatchPhrase&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;do the hump!&#39;</span><span class="p">);</span><br />
  <span class="p">});</span><br />
<span class="p">};</span><br />
<br />
<span class="nx">$</span><span class="p">.</span><span class="nx">sammy</span><span class="p">(</span><span class="s1">&#39;#hiphop&#39;</span><span class="p">).</span><span class="nx">use</span><span class="p">(</span><span class="nx">la</span><span class="p">);</span><br />
<span class="c">// get &#39;#/catchphrase&#39; //=&gt; &#39;do the hump!&#39;</span><br />
</pre></div>
<p>Thats still pretty simple, though combining these ideas is actually pretty powerful. Almost all of Sammy&#8217;s existing plugins are based on this simple approach. I&#8217;m hoping soon, it can get even more abstract and complex. Why not a <code>Sammy.Auth</code> that handles displaying/posting/and doing all the basic authentication? You could use helpers for most of the dirty work and then one could just override the defaults in their specific apps. You could even create <em>another</em> set of plugins that were different displays or authentication systems that override the simple base methods. Do it! ( <em>so I dont have to</em> )</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=4ppCBEMOktk:jbMzw-nfDbM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=4ppCBEMOktk:jbMzw-nfDbM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=4ppCBEMOktk:jbMzw-nfDbM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=4ppCBEMOktk:jbMzw-nfDbM:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2010/11/04/getting-to-know-sammy-js-helpers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2010/11/04/getting-to-know-sammy-js-helpers/</feedburner:origLink></item>
		<item>
		<title>Sammy.js Tutorial finally updated for 0.6</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/foqZzcdk9TM/</link>
		<comments>http://www.quirkey.com/blog/2010/11/02/sammy-js-tutorial-finally-updated-for-0-6/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 05:45:46 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=466</guid>
		<description><![CDATA[The title really says it all but this has been a long time coming. Since the RenderContext changes in 0.6 there were some incompatibilities between the code in the tutorial and what actually worked. It wasn&#8217;t just an easy swap of method names &#8211; I spent some actual time today rewriting some big chunks of [...]]]></description>
			<content:encoded><![CDATA[	<p>The title really says it all but this has been a long time coming. Since the RenderContext changes in 0.6 there were some incompatibilities between the code in the tutorial and what actually worked. It wasn&#8217;t just an easy swap of method names &#8211; I spent some actual time today rewriting some big chunks of the first tutorial and adding an introduction to the RenderContext. The example app (<a href="http://github.com/quirkey/the_json_store" title="">The <span class="caps">JSON </span>Store</a>) was also updated.</p>

	<p>I&#8217;ve been thinking about part <span class="caps">III</span> and beyond as well, but thats for another day. I hope at least this fixes a lot of the confusion for people delving into Sammy for the first time.</p>

	<p><a href="http://code.quirkey.com/sammy/tutorials/" title="">Check out the new tutorials here.</a></p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=foqZzcdk9TM:c2fQS4v9Oik:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=foqZzcdk9TM:c2fQS4v9Oik:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=foqZzcdk9TM:c2fQS4v9Oik:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=foqZzcdk9TM:c2fQS4v9Oik:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2010/11/02/sammy-js-tutorial-finally-updated-for-0-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2010/11/02/sammy-js-tutorial-finally-updated-for-0-6/</feedburner:origLink></item>
		<item>
		<title>NovWriMo – Repaying some debt</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/gISFCDrbOzY/</link>
		<comments>http://www.quirkey.com/blog/2010/10/31/novwrimo-repaying-some-debt/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 03:12:57 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=463</guid>
		<description><![CDATA[In the spirit of NaNoWriMo I&#8217;m attempting something different for November. While, I&#8217;m not going to try to write an entire novel, I am going to try to write every day. Over the past two years I&#8217;ve released and maintained a ton of open source and beyond that just wrote a huge amount of code. [...]]]></description>
			<content:encoded><![CDATA[	<p>In the spirit of <a href="http://www.nanowrimo.org" title="">NaNoWriMo</a> I&#8217;m attempting something different for November. While, I&#8217;m not going to try to write an entire novel, I am going to try to write every day. Over the past two years I&#8217;ve released and maintained a ton of open source and beyond that just wrote a huge amount of code. I&#8217;ve talked about some of it at conferences, blogged a little here, twittered a little there, however, a lot of what I&#8217;ve learned and what I&#8217;ve released remains with little, no, or just plain poor documentation. Over the next 30 days I&#8217;m going to try to remedy that, by posting tutorials, updating docs, recording screencasts and just sharing some wisdom daily for some of the projects I&#8217;ve been working on. I&#8217;m going to try to do something every day, though theres a big block of <a href="http://rubyconf.org" title="">RubyConf</a> in the middle there, so I hope I can push even then.</p>

	<p>Here are some of the things I&#8217;m hoping to accomplish (in no particular order):</p>

	<ul>
		<li>New Sammy.js Site and updated documentation</li>
		<li>Updated and additional Sammy.js Tutorials</li>
		<li>A soca screencast and tutorial</li>
		<li>Updates to jim and writing about the typical workflow</li>
	</ul>

	<p>If you have other suggestions or places in some of my libraries that you&#8217;d like to see updated, let me know! Keep an eye here for the latest, starting tomorrow.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=gISFCDrbOzY:gBOiIWKWpEg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=gISFCDrbOzY:gBOiIWKWpEg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=gISFCDrbOzY:gBOiIWKWpEg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=gISFCDrbOzY:gBOiIWKWpEg:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2010/10/31/novwrimo-repaying-some-debt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2010/10/31/novwrimo-repaying-some-debt/</feedburner:origLink></item>
		<item>
		<title>Sammy 0.6: California Suite</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/N8sAg5rRXpY/</link>
		<comments>http://www.quirkey.com/blog/2010/09/02/sammy-0-6-california-suite/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 13:18:12 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sammy]]></category>
		<category><![CDATA[Software/Scripts]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=453</guid>
		<description><![CDATA[It&#8217;s a couple months in the making, but I&#8217;m happy to say that Sammy.js 0.6 is finally here. Check out the HISTORY and the Changes. I&#8217;m calling this release the California Suite in honor of my move to the West Coast and the fact that I did most of this coding on the plane back [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img.skitch.com/20100831-11assdyxnsmqepn2aftj5mu4kr.png" alt="" /></p>
<p>It&#8217;s a couple months in the making, but I&#8217;m happy to say that <a href="http://code.quirkey.com/sammy">Sammy.js</a> 0.6 is finally here. Check out the <a href="http://github.com/quirkey/sammy/blob/master/HISTORY.md"><span class="caps">HISTORY</span></a> and the <a href="http://github.com/quirkey/sammy/compare/v0.5.4...v0.6.0">Changes</a>. I&#8217;m calling this release the California Suite in honor of my move to the West Coast and the fact that I did most of this coding on the plane back and forth. There are some awesome big new features that I&#8217;ve been using for a little while now and I can say are a big improvement over previous releases.</p>
<p><a href="http://github.com/quirkey/sammy/tarball/v0.6.0">Download it!</a></p>
<p>Before I get to that, I want to mention that work is in full swing on a new Sammy.js website with more documentation and other great stuff. I even have a real logo which I hope to share soon (stickers, anyone?). Before the site launches, though, I set up a <a href="http://github.com/quirkey/sammy/wiki/">new GitHub wiki</a> so that sammy.js users and developers can share projects and code that they&#8217;ve been working on.</p>
<p>On to the features!</p>
<span id="more-453"></span>
<h3>Context! Context! Context!</h3>
<p>The biggest complaint and frustration that I heard from people working with Sammy was about dealing with rendering complex views on the client. If you&#8217;re doing full client side applications or any amount of client side templating you&#8217;ve felt the pain of deeply nested callbacks and complex workarounds for interpolating data in an asynchronous environment. It&#8217;s all like, render this template, wait, first I need the data, hold up, I cant even render that yet I need to get this other template first. Here&#8217;s a common example of what I&#8217;m talking about:</p>
<div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;index.mustache&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">html</span><span class="p">)</span> <span class="p">{</span><br />
    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#main&#39;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="nx">html</span><span class="p">);</span><br />
    <span class="nx">$</span><span class="p">.</span><span class="nx">getJSON</span><span class="p">(</span><span class="s1">&#39;items.json&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">items</span><span class="p">)</span> <span class="p">{</span><br />
      <span class="k">this</span><span class="p">.</span><span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;item.mustache&#39;</span><span class="o">,</span> <span class="nx">items</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="o">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{</span><br />
        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#main ul&#39;</span><span class="p">).</span><span class="nx">append</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span><br />
      <span class="p">});</span><br />
    <span class="p">});</span><br />
  <span class="p">));</span><br />
<span class="p">});</span><br />
</pre></div>
<p>It&#8217;s not just nested callback&#8217;s that are the pain &#8211; its the knowing (or not knowing) when a template will be there or not. It&#8217;s also trying to deal with fetching data and fetching templates within the same context without a unified <span class="caps">API</span>. After kind of examining how other people are doing this, I took some queues from jQuery&#8217;s <span class="caps">API</span> as well as &#8216;promise&#8217; style programming and <a href="http://sexyjs.com/">Sexy.js</a>. The result is <code>Sammy.RenderContext</code>. You create a <code>RenderContext</code> by calling one of three methods within a route/<code>EventContext</code> &#8211; <code>load()</code> <code>render()</code> or <code>partial()</code>. Once you have a every method you chain to it is guaranteed to execute in the order that you chain it <em>regardless of it synchronicity</em>. This means that you can put an <code>appendTo()</code> after a <code>load()</code> and the content won&#8217;t be appended until its fetched asynchronously from a remote location. The content from the previous method in the chain is also passed along so you don&#8217;t have to constantly pull out references. The code above, translated to the <em>new way</em> looks like:</p>
<div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;#/&#39;</span><span class="o">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><br />
  <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;index.mustache&#39;</span><span class="p">)</span><br />
      <span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;#main&#39;</span><span class="p">)</span><br />
      <span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;items.json&#39;</span><span class="p">)</span><br />
      <span class="p">.</span><span class="nx">renderEach</span><span class="p">(</span><span class="s1">&#39;item.mustache&#39;</span><span class="p">)</span><br />
      <span class="p">.</span><span class="nx">appendTo</span><span class="p">(</span><span class="s1">&#39;#main ul&#39;</span><span class="p">);</span><br />
<span class="p">});</span><br />
</pre></div>
<p>A wee bit nicer. Not only does it improve readability but it makes it much easier to do longer more involved client side templating without getting lost in a mire of order and context passing. RenderContext&#8217;s can also be invoked side by side in a single route for parallel execution of chains. Each chain is its own object and keeps its own state. I tried to keep the <span class="caps">API</span> concise but with just a few methods, I think most situations are covered:</p>
<div class="highlight"><pre><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">content</span><span class="o">,</span> <span class="nx">previous</span><span class="p">)</span> <span class="p">{})</span><br />
<span class="nx">next</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span><br />
<span class="nx">wait</span><span class="p">();</span><br />
<span class="c">// Loading local or remote content</span><br />
<span class="nx">load</span><span class="p">(</span><span class="s1">&#39;item.template&#39;</span><span class="p">)</span><br />
<span class="nx">load</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.item&#39;</span><span class="p">))</span><br />
<span class="c">// rendering templates</span><br />
<span class="nx">interpolate</span><span class="p">(</span><span class="s1">&#39;item.template&#39;</span><span class="o">,</span> <span class="p">{})</span><br />
<span class="nx">interpolate</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.item&#39;</span><span class="p">)</span><span class="o">,</span> <span class="p">{})</span><br />
<span class="nx">render</span><span class="p">(</span><span class="s1">&#39;item.template&#39;</span><span class="o">,</span> <span class="p">{})</span><br />
<span class="nx">partial</span><span class="p">(</span><span class="s1">&#39;item.template&#39;</span><span class="o">,</span> <span class="p">{})</span><br />
<span class="nx">collect</span><span class="p">(</span><span class="nx">items</span><span class="o">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="o">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{})</span><br />
<span class="nx">renderEach</span><span class="p">(</span><span class="s1">&#39;item.template&#39;</span><span class="o">,</span> <span class="nx">items</span><span class="p">)</span><br />
<span class="c">// <span class="caps">DOM</span> Manipulation</span><br />
<span class="nx">swap</span><span class="p">()</span><br />
<span class="nx">appendTo</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="nx">element</span><span class="p">))</span><br />
<span class="nx">prependTo</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="nx">element</span><span class="p">))</span><br />
<span class="nx">replace</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="nx">element</span><span class="p">))</span><br />
<span class="c">// Events</span><br />
<span class="nx">trigger</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="o">,</span> <span class="p">{})</span><br />
</pre></div>

<p>Along with the readability improvements, the <code>RenderContext</code> (specifically <code>load()</code>) allows for <span class="caps">DOM</span> style or pre-embedded templating. Meaning, templates don&#8217;t have to come from files, they can be <span class="caps">DOM</span> elements and embedded into <code>&lt;script&gt;</code> or hidden tags. This goes along with the two new templating engines added as well . . .</p>
<h3>Alchemy</h3>
<p>I thought I had this really novel idea. Why not use classes or other attributes of <span class="caps">DOM</span> elements to define how they&#8217;re tied to a <span class="caps">JSON</span> object? I worked on some prototypes and finally found a name and wrote some real code. It turns out, it was a pretty good idea, but also one that had been done before. 0.6 includes plugins for my own <code>Sammy.Meld</code> and the existing and by default more popular <a href="http://beebole.com/pure/">pure.js</a>.</p>
<p>The basic idea of both of these engines is that you take some data like this:</p>
<div class="highlight"><pre><span class="p">{</span><br />
  <span class="s2">&quot;post&quot;</span><span class="o">:</span> <span class="p">{</span><br />
    <span class="s2">&quot;title&quot;</span><span class="o">:</span> <span class="s2">&quot;My Post&quot;</span><span class="o">,</span><br />
    <span class="s2">&quot;body&quot;</span><span class="o">:</span> <span class="s2">&quot;Lorem ipsum dolor sit amet.&quot;</span><span class="o">,</span><br />
    <span class="s2">&quot;tags&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;one&quot;</span><span class="o">,</span> <span class="s2">&quot;two&quot;</span><span class="o">,</span> <span class="s2">&quot;three&quot;</span><span class="p">]</span><span class="o">,</span><br />
    <span class="s2">&quot;meta&quot;</span><span class="o">:</span> <span class="p">{</span><br />
      <span class="s2">&quot;comments&quot;</span><span class="o">:</span> <span class="mi">5</span><span class="o">,</span><br />
      <span class="s2">&quot;time&quot;</span><span class="o">:</span> <span class="s2">&quot;Yesterday&quot;</span><br />
    <span class="p">}</span><br />
  <span class="p">}</span><br />
<span class="p">}</span><br />
</pre></div>
<p>And some <span class="caps">HTML</span> like this:</p>
<div class="highlight"><pre><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;post&quot;</span><span class="nt">&gt;</span><br />
  <span class="nt">&lt;h2</span> <span class="na">class=</span><span class="s">&quot;title&quot;</span><span class="nt">&gt;&lt;/h2&gt;</span><br />
  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;body&quot;</span><span class="nt">&gt;&lt;/div&gt;</span><br />
  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;tags&quot;</span><span class="nt">&gt;&lt;/span&gt;</span><br />
  <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;meta&quot;</span><span class="nt">&gt;</span><br />
    <span class="nt">&lt;li&gt;</span>Comments Count: <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;comments&quot;</span><span class="nt">&gt;&lt;/span&gt;&lt;/li&gt;</span><br />
    <span class="nt">&lt;li&gt;</span>Posted: <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;time&quot;</span><span class="nt">&gt;&lt;/span&gt;&lt;/li&gt;</span><br />
  <span class="nt">&lt;/ul&gt;</span><br />
<span class="nt">&lt;/div&gt;</span><br />
</pre></div>
<p>Meld them together and you should get something like:</p>
<div class="highlight"><pre><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;post&quot;</span><span class="nt">&gt;</span><br />
  <span class="nt">&lt;h2</span> <span class="na">class=</span><span class="s">&quot;title&quot;</span><span class="nt">&gt;</span>My Post<span class="nt">&lt;/h2&gt;</span><br />
  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;body&quot;</span><span class="nt">&gt;</span>Lorem ipsum dolor sit amet.<span class="nt">&lt;/div&gt;</span><br />
  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;tags&quot;</span><span class="nt">&gt;</span>one<span class="nt">&lt;/span&gt;</span><br />
  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;tags&quot;</span><span class="nt">&gt;</span>two<span class="nt">&lt;/span&gt;</span><br />
  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;tags&quot;</span><span class="nt">&gt;</span>three<span class="nt">&lt;/span&gt;</span><br />
  <span class="nt">&lt;ul</span> <span class="na">class=</span><span class="s">&quot;meta&quot;</span><span class="nt">&gt;</span><br />
    <span class="nt">&lt;li&gt;</span>Comments Count: <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;comments&quot;</span><span class="nt">&gt;</span>5<span class="nt">&lt;/span&gt;&lt;/li&gt;</span><br />
    <span class="nt">&lt;li&gt;</span>Posted: <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;time&quot;</span><span class="nt">&gt;</span>Yesterday<span class="nt">&lt;/span&gt;&lt;/li&gt;</span><br />
  <span class="nt">&lt;/ul&gt;</span><br />
<span class="nt">&lt;/div&gt;</span><br />
</pre></div>
<p>There are some clear benefits to this over traditional tag style (mustache, ejs) style templating. Namely, its just <span class="caps">HTML</span>. This means that you can include it in the <span class="caps">DOM</span> on the initial render and not have to go fetch it from the server. It also means that a designer can just design it and even use <em>lorem ipsum</em> if you want, and you don&#8217;t have to go through and <em>add</em> the templating language. There are some downsides, too. <span class="caps">DOM</span> manipulation even with jQuery&#8217;s speed is pretty much always going to be slower then just text interpolation. I&#8217;m working on improving the speed of Meld though caching and faster manipulations, but it ain&#8217;t easy. The other big downside is that complicated iteration or template logic is pretty hard to do in this style. Pure tries to get around this by using a third element called <code>directives</code> which are further instructions on how to meld the data and the markup. I forgo this extra ability to configure in Meld in favor of very simple transformations (ul,ol = lists) and a much smaller file size (<em>uncompressed</em> meld is only 4K). I&#8217;ve been using Meld on some personal projects and hope to test its worth in a real production environment very soon. You can see more examples of it&#8217;s power <a href="http://github.com/quirkey/sammy/blob/master/test/test_sammy_meld.js">in the tests</a></p>
<h3>What&#8217;s next?</h3>
<p>I&#8217;m still pushing to get Sammy.js to 1.0 in the very near future. I really don&#8217;t think theres that much between here and there. I&#8217;ll mention that I&#8217;ve finally been seriously coding with node and server side js and I&#8217;m not that happy with the current state of routing libs there. Server side sammy? Maybe.</p>
<h3>More</h3>
<p>There were a lot of smaller bug fixes and improvements beyond Meld and the RenderContext so I definitely encourage checking out the <a href="http://github.com/quirkey/sammy/blob/master/HISTORY.md">full list</a> and making the upgrade soon. Big thanks as always to everyone who helped with the release. Go out and make some apps!</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=N8sAg5rRXpY:bbK-47JnrNQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=N8sAg5rRXpY:bbK-47JnrNQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=N8sAg5rRXpY:bbK-47JnrNQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=N8sAg5rRXpY:bbK-47JnrNQ:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2010/09/02/sammy-0-6-california-suite/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2010/09/02/sammy-0-6-california-suite/</feedburner:origLink></item>
		<item>
		<title>Lessons from working for startups</title>
		<link>http://feedproxy.google.com/~r/quirkey/~3/7TvN43WZcwQ/</link>
		<comments>http://www.quirkey.com/blog/2010/07/29/lessons-from-working-for-startups/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 15:34:55 +0000</pubDate>
		<dc:creator>AQ</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Entrepreneurship]]></category>

		<guid isPermaLink="false">http://www.quirkey.com/blog/?p=443</guid>
		<description><![CDATA[When I saw that tweet this weekend it dredged up a bunch of thoughts and experiences that I&#8217;ve been wanting to put down on paper for a very long time. Why not now? Over the past 6 years I&#8217;ve worked with 8 different startups in different capacities and pitched or met with countless others. I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://twitter.com/joedamato/status/19451827323"><img src="http://img.skitch.com/20100728-b1ub8is7c59eaqq78cdk8bcgx2.png" /></a></p>

	<p>When I saw that tweet this weekend it dredged up a bunch of thoughts and experiences that I&#8217;ve been wanting to put down on paper for a very long time. Why not now?<br />
<span id="more-443"></span><br />
Over the past 6 years I&#8217;ve worked with 8 different startups in different capacities and pitched or met with countless others. I&#8217;ve been a founder; I&#8217;ve worked for equity; I&#8217;ve been a consultant getting paid cold-hard-cash; I&#8217;ve built prototypes, full products, and everything in between. I know there are a lot of more experienced developers out there, but even so, I think I have some things to share, and lessons I&#8217;ve learned from the good, bad and ugly of being a developer in a startup.</p>

	<h3>Startups aren&#8217;t for everyone</h3>

	<p>Every company is different, and from what I&#8217;ve experienced so far, the mindset and attitude of the bay area is different in a lot of ways from the NY tech scene. At the same rate, though, there are a lot of common things between most startups. In general the environment and process is much different from a large established company, especially in the early days. This means if you need rock solid stability of schedule, work cycle, direction, space, pretty much anything, startup life might not be for you. There is one constant in being involved with a startup and that is change. If you&#8217;re just a developer along for the ride, or a co-founder, change should be something you take in stride. A lot of this has to do with trust. Do you trust the people guiding this ship? Obviously this applies to any job, but is amplified when your livelihood is directly tied to the people you work with.</p>

	<h3>Don&#8217;t invest in an idea you don&#8217;t believe in</h3>

	<p>This should go without saying, but you&#8217;d be surprised when people don&#8217;t really understand what taking equity or options really mean. When you take equity as a developer (especially as a non-founder) what you&#8217;re actually doing is investing in the company in exchange for your skills/work. This isn&#8217;t something to be taken lightly &#8211; even if it&#8217;s a tiny piece. Take yourself out of the position of making the exchange for work. Assuming you had the money and opportunity too, would you give this company you&#8217;re money in exchange for equity. This goes beyond trust into the realm of belief. Do you <strong>believe</strong> that the startup you are investing in will actually be successful and provide a return on your investment? If you don&#8217;t believe that or have any doubts then as a developer you&#8217;re probably not going to work hard to achieve that goal.</p>

	<p>This isn&#8217;t just about actualization, it&#8217;s about making good investments. Whatever you charge for your time, putting stake in something you don&#8217;t think is going to be successful is basically taking whatever money you would have made for that time and flushing it.</p>

	<h3>Get paid</h3>

	<p>If you&#8217;re a developer working for a startup theres no reason you shouldn&#8217;t be getting paid, even if you&#8217;re developer numero uno. Perhaps this means taking a slight pay cut from what you would be making at an established company in exchange for some ownership, but the general rule is you should be making more then enough to cover your life costs and at least enough that you&#8217;re not bitter towards those paying you.</p>

	<p>I&#8217;ve done pure equity in the past and have pretty much completely sworn off of it. Unless you&#8217;re a co-founder, it&#8217;s going to be a very rare case to be committed enough to go the long haul without getting paid. And even if you are a co-founder, you should have enough savings to pay yourself, or think about raising some capital so you can.</p>

	<p>If you&#8217;re approached by a startup to build their prototype or work on their app and all they have is an idea, they should pay you for your services. If this is the founders &#8216;side-project&#8217; and/or they haven&#8217;t raised or put in any capital, thats a definite sign that you should get paid. Think about it &#8211; if they&#8217;re not willing to invest the capital to pay you, why should you invest?</p>

	<h3>Retainers Rule</h3>

	<p>Going along with the rule that <strong>change</strong> is one of the biggest aspects of being part of a startup, if you&#8217;re working as a freelance developer you need to structure your contract so it accounts for this. If the startup is small or just starting, working on a project basis is a bad idea as a rule. If you&#8217;re working to a fixed scope like &#8220;Working prototype of myawesomestartup.com&#8221;, even if the details are very well defined, what happens when the entire goal of the startup changes? Do you scrap your work? Do you ask for a &#8216;change-order&#8217;? Do you have to just suck it up and forget about getting paid for the extra time you put in? If you don&#8217;t assume this scenario from the start, it&#8217;s often awkward and painful to try to negotiate this post-change.</p>

	<p>At the end of my last round of freelancing, almost all the projects I was working on were set up on some sort of retainer. This was great for me, because I had a definite amount of work and dollars coming in every month. It was great for the startup because they didn&#8217;t have to worry about getting charged extra or haggling over money every time they changed their minds.</p>

	<p>I pitched every new job and potential client like this, and in the end it worked out great. If the client thought this was a bad idea or was so sure that they had everything ready from the start, I made sure to put in a clause or section that defined exactly what would happen and how much it would cost when they did want something different. (it <em>always</em> happened).</p>

	<h3>Get the position and job you want</h3>

	<p>This all comes down to the final point, that as a skilled developer the ball is really in your court. The key is to not abuse that advantage, but definitely make use of it to get the job that you want. The reason I hadn&#8217;t settled down into a full time job was really because it took this long to find exactly what I wanted. Paperless Post finally met my criteria:</p>

	<ul>
		<li>Great people</li>
		<li>Clear direction and strong motivation</li>
		<li>A real business plan with actual revenue</li>
		<li>Willingness to pay and reward good work</li>
		<li>Dedication to Open source</li>
	</ul>

	<p>It really shouldn&#8217;t be so rare to find this, but it really is from my experience. Your requirements might be different, but if you&#8217;re ready to take the plunge of investing a lot of time in a product or team it should always be doing the best to meet these goals. As a quick aside, Paperless Post is <a href="http://www.paperlesspost.com/info/about/jobs/jobs" title="">currently hiring in both NY and SF</a> feel free to mention this post.</p>

	<p>Working for and with startups has been uniquely rewarding for me, not just because I&#8217;m <a href="http://img.skitch.com/20100729-xbejd63jtug633g1b9end3sbnf.png" title="">ballin&#8217;</a> but because I&#8217;ve learned more in the past couple of years then I ever could have hoped otherwise.</p>
 <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/quirkey?a=7TvN43WZcwQ:SuzyUhBqXws:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=7TvN43WZcwQ:SuzyUhBqXws:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/quirkey?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/quirkey?a=7TvN43WZcwQ:SuzyUhBqXws:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/quirkey?i=7TvN43WZcwQ:SuzyUhBqXws:D7DqB2pKExk" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.quirkey.com/blog/2010/07/29/lessons-from-working-for-startups/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.quirkey.com/blog/2010/07/29/lessons-from-working-for-startups/</feedburner:origLink></item>
	</channel>
</rss>
