<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hidenari&#39;s Random Thougths</title>
    <link>http://hdnrnzk.me/</link>
    <description>Recent content on Hidenari&#39;s Random Thougths</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 20 Jun 2015 14:02:37 +0200</lastBuildDate>
    <atom:link href="http://hdnrnzk.me/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>About</title>
      <link>http://hdnrnzk.me/about/</link>
      <pubDate>Sat, 20 Jun 2015 14:02:37 +0200</pubDate>
      
      <guid>http://hdnrnzk.me/about/</guid>
      <description>

&lt;p&gt;My name is Hidenari Nozaki. I’m a software engineer.&lt;/p&gt;

&lt;p&gt;I like prototyping and designing services.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&#34;about:d680e8a854a7cbad6d490c445cba2eba&#34;&gt;About&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;programming languages that I like these days: JavaScript, Go, and Clojure.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;married with two kids&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;since 2012, living in Auckland, New Zealand&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;from 2000 to 2012, I was working in Japan for these companies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Motorola: doing mobile network and telecom stuff&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Kodak: developing a first-of-a-kind WiFi camera&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Zerobase: a small web consulting firm with very smart people&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Orange: a small R&amp;amp;D lab in Tokyo for a giant mobile carrier in Europe&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;from 1993 to 2000, I was living in the States as a student:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;learning English at a language school&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;spent quite a few years in community college trying various kinds of stuff&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;transferred to UC Berkeley and finished with a CS degree&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Backbone, RequireJS, Jasmine, PhantomJS, Bower, and Grunt 4.1</title>
      <link>http://hdnrnzk.me/2013/06/09/backbone-requirejs-jasmine-phantomjs-and-grunt-41/</link>
      <pubDate>Sun, 09 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/06/09/backbone-requirejs-jasmine-phantomjs-and-grunt-41/</guid>
      <description>

&lt;p&gt;When I wrote &lt;a href=&#34;http://hdnrnzk.me/2013/01/10/backbone-requirejs-jasmine-phantomjs-and-grunt&#34;&gt;Backbone, RequireSS, Jasmine, PhhntomJS, and Grunt&lt;/a&gt;, Grunt was still version 3. But with introduction of version 4 series, they changed a lot. So, I&amp;rsquo;m updating my post with the grunt version 4 series. And, since many people are using &lt;a href=&#34;http://bower.io/&#34;&gt;Bower&lt;/a&gt; these days, I&amp;rsquo;ll use bower for managing JS packages.&lt;/p&gt;

&lt;h2 id=&#34;installing-grunt-cli-and-bower:9db951e50a9f39c31f3b197e9fc43aa6&#34;&gt;Installing Grunt-cli and Bower&lt;/h2&gt;

&lt;p&gt;To start using the latest grunt, you have to install grunt-cli. We also need Bower, so let&amp;rsquo;s install these two.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install -g grunt-cli bower
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;setting-up-directories:9db951e50a9f39c31f3b197e9fc43aa6&#34;&gt;Setting up directories&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;mkdir -p app/js/models test/spec/models test/lib
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;installing-js-packages-with-bower:9db951e50a9f39c31f3b197e9fc43aa6&#34;&gt;Installing JS Packages with Bower&lt;/h2&gt;

&lt;p&gt;We need jquery, underscore, backbone, requirejs, and jasmine. We can write a bower.json file to specify all these but since I don&amp;rsquo;t care too much about versions, let&amp;rsquo;s just install via command line. But before doing that, I need to specify where to install packages. Create a file called .bowerrc and write the following:&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;directory&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;app/components&amp;quot;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, we can install each libraries through bower.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bower install jquery --save
bower install underscore --save
bower install backbone --save
bower install requirejs --save
bower install jasmine --save
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After that, you should have a bower.json file with the following content:&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;backbone-blog&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.0.0&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;dependencies&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;backbone&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;~1.0.0&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;jasmine&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;~1.3.1&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;requirejs&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;~2.1.6&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;underscore&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;~1.4.4&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;jquery&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;~2.0.2&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;ignore&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;**/.*&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;node_modules&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;components&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id=&#34;setting-up-jasmine:9db951e50a9f39c31f3b197e9fc43aa6&#34;&gt;Setting up Jasmine&lt;/h2&gt;

&lt;p&gt;Grab run-jasmine.js. This script loads a page and parses the results from Jasmine.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl https://raw.github.com/ariya/phantomjs/master/examples/run-jasmine.js -o test/lib/run-jasmine.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here is index.html loading Jasmine and RequireJS files.&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;lang&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;Jasmine Spec Runner&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;../app/components/jasmine/lib/jasmine-core/jasmine.css&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;sandbox&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;overflow:hidden; height:1px;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;../app/components/jasmine/lib/jasmine-core/jasmine.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;../app/components/jasmine/lib/jasmine-core/jasmine-html.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;../app/components/requirejs/require.js&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;data-main&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;SpecRunner&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;html&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;RequireJS picks up /test/SpecRunner as the first file to load as data-main specifies.&lt;/p&gt;

&lt;p&gt;SpecRunner.js has two parts: RequireJS configuration and starting Jasmine.
Here is the config part of SpecRunner.js:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;baseUrl&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/app/js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;urlArgs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;cb=&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;paths&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;jquery&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;../components/jquery/jquery.min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;underscore&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;../components/underscore/underscore-min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;backbone&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;../components/backbone/backbone-min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;../../test/spec&amp;#39;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;shim&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;backbone&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;deps&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;underscore&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;exports&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;Backbone&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&amp;lsquo;baseUrl&amp;rsquo; sets the application root for JavaScript files.&lt;br /&gt;
&amp;lsquo;urlArgs&amp;rsquo; is attached as cache buster.&lt;br /&gt;
&amp;lsquo;paths&amp;rsquo; is specifying actual location of files or directories relative to &amp;lsquo;baseUrl&amp;rsquo;. In this case, we specify the locations of jquery, underscore, and backbone. And, we also set &amp;lsquo;spec&amp;rsquo; directory.&lt;br /&gt;
&amp;lsquo;shim&amp;rsquo; is where you specify none-AMD library for managing dependencies and global exports. As backbone depends on underscore and jquery, they are listed as deps.&lt;/p&gt;

&lt;p&gt;Here is the Jasmine part of SpecRunner.js:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;spec/index&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;HtmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;addReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;execute&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Two dependencies, jQuery and spec/index.js.&lt;br /&gt;
index.js lists the spec files.&lt;/p&gt;

&lt;p&gt;This is index.js just returning an array of spec files.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// list spec files here&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;h2 id=&#34;setting-up-grunt:9db951e50a9f39c31f3b197e9fc43aa6&#34;&gt;Setting up Grunt&lt;/h2&gt;

&lt;p&gt;Now, add package.json to the root for installing grunt packages. It&amp;rsquo;s a bit different from my previous entries. Now it has grunt-contrib-connect for setting up a static server and grunt-contrib-watch for watching file changes.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;todo-phantomjs-grunt-exec&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.0.1&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;private&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;dependencies&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;devDependencies&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;grunt&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.4.1&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;grunt-exec&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.4.1&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;grunt-contrib-connect&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.3.0&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;grunt-contrib-watch&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.4.4&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Install these packages as usual.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let&amp;rsquo;s create Gruntfile.js to configure our test setting. In the grunt version 3, it was called grunt.js but now it is renamed to Gruntfile.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;initConfig&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;connect&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;test&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;8000&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;middleware&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;connect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
          &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
            &lt;span style=&#34;color: #a6e22e&#34;&gt;mountFolder&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;connect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;app&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;
          &lt;span style=&#34;color: #f8f8f2&#34;&gt;];&lt;/span&gt;
        &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;watch&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;files&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test/spec/**/*.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;app/js/**/*.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test/SpecRunner.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;tasks&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;exec&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;command&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;phantomjs test/lib/run-jasmine.js http://localhost:8000/test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;stdout&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;true&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;loadNpmTasks&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;grunt-exec&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;loadNpmTasks&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;grunt-contrib-connect&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;loadNpmTasks&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;grunt-contrib-watch&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;registerTask&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;connect:test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;watch&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]);&lt;/span&gt;

&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;To check everything is in place properly, let&amp;rsquo;s run it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ grunt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should run the jasmine task but it fails and waits for file changes.&lt;/p&gt;

&lt;h2 id=&#34;writing-the-first-test:9db951e50a9f39c31f3b197e9fc43aa6&#34;&gt;Writing the First Test&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s write a test.
Todo model should have a title with default being empty string.&lt;br /&gt;
test/spec/models/todo_spec.js&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;models/todo&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;Todo Model&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;should have a default empty string title&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;})&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Add this file to index.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
      &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;spec/models/todo_spec&amp;quot;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;As you don&amp;rsquo;t have a Todo model yet, it still gives an error. It cannot load the Todo model yet.
Let&amp;rsquo;s add it: app/js/models/todo.js&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;backbone&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({});&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Now, you see a failing Jasmine output. And, adding a default title to the model should pass the test.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;backbone&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;defaluts&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;From here, you can add more specs and Backbone models, collections, and views.&lt;/p&gt;

&lt;p&gt;The Gruntfile.js that I created is really primitive. You probably want to add more stuff such as minification, livereload, copy, clean, build, and so on. But I&amp;rsquo;m saving that for my next post probably.&lt;/p&gt;

&lt;p&gt;Here is the sample code that I compiled for this blog post: &lt;a href=&#34;https://github.com/ghiden/backbone-requirejs-jasmine-phantomjs-bower-grunt-setup&#34;&gt;https://github.com/ghiden/backbone-requirejs-jasmine-phantomjs-bower-grunt-setup&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Playing with Yeoman, AngularJS, and CoffeeScript</title>
      <link>http://hdnrnzk.me/2013/02/12/playing-with-yeoman/</link>
      <pubDate>Tue, 12 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/02/12/playing-with-yeoman/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;http://yeoman.io/&#34;&gt;Yeoman&lt;/a&gt; looked really good so I tried it, and here are some finding that you should be aware of, at least with the version 0.9.6.&lt;/p&gt;

&lt;p&gt;My original intention was to write a small app using AngularJS in CoffeeScript.&lt;/p&gt;

&lt;h2 id=&#34;coffee-to-javascript-a-strange-behavior:e7ab9e863da31368a3dbd5d19315986f&#34;&gt;Coffee to JavaScript: a strange behavior&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir example
$ cd example
$ yeoman init angular --coffee
...
$ yeoman coffee
Running &amp;quot;coffee:compile&amp;quot; (coffee) task
File app/scripts/app.js created.
File app/scripts/controllers/main.js created.
File test/spec/main.js created.

