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

  <title><![CDATA[Mark Daggett's Blog]]></title>
  <link href="http://heavysixer.github.com/atom.xml" rel="self"/>
  <link href="http://heavysixer.github.com/"/>
  <updated>2013-03-04T21:39:02-06:00</updated>
  <id>http://heavysixer.github.com/</id>
  <author>
    <name><![CDATA[Mark Daggett]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Functional Illiteracy In JavaScript]]></title>
    <link href="http://heavysixer.github.com/blog/2013/03/04/functional-illiteracy-in-javascript/"/>
    <updated>2013-03-04T21:36:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/03/04/functional-illiteracy-in-javascript</id>
    <content type="html"><![CDATA[<p>When someone cannot read or write in their native language, they are considered functionally illiterate. This
level of illiteracy means that they subsist in their daily life through their ability to speak fluently, and
recognize certain written keywords. Illiteracy is not a sign of stupidity; in many cases it is the result a lack
of opportunity to learn. However, illiteracy does stunt the potential of otherwise bright people. The sad fact is
their inability to participate in society through the mastery of language makes them at higher risk of being in
poverty and committing crime.</p>
<p>Aside from it being an epic pun, what does it mean to be a functionally illiterate developer? Most computer
languages are written, not spoken (try speaking JavaScript out loud and you&#8217;ll see what I mean). Therefore, being
able to write code does not make you literate. Being an illiterate developer means that you skim across the
surface of the language, copying snippets of code from others trying cobble, together a working program with
little or no understanding of how or why it works.</p>
<p>As with illiterates in the wider world, illiterate developers are not unintelligent. Often it means that they
didn&#8217;t have the luxury of taking a deep dive through the mechanics of the programming language. Many illiterate
developers are practicing software professionals, backed into a corner by impending deadlines, or lack of
resources. Perhaps they started in other fields such as graphic design, or business and find themselves scurrying
along the surface of the language, learning in fits and starts as they go along.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dynamic Spotlight Effect Using CSS and JavaScript]]></title>
    <link href="http://heavysixer.github.com/blog/2013/03/04/dynamic-spotlight-effect-using-css-and-javascript/"/>
    <updated>2013-03-04T13:27:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/03/04/dynamic-spotlight-effect-using-css-and-javascript</id>
    <content type="html"><![CDATA[<p>In casual gaming there is a convention whereby the player is introduced to the interface during the first play
cycle. Typically, this involves a character from the game pointing out aspects of the interface and telling the
player how to use it and why they should care. Ideally, you want to visually draw the attention of the player to
the relevant component of the interface as the characters are explaining it. For this purpose I created a
JavaScript class which will spotlight a portion of the screen using only CSS and JavaScript. Here is an example of
it <a class="reference external" href="http://jsfiddle.net/HFnYC/">working</a>.</p>
<p>The class allows you to configure the following spotlight attributes:</p>
<blockquote>
<ul class="simple">
<li>starting x,y (integer)</li>
<li>destination x,y (integer)</li>
<li>duration (0%-100%)</li>
<li>callback when animation is complete (function)</li>
</ul>
</blockquote>
<p>Below is the CSS and JavaScript you&#8217;ll need to use it in your own projects. If you improve this script please let me
know.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="html"><span class="line"><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;spotLight&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="css"><span class="line"><span class="nf">#spotLight</span> <span class="p">{</span>
</span><span class="line">  <span class="k">width</span><span class="o">:</span><span class="m">1024px</span><span class="p">;</span>
</span><span class="line">  <span class="k">height</span><span class="o">:</span><span class="m">768px</span><span class="p">;</span>
</span><span class="line">  <span class="k">z-index</span><span class="o">:</span><span class="m">9</span><span class="p">;</span>
</span><span class="line">  <span class="k">position</span><span class="o">:</span><span class="k">absolute</span><span class="p">;</span>
</span><span class="line">  <span class="k">display</span><span class="o">:</span><span class="k">none</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">function</span> <span class="nx">SpotLight</span><span class="p">(</span><span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">;</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">width</span><span class="p">()</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">height</span><span class="p">()</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">show</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">element</span><span class="p">.</span><span class="nx">hide</span><span class="p">();</span>
</span><span class="line">    <span class="nx">element</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s2">&quot;hide&quot;</span><span class="p">);</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">element</span><span class="p">.</span><span class="nx">fadeIn</span><span class="p">(</span><span class="s1">&#39;fast&#39;</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">hide</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">element</span><span class="p">.</span><span class="nx">fadeOut</span><span class="p">(</span><span class="s1">&#39;fast&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">      <span class="k">if</span> <span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="nx">callback</span><span class="p">();</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">    <span class="p">});</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">element</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s2">&quot;hide&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">move</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">opts</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">endX</span><span class="p">,</span> <span class="nx">endY</span><span class="p">,</span> <span class="nx">obj</span><span class="p">;</span>
</span><span class="line">    <span class="nx">obj</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">start_x</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span>
</span><span class="line">      <span class="nx">start_y</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span>
</span><span class="line">      <span class="nx">x</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span>
</span><span class="line">      <span class="nx">y</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span>
</span><span class="line">      <span class="nx">aperture</span><span class="o">:</span> <span class="s2">&quot;50%&quot;</span><span class="p">,</span>
</span><span class="line">      <span class="nx">duration</span><span class="o">:</span> <span class="mi">1000</span><span class="p">,</span>
</span><span class="line">      <span class="nx">done</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{}</span>
</span><span class="line">    <span class="p">},</span> <span class="nx">opts</span><span class="p">);</span>
</span><span class="line">    <span class="nx">endX</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
</span><span class="line">    <span class="nx">endY</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
</span><span class="line">    <span class="nx">obj</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">start_x</span><span class="p">;</span>
</span><span class="line">    <span class="nx">obj</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">start_y</span><span class="p">;</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">jQuery</span><span class="p">(</span><span class="nx">obj</span><span class="p">).</span><span class="nx">animate</span><span class="p">({</span>
</span><span class="line">      <span class="nx">x</span><span class="o">:</span> <span class="nx">endX</span><span class="p">,</span>
</span><span class="line">      <span class="nx">y</span><span class="o">:</span> <span class="nx">endY</span>
</span><span class="line">    <span class="p">},</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">duration</span><span class="o">:</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">duration</span><span class="p">,</span>
</span><span class="line">      <span class="nx">step</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="kd">var</span> <span class="nx">style</span><span class="p">,</span> <span class="nx">_i</span><span class="p">,</span> <span class="nx">_len</span><span class="p">,</span> <span class="nx">_ref</span><span class="p">;</span>
</span><span class="line">        <span class="nx">_ref</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;-moz-radial-gradient(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px, ellipse cover,  rgba(0,0,0,0) 0%, rgba(0,0,0,0.8) &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">aperture</span> <span class="o">+</span> <span class="s2">&quot;, rgba(0,0,0,0.8) 100%)&quot;</span><span class="p">,</span> <span class="s2">&quot;-webkit-gradient(radial, &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px, 0px, &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px, 100%, color-stop(0%,rgba(0,0,0,0)), color-stop(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">aperture</span> <span class="o">+</span> <span class="s2">&quot;,rgba(0,0,0,0.8)), color-stop(100%,rgba(0,0,0,0.8)))&quot;</span><span class="p">,</span> <span class="s2">&quot;-webkit-radial-gradient(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px, ellipse cover,  rgba(0,0,0,0) 0%,rgba(0,0,0,0.8) &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">aperture</span> <span class="o">+</span> <span class="s2">&quot;,rgba(0,0,0,0.8) 100%)&quot;</span><span class="p">,</span> <span class="s2">&quot;-o-radial-gradient(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px, ellipse cover,  rgba(0,0,0,0) 0%,rgba(0,0,0,0.8) &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">aperture</span> <span class="o">+</span> <span class="s2">&quot;,rgba(0,0,0,0.8) 100%)&quot;</span><span class="p">,</span> <span class="s2">&quot;-ms-radial-gradient(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px, ellipse cover,  rgba(0,0,0,0) 0%,rgba(0,0,0,0.8) &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">aperture</span> <span class="o">+</span> <span class="s2">&quot;,rgba(0,0,0,0.8) 100%)&quot;</span><span class="p">,</span> <span class="s2">&quot;radial-gradient(ellipse at &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;px &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot;px,  rgba(0,0,0,0) 0%,rgba(0,0,0,0.8) &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">aperture</span> <span class="o">+</span> <span class="s2">&quot;,rgba(0,0,0,0.8) 100%)&quot;</span><span class="p">];</span>
</span><span class="line">        <span class="k">for</span> <span class="p">(</span><span class="nx">_i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">_len</span> <span class="o">=</span> <span class="nx">_ref</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">_i</span> <span class="o">&lt;</span> <span class="nx">_len</span><span class="p">;</span> <span class="nx">_i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">          <span class="nx">style</span> <span class="o">=</span> <span class="nx">_ref</span><span class="p">[</span><span class="nx">_i</span><span class="p">];</span>
</span><span class="line">          <span class="nx">element</span><span class="p">.</span><span class="nx">css</span><span class="p">({</span>
</span><span class="line">            <span class="s2">&quot;background&quot;</span><span class="o">:</span> <span class="nx">style</span>
</span><span class="line">          <span class="p">});</span>
</span><span class="line">        <span class="p">}</span>
</span><span class="line">        <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line">      <span class="p">},</span>
</span><span class="line">      <span class="nx">done</span><span class="o">:</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">done</span>
</span><span class="line">    <span class="p">});</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Example Usage:</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">spotLight</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SpotLight</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#spotLight&quot;</span><span class="p">))</span>
</span><span class="line"><span class="nx">spotLight</span><span class="p">.</span><span class="nx">show</span><span class="p">();</span>
</span><span class="line"><span class="nx">spotLight</span><span class="p">.</span><span class="nx">move</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">150</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">650</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[racing and profiling]]></title>
    <link href="http://heavysixer.github.com/blog/2013/03/01/racing-and-profiling/"/>
    <updated>2013-03-01T09:08:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/03/01/racing-and-profiling</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been experimenting with various ways to profile, and explore JavaScript as it executes in the runtime environment. Mostly I&#8217;ve been
experimenting with the rKelly and rubyracer gems. Both gems are written by people much smarter than myself so there is lots to learn and
explore inside their source. I was talking to the very friendly <a class="reference external" href="https://twitter.com/cowboyd">Charles Lowell</a>, creator of the rubyracer
and he shared this great snippet with me, which allows you to turn on the v8 profiler while the rubyracer is running. Because this is an
undocumented hook I thought I&#8217;d share it here:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">ruby</span> <span class="o">-</span><span class="no">Ilib</span> <span class="o">-</span><span class="no">Iext</span> <span class="o">-</span><span class="n">rv8</span> <span class="o">-</span><span class="n">e</span> <span class="s1">&#39;V8::C::V8::SetFlagsFromString(&quot;--prof&quot;); V8::Context.new() {|c| puts c.eval(&quot;5 + 1&quot;)}; V8::C::V8::PauseProfiler()&#39;</span>
</span></code></pre></td></tr></table></div></figure><p>This will produce a <em>v8.log</em> file wherever you executed the script from. Inside the file there is a gluttonous amount of data, which will
take some time to parse through but in general it looks a bit like this:</p>
<pre class="literal-block">
code-creation,LoadIC,0x127fc3e29140,181,&quot;A load IC from the snapshot&quot;
code-creation,KeyedLoadIC,0x127fc3e29200,181,&quot;A keyed load IC from the snapshot&quot;
code-creation,StoreIC,0x127fc3e292c0,183,&quot;A store IC from the snapshot&quot;
code-creation,KeyedStoreIC,0x127fc3e29380,183,&quot;A keyed store IC from the snapshot&quot;
code-creation,Builtin,0x127fc3e29440,97,&quot;A builtin from the snapshot&quot;
code-creation,Builtin,0x127fc3e294c0,137,&quot;A builtin from the snapshot&quot;
code-creation,Script,0x127fc3e14e20,980,&quot;native string.js&quot;,0x2e87cc50ec50,
code-creation,LazyCompile,0x127fc3e15500,1616,&quot;SetUpString native string.js:940&quot;,0x2e87cc5129c8,
code-creation,LazyCompile,0x127fc3e15be0,472,&quot; native string.js:36&quot;,0x2e87cc512ab0,
code-creation,Script,0x127fc3e15dc0,336,&quot;native array.js&quot;,0x2e87cc512e00,
code-creation,LazyCompile,0x127fc3e15f20,2544,&quot;SetUpArray native array.js:1469&quot;,0x2e87cc5175b0,
code-creation,LazyCompile,0x127fc3e16920,340,&quot;SetUpArray.b native array.js:1482&quot;,0x2e87cc517668,
code-creation,Script,0x127fc3e16b00,552,&quot;native regexp.js&quot;,0x2e87cc5177f0,
code-creation,LazyCompile,0x127fc3e16d40,388,&quot;RegExpConstructor native regexp.js:86&quot;,0x2e87cc518a70,
code-creation,LazyCompile,0x127fc3e16ee0,280,&quot;RegExpMakeCaptureGetter native regexp.js:363&quot;,0x2e87cc519288,
code-creation,LazyCompile,0x127fc3e17000,668,&quot; native regexp.js:364&quot;,0x2e87cc519340,
code-creation,LazyCompile,0x127fc3e172a0,2304,&quot;SetUpRegExp native regexp.js:403&quot;,0x2e87cc519488,
code-creation,LazyCompile,0x127fc3e17ba0,292,&quot;SetUpRegExp.a native regexp.js:422&quot;,0x2e87cc519540,
code-creation,LazyCompile,0x127fc3e17ce0,256,&quot;SetUpRegExp.c native regexp.js:426&quot;,0x2e87cc519658,
</pre>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Javascript ParseTrees]]></title>
    <link href="http://heavysixer.github.com/blog/2013/02/27/javascript-parsetrees/"/>
    <updated>2013-02-27T20:22:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/02/27/javascript-parsetrees</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been experimenting with the rkelly Ruby gem to help me explore the JavaScript parse tree. It is really fascinating, and I can see