Done, without errors.
$ mkdir test/spec/services
$ touch test/spec/services/dummy.coffee
$ yeoman coffee
Running &amp;quot;coffee:compile&amp;quot; (coffee) task
File app/scripts/app.js created.
File app/scripts/controllers/main.js created.
File test/spec/controllers/main.js created.
File test/spec/services/dummy.js created.

Done, without errors.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nothing fancy here, just plain yeoman.&lt;br /&gt;
1. Invoking an &amp;ldquo;init&amp;rdquo; for angular app with coffee option which generates files in coffeescript. At this point, we have the following coffeescript files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app/scripts/app.coffee
app/scripts/controllers/main.coffee
test/spec/controllers/main.coffee
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Invoking &amp;ldquo;coffee&amp;rdquo; command to generate js files. This is where this strange behavior starts. Javascript files for two coffee files under &amp;lsquo;app/scripts&amp;rsquo; are generated in the same directory as their corresponding coffee files. But &amp;lsquo;main.coffee&amp;rsquo; file under &amp;lsquo;test/spec/controllers&amp;rsquo; is generated one above where coffee file is located.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;If you two files in two different directories under &amp;lsquo;test/spec&amp;rsquo;, js files are generated like the ones under &amp;lsquo;app/scripts&amp;rsquo;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;build-doesn-t-compile-main-scss:e7ab9e863da31368a3dbd5d19315986f&#34;&gt;Build doesn&amp;rsquo;t compile main.scss&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ yeoman build
$ yeoman server:dist
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you open the page with your browser, you see a plain-looking page with no css.
This is already a known issue and will be fixed in 1.0.
&lt;a href=&#34;https://github.com/yeoman/yeoman/issues/348&#34;&gt;https://github.com/yeoman/yeoman/issues/348&lt;/a&gt;
But for now, just remove main.css in &amp;lsquo;app/styles&amp;rsquo; and it should be fine.&lt;/p&gt;

&lt;h2 id=&#34;generator-generated-coffeescript-is-not-minification-safe:e7ab9e863da31368a3dbd5d19315986f&#34;&gt;Generator-generated CoffeeScript is not minification-safe&lt;/h2&gt;

&lt;p&gt;/app/scripts/controllers/main.coffee breaks when it goes through minification.&lt;br /&gt;
/app/scripts/app.coffee is fine though.&lt;/p&gt;

&lt;p&gt;Here is the one generated by the generator.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&#39;use strict&#39;

angular.module(&#39;exampleApp&#39;)
  .controller &#39;MainCtrl&#39;, ($scope) -&amp;gt;
    $scope.awesomeThings = [
      &#39;HTML5 Boilerplate&#39;,
      &#39;AngularJS&#39;,
      &#39;Testacular&#39;
    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As the minification changes names of function arguments, you have to change the method invocation to alternative minification-safe form.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&#39;use strict&#39;

angular.module(&#39;exampleApp&#39;)
  .controller &#39;MainCtrl&#39;, [&#39;$scope&#39;, ($scope) -&amp;gt;
    $scope.awesomeThings = [
      &#39;HTML5 Boilerplate&#39;,
      &#39;AngularJS&#39;,
      &#39;Testacular&#39;
    ]
  ]
]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It&amp;rsquo;s a bit cumbersome form, but to make it run, you have to do it. Hopefully in yeoman 1.0, &lt;a href=&#34;https://github.com/btford/ngmin&#34;&gt;ngmin&lt;/a&gt; will take care of minication without having to write this alternative format.&lt;/p&gt;

&lt;h2 id=&#34;conclusion:e7ab9e863da31368a3dbd5d19315986f&#34;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;m looking forward to play with Yeoman 1.0 when it becomes available.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AngularJS ngPluralize example</title>
      <link>http://hdnrnzk.me/2013/01/29/angularjs-ngpluralize-example/</link>
      <pubDate>Tue, 29 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/01/29/angularjs-ngpluralize-example/</guid>
      <description>&lt;p&gt;This is an example of &lt;a href=&#34;http://docs.angularjs.org/api/ng.directive:ngPluralize&#34;&gt;ngPluralize&lt;/a&gt; in AngularJS.&lt;br /&gt;
I combined the &lt;a href=&#34;http://docs.angularjs.org/api/ng.directive:select&#34;&gt;Select example&lt;/a&gt; and the &lt;a href=&#34;http://docs.angularjs.org/api/ng.directive:ngPluralize&#34;&gt;ngPluralize example&lt;/a&gt; from the official &lt;a href=&#34;http://docs.angularjs.org/api&#34;&gt;API reference&lt;/a&gt;.&lt;/p&gt;

&lt;iframe style=&#34;width: 100%; height: 300px&#34; src=&#34;http://embed.plnkr.co/rgXcS8A1ckJ4JBI4QUeX?wmode=opaque&#34; frameborder=&#34;1&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;
  
&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>testing angularjs</title>
      <link>http://hdnrnzk.me/2013/01/20/testing-angularjs/</link>
      <pubDate>Sun, 20 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/01/20/testing-angularjs/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;http://angularjs.org/&#34;&gt;AngularJS&lt;/a&gt; is really nice. It shows a totally different approach from Backbone.&lt;br /&gt;
Since I might be involved in a project using Angular, I did some experiment.&lt;/p&gt;

&lt;p&gt;Going to the official page, and watching the two screencasts and just read top to bottom of the home page, I was very much interested in AngularJS. Then, I did the whole official tutorial which is very well organized and highly recommended.&lt;/p&gt;

&lt;p&gt;Now what? I had to write something using Angular. But something bothered me while I was following the tutorial. It keeps using controllers defined in global namespaces. I&amp;rsquo;m sure it&amp;rsquo;s intentional not to confuse beginners with nitty-gritty details. After asking Google, I found out that there are two ways to define controllers or so-called angular modules. One is using typical javascript scheme, using app namespace, and the other is using angular.module function.&lt;/p&gt;

&lt;h2 id=&#34;using-app-namescape-not-really:e4e38a83e8a22ec57d7c9fbfc8155700&#34;&gt;Using App namescape, not really&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&#34;http://docs.angularjs.org/tutorial/step_07&#34;&gt;step 7&lt;/a&gt; of the official tutorial introduces &amp;ldquo;App Module&amp;rdquo; which combines all the necessary components into one app. Since it returns the app module, you can assign it to some variable and use it like the app name space. Technically it is different from just creating an Object and adding attributes like we typically do. As in this case, it is an angular app module. But it does look like the typcial js namespace scheme.&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;// app.js&lt;/span&gt;
&lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todoapp&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;angular&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todoapp&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[]);&lt;/span&gt;

&lt;span style=&#34;color: #75715e&#34;&gt;// controllers.js&lt;/span&gt;
&lt;span style=&#34;color: #a6e22e&#34;&gt;todoapp&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;controller&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;TodoController&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;$scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;todos&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test 01&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test 02&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test 03&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;];&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To test TodoController, you write something like this.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;// controllersSpec.js&lt;/span&gt;

&lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;TodoController&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(){&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todoController&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;beforeEach&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todo&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;));&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;beforeEach&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;inject&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$controller&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{};&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;todoController&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;$controller&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;TodoController&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$scope&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}))&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;should validate the controller to be defined&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;todoController&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBeDefined&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;should have todos&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;todos&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;})&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;h2 id=&#34;using-angular-module:e4e38a83e8a22ec57d7c9fbfc8155700&#34;&gt;Using angular.module&lt;/h2&gt;

&lt;p&gt;This is to use &amp;lsquo;angular.module&amp;rsquo; function which is according to the &lt;a href=&#34;http://docs.angularjs.org/api/angular.module&#34;&gt;official doc&lt;/a&gt;, it &amp;ldquo;is a global place for creating and registering Angular modules.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;To define a controller, you do something like this.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;angular&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todo.controllers&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[]).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;controller&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;TodoController&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;$scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;todos&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test 01&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test 02&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test 03&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;];&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Again, to test, you write something like this.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;// controllersSpec.js&lt;/span&gt;

&lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;TodoController&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(){&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todoController&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;beforeEach&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todoapp.controllers&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;));&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;beforeEach&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;inject&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$controller&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{};&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;todoController&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;$controller&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;TodoController&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$scope&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}))&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;should validate the controller to be defined&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;todoController&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBeDefined&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;should have todos&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;scope&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;todos&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;})&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;One good thing about this approach is that when you start writing your code, you don&amp;rsquo;t have to have app.js that previously initialized &amp;lsquo;var todoapp = &amp;hellip;&amp;rsquo;&lt;br /&gt;
And, when you are ready to write your app.js, you write your app.js with necessary dependencies.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;// app.js&lt;/span&gt;
&lt;span style=&#34;color: #a6e22e&#34;&gt;angular&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todoapp&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todoapp.controllers&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;todoapp.services&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;I like the latter way of defining angular modules as it does not force you to have the app module.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backbone 0.9.9&#39;s validation behavior</title>
      <link>http://hdnrnzk.me/2013/01/14/backbone-099s-validation-behavior/</link>
      <pubDate>Mon, 14 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/01/14/backbone-099s-validation-behavior/</guid>
      <description>&lt;p&gt;Just as a follow-up to the Backbone.js testing articles, I was adding a few tests and surprised that it started to fail.&lt;/p&gt;

&lt;p&gt;First, I added some more default values, such as &amp;lsquo;completed&amp;rsquo; field should start with false and timestamp needs to be 0 as its initial value.&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;should have a default title, completed, and timestamp&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toEqual&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;completed&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toEqual&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toEqual&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;any&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(Number));&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;By adding a couple more defalut values passes the test of course.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;defaults&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;completed&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Then I moved on to validation: title should not be empty when you save. I suppose it&amp;rsquo;s quite a natural flow, isn&amp;rsquo;t it? I create a Jasmine Spy object and set it as error callback for this todo instance. And, when I save, I check if the spy opbject has been called or not and the error message was received ok or not.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;validation&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;should not save with empty title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;errorSpy&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;createSpy&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;error_event&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;),&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;

    &lt;span style=&#34;color: #75715e&#34;&gt;// think of this as a stub for returning &amp;#39;url&amp;#39; for models&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;collection&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;url&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;/collection&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;error&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;errorSpy&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;save&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;errorSpy&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toHaveBeenCalled&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;errorSpy&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;mostRecentCall&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;args&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toEqual&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;cannot have an empty title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Of course it fails as we don&amp;rsquo;t have any validation yet. So I added the following code to Todo model.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;validate&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;attrs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;attrs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;cannot have an empty title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Voila! Strange things happen.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Expected undefined to equal &#39;&#39;.
...
Expected undefined to equal false.
...
Expected undefined to equal &amp;lt;jasmine.any(function Number() { [native code] })&amp;gt;.
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I spent a couple hours testing and googling and then I found this issue with 0.9.9 release of Backbone.&lt;br /&gt;
&lt;a href=&#34;https://github.com/documentcloud/backbone/issues/1961&#34;&gt;https://github.com/documentcloud/backbone/issues/1961&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From 0.9.9, the behavior of validation changed. Model is validated when instantiated too. It does not allow any &amp;lsquo;invalid&amp;rsquo; state to be instantiated. So the above code does not pass with 0.9.9.&lt;/p&gt;

&lt;p&gt;To get it passed, you need to go with either 0.9.2 or head.&lt;/p&gt;

&lt;p&gt;If you just use 0.9.2, it works as expected.&lt;br /&gt;
If you want to go with the head version of Backbone, you have to change a bit.  Event is called &amp;lsquo;invalid&amp;rsquo; not &amp;lsquo;error&amp;rsquo;, so when you set the callback, it needs to set it for &amp;lsquo;invalid&amp;rsquo; event.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;validation&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;should not save with empty title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;...&lt;/span&gt;
    &lt;span style=&#34;color: #75715e&#34;&gt;// HEAD version&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;invalid&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;errorSpy&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;...&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Now, you can keep on testing hopefully.&lt;br /&gt;
&lt;a href=&#34;https://github.com/ghiden/backbone-requirejs-jasmine-testem-setup/tree/blog2&#34;&gt;https://github.com/ghiden/backbone-requirejs-jasmine-testem-setup/tree/blog2&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backbone, RequireJS, Jasmine, PhantomJS, and Grunt</title>
      <link>http://hdnrnzk.me/2013/01/10/backbone-requirejs-jasmine-phantomjs-and-grunt/</link>
      <pubDate>Thu, 10 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/01/10/backbone-requirejs-jasmine-phantomjs-and-grunt/</guid>
      <description>

&lt;p&gt;Following the &lt;a href=&#34;http://hdnrnzk.me/2013/01/09/backbone-jasmine-requirejs-and-testem&#34;&gt;yesterday&amp;rsquo;s post&lt;/a&gt;. This time, using &lt;a href=&#34;http://phantomjs.org/&#34;&gt;PhantomJS&lt;/a&gt; and &lt;a href=&#34;http://gruntjs.com/&#34;&gt;Grunt&lt;/a&gt;.&lt;br /&gt;
Testem does pick up PhantomJS and can run against it. But, maybe some people just want to use Grunt because they use Grunt for something else such as for making a build.&lt;/p&gt;

&lt;h2 id=&#34;setting-up-directories:a495db0d6bcd55d641d38ab2b2a6c708&#34;&gt;Setting up directories&lt;/h2&gt;

&lt;p&gt;First, let&amp;rsquo;s create two directories: app and test.
&amp;lsquo;app&amp;rsquo; holds the application and &amp;lsquo;test&amp;rsquo; of course contains test stuff.
Inside &amp;lsquo;app&amp;rsquo; directory, create a structure like this with required library files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app/
  js/
    lib/
      backbone-min.js
      jquery.min.js
      require.js
      underscore-min.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Under &amp;lsquo;test&amp;rsquo; directory, you have this with Jasmine files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;test/
  lib/
    jasmine-html.js
    jasmine.css
    jasmine.js
    run-jasmine.js     // from PhantomJS example
  spec/
    index.js
  index.html
  SpecRunner.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run-jasmine.js, you can grab it from here at PhantomJS repo.&lt;br /&gt;
&lt;a href=&#34;https://github.com/ariya/phantomjs/blob/master/examples/run-jasmine.js&#34;&gt;https://github.com/ariya/phantomjs/blob/master/examples/run-jasmine.js&lt;/a&gt;&lt;br /&gt;
This script loads a page and parses the results from Jasmine.&lt;/p&gt;

&lt;p&gt;Here is index.html loading Jasmine and RequireJS files.&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;lang&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;Jasmine Spec Runner&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/lib/jasmine.css&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;sandbox&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;overflow:hidden; height:1px;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/lib/jasmine.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/lib/jasmine-html.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/app/js/lib/require.js&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;data-main&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/SpecRunner&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;html&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;RequireJS picks up /test/SpecRunner as the first file to load as data-main specifies.&lt;/p&gt;

&lt;p&gt;SpecRunner.js has two parts: RequireJS configuration and starting Jasmine.
Here is the config part of SpecRunner.js:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;baseUrl&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/app/js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;urlArgs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;cb=&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;paths&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;jquery&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;lib/jquery.min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;underscore&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;lib/underscore-min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;backbone&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;lib/backbone-min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;../../test/spec&amp;#39;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;shim&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;backbone&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;deps&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;underscore&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;exports&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;Backbone&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&amp;lsquo;baseUrl&amp;rsquo; sets the application root for JavaScript files.&lt;br /&gt;
&amp;lsquo;urlArgs&amp;rsquo; is attached as cache buster.&lt;br /&gt;
&amp;lsquo;paths&amp;rsquo; is specifying actual location of files or directories relative to &amp;lsquo;baseUrl&amp;rsquo;. In this case, we specify the locations of jquery, underscore, and backbone. And, we also set &amp;lsquo;spec&amp;rsquo; directory.&lt;br /&gt;
&amp;lsquo;shim&amp;rsquo; is where you specify none-AMD library for managing dependencies and global exports. As backbone depends on underscore and jquery, they are listed as deps.&lt;/p&gt;

&lt;p&gt;Here is the Jasmine part of SpecRunner.js:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;spec/index&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;HtmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;addReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;execute&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Two dependencies, jQuery and spec/index.js.&lt;br /&gt;
index.js lists the spec files. It doesn&amp;rsquo;t have to be externalized. I included spec files in SpecRunner in the previous post, but for a change, I separated it into a different file.&lt;/p&gt;

&lt;p&gt;This is index.js just returning an array of spec files.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// list spec files here&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;h2 id=&#34;setting-up-grunt:a495db0d6bcd55d641d38ab2b2a6c708&#34;&gt;Setting up Grunt&lt;/h2&gt;

&lt;p&gt;Now, add package.json to the root for installing grunt packages.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;todo-phantomjs-grunt-exec&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.0.1&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;private&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;dependencies&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;devDependencies&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;grunt&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.3.17&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;grunt-exec&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;0.2.1&amp;quot;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;We install grunt and grunt-exec packages. &lt;a href=&#34;https://github.com/jharding/grunt-exec&#34;&gt;Grunt-exec&lt;/a&gt; is one of the simplest tasks. All it does is it executes shell commands.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let&amp;rsquo;s create grunt.js to configure our test setting.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;initConfig&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;server&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;8000&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;base&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;watch&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;files&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test/spec/**/*.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;app/js/**/*.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;test/SpecRunner.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;tasks&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;exec&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;command&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;phantomjs test/lib/run-jasmine.js http://localhost:8000/test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;stdout&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;true&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;loadNpmTasks&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;grunt-exec&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;registerTask&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;server exec watch&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&amp;lsquo;server&amp;rsquo; section is obvious, it sets up static http server that comes with grunt, hosted at port 8000 and pointing to the root.&lt;br /&gt;
&amp;lsquo;watch&amp;rsquo; section specifies what files to monitor, and &amp;lsquo;tasks&amp;rsquo; specifies what action to follow. In our case, &amp;lsquo;exec&amp;rsquo; command will follow.&lt;br /&gt;
&amp;lsquo;exec&amp;rsquo; section specifies what command to issue. It runs phantomjs with run-jasmine.js and loading the test/index.html.
Next is loading &amp;lsquo;grunt-exec&amp;rsquo; task and registering a default task which starts server, runs exec once, and starts watching files.&lt;/p&gt;

&lt;p&gt;To check everything is in place properly, let&amp;rsquo;s run it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ grunt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It should run the jasmine task but it fails and waits for file changes.&lt;/p&gt;

&lt;h2 id=&#34;writing-the-first-test:a495db0d6bcd55d641d38ab2b2a6c708&#34;&gt;Writing the first test&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s write a test.
Todo model should have a title with default being empty string.
First, I will create a directory &amp;lsquo;models&amp;rsquo; under &amp;lsquo;test/spec&amp;rsquo; and create a file called todo_spec.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;models/todo&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;Todo Model&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;should have a default empty string title&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;})&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;And, add this file name to index.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;
      &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;spec/models/todo_spec&amp;quot;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;As you don&amp;rsquo;t have a Todo model yet, it still gives an error. It cannot load the Todo model yet.
Let&amp;rsquo;s add it. Create &amp;lsquo;models&amp;rsquo; directory under &amp;lsquo;app/js/&amp;rsquo; and create todo.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;backbone&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({});&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Now, you see a failing Jasmine output. And, adding a default title to the model should pass the test.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;backbone&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;defaluts&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;From here, you can add more specs and Backbone models, collections, and views.&lt;/p&gt;

&lt;p&gt;Thanks to Uzi Kilon for writing this article, this post is heavily influenced by this:&lt;br /&gt;
&lt;a href=&#34;http://kilon.org/blog/2013/01/running-jasmine-tests-with-phantomjs/&#34;&gt;Running Jasmine Tests With PhantomJS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Reposity of this sample code:
&lt;a href=&#34;https://github.com/ghiden/backbone-requirejs-jasmine-phantomjs-grunt-setup&#34;&gt;https://github.com/ghiden/backbone-requirejs-jasmine-phantomjs-grunt-setup&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backbone, RequireJS, Jasmine, and Testem</title>
      <link>http://hdnrnzk.me/2013/01/09/backbone-jasmine-requirejs-and-testem/</link>
      <pubDate>Wed, 09 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2013/01/09/backbone-jasmine-requirejs-and-testem/</guid>
      <description>&lt;p&gt;Lately I&amp;rsquo;ve been playing with &lt;a href=&#34;http://backbonejs.org&#34;&gt;Backbone.js&lt;/a&gt; a lot. I use [RequireJS]() to manage dependencies and optimizing the file size. For JS stuff, I was never a big fan of testing because I was too lazy. But, as you build bigger and bigger apps, you start to feel that you need to test them. As for testing javascript, popular ones are &lt;a href=&#34;http://pivotal.github.com/jasmine/&#34;&gt;Jasmine&lt;/a&gt;, &lt;a href=&#34;http://qunitjs.com/&#34;&gt;QUnit&lt;/a&gt;, and &lt;a href=&#34;http://visionmedia.github.com/mocha/&#34;&gt;Mocha&lt;/a&gt;. For this blog post, I will use Jasmine and explain how to setup and get started.&lt;/p&gt;