myself spending a lot of time spelunking through the language. Here is a simple example using the gem to iterate over each node in the
parse tree and print out its type. Stay tuned, more to come!</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="nb">require</span> <span class="s1">&#39;rubygems&#39;</span>
</span><span class="line"><span class="nb">require</span> <span class="s1">&#39;rkelly&#39;</span>
</span><span class="line"><span class="n">parser</span> <span class="o">=</span> <span class="ss">RKelly</span><span class="p">:</span><span class="ss">:Parser</span><span class="o">.</span><span class="n">new</span>
</span><span class="line"><span class="n">src</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span>
</span><span class="line"><span class="sh">// Create scrollLeft and scrollTop methods</span>
</span><span class="line"><span class="sh">jQuery.each( {scrollLeft: &quot;pageXOffset&quot;, scrollTop: &quot;pageYOffset&quot;}, function( method, prop ) {</span>
</span><span class="line"><span class="sh">  var top = &quot;pageYOffset&quot; === prop;</span>
</span><span class="line">
</span><span class="line"><span class="sh">  jQuery.fn[ method ] = function( val ) {</span>
</span><span class="line"><span class="sh">    return jQuery.access( this, function( elem, method, val ) {</span>
</span><span class="line"><span class="sh">      var win = getWindow( elem );</span>
</span><span class="line">
</span><span class="line"><span class="sh">      if ( val === undefined ) {</span>
</span><span class="line"><span class="sh">        return win ? win[ prop ] : elem[ method ];</span>
</span><span class="line"><span class="sh">      }</span>
</span><span class="line">
</span><span class="line"><span class="sh">      if ( win ) {</span>
</span><span class="line"><span class="sh">        win.scrollTo(</span>
</span><span class="line"><span class="sh">          !top ? val : window.pageXOffset,</span>
</span><span class="line"><span class="sh">          top ? val : window.pageYOffset</span>
</span><span class="line"><span class="sh">        );</span>
</span><span class="line">
</span><span class="line"><span class="sh">      } else {</span>
</span><span class="line"><span class="sh">        elem[ method ] = val;</span>
</span><span class="line"><span class="sh">      }</span>
</span><span class="line"><span class="sh">    }, method, val, arguments.length, null );</span>
</span><span class="line"><span class="sh">  };</span>
</span><span class="line"><span class="sh">});</span>
</span><span class="line">
</span><span class="line"><span class="sh">function getWindow( elem ) {</span>
</span><span class="line"><span class="sh">  return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 &amp;&amp; elem.defaultView;</span>
</span><span class="line"><span class="sh">}</span>
</span><span class="line"><span class="no">EOF</span>
</span><span class="line"><span class="n">ast</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">src</span><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="cm">=begin</span>
</span><span class="line"><span class="cm">Outputs something like this as it traverses the parseTree</span>
</span><span class="line"><span class="cm">RKelly::Nodes::SourceElementsNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::ExpressionStatementNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::FunctionCallNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::DotAccessorNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::ResolveNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::ArgumentsNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::ObjectLiteralNode</span>
</span><span class="line"><span class="cm">RKelly::Nodes::PropertyNode</span>
</span><span class="line"><span class="cm">...</span>
</span><span class="line"><span class="cm">=end</span>
</span><span class="line">
</span><span class="line"><span class="n">ast</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">node</span><span class="o">|</span>
</span><span class="line">  <span class="nb">puts</span> <span class="n">node</span><span class="o">.</span><span class="n">class</span>
</span><span class="line"><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Closure]]></title>
    <link href="http://heavysixer.github.com/blog/2013/02/25/getting-closure/"/>
    <updated>2013-02-25T15:21:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/02/25/getting-closure</id>
    <content type="html"><![CDATA[<div class="section" id="understanding-the-dark-arts-of-javascript-closures">
<h2>Understanding the Dark Arts of JavaScript Closures</h2>
<blockquote>
&quot;No matter where you go, there you are.&quot;
- Buckaroo Banzai</blockquote>
<p>The purpose of this post is to explain how closures work in plain english, and to give a few compelling examples where the use of closures really improve
the quality of your code.</p>
<p>Like many others I am a self-taught programmer, and little over a decade ago I was also a freshly minted Creative Director working in Los Angels. I was employed
by a major footwear brand, and had inherited a team of very bright and technically gifted programmers. I felt that I needed to learn enough code to speak
intelligently to them. I didn&#8217;t want to propose a feature that wasn&#8217;t possible, and more importantly I wanted to understand the promise and the problems
inherent in the medium we were building within. More generally though, I am just a very curious person who likes to learn. Once I started to pull that tread
the world of programming began to unwind for me. Now years later, here I sit writing about the internals of JavaScript.</p>
<p>Being that my computer science education has been ad-hoc there are many core concepts in JavaScript (and programming in general) that I wanted to understand
better. My hypothesis is that there are others like me who have been using and abusing JavaScript for years. For this reason I decided to write on closures an
often used but equally often misunderstood concept in JavaScript. Closures are important for a variety of reasons:</p>
<ol class="arabic simple">
<li>They are both a feature and a philosophy that once understood makes many other concepts (e.g. data binding, promise objects) in JavaScript easier.</li>
<li>They are one of the most powerful internals of the language, which many other so-called <em>real</em> languages don&#8217;t support.</li>
<li>They are where JavaScript is trending due to the rise in popularity of asynchronous execution.</li>
</ol>
<p>For all the potential benefits that closures offer, there is a <em>black magic</em> quality to them that can make them hard to understand. Let&#8217;s start with a
definition, <strong>A closure is the act of binding all free variables, and functions into a closed expression, that persist beyond the lexical scope from which they
were created.</strong> While this is a succinct definition it is pretty impenetrable for the uninitiated; let&#8217;s dig deeper.</p>
</div>
<div class="section" id="the-straight-dope-on-scope">
<h2>The Straight Dope On Scope</h2>
<p>Before we can truly understand closures we must take a step back and look at how scope works in JavaScript. When reading about JavaScript periodically
writers will make reference to lexical scope, or the current and/or executing scope. Lexical scope simply means that where a statement is placed within the
body of the script is important and effects how it can be accessed, and what in turn it has access to. In JavaScript unlike other languages the only way to
create a new scope is through a function invocation <a class="footnote-reference" href="#id8" id="id1">[1]</a>. This is what programmers mean when they say JavaScript has function level scoping. This form of
scoping may be anti-intuitive to programmers coming from languages that support block-level scoping e.g. Ruby.</p>
<p>The following example demonstrates lexical scope:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Free Variable</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">iAmFree</span> <span class="o">=</span> <span class="s1">&#39;Free to be me!&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="kd">function</span> <span class="nx">canHazAccess</span><span class="p">(</span><span class="nx">notFree</span><span class="p">){</span>
</span><span class="line">
</span><span class="line">  <span class="kd">var</span> <span class="nx">notSoFree</span> <span class="o">=</span> <span class="s2">&quot;i am bound to this scope&quot;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// =&gt; &quot;Free to be me!&quot;</span>
</span><span class="line">  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">iAmFree</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; ReferenceError: notSoFree is not defined</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">notSoFree</span><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="nx">canHazAccess</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure><p>As you can see the function declaration <em>canHazAccess()</em> can reference the <em>iAmFree</em> variable; this is because the variable belongs to the enclosing scope. The
<em>iAmFree</em> variable is an example of what in JavaScript is called a <strong>free variable</strong> <a class="footnote-reference" href="#id9" id="id2">[2]</a>. Free variables are any non-local variable which the function
body has access to. To qualify as a free variable it must be defined outside the function body and not be passed as a function argument.</p>
<p>Conversely, we see that referencing <em>notSoFree</em> from the enclosing scope produces an error. This is because at the point at which this variable
was defined it was inside a new lexical scope (remember function invocation creates a new scope).</p>
<p>Put another way, <strong>function level scopes act like one-way mirrors; they let elements inside the function body spy on variables in the outer scope, while they
remain hidden.</strong> As we&#8217;ll see below closures short-circuit this relationship, and provide a mechanism whereby the inner scopes internals can
be accessed by the outer scope.</p>
</div>
<div class="section" id="thisunderstandings">
<h2>Thisunderstandings</h2>
<p>One feature of scopes, that routinely throw developers off (even seasoned ones) is the use of the <em>this</em> keyword as it pertains to the lexical
scope. In JavaScript the <strong>this keyword always refers to the owner of scope from which it is executing</strong>. Misunderstanding how <em>this</em> works can
cause all sorts of weird errors where a developer assumes they are accessing a particular scope but are actually using another. Here is how this might
happen:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">Car</span><span class="p">,</span> <span class="nx">tesla</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="nx">Car</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">start</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;car started&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">turnKey</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">carKey</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;car_key&#39;</span><span class="p">);</span>
</span><span class="line">    <span class="nx">carKey</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="k">this</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class="line">    <span class="p">};</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line"><span class="nx">tesla</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Car</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Once a user click&#39;s the #carKey element they will see &quot;Uncaught TypeError: Object  has no method &#39;start&#39;&quot;</span>
</span><span class="line"><span class="nx">tesla</span><span class="p">.</span><span class="nx">turnKey</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure><p>The developer who wrote this was headed in the right direction, but ultimately a <em>thisunderstanding</em> forced them off the rails. They correctly bound
the click event to the <em>car_key</em> DOM element. However, they assumed that nesting the click binding inside the car class would give the DOM element a reference
to the car&#8217;s <em>this</em> context. The approach is intuitive and <em>looks legit</em>, especially based on what we know about free variables and lexical scope. Unfortunately,
it&#8217;s hopelessly borked; because as we learned earlier a new scope is created each time a function is invoked. Once the onclick event fired <em>this</em> now
referred to the DOM element not the car class.</p>
<p>Developers sometimes get around this scoping confusion by assigning <em>this</em> to a local free variable (e.g. that, _this, self, me). Here is the previous method
rewritten to use a local free variable instead of <em>this</em>.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">Car</span><span class="p">,</span> <span class="nx">tesla</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="nx">Car</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">start</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;car started&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">turnKey</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">carKey</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;carKey&#39;</span><span class="p">);</span>
</span><span class="line">    <span class="nx">carKey</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">that</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class="line">    <span class="p">};</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line"><span class="nx">tesla</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Car</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Once a user click&#39;s the #carKey element they will see &quot;car started&quot;</span>
</span><span class="line"><span class="nx">tesla</span><span class="p">.</span><span class="nx">turnKey</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure><p>Because <em>that</em> is a free variable, it won&#8217;t be redefined when the onclick event is triggered. Instead it remains as a pointer to the previous <em>this</em> context.
Technically, this solves the problem, and I am going to resist the urge of calling this an anti-pattern (for now). I have used this technique thousands of
times over the years. However, it always <em>felt</em> like a hack, and fortunately, closures can help us marshall scopes in a much more elegant way.</p>
</div>
<div class="section" id="my-first-closure">
<h2>My First Closure</h2>
<p>In it&#8217;s most basic form a closure is simply an outer function that returns an inner function. Doing this creates a mechanism to return an enclosed scope on
demand. Here is a simple closure:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">function</span> <span class="nx">outer</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">hello</span> <span class="o">=</span> <span class="s2">&quot;hi&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="nx">inner</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="k">return</span> <span class="nx">inner</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">hello</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="nx">name</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Create and use the closure</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">outer</span><span class="p">(</span><span class="s2">&quot;mark&quot;</span><span class="p">)();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &#39;hi mark&#39;</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure><p>In this example you can see that the local variable <em>hello</em> can be used in the return statement of the inner function. At the point of execution <em>hello</em> is a
free variable belonging to the enclosing scope. This example borders on meaninglessness though; lets look at a slightly more complex closure:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">car</span><span class="p">;</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">carFactory</span><span class="p">(</span><span class="nx">kind</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">wheelCount</span><span class="p">,</span> <span class="nx">start</span><span class="p">;</span>
</span><span class="line">  <span class="nx">wheelCount</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span><span class="line">  <span class="nx">start</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;started with &#39;</span> <span class="o">+</span> <span class="nx">wheelCount</span> <span class="o">+</span> <span class="s1">&#39; wheels.&#39;</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// Closure created here.</span>
</span><span class="line">  <span class="k">return</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">make</span><span class="o">:</span> <span class="nx">kind</span><span class="p">,</span>
</span><span class="line">      <span class="nx">wheels</span><span class="o">:</span> <span class="nx">wheelCount</span><span class="p">,</span>
</span><span class="line">      <span class="nx">startEngine</span><span class="o">:</span> <span class="nx">start</span>
</span><span class="line">    <span class="p">};</span>
</span><span class="line">  <span class="p">}());</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="nx">car</span> <span class="o">=</span> <span class="nx">carFactory</span><span class="p">(</span><span class="s1">&#39;Tesla&#39;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; Tesla</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">car</span><span class="p">.</span><span class="nx">make</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; started with 4 wheels.</span>
</span><span class="line"><span class="nx">car</span><span class="p">.</span><span class="nx">startEngine</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure></div>
<div class="section" id="why-use-closures">
<h2>Why Use Closures</h2>
<p>Now that we know what closures are, let&#8217;s look at some use cases on where they can elegantly solve common problems in JavaScript.</p>
<ul>
<li><p class="first"><strong>Object Factories</strong></p>
<p>The previous closure implements what is commonly known as the Factory Pattern <a class="footnote-reference" href="#id10" id="id3">[3]</a>. In keeping with a Factory Pattern the internals of the factory can be
quite complex but are abstracted away in part thanks to the closure. This highlights one of the best features of closures which is their ability to
hide state. JavaScript doesn&#8217;t have the concept of private or protected contexts, but using closures give us a good way to emulate some level of privacy.</p>
</li>
<li><p class="first"><strong>Create A Binding Proxy</strong></p>
<p>As promised lets revisit the Car class we wrote earlier. We solved the scoping problem by assigning the outer function&#8217;s <em>this</em> reference to a <em>that</em> free
variable. Instead of that approach we&#8217;ll solve it through the use of closures. First we create a reusable closure function called <em>proxy</em>, which takes
a function and a context and returns a new function with the supplied context applied. Then we wrap the onclick function with our <em>proxy</em> and pass in the <em>this</em>
that references the current instance of the <em>Car</em> class. Coincidentally, this is a simplified version of what jQuery does in their own proxy function <a class="footnote-reference" href="#id11" id="id4">[4]</a>.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">Car</span><span class="p">,</span> <span class="nx">proxy</span><span class="p">,</span> <span class="nx">tesla</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="nx">Car</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">start</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;car started&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">this</span><span class="p">.</span><span class="nx">turnKey</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">carKey</span><span class="p">;</span>
</span><span class="line">    <span class="nx">carKey</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;carKey&quot;</span><span class="p">);</span>
</span><span class="line">    <span class="nx">carKey</span><span class="p">.</span><span class="nx">onclick</span> <span class="o">=</span> <span class="nx">proxy</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="k">this</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span><span class="line">    <span class="p">},</span> <span class="k">this</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Use a closure to bind the outer scope&#39;s reference to this into the newly created inner scope.</span>
</span><span class="line"><span class="nx">proxy</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="nx">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">callback</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">self</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="nx">tesla</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Car</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Once a user click&#39;s the #carKey element they will see &quot;car started&quot;</span>
</span><span class="line"><span class="nx">tesla</span><span class="p">.</span><span class="nx">turnKey</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first"><strong>Contextually Aware DOM Manipulation</strong></p>
<p>This example comes from directly from Juriy Zaytsev&#8217;s excellent article &quot;Use Cases for JavaScript Closures&quot; <a class="footnote-reference" href="#id12" id="id5">[5]</a> . His example code demonstrates how to use a
closure to ensure a DOM element has a unique ID. The larger takeaway is that you can use closures as a way to maintain internal states about your program in
an encapsulated manner.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">getUniqueId</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">id</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line">  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">      <span class="nx">element</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s1">&#39;generated-uid-&#39;</span> <span class="o">+</span> <span class="nx">id</span><span class="o">++</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">element</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line"><span class="p">})();</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">elementWithId</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;p&#39;</span><span class="p">);</span>
</span><span class="line"><span class="nx">elementWithId</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s1">&#39;foo-bar&#39;</span><span class="p">;</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">elementWithoutId</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;p&#39;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &#39;foo-bar&#39;</span>
</span><span class="line"><span class="nx">getUniqueId</span><span class="p">(</span><span class="nx">elementWithId</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &#39;generated-id-0&#39;</span>
</span><span class="line"><span class="nx">getUniqueId</span><span class="p">(</span><span class="nx">elementWithoutId</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first"><strong>Singleton Module Pattern</strong></p>
<p>Modules are used to encapsulate and organize related code together under one roof. Using modules keeps your codebase cleaner, easier to test, and reuse.
Attribution for the Module Pattern is typically given to Richard Conford <a class="footnote-reference" href="#id13" id="id6">[6]</a>, though a number of people most notably Douglas Crockford are responsible for
popularizing it. The Singleton Module is a flavor that restricts more than one instance of the object from existing. It is very useful for instances where
you want several objects to share a resource. A much more in depth example of the Singleton Module can be found here <a class="footnote-reference" href="#id14" id="id7">[7]</a>, but for now consider the following
example:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Create a closure</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">SecretStore</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">secret</span><span class="p">,</span> <span class="nx">newSecret</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// Emulation of a private variables and functions</span>
</span><span class="line">  <span class="nx">data</span> <span class="o">=</span> <span class="s1">&#39;secret&#39;</span><span class="p">;</span>
</span><span class="line">  <span class="nx">secret</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">data</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="nx">newSecret</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">newValue</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">data</span> <span class="o">=</span> <span class="nx">newValue</span><span class="p">;</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">secret</span><span class="p">();</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// Return an object literal which is the only way to access the private functions and variables</span>
</span><span class="line">  <span class="k">return</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">getSecret</span><span class="o">:</span> <span class="nx">secret</span><span class="p">,</span>
</span><span class="line">    <span class="nx">setSecret</span><span class="o">:</span> <span class="nx">newSecret</span><span class="p">,</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line"><span class="p">})();</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">secret</span> <span class="o">=</span> <span class="nx">SecretStore</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &quot;secret&quot;</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">secret</span><span class="p">.</span><span class="nx">getSecret</span><span class="p">());</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &quot;foo&quot;</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">secret</span><span class="p">.</span><span class="nx">setSecret</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">));</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &quot;foo&quot;</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">secret</span><span class="p">.</span><span class="nx">getSecret</span><span class="p">());</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">secret2</span> <span class="o">=</span> <span class="nx">SecretStore</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &quot;foo&quot;</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">secret2</span><span class="p">.</span><span class="nx">getSecret</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</div>
<div class="section" id="tldr-takeaways">
<h2>TLDR Takeaways</h2>
<ol class="arabic simple">
<li><strong>Lexical scope gives importance to where code is located within the script body.</strong></li>
<li><strong>Free variables are any non-local variable which the function body has access to.</strong></li>
<li><strong>The only way for new scopes to be created in JavaScript is through function invocation.</strong></li>
<li><strong>The *this* keyword always refers to the owner of scope from which it is executing.</strong></li>
<li><strong>A closure allows a function to access variables outside of its lexical scope.</strong></li>
</ol>
<table class="docutils footnote" frame="void" id="id8" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td><a class="reference external" href="http://howtonode.org/what-is-this">http://howtonode.org/what-is-this</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id9" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td><a class="reference external" href="http://en.wikipedia.org/wiki/Free_variable">http://en.wikipedia.org/wiki/Free_variable</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id10" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id3">[3]</a></td><td><a class="reference external" href="http://en.wikipedia.org/wiki/Factory_method_pattern">http://en.wikipedia.org/wiki/Factory_method_pattern</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id11" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id4">[4]</a></td><td><a class="reference external" href="https://github.com/jquery/jquery/blob/master/src/core.js#L685">https://github.com/jquery/jquery/blob/master/src/core.js#L685</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id12" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id5">[5]</a></td><td><a class="reference external" href="http://msdn.microsoft.com/en-us/magazine/ff696765.aspx">http://msdn.microsoft.com/en-us/magazine/ff696765.aspx</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id13" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id6">[6]</a></td><td><a class="reference external" href="http://groups.google.com/group/comp.lang.javascript/msg/9f58bd11bd67d937">http://groups.google.com/group/comp.lang.javascript/msg/9f58bd11bd67d937</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id14" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id7">[7]</a></td><td><a class="reference external" href="http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript">http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript</a></td></tr>
</tbody>
</table>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CYA With CSS]]></title>
    <link href="http://heavysixer.github.com/blog/2013/02/21/cya-with-css/"/>
    <updated>2013-02-21T12:27:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/02/21/cya-with-css</id>
    <content type="html"><![CDATA[<div class="section" id="using-design-time-classes-to-polish-your-product">
<h2>Using Design Time Classes To Polish Your Product</h2>
<p>This post is dedicated to <em>CYA</em> with <em>CSS</em>; for the uninitiated CYA means &quot;cover your ass&quot;, and I assume that anyone reading my blog already
knows what CSS is. Just as you can craft the JavaScript on your website to act defensively against unforeseen errors, so too can you use
CSS at the design stage to ensure you don&#8217;t end up with egg on your face post-launch.</p>
<p>A while back, I was viewing the Github&#8217;s source code (man I sound like such a nerd), and I noticed these classes added to their body
tags: &quot;<em>logged_in page-dashboard macintosh  env-production</em>&quot;. Several of these classes are obviously progressive enhancement style
additions meant to change the layout / features of the page based on the visitor&#8217;s browser. In my own sites I often include the controller
and action params into the body tag so that I can scope my JavaScript and CSS executions. Doing this provides a convenient way to namespace
your CSS and JS, without having to worry about polluting the global namespace.</p>
<p>However one of Github&#8217;s additions stuck out at me &quot;env-production&quot;.
I have to imagine that <a class="reference external" href="http://http://warpspire.com/">Kyle Neath</a> was the one who added this to the page, and that he did it because
he wants the site to render differently based on the runtime environment of the sever.</p>
<p>I thought about the possibilities of this technique and figured out that there are probably a whole host of ways to use these
<strong>design time classes</strong>. The use of which would help ensure a polished final project. Here are just a couple of examples of how you
might use them:</p>
<p>1. If you are using a specific grid layout you could set an image to appear as a <cite>background-image</cite> of the body. Doing this would
ensure your page conforms the the correct visual spacing and vertical rhythm. I know that &quot;Blueprint CSS&quot; used to have something like
this back in the day. It might look something like this:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="css"><span class="line"><span class="nt">body</span><span class="nc">.env-development</span> <span class="p">{</span>
</span><span class="line">  <span class="k">background</span><span class="o">:</span> <span class="sx">url(&#39;/assets/grid.png&#39;)</span> <span class="k">no-repeat</span> <span class="k">scroll</span> <span class="k">top</span> <span class="k">left</span> <span class="cp">!important</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><p>2. Often as developers we&#8217;ll mock in a bit of functionality that the design calls for with the intention of making it work later.
Unfortunately, this can mean that dead links get deployed. Here is how you could use a CSS selector and a design time class to
color code all the links <em>without</em> a href attribute. This example adds a gaudy eye-searing color to all the dead links, to ensure you
fix it before you deploy into production.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="css"><span class="line"><span class="nt">body</span><span class="nc">.env-development</span> <span class="p">{</span>
</span><span class="line">  <span class="n">a</span><span class="o">:</span><span class="n">not</span><span class="p">([</span><span class="n">href</span><span class="p">])</span> <span class="err">{</span>
</span><span class="line">    <span class="k">color</span><span class="o">:</span><span class="m">#00FF00</span> <span class="cp">!important</span><span class="p">;</span>
</span><span class="line">    <span class="k">background-color</span><span class="o">:</span><span class="m">#ff00ff</span> <span class="cp">!important</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="err">}</span>
</span></code></pre></td></tr></table></div></figure><p>The best thing about design time classes is that because they are properly scoped to the body they just <em>disappear</em> in the production
environment. This means you don&#8217;t have to worry about them being seen by the end user.</p>
<p>If you are using Rails it&#8217;s a pretty straight forward process to get these classes into your application.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="haml"><span class="line"><span class="nt">%body</span><span class="p">{</span> <span class="ss">:class</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">app_classes</span><span class="si">}</span>&quot; }
</span></code></pre></td></tr></table></div></figure><p>In your application helper you&#8217;d add something like this:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="k">def</span> <span class="nf">app_classes</span>
</span><span class="line">  <span class="s2">&quot;</span><span class="si">#{</span><span class="no">Rails</span><span class="o">.</span><span class="n">env</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">params</span><span class="o">[</span><span class="ss">:controller</span><span class="o">].</span><span class="n">gsub</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span><span class="s1">&#39; &#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">params</span><span class="o">[</span><span class="ss">:action</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class="line"><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure><ol class="arabic simple" start="3">
<li>Kyle suggested over twitter that another good use is to <a class="reference external" href="https://twitter.com/kneath/status/304706570246299648/photo/1">change the favicon</a> based on the server environment.</li>
</ol>
</div>
<div class="section" id="more-to-come">
<h2>More To Come</h2>
<p>Do you use Design time classes? If so what are they, share them in the comments or as a gist and maybe we can develop a nice resource
of helpful snippets for others.</p>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Jigs]]></title>
    <link href="http://heavysixer.github.com/blog/2013/02/18/javascript-jigs/"/>
    <updated>2013-02-18T09:06:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/02/18/javascript-jigs</id>
    <content type="html"><![CDATA[<p>In the excellent book &quot;The Pragmatic Programmer: From Journeyman to Master&quot; Hunt and Thomas use the metaphor of a wood worker&#8217;s jig to describe
how a smart programmer reduces the repetitive nature of coding by creating reusable templates or code generators:</p>
<blockquote>
&quot;When woodworkers are faced with the task of producing the same thing over and over, they cheat. They build themselves a jig or a template.
If they get the jig right once, they can reproduce a piece of work time after time. The jig takes away complexity and reduces the chances
of making mistakes, leaving the craftsman free to concentrate on quality.&quot;</blockquote>
<p>To be a jig the solution is highly specific and good for one task, for example making a complex cut. At first you might
want to conflate jigs and design patterns together, because they are both reusable solutions to a problem. Jigs are precise where design
patterns are generalized. While Hunt and Thomas said jigs are generators, I will use them in the context of helpers, friendly little functions
or classes that do one thing well. Many of the most popular JavaScript libraries started as a collection of jigs. Prototype and JQuery for
example, were initially just a collection of reusable snippets that acted like speed-boosts, and shortcuts for discrete problems.</p>
<p>What follows are a collection of jigs that are useful in modern JavaScript applications.</p>
<div class="section" id="self-executing-functions">
<h2>Self Executing Functions</h2>
<p>The immediately invoked function expression (IIFE) is one jig you will see various libraries and frameworks use repeatedly. In its most basic form it can be
written in a couple of ways</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="p">;(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">})();</span>
</span><span class="line">
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="p">;</span><span class="o">-</span><span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="p">;</span><span class="o">+</span><span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="p">;</span><span class="o">~</span><span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Not Recommended</span>
</span><span class="line"><span class="p">;</span><span class="k">void</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Not Recommended</span>
</span><span class="line"><span class="p">;</span><span class="k">delete</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}();</span>
</span></code></pre></td></tr></table></div></figure><p>The beauty of the IIFE is that it uses a unary expression to coerce a function declaration, which would normally need to be explicitly called
into a function expression that can self-execute. Behind the scenes JavaScript is running a unary operation on the function declaration, the
result of that operation is the function expression, which is immediately invoked with the trailing parentheses &quot;()&quot;. Besides being elegant code
the IIFE also affords the following:</p>
<ul class="simple">
<li>It provides a closure which prevents naming conflicts</li>
<li>It provides elegant block scoping</li>
<li>It prevents pollution of the global namespace.</li>
<li>It promotes the developer to think in terms of modular code.</li>
</ul>
<p>One other point worth mentioning is the use of the semicolon prepending the statement. Adding this provides a bit of defensive programming
against other malformed modules that might have a trailing semicolon. If this were just a function declaration it would be absorbed into the
preceding module. This can often occur when multiple scripts are concatenated together as part of a deploy process. It is highly recommended
that you follow this convention to protect yourself against mystery bugs in production.</p>
</div>
<div class="section" id="modules">
<h2>Modules</h2>
<p>Modules are very common is many programming languages, though JavaScript doesn&#8217;t have a native representation for them. As such other developers
have developed a spec for encapsulating your code inside a reusable module. The following code is based off an example in the &quot;Principles of
Writing Consistent, Idiomatic JavaScript&quot; <a class="footnote-reference" href="#id3" id="id1">[1]</a>.</p>
<p>There are a couple of elements that should be called out in this jig:</p>
<ul class="simple">
<li>We see two different examples of the self executing function jig being used. This is to ensure proper closure around the module itself and the
initializer function that adds it to the global namespace.</li>
<li>Invoking this function returns an object with a bound reference to the private variable &quot;data&quot;. This allows the developer to enforce
the use of getters and setters for access to the data variable.</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">(</span><span class="nx">global</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">Module</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// Mostly Private Variable</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="s1">&#39;secret&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">    <span class="k">return</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">      <span class="nx">bool</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class="line">      <span class="nx">string</span><span class="o">:</span> <span class="s1">&#39;a string&#39;</span><span class="p">,</span>
</span><span class="line">      <span class="nx">array</span><span class="o">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">],</span>
</span><span class="line">      <span class="nx">object</span><span class="o">:</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">lang</span><span class="o">:</span> <span class="s2">&quot;en-Us&quot;</span>
</span><span class="line">      <span class="p">},</span>
</span><span class="line">      <span class="nx">getData</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="nx">data</span><span class="p">;</span>
</span><span class="line">      <span class="p">},</span>
</span><span class="line">      <span class="nx">setData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="p">(</span><span class="nx">data</span> <span class="o">=</span> <span class="nx">value</span><span class="p">);</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">    <span class="p">};</span>
</span><span class="line">  <span class="p">})();</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// expose our module to the global object</span>
</span><span class="line">  <span class="nx">global</span><span class="p">.</span><span class="nx">Module</span> <span class="o">=</span> <span class="nx">Module</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="p">}(</span><span class="k">this</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></div>
<div class="section" id="safeeval">
<h2>safeEval</h2>
<p>The eval function and its siblings setTimeout, setInterval and Function all have access to the JavaScript compiler, which means it is a bit
like running with scissors. Since eval typically does more harm than good people try to work around it as much as possible. This jig does just
that giving you eval like features without calling the function.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// A string representation of an a object similar to what you might get with JSON.</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">dataString</span> <span class="o">=</span> <span class="s1">&#39;{&quot;foo&quot;:&quot;bar&quot;}&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">(</span><span class="nx">global</span><span class="p">,</span> <span class="nx">data</span><span class="p">){</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// the variable name provided is replaced with the evaluated code.</span>
</span><span class="line">    <span class="nx">global</span><span class="p">[</span><span class="nx">data</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Function</span><span class="p">(</span><span class="s2">&quot;return&quot;</span> <span class="o">+</span> <span class="nx">global</span><span class="p">[</span><span class="nx">data</span><span class="p">])()</span>
</span><span class="line"><span class="p">}(</span><span class="k">this</span><span class="p">,</span> <span class="s2">&quot;dataString&quot;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// dataString is now Object {foo: &quot;bar&quot;}</span>
</span></code></pre></td></tr></table></div></figure></div>
<div class="section" id="pubsub">
<h2>PubSub</h2>
<p>PubSub is short for a publish-subscribe message system, where objects ask to receive messages that are broadcast by publishers. The main
advantage of PubSub is that the subscribers are loosely coupled allowing just about any object to publish and subscribe to messages. PubSub
systems also have been proven to scale much nicer that tightly coupled client / server paradigms. This implementation of PubSub was written
by Ben Alman and can be download from his Github account <a class="footnote-reference" href="#id4" id="id2">[2]</a>. Let&#8217;s take a look at this jig in detail. Again, the first thing you should
notice is that this jig uses the IIFE jig too (see a pattern yet?). This jig does depend on jQuery for access to the &quot;on&quot;,&quot;off&quot;, and &quot;trigger&quot;
functions. This jig stores an internal list of subscribers as keys of the internal object &quot;o&quot;. When a message is broadcast all the subscribers
have the arguments supplied by the publisher transferred to them.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="p">;(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">  <span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="nx">$</span><span class="p">({});</span>
</span><span class="line">
</span><span class="line">  <span class="nx">$</span><span class="p">.</span><span class="nx">subscribe</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">o</span><span class="p">.</span><span class="nx">on</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">
</span><span class="line">  <span class="nx">$</span><span class="p">.</span><span class="nx">unsubscribe</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">o</span><span class="p">.</span><span class="nx">off</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">
</span><span class="line">  <span class="nx">$</span><span class="p">.</span><span class="nx">publish</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">o</span><span class="p">.</span><span class="nx">trigger</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="p">}(</span><span class="nx">jQuery</span><span class="p">));</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Usage Examples</span>
</span><span class="line"><span class="c1">// Creates a &quot;named&quot; logging function.</span>
</span><span class="line">
</span><span class="line"><span class="kd">function</span> <span class="nx">createLogger</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// Skip the first argument (event object) but log the name and other args.</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">);</span>
</span><span class="line">  <span class="p">};</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Subscribe to the &quot;foo&quot; topic (bind to the &quot;foo&quot; event, no namespace).</span>
</span><span class="line"><span class="nx">$</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="nx">createLogger</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">));</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Subscribe to the &quot;foo.bar&quot; topic (bind to the &quot;foo&quot; event, &quot;bar&quot; namespace).</span>
</span><span class="line"><span class="nx">$</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="s1">&#39;foo.bar&#39;</span><span class="p">,</span> <span class="nx">createLogger</span><span class="p">(</span><span class="s1">&#39;foo.bar&#39;</span><span class="p">));</span>
</span><span class="line">
</span><span class="line"><span class="cm">/*</span>
</span><span class="line"><span class="cm"> * logs:</span>
</span><span class="line"><span class="cm"> * foo 1 2</span>
</span><span class="line"><span class="cm"> * foo.bar 1 2</span>
</span><span class="line"><span class="cm"> * foo.baz 1 2</span>
</span><span class="line"><span class="cm"> */</span>
</span><span class="line"><span class="nx">$</span><span class="p">.</span><span class="nx">publish</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]);</span>
</span><span class="line">
</span><span class="line"><span class="cm">/*</span>
</span><span class="line"><span class="cm"> * logs:</span>
</span><span class="line"><span class="cm"> * foo.bar 3 4</span>
</span><span class="line"><span class="cm"> */</span>
</span><span class="line"><span class="nx">$</span><span class="p">.</span><span class="nx">publish</span><span class="p">(</span><span class="s1">&#39;foo.bar&#39;</span><span class="p">,</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure></div>
<div class="section" id="your-jigs-go-here">
<h2>Your Jigs Go Here</h2>
<p>Please send me your favorite jigs. I would love to expand this post with more great Jigs.</p>
</div>
<div class="section" id="footnotes">
<h2>Footnotes</h2>
<table class="docutils footnote" frame="void" id="id3" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td><a class="reference external" href="https://github.com/rwldrn/idiomatic.js/">https://github.com/rwldrn/idiomatic.js/</a></td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td><a class="reference external" href="https://github.com/cowboy/jquery-tiny-pubsub">https://github.com/cowboy/jquery-tiny-pubsub</a></td></tr>
</tbody>
</table>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Functions Explained]]></title>
    <link href="http://heavysixer.github.com/blog/2013/02/15/functions-explained/"/>
    <updated>2013-02-15T12:10:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/02/15/functions-explained</id>
    <content type="html"><![CDATA[<div class="section" id="a-deep-dive-into-javascript-functions">
<h2>A Deep Dive into JavaScript Functions</h2>
<p>Based on my readership I have to assume most of you are familiar with JavaScript already. Therefore, it may seem odd to include a post on functions. After all, they are
one of the most rudimentary components of JavaScript. My assertion is this, just as a person can speak a language without the ability to read
or write it, so too can developers use functions in JavaScript and yet be blissfully unaware of their complexities.</p>
<p>Typically developers only become aware of the specifics of functions when something they wrote explodes in their face. My goal in this section
is to expose the intricacies of JavaScript functions to you, which will hopefully save you from having to pull syntactic shrapnel from your
codebase.</p>
<p>A word of caution before we begin; JavaScript is only as good as its interpreter. While the concepts we&#8217;ll consider are well-covered in
the language spec, it does not mean that all runtime environments will work the same way. In other words your milage may vary. This section will
discuss common misconceptions of JavaScript functions, and the silent bugs they introduce. However, debugging functions in detail is not
covered. Fortunately, debugging has been documented by others in the JavaScript community especially in Juriy Zaytsev&#8217;s excellent article &quot;Named
Function Expressions Demystified&quot; <a class="footnote-reference" href="#id2" id="id1">[1]</a>.</p>
</div>
<div class="section" id="blocks-in-javascript">
<h2>Blocks in JavaScript</h2>
<p>Before we can understand functions in JavaScript we have to understand blocks. JavaScript blocks are nothing more than statements grouped
together. Blocks start with a left curly bracket &quot;{&quot; and end with a right one &quot;}&quot;. Simply put, <strong>blocks allow statements inside the brackets
to be executed together</strong>. Blocks form the most basic control structure in JavaScript. The following are a few examples of how blocks in
JavaScript:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Block as an anonymous self-executing function</span>
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">triumph</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span>
</span><span class="line">        <span class="nx">cake</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span>
</span><span class="line">        <span class="nx">satisfaction</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span><span class="line">        <span class="nx">isLie</span><span class="p">,</span>
</span><span class="line">        <span class="nx">note</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// Block used as part of function expression</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">isLie</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="nx">val</span> <span class="o">===</span> <span class="kc">false</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// Block used as part of a conditional statement</span>
</span><span class="line">    <span class="k">if</span> <span class="p">(</span><span class="nx">isLie</span><span class="p">(</span><span class="nx">cake</span><span class="p">))</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">triumph</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line">        <span class="nx">makeNote</span><span class="p">(</span><span class="s1">&#39;huge success&#39;</span><span class="p">);</span>
</span><span class="line">        <span class="nx">satisfaction</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// Block used as part of a function declaration</span>
</span><span class="line">    <span class="kd">function</span> <span class="nx">makeNote</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">note</span> <span class="o">=</span> <span class="nx">message</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}();</span>
</span></code></pre></td></tr></table></div></figure><p>As we saw above, functions are essentially <em>named blocks</em>, which the developer can invoke on demand. This is easy to demonstrate:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// The inline conditional block statement is executed only once per cycle.</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">isLie</span><span class="p">(</span><span class="nx">cake</span><span class="p">))</span> <span class="p">{</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">function</span> <span class="nx">makeNote</span><span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="p">...</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// The function declaration is executed as many times as it is called.</span>
</span><span class="line"><span class="nx">makeNote</span><span class="p">(</span><span class="s2">&quot;Moderate Success&quot;</span><span class="p">);</span>
</span><span class="line"><span class="nx">makeNote</span><span class="p">(</span><span class="s2">&quot;Huge Success&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></div>
<div class="section" id="function-arguments">
<h2>Function Arguments</h2>
<p>Functions like control flow statements (if, for, while etc.) can be initialized by passing arguments into the function body. In JavaScript
variables are either a <strong>complex type</strong> (e.g. Object, Array) or a <strong>primitive type</strong> (e.g. String, Integer). When a complex object is supplied
as an argument it is <strong>passed by reference</strong> to the function body. Instead of sending a copy of the variable, JavaScript sends a pointer to its
location in memory. Conversely, when passing a primitive type to a function JavaScript <strong>passes by value</strong>. This difference can lead to subtle bugs
because conceptually we often treat functions as a black box, and assume they can only effect the enclosing scope by returning a variable.
With pass by reference, the argument object is modified even though it may not returned by the function. Pass by reference and pass by value
are demonstrated below:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">object</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">    <span class="s1">&#39;foo&#39;</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span>
</span><span class="line"><span class="p">},</span>
</span><span class="line"><span class="nx">num</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Passed by reference</span>
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">obj</span><span class="p">.</span><span class="nx">foo</span> <span class="o">=</span> <span class="s1">&#39;baz&#39;</span><span class="p">;</span>
</span><span class="line"><span class="p">}(</span><span class="nx">object</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; Object {foo: &quot;baz&quot;}</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">object</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Passed by value;</span>
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">num</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span><span class="line"><span class="p">}(</span><span class="nx">num</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; 1</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">num</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></div>
<div class="section" id="function-types">
<h2>Function Types</h2>
<p>Now that we have a better understanding of blocks, and arguments lets dive deeper into <strong>Function Declaration</strong> and <strong>Function Expression</strong>,
the two types of functions used in JavaScript. To the casual reader the two appear very similar:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Function Declaration</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">isLie</span><span class="p">(</span><span class="nx">cake</span><span class="p">){</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">cake</span> <span class="o">===</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Function Expression</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">isLie</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">cake</span><span class="p">){</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">cake</span> <span class="o">===</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><p>The only real difference between the two, is when they are evaluated. A function declaration can be accessed by the interpreter as it is being
parsed. The function expression on the other hand is part of an assignment expression, which prevents JavaScript from evaluating it until the
program has completed the assignment. This difference may seem minor, but implications are huge; consider the following example:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// =&gt; Hi, I&#39;m a function declaration!</span>
</span><span class="line"><span class="nx">declaration</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="kd">function</span> <span class="nx">declaration</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hi, I&#39;m a function declaration!&quot;</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; Uncaught TypeError: undefined is not a function</span>
</span><span class="line"><span class="nx">expression</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">expression</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Hi, I&#39;m a function expression!&quot;</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><p>As you can see in the previous example the <em>expression</em> function threw an exception when it was invoked, but the <em>declaration</em> function
executed just fine. This exception gets to the heart of the difference between declaration and expression functions. JavaScript <em>knows</em>
about declaration function and can parse it before the program executes. Therefore, it doesn&#8217;t matter if the program invokes the function
before it is defined. This is because behind the scenes JavaScript has <em>hoisted</em> the function to the top of the current scope. The function
expression is not evaluated until it is assigned to a variable; therefore it is still <em>undefined</em> when invoked. This is why good code style is
to define all variables at the top of the current scope. Had we done this then our script would visually match what JavaScript is doing during
parsetime.</p>
<p>The concept to take away is that <strong>during parsetime JavaScript moves all function declarations to the top of the current scope</strong>. This is why
it doesn&#8217;t matter where declarative functions appear in the script body.</p>
<p>To further explore the distinctions between declarations and expressions, consider the following:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">function</span> <span class="nx">sayHi</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;hi&quot;</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">hi</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">sayHi</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;hello&quot;</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &quot;hello&quot;</span>
</span><span class="line"><span class="nx">hi</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; &#39;hi&#39;</span>
</span><span class="line"><span class="nx">sayHi</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure><p>Casually reading this code, one might assume that the declaration function would get clobbered because it function expression has an identical
name. However, since the second function is part of an assignment expression it is given its own scope, and JavaScript treats them as seperate
entities. To make things even more confusing look at this example:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">sayHo</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; function</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="p">(</span><span class="nx">sayHey</span><span class="p">))</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; undefined</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="p">(</span><span class="nx">sayHo</span><span class="p">))</span>
</span><span class="line">
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">function</span> <span class="nx">sayHey</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;hey&quot;</span><span class="p">);</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line">    <span class="nx">sayHo</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">sayHo</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;ho&quot;</span><span class="p">);</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">function</span> <span class="nx">sayHey</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;no&quot;</span><span class="p">);</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line">    <span class="nx">sayHo</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">sayHo</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;no&quot;</span><span class="p">);</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; no</span>
</span><span class="line"><span class="nx">sayHey</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; ho</span>
</span><span class="line"><span class="nx">sayHo</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure><p>In the previous example we saw that functions of the same name were considered different if one was an expression and the other was a
declaration. In this example we are attempting to conditionally define the function based on how the program executes. Reading the script&#8217;s
control flow you&#8217;d expect <em>sayHey</em> to return &quot;hey&quot; since the conditional statement evaluates true. Instead it returns &quot;no&quot;, meaning the second
version of the <em>sayHey</em> function clobbered the first. Even more confusing is that the <em>sayHo</em> function behaves the opposite way! Again, the
difference comes down to parsetime versus runtime.</p>
<p>We already learned that when JavaScript parses the script it collects all of the function declarations and hoists them to the top of the current
scope. When this happens it clobbers the first version of <em>sayHey</em> with the second because they exist in the same scope. This explains why
it returns &quot;no.&quot; We also know that function expressions are ignored by the parser until the assignment process completes. Assignment happens
during runtime, which is also when the conditional statement is evaluated. That explains why the <em>sayHo</em> function was able to be conditionally
defined. The key to remember here is that <strong>function declarations can not be conditionally defined. If you need conditional definition use a function expression</strong>.
Furthermore, <strong>function declarations should NEVER be made inside a control flow statement</strong>, due to the different ways interpreters handle it.</p>
</div>
<div class="section" id="function-scopes">
<h2>Function Scopes</h2>
<p>Unlike many other languages which are scoped to the block, JavaScript is scoped to the function. In Ruby (version 1.9.+) you can write this:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="nx">x</span> <span class="o">=</span> <span class="mi">20</span>
</span><span class="line"><span class="mi">10</span><span class="p">.</span><span class="nx">times</span> <span class="k">do</span> <span class="o">|</span><span class="nx">x</span><span class="o">|</span>
</span><span class="line">
</span><span class="line">  <span class="err">#</span> <span class="o">=&gt;</span> <span class="mi">0</span><span class="p">..</span><span class="mi">9</span>
</span><span class="line">  <span class="nx">puts</span> <span class="nx">x</span>
</span><span class="line"><span class="nx">end</span>
</span><span class="line">
</span><span class="line"><span class="err">#</span> <span class="o">=&gt;</span> <span class="mi">20</span>
</span><span class="line"><span class="nx">puts</span> <span class="nx">x</span>
</span></code></pre></td></tr></table></div></figure><p>What this demonstrates is that each block gets its own scope. Conversely, if we wrote similar code in JavaScript:</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">20</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Functions have their own scope</span>
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// =&gt; &quot;foo&quot;</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; 20</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="k">for</span> <span class="p">(</span><span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">x</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// =&gt; 0..9</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; 10</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure><p>In JavaScript <em>x</em> is available inside the for loop, because as a control statement it belongs to the enclosing scope. This is not intuitive to
many developers used to block level scope. JavaScript handles the need of block level scope at least partially through the use of closures
which we&#8217;ll discuss later.</p>
</div>
<div class="section" id="debugging-functions">
<h2>Debugging Functions</h2>
<p>Before we wrap this topic up, lets briefly touch on debugging functions. In JavaScript naming a function expression is completely optional;
so why do it? The answer is to aid the debugging process. Named function expressions have access to their name within the newly defined scope,
but not in the enclosing scope. Without a name their anonymous nature can make them feel a bit like ghosts in the machine when it comes to
debugging.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">namedFunction</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">named</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// =&gt; function</span>
</span><span class="line">    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="nx">named</span><span class="p">));</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="nx">namedFunction</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// =&gt; undefined</span>
</span><span class="line"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="nx">named</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure><p>Nameless function expressions will be displayed in the stack trace as &quot;(anonymous function)&quot; or something similar. Naming your function
expression gives you clarity when trying to unwind an exception whose call stack may feel miles long.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="cm">/*</span>
</span><span class="line"><span class="cm"> * It is much harder to debug anonymous function expressions</span>
</span><span class="line"><span class="cm"> * Uncaught boom</span>
</span><span class="line"><span class="cm"> *    - (anonymous function)</span>
</span><span class="line"><span class="cm"> *    - window.onload</span>
</span><span class="line"><span class="cm"> */</span>
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span><span class="p">(){</span>
</span><span class="line">    <span class="k">throw</span><span class="p">(</span><span class="s2">&quot;boom&quot;</span><span class="p">);</span>
</span><span class="line"><span class="p">}();</span>
</span><span class="line">
</span><span class="line"><span class="cm">/*</span>
</span><span class="line"><span class="cm"> * Naming your function expressions give you a place to start looking when debuggin.</span>
</span><span class="line"><span class="cm"> * Uncaught boom</span>
</span><span class="line"><span class="cm"> *    - goBoom</span>
</span><span class="line"><span class="cm"> *    - window.onload</span>
</span><span class="line"><span class="cm"> */</span>
</span><span class="line"><span class="p">;</span><span class="o">!</span><span class="kd">function</span> <span class="nx">goBoom</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">throw</span><span class="p">(</span><span class="s2">&quot;boom&quot;</span><span class="p">)</span>
</span><span class="line"><span class="p">}();</span>
</span></code></pre></td></tr></table></div></figure><table class="docutils footnote" frame="void" id="id2" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td><a class="reference external" href="http://kangax.github.com/nfe/">http://kangax.github.com/nfe/</a></td></tr>
</tbody>
</table>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pragmatic JavaScript Style]]></title>
    <link href="http://heavysixer.github.com/blog/2013/02/15/pragmatic-javascript-style/"/>
    <updated>2013-02-15T09:08:00-06:00</updated>
    <id>http://heavysixer.github.com/blog/2013/02/15/pragmatic-javascript-style</id>
    <content type="html"><![CDATA[<p>My goal is to make you a better programmer, and I am going to do this by teaching you about style. I am not talking about fashion, because I
think most programmers would flunk that test; unless, comic-con couture is a thing. Instead we&#8217;ll talk about the importance of style, how it
forms, how it spreads and when to kill it. Specifically, we&#8217;ll look at style as it applies to programming. Ultimately, once we have a context
for evaluating style I will introduce you to elements of programmatic style which have served me well over the years as a professional
software developer.</p>
<div class="section" id="what-is-style">
<h2>What Is Style?</h2>
<p>Style is often used as a measurement of quality. When someone is described as having style or being stylish, it is almost universally meant as
a complement. If someones&#8217; style ever comes into question it is usually in comparison to someone else&#8217;s style. &quot;My style&#8217;s the best and so I
challenge you&quot; screams 70&#8217;s era martial arts star.</p>
<p>Stylishness is a fresh approach, a unique perspective, an unexpected insight into an activity. The application of a style can become so
prominent that it expands the activity itself; that house is built in a Frank Lloyd Wright style. What starts as a personal style in painting
can become an art movement almost overnight. Style spreads like a virus, it is the original meme, a mind virus that changes the way you see
the world forever. Style is often the conduit where new ideas pulsate.</p>
<p>How does style effect programmers? Well the good news about style for those algorithmically inclined is that, no matter how personal a style
may seem, for it to exist it all, it must at some level be repeatable. Style must be codified into a series of steps, rules or combinations
that can be followed, and then recognized by others. Therefore if style is a measurement of quality, and at the same time repeatable then it
can be taught. Just ask Strunk and White.</p>
<p>William Strunk Jr. wrote &quot;The Elements of Style&quot; while he was a professor at Cornell. He began with 7 rules for the usage of language, and 11
principles of composition. His student E.B. White revised the book forty years later, by adding an additional 4 rules. The goal of the book
was to give aspiring writers and grammarians a context from which to evaluate their own work.</p>
<p>According to White, Strunk was compelled to write the &quot;little book&quot; out of sympathy for those afflicted with reading the writer&#8217;s ill-composed
dreck: &quot;Will felt that the reader was in serious trouble most of the time, floundering in a swamp and that it was the duty of anyone
attempting to write English to drain the swap quickly and get the reader up on dry ground, or at least throw a rope.&quot;</p>
<p>Over the years the book has remained wildly popular by those learning to write efficiently, and is affectionately referred to as &quot;Strunk and
White.&quot; That is not to say it has been universally loved or followed. Dorothy Parker is quoted in the New York Times as saying &quot;If you have
any young friends who aspire to become writers, the second-greatest favor you can do them is to present them with copies of &#8216;The Elements of
Style.&#8217; The first-greatest, of course, is to shoot them now, while they&#8217;re happy.&quot;</p>
<p>Many found the rules too restrictive, and opinionated. White said Strunk believed &quot;&#8230;it was worse to be irresolute than to be wrong.&quot;
Strunk&#8217;s assertions is that it takes passion to be stylish. You need to be able to draw boundaries, to allow this idea to flourish while
forcing that one to die. Style is a sine wave attracting some and repelling others.</p>
</div>
<div class="section" id="what-is-programmatic-style">
<h2>What is programmatic style?</h2>
<p>As mentioned previously, Stunk and White wrote their book not only to empower and train writers, but to save readers from slogging through
what was in their minds a textual tar pit. So too, good programmatic style services two audiences, the developer and the processor. That is
to say that the code should be well-written, both syntactically, and technically. Below are qualities I consider essential in application
of programmatic style:</p>
<p><strong>Consistency</strong> - By repeatedly applying rules to the codebase we ensure consistency. Consistency, mitigates noise in the codebase, and
brings the intent of the code into clearer focus. Put another way, if a developer is trying to piece together how to read your code, you have
prevented them from understanding what it does. Consistency is concerned with how the code looks, e.g. naming conventions, use of whitespace,
and method signatures; and how the code is written for example ensuring that all functions don&#8217;t return a string in one context and an integer
in another.</p>
<p><strong>Expressiveness</strong> - Code is by nature a symbolic language, where variability and abstractness is implicit. Therefore the developer must find a
way to make the code meaningful to the reader. This can be archived though naming variables and methods precisely. When reviewing a class,
method or variable the reader should understand the roles and responsibilities of the code by reading the code itself. If a method can only
be understood by reading the comments above left by the writer it should be a clue that the code is not expressive.</p>
<p><strong>Succinctness</strong> - Strive to do just enough. Good programming like good writing is  about clarity of purpose, and not merely
compactness. It should be about reducing the complexity of a method, not it&#8217;s usefulness.</p>
<p><strong>Restraint</strong> - Style should never overpower the subject itself. At that point style becomes the
subject it becomes a facile artifice, a dish ruined by too much spice. I am reminded of a minimalist chess set I saw in college every piece
was either a white or black cube, and all pieces were the same size. It was aesthetically beautiful and simultaneously unplayable.</p>
</div>
<div class="section" id="javascript-style-guide">
<h2>JavaScript Style Guide</h2>
<p>This style guide was compiled by compiling, reviewing and considering choices I have made in my own work over the years, and coding practices
of individuals, and development teams I admire in the JavaScript community. As such this style guide should be seen as an amalgamation of
inputs and influences from the larger JavaScript community rather than the creative output of a singular individual. You can find a list of
resources used in this guide in the additional resources section. This guide is broken into two sections: &quot;Rules for Visual Clarity&quot; and
&quot;Rules for Computational Effectiveness&quot;.</p>
</div>
<div class="section" id="caveats">
<h2>Caveats</h2>
<p>Style guides are just that guides, they are meant to point you in the right direction, but they are at best mutable truth. Moreover,  coding
theory changes constantly and it is important not to lock yourself into a dogmatic approach to the application of these styles. As my
professor Clyde Fowler told me in my studio drawing class, &quot;you must think with your hands&quot;, and what he meant by that was you must think
through doing, while maintaining the ability to get critical distance from your work.</p>
</div>
<div class="section" id="rules-for-clarity-how-others-see-code">
<h2>Rules for Clarity - How others see code</h2>
<div class="section" id="rules-of-thumb">
<h3>Rules Of Thumb</h3>
<ul class="simple">
<li><strong>Write Clearly And Expressively</strong> - When naming variables, functions, or organizing code remember you are writing for humans to read it
not compilers.</li>
<li><strong>Following Existing Conventions</strong> - If you share your code anywhere, work on a team, or are hired to write code, then you are not writing
for yourself</li>
<li><strong>Write in Only One Language</strong> - Where possible don&#8217;t use JavaScript as a surrogate for other languages.
This means resisting the urge to write inline HTML, or CSS where possible.</li>
<li><strong>Enforce A Uniform Column Width</strong> - Strive for consistent line lengths in source code. Long lines tire the eyes, and cause needless
horizontal scrolling. An industry standard is 80 characters per line.</li>
</ul>
</div>
<div class="section" id="document-formatting">
<h3>Document Formatting</h3>
<ol class="arabic simple">
<li>Naming Conventions</li>
</ol>
<p>JavaScript is a terse language of brackets, and symbols and one of the only way to make your code expressive to humans is through the names
you choose for variables, functions and classes among others. Remember when choosing a name it should describe the role and responsibilities
of that object. Vague or obtuse names like <em>doStuff</em> is like telling the reader <em>you figure it out</em>, which often times they won&#8217;t.</p>
<ul class="simple">
<li>Choose variables and functions with meaningful, expressive and descriptive names. Write for the reader not the compiler.</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span><span class="line">    <span class="nx">aa</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">aaa</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="s1">&#39;&#39;</span> <span class="o">+</span> <span class="nx">aaa</span><span class="p">;</span>
</span><span class="line">    <span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">count</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
</span><span class="line">    <span class="nx">toString</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="s1">&#39;&#39;</span> <span class="o">+</span> <span class="nx">num</span><span class="p">;</span>
</span><span class="line">    <span class="p">};</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Constants should always belong to a namespace, and be written in uppercase with spaces replaced with underscores</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="nx">MY_CONSTANT</span> <span class="o">=</span> <span class="mi">43</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="nx">com</span><span class="p">.</span><span class="nx">humansized</span><span class="p">.</span><span class="nx">MY_CONSTANT</span> <span class="o">=</span> <span class="mi">43</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Variables should be CamelCase</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="nx">myVariableName</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Classes should be PascalCase</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="nx">MyAwesomeClass</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Functions should be CamelCase</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="nx">isLie</span><span class="p">(</span><span class="nx">cake</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Namespaces should be CamelCase and use periods as a delimiter</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="nx">com</span><span class="p">.</span><span class="nx">site</span><span class="p">.</span><span class="nx">namespace</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Hungarian notation is not required but you can use it to convey they are objects constructed through or dependent on a library or framework</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// JQuery infused variable</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">$listItem</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;li:first&quot;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Angular.js uses the dollar sign to refer to angular-dependent variables</span>
</span><span class="line"><span class="nx">$scope</span><span class="p">,</span> <span class="nx">$watch</span><span class="p">,</span> <span class="nx">$filter</span>
</span></code></pre></td></tr></table></div></figure><ol class="arabic simple" start="2">
<li>Constants And Variables</li>
</ol>
<ul class="simple">
<li>Variables and constants definitions always go at the top of the scope</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">iterate</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">limit</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class="line">    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">x</span> <span class="o">&lt;</span> <span class="nx">limit</span><span class="p">;</span> <span class="nx">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">iterate</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">limit</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
</span><span class="line">        <span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">    <span class="k">for</span> <span class="p">(</span><span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">x</span> <span class="o">&lt;</span> <span class="nx">limit</span><span class="p">;</span> <span class="nx">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Avoid polluting the global namespace by always declaring variables using <em>var</em></li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="nx">foo</span> <span class="o">=</span> <span class="s1">&#39;bar&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="s1">&#39;bar&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Declare multiple variables using a single var declaration, but separate each variable with a newline</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">;</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">note</span> <span class="o">=</span> <span class="nx">makeNote</span><span class="p">(</span><span class="s1">&#39;Huge Success&#39;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">note</span> <span class="o">=</span> <span class="nx">makeNote</span><span class="p">(</span><span class="s1">&#39;Huge Success&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Declare unassigned variables last. This allows the reader to know they are needed but have delayed initialization.</li>
<li>Do not assign variables inside a conditional statement, it often masks errors.</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad because it is easily misread as an equality test.</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">foo</span> <span class="o">=</span> <span class="nx">bar</span><span class="p">)</span> <span class="p">{...}</span>
</span></code></pre></td></tr></table></div></figure><ul class="simple">
<li>Do not clobber arguments with variables names.</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">addByOne</span><span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">num</span> <span class="o">=</span> <span class="nx">num</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">num</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">addByOne</span><span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">var</span> <span class="nx">newNum</span> <span class="o">=</span> <span class="nx">num</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">newNum</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><ol class="arabic simple" start="3">
<li>Page Layout</li>
</ol>
<ul>
<li><p class="first">Blank lines</p>
<ul>
<li><p class="first">Should always proceed the start of a comment</p>
</li>
<li><p class="first">Should be used to separate logically related code</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="o">=</span> <span class="nx">wheels</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="nx">wheels</span><span class="p">.</span><span class="nx">clean</span><span class="p">()</span>
</span><span class="line">
</span><span class="line"> <span class="nx">car</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">wheels</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="nx">truck</span><span class="p">.</span><span class="nx">drive</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="o">=</span> <span class="nx">wheels</span><span class="p">;</span>
</span><span class="line"><span class="nx">wheels</span><span class="p">.</span><span class="nx">clean</span><span class="p">()</span>
</span><span class="line"> <span class="nx">car</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">wheels</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="nx">truck</span><span class="p">.</span><span class="nx">drive</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</li>
<li><p class="first">Commas</p>
<ul>
<li><p class="first">Remove trailing comments in object declarations. It will break some runtime environments.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">bar</span><span class="o">:</span> <span class="s1">&#39;baz&#39;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">foo</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">bar</span><span class="o">:</span> <span class="s1">&#39;baz&#39;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">foo</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Don&#8217;t use comma first formatting, if you don&#8217;t know what that means keep it that way!</p>
</li>
</ul>
</li>
<li><p class="first">Semicolons</p>
<ul class="simple">
<li>Even though JavaScript determines semicolons to be optional many compilers expect them, therefore it is better to use them.</li>
<li>Useful for clearly delineating the end of a logical statement</li>
<li>Do not add meaningless semicolons</li>
</ul>
</li>
<li><p class="first">Whitespace</p>
<ul>
<li><p class="first">Should be removed from the end of a line</p>
</li>
<li><p class="first">Should be removed from a blank line</p>
</li>
<li><p class="first">Should not mix spaces and tabs</p>
</li>
<li><p class="first">Should appear after each comma in a function declaration</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">findUser</span><span class="p">(</span><span class="nx">foo</span><span class="p">,</span><span class="nx">bar</span><span class="p">,</span><span class="nx">baz</span><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">findUser</span><span class="p">(</span><span class="nx">foo</span><span class="p">,</span> <span class="nx">bar</span><span class="p">,</span> <span class="nx">baz</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Should not appear inside empty functions or literals</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="nx">doThis</span><span class="p">();</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">arr</span> <span class="o">=</span> <span class="p">[];</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</li>
<li><p class="first">Brackets And Braces</p>
<ul>
<li><p class="first">Use only where the compiler calls for it or where it enhances readability</p>
</li>
<li><p class="first">Brackets should appear on the line that requires them</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">hidden</span><span class="p">)</span>
</span><span class="line"><span class="p">{</span>
</span><span class="line"> <span class="p">...</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">hidden</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Add whitespace in front and between brackets to aid readability.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">condition</span><span class="p">)</span> <span class="nx">goTo</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">condition</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">goTo</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">There are a couple of exception to the previous rule</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// No Whitespace needed when there is a single argument</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">foo</span><span class="p">)</span> <span class="p">...</span>
</span><span class="line">
</span><span class="line"><span class="c1">// No whitespace when a parenthesis is used as a scope container</span>
</span><span class="line"><span class="p">;(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{...})</span>
</span><span class="line">
</span><span class="line"><span class="c1">// No white space when brackets are used as a function argument</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">sortThis</span><span class="p">([</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">1</span><span class="p">])</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</li>
<li><p class="first">Strings</p>
<ul>
<li><p class="first">String should be constructed using single quotes</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="s2">&quot;Bar&quot;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="s1">&#39;Bar&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Strings longer than the pre-determined character line limit should be reconsidered, if required they should be concatenated</p>
</li>
</ul>
</li>
<li><p class="first">Functions</p>
<ul class="simple">
<li>Method signatures must be consistent. If a function returns a variable in one context it should return a variable in all contexts</li>
</ul>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">findFoo</span><span class="p">(</span><span class="nx">isFoo</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="p">(</span> <span class="nx">isFoo</span> <span class="o">===</span> <span class="kc">true</span> <span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">findFoo</span><span class="p">(</span><span class="nx">isFoo</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="p">(</span> <span class="nx">isFoo</span> <span class="o">===</span> <span class="kc">true</span> <span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure><ul>
<li><p class="first">While not a requirement, returning early from a function can make the intent more clear</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">findFoo</span><span class="p">(</span><span class="nx">isFoo</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="k">if</span> <span class="p">(</span> <span class="nx">isFoo</span> <span class="o">===</span> <span class="kc">true</span> <span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</li>
<li><p class="first">Comments</p>
<ul>
<li><p class="first">Should never trail a statement</p>
</li>
<li><p class="first">Comments should be used sparingly, overuse of comments should suggest to the developer that their code is not expressive enough.</p>
</li>
<li><p class="first">Comments should aways be written as a complete thought.</p>
</li>
<li><p class="first">Multiline comments should always use the multiline syntax</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Some really</span>
</span><span class="line"><span class="c1">// bad multiline comment</span>
</span><span class="line">
</span><span class="line"><span class="cm">/**</span>
</span><span class="line"><span class="cm"> * A well-formed multiline comment</span>
</span><span class="line"><span class="cm"> * so there...</span>
</span><span class="line"><span class="cm"> */</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="section" id="rules-for-computational-effectiveness">
<h2>Rules for Computational Effectiveness</h2>
<div class="section" id="id1">
<h3>Rules Of Thumb</h3>
<ul class="simple">
<li><strong>Assume File Will Be Concatenated</strong> - Modern applications often munge source JavaScript into a streamline file for production. You should
defensively program your scripts to protect from switches in operation context and scope corruption.</li>
<li><strong>Keep your code browser agnostic</strong> - Keep your business logic free of browser specific code by abstracting them into interfaces. This will
keep your code on a clean upgrade path as browser fall in and out of fashion.</li>
<li><strong>Never Use eval()</strong> - Ever</li>
<li><strong>Never Use with()</strong> - Ever</li>
<li><strong>Keep Prototype Pristine</strong> - Never modify the prototype of a builtins like Array.prototype because it can silently break other&#8217;s code which
expect standard behavior.</li>
</ul>
<ol class="arabic simple">
<li>Equality Comparisons And Conditional Evaluation</li>
</ol>
<ul>
<li><p class="first">Use &quot;===&quot; instead of &quot;==&quot; use &quot;!==&quot; instead of &quot;!=&quot; this is because JavaScript is very loose when testing equality.</p>
</li>
<li><p class="first">When just testing for truthiness you can coerce the values</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">foo</span><span class="p">)</span> <span class="p">{...}</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">foo</span><span class="p">)</span> <span class="p">{...}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">When testing for emptiness</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">You must be explicit when testing for truth</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad because all of these will be coerced into true</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">zero</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span><span class="line"><span class="nx">empty</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span class="line"><span class="nx">knull</span> <span class="o">=</span> <span class="kc">null</span><span class="p">,</span>
</span><span class="line"><span class="nx">notANumber</span> <span class="o">=</span> <span class="kc">NaN</span><span class="p">,</span>
</span><span class="line"><span class="nx">notDefined</span>
</span><span class="line">
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">zero</span> <span class="o">||</span> <span class="o">!</span><span class="nx">empty</span> <span class="o">||</span> <span class="o">!</span><span class="nx">knull</span> <span class="o">||</span> <span class="o">!</span><span class="nx">notANumber</span> <span class="o">||</span> <span class="o">!</span><span class="nx">notDefined</span> <span class="p">)</span> <span class="p">...</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">truth</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span>
</span><span class="line"><span class="nx">alsoTrue</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class="line">
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">truth</span> <span class="o">&amp;&amp;</span> <span class="nx">alsoTrue</span><span class="p">)</span> <span class="p">...</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">foo</span> <span class="o">===</span> <span class="kc">true</span><span class="p">)</span> <span class="p">...</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="2">
<li>Constants and Variables</li>
</ol>
<ul>
<li><p class="first">When deleting a variable set it to null instead calling #delete or setting it to undefined</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad because undefined means the variable is useful but as yet has no value</span>
</span><span class="line"><span class="k">this</span><span class="p">.</span><span class="nx">unwanted</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="cm">/**</span>
</span><span class="line"><span class="cm"> * Bad because calling delete is much slower than reassigning a value.</span>
</span><span class="line"><span class="cm"> * The only reason to use delete is if you want to remove the attribute from an objects list of keys.</span>
</span><span class="line"><span class="cm"> */</span>
</span><span class="line"><span class="k">delete</span> <span class="k">this</span><span class="p">.</span><span class="nx">unwanted</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="k">this</span><span class="p">.</span><span class="nx">unwanted</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="3">
<li>Functions</li>
</ol>
<ul>
<li><p class="first">Function Expressions</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Anonymous Function</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">anon</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Named Function</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">named</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">named</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Immediately-invoked function, hides its contents from the executing scope.</span>
</span><span class="line"><span class="p">;(</span><span class="kd">function</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class="line"><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Anonymous functions are defined at parse-time, and therefore do not have their names hoisted to the top of the scope.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad - Runtime Error</span>
</span><span class="line"><span class="nx">iGoBoom</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">iGoBoom</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;boom&#39;</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="nx">iGoBoom</span><span class="p">();</span>
</span><span class="line"><span class="kd">function</span> <span class="nx">iGoBoom</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;boom&#39;</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Do not use function declaration within block statements it is not part of  ECMAScript; instead use a function expression.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">ball</span><span class="p">.</span><span class="nx">is</span><span class="p">(</span><span class="nx">round</span><span class="p">))</span> <span class="p">{</span>
</span><span class="line">    <span class="kd">function</span> <span class="nx">bounce</span><span class="p">(){</span>
</span><span class="line">
</span><span class="line">        <span class="c1">// Statements Continue</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    <span class="k">return</span> <span class="nx">bounce</span><span class="p">()</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="k">if</span> <span class="p">(</span><span class="nx">ball</span><span class="p">.</span><span class="nx">is</span><span class="p">(</span><span class="nx">round</span><span class="p">))</span> <span class="p">{</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">bounce</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">      <span class="c1">// Statements Continue</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Do not hide the native arguments object by using the same name in a function</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">arguments</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">alert</span><span class="p">(</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">));</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">alert</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">));</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="4">
<li>Strings</li>
</ol>
<ul>
<li><p class="first">When concatenating a string use Array#join for performance reasons.</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">lorem</span> <span class="o">=</span> <span class="s1">&#39;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\</span>
</span><span class="line"><span class="s1">Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in\</span>
</span><span class="line"><span class="s1">reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\</span>
</span><span class="line"><span class="s1">culpa qui officia deserunt mollit anim id est laborum.&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">lorem</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&#39;</span><span class="p">,</span>
</span><span class="line"><span class="s1">&#39;Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in&#39;</span><span class="p">,</span>
</span><span class="line"><span class="s1">&#39;reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in&#39;</span><span class="p">,</span>
</span><span class="line"><span class="s1">&#39;culpa qui officia deserunt mollit anim id est laborum.&#39;</span><span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="5">
<li>Objects</li>
</ol>
<ul>
<li><p class="first">Should use object literal vs new Object</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">person</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Object</span><span class="p">();</span>
</span><span class="line"><span class="nx">person</span><span class="p">.</span><span class="nx">firstName</span> <span class="o">=</span> <span class="s2">&quot;John&quot;</span><span class="p">;</span>
</span><span class="line"><span class="nx">person</span><span class="p">.</span><span class="nx">lastName</span> <span class="o">=</span> <span class="s2">&quot;Doe&quot;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">person</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">firstName</span><span class="o">:</span> <span class="s2">&quot;John&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="nx">lastName</span><span class="o">:</span> <span class="s2">&quot;Doe&quot;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Don&#8217;t overwrite reserved words as keys</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">person</span> <span class="o">=</span> <span class="p">{</span> <span class="kr">class</span> <span class="o">:</span> <span class="s2">&quot;Person&quot;</span> <span class="p">};</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">person</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">klass</span> <span class="o">:</span> <span class="s2">&quot;Person&quot;</span> <span class="p">};</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="6">
<li>Arrays</li>
</ol>
<ul>
<li><p class="first">Should use literal syntax for creation</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">arr</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">arr</span> <span class="o">=</span> <span class="p">[];</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="7">
<li>Responsibility Delegation</li>
</ol>
<ul>
<li><p class="first">Only write code that is the responsibility of the program. Keep your code free of view layer and template code. Use a template library
like mustache.js instead</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">title</span><span class="o">:</span> <span class="s2">&quot;Joe&quot;</span><span class="p">,</span>
</span><span class="line">    <span class="nx">calc</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">        <span class="k">return</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">4</span><span class="p">;</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">},</span> <span class="nx">output</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="nx">output</span> <span class="o">=</span> <span class="s1">&#39;&lt;div&gt;&lt;h5&gt;&#39;</span> <span class="o">+</span> <span class="nx">title</span> <span class="o">+</span> <span class="s1">&#39;&lt;/h5&gt;&lt;p&gt;&#39;</span> <span class="o">+</span> <span class="nx">calc</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;&lt;/div&gt;&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">Mustache</span><span class="p">.</span><span class="nx">compilePartial</span><span class="p">(</span><span class="s1">&#39;my-template&#39;</span><span class="p">,</span> <span class="nx">view</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Keep JavaScript out of the HTML</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="o">&lt;</span><span class="nx">button</span> <span class="nx">onclick</span><span class="o">=</span><span class="s2">&quot;doSomething()&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;something-btn&quot;</span><span class="o">&gt;</span><span class="nx">Click</span> <span class="nx">Here</span><span class="o">&lt;</span><span class="err">/button&gt;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;something-btn&quot;</span><span class="p">);</span>
</span><span class="line"><span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="nx">doSomething</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="8">
<li>Operating Context And Scope</li>
</ol>
<ul>
<li><p class="first">Where possible wrap your code inside self executing functions. This will insulate your code from pollution by others, and make it easier
to abstract</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="p">;(</span><span class="kd">function</span><span class="p">(</span> <span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// My Awesome Library</span>
</span><span class="line"><span class="p">})(</span><span class="k">this</span><span class="p">,</span> <span class="nb">document</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Design for duration-agnostic execution of code. This will prevent your code from building up a backlog of requests that may no longer
be relevant</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad because this might take longer than 100 milliseconds to complete.</span>
</span><span class="line"><span class="nx">setInterval</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="nx">findFoo</span><span class="p">();</span>
</span><span class="line"><span class="p">},</span> <span class="mi">100</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good this will only be called again once findFoo has completed.</span>
</span><span class="line"><span class="p">;(</span><span class="kd">function</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    <span class="nx">findFoo</span><span class="p">();</span>
</span><span class="line">    <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">main</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
</span><span class="line"><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure></li>
<li><p class="first">Only use <em>this</em> in object constructors, methods and creating closures</p>
</li>
<li><p class="first">To prevent breaking community code declaring an operating context e.g. <cite>&quot;use strict&quot;</cite> should be wrapped inside a self-executing function
for modules or inside a function itself when needed</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="c1">// Bad</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">bar</span> <span class="o">=</span> <span class="nx">findLooseyGoosey</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="s2">&quot;use strict&quot;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="nx">findStrictly</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good</span>
</span><span class="line"><span class="kd">var</span> <span class="nx">bar</span> <span class="o">=</span> <span class="nx">findLooseyGoosey</span><span class="p">();</span>
</span><span class="line">
</span><span class="line"><span class="p">;(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class="line">  <span class="s2">&quot;use strict&quot;</span><span class="p">;</span>
</span><span class="line">  <span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="nx">findStrictly</span><span class="p">();</span>
</span><span class="line"><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
<ol class="arabic simple" start="9">
<li>Coercion</li>
</ol>
<ul>
<li><p class="first">Conversion over Coercion</p>
<figure class="code"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="javascript"><span class="line"><span class="kd">var</span> <span class="nx">num</span> <span class="o">=</span> <span class="s1">&#39;1&#39;</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Bad implicit coercion</span>
</span><span class="line"><span class="nx">num</span> <span class="o">=</span> <span class="o">+</span><span class="nx">num</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">// Good expressive conversion</span>
</span><span class="line"><span class="nx">num</span> <span class="o">=</span> <span class="nb">Number</span><span class="p">(</span><span class="nx">num</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></li>
</ul>
</div>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Felton on Felton]]></title>
    <link href="http://heavysixer.github.com/blog/2012/08/13/felton-on-felton/"/>
    <updated>2012-08-13T14:41:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/08/13/felton-on-felton</id>
    <content type="html"><![CDATA[<iframe src="http://player.vimeo.com/video/45838408?color=55c4e4" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p> <p><a href="http://vimeo.com/45838408">Eyeo2012 - Nicholas Felton</a> from <a href="http://vimeo.com/eyeofestival">Eyeo Festival</a> on <a href="http://vimeo.com">Vimeo</a>.</p></p>

<p>  &#8220;Unprecedented look at the creative process of infographic storyteller Nicholas Felton of Feltron Report fame, from this year’s EyeO Festival.&#8221;</p>

<p><a href="http://exp.lore.com/post/27493185478/unprecedented-look-at-the-creative-process-of">http://exp.lore.com/post/27493185478/unprecedented-look-at-the-creative-process-of</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[crowd sourcing concepts]]></title>
    <link href="http://heavysixer.github.com/blog/2012/07/11/crowdsourcing-concepts/"/>
    <updated>2012-07-11T09:42:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/07/11/crowdsourcing-concepts</id>
    <content type="html"><![CDATA[<p>Below is the results of a brainstorming session with myself and Hege Sæbjørnsen as we thought through the concepts of crowd sourcing. We proposed several questions to one another and then attempted to answer them, or at least frame the question more fully. These notes are pretty raw, and much of the answers are well-documented elsewhere. However, I still thought it was worth sharing.</p>

<h1>Crowd Sourcing</h1>

<p>The use of a collection of people with expert knowledge / interest around a very specific topic to fill a role that has been typically held by a few highly educated &#8220;editors&#8221; (wisdom of the crowds).</p>

<p>Crowd sourcing is an active engagement not only passively viewing the content. This is a two way street, you can&#8217;t strip mine the crowd, you must engage in a conversation and allow for two way conversation. You must harvest and plant.</p>

<h2>Crowd</h2>

<p>Collections subgroups or individuals at varying levels of engagement linked around some common attribute(s).</p>

<h3>potential subgroups</h3>

<ul>
<li>The Unaware Public</li>
<li>Students</li>
<li>Researcher / Educator</li>
<li>Artists / Designers</li>
<li>Makers</li>
<li>Engineers / Scientists</li>
<li>Social Innovators / Entrepreneurs</li>
<li>Politicians</li>
<li>Professionals</li>
<li>Grassroots Organizations</li>
<li>Physically located within a specific proximity</li>
<li>Contextual community on another platform (Facebook, Twitter, Flickr)</li>
<li>Griefers / Trolls (spreaders of misinformation, or just enjoy conflict)</li>
</ul>


<p>Do we have priority subgroups and who are they, and how do we speak to them?</p>

<p>Once you define the crowd composition then you choose the target audience to source from.</p>

<h2>Source</h2>

<ul>
<li>Ideas / Opinions / Solutions / Visions in response to our brief</li>
<li>Their social graph, and sphere of influence</li>
<li>Their money</li>
<li>Curation (potentially &amp; to what extent)</li>
<li>Vet and or Improve Submissions</li>
<li>Volunteers / local ambassadors</li>
</ul>


<h3>What Media Do We Source</h3>

<p>Are we limiting people&#8217;s inputs when we state &#8220;read&#8221; stories?</p>

<ul>
<li>Biographies / Essays</li>
<li>Comments on sourced material</li>
<li>Poems / Quotes etc.</li>
<li>Documentary Photography</li>
<li>Fine-art Photography</li>
<li>Documentary Video</li>
<li>Fine-art Video</li>
<li>Tools &amp; Tool Making</li>
<li>Research</li>
<li>Schematics / Blueprints</li>
</ul>


<h2>Goals Crowd Sourcing</h2>

<ul>
<li>Engaging a larger distributed audience</li>
<li>Collecting and then refining of raw materials</li>
<li>Democratic path to engagement / flattened hierarchy / grass-roots</li>
<li>composition over aggregation</li>
<li>Build a base of future (contextually relevant) engagement with a slice of the crowd</li>
</ul>


<h2>Tasks for the crowd</h2>

<ul>
<li>create or upload their content to the site</li>
<li>find existing relevant content created by others and share it on the site.</li>
<li>make linkages between content through activities like tagging (folksonomies)</li>
<li>download readymade content and share it in the local community</li>
<li>build a knowledge base around future</li>
</ul>


<h3>Ways To Curate</h3>

<ul>
<li>Crowd Voting, likes, retweets, tags, replies etc.</li>
<li>Local Expert, who promotes certain content over other</li>
<li>Selection Panel / Judging Panel, which offers periodic content review and selection</li>
</ul>


<h3>Expectation of the Crowd</h3>

<ul>
<li>Clarity of engagement a specific call to action</li>
<li>A way to visualize the crowd&#8217;s input</li>
<li>A way to visualize the crowd through metrics (e.g. countries, total count, visitors)</li>
<li>A way to visualize the crowd&#8217;s influence / impact</li>
<li>A low barrier of entry</li>
<li>A way to find my community</li>
</ul>


<h3>What&#8217;s in it for the Crowd member</h3>

<ul>
<li>Ready made distribution platform</li>
<li>Tools to mine the wisdom of the crowd</li>
<li>A way to fund your involvement in the project</li>
<li>Recognition and enhancement of your social reputation</li>
<li>Be a part of a larger well-respected initiative</li>
<li>The potential to participate in person in Rio</li>
<li>A tool to find other members you share interests with</li>
</ul>


<h3>Measurement / Quantifying The Crowd</h3>

<ul>
<li>How do you measure engagement with the crowd?</li>
<li>How do you measure distribution within the crowd?</li>
<li>How do you measure the inertia of the crowd?</li>
<li>How do you measure changes in the sentiment? (moving from casually aware to active participant)</li>
</ul>


<h4>Crowd Composition</h4>

<p>Less like a mob and more like filling the seats in structure or setting we&#8217;ve defined.
This allows us to initially curate the incoming content, and facilitate our &#8220;experts&#8221; (problematic?)</p>

<h4>Questions</h4>

<ul>
<li>How do we handle out of scope submissions?</li>
<li>How much is online vs. offline?</li>
<li>How is attribution of content handled?</li>
<li>Is there some greater tangible reward for contributing content?</li>
</ul>


<h4>Questions About Crowd Curation</h4>

<ul>
<li>Are we asking too much of our audience</li>
<li>Are we going to allow for total organic organization of the content or will we offer an initial framework.</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Spineless 0.2.1 Released]]></title>
    <link href="http://heavysixer.github.com/blog/2012/06/24/spineless-0-dot-2-1-released/"/>
    <updated>2012-06-24T14:43:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/06/24/spineless-0-dot-2-1-released</id>
    <content type="html"><![CDATA[<p>I have just pushed a new release of my JavaScript application framework called Spineless. Spineless is a simple MVC stack without the need of a backbone.
<a href="https://github.com/heavysixer/spineless">https://github.com/heavysixer/spineless</a></p>

<p>The goal of Spineless is to provide &#8220;just enough framework&#8221; to succeed. If I have done my job, you should be able to write your first Spineless app in less than 10 minutes.</p>

<p>Spineless is meant to run with virtually no dependencies. In the age of frameworks with massive dependency chains, here is a list of things you <em>DO NOT</em> need to run spineless.</p>

<ol>
<li>A persistance layer (e.g. database)</li>
<li>A backend server (e.g. node.js)</li>
<li>An internet connection! (srsly)</li>
</ol>


<p>Spineless has only two dependencies, JQuery and Mustache.js, both which come bundled
with the project inside the /lib directory.</p>

<p>Like any good MVC framework Spineless uses the concept of models, controllers and views.</p>

<ol>
<li>Spineless models are essentially JavaScript objects and completely optional.</li>
<li>Controllers are used to marshall commands from the views to the models where needed.</li>
<li>Views are the visual interface that the user sees.</li>
</ol>


<p>In addition to the normal MVC stack, Spineless also uses the concept of helpers and templates.</p>

<ol>
<li>Templates are HTML snippets, which are used by views to get better use of reusable code.</li>
<li>Helpers are functions that modify a template&#8217;s variables any way you choose.</li>
</ol>


<h2>Going Spineless in 10 minutes or less</h2>

<p>The entire Spineless application resides inside the &#8220;.application&#8221; div. An application consists
of a collection of controllers which in turn contain a collection of views.
Consider the following example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;application&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;controller&quot;</span> <span class="na">data-controller=</span><span class="s">&#39;application&#39;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;view&quot;</span> <span class="na">data-action=</span><span class="s">&#39;index&#39;</span><span class="nt">&gt;</span>
</span><span class='line'>      Hello World!
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example you&#8217;ll see that we have defined an application with a single controller. The name of the controller is defined by the <code>data-controller</code> attribute. This attribute is required by Spineless to route requests to the proper location. Views are much like controllers, but instead of using the <code>data-controller</code> attribute they use the <code>data-action</code>.</p>

<h2>Routing Requests</h2>

<p>Routing requests through Spineless is incredibly painless to make any link a spineless request just add the &#8220;route&#8221; class. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;a</span> <span class="na">class=</span><span class="s">&quot;route&quot;</span> <span class="na">href=</span><span class="s">&quot;/application/hello&quot;</span><span class="nt">&gt;</span>Hello<span class="nt">&lt;/a&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the user clicks on this link they will now be routed to the application controller where the <code>#hello</code> method will be called. If you are not using an element that support the <code>href</code> attribute you can also place your url inside a <code>data-href</code> attribute:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;route&quot;</span> <span class="na">data-href=</span><span class="s">&quot;/application/hello&quot;</span><span class="nt">&gt;</span>Hello<span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you want to manually trigger a route request from within JavaScript you can call the <code>get</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">spineless</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;application&#39;</span><span class="p">,</span> <span class="s1">&#39;index&#39;</span><span class="p">);</span><span class="err">`</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Passing local variables to templates</h2>

<p>When rendering templates, Spineless substitutes predefined template variables with those you supply using JSON. The JSON can be provided in at least two ways:</p>

<ol>
<li>By url encoded a json object into the <code>data-locals</code> attribute.</li>
<li>Creating of modifying the JSON object using a helper function.</li>
</ol>


<p>I will explain the helper function method next, but here is a simple example of what the data-locals method looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">data-locals=</span><span class="s">&quot;{&amp;quot;name&amp;quot;:&amp;quot;Mark&amp;quot;}&quot;</span> <span class="na">data-template=</span><span class="s">&#39;hi-my-name-is&#39;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Helper functions</h2>

<p>Helpers are developer-created functions that execute during the rendering of specific templates. Just like in Rails, helpers are available globally across all views. To demonstrate, imagine we have two DIV tags with locals supplied as urlencoded JSON object:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">data-locals=</span><span class="s">&quot;{&amp;quot;name&amp;quot;:&amp;quot;Mark&amp;quot;}&quot;</span> <span class="na">data-template=</span><span class="s">&#39;hi-my-name-is&#39;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">data-locals=</span><span class="s">&quot;{&amp;quot;name&amp;quot;:&amp;quot;Slim Shady&amp;quot;}&quot;</span> <span class="na">data-template=</span><span class="s">&#39;hi-my-name-is&#39;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see these objects have a property called <code>name</code>, each with unique values. These locals are linked to the “hi-my-name-is” template. To create a helper we’ll bind a function to execute whenever the <code>hi-my-name-is</code> template is rendered. Doing this will allows us intercept the template instance&#8217;s data-locals object and modify it anyway we choose before passing it along to Mustache to render. Here is the full example of the helper function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">sp</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">spineless</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">helpers</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;hi-my-name-is&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="s1">&#39;Slim Shady&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">obj</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">&quot;*wikka wikka* &quot;</span> <span class="o">+</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="nx">obj</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>PubSub for Spineless events</h2>

<p>Spineless now has a very minimal publisher subscriber (PubSub) events framework. The goal of this is to allow other code executing outside of Spineless to receive updates when internal Spineless events execute, without having to know anything about how Spineless is implemented. Here is a trivial example of creating an observer that is triggered every time a view is done rendering.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sp</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">spineless</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">sp</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="s1">&#39;afterRender&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="kd">function</span><span class="p">(</span><span class="nx">publisher</span><span class="p">,</span> <span class="nx">app</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">app</span><span class="p">.</span><span class="nx">request</span><span class="p">.</span><span class="nx">view</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s2">&quot;&lt;h1&gt;Yes it has!&lt;/h1&gt;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>    <span class="nx">sp</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;application&#39;</span><span class="p">,</span> <span class="s1">&#39;index&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the publisher executes a subscriber’s function it passes a reference to itself and the Spineless app instance as arguments. This allows the receiver to manage it’s subscriptions and gives the function access to the the Spineless current request, params hash among other things.</p>

<h2>Controller functions</h2>

<p>Controller functions are optional code that developers can write to augment the rendering of the view. Controller functions work much like helper functions do, in that they are executed before the view is returned to the screen. Unlike helper functions which are linked to an arbitrary number of templates; controller functions are scoped to just one controller action. Consider this example which executes when someone visits <code>/users/update</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">sp</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">spineless</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">controllers</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">users</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">update</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">elements</span><span class="p">,</span> <span class="nx">request</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">currentUser</span><span class="p">.</span><span class="nx">isAdmin</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="nx">elements</span><span class="p">);</span>
</span><span class='line'>                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">alert</span><span class="p">(</span><span class="err">“</span><span class="nx">Access</span> <span class="nx">Denied</span><span class="err">”</span><span class="p">);</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nx">sp</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;application&#39;</span><span class="p">,</span> <span class="s1">&#39;index&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>I have added examples of all of these new features in the /samples folder of the public Github repo. Please feel free to open bug reports or feature requests, and I will do my best to oblige.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Task chunking -- or why we leave our cards in the ATM]]></title>
    <link href="http://heavysixer.github.com/blog/2012/06/07/task-chunking/"/>
    <updated>2012-06-07T12:06:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/06/07/task-chunking</id>
    <content type="html"><![CDATA[<p>Have you ever left your bank card inside an ATM machine? You are not alone, I have done it more times than I care to admit, and each time it happens I am left with the <em>pants around your ankles</em> feeling that you get when you realize you are the worlds biggest idiot. Until recently, I didn’t have a way to explain this reoccurring blind spot; but now I do. ATM designers don’t understand the concept of task chunking.</p>

<p>Recently, when rereading through “The Humane Interface” by Jef Raskin I rediscovered his explanation of chunking and gestures in interface design. I won’t touch of gestures, but Raskin defines chunking as: “the combining of separate items of cognition into a single mental unit, a process that allows us to deal with many items as though they are one.”</p>

<p>Humans can only focus on one thing a time, therefore when planning a system for use by humans you should make sure that the system doesn’t require user’s to do more than one thing at a time. This is not to say that systems can’t be a mix of short and longterm goals, games do this all the time. For example, players may have a small task like collecting an amulet, but this is done within the larger scope of completing the level and the even larger arc of beating the game. Task chunking is about short-term cognition, which means when players are focused on getting the amulet they cannot be simultaneously thinking about completing the level.</p>

<p>In the case of using ATMs there is a single short-term task, which is to deposit or withdraw cash. However, banks for the most part get this wrong. They treat the entire time you are standing in front of their machines as a single mental unit. In their mental model the task begins with you inserting your card and ends with you reclaiming it. However, the customer’s mental model is different. They only want to receive or deposit money, and when they do either of these they often consider their task complete.</p>

<p>The problem with using most ATMs is that they put the customer’s most important event in the middle of their process. This would be like placing a quarter of the movie after the end credits. Nobody would see that part of the movie because, while the credits may be the most important to the actor they are the least important to the view. Moreover, moviegoers are trained to head for the exits when they see the credits start rolling.</p>

<p>I would wager that if the ATM never dispensed money, virtually nobody would leave their card in the machine. However, when the machine spits bills out onto the street, customers recognize this as the start of the task the mean to complete. This is the point where the initial task of using the ATM bifurcates into a new task of securing the exposed money. This is also where people like me forget all about their debit card.</p>

<p>Most of the time customers do get their card back, realizing even though they are done with the ATM, the ATM is not done with them. However, if there are other environmental factors at play like poor weather, lack of time, or thuggish people in the bushes customers may forget about the less important task of completing the bank’s arbitrary process for using their ATM.</p>

<p>Over the years, banks have tried various tactics to get their customer’s attention after the cash is dispensed. Sometimes they refresh ATM screen hoping that the interface shift will cause the customer to look back to the monitor. They might also play a reoccurring sound that signals the customer that their attention is needed.</p>

<p>Fundamentally, these attempts are just patches, and should signal to the bank that their process is broken. The real solution is not to bifurcate the original task. This can be accomplished by placing all essential but less important tasks before money is dispensed.</p>

<p>As a designer I try to be conscious of task chunking when planning out my applications. First I enumerate the discrete tasks in my process and map any potential hotspots where bifurcation by the user may occur. Next, I determine if I can wrap this potential offshoot into the master task chunk. If consolidation is not possible I try to move important tasks in my task chunk before this potential offshoot. My goal is to keep the user’s attention focused on a single pathway. Anytime I make them double-back to complete a task for the benefit of my application I know I have done something wrong.</p>

<p>As a footnote I am happy to report that Bank Of America’s new ATMs improve their approach to task chunking. They return your card immediately after you enter your pin. Of course now I have to unlearn years of using the ATMs which has taught me to walk away from the machine once I get my card back!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reading RFID Cards With Ruby and the Mac]]></title>
    <link href="http://heavysixer.github.com/blog/2012/04/23/reading-rfid-cards-with-ruby/"/>
    <updated>2012-04-23T09:18:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/04/23/reading-rfid-cards-with-ruby</id>
    <content type="html"><![CDATA[<p>This weekend I fooled around with the Sparkfun &#8220;RFID Starter Kit&#8221;. I purchased it from my local technology barn for around $50.00. I am teaching myself physical computing, and projects like that can be completed in an afternoon, are a great way to learn &#8220;just enough&#8221; to keep a junior hardware hacker like myself from getting frustrated.</p>

<p>I was thrilled to find out that getting this board to talk to Ruby took virtually no effort. In fact, it was so simple it almost felt like I was cheating some how. Here are the steps that I followed to get the ID-12 RFID Scanner and Reader talking to Ruby.</p>

<ol>
<li><p>Download the most recent drivers from Future Technology Devices International:
 <a href="http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_2_14.dmg">http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_2_14.dmg</a>
 The package contains two sets of drivers. Make sure that you install the version that is right for your operating system.</p></li>
<li><p>Install the serialport gem for Ruby
 gem install serialport (I used version 1.0.4)</p></li>
<li><p>Mount the scanner on top of the reader by lining up the prongs in the appropriate slot. Then plug the reader into the Mini-USB port of the mac.</p></li>
<li><p>From the console, locate the virtual com port the drivers created when you plugged in your Mini-USB cable.
 :~ ls -la /dev</p>

<p> Scanning the output from this command you should see the device listed similar to this:  cu.usbserial-XXXXXX (where X&#8217;s represent a driver id). Mine showed up as &#8220;cu.usbserial-A900ftPb&#8221; but yours may be different.</p></li>
<li><p>Use this sample code to print the unique RFID id stored inside the card, when someone swipes the card over the scanner.</p></li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Simple example of reading from serial port to interface with the RFID reader.</span>
</span><span class='line'><span class="nb">require</span> <span class="s2">&quot;serialport&quot;</span>
</span><span class='line'><span class="k">class</span> <span class="nc">RfidReader</span>
</span><span class='line'> <span class="kp">attr_accessor</span> <span class="ss">:key</span>
</span><span class='line'>
</span><span class='line'> <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
</span><span class='line'>   <span class="n">port_str</span> <span class="o">=</span> <span class="n">port</span>
</span><span class='line'>   <span class="n">baud_rate</span> <span class="o">=</span> <span class="mi">9600</span>
</span><span class='line'>   <span class="n">data_bits</span> <span class="o">=</span> <span class="mi">8</span>
</span><span class='line'>   <span class="n">stop_bits</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>   <span class="n">parity</span> <span class="o">=</span> <span class="no">SerialPort</span><span class="o">::</span><span class="no">NONE</span>
</span><span class='line'>   <span class="vi">@sp</span> <span class="o">=</span> <span class="no">SerialPort</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">port_str</span><span class="p">,</span> <span class="n">baud_rate</span><span class="p">,</span> <span class="n">data_bits</span><span class="p">,</span> <span class="n">stop_bits</span><span class="p">,</span> <span class="n">parity</span><span class="p">)</span>
</span><span class='line'>   <span class="vi">@key_parts</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>   <span class="vi">@key_limit</span> <span class="o">=</span> <span class="mi">16</span> <span class="c1"># number of slots in the RFID card.</span>
</span><span class='line'>   <span class="k">while</span> <span class="kp">true</span> <span class="k">do</span>
</span><span class='line'>     <span class="n">main</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>   <span class="vi">@sp</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'> <span class="k">end</span>
</span><span class='line'>
</span><span class='line'> <span class="k">def</span> <span class="nf">key_detected?</span>
</span><span class='line'>   <span class="vi">@key_parts</span> <span class="o">&lt;&lt;</span> <span class="vi">@sp</span><span class="o">.</span><span class="n">getc</span>
</span><span class='line'>   <span class="k">if</span> <span class="vi">@key_parts</span><span class="o">.</span><span class="n">size</span> <span class="o">&gt;=</span> <span class="vi">@key_limit</span>
</span><span class='line'>     <span class="nb">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="vi">@key_parts</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
</span><span class='line'>     <span class="vi">@key_parts</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>     <span class="kp">true</span>
</span><span class='line'>   <span class="k">else</span>
</span><span class='line'>     <span class="kp">false</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'> <span class="k">end</span>
</span><span class='line'>
</span><span class='line'> <span class="k">def</span> <span class="nf">main</span>
</span><span class='line'>   <span class="k">if</span> <span class="n">key_detected?</span>
</span><span class='line'>     <span class="nb">puts</span> <span class="nb">self</span><span class="o">.</span><span class="n">key</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">RfidReader</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;/dev/cu.usbserial-A900ftPb&quot;</span><span class="p">)</span>  <span class="c1">#may be different for you</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once you have the unique ID the possibilities become nearly limitless, you can use the card to update twitter, or turn on your lights, turn on the coffee pot, fire the nerf guns, release the hounds etc. Have fun, I know I will!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[9 Secrets To Running A Successful Crowdfunding Campaign.]]></title>
    <link href="http://heavysixer.github.com/blog/2012/04/14/running-an-effective-campaign-on-pledgie/"/>
    <updated>2012-04-14T20:09:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/04/14/running-an-effective-campaign-on-pledgie</id>
    <content type="html"><![CDATA[<p>As many of your know, I am one of the co-founders of Pledgie. Occasionally, I get asked for advice on how to make an effective campaign on Pledgie and so I began to seriously research this topic about three months ago. Using research, expert advice and by analyzing the thousands of existing Pledgie campaigns I attempted to distill the qualities of a successful campaign into a series of tips (actually nine of them). Whether you are an individual or an organization using Pledgie to raise money, these points may help you to craft a winning message.</p>

<h2>1. Empathy Over Sympathy</h2>

<p>The job of your campaign message is to focus on the empathetic link between your cause and your donors. Instead of trying to elicit feelings of guilt or pity, focus on positive connections your donors share with your campaign.</p>

<p>Humans, like many other animals, feel empathy and sympathy for one another. Both are incredibly powerful emotions but when it comes to triggering a donor to make a commitment empathy rules the day, and here’s why.  Empathy is both the ability to logically understand the experience of others, and simultaneously share a visceral emotional link. Sympathy, however is our ability to feel sorry for someone else’s misfortune, but at a more abstract emotional level. For example, a parent might feel empathy looking at a sick child, because they can imagine their own child in a similar state. In contrast someone without kids might just feel sympathy for child without feeling the greater shared circumstance.</p>

<h2>2. Tell A Story</h2>

<p>When crafting your campaign, tell the story of your cause. People are more likely to connect with a narrative than with facts and figures. When crafting your campaign story, ask yourself if it answers these questions:
Who are you?
Why is this campaign important to you?
What problem does this campaign seek to solve?
Why is this campaign important to the donor?</p>

<h2>3. Be Yourself</h2>

<p>Donors do not contribute to an idea; they contribute to a person. When describing yourself or your organization, use simple and direct language that gives a brief and complete picture of who you are, and why your campaign is a passion worth funding. The goal is to get potential donors to start seeing you as a real person and not just words and images on a webpage.</p>

<h2>4. Don’t Forget to Ask</h2>

<p>This seems obvious, but you’d be surprised how many campaigns never ask for funds! People often think that the goal of a Pledgie campaign is to describe the need. While that is an essential component of a good campaign, the actual goal of a Pledgie campaign is to get others to do something about your need. When crafting your campaign message you should concentrate on adding language that:
Encourages potential donors to act immediately.
Gives them explicit actions they can take to help your campaign.</p>

<h2>5. Get Your Friends &amp; Supporters Involved</h2>

<p>Your friends and supporters are your base, they provide a stable foundation to build your outreach upon. When spreading your message through social networks like Twitter or Facebook, it is essential that your friends help make a personal appeal. As a message spreads across your social graph it can suffer an entropy in trust. This may happen, because as your message spreads the recipients are less likely to know you personally. Asking for personal appeals from others help, because people are more likely to give if someone they know is personally invested.</p>

<h2>6. Look for collaborators not benefactors</h2>

<p>Donors who are funding a cause want to feel like they are part of a solution, and not just performing an act of charity. Craft your message in a way that demonstrates to the donor that they are investing in the outcome, and that you will keep them up-to-date as you progress towards your goal.</p>

<h2>7. Photo Finish</h2>

<p>We cannot stress enough how important having a video or photo is when crafting your campaign. Even if the photo is just a portrait of yourself, simply having a photo or video associated with your campaign description can make a huge difference in perceived credibility.</p>

<h2>8. Follow Up With Progress Reports</h2>

<p>Donors who have donated once are likely to donate again if you ask them. Sometimes the easiest way to ask is to share your progress towards your goals. Giving periodic updates to your donor base shows them that they made a wise investment in you, and that you can be trusted with additional funds.</p>

<h2>9. Be Grateful</h2>

<p>When someone makes an effort to support your cause, be sure to say thank you.  It gives them a sense of connection and fulfillment that can lead to future support. It is also the right thing to do!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On Jumping]]></title>
    <link href="http://heavysixer.github.com/blog/2012/04/05/on-jumping/"/>
    <updated>2012-04-05T09:39:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/04/05/on-jumping</id>
    <content type="html"><![CDATA[<blockquote><p>Jump and the net will appear.</p><footer><strong>John Burroughs</strong><cite><a href='http://en.wikipedia.org/wiki/John_Burroughs'>en.wikipedia.org/wiki/&hellip;</a></cite></footer></blockquote>


<p>Seven years ago there was much handwringing around leaving my job to start my own consultancy. That is until my friend told me this quote from John Burroughs. It is a compelling illustration about faith in yourself and that the world values you. It often resurfaces for me when I am mulling over a risky proposition. The best thing about this quote is when properly applied, if the net doesn&#8217;t appear&#8230; well it won&#8217;t hurt long!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Thoughts on Requirement Gathering]]></title>
    <link href="http://heavysixer.github.com/blog/2012/04/04/thoughts-on-requirement-docs/"/>
    <updated>2012-04-04T15:10:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/04/04/thoughts-on-requirement-docs</id>
    <content type="html"><![CDATA[<blockquote><p>Requirement documents should be a recipe not a shopping list.</p></blockquote>


<p>This metaphor is my attempt to encapsulate what a good requirements document is. Both a shopping list and a recipe are essentially lists of ingredients in various quantities. However, the recipe also includes a desired outcome and precise descriptions of how the ingredients are meant to be used.</p>

<p>When evaluating a requirement document ask yourself if it gives you a clear understanding of what it is you are being asked to build, and how the independent parts work together. If it doesn&#8217;t do that then, my friend, you are reading a shopping list.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[client-side request caching with JavaScript]]></title>
    <link href="http://heavysixer.github.com/blog/2012/03/28/client-side-request-caching-with-javascript/"/>
    <updated>2012-03-28T20:30:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/03/28/client-side-request-caching-with-javascript</id>
    <content type="html"><![CDATA[<p>Recently I was writing an enterprise data visualization application that made heavy user of interactive charts and graphs. Like most best-of-breed data-viz apps this one supported very robust filters for slicing and dicing through the dataset. Each time the user adjusted one of these filters the application made new AJAX request and idled until the results were returned.</p>

<p>Technically, this approach worked fine, but because the data-segmentation occurred on the server the charts felt sluggish because they were always polling or data. Additionally, the user quite frequently toggled between only a couple filters to compare the results. What should have been an experience of rapidly flipping between two views on the data was actually a belabored rendering experience. As the developer this was frustrating because they were asking for and receiving the same data over and over again.</p>

<p>To solve this problem, I built a very simple mechanism that affords <em>just enough caching</em> to persist these payload objects only while the user is viewing the page. In this way the user would be guaranteed to get a fresh copy from the server on each page load.</p>

<p>Essentially, I hooked my caching routine around the function that made the AJAX request for new chart data. Using this approach an AJAX request only occurred once, and all future requests pulled from the cache.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Called when someone adjusts a filter</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">updateChart</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="nx">chart</span><span class="p">,</span> <span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Builds the request params needed to correctly query the server. </span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">opts</span> <span class="o">=</span> <span class="nx">requestParamsFor</span><span class="p">(</span><span class="nx">chart</span><span class="p">,</span> <span class="nx">key</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Generate a cache key based on this object</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">cacheKey</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKey</span><span class="p">(</span><span class="nx">opts</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">hh</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">cacheKey</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// If the key exists then the request has happened in the past</span>
</span><span class='line'>        <span class="c1">// use the cached result to refresh the chart.</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">result</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">cacheKey</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">onSuccess</span><span class="p">(</span><span class="nx">kind</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">chart</span><span class="p">,</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">result</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">data</span><span class="o">:</span> <span class="nx">opts</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">result</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// Since this was a new request store the results in the cache </span>
</span><span class='line'>                <span class="c1">// at the location specified by the cache key.</span>
</span><span class='line'>                <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">cacheKey</span><span class="p">,</span> <span class="nx">result</span><span class="p">);</span>
</span><span class='line'>                <span class="nx">onSuccess</span><span class="p">(</span><span class="nx">kind</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">chart</span><span class="p">,</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">result</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is the local cache class in all it&#8217;s detail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_cache</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_keys</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_indexOf</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">arr</span><span class="p">,</span> <span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">len</span> <span class="o">=</span> <span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">len</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">arr</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">==</span> <span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_serialize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">opts</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">((</span><span class="nx">opts</span><span class="p">).</span><span class="nx">toString</span><span class="p">()</span> <span class="o">===</span> <span class="s2">&quot;[object Object]&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nx">$</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="nx">opts</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="p">(</span><span class="nx">opts</span><span class="p">).</span><span class="nx">toString</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_remove</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">t</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">((</span><span class="nx">t</span> <span class="o">=</span> <span class="nx">_indexOf</span><span class="p">(</span><span class="nx">_keys</span><span class="p">,</span> <span class="nx">key</span><span class="p">))</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">_keys</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">t</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>            <span class="k">delete</span> <span class="nx">_cache</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_removeAll</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">_cache</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>        <span class="nx">_keys</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">add</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">_keys</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="o">===</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">_keys</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nx">_cache</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$</span><span class="p">.</span><span class="nx">hh</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">exists</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">_cache</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">purge</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">_remove</span><span class="p">(</span><span class="nx">arguments</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">_removeAll</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span> <span class="p">{},</span>
</span><span class='line'>        <span class="nx">_cache</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">searchKeys</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">keys</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">rStr</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">rStr</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s1">&#39;\\b&#39;</span> <span class="o">+</span> <span class="nx">str</span> <span class="o">+</span> <span class="s1">&#39;\\b&#39;</span><span class="p">,</span> <span class="s1">&#39;i&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">_keys</span><span class="p">,</span>
</span><span class='line'>        <span class="kd">function</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">rStr</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">keys</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">e</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">keys</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">get</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">val</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">_cache</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">!==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">((</span><span class="nx">_cache</span><span class="p">[</span><span class="nx">key</span><span class="p">]).</span><span class="nx">toString</span><span class="p">()</span> <span class="o">===</span> <span class="s2">&quot;[object Object]&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">val</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span> <span class="p">{},</span>
</span><span class='line'>                <span class="nx">_cache</span><span class="p">[</span><span class="nx">key</span><span class="p">]);</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">val</span> <span class="o">=</span> <span class="nx">_cache</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">val</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">getKey</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">opts</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">_serialize</span><span class="p">(</span><span class="nx">opts</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">getKeys</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">_keys</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">add</span><span class="o">:</span> <span class="nx">add</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">exists</span><span class="o">:</span> <span class="nx">exists</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">purge</span><span class="o">:</span> <span class="nx">purge</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">searchKeys</span><span class="o">:</span> <span class="nx">searchKeys</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">get</span><span class="o">:</span> <span class="nx">get</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">getKey</span><span class="o">:</span> <span class="nx">getKey</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">getKeys</span><span class="o">:</span> <span class="nx">getKeys</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}).</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here are some jasmine tests which explain more features of the cache not covered in this post, and prove that it works!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should allow you to build a cache using keys&quot;</span><span class="p">,</span>
</span><span class='line'><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">obj</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;foo&#39;</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="s2">&quot;foo=bar&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKey</span><span class="p">(</span><span class="nx">obj</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s1">&#39;foo=bar&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKey</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&quot;foo=bar&quot;</span><span class="p">,</span> <span class="nx">obj</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="s2">&quot;foo=bar&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;foo=bar&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;bar&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">undefined</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should allow you to empty the cache completely&quot;</span><span class="p">,</span>
</span><span class='line'><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">purge</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&quot;baz&quot;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s1">&#39;baz&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKeys</span><span class="p">().</span><span class="nx">length</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">purge</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">({});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should allow you to empty the cache of just a specific record&quot;</span><span class="p">,</span>
</span><span class='line'><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">purge</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&quot;baz&quot;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s1">&#39;baz&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s2">&quot;boff&quot;</span><span class="p">,</span> <span class="s1">&#39;ball&#39;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s1">&#39;ball&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKeys</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">([</span><span class="s1">&#39;baz&#39;</span><span class="p">,</span> <span class="s1">&#39;boff&#39;</span><span class="p">]);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">purge</span><span class="p">(</span><span class="s1">&#39;boff&#39;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">({</span>
</span><span class='line'>        <span class="s1">&#39;baz&#39;</span><span class="o">:</span> <span class="s1">&#39;baz&#39;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKeys</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">([</span><span class="s1">&#39;baz&#39;</span><span class="p">]);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">purge</span><span class="p">(</span><span class="s1">&#39;bozz&#39;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">({</span>
</span><span class='line'>        <span class="s1">&#39;baz&#39;</span><span class="o">:</span> <span class="s1">&#39;baz&#39;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKeys</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">([</span><span class="s1">&#39;baz&#39;</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should allow you to search for keys in the cache&quot;</span><span class="p">,</span>
</span><span class='line'><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">purge</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">obj</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="s1">&#39;bar&#39;</span><span class="o">:</span> <span class="s1">&#39;baz&#39;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="s1">&#39;bar=baz&#39;</span><span class="p">,</span> <span class="nx">obj</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKeys</span><span class="p">().</span><span class="nx">length</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">getKeys</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">([</span><span class="s2">&quot;bar=baz&quot;</span><span class="p">]);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">searchKeys</span><span class="p">(</span><span class="s2">&quot;bar&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">([</span><span class="s2">&quot;bar=baz&quot;</span><span class="p">]);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">searchKeys</span><span class="p">(</span><span class="s2">&quot;bar=&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">([</span><span class="s2">&quot;bar=baz&quot;</span><span class="p">]);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">cache</span><span class="p">.</span><span class="nx">searchKeys</span><span class="p">(</span><span class="s2">&quot;bat&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">([]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails Protip: hash.slice]]></title>
    <link href="http://heavysixer.github.com/blog/2012/03/26/rails-protip-hash-dot-slice/"/>
    <updated>2012-03-26T11:09:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/03/26/rails-protip-hash-dot-slice</id>
    <content type="html"><![CDATA[<p>Rails has hidden gems just waiting to be discovered. I will demonstrate the use of <em>Hash.slice</em>, which is one of the core extensions of ActiveSupport.</p>

<p>Here is an example of how <em>Hash.slice</em> can clean up a controller, take this existing code for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>  <span class="vi">@users</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">paginate</span><span class="p">({</span> <span class="ss">:page</span> <span class="o">=&gt;</span> <span class="n">params</span><span class="o">[</span><span class="ss">:page</span><span class="o">].</span><span class="n">present?</span> <span class="p">?</span> <span class="n">params</span><span class="o">[</span><span class="ss">:page</span><span class="o">].</span><span class="n">to_i</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">:per_page</span> <span class="o">=&gt;</span> <span class="n">params</span><span class="o">[</span><span class="ss">:per_page</span><span class="o">].</span><span class="n">present?</span> <span class="p">?</span> <span class="n">params</span><span class="o">[</span><span class="ss">:per_page</span><span class="o">].</span><span class="n">to_i</span> <span class="p">:</span> <span class="mi">12</span> <span class="p">})</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>With <em>Hash.slice</em> we can shorten it to:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>  <span class="vi">@users</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">paginate</span><span class="p">({</span> <span class="ss">:page</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">:per_page</span> <span class="o">=&gt;</span> <span class="mi">12</span> <span class="p">}</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">params</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="ss">:page</span><span class="p">,</span> <span class="ss">:per_page</span><span class="p">)))</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>Hash.slice</em> is that it is very forgiving. The method only returns the attributes if they exist. In our example we are assured all conditions will be met because the default values will only be overwritten if <em>Hash.slice</em> returns them.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Minimally Viable Party]]></title>
    <link href="http://heavysixer.github.com/blog/2012/03/25/the-minimally-viable-party/"/>
    <updated>2012-03-25T15:50:00-05:00</updated>
    <id>http://heavysixer.github.com/blog/2012/03/25/the-minimally-viable-party</id>
    <content type="html"><![CDATA[<p>Garry and I are planning our next big project together. In the spirit of agile development and with the reality of limited funds we are ruthlessly scoping our efforts around a minimal feature set. We want to develop just enough of the product to see if we have a hit. Typically, this process is described as developing the minimum viable product (MVP).</p>

<p>The MVP approach targets the hardcore vocal minority that understand your offering, and are likely to give you helpful insights on how to improve it. With this in mind we began to list our potential features and aggressively cut anything that wasn’t essential.</p>

<p>We tried a variety of approaches to identify our MVP. Which included:</p>

<ul>
<li>Sorting features in order of complexity, and identifying those with serial dependencies</li>
<li>Selecting only those features that touch the revenue line (a topic for another post)</li>
<li>Determining those features which could give us a competitive advantage over other similar products.</li>
</ul>


<p>These thought experiments were helpful, but the focus felt very myopic, and more about cutting than pruning; like shaping a bonsai tree blindfolded. However, while mowing the lawn (where I do much of my good thinking), I came up with a new approach: “The Minimum Viable Party”.</p>

<p>A party seemed like a perfect metaphor for these reasons:</p>

<ul>
<li>The goal of product at this stage, is to meet people, show them a good time and give them a complete experience they can give feedback on.</li>
<li>Parties are events with a specific beginnings and ends. Being the host narrows your responsibilities to just throwing a great party. If you find yourself needing to first build the venue, or starting a catering company at the same time then <em>you are doing it wrong</em>.</li>
<li>Parties are fun, (even Goth Emo parties); they are about doing something you love, with others looking for the same thing.</li>
<li>A complete party is more than just good food. There are many aspects that can be considered including venue, theme, duration, etc.</li>
<li>If it all goes horribly wrong you can recover. You just clean up the mess, pull the lawn chairs off the roof, get a tow company to dredge your car from the neighbors pool and go on with your life.</li>
<li>By breaking a party into smaller components you can map them onto the MVP. Now, I am not for a minute claiming that there is an absolute one-to-one mapping between party to product. However, the metaphor did allow me to consider the attributes of my product in a more objective and holistic way. For example, a decision on whether to spend money on party invitations could be construed as a marketing spend on promoting our product.</li>
</ul>


<h2>Planning a Minimal Viable Party</h2>

<p>Here are the rules for the Minimal Viable Party thought experiment:</p>

<ul>
<li>You are planning a party for people you do not know.</li>
<li>You have one week to plan and execute your party.</li>
<li>Without specifying a specific amount you should assume that funds are very limited, which should force you to make decisions on how and where to spend your money.</li>
<li>The party is not a catered meaning that much if not all the work should be done personally.</li>
</ul>


<p>These rules lead me to a series of questions to consider which i’ve detailed below:</p>

<p><strong>Q.</strong> How many guests should I invite?</p>

<p><strong>A.</strong> You should invite the number of guests you can host comfortably. Everyone wants to feel special at the party, meaning you should know your limits before the inviting others.</p>

<p><strong>Insight:</strong> Many people focus on the hockey stick style growth from the outset, that is a result of a good product not the goal itself. At this stage the goal is to get to know the users, and the only way to do that is to ensure there is enough of you to go around.</p>

<p><strong>Q.</strong> How do I entertain people I have never met?</p>

<p><strong>A.</strong> Plan a party around the type of guest you’d want to see again. If you are a geek at heart then have your party on the holodeck and don’t mind the haters.</p>

<p><strong>Insight:</strong> You can’t please everyone but it’s important that you understand who you’d like as customers and friends. Ensure that your product gives them a memorable and enjoyable experience.</p>

<p><strong>Q.</strong> What kind of food should I cook?</p>

<p><strong>A.</strong> Be honest about your own cooking skills, anything you don’t do well you should either eliminate or buy (even if this means you have to buy all the food).</p>

<p><strong>Insight:</strong> No one wants to eat bad food, a strangers will not give you an “A” for effort when eating your half-cooked hamburgers. The same is true for a poorly executed product. I continually have to fight the urge to be an <em>everything expert</em>. While striving to learn new things is a positive, not knowing (or ignoring) your weaknesses limits you from being effective under a deadline.</p>

<p><strong>Q.</strong> How many courses should I prepare?</p>

<p><strong>A.</strong> What would your ideal guest expect? Not everyone expets (or even wants) a five course meal that takes hours to eat. What they will want is for it to feel complete, and that differs from person to person.</p>

<p><strong>Insight:</strong> The expression “soup to nuts” is often used when describing a project completed from beginning to end. It alludes to a complete meal that included appetizers (soup), nuts (dessert) and everything in between. If you view your features through the lens of completeness it should help you determine if a feature is needed now or can wait.</p>
]]></content>
  </entry>
  
</feed>