&lt;p&gt;Just running Jasmine specs from browser every time you change your code is quite tedious. Then, you need something that reloads page as you change code or spec files. &lt;a href=&#34;https://github.com/airportyh/testem&#34;&gt;Testem&lt;/a&gt; is a very good tool that does it for you. There is a nice introduction at &lt;a href=&#34;http://net.tutsplus.com/tutorials/javascript-ajax/make-javascript-testing-fun-with-testem/&#34;&gt;Tutsplus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I want to write a Todo app as always. And, I want to do it in BDD way.&lt;/p&gt;

&lt;p&gt;First, let&amp;rsquo;s create two directories: app and test.
&amp;lsquo;app&amp;rsquo; holds the application and &amp;lsquo;test&amp;rsquo; of course contains test stuff.
Inside &amp;lsquo;app&amp;rsquo;, create a structure like this with required library files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app/
  js/
    lib/
      backbone-min.js
      jquery.min.js
      require.js
      underscore-min.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Under &amp;lsquo;test&amp;rsquo; directory, you have this with Jasmine files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;test/
  lib/
    jasmine-html.js
    jasmine.css
    jasmine.js
  spec/
  index.html
  SpecRunner.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here is index.html&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #75715e&#34;&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;html&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;lang&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;Jasmine Spec Runner&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;rel&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/lib/jasmine.css&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;sandbox&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;overflow:hidden; height:1px;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/lib/jasmine.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/lib/jasmine-html.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/testem.js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/app/js/lib/require.js&amp;quot;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;data-main&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/test/SpecRunner&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;script&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;html&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We don&amp;rsquo;t have testem.js but it&amp;rsquo;ll come after we install testem.&lt;br /&gt;
RequireJS picks up /test/SpecRunner as the first file to load as data-main specifies.&lt;/p&gt;

&lt;p&gt;SpecRunner.js has two parts: RequireJS configuration and starting Jasmine.
Here is the config part of SpecRunner.js:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;config&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;baseUrl&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;/app/js&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;urlArgs&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;cb=&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;paths&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;jquery&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;lib/jquery.min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;underscore&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;lib/underscore-min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;backbone&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;lib/backbone-min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;../../test/spec&amp;#39;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;},&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;shim&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;backbone&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;deps&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;underscore&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;exports&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;Backbone&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&amp;lsquo;baseUrl&amp;rsquo; sets the application root for JavaScript files.&lt;br /&gt;
&amp;lsquo;urlArgs&amp;rsquo; is attached as cache buster.&lt;br /&gt;
&amp;lsquo;paths&amp;rsquo; is specifying actual location of files or directories relative to &amp;lsquo;baseUrl&amp;rsquo;. In this case, we specify the locations of jquery, underscore, and backbone. And, we also set &amp;lsquo;spec&amp;rsquo; directory.&lt;br /&gt;
&amp;lsquo;shim&amp;rsquo; is where you specify none-AMD library for managing dependencies and global exports. As backbone depends on underscore and jquery, they are listed as deps.&lt;/p&gt;

&lt;p&gt;Here is the Jasmine part of SpecRunner.js:&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;jquery&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmine&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;HtmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;[];&lt;/span&gt;
        
  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;addReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;execute&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Pretty much typical jasmine setup, except the last part loading spec files. The array &amp;lsquo;specs&amp;rsquo; which holds the names of spec files are loaded by RequireJS. Currently it has no files to read in.&lt;/p&gt;

&lt;p&gt;Now, you need to install Testem. Suppose you have npm installed onto your machine. Install it globally is the easiest.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm install -g testem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, you need to configure testem. Usually you don&amp;rsquo;t need to configure much but since I want to run it with RequireJS, I want to use my own test index.html. Here is testem.yml for configuring testem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;test_page: test/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is just one line simply specifying the html file for Jasmine.&lt;br /&gt;
Now, you can start testing with testem.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ testem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Go to the URL from your browser.
You probably see TEST&amp;rsquo;EM &amp;lsquo;SCRIPTS! on the lower right corner on the page.&lt;br /&gt;
As we have no specs yet, it doesn&amp;rsquo;t show any Jasmine output yet. But right after you access the page, the shell prints out that what browser you use and shows a message: &amp;ldquo;No tests were run :(&amp;ldquo;.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s write a test.
Todo model should have a title with default being empty string.
First, I will create a directory &amp;lsquo;models&amp;rsquo; under &amp;lsquo;test/spec&amp;rsquo; and create a file called todo_spec.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;models/todo&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #a6e22e&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;Todo Model&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;should have a default empty string title&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)).&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;toBe&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;})&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;And, add this file name to SpecRunner.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;  &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;htmlReporter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specFilter&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;spec/model/todo_spec&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

  &lt;span style=&#34;color: #a6e22e&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;specs&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;jasmineEnv&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;execute&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;As you don&amp;rsquo;t have a Todo model yet, it gives an error from RequireJS. It cannot load the Todo model.
Let&amp;rsquo;s add the model. Create &amp;lsquo;models&amp;rsquo; directory under &amp;lsquo;app/js/&amp;rsquo; and create todo.js.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;backbone&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({});&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Now, you see Jasmine output both on console and the browser.
And adding a default title to the model should pass the test.&lt;/p&gt;

&lt;p&gt;&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;define&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;backbone&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;Backbone&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;extend&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;({&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;defaluts&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;todo&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;Without reloading, right after you save this file, testem picks it up and reload the test.&lt;br /&gt;
From here, you can add more specs and Backbone models, collections, and views.&lt;/p&gt;

&lt;p&gt;Thanks to the authors of these two articles, this post is heavily influenced by them:&lt;br /&gt;
&lt;a href=&#34;http://kilon.org/blog/2012/08/testing-backbone-requirejs-applications-with-jasmine/&#34;&gt;Testing Backbone + RequireJS Applications with Jasmine&lt;/a&gt; by Uzi Kilon.&lt;br /&gt;
&lt;a href=&#34;http://www.joezimjs.com/javascript/setting-up-a-jasmine-unit-testing-environment-with-testem/&#34;&gt;Setting Up a Jasmine Unit Testing Environment with Testem&lt;/a&gt; by Joe Zim.&lt;/p&gt;

&lt;p&gt;Reposity of this sample code:
&lt;a href=&#34;https://github.com/ghiden/backbone-requirejs-jasmine-testem-setup/tree/blog1&#34;&gt;https://github.com/ghiden/backbone-requirejs-jasmine-testem-setup/tree/blog1&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google&#39;s application specific passwords</title>
      <link>http://hdnrnzk.me/2012/08/13/googles-application-specific-passwords/</link>
      <pubDate>Mon, 13 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/08/13/googles-application-specific-passwords/</guid>
      <description>&lt;p&gt;I quite like the Google&amp;rsquo;s application-specific password scheme.&lt;br /&gt;
1. Go to your Google Account page
1. Click &amp;ldquo;Security&amp;rdquo;
1. Click &amp;ldquo;Edit&amp;rdquo; button for &amp;ldquo;Authorizing applications and sites&amp;rdquo;
1. Probably you get prompted for your password, then you see the page.&lt;/p&gt;

&lt;p&gt;It is a bit risky to use your Google account password for every app that accesses your Google hosted services; for example, my Gmail account setting on my iPhone. By using app-specific passwords, in case you lose your phone, you can easily revoke them anytime.&lt;/p&gt;

&lt;p&gt;For my experiment, I generated one for &lt;a href=&#34;http://hdnrnzk.me/2012/07/09/open-google-readers-starred-items-part-ii/&#34;&gt;my python script&lt;/a&gt; that reads Google Reader&amp;rsquo;s starred items.&lt;br /&gt;
To support that, I&amp;rsquo;ve added a config file that stores an email address and a password.&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;CONFIG_FILE&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;os&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;path&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;expanduser(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;~/.gstar-reader&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;

&lt;span style=&#34;color: #66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;init_config&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;():&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;os&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;path&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;exists(CONFIG_FILE):&lt;/span&gt;
        &lt;span style=&#34;color: #66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;&amp;quot;&amp;quot;Config file not found&lt;/span&gt;
&lt;span style=&#34;color: #e6db74&#34;&gt;Please create a file ~/.gstar-reader with the following contents&lt;/span&gt;
&lt;span style=&#34;color: #e6db74&#34;&gt;[base]&lt;/span&gt;
&lt;span style=&#34;color: #e6db74&#34;&gt;email:name@example.com&lt;/span&gt;
&lt;span style=&#34;color: #e6db74&#34;&gt;password:password&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span style=&#34;color: #f8f8f2&#34;&gt;sys&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;exit()&lt;/span&gt;

    &lt;span style=&#34;color: #f8f8f2&#34;&gt;parser&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;ConfigParser&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;SafeConfigParser()&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;parser&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;read(CONFIG_FILE)&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;CONFIG[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;parser&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;get(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;base&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;CONFIG[&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;parser&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;get(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;base&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I&amp;rsquo;ve never used ConfigParser before. It&amp;rsquo;s quite handy for stuff like this.&lt;/p&gt;

&lt;p&gt;Gist: &lt;a href=&#34;https://gist.github.com/2509075&#34;&gt;https://gist.github.com/2509075&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding Colors to Disappearing Dots</title>
      <link>http://hdnrnzk.me/2012/07/30/adding-colors-to-disappearing-dots/</link>
      <pubDate>Mon, 30 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/07/30/adding-colors-to-disappearing-dots/</guid>
      <description>&lt;p&gt;This is a second iteration to &lt;a href=&#34;http://hdnrnzk.me/2012/07/28/disappearing-dots/&#34;&gt;the disappering dots&lt;/a&gt;.&lt;br /&gt;
As the title says, I&amp;rsquo;m adding colors to dots.&lt;br /&gt;
How about some nice color variations in blue.&lt;/p&gt;

&lt;canvas id=&#34;ground&#34; width=&#34;400&#34; height=&#34;400&#34; style=&#34;margin: 15px;&#34;&gt; &lt;/canvas&gt;

&lt;p&gt;I found a very minimum implementation of HSV to RGV conversion here:
&lt;a href=&#34;http://spphire9.wordpress.com/2011/03/03/javascript%E3%81%A7hsv%E3%81%8B%E3%82%89rgb%E5%A4%89%E6%8F%9B/&#34;&gt;http://spphire9.wordpress.com/2011/03/03/javascript%E3%81%A7hsv%E3%81%8B%E3%82%89rgb%E5%A4%89%E6%8F%9B/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hue is a random value from 200 to 240.&lt;br /&gt;
Saturation is between 50 to 100.&lt;br /&gt;
Value is also between 50 to 100.&lt;/p&gt;

&lt;p&gt;Size of circles is also randomized this time.&lt;/p&gt;

&lt;p&gt;Use of HSV, I learned from this lecture notes:
&lt;a href=&#34;http://yoppa.org/cuc_prog12/3766.html&#34;&gt;http://yoppa.org/cuc_prog12/3766.html&lt;/a&gt;&lt;br /&gt;
It&amp;rsquo;s all in Japanese but code is in processing, so you don&amp;rsquo;t really need to read Japanese.&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;window.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;onload&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;win&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;doc&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;TWOPI&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;PI&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; 
      &lt;span style=&#34;color: #a6e22e&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Date()),&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// a bit slower fading out&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;MY_BLACK&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;rgba(0, 0, 0, 0.4)&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;400&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;HEIGHT&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;400&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;hsva&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;h&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;f&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;h&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;60&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
          &lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
          &lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
          &lt;span style=&#34;color: #a6e22e&#34;&gt;k&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;),&lt;/span&gt;
          &lt;span style=&#34;color: #a6e22e&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
          &lt;span style=&#34;color: #a6e22e&#34;&gt;q&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
          &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;rgba(&amp;#39;&lt;/span&gt;
            &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;[[&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;q&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;q&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
            &lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;q&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;][&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;
            &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;randomWithin&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;diff&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;floor&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;diff&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;val&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;randomPoint&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;floor&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt;  &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;draw&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Date());&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillStyle&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;MY_BLACK&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillRect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;HEIGHT&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// hue being 200 to 240 generates bluish color variations&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillStyle&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;hsva&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;randomWithin&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;200&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;240&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;),&lt;/span&gt; 
                         &lt;span style=&#34;color: #a6e22e&#34;&gt;randomWithin&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;50&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
                         &lt;span style=&#34;color: #a6e22e&#34;&gt;randomWithin&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;50&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
                         &lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;beginPath&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;arc&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;randomPoint&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;randomPoint&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;TWOPI&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fill&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;win&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;requestAnimationFrame&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;draw&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;init&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;canvas&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;doc&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getElementById&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;ground&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;canvas&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getContext&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;2d&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillStyle&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;#000&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillRect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;HEIGHT&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;win&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;requestAnimationFrame&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;draw&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;init&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}(window,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;document));&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;script src=&#34;http://hdnrnzk.me/assets/javascripts/adding_colors_to_disappearing_dots.js&#34; type=&#34;text/javascript&#34;&gt; &lt;/script&gt;
</description>
    </item>
    
    <item>
      <title>Disappearing Dots</title>
      <link>http://hdnrnzk.me/2012/07/28/disappearing-dots/</link>
      <pubDate>Sat, 28 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/07/28/disappearing-dots/</guid>
      <description>&lt;p&gt;Japan is too hot.&lt;br /&gt;
Here is a little toy animation using canvas.&lt;br /&gt;
It looks a bit like snow falling on the ground and dissappearing.&lt;/p&gt;

&lt;canvas id=&#34;ground&#34; width=&#34;400&#34; height=&#34;400&#34; style=&#34;margin: 15px;&#34;&gt; &lt;/canvas&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;window.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;onload&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;win&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;doc&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;TWOPI&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;PI&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; 
      &lt;span style=&#34;color: #a6e22e&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Date()),&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;MY_BLACK&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;rgba(0, 0, 0, 0.05)&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;400&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;HEIGHT&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;400&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;randomPoint&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;floor&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(Math.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt;  &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;draw&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Date());&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillStyle&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;MY_BLACK&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillRect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;HEIGHT&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;now&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillStyle&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;#fff&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;beginPath&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;arc&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;randomPoint&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;randomPoint&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(),&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;TWOPI&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fill&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
      &lt;span style=&#34;color: #a6e22e&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;now&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;win&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;requestAnimationFrame&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;draw&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;init&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;canvas&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;doc&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getElementById&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;ground&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;canvas&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;getContext&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;2d&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillStyle&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;#000&amp;quot;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;fillRect&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;WIDTH&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;HEIGHT&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;

    &lt;span style=&#34;color: #a6e22e&#34;&gt;win&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;requestAnimationFrame&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;draw&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;

  &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;init&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}(window,&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;document));&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;script src=&#34;http://hdnrnzk.me/assets/javascripts/disappearing_dots.js&#34; type=&#34;text/javascript&#34;&gt; &lt;/script&gt;
</description>
    </item>
    
    <item>
      <title>A Quick JavaScript Test on Scope and Closure</title>
      <link>http://hdnrnzk.me/2012/07/26/a-quick-javascript-test-on-scope-and-closure/</link>
      <pubDate>Thu, 26 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/07/26/a-quick-javascript-test-on-scope-and-closure/</guid>
      <description>&lt;p&gt;I found this article on how scope works in JavaScript at DailyJS.&lt;br /&gt;
&lt;a href=&#34;http://dailyjs.com/2012/07/23/js101-scope/&#34;&gt;JS101: A Brief Lesson on Scope&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a code snippet that demonstrates a possibly confusing behavior of closure and scoping for beginners. Here is the code:&lt;/p&gt;

&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;example&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;o&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{},&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color: #a6e22e&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color: #a6e22e&#34;&gt;console&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;log&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color: #a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;};&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]();&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]();&lt;/span&gt;
    &lt;span style=&#34;color: #a6e22e&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]();&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color: #a6e22e&#34;&gt;example&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This returns the following in console:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;3
3
3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So I was thinking, next time I interview someone for hire, I might show this snippet and ask him/her to make it return 0, 1, 2 instead.&lt;/p&gt;

&lt;p&gt;If you read the comments in the original &lt;a href=&#34;http://dailyjs.com/2012/07/23/js101-scope/&#34;&gt;post&lt;/a&gt;, you can find two solutions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Open Google Reader&#39;s Starred Items Part II</title>
      <link>http://hdnrnzk.me/2012/07/09/open-google-readers-starred-items-part-ii/</link>
      <pubDate>Mon, 09 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/07/09/open-google-readers-starred-items-part-ii/</guid>
      <description>

&lt;p&gt;The &lt;a href=&#34;http://hdnrnzk.me/2012/04/27/open-googlereaders-starred-page/&#34;&gt;previous entry&lt;/a&gt; on retrieving Google Reader&amp;rsquo;s Starred items had some problems.
- Occassionally, it was failing to open a site
- There are times that I want to just check how many items that I starred
- It wasn&amp;rsquo;t easy to read&lt;/p&gt;

&lt;p&gt;So, I revisited the code and revised it.&lt;/p&gt;

&lt;h2 id=&#34;executing-a-command:5032cf6104c592fc7649a587fcb89267&#34;&gt;Executing a command&lt;/h2&gt;

&lt;p&gt;I found out that using os.system to execute a command is considered not a good practice.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;os.system(&amp;quot;open %s -a &#39;Google Chrome&#39;&amp;quot; % url)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I see that I didn&amp;rsquo;t even check the result.&lt;br /&gt;
To have better control, I use subprocess.call which takes arguments in list.&lt;br /&gt;
Here is the code. By the way, I made it as a function for better readability.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def open_in_browser(url):
    # open in Chrome
    result = subprocess.call([&amp;quot;open&amp;quot;, &amp;quot;-a&amp;quot;, &amp;quot;Google Chrome&amp;quot;, url])
    if result != 0:
        print &amp;quot;Error opening the item&amp;quot;
    return result
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If it returns a non-zero value, the function shows an error message and returns.&lt;br /&gt;
The items that it fails to open should not be unstarred. Otherwise, it&amp;rsquo;ll be forgotten forever.&lt;/p&gt;

&lt;h2 id=&#34;adding-options:5032cf6104c592fc7649a587fcb89267&#34;&gt;Adding options&lt;/h2&gt;

&lt;p&gt;It was easy. I just need to use OptionParser.
- &amp;lsquo;-s&amp;rsquo; for not to clear stars.&lt;br /&gt;
- &amp;lsquo;-b&amp;rsquo; for not to open in browser.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;parser = OptionParser()
parser.add_option(&amp;quot;-s&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False, 
        help=&amp;quot;not to clear stars&amp;quot;)
parser.add_option(&amp;quot;-b&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False,
        help=&amp;quot;not to open in browser&amp;quot;)
(options, args) = parser.parse_args()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With these options, I can just invoke this command with -s and -b for not clearing the stars and not opening in browser, just to show list of starred items in terminal.&lt;/p&gt;

&lt;h2 id=&#34;getting-a-continuation-param:5032cf6104c592fc7649a587fcb89267&#34;&gt;Getting a &amp;lsquo;continuation&amp;rsquo; param&lt;/h2&gt;

&lt;p&gt;Google Reader API returns a parameter called &amp;lsquo;continuation.&amp;rsquo;&lt;br /&gt;
By supplying the continuation to subsequent query, they return the following items.&lt;br /&gt;
Without it, I had to unstar everything to get other starred items.&lt;br /&gt;
Or maybe I could bump up the number of retrieved items to 1000 or something, so that I can get all the items at once. But it sounds very crude, so I decided to use the continuation.&lt;br /&gt;
The &amp;lsquo;continuation&amp;rsquo; param is included in the result from API call.&lt;br /&gt;
It is enclosed in &amp;ldquo;ns2:continuation&amp;rdquo; element.&lt;br /&gt;
I use regular expression to get the value.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def get_continuation(feed):
    pattern = re.compile(r&amp;quot;&amp;quot;&amp;quot;ns2:continuation&amp;gt;(.*)&amp;lt;\/ns2:continuation&amp;quot;&amp;quot;&amp;quot;, re.M)
    result = pattern.search(feed.ToString())                                     
    if result:
        return result.group(1)
    else:
        False
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If I have a &amp;lsquo;continuation,&amp;rsquo; that means I have more starred items.&lt;br /&gt;
If I don&amp;rsquo;t, there is no more starred items.&lt;/p&gt;

&lt;h2 id=&#34;revised-code:5032cf6104c592fc7649a587fcb89267&#34;&gt;Revised Code&lt;/h2&gt;

&lt;p&gt;Overall, I changed top-to-bottom-one-long script to bunch of small functions.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python

import sys
import gdata.service
import subprocess
import getpass
import urllib
import re
from optparse import OptionParser
from gdata.service import BadAuthentication

URL = &#39;/reader/atom/user/-/state/com.google/starred&#39;
SERVICE = gdata.service.GDataService(account_type=&#39;GOOGLE&#39;,
                                     service=&#39;reader&#39;,
                                     server=&#39;www.google.com&#39;,
                                     source=&#39;MyReader&#39;)
CONFIG = {&#39;email&#39;:&#39;YOUR-EMAIL@gmail.com&#39;, &#39;password&#39;:&#39;DUMMY&#39;}

def unstar(entry, token):
    i = entry.id.text
    s = entry.source.extension_attributes[&#39;{http://www.google.com/schemas/reader/atom/}stream-id&#39;]
    ret = SERVICE.Post(urllib.urlencode({
        &#39;i&#39;:i,
        &#39;r&#39;:&#39;user/-/state/com.google/starred&#39;,
        &#39;s&#39;:s,
        &#39;T&#39;:token
        }),
        &#39;/reader/api/0/edit-tag&#39;,
        converter = lambda x:x,
        extra_headers = {&#39;Content-Type&#39;:&#39;application/x-www-form-urlencoded&#39;})
    print &amp;quot;Unstar result: %s [id: %s]&amp;quot; % (ret, i)
    if ret == &amp;quot;OK&amp;quot;:
        return 1
    else:
        return 0

def get_continuation(feed):
    pattern = re.compile(r&amp;quot;&amp;quot;&amp;quot;ns2:continuation&amp;gt;(.*)&amp;lt;\/ns2:continuation&amp;quot;&amp;quot;&amp;quot;, re.M)
    result = pattern.search(feed.ToString())
    if result:
        return result.group(1)
    else:
        return False

def password_prompt():
    CONFIG[&#39;password&#39;] = getpass.getpass(&#39;Enter your password for Google Reader: &#39;)

def open_in_browser(url):
    # open in Chrome
    result = subprocess.call([&amp;quot;open&amp;quot;, &amp;quot;-a&amp;quot;, &amp;quot;Google Chrome&amp;quot;, url])
    if result != 0:
        print &amp;quot;Error opening the item&amp;quot;
    return result

def login():
    try:
      SERVICE.ClientLogin(CONFIG[&#39;email&#39;], CONFIG[&#39;password&#39;])
    except BadAuthentication:
      print &amp;quot;Wrong password!&amp;quot;
      sys.exit()
    # authenticated token
    return SERVICE.Get(&#39;/reader/api/0/token&#39;,converter=lambda x:x)

# collect starred items
def starred():
    # n = number of items to read per query, default is 20
    params = {}
    entries = []

    while True:
        query = gdata.service.Query(feed=URL, params=params)
        feed = SERVICE.Get(query.ToUri())
        cont = get_continuation(feed)
        entries.extend(feed.entry)
        if cont:
            params[&#39;c&#39;] = cont
        else:
            break
    print &#39;*&#39; * len(entries)
    return entries

# process starred items
def process_starred(token, entries, options):
    total = len(entries)
    cleared = 0

    for entry in entries:
        url = entry.GetHtmlLink().href
        print entry.title.text
        print url
        if options.b != True:
            result = open_in_browser(url)
        else:
            # -b is set, always return 0
            result = 0

        if options.s != True and result == 0:
            # now unstar it
            cleared += unstar(entry, token)
        print &amp;quot;===============================================================&amp;quot;

    return (total, cleared)

def main(options):
    password_prompt()

    token = login()

    entries = starred()

    (total, cleared) = process_starred(token, entries, options)

    print &amp;quot;%d starred item(s) found and %d cleared&amp;quot; % (total, cleared)

if __name__ == &#39;__main__&#39;:
    parser = OptionParser()
    parser.add_option(&amp;quot;-s&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False, 
            help=&amp;quot;not to clear stars&amp;quot;)
    parser.add_option(&amp;quot;-b&amp;quot;, action=&amp;quot;store_true&amp;quot;, default=False,
            help=&amp;quot;not to open in browser&amp;quot;)
    (options, args) = parser.parse_args()
    main(options)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;gist: &lt;a href=&#34;https://gist.github.com/2509075/&#34;&gt;https://gist.github.com/2509075/&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating a bar graph using D3.js</title>
      <link>http://hdnrnzk.me/2012/07/04/creating-a-bar-graph-using-d3js/</link>
      <pubDate>Wed, 04 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/07/04/creating-a-bar-graph-using-d3js/</guid>
      <description>

&lt;p&gt;I had to create a bar graph for a page showing some stats.&lt;br /&gt;
So, I started searching for available options.&lt;/p&gt;

&lt;p&gt;I tried several options such as Highcharts, Google Graph API, Raphael, etc.&lt;br /&gt;
Highcharts is great, but it a bit too much for a small internal project. Google Graph API, I thought it was kinda dull. Raphael, I felt it was a bit difficult to work with. Then D3.js, after doing some experiments, I found it easy to use. And SVG graph looks quite good.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://d3js.org&#34;&gt;D3.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a nice example showing how to create a bar graph from the official site..&lt;br /&gt;
&lt;a href=&#34;http://mbostock.github.com/d3/tutorial/bar-1.html&#34;&gt;A Bar Chart, Part 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tutorial is fine but it&amp;rsquo;s a bit too minimum.&lt;br /&gt;
It doesn&amp;rsquo;t provide how to add labels to each bar.&lt;br /&gt;
So, in this article, I will add labels to each bar.&lt;/p&gt;

&lt;h2 id=&#34;data:2b734853ccf9cfc209221372b5af4575&#34;&gt;Data&lt;/h2&gt;

&lt;p&gt;First, here is some fake data to work on: John, Tim, Sam, Greg, and Charles had a competition on how many hotdogs they can eat.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;John:  8
Tim:   4
Sam:   9
Greg: 12
Charles: 11
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sure, Greg is the winner, and let&amp;rsquo;s visualize it with bar graph.&lt;/p&gt;

&lt;h2 id=&#34;step-1-blank-sheet:2b734853ccf9cfc209221372b5af4575&#34;&gt;Step 1: Blank sheet&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s start with a blank canvas, but not the canvas in HTML5 sense, just an area in SVG where we draw the chart.&lt;/p&gt;

&lt;div class=&#34;barchart&#34; id=&#34;step-1&#34;&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Select the element&lt;/li&gt;
&lt;li&gt;Append an SVG element&lt;/li&gt;
&lt;li&gt;Set class to &amp;lsquo;chart&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Set width to 400px and height to bar&amp;rsquo;s height times the number of data&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;var names = [&#39;John&#39;, &#39;Tim&#39;, &#39;Sam&#39;, &#39;Greg&#39;, &#39;Charles&#39;],
    hotdogs = [8, 4, 9, 12, 11],
    chart,
    width = 400,
    bar_height = 20,
    height = bar_height * names.length;

chart = d3.select($(&amp;quot;#step-1&amp;quot;)[0]) 
  .append(&#39;svg&#39;)
  .attr(&#39;class&#39;, &#39;chart&#39;)
  .attr(&#39;width&#39;, width)
  .attr(&#39;height&#39;, height);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;stylesheet:2b734853ccf9cfc209221372b5af4575&#34;&gt;Stylesheet&lt;/h3&gt;

&lt;p&gt;As a starter, we need a background color and a little bit of margin.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.chart {
  background: #b0e0f8;
  margin: 5px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;step-2-bars:2b734853ccf9cfc209221372b5af4575&#34;&gt;Step 2: Bars&lt;/h2&gt;

&lt;p&gt;Now, it&amp;rsquo;s time to add some bars.&lt;/p&gt;

&lt;div class=&#34;barchart&#34; id=&#34;step-2&#34;&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add scaling function for x.&lt;br /&gt;
It uses &lt;a href=&#34;https://github.com/mbostock/d3/wiki/Quantitative-Scales#wiki-linear&#34;&gt;linear&lt;/a&gt;, &lt;a href=&#34;https://github.com/mbostock/d3/wiki/Quantitative-Scales#wiki-linear_domain&#34;&gt;domain&lt;/a&gt;, and &lt;a href=&#34;https://github.com/mbostock/d3/wiki/Quantitative-Scales#wiki-linear_range&#34;&gt;range&lt;/a&gt; functions.&lt;/li&gt;
&lt;li&gt;Add positioning function for y.&lt;br /&gt;
It uses &lt;a href=&#34;https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal&#34;&gt;ordinal&lt;/a&gt;, &lt;a href=&#34;https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_domain&#34;&gt;domain&lt;/a&gt;, and &lt;a href=&#34;https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_rangeBands&#34;&gt;rangeBands&lt;/a&gt; functions&lt;/li&gt;
&lt;li&gt;Select all &amp;ldquo;rect&amp;rdquo;, but since there is none, it returns an empty selection&lt;/li&gt;
&lt;li&gt;Set data&lt;/li&gt;
&lt;li&gt;Enter each node and append an SVG rect&lt;/li&gt;
&lt;li&gt;We don&amp;rsquo;t actually need to set position in x since we want it to be 0. So attr(&amp;ldquo;x&amp;rdquo;, 0) can be removed. But, let&amp;rsquo;s leave it here for clarification.&lt;/li&gt;
&lt;li&gt;Set y position using the function y which basically returns 0,20,40,&amp;hellip;&lt;/li&gt;
&lt;li&gt;Set width of each bar using the function x which takes each value from hotdogs and calculate its appropriate width.&lt;/li&gt;
&lt;li&gt;Set height for each bar with y.rangeBand which returns 20&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;var x, y;
x = d3.scale.linear()
   .domain([0, d3.max(hotdogs)])
   .range([0, width]);

y = d3.scale.ordinal()
   .domain(d3.range(hotdogs.length))
   .rangeBands([0, height]);

chart.selectAll(&amp;quot;rect&amp;quot;)
   .data(hotdogs)
   .enter().append(&amp;quot;rect&amp;quot;)
   .attr(&amp;quot;x&amp;quot;, 0)
   .attr(&amp;quot;y&amp;quot;, y)
   .attr(&amp;quot;width&amp;quot;, x)
   .attr(&amp;quot;height&amp;quot;, y.rangeBand());
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;stylesheet-1:2b734853ccf9cfc209221372b5af4575&#34;&gt;Stylesheet&lt;/h3&gt;

&lt;p&gt;Adding a thin white line around each bar and set the filling to steelblue.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.chart rect {
  stroke: white;
  fill: steelblue;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;step-3-add-values:2b734853ccf9cfc209221372b5af4575&#34;&gt;Step 3: Add values&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s show the value for each bar so that we know exactly how much they eat.&lt;br /&gt;
We want the value printed on each bar on far right.&lt;/p&gt;

&lt;div class=&#34;barchart&#34; id=&#34;step-3&#34;&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Select all &amp;ldquo;text&amp;rdquo;, but again there is no &amp;ldquo;text&amp;rdquo; elements. We will get an emplety selection.&lt;/li&gt;
&lt;li&gt;Set data&lt;/li&gt;
&lt;li&gt;Enter each node and append an SVG text&lt;/li&gt;
&lt;li&gt;Set position of the text to be the width of bar by using the function x&lt;/li&gt;
&lt;li&gt;Set y position using the function y and adding the half of each bar height. This sets the position of y to be the middle of bar height.&lt;/li&gt;
&lt;li&gt;Move the text a little to the left by setting dx to -5px&lt;/li&gt;
&lt;li&gt;Set dy to .36em. Why? Here is why:&lt;br /&gt;
I use bootstrap for the whole styling.&lt;br /&gt;
It sets font-size to 13px and line-height to 18px.&lt;br /&gt;
13 divided by 18 is about .72, and y is now at the middle of the bar height.&lt;br /&gt;
We want the text to be exactly positioned vertically in the middle within each bar.&lt;br /&gt;
So, we have to push down by half of the font height.&lt;br /&gt;
That is .72 divided by 2 which is .36. Therefore, we need .36em here.&lt;/li&gt;
&lt;li&gt;Right-justfied the text by setting &amp;ldquo;text-anchor&amp;rdquo; to &amp;ldquo;end&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Set the value as String&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add the following code after the Step 2.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chart.selectAll(&amp;quot;text&amp;quot;)
  .data(hotdogs)
  .enter().append(&amp;quot;text&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, x)
  .attr(&amp;quot;y&amp;quot;, function(d){ return y(d) + y.rangeBand()/2; } )
  .attr(&amp;quot;dx&amp;quot;, -5)
  .attr(&amp;quot;dy&amp;quot;, &amp;quot;.36em&amp;quot;)
  .attr(&amp;quot;text-anchor&amp;quot;, &amp;quot;end&amp;quot;)
  .text(String);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;stylesheet-2:2b734853ccf9cfc209221372b5af4575&#34;&gt;Stylesheet&lt;/h3&gt;

&lt;p&gt;Just set the color of text for the values.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.chart text {
  fill: white;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;step-4-add-names:2b734853ccf9cfc209221372b5af4575&#34;&gt;Step 4: Add names&lt;/h2&gt;

&lt;p&gt;Before adding names, we need some space on the left of chart.&lt;br /&gt;
Then, add all the names.&lt;br /&gt;
Names are centered on the name column.&lt;/p&gt;

&lt;div class=&#34;barchart&#34; id=&#34;step-4&#34;&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Define left_width to 100px. This becomes the offset for the whole chart.&lt;/li&gt;
&lt;li&gt;Draw bars. This is same as before.&lt;/li&gt;
&lt;li&gt;Draw values. This is a bit different.&lt;br /&gt;
This time, we select text element with &amp;lsquo;score&amp;rsquo; class. We need this because we will add more text elements later, and this will prevent name collisions to happen.&lt;br /&gt;
We add class &amp;lsquo;score&amp;rsquo; by using attr(&amp;lsquo;class&amp;rsquo;, &amp;lsquo;score&amp;rsquo;).&lt;br /&gt;
Position of x moves to the right by left_width too.&lt;/li&gt;
&lt;li&gt;Draw names.

&lt;ol&gt;
&lt;li&gt;Select text elements with &amp;lsquo;name&amp;rsquo; class.&lt;/li&gt;
&lt;li&gt;Set data to be &amp;lsquo;names&amp;rsquo; array.&lt;/li&gt;
&lt;li&gt;Set x to be the center of left_width by dividing by 2&lt;/li&gt;
&lt;li&gt;Set y and dy as we did for the values too in Step 3&lt;/li&gt;
&lt;li&gt;Set the text to center by using &amp;lsquo;text-anchor&amp;rsquo; with &amp;lsquo;middle&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Add class &amp;lsquo;name&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Set the value as String&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;var left_width = 100;

chart = d3.select($(&amp;quot;#step-4&amp;quot;)[0])
  .append(&#39;svg&#39;)
  .attr(&#39;class&#39;, &#39;chart&#39;)
  .attr(&#39;width&#39;, left_width + width)
  .attr(&#39;height&#39;, height);

chart.selectAll(&amp;quot;rect&amp;quot;)
  .data(hotdogs)
  .enter().append(&amp;quot;rect&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, left_width)
  .attr(&amp;quot;y&amp;quot;, y)
  .attr(&amp;quot;width&amp;quot;, x)
  .attr(&amp;quot;height&amp;quot;, y.rangeBand());

chart.selectAll(&amp;quot;text.score&amp;quot;)
  .data(hotdogs)
  .enter().append(&amp;quot;text&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, function(d) { return x(d) + left_width; })
  .attr(&amp;quot;y&amp;quot;, function(d){ return y(d) + y.rangeBand()/2; } )
  .attr(&amp;quot;dx&amp;quot;, -5)
  .attr(&amp;quot;dy&amp;quot;, &amp;quot;.36em&amp;quot;)
  .attr(&amp;quot;text-anchor&amp;quot;, &amp;quot;end&amp;quot;)
  .attr(&#39;class&#39;, &#39;score&#39;)
  .text(String);

chart.selectAll(&amp;quot;text.name&amp;quot;)
  .data(names)
  .enter().append(&amp;quot;text&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, left_width / 2)
  .attr(&amp;quot;y&amp;quot;, function(d){ return y(d) + y.rangeBand()/2; } )
  .attr(&amp;quot;dy&amp;quot;, &amp;quot;.36em&amp;quot;)
  .attr(&amp;quot;text-anchor&amp;quot;, &amp;quot;middle&amp;quot;)
  .attr(&#39;class&#39;, &#39;name&#39;)
  .text(String);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;stylesheet-3:2b734853ccf9cfc209221372b5af4575&#34;&gt;Stylesheet&lt;/h3&gt;

&lt;p&gt;Setting the name to black.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.chart text.name {
  fill: #000;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;step-5-add-margins-and-etc:2b734853ccf9cfc209221372b5af4575&#34;&gt;Step 5: Add margins and etc&lt;/h2&gt;

&lt;p&gt;I will wrap it up with adding few extra things:
- Bars are bit too tight, so add gaps in between
- Add paddings so that it doesn&amp;rsquo;t look squashed
- Add rules for the chart
- Add a bit of css hovering effect&lt;/p&gt;

&lt;div class=&#34;barchart&#34; id=&#34;step-5&#34;&gt;
&lt;/div&gt;

&lt;h3 id=&#34;define-gaps:2b734853ccf9cfc209221372b5af4575&#34;&gt;Define gaps&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Define the gap between each bar to be 2px top and bottom.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Redefine the function y to adjust the gap.&lt;br /&gt;
The height of each bar area is bar_height + 2 times &amp;lsquo;gap&amp;rsquo;.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;var gap = 2;
y = d3.scale.ordinal()
  .domain(hotdogs)
  .rangeBands([0, (bar_height + 2 * gap) * names.length]);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;add-paddings:2b734853ccf9cfc209221372b5af4575&#34;&gt;Add paddings&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set width to be 40px wider&lt;/li&gt;
&lt;li&gt;Set height to be 30px taller&lt;/li&gt;
&lt;li&gt;Append Graphics context &amp;lsquo;g&amp;rsquo; and transform the origin of cooridate to be 10,20. Then, we don&amp;rsquo;t have to worry about adjusting the position for each element that we have been doing so far.&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;chart = d3.select($(&amp;quot;#step-5&amp;quot;)[0])
  .append(&#39;svg&#39;)
  .attr(&#39;class&#39;, &#39;chart&#39;)
  .attr(&#39;width&#39;, left_width + width + 40)
  .attr(&#39;height&#39;, (bar_height + gap * 2) * names.length + 30)
  .append(&amp;quot;g&amp;quot;)
  .attr(&amp;quot;transform&amp;quot;, &amp;quot;translate(10, 20)&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;draw-ticks:2b734853ccf9cfc209221372b5af4575&#34;&gt;Draw ticks&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;d3.max returns the maximum value given an array of elements.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mbostock/d3/wiki/Quantitative-Scales#wiki-linear_ticks&#34;&gt;ticks&lt;/a&gt; function returns &amp;ldquo;approximately count representative values from the scale&amp;rsquo;s input domain.&amp;rdquo; In this case, it returns 0,1,2,&amp;hellip;12. These numbers work as tick marks.&lt;/li&gt;
&lt;li&gt;Draw a vertical line from (x1, y1) to (x2, y2).&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;chart.selectAll(&amp;quot;line&amp;quot;)
  .data(x.ticks(d3.max(hotdogs)))
  .enter().append(&amp;quot;line&amp;quot;)
  .attr(&amp;quot;x1&amp;quot;, function(d) { return x(d) + left_width; })
  .attr(&amp;quot;x2&amp;quot;, function(d) { return x(d) + left_width; })
  .attr(&amp;quot;y1&amp;quot;, 0)
  .attr(&amp;quot;y2&amp;quot;, (bar_height + gap * 2) * names.length);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;add-rules:2b734853ccf9cfc209221372b5af4575&#34;&gt;Add rules&lt;/h3&gt;

&lt;p&gt;This is just like other text elements.
Only difference is that we write the numbers 1, 2, 3, &amp;hellip; horizontally.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chart.selectAll(&amp;quot;.rule&amp;quot;)
  .data(x.ticks(d3.max(hotdogs)))
  .enter().append(&amp;quot;text&amp;quot;)
  .attr(&amp;quot;class&amp;quot;, &amp;quot;rule&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, function(d) { return x(d) + left_width; })
  .attr(&amp;quot;y&amp;quot;, 0)
  .attr(&amp;quot;dy&amp;quot;, -6)
  .attr(&amp;quot;text-anchor&amp;quot;, &amp;quot;middle&amp;quot;)
  .attr(&amp;quot;font-size&amp;quot;, 10)
  .text(String);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;add-bars:2b734853ccf9cfc209221372b5af4575&#34;&gt;Add bars&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set y position to be the value returned from the y function plus one gap.&lt;/li&gt;
&lt;li&gt;Set height to be bar_height, not y.rangeBand().&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- dummy --&gt;

&lt;pre&gt;&lt;code&gt;chart.selectAll(&amp;quot;rect&amp;quot;)
  .data(hotdogs)
  .enter().append(&amp;quot;rect&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, left_width)
  .attr(&amp;quot;y&amp;quot;, function(d) { return y(d) + gap; })
  .attr(&amp;quot;width&amp;quot;, x)
  .attr(&amp;quot;height&amp;quot;, bar_height);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;add-values-and-names:2b734853ccf9cfc209221372b5af4575&#34;&gt;Add values and names&lt;/h3&gt;

&lt;p&gt;Same as before.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chart.selectAll(&amp;quot;text.score&amp;quot;)
  .data(hotdogs)
  .enter().append(&amp;quot;text&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, function(d) { return x(d) + left_width; })
  .attr(&amp;quot;y&amp;quot;, function(d, i){ return y(d) + y.rangeBand()/2; } )
  .attr(&amp;quot;dx&amp;quot;, -5)
  .attr(&amp;quot;dy&amp;quot;, &amp;quot;.36em&amp;quot;)
  .attr(&amp;quot;text-anchor&amp;quot;, &amp;quot;end&amp;quot;)
  .attr(&#39;class&#39;, &#39;score&#39;)
  .text(String);

chart.selectAll(&amp;quot;text.name&amp;quot;)
  .data(names)
  .enter().append(&amp;quot;text&amp;quot;)
  .attr(&amp;quot;x&amp;quot;, left_width / 2)
  .attr(&amp;quot;y&amp;quot;, function(d, i){ return y(d) + y.rangeBand()/2; } )
  .attr(&amp;quot;dy&amp;quot;, &amp;quot;.36em&amp;quot;)
  .attr(&amp;quot;text-anchor&amp;quot;, &amp;quot;middle&amp;quot;)
  .attr(&#39;class&#39;, &#39;name&#39;)
  .text(String);
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;stylesheet-4:2b734853ccf9cfc209221372b5af4575&#34;&gt;Stylesheet&lt;/h3&gt;

&lt;p&gt;The rest of the setting that we need.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.chart line {
  stroke: #c1c1c1;
}

.chart .rule {
  fill: #000;
}

/* removed the while stroke as we don&#39;t need it anymore */
#step-5 .chart rect {
  stroke: none;
}

/* a bit of hovering effect for each bar */
#step-5 .chart rect:hover {
  fill: #64707D;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;gist:2b734853ccf9cfc209221372b5af4575&#34;&gt;Gist&lt;/h2&gt;

&lt;p&gt;Here is the code at gist: &lt;a href=&#34;https://gist.github.com/3046929&#34;&gt;https://gist.github.com/3046929&lt;/a&gt;&lt;/p&gt;

&lt;script src=&#34;http://hdnrnzk.me/assets/javascripts/jquery-1.7.1.min.js&#34; type=&#34;text/javascript&#34;&gt; &lt;/script&gt;
&lt;script src=&#34;http://hdnrnzk.me/assets/javascripts/d3.v2.min.js&#34; type=&#34;text/javascript&#34;&gt; &lt;/script&gt;  
&lt;script src=&#34;http://hdnrnzk.me/assets/javascripts/d3js-bargraph.js&#34; type=&#34;text/javascript&#34;&gt; &lt;/script&gt;  
&lt;script src=&#34;http://hdnrnzk.me/assets/javascripts/rloader1.5.3_min.js&#34; type=&#34;text/javascript&#34;&gt; &lt;/script&gt;  
&lt;script type=&#34;text/javascript&#34;&gt;  
  $.rloader([ {src:&#39;/assets/stylesheets/d3js-bargraph.css&#39;} ]);  
&lt;/script&gt;  
</description>
    </item>
    
    <item>
      <title>Open Google Reader&#39;s Starred Items</title>
      <link>http://hdnrnzk.me/2012/04/27/open-googlereaders-starred-page/</link>
      <pubDate>Fri, 27 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://hdnrnzk.me/2012/04/27/open-googlereaders-starred-page/</guid>
      <description>&lt;p&gt;Here is my routine for every weekday.&lt;br /&gt;
I come to work and start checking emails and Google Reader&amp;rsquo;s Starred pages that I mark during my commute time.&lt;br /&gt;
I always felt that this Google Reader part is quite cumbersome and time consuming even though it&amp;rsquo;s not a lot.&lt;/p&gt;

&lt;p&gt;These are the steps that I do:
1. Open up Google Reader on my browser
2. Type &amp;lsquo;gs&amp;rsquo; that is a shortcut for opening the starred page view
3. Type &amp;lsquo;v&amp;rsquo; to open it up in a new tab.
4. Type &amp;lsquo;j&amp;rsquo; to go down the list and do &amp;lsquo;v&amp;rsquo; again and repeat.&lt;/p&gt;

&lt;p&gt;So, I thought would it be nice if I can just type one command and open all the starred pages at once.&lt;/p&gt;

&lt;p&gt;Here is the recipe.
First, you need to install &lt;a href=&#34;http://code.google.com/p/gdata-python-client/&#34;&gt;gdata-python-client&lt;/a&gt;
And, follow the steps here.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Login&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;config = {&#39;email&#39;:&#39;YOUR-ACCOUNT@gmail.com&#39;, &#39;password&#39;:&#39;PASSWORD&#39;}


service = gdata.service.GDataService(account_type=&#39;GOOGLE&#39;,
                                     service=&#39;reader&#39;,
                                     server=&#39;www.google.com&#39;,
                                     source=&#39;MyReader&#39;)


service.ClientLogin(config[&#39;email&#39;],config[&#39;password&#39;])
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Get your token and retrieve starred items&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;token = service.Get(&#39;/reader/api/0/token&#39;,converter=lambda x:x)


query = gdata.service.Query(feed=&#39;/reader/atom/user/-/state/com.google/starred&#39;)
feed = service.Get(query.ToUri())
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Open each item: in my case I open it with Google Chrome&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for entry in feed.entry:
    url = entry.GetHtmlLink().href
    # open in Chrome. This part varies depending on your system and your preference
    os.system(&amp;quot;open %s -a &#39;Google Chrome&#39;&amp;quot; % url)
    print entry.title.text
    print entry.GetHtmlLink().href
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Unstar each item:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for entry in feed.entry:
    i = entry.id.text
    s = entry.source.extension_attributes[&#39;{http://www.google.com/schemas/reader/atom/}stream-id&#39;]
    ret = service.Post(urllib.urlencode({
        &#39;i&#39;:i,
        &#39;r&#39;:&#39;user/-/state/com.google/starred&#39;,
        &#39;s&#39;:s,
        &#39;T&#39;:token
        }),
        &#39;/reader/api/0/edit-tag&#39;,
        converter = lambda x:x,
        extra_headers = {&#39;Content-Type&#39;:&#39;application/x-www-form-urlencoded&#39;})
    print &amp;quot;Unstar result: %s [id: %s]&amp;quot; % (ret, i)
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the whole thing in one shot. This code has more stuff.&lt;br /&gt;
In case you don&amp;rsquo;t want to keep your password inside this little script, it uses getpass command to ask you every time. But if you don&amp;rsquo;t care, you can just leave it out.&lt;br /&gt;
And, I added some exception handling.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python

import sys
import gdata.service
import json
import subprocess
from getpass import getpass
import urllib
from gdata.service import BadAuthentication

# password prompt
password = getpass(&#39;Enter your password for Google Reader: &#39;)

config = {&#39;email&#39;:&#39;YOUR-ACCOUNT@gmail.com&#39;, &#39;password&#39;:password}

service = gdata.service.GDataService(account_type=&#39;GOOGLE&#39;,
                                     service=&#39;reader&#39;,
                                     server=&#39;www.google.com&#39;,
                                     source=&#39;MyReader&#39;)

try:
  service.ClientLogin(config[&#39;email&#39;],config[&#39;password&#39;])
except BadAuthentication:
  print &amp;quot;Wrong password!&amp;quot;
  sys.exit()

# authenticated token
token = service.Get(&#39;/reader/api/0/token&#39;,converter=lambda x:x)

query = gdata.service.Query(feed=&#39;/reader/atom/user/-/state/com.google/starred&#39;)
total = 0
cleared = 0

while True:
    feed = service.Get(query.ToUri())
    count = len(feed.entry)
    total += count
    if count == 0:
        break
    for entry in feed.entry:
        url = entry.GetHtmlLink().href
        # open in Chrome
        result = subprocess.call([&amp;quot;open&amp;quot;, &amp;quot;-a&amp;quot;, &amp;quot;Google Chrome&amp;quot;, url])
        print entry.title.text
        print entry.GetHtmlLink().href

        if result != 0:
            print &amp;quot;Error opening the item&amp;quot;
        else:
            # now unstar it
            i = entry.id.text
            s = entry.source.extension_attributes[&#39;{http://www.google.com/schemas/reader/atom/}stream-id&#39;]
            ret = service.Post(urllib.urlencode({
                &#39;i&#39;:i,
                &#39;r&#39;:&#39;user/-/state/com.google/starred&#39;,
                &#39;s&#39;:s,
                &#39;T&#39;:token
                }),
                &#39;/reader/api/0/edit-tag&#39;,
                converter = lambda x:x,
                extra_headers = {&#39;Content-Type&#39;:&#39;application/x-www-form-urlencoded&#39;})
            cleared += 1
            print &amp;quot;Unstar result: %s [id: %s]&amp;quot; % (ret, i)
        print &amp;quot;===============================================================&amp;quot;
print &amp;quot;%d starred item found and %d cleared&amp;quot; % (total, cleared)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can just name this little script to something recognizable and execute it from your shell.&lt;br /&gt;
I guess it would be nice if it is a little app that sits on my desktop and by double-clicking, it opens all my starred items.&lt;br /&gt;
I guess if I have time, I&amp;rsquo;ll make one. But I don&amp;rsquo;t think this script gains any popularity.&lt;br /&gt;
It is just saving my little time from everyday routine. If there is someone like me, it might help, but not many for sure.
Or, I might rewrite it in Ruby just for fun. I first tried googlereader gem, but it turned out that it&amp;rsquo;s 5 years old and didn&amp;rsquo;t work. I stopped using Python regularly 5 or 6 years ago, it was the time I converted to Ruby. Python is nice. I never hated it or anything. So, this was quite refreshing exercise to program in Python.&lt;/p&gt;

&lt;p&gt;Thanks, I stole most of code from this page:&lt;br /&gt;
&lt;a href=&#34;http://moimoitei.blogspot.jp/2011/03/google-python-google-reader-api.html&#34;&gt;http://moimoitei.blogspot.jp/2011/03/google-python-google-reader-api.html&lt;/a&gt;.&lt;br /&gt;
Here is my &lt;a href=&#34;https://gist.github.com/2509075&#34;&gt;gist&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>