<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Neethack]]></title>
  
  <link href="http://neethack.com/" />
  <updated>2013-04-23T00:47:20-04:00</updated>
  <id>http://neethack.com/</id>
  <author>
    <name><![CDATA[Jimmy Chao]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Neethack" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="neethack" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Announcing Code-Warrior]]></title>
    <link href="http://neethack.com/2013/04/announcing-code-warrior/" />
    <updated>2013-04-18T11:38:00-04:00</updated>
    <id>http://neethack.com/2013/04/announcing-code-warrior</id>
    <content type="html"><![CDATA[<p>Recently I am preparing the interview with some companies in West Coast.<br/>
One of the problem I have during the preparation, which is because I am a vim user,
It is uncomfortable to practice algorithm questions on TopCoder, so I think it would be great if I have a npm tool that can
download algorithm problems and provide some skeleton test case for practice.
Therefore I created <a href="http://code-warrior.herokuapp.com">Code-Warrior</a></p>

<!-- more -->


<h2>Features</h2>

<p>Code warrior provide some basic algorithm questions like quicksort, tree traversal, with some more advence questions too.
The questions is all open source, so it can accept new algorithm questions on community.</p>

<p><a href="http://github.com/Rafe/code-warrior-questions">Code-Warrior questions</a></p>

<p>Code warrior also provide a web interface for people to check their status,
get score by solving questions and share the code by Github:gist.</p>

<h2>How to use?</h2>

<p>First, you can install the code-warrior cli by npm:</p>

<pre><code>npm install -g code-warrior
</code></pre>

<p>After that, you can create a directory for practice, init project on that directory:</p>

<pre><code>war init
</code></pre>

<p>Code warrior will require your github username and password for authenticate.<br/>
Your local directory should be like this after init:</p>

<pre><code>arena/
history/
node_modules/
package.json
.config.json
</code></pre>

<p>You can check the questions by command:</p>

<pre><code>war list
</code></pre>

<p>And download question to the <code>arena</code> folder by</p>

<pre><code>war -l [level] -s [id]
</code></pre>

<p>Or ignore the id, Code-Warrior will return first unanswered question.</p>

<p>Each question include a readme file, a test case and file to implement.</p>

<p>Implement the question in index.js, and pass the test cases.<br/>
you can test question by</p>

<pre><code>war
</code></pre>

<p>or just use mocha</p>

<pre><code>mocha arena
</code></pre>

<p>Then, commit the question on Code-Warrior:</p>

<pre><code>war commit
</code></pre>

<p>If the test cases passed on both local and server, you can gain score according to the level of question.
Check your status on site by:</p>

<pre><code>war status
</code></pre>

<p>Or login with Github on Code-Warrior site.</p>

<h2>More</h2>

<p>Right now it only provide javascript for writing the question.
But I will try to add ruby and python as language options.</p>

<p>Also, another secret command <code>war legend</code>,
which can download custom question for interviewing people, is working in progress.</p>

<p>You can contact me by daizenga [at] gmail.com if you have any suggestion on it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bacon.js for dummies]]></title>
    <link href="http://neethack.com/2013/02/bacon-dot-js-for-dummies/" />
    <updated>2013-02-04T16:25:00-05:00</updated>
    <id>http://neethack.com/2013/02/bacon-dot-js-for-dummies</id>
    <content type="html"><![CDATA[<p>Bacon.js is an FRP module for events on javascript. Which can transform
your event listener/handler to a functional event stream. After servey a few blogs and example project,
I found it is a really interesting concept and can make event handling speghetti code into clear functional logics.</p>

<h3>Event stream</h3>

<p>First, what is event stream?
Actually it is nothing special, it is just an event listener that listen to specific event.</p>

<p>For example,</p>

<pre><code>$("#clickme").on('click', function(event){ alert(event.target)})
</code></pre>

<p>Can transfer to event stream by Bacon.js&#8217;s asEventStream helper:</p>

<pre><code>clicked = $("#clickme").asEventStream('click')
</code></pre>

<p>And add handler to event stream, listen to click event:</p>

<pre><code>clicked.onValue(function(event){ alert(event.target) })
</code></pre>

<!-- more -->


<h3>So what&#8217;s the different?</h3>

<p>Remember what I said in the beginning, event stream is functional.
Which means it provide functional interface to manipulate events:</p>

<pre><code>clicked
  .map(function(event) { return event.target })
  .onValue(function(element) { alert(element) })
// will map the event to event.target

clicked.skip(1).take(4).onValue(function(event) { alert(event.target) })
// will only take the 2-5 click event.

clicked
  .filter(function(event) { return event.type == 'click' })
  .onValue(function(event) { alert(event.target)})
// will only take 'click' event on event stream
</code></pre>

<h3>Merge</h3>

<p>A powerful feature of event stream is it can merge with multiple stream.
For example, if we want to listen 2 click event with enable and disable state, you can merge the stream:</p>

<pre><code>enable = $('#enable').asEventStream('click').map(true)
disable = $('#disable').asEventStream('click').map(false)
enable.merge(disable).onValue(function(state) { alert(state) })
</code></pre>

<h3>Property</h3>

<p>Moreover, it provide property: an event stream with state.
What property different with event stream is it will remember the state of stream,
which is the event object or mapped value.</p>

<pre><code>buttonState = enable.merge(disable).toProperty(false)
// with initial state false
buttonState.onValue(function(state) {
  $('#button').toggleClass('enable', state)
})
</code></pre>

<p>Also, it provide scan and assign helper to provide advance usage.</p>

<h3>Message Queue</h3>

<p>We can also use the event stream as message queue.</p>

<pre><code>messageQueue = new Bacon.Bus()
messageQueue.plug(enable.map({type: 'enable'}))
messageQueue.plug(disable.map({type: 'disable'}))
//plug event stream to queue

messageQueue.onValue(function(event){ alert(event.type)})
// listen and alert event state

messageQueue.push({ type: 'disable'})
// push event manually, alert event
</code></pre>

<p>The project <a href="https://github.com/raimohanska/worzone">worzone</a> provide a more detailed implementation example for messageQueue</p>

<h3>Ajax</h3>

<p>You can use the .ajax() helper to pass stream params to .ajax(params) and listen the promise object as event stream</p>

<pre><code>response = enable.map({url: '/enable', method: 'post' }).ajax()
response.onValue(function(data) {
  alert(data)
})
</code></pre>

<h2>So what is it trying to solve?</h2>

<p>FRP, functional reactive programming on events.
Which reduce the duplicated part of event handling, and make code more looks like pure logic and functions.</p>

<p>I recommand to read the example of <a href="http://nullzzz.blogspot.fi/2012/11/baconjs-tutorial-part-i-hacking-with.html">Bacon.js tutorial</a>,
and <a href="https://github.com/raimohanska/todomvc">todomvc example</a> with Bacon.js.
It shows how the functional declarative can simplify codes.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[express bigpipe experiment]]></title>
    <link href="http://neethack.com/2013/01/express-bigpipe-experiment/" />
    <updated>2013-01-21T15:28:00-05:00</updated>
    <id>http://neethack.com/2013/01/express-bigpipe-experiment</id>
    <content type="html"><![CDATA[<h2>Bigpipe</h2>

<p>Bigpipe is an unique frontend technique used by Facebook to increase their page rendering speed.</p>

<p>When I read the article talk about <a href="https://www.facebook.com/note.php?note_id=389414033919">bigpipe on facebook</a>, I was pretty shocked about how facebook implements those unique ideas to
increase their page rendering speed.</p>

<p>Recently I am using node.js for web development, I think the async structure of node is a perfect environment to use this technique, so I wrote a small experiments app with express:</p>

<!--more-->


<h2>Streaming</h2>

<p>The technique behind Bigpipe is actually pretty simple,
what Bigpipe do is using http streaming to load the page seperatly.
When the page load, Facebook will return basic layout, css and assets manager(bootLoader) to user first.
Then other slower content like news feeds, notification will returned later on the same request as Pagelet.
A pagelet contain it&#8217;s own css, javascripts and contents,
after pagelet loaded, it will render itself to page,
and resources dependencies is managed by bootLoader so it won&#8217;t load duplicated resources.</p>

<p>The adventage of this approach is that the slower part of the request won&#8217;t block the whole page rendering.
User can get response for the completed part first, than receive the slower part.</p>

<h2>experiments on express</h2>

<p>In this example, I use express as web framework, async for async rendering and jQuery for render content to layout.</p>

<p><a href="http://express-bigpipe.herokuapp.com/">Demo</a></p>

<p>you can clone the gist and run it on local:</p>

<pre><code>git clone https://gist.github.com/4589002.git
cd 4589002
npm install
npm start
</code></pre>

<div><script src='https://gist.github.com/4589002.js?file='></script>
<noscript><pre><code>var express = require('express')
  , async = require('async')
  , path = require('path')
  , jade = require('jade')
  , fs = require('fs');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.use(express.favicon());
  app.use(express.logger('dev'));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

var loadView = function(name, locals) {
  var template = fs.readFileSync(path.join(__dirname, name + '.jade')).toString();
  return jade.compile(template)(locals);
};

var db = {
  search: function(callback) {
    setTimeout(function() {
      callback({items: ['test', 'test1', 'test2', 'test3']});
    }, 2000);
  },
  slowQuery: function(callback) {
    setTimeout(function() {
      callback();
    }, 5000);
  }
};

var renderLayout = function(req, res, next) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('&lt;html&gt;&lt;head&gt;&lt;title&gt;Test&lt;/title&gt;&lt;/head&gt;&lt;body&gt;');
  res.write(loadView('layout', {}));
  next();
};


var renderSidebar = function (req, res, next) {
  db.search(function(items) {
    var content = loadView('sidebar', items);
    res.write('&lt;script&gt;$(&quot;.content-sidebar&quot;).html(\'' + content + '\');&lt;/script&gt;');
    next();
  });
};

var renderContent = function (req, res, next) {
  var content = loadView('main', {title: 'Bigpipe!'});
  res.write('&lt;script&gt;$(&quot;.content-main&quot;).html(\'' + content + '\');&lt;/script&gt;');
  next();
};

var renderExtra = function (req, res, next) {
  db.slowQuery(function() {
    var extra = loadView('extra', {});
    res.write('&lt;script&gt;$(&quot;.content-extra&quot;).html(\'' + extra + '\');&lt;/script&gt;');
    next();
  });
};

var renderBody = function (req, res, next) {
  async.forEach([renderExtra, renderSidebar, renderContent], function(fn, done) {
    fn(req, res, done);
  }, next);
};

var renderEnd = function (req, res, next) {
  res.write('&lt;/body&gt;&lt;/html&gt;');
  res.end();
};

app.get('/', renderLayout, renderBody, renderEnd );

app.listen(3000);
console.log(&quot;Express server listening on port &quot; + app.get('port'));
</code></pre></noscript></div>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Understand event loops]]></title>
    <link href="http://neethack.com/2013/01/understand-event-loops/" />
    <updated>2013-01-09T18:02:00-05:00</updated>
    <id>http://neethack.com/2013/01/understand-event-loops</id>
    <content type="html"><![CDATA[<p>Event loop is the core feature in node.js,
and is also the reason why it is better on handling requests and realtime communication like long polling.</p>

<h2>The Obstacle of IO</h2>

<p>The reason is on this is because the I/O is expensive:</p>

<!--more-->


<ul>
<li>L1/cache: 3 cycles</li>
<li>L2/cache: 14 cycles</li>
<li>RAM: 250 cycles</li>
<li>Disk: 41,000,000 cycles</li>
<li>Network: 240,000,000 cycles</li>
</ul>


<p>In the case like web application, every request is not computing heavy but require lots of access on database and disk.
So the most time-costing task in a request is waiting database or disk to response.</p>

<p>To solve this problems, the application servers running multiprocess or multithread
to make it able to handle more request at same time.
however, the new process solution will cost large among of memory because the each fork will copy the memory data to new process.
Thread solution is more kindly on memory but still cost more memory.</p>

<h2>What is event loops?</h2>

<p>So the event loops become the solution of this.</p>

<h3>Asynchronous I/O aka Evented I/O</h3>

<p>The problem of I/O obstacle, is because I/O can run concurrently, but your code is not,
So while the code is accessing the I/O, the process can only idle and wait for the response:</p>

<p>Sync I/O in node.js:</p>

<pre><code>fs = require('fs')

var data = fs.readFileSync('file.txt')
// wait for IO to return content
console.log(data)
</code></pre>

<p>But with event loop, the program don&#8217;t need to wait for the I/O but can handle next task directly.</p>

<pre><code>fs = require('fs')

fs.readFile('file.txt', function(err, data){
  // Called when data is ready
  console.log(data)
});
// returns
</code></pre>

<p>The node.js event loop is using <a href="https://github.com/joyent/libuv">libuv</a> to handle the I/O multiplex
in the core function of libuv:</p>

<pre><code>//src/unix/core.c
int uv_run2(uv_loop_t* loop, uv_run_mode mode) {
  int r;

  if (!uv__loop_alive(loop))
    return 0;

  do {
    uv__update_time(loop);
    uv__run_timers(loop);
    uv__run_idle(loop);
    uv__run_prepare(loop);
    uv__run_pending(loop);
    uv__io_poll(loop, (mode &amp; UV_RUN_NOWAIT ? 0 : uv_backend_timeout(loop)));
    uv__run_check(loop);
    uv__run_closing_handles(loop);
    r = uv__loop_alive(loop);
  } while (r &amp;&amp; !(mode &amp; (UV_RUN_ONCE | UV_RUN_NOWAIT)));

  return r;
}
</code></pre>

<p>We can know the event loop is just a while loop, what it do is keep polling I/O for avalible fd(<a href="http://en.wikipedia.org/wiki/File_descriptor">file descriptor</a>)
and trigger event callback while the fd is ready.</p>

<p>in unix, there&#8217;s multiple way to polling fd:</p>

<ul>
<li>select</li>
<li>poll</li>
<li>epoll (linux)</li>
<li>kqueue (BSD, unix, osx)</li>
</ul>


<p>node.js is using kqueue on mac os/unix.</p>

<h2>Reactor pattern</h2>

<p><img src="https://www.evernote.com/shard/s77/sh/f0e52914-41be-436a-a278-a8b947e10136/531945eba0426e888dc1eccc6d66156b/res/57054967-d0d3-421d-9c77-fc29957048be/skitch.png" alt="Reactor Pattern" /></p>

<p>In javascript, function can be passed as first class object,
so the code on node.js is heavily using callback and event to make efficient async I/O.</p>

<p>example a db query:</p>

<pre><code>db.posts.find(function(err, posts){
  console.log(posts);
});
</code></pre>

<p>could pass a function as callback to event loop, trigger it when the data is available.
and process can handle other tasks during response.</p>

<p>Also, the process.nextTick can also pass function to event loop, execute the function when the process is avaliable for task.</p>

<pre><code>//Blocked:

// some time consuming task
for(var i=0;i &lt; 10000000000; i++){}
console.log('done');

console.log('return')
//&gt;&gt; done
//&gt;&gt; return
</code></pre>

<p>-</p>

<pre><code>//Async:

process.nextTick(function(){
  // some time consuming task
  for(var i=0;i &lt; 10000000000; i++){}
  console.log('done');
});

console.log('return')
//&gt;&gt; return
//&gt;&gt; done
</code></pre>

<h2>reference</h2>

<ul>
<li><a href="http://truthabouteventloops.com/">The truth about event loops online masterclass</a></li>
<li><a href="http://howtonode.org/61f361ddb1696aee4afedaf356430cdd768b1d73/understanding-process-next-tick">Understanding process.nextTick()</a></li>
<li><a href="http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/">Understanding the node.js event loop</a></li>
<li><a href="http://fred-zone.blogspot.com/2012/09/glib-main-event-loop-nodejs-libuv.html">Integration of GLib Main Event Loop and Node.js (chinese) </a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Review of 2012]]></title>
    <link href="http://neethack.com/2012/12/review-2012/" />
    <updated>2012-12-31T18:58:00-05:00</updated>
    <id>http://neethack.com/2012/12/review-2012</id>
    <content type="html"><![CDATA[<p>2012 is a great year for me, lots of new things and new experience happened,
and I also explored and learned lots of things in software from work and projects.</p>

<p>In the last day of 2012, I think it is a good time to review what I have done in this year,
what I can improve and my expectation for the incoming year.</p>

<!--more-->


<h2>Work</h2>

<h3>Ruby, python and coffeescript</h3>

<p>In 2012, I mainly work on three different languages:
I was working on Rails from last year&#8217;s project, and join spling.com afterward.
Start to accomondate with django and celery. And write some side project with coffeescript in my offtime.
Derive from those experience of side projects. Now I am mainly working on node.js.
The build-in event loop of node.js is really powerful,
not only make your code can work in real time application but also make it more efficient to handle requests.
And the community is very active too. Lots of packages and new thoughts are invented (or reinvented) in node.
Although javascript(and coffeescript) is not as clean and pleasure to work with as Ruby on Rails.
But so far I feel pretty comfortable on this platform, I will continue to write code on node.js in 2013.</p>

<h3>Source code reading</h3>

<p>Another big improvement this year is I started to read more source code in open source projects.
Start with Sinatra, I took the class of <a href="http://owningrails.com/">reading source code of Rails</a>, and read through express, railsway.js and Tower.js,
some client side framework like ember.js and angular.js.
Other than web frameworks, I randomly read the source of some interesting projects too.
Although I don&#8217;t feel my coding speed is faster, but I learned something from design and code details in those projects.
Also it largely improved my code reading speed and ability to work on existing project.</p>

<h3>Messaging queue</h3>

<p>Working on celery and node.js makes me learned more how to work async,
in spling.com, we process the link we a sequence of small tasks, like web parse and api calls.
How to run those tasks in parallel and aggregate results make me easier to work on node.js.</p>

<h3>Javascript frameworks</h3>

<p>In the frontend part, I worked on Backbone.js in spling.
But I also survey and read sources of other front-end frameworks and examples of Todos mvc.
like ember.js, angular.js and components. Ember.js is a powerful framework,
but too many magics behind and learning curve is pretty steep. For the need of javascript MVC,
I still prefer Backbone and I would like to try more things on <a href="https://github.com/component/component">components</a>.
I think it is a powerful concept, and I am going to build a new project base on it.</p>

<h3>Projects</h3>

<p>In last year, I was planning to more involved in open source development.
But in the end didn&#8217;t contribute any valuable code to big projects :(
However, I still fork and patch some projects for my own requirement and create some projects on github. included:</p>

<ul>
<li><a href="https://github.com/Rafe/papercut">Papercut</a> : node.js carriar wave clone.</li>
<li><a href="http://n37.co">n37.co</a> : express url shortener.</li>
<li><a href="http://neethack.com/resume">Resume</a> : build my resume to html, pdf and host on github pages.</li>
<li><a href="https://github.com/Rafe/Bands-in-town-watcher">Bands-in-town-watcher</a> : Running cron job to check changes on bands schedule.</li>
<li><a href="https://github.com/Rafe/mail_parser">mail-parser</a> : ruby dsl parser for parsing email.</li>
<li><a href="https://github.com/Rafe/Chatty">Chatty(incomplete)</a> : socket.io chat room lib.</li>
</ul>


<p>Also, I initiate a few private projects too:</p>

<ul>
<li>tilio : node pinterest clone.</li>
<li>masxaro : Rails application that parse receipts email and display what user have bought.</li>
<li><a href="http://getflow.herokuapp.com/">getflow</a> : My attempt for Pomodoro, but I am still fighting to produce more quality concentration time.</li>
<li><a href="http://playdiary.tw">playdiary.tw</a> : A wordpress blog that aggregate my friend&#8217;s travel and food articles,
the purpose of this blog is to learn facebook fan page and ad. Right now I stop posting new article on it,
Because posting other people&#8217;s article is not that fun.
However I am still planing to rebuild this blog with static content generator and my own articles.</li>
</ul>


<p>Other than those, thanks <a href="https://twitter.com/amonter5">@amonter5</a> teach me the basic of iOS development.</p>

<p>Overall, although I created numbers of projects, those project&#8217;s quality is not good enough.
Need to improve completeness, have more documents for projects in 2013.
Also trying to maintain an open source package may be a good way to learn how to create popular projects.</p>

<h2>Life</h2>

<p>Other than code, I enjoy a lot of the New York life. Thanks my bro, Alan, who take me to all those great trips and concerts.</p>

<h3>Travels</h3>

<ul>
<li><p>Taiwan<br/>
<img src="https://lh4.googleusercontent.com/-yH-mJS8QDm8/UOOCm4prkZI/AAAAAAAABSE/fo3YI5vgEYE/s860/P1010505.JPG" alt="" />
Back to the home after 2 years. Meet friends and reunion with family.</p></li>
<li><p>Gwan<br/>
<img src="https://lh6.googleusercontent.com/-lHXVAr0yb8M/UOOCnsaWjrI/AAAAAAAABSM/jA116KOMsNw/s860/P1010615.JPG" alt="" />
For my brother&#8217;s wedding, it&#8217;s an unforgetable one. Well arranged, the church there is really beautiful.</p></li>
<li><p>Japan<br/>
<img src="https://lh6.googleusercontent.com/-RMKFXejdEFY/UOOCpCfkmEI/AAAAAAAABSU/KtGrNh3a10s/s860/P1010864.JPG" alt="" />
For snowboard and meet with my friend. Great trip, hot spring after snowboard is the best.
Stay with one of my best friend in highschool in sendai and watch K-ON movie is very&#8230;Otakuness.</p></li>
<li><p>Vegas and Grand Canyon<br/>
<img src="https://lh5.googleusercontent.com/-KhTr3hCPZCo/UOOCwUDC1hI/AAAAAAAABS0/EKC4cpEYUIw/s860/P1020532.JPG" alt="" />
With my parents, treval with parents is one of my most meaningful memory.
Vegas and Grand Canyon is great, hope we can have another trip soon.</p></li>
<li><p>Miami<br/>
<img src="https://lh3.googleusercontent.com/-pIZPvANTajg/UOOCiRc8v1I/AAAAAAAABRU/Xz7zfiK38p4/s860/IMG_4151.JPG" alt="" />
Jet Pack rules, the coolest water activity I ever have. another great trip include nude swiming in keywest beach.</p></li>
<li><p>Peru<br/>
<img src="https://lh4.googleusercontent.com/-D80SInjLTU0/UOOCgWsBZTI/AAAAAAAABQ8/7zF5HnvYgc8/s860/P1050788.JPG" alt="" />
Treveled around Cusco, walked through Inca trail in a 4 days 3 nights hike and visited Maccu Picchu.
Than went to Puno and lake Titicaca, Back to Lima and watch Nasca line and sandboarding in dessert.
Fly to Amazon Jungle and live in Jungle launge for Safari. Try the best 2 restaurants in Peru.
To much memory there. It&#8217;s the best trip ever.</p></li>
</ul>


<h3>Experence</h3>

<ul>
<li>Gun shooting<br/>
<img src="https://lh4.googleusercontent.com/-qKLKTBNO7-c/UOOCxwnT6fI/AAAAAAAABS8/fESsbO0ng3I/s860/P1020627.JPG" alt="gun shooting" /></li>
<li>Jet Pack</li>
<li>Wakeboard<br/>
<img src="https://lh5.googleusercontent.com/-9a1cR-Lbat8/UOOCdlAB62I/AAAAAAAABQs/pXTek3-tm-A/s860/IMG_9901.JPG" alt="Wakeboard" /></li>
<li>Rafting</li>
<li>Kayaking to Status of Liberty
<img src="https://lh5.googleusercontent.com/-g_2b5M84WcE/UOOCg5eM0SI/AAAAAAAABRE/3L0CVPxxJHw/s860/P1020739.JPG" alt="" /></li>
<li>Bartender bootcamp</li>
</ul>


<h3>Concerts and games</h3>

<ul>
<li>JayZ</li>
<li>Orion festivel, Metalica</li>
</ul>


<iframe width="560" height="315" src="http://www.youtube.com/embed/iPDGI9jh4KI?rel=0" frameborder="0" allowfullscreen></iframe>


<ul>
<li>Slipknot
<img src="https://lh4.googleusercontent.com/-m6dnGiyycGw/UOOCjS159HI/AAAAAAAABRk/2uzGq7kx4hc/s860/IMG_2710.JPG" alt="" /></li>
<li>Linkin Park
<img src="https://lh3.googleusercontent.com/-G3vAdt-VFPo/UOOCiwG2FrI/AAAAAAAABRc/ZWO8l4FVx1w/s860/IMG_3013.JPG" alt="" /></li>
<li>Off Spring</li>
<li>RHCP</li>
<li>Knicks vs Rockets
<img src="https://lh4.googleusercontent.com/-Ow5UXENAiww/UOOCeVulLtI/AAAAAAAABQ0/Z5jSQco9KDA/s860/P1060665.JPG" alt="" /></li>
<li>L&#8217;arc En Ciel</li>
<li>Live-In Theater Interactive Murder Mystery</li>
<li>Sleep No More
<img src="http://3.bp.blogspot.com/-nQCriUAqtUo/T6X_AguLdvI/AAAAAAAAMLA/Czf2sqUKpQg/s640/IMG_9090.JPG" alt="" /></li>
<li>Spiderman - Turn off the dark
<img src="https://lh4.googleusercontent.com/-ML4vfiQnqZM/UOOCkaW5XMI/AAAAAAAABR0/bfF0IMkYhW8/s967/IMG_5461.JPG" alt="" /></li>
</ul>


<h2>Plan for 2013</h2>

<h3>Code</h3>

<p>More coding!<br/>
Seriously, I need to concentrate and push myself more on coding.
One of my problem is I can&#8217;t keep my productivity in high gears,
and spend too much time on reading fourm and online comics.
Also need to code more efficiently with tools and learn from great programmers.</p>

<h3>Project</h3>

<p>Currently trying to build a components based static html engine: Meteora,
with components, theme and widget can be managed by dependencies and can be reused easily.
Main target is to complete this and use it to rebuild my blog, playdiary.tw and my brother&#8217;s blog.</p>

<h3>One blog every week</h3>

<p>Also, improve my blogging and English writing. Have to keep the blog speed to 1~2 hour and keep writing.
However, a high quality blog like Source code odyssey series will take about 3~4 days to finish.
So how to keep quality and speed might be a problem but, I have to keep the tempo of writing blog.</p>

<p>some blog ideas for 2013:</p>

<ul>
<li>Event loop</li>
<li>Hadoop</li>
<li>Build your Iaas : AppHouse</li>
<li>Meteor</li>
<li>Jquery deffered</li>
<li>Advence Git</li>
<li>Chef</li>
<li>Source code odyssey : Railsway.js</li>
<li>Source code odyssey : Pow</li>
<li>Source code odyssey : Hubot</li>
<li>Source code odyssey : Redis</li>
</ul>


<h3>Reading</h3>

<p>Read more non-fiction and technical books:</p>

<ul>
<li>Machine Learning for Hackers</li>
<li>Enterprise application patterns</li>
<li>Continuously delivery</li>
<li>Javascript Ninja</li>
<li>Big data</li>
<li>Rails essential patterns</li>
<li>Create your own programming language</li>
</ul>


<h3>Novel</h3>

<p>Finish a novel is one of my dreams, and should be a goal in 2013.
Some drafts in my dropbox need to be completed.</p>

<h3>Travel</h3>

<p>Probally not as much as 2012, but I want to visit Europe and Japan again if I have chance in 2013.
and meet my friend in San Francisco and developers in Silicon Valley.
Also a weekend trip to Chicago will be great too.</p>

<h3>And&#8230;</h3>

<p><img src="https://www.evernote.com/shard/s77/sh/5df0206c-85c2-43b8-ba2f-c2a2aebc9cc3/8f06e41d6aaf0945662eaa673140825a/res/bd4dfc5a-4847-4b0f-996b-2f814f278982/skitch.png?resizeSmall&amp;width=832" alt="" />
I don&#8217;t know this project will works or not, but I will try my best on it.
Wait and see in 2013&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Announcing Papercut]]></title>
    <link href="http://neethack.com/2012/12/announcing-papercut/" />
    <updated>2012-12-21T00:55:00-05:00</updated>
    <id>http://neethack.com/2012/12/announcing-papercut</id>
    <content type="html"><![CDATA[<p>Inspiring by <a href="https://github.com/jnicklas/carrierwave">carrierwave</a> on Rails.
I wrote a image processing framework to handle images with different versions on node.js and express.
Integrate with node-imagemagick and can upload image to Amazon S3.
It is just a simple version of carrierwave with similiar Api.
But I am comfortable with the features, which is enough for my requirement right now.
I will try to improve the image processing efficiency, and add more processing options for future usage.</p>

<p>You can check this project on <a href="https://github.com/Rafe/papercut">Github</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Minispec : mini BDD framework in coffeescript]]></title>
    <link href="http://neethack.com/2012/11/minispec-mini-bdd-framework-in-coffeescript/" />
    <updated>2012-11-07T15:16:00-05:00</updated>
    <id>http://neethack.com/2012/11/minispec-mini-bdd-framework-in-coffeescript</id>
    <content type="html"><![CDATA[<h2>Just another test framework</h2>

<p>During the catastrophe of Sandy storm, my place have no electricity and water, so I stay in my friends place for whole week.
And I need to find something to do except eating, surfing internet and boardgame.
So I just wrote another test framework.</p>

<p>Inspired by Zach Holoman&#8217;s <a href="https://gist.github.com/1806986">gist</a>
I try to host the framework in the gist form. Because every gist is also a git repository.</p>

<p><a href="https://gist.github.com/4033566">gist source</a></p>

<!-- more -->


<h2>Spec</h2>

<p>The README.md file is also a runnable spec in coffeescript.
run</p>

<pre><code>npm test
</code></pre>

<p>in project can execute the spec</p>

<div><script src='https://gist.github.com/4033566.js?file=README.md'></script>
<noscript><pre><code># Minispec
#### minispec is a mini bdd test framework example
    # npm install git://gist.github.com/4033566.git

    # require('minispec') in your project
    require('./minispec')

    # use expect.js for assertion (http://n37.co/aemDq)
    expect = require('expect.js')

    user = &quot;&quot;
    describe &quot;Minispec&quot;, -&gt;
      before -&gt;
        user = name: &quot;Jimmy&quot;

      it 'can success', -&gt;
        expect(true).to.be.ok()

      it 'can fail', -&gt;
        expect().fail -&gt;

      it 'have before', -&gt;
        expect(user.name).to.equal &quot;Jimmy&quot;

      describe 'after', -&gt;

        after -&gt;
          throw new Error('in after')

        it 'will be executed', -&gt;
          expect(true).to.be.ok()

      describe 'nested describe', -&gt;
        before -&gt;
          user.password = '123'

        it 'with nested before', -&gt;
          expect(user.password).to.be '123'

        it 'with nested after', -&gt;
          expect(user.password).to.be '123'

        it 'can also have error', -&gt;
          expect().fail -&gt;

        describe 'nested in nested', -&gt;
          it 'is nested', -&gt;
            expect(1).to.be.ok()

      describe 'async function', -&gt;

        it 'have callback', (done)-&gt;
          expect(1).to.be.ok()
          done()
</code></pre></noscript></div>


<h2>Global delegation</h2>

<p>One of the problem is the format of syntax.
Because I want to write syntax without extra <code>this</code> keyword, so instead of calling the test block with &#8216;call&#8217;,
I have to declare test syntax globally.</p>

<pre><code>#Instead this
describe = (title, block)-&gt;
  @it = (desc, fn)-&gt;
    #add test to test suite
  block.call(@)

describe "syntax", -&gt;
  @it "have this keyword", -&gt;

#Got to do it Globally
global.it = (desc, fn)-&gt;
  #add test to test suite
describe = (title, block)-&gt;
  block()

describe "syntax", -&gt;
  it "have no this keyword", -&gt;
</code></pre>

<p>But there&#8217;s 2 problem of declaring global, one is the confrontation of global keywords, which is a tradeoff for simpler syntax.
Another problem is when implementing nested block, test need to be delegated into right suite.
Using a stack to track the current suite can solve this problem.</p>

<pre><code>suites = []
global.it = (desc, fn)-&gt; 
  suites[0].tests.push title: desc, fn: fn

describe = (title, block)-&gt;
  suite = new Suite(title)
  suites.unshift(suite)
  block()
  suites.shift()
</code></pre>

<p>So the global <code>it</code> will always add test to the top of stack, which is the current test suite.</p>

<h2>Hook and run</h2>

<p>For the before/after function, I use the EventEmitter to trigger the hooks, and delegate event to the parent suite:</p>

<pre><code>class Suite extends EventEmitter
  constructor: (@title, @parent)-&gt;
    ...
    @delegate ['before', 'after']
    @on 'result', @reportResult
    @on 'end', @reportSummary

  delegate: (events)-&gt;
    events.forEach (event)=&gt;
      @on event, =&gt; @parent?.emit event

  run: -&gt;
    @emit 'start'
    @tests.forEach (test)-&gt;
      try
        @emit 'before'
        test.fn()
        @emit 'result', test
        @emit 'after'
      catch err
        @emit 'result', test, err
    @emit 'end'
</code></pre>

<h2>Async</h2>

<p>For testing the async callback, <code>it</code> also provide a done callback for the async function.
And I use <a href="https://github.com/caolan/async">async</a> module to handle the test execution sequence.
It will detect the function param, if there is a specific callback param in function, execute in async mode.</p>

<h2>Source</h2>

<div><script src='https://gist.github.com/4033566.js?file=minispec.coffee'></script>
<noscript><pre><code>{EventEmitter} = require 'events'
async = require 'async'

#utils
color = (code)-&gt; (text = &quot;&quot;)-&gt; code + text + '\u001b[0m'
red = color('\u001b[31m')
green = color('\u001b[32m')
yellow = color('\u001b[33m')
pluralize = (count, noun)-&gt; if count &gt; 1 then noun + 's' else noun
indent = (level)-&gt; ('  ' for i in [0...level]).join('')

class Suite extends EventEmitter
  constructor: (@title, @parent)-&gt;
    @errors = 0
    @tests = []
    @childs = []
    @parent?.childs.push @
    @level = @parent?.level + 1 or 0

    @on 'start', =&gt; @report yellow @title
    @delegate ['before', 'after'] if @parent?
    @on 'result', (test, err)=&gt;
      if err?
        @errors += 1
        @report red &quot;  ✗ #{test.title} (#{err})&quot;
      else
        @report green &quot;  ✓ #{test.title}&quot;
    @on 'end', =&gt;
      count = @tests.length
      errors = @errors

      (reduce = (suites)-&gt;
        suites.forEach (suite)-&gt;
          count += suite.tests.length
          errors += suite.errors
          reduce suite.childs if suite.childs?
      )(@childs)

      console.log yellow &quot;run #{count} #{pluralize(count, 'test') } , #{count - errors} success, #{errors} failed&quot;

  delegate: (events)-&gt;
    events.forEach (event)=&gt;
      @on event, ()=&gt; @parent?.emit event

  report: (text)-&gt; console.log indent(@level) + text

  run: -&gt;
    @emit 'start'
    async.forEachSeries @tests, (test, next)=&gt;
      callback = =&gt;
        @emit('after')
        @emit('result', test)
        next()

      try
        @emit('before')
        if test.isAsync
          test.fn callback
        else
          test.fn()
          callback()
      catch err
        @emit('result', test, err)
        next()
    , =&gt;
      @childs.forEach (spec)-&gt; spec.run()
      @emit 'end' unless @parent?

class Runner
  constructor: (context)-&gt;
    suites = []
    context.it = (desc, fn)-&gt;
      suites[0].tests.push title: desc, fn: fn, isAsync: !!fn.length
    context.before = (fn)-&gt;
      suites[0].on 'before', fn
    context.after = (fn)-&gt;
      suites[0].on 'after', fn
    context.describe = (title, block)-&gt;
      suite = new Suite(title, suites[0])
      suites.unshift(suite)
      block()
      suites.shift()
      suite.run() if suites.length is 0

new Runner(global or window)
</code></pre></noscript></div>


<h2>Summary</h2>

<p>Credit to VisionMedia&#8217;s <a href="https://github.com/visionmedia/mocha">mocha</a> framework, lots of solution is comming from there.</p>

<p>But still this is an intersting small project to do in the storm days.</p>

<p>And I am so happy to back to the normal life.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reading: The Lean Startup]]></title>
    <link href="http://neethack.com/2012/09/reading-the-lean-startup/" />
    <updated>2012-09-13T16:55:00-04:00</updated>
    <id>http://neethack.com/2012/09/reading-the-lean-startup</id>
    <content type="html"><![CDATA[<blockquote><p>A startup is a human institution designed to deliver a new product or service under conditions of extreme uncertainty.</p></blockquote>

<p>Recently I finally finish reading the lean startup book.</p>

<p>The author Eric Ries is writing <a href="http://www.startuplessonslearned.com/">blog</a> for sharing his startup experience for several years.
This book is include his experience of his own startup and tutoring experience.
He points out lots of the critical problems that a startup will face.
Include finding market fit, testing hypothesis and validate growth.</p>

<p>As an employee of a startup, It is a really interesting book.</p>

<!-- more -->


<h2>Problems</h2>

<p>The whole book is contentrate on a problem that lots of startup will face:</p>

<p>Imagine your team work on the product really hard, but in the end nobody is using that product.
Or, When the team finish up a feature. But you have no idea if it will make any change to your low customer conversion rate.
That is the most depressing thing a startup can have.</p>

<p>Those waste of productivity will draining team&#8217;s energy, depress the passion and most important, burning money.</p>

<p>Eric Ries, as an entrepreneur and consultant of startup. Knowing this problem and lean startup is the book focusing on
how to use scientific management skills and matric to valuate decision to make team be able to learning from those waste.</p>

<h2>Testing</h2>

<p>In the startup, usually the whole business idea is an hypothesis without prove.
So we have to use all kinds of test to validate our hypothesis is correct or not.
Include talking to customer, film the conceptual film, preview with minimal viable product, etc.
After the product is out, we need to know the growth engine of product and collect the data to validate the direction is correct or not.</p>

<p>In the story of great company, usually there is a leader with great vision who will lead the team to create outstanding product.
But Eric point out the truth that, most of the team fails on those vision too. For a well-grounded team, we need to validate the data,
continous fixing direction and provide features that customer really want. That require not intuitive, but the decision based on data.
Continously testing every business assumption to increase the matrix.</p>

<h2>Pivot</h2>

<p>Another concept that Eric avoke is Pivot, which is when the testing failed to prove the business hypothesis is correct,
or the growth rate is not as expected. The company need to commit the failure and make change of direction.</p>

<p>But when to pivot is a critical problem, in book Eric said they will have a Pivot or preserve meeting everytime they have this issue.
Basically I think Pivot is a flexible way to find the market fit. But not nessassary can help company to find market.
In my opinion that Pivot should be pulled out from a failed hypothesis, and should follow the passion of whole team.</p>

<h2>Engineering</h2>

<p>In engineering side, a team should focus on create product with minimal feature, and continous deployment with small batch
and testing continously too. Other than that this book doesn&#8217;t focus on technical too much. But follow the best practice,
doing testing and continous integration. Code review can increase the maintainability of product. Also, try not to reuse all codes when Pivot,
The old code will only drag the productivity but not fit the new requirement.</p>

<p>Another problem in startup is the cross functional team. In a big company, there will be developer, product manager,
designer and system operator. But in startup, every person need to work cross functional to improve the development process.
A developer need to be able to open new machine and deploy, fixing user interface, adding new features and new tests.
Same as designer, operator and product manager. Team need to lower the obstacle stop the cross functional work.</p>

<h2>Team</h2>

<p>How to build the team for lean startup? In lean startup it focus on educate the team to fit the requirement.
Its true that it is hard to hire the &#8216;Ninja&#8217; or &#8216;Rockstar&#8217; in startup. Find people smart and get things done.
Teach them to fit the team is much easier.</p>

<h2>Culture</h2>

<p>Lean startup doesn&#8217;t mention this too much, but I think the culture is an important part of a company.
A culture is defined by how the founder and team work, It can be a small work habit or development methology.
So a startup need to caucious what culture they want to build, and work toward that way.
Like the hacker culture in Facebook, Startup culture in Apple, 20% time culture in Google, etc.</p>

<h2>Conclusion</h2>

<p>This book is based on author&#8217;s experience and is really informative. Although all the method aren&#8217;t nessassary fit into all startup.
But some of the concept like the data based decision, small batch and all the concept can boarden the entrepreneur&#8217;s view
The startup isn&#8217;t nessassary to be a chaos of intuition and vision.  It is a managable and repeatable process of new company.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Twelve factors app]]></title>
    <link href="http://neethack.com/2012/09/twelve-factors-app/" />
    <updated>2012-09-11T12:33:00-04:00</updated>
    <id>http://neethack.com/2012/09/twelve-factors-app</id>
    <content type="html"><![CDATA[<p>The Twelve Factors App is a methodology that a web application should follow to be able to easily deploy and scale on today&#8217;s SAAS platform like Heroku. This methodolgy is announced by the Heroku Founder Adam Wiggins. The content is the based on their experience of deploying millions of applications.</p>

<p>When I first saw this declaration, I just feel that this might be extract from rails and herokus best practices, but actually this declaration is more then practices but a methodology to improve the maintainbility and scalability of web application. so I like to share Heroku engineer&#8217;s slide about 12 factors app:</p>

<!-- more -->




<script async class="speakerdeck-embed" data-id="50254cb6af597c0002005bf3"
  data-ratio="1.3333333333333333" src="http://neethack.com//speakerdeck.com/assets/embed.js"></script>


<h2><a href="http://www.12factor.net/">The Twelve-Factor App</a></h2>

<h3>I. Codebase</h3>

<blockquote><p>One codebase tracked in revision control, many deploys</p></blockquote>

<h3>II. Dependencies</h3>

<blockquote><p>Explicitly declare and isolate dependencies</p></blockquote>

<h3>III. Config</h3>

<blockquote><p>Store config in the environment</p></blockquote>

<h3>IV. Backing Services</h3>

<blockquote><p>Treat backing services as attacked resources</p></blockquote>

<h3>V. Build, release, run</h3>

<blockquote><p>Strictly separate build and run stages</p></blockquote>

<h3>VI. Processes</h3>

<blockquote><p>Execute the app as one or more stateless processes</p></blockquote>

<h3>VII. Port binding</h3>

<blockquote><p>Export services via port binding</p></blockquote>

<h3>Concurrency</h3>

<blockquote><p>Scale out via the process model</p></blockquote>

<h3>IX. Disposability</h3>

<blockquote><p>Maximize robustness with fast startup and graceful shutdown</p></blockquote>

<h3>X. Dev/prod parity</h3>

<blockquote><p>Keep development, staging, and production as similar as possible</p></blockquote>

<h3>XI. Logs</h3>

<blockquote><p>Treat logs as event streams</p></blockquote>

<h3>XII. Admin processes</h3>

<blockquote><p>Run admin/management tasks as one-off processes</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bootstrap your Ember.js application]]></title>
    <link href="http://neethack.com/2012/09/bootstrap-your-ember-dot-js-application/" />
    <updated>2012-09-04T18:06:00-04:00</updated>
    <id>http://neethack.com/2012/09/bootstrap-your-ember-dot-js-application</id>
    <content type="html"><![CDATA[<p><a href="http://emberjs.com">Ember.js</a> is a javascript MVC framework developed by Rails
core team member <a href="http://yehudakatz.com">Yehuda Katz</a>, <a href="http://tomdale.net/"> Tom Dale </a> and Charles Jolley. Compare to other javascript MVC framework, Ember.js not only provide a MVC framework for seperation of logics, but also focusing on some common problems when developing complex javascript application.</p>

<h2>Binding</h2>

<p>One common problem of javascript application is how to manipulate DOM element and insert data into DOM, for example, a jQuery app retrive user data and show on screen will look like this:</p>

<!-- more -->




<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/user&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#username&#39;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">data</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the application growth, the code of updating data onto dom will become huge repeating logic, for solving this problem, Ember.js use the handlebar template and binding, for example, a handlebar template will look like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;script</span> <span class="na">type=</span><span class="s">&quot;text/x-handlebars&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  Hello, { { App.user.name }}
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And binding with a Ember.js Object:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">user</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">getName</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/user&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">){</span>
</span><span class='line'>      <span class="nx">self</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">getName</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Behind the scene, handlebar will compile template with script tags:</p>

<pre><code>Hello &lt;script id="metamorph-0-start" type="text/x-placeholder"&gt;&lt;/script&gt;
Jimmy
&lt;script id="metamorph-0-end" type="text/x-placeholder"&gt;&lt;/script&gt;
</code></pre>

<p>And handlebar will auto update the value between tags. So the data and dom will always be synced.
This save lots of work for updating data.</p>

<p>Also, Ember can calculate the compounded values and update it automatically, for example, we can change the name attribute that combine the firstName and LastName value together:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">user</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">firstName</span><span class="o">:</span> <span class="s2">&quot;Jimmy&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">lastName</span><span class="o">:</span> <span class="s2">&quot;Chao&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}.</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The template will automatically updated when firstName and lastName value changed.
We can also bind other object with property binding:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">profile</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">usernameBinding</span><span class="o">:</span> <span class="s1">&#39;App.user.name&#39;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">profile</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;username&#39;</span><span class="p">);</span> <span class="c1">// &quot;Jimmy Chao&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The attribute and template will also automatic updated when value changed</p>

<h2>View</h2>

<p>In Ember.js, view is in charge of handling events and present data. We know the data is autobinding on template, but what about events? It turns out Ember.js will populate event all the way to parent view to handle, and event can be bound on template for specific element:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">userView</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">templateName</span><span class="o">:</span> <span class="s1">&#39;user-view&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Bob&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">click</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;clicked&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">sayHello</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;hello!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">userView</span><span class="p">.</span><span class="nx">appendTo</span><span class="p">(</span><span class="nx">App</span><span class="p">.</span><span class="nx">rootElement</span><span class="p">);</span> <span class="c1">//append view to the application</span>
</span></code></pre></td></tr></table></div></figure>


<p>And define the event in action helper:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;script type="text/x-handlebars" data-template-name='user-view'>
</span><span class='line'>  Hello,  &lt;br />
</span><span class='line'>  &lt;a href="#" >Say Hello&lt;/a>
</span><span class='line'>&lt;/script></span></code></pre></td></tr></table></div></figure>


<p>Then when user click link, it will trigger both &#8216;click&#8217; and &#8216;sayHello&#8217; event.
The view template and view is connected together and will always be sync, so we don&#8217;t have to rerender or trigger change event when value changed. this is the different of Ember.js view and other view templates. But the cons is you can only use handlebar.js to have autoupdate template.</p>

<h2>Combounded View</h2>

<p>Another problem for javascript application is the view structure. When application grow, it will generate main view and sub views under the main. For solving this problem, Ember.js provide ContainerView that can define childView in it.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">mainView</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">ContainerView</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">childViews</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;navigationView&#39;</span><span class="p">,</span> <span class="s1">&#39;mainView&#39;</span><span class="p">,</span><span class="s1">&#39;footerView&#39;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">navigationView</span><span class="o">:</span> <span class="nx">App</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">templateName</span><span class="o">:</span> <span class="s2">&quot;nav-view&quot;</span>
</span><span class='line'>  <span class="p">}),</span>
</span><span class='line'>  <span class="nx">outletView</span><span class="o">:</span> <span class="nx">App</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">template</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Handlebars</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span> <span class="s1">&#39;{ {outlet}}&#39;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">}),</span>
</span><span class='line'>  <span class="nx">footerView</span><span class="o">:</span> <span class="nx">App</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">templateName</span><span class="o">:</span> <span class="s2">&quot;footer-view&quot;</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">MainView</span><span class="p">.</span><span class="nx">appendTo</span><span class="p">(</span><span class="nx">App</span><span class="p">.</span><span class="nx">rootElement</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this ContainerView, we can define any numbers of sub view and append them to application.</p>

<p>And for displaying multiple elements, Ember.js also provide CollectionView, which can render view for each items in content:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">HelloView</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">template</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Handlebars</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="s1">&#39;Hello { {view.content}}&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">usersView</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">CollectionView</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">content</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;Jimmy&quot;</span><span class="p">,</span> <span class="s2">&quot;Bob&quot;</span><span class="p">,</span> <span class="s2">&quot;Jack&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">itemViewClass</span><span class="o">:</span> <span class="nx">HelloView</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">usersView</span><span class="p">.</span><span class="nx">appendTo</span><span class="p">(</span><span class="nx">App</span><span class="p">.</span><span class="nx">rootElement</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Append:</span>
</span><span class='line'><span class="c1">//&lt;div class=&#39;ember-view&#39;&gt; Hello Jimmy&lt;/div&gt;</span>
</span><span class='line'><span class="c1">//&lt;div class=&#39;ember-view&#39;&gt; Hello Bob&lt;/div&gt;</span>
</span><span class='line'><span class="c1">//&lt;div class=&#39;ember-view&#39;&gt; Hello Jack&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will display 3 hello view and append to rootElement, the content will also automatic binding with views.</p>

<h2>Objects</h2>

<p>Ember.js provide a series of extend methods for Object, all Ember.js Object is inherited those methods, include Event, Observer, toString ,getter, setter and more, most common use case is Ember.Object.create() and Ember.Object.extend(). extend is defining new Object Class and create is create a instance of class. Also, we have some convenience method. Like reopen and reopenClass can do the monkey patch, which is directlly modify the defined object class.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">firstName</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">lastName</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">User</span><span class="p">.</span><span class="nx">reopen</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">firstName</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">lastName</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}.</span><span class="nx">property</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span><span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span> <span class="nx">firstName</span><span class="o">:</span> <span class="s2">&quot;John&quot;</span><span class="p">,</span> <span class="nx">lastName</span><span class="o">:</span> <span class="s2">&quot;Doe&quot;</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">user</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">));</span> <span class="c1">//John Doe</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another is Mixin, which is like module in ruby, abstract class and interface in java. Can extend parameter and function to class, which make the object cleaner.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Admin</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Mixin</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">isAdmin</span> <span class="o">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nb">Object</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">Admin</span><span class="p">,{</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">user</span><span class="p">.</span><span class="nx">isAdmin</span><span class="p">);</span>  <span class="c1">// true</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Application</h2>

<p>Here is what magic happened, and is the most confusing part of Ember.js when I started learning. Because the documentation and Guide doesn&#8217;t mention lots of things on controller and router. But the code document is great. Strongly recommend to read the source code of Ember.js.</p>

<p>Application, inherit Ember.Namespace, is the starting point of every Ember.js application.</p>

<p>Each application start with a creation of namespace:</p>

<pre><code>window.App = Ember.Application.create();
</code></pre>

<p>All classes should be attached to the application namespace and application should be the only global varible.</p>

<pre><code>App.UserView = Ember.View.extend();
App.UserController = Ember.Controller.extend()
</code></pre>

<p>After classes loaded. We can call <code>App.initilize()</code> to start the application. What initilize do here is, first, it bind the application with <code>rootElement</code>(default to body). Also enable the event deligation, application object will also be the event hub of all other classes. And the important one is, it will load the ApplicationController, App.ApplicationView and App.Router. Create and attach all controller instance to router. For example, App.UserController will have an instance App.router.userController after application initialized. Also, router will trigger state and start the corresponding action after intialized.</p>

<h2>Controller</h2>

<p>In Ember.js, controller is the place to put model manipulation codes and binding model with views. We can call the &#8216;connectOutlet&#8217; function to application controller and pass the name and content to invoke corresponding controllers and views to <code>{ {outlet}}</code> in ApplicationView. Like Rails, Ember.js have naming convention on Controllers and Views, the UsersController and UsersView will automatically bind together when calling connectOutlet. Controller will be avaliable in view by property &#8216;controller&#8217;.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">users</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Jimmy&#39;</span><span class="p">,</span> <span class="s1">&#39;Bob&#39;</span><span class="p">,</span> <span class="s1">&#39;John&#39;</span><span class="p">];</span>
</span><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">applicationController</span><span class="p">.</span><span class="nx">connectOutlet</span><span class="p">(</span><span class="s1">&#39;users&#39;</span><span class="p">,</span> <span class="nx">users</span><span class="p">);</span>
</span><span class='line'><span class="c1">//invote the UsersController and UsersView instance with content users.</span>
</span><span class='line'><span class="c1">//Render UsersView to the { {outlet}} position of ApplicationView template.</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Router</h2>

<p>Router is inherited from Ember.StateMachine that represent each route as a state of Ember application.
Each route will have route url and connectOutlets function. connectOutlets will be called with router instance,
Which we can access all controller instance form it, and call the connectOutlet method to set the view and controller to mainView.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">Router</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Router</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">root</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">index</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">route</span><span class="o">:</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">connectOutlets</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">router</span><span class="p">){</span>
</span><span class='line'>        <span class="c1">//get the application controller</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">controller</span> <span class="o">=</span> <span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;applicationController&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="c1">//get the model, using fixed data here</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">users</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Jimmy&#39;</span><span class="p">,</span> <span class="s1">&#39;Bob&#39;</span><span class="p">,</span> <span class="s1">&#39;John&#39;</span><span class="p">];</span>
</span><span class='line'>        <span class="c1">//connect the UsersController, UsersView, users to ApplicationView</span>
</span><span class='line'>        <span class="nx">controller</span><span class="p">.</span><span class="nx">connectOutlet</span><span class="p">(</span><span class="s1">&#39;users&#39;</span><span class="p">,</span> <span class="nx">users</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each route is also a state of application, so the route can have specific transition in certain state
For example, when viewing a single post, user can edit the post. When can represent this use case as:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">App</span><span class="p">.</span><span class="nx">Router</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">root</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">posts</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">route</span><span class="o">:</span> <span class="s1">&#39;/posts/:id&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">connectOutlets</span><span class="o">:</span> <span class="nx">loadPost</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">showEdit</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">transitionTo</span><span class="p">(</span><span class="s1">&#39;edit&#39;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">edit</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">route</span><span class="o">:</span> <span class="s1">&#39;/edit&#39;</span>
</span><span class='line'>        <span class="nx">connectOutlets</span><span class="o">:</span> <span class="nx">loadPostForEdit</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">//with action helper in template:</span>
</span><span class='line'><span class="c1">//&lt;script type=&quot;text/x-handlerbars&quot; data-template-name=&#39;post-view&#39;&gt;</span>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'><span class="c1">// &lt;a href=&quot;#&quot; {{action showEdit }}&gt; Edit&lt;/a&gt;</span>
</span><span class='line'><span class="c1">//&lt;/script&gt;</span>
</span><span class='line'><span class="c1">//will transit url to /posts/:id/edit</span>
</span></code></pre></td></tr></table></div></figure>


<p>So that only in posts state, user can transit into the edit state.</p>

<h2>Todos App example:</h2>

<p>For understand the Ember.js Application More, I am starting with the <a href="https://github.com/addyosmani/todomvc">TodoMvc</a> example of Ember.js. Lets go through a view classes to of the todo exmaple to understand more how Ember.js works:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//app.js</span>
</span><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">Todos</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Application</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">VERSION</span><span class="o">:</span> <span class="s1">&#39;1.0&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// binding root element with id=&#39;todoapp&#39;</span>
</span><span class='line'>  <span class="nx">rootElement</span><span class="o">:</span> <span class="s1">&#39;#todoapp&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// used as localstroage namespace</span>
</span><span class='line'>  <span class="nx">storeNamespace</span><span class="o">:</span> <span class="s1">&#39;todos-emberjs&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// Extend to inherit outlet support</span>
</span><span class='line'>  <span class="nx">ApplicationController</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Controller</span><span class="p">.</span><span class="nx">extend</span><span class="p">(),</span>
</span><span class='line'>  <span class="nx">ready</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">//initialize router, controller and views</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//router.js</span>
</span><span class='line'><span class="nx">Todos</span><span class="p">.</span><span class="nx">Router</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Router</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">root</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">showAll</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">transitionTo</span><span class="p">(</span><span class="s1">&#39;index&#39;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">index</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">Route</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">route</span><span class="o">:</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">connectOutlets</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">router</span><span class="p">){</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">controller</span> <span class="o">=</span> <span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;applicationController&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Get the models, in this example is entriesController</span>
</span><span class='line'>        <span class="c1">// Which is an instance of ArrayProxy</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="nx">Todos</span><span class="p">.</span><span class="nx">entriesController</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">context</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span> <span class="s1">&#39;filterBy&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Connect todosController and todosView with context to applicationView.</span>
</span><span class='line'>        <span class="nx">controller</span><span class="p">.</span><span class="nx">connectOutlet</span><span class="p">(</span><span class="s1">&#39;todos&#39;</span><span class="p">,</span> <span class="nx">context</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//controllers/todos.js</span>
</span><span class='line'><span class="nx">Todos</span><span class="p">.</span><span class="nx">TodosController</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">ArrayProxy</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">entries</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">filter</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getPath</span><span class="p">(</span><span class="s1">&#39;content.filterBy&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="nx">Ember</span><span class="p">.</span><span class="nx">empty</span><span class="p">(</span><span class="nx">filter</span><span class="p">)){</span>
</span><span class='line'>      <span class="c1">//content will be injected by router</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;content&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>  <span class="p">}.</span><span class="nx">property</span><span class="p">(</span> <span class="s1">&#39;content.remaining&#39;</span><span class="p">,</span> <span class="s1">&#39;content.filterBy&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//views/todos.js</span>
</span><span class='line'><span class="nx">Todos</span><span class="p">.</span><span class="nx">TodosView</span> <span class="o">=</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">CollectionView</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="c1">//binding content to todosController.entries</span>
</span><span class='line'>  <span class="nx">contentBinding</span><span class="o">:</span> <span class="s1">&#39;controller.entries&#39;</span>
</span><span class='line'>  <span class="p">...</span>
</span><span class='line'>  <span class="c1">//view class for each todos item</span>
</span><span class='line'>  <span class="nx">itemViewClass</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="nx">doubleClick</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;content&#39;</span><span class="p">).</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;editing&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="c1">//innerview for editing item</span>
</span><span class='line'>    <span class="nx">ItemEditorView</span><span class="o">:</span> <span class="nx">Ember</span><span class="p">.</span><span class="nx">TextField</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">valueBinding</span><span class="o">:</span> <span class="s1">&#39;content.title&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="p">...</span>
</span><span class='line'>      <span class="nx">change</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="nx">Ember</span><span class="p">.</span><span class="nx">empty</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">getPath</span><span class="p">(</span><span class="s1">&#39;content.title&#39;</span><span class="p">))){</span>
</span><span class='line'>          <span class="c1">//if no value, remove object from todosController.content</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">getPath</span><span class="p">(</span><span class="s1">&#39;controller.content&#39;</span><span class="p">).</span><span class="nx">removeObject</span><span class="p">(</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;content&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">//if not, update the content</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;content&#39;</span><span class="p">).</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">getPath</span><span class="p">(</span><span class="s1">&#39;content.title&#39;</span><span class="p">).</span><span class="nx">trim</span><span class="p">());</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">whenDone</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;content&#39;</span><span class="p">).</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;editing&#39;</span><span class="p">,</span> <span class="nx">flase</span><span class="p">);</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="p">...</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="c1">//todosView:</span>
</span><span class='line'><span class="c1">//&lt;script id=&quot;todosTemplate&quot; type=&quot;text/x-handlebars&quot;&gt;</span>
</span><span class='line'><span class="c1">//{{#unless view.content.editing}}</span>
</span><span class='line'><span class="c1">//  {{view Ember.Checkbox checkedBinding=&quot;view.content.completed&quot; class=&quot;toggle&quot;}}</span>
</span><span class='line'><span class="c1">//  &lt;label&gt;{{view.content.title}}&lt;/label&gt;</span>
</span><span class='line'><span class="c1">//  &lt;button {{action removeItem target=&quot;this&quot;}} class=&quot;destroy&quot; &gt;&lt;/button&gt;</span>
</span><span class='line'><span class="c1">//{{else}}</span>
</span><span class='line'><span class="c1">//  {{view view.ItemEditorView contentBinding=&quot;view.content&quot;}}</span>
</span><span class='line'><span class="c1">//{{/unless}}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can see <a href="http://todomvc.com/architecture-examples/emberjs/">http://todomvc.com/architecture-examples/emberjs/</a>
for demostration.</p>

<h2>Conclusion</h2>

<p>After reading this article, I hope you can have a common understanding of Ember.js and what problem it is trying to solve.
Ember.js, unlike Backbone concentrate on simple and minimal code, it is a very opinion framework. Therefore it has steeper learning curve than Backbone. Also the document can&#8217;t cover all topics of Ember.js. So read the comment in codes is actually a very useful way to understand how Ember.js work.</p>

<p>Comparing these 2 frameworks. Backbone.js is simple, easy to use and Integrate RESTful Api by model. But when codes grow. You have to be careful about the repeating code and logics. Also might need some plugin like layoutManager to maitain better structure.</p>

<p>On the other hand, Ember is harder to use. But it have better build-in structure for large scale application. Some automatic binding for controllers and views, state machine router, and solve some common problem like syncing and updating. But you can only use handlebar for the template. Also have lesser plugins and resources than Backbone. Such as the module for server data: Ember-data is still in development stage.</p>

<p>Overall, those 2 framework is both ready for production use. At the source code level, I like the structure of Ember.js, It is very moduler and have some suger syntax like mixin and reopen on object level. Also with very good code documentation. I will like to use Ember in my next project to compare with backbone.</p>

<h2>Reference:</h2>

<ul>
<li><a href="https://github.com/emberjs/ember.js">Ember.js</a></li>
<li><a href="[http://todomvc.com/architecture-examples/emberjs/](http://todomvc.com/architecture-examples/emberjs/">TodoMvc example in ember.js</a></li>
<li><a href="https://speakerdeck.com/u/wycats/p/backboneconf-emberjs">What is Ember?</a></li>
<li><a href="http://tomdale.net/2012/05/ember-routing/">Ember routing</a></li>
<li><a href="http://tchak.net/parisjs-app/">parisjs-app</a></li>
<li><a href="http://petelepage.com/webapp-codelab/">webapp-codelab</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Announcing N37 url shortener]]></title>
    <link href="http://neethack.com/2012/07/announcing-n37-url-shortener/" />
    <updated>2012-07-28T00:08:00-04:00</updated>
    <id>http://neethack.com/2012/07/announcing-n37-url-shortener</id>
    <content type="html"><![CDATA[<p>Few days ago, I started to work on a simple url shortener. The original idea was from one of my friends, he mentioned about the idea of implement a simple and deployable url shortener. This idea just popout my head when I was working on other side project. So I spend a few days working on it and it turns out to be an interesting project that I want to blog about:</p>

<h2>A Url Shortener</h2>

<p>A url shortener, as its name, is a application that provide user a shorter version of url. Like the most famous one: tinyurl.com, which map the url address into a short sequence of code, like <a href="http://tinyurl.com/ccxngqo">tinyurl.com/ccxngqo</a>. Make user easier to share the link on social media like twitter or forum.</p>

<!--more-->


<p>What the application do is actually pretty simple, they store the url in the table and set a id for it. When user request the id, redirect user to the url. The problem here is: how to make the id shorter? The obvious solution is to use the character as id but not integer id. So most url shortener will use the code like &#8216;aSgY2&#8217;, which combine the upper, lower case letters and numbers as id. With this method, one character can present 26+26+10=62 choice. A 5-letter code can present 62<sup>5=916,132,832</sup> of urls. far better then just use 5 numbers.</p>

<p>There are two methods to map the long url into short code, one is to convert the increment interger id into code. Which is easier and can use up all of the space. However, the space (of 5-6 digits code) will be running out eventially because there are billions of urls on internet. So it have to increase code length to increase the storage of url. Or it have to expire the unused url and reuse these code. But when it comes to expire, The incremental id will become more complex since it need to track the smaller free id first. Also, the application have to maintain a index of url -> id to increase the search speed, and it will have to maintain index often if the url will expire.</p>

<p>Another solution is to hash the url address, so the url will match to a code generated by url string that same url will always map to same code. This method works well with the expire method because application doesn&#8217;t need to track which code is free. However, this method won&#8217;t be able to use up all of the available codes and the hash will collision(which is, two different url generate the same code) when numbers of url increase.</p>

<h2>Hash</h2>

<p>For the project, I choose the hash method to generate code. Because this method works well with redis hash map data type. Lets bring some code in the project:</p>

<div><script src='https://gist.github.com/3232892.js?file=hashUrl.coffee'></script>
<noscript><pre><code>exports.hashUrl = hashUrl = (url, digits = 5, algorithm = 'md5')-&gt;
  symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
  length = symbols.length
  code = &quot;&quot;

  hash = crypto.createHash(algorithm)
    .update(url)
    .digest('hex')

  hash_number = parseInt(hash, 16) % Math.pow(length, digits + 1)

  while hash_number &gt;= length
    n = hash_number % length
    code += symbols[n]
    hash_number = parseInt(hash_number / length)

  code
</code></pre></noscript></div>


<p>The hash here use the node.js crypto module to hash the url, and reduce the code by mod the hash result into the range of 5 digits (916,132,832). And map the number into usable symbols as return code.</p>

<p>But, what happen when the code collide? and how often will it happen when the url increase?</p>

<h2>Collision</h2>

<p><strong>(Warning, this section include some math!)</strong></p>

<p>The hash collision problem, can be seen as a <a href="http://n37.co/O5Gxm">generalize birthday problem</a>. Which is: what&#8217;s the probability of two people have same birthday for N people?</p>

<p>Lets solve the birthday problem first:</p>

<p>First, the number of days in a year is 365 (exclude the leap year). So the probability of at lease 2 people have same birthday equal to 1 - probability of all people have unique birthday.</p>

<pre><code>Probability_of_same_birthday(N) = 1 - Probability_of_unique_birthday(N)

Probability_of_unique_birthday(N) = 1 * 364/365 * 363/365 * … * (365 - N + 1)/ 365
                                  = ( 365 * 364 * … (365 - N + 1)) / 365^N
                                  = 365!/ ((365 - N)! * 365^N)
                                  = N! * Combination(365, N) / 365^N
</code></pre>

<p>In the hash context, the range of code is 62 ^ 5 = 916,132,832, so the probability of having all unique hash in N url is:</p>

<pre><code>Probability_of_unique_hash(N) = N! * Combination(916132832, N) / 916132832^N

The approximation of Probability is:

P(N) = 1 - e^(-n^2/916132832*2)
</code></pre>

<p>So the probability of collision in 916132832 space with n hash P(n) is:</p>

<pre><code>P(10) = 5.458 * 10^-8
P(1000) = 5.456 * 10^-4
P(100000) = 0.995
P(200000) = 1

P(N) = 0.001, N ~= 1355 
P(N) = 0.01, N ~= 4292
P(N) = 0.10, N ~= 13895 
P(N) = 0.50, N ~= 35638
</code></pre>

<p>As the birthday problem, the collision chance is actually higher than we thought, the 916132832 space can only hold around 35638 hash without too much collision.</p>

<p>So to solve the collision problem, I choose to use the other hash method when collision happen. The node.js crypto module have md5, sha1, sha256, sha512 can generate different code. So if collision happened, it will switch to another hash method. If all four hash collide, the code will increase one digit to hold the new hash. And start with md5 to generate hash again.</p>

<p>Here&#8217;s the code that rehash url:</p>

<div><script src='https://gist.github.com/3232892.js?file=generateCode.coffee'></script>
<noscript><pre><code>getAlgorithms = -&gt; ['md5', 'sha1', 'sha256', 'sha512']

generateCode = (url, algorithms, digits, callback)-&gt;
  #increase code digits if all codes are registered
  if algorithms.length is 0
    algorithms = getAlgorithms()
    digits += 1

  algorithm = algorithms.shift()

  code = hashUrl(url, digits, algorithm)

  redis.get &quot;url:#{code}&quot;, (err, reply)-&gt;
    if not reply or reply == url
      client.set &quot;url:#{code}&quot;, url, (err, reply)-&gt;
        callback(null, code)
    else generateCode(url, algorithms, digits, callback)</code></pre></noscript></div>


<p>With this method, I set the expire time as one month, and the application don&#8217;t need to track the expiration of url and will automatically reuse the empty spot. There might have duplication of url, but the probabillity is small, since the url used often will always occupy the first or second hash spot.</p>

<h2>Conclusion</h2>

<p>This project introduce some pro and cons on using increase integer or hash code as id. So we know why the url shortener is implmented in a certain way. I would like to know how the bit.ly and tinyurl.com do the url shortening under the hood. Because the fall back hash method still need some prove to be usable under large amounts of urls.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Code odyssey : Express]]></title>
    <link href="http://neethack.com/2012/05/code-odyssey-expressjs/" />
    <updated>2012-05-28T20:21:00-04:00</updated>
    <id>http://neethack.com/2012/05/code-odyssey-expressjs</id>
    <content type="html"><![CDATA[<p>Recently I was looking for web frameworks on Node.js. There are <a href="http://towerjs.org/">Tower.js</a>, <a href="http://railwayjs.com/">Railway</a>, <a href="http://geddyjs.org/">GeddyJS</a>, <a href="http://socketstream.com/">SocektStream</a>, <a href="https://github.com/meteor/meteor">Meteor</a> and lots of cool framework on Node.js. However, Express, which created in the beginning of Node.js era, is still a very stable and easy to use framework with the most plugin and community support. Therefore, I think it is a good candidate as my 2nd source code review project.</p>

<p>Express.js is developed by <a href="https://github.com/visionmedia">TJ Holowaychuk</a>, who rebuild the web development on Node.js with express, <a href="http://jade-lang.com/">jade</a>, <a href="https://github.com/visionmedia/mocha">mocha</a>, <a href="https://github.com/learnboost/stylus">stylus</a> and more. Express is inspired by the simple of <a href="http://www.sinatrarb.com/">Sinatra</a> provide a simple and elegant interface for http request, also with connect middle support that let user can easily extend the framework.</p>

<!--more-->


<h2>Usage</h2>

<p>Here&#8217;s the hello world sample of express. It assign a callback for get request on root &#8216;/&#8217;, and start the server to listen port 3000. More example can be found on <a href="https://github.com/visionmedia/express/tree/master/examples">express/examples</a> and <a href="http://expressjs.com">Documentation of express</a>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">createServer</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Hello World&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Express started on port 3000&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Connect</h2>

<p>Express is using the <a href="http://www.senchalabs.org/connect/">Connect</a> Middleware. But What is connect? From the configuation function of Express:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">defaultConfiguration</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// default settings</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;env&#39;</span><span class="p">,</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">NODE_ENV</span> <span class="o">||</span> <span class="s1">&#39;development&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">debug</span><span class="p">(</span><span class="s1">&#39;booting in %s mode&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;env&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// implicit middleware</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">connect</span><span class="p">.</span><span class="nx">query</span><span class="p">());</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">middleware</span><span class="p">.</span><span class="nx">init</span><span class="p">(</span><span class="k">this</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">...</span>
</span><span class='line'>  <span class="c1">// router</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">_router</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Router</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">routes</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_router</span><span class="p">.</span><span class="nx">map</span><span class="p">;</span>
</span><span class='line'>  <span class="p">...</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can see that express call the use method with connect.query(), the query() parse the query string and attach to the request object req.query.</p>

<p>In the source of connect.query():</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">query</span><span class="p">(</span><span class="nx">options</span><span class="p">){</span>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span> <span class="nx">query</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">){</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">query</span> <span class="o">=</span> <span class="o">~</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">&#39;?&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="o">?</span> <span class="nx">qs</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">parse</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">).</span><span class="nx">query</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span>
</span><span class='line'>      <span class="o">:</span> <span class="p">{};</span>
</span><span class='line'>    <span class="nx">next</span><span class="p">();</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>The next() method invoke the next method on the process chain.
We can see that it return a method that parse the req.url with qs.parse function and return to req.query. So we can get the query string from req.query in our application.</p>

<p>So we can see the middleware as a function that execute before the request and add functionality to (req, res) object. So we can easily use a function as middleware. In example, we can refactor the hello world as middleware:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">createServer</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">req</span><span class="p">.</span><span class="nx">message</span> <span class="o">=</span> <span class="s1">&#39;Hello world&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Express started on port 3000&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In more advance usage, we can build a <strong>flash</strong> message using middleware:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">locals</span><span class="p">.</span><span class="nx">flash</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">flash</span> <span class="o">||</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">req</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">flash</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also, there is another kind middleware called param callback. which will only be executed when the route have the param key:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;user_id&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">,</span> <span class="nx">id</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">User</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">){</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">next</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">req</span><span class="p">.</span><span class="nx">user</span> <span class="o">=</span> <span class="nx">user</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">next</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">next</span><span class="p">(</span><span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;failed to load user&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Will be invoked when route params have &#8216;user_id&#8217;:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/:user_id&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">send</span><span class="p">(</span><span class="s1">&#39;User name is&#39;</span> <span class="o">+</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span> <span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Application</h2>

<p>The main application is on lib/express.js. It produce express app by <strong>createApplication</strong> function. First, the application merge with <strong>connect</strong>, set request and response object, than call the initialize function of application defined in lib/application.js</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">connect</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;connect&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">,</span> <span class="nx">proto</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./application&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">,</span> <span class="nx">req</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./request&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">,</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./response&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="err">…</span>
</span><span class='line'><span class="err">…</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">createApplication</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">connect</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">utils</span><span class="p">.</span><span class="nx">merge</span><span class="p">(</span><span class="nx">app</span><span class="p">,</span> <span class="nx">proto</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">request</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">__proto__</span><span class="o">:</span> <span class="nx">req</span> <span class="p">};</span>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">response</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">__proto__</span><span class="o">:</span> <span class="nx">res</span> <span class="p">};</span>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">init</span><span class="p">();</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">app</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In application.js, the <strong>init</strong> function initialize the settings and default configuration of express, and also load the Router to route the Http requests.</p>

<p>Also an important part, some of the settings is depend on <strong>process.env</strong>, like cache. Which can be enabled by exports NODE_ENV=production.</p>

<pre><code>this.set('env', process.env.NODE_ENV || 'development');
</code></pre>

<h2>Router</h2>

<p>Lets step into the router, basically, the router provide <em>route</em> method to assign function to route, and <em>matchRequest</em> to return route.</p>

<p>In <em>route</em></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Route `method`, `path`, and one or more callbacks.</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * @param {String} method</span>
</span><span class='line'><span class="cm"> * @param {String} path</span>
</span><span class='line'><span class="cm"> * @param {Function} callback...</span>
</span><span class='line'><span class="cm"> * @return {Router} for chaining</span>
</span><span class='line'><span class="cm"> * @api private</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Router</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">route</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">method</span><span class="p">,</span> <span class="nx">path</span><span class="p">,</span> <span class="nx">callbacks</span><span class="p">){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">method</span> <span class="o">=</span> <span class="nx">method</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">()</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">callbacks</span> <span class="o">=</span> <span class="nx">utils</span><span class="p">.</span><span class="nx">flatten</span><span class="p">([].</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ensure path was given</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">path</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Router#&#39;</span> <span class="o">+</span> <span class="nx">method</span> <span class="o">+</span> <span class="s1">&#39;() requires a path&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// create the route</span>
</span><span class='line'>  <span class="nx">debug</span><span class="p">(</span><span class="s1">&#39;defined %s %s&#39;</span><span class="p">,</span> <span class="nx">method</span><span class="p">,</span> <span class="nx">path</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">route</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Route</span><span class="p">(</span><span class="nx">method</span><span class="p">,</span> <span class="nx">path</span><span class="p">,</span> <span class="nx">callbacks</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">sensitive</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">caseSensitive</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">strict</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">strict</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// add it</span>
</span><span class='line'>  <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">map</span><span class="p">[</span><span class="nx">method</span><span class="p">]</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">map</span><span class="p">[</span><span class="nx">method</span><span class="p">]</span> <span class="o">||</span> <span class="p">[]).</span><span class="nx">push</span><span class="p">(</span><span class="nx">route</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>The route function take the Http method (like &#8216;get&#8217;), path and callback. normalize them and create Route object. add to the <strong>map[method]</strong> array in Router.</p>

<p>Also, it use the meta programming skill to generate public helper for user, so we can call the <strong>app.get</strong> or <strong>app.post</strong> method to assign route.</p>

<p>In application.js</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">methods</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;methods&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="err">…</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/**</span>
</span><span class='line'><span class="cm"> * Delegate `.VERB(...)` calls to `.route(VERB, ...)`.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="nx">methods</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">method</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">app</span><span class="p">[</span><span class="nx">method</span><span class="p">]</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</span><span class="p">){</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="s1">&#39;get&#39;</span> <span class="o">==</span> <span class="nx">method</span> <span class="o">&amp;&amp;</span> <span class="mi">1</span> <span class="o">==</span> <span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">path</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">args</span> <span class="o">=</span> <span class="p">[</span><span class="nx">method</span><span class="p">].</span><span class="nx">concat</span><span class="p">([].</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">));</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">_usedRoutnner</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_router</span><span class="p">.</span><span class="nx">route</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_router</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>But after the route is set, how do express invoke the handle function? We can see the usage from the test case:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;.middleware&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should dispatch&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">done</span><span class="p">){</span>
</span><span class='line'>      <span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;get&#39;</span><span class="p">,</span> <span class="s1">&#39;/foo&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>        <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">.</span><span class="nx">middleware</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">request</span><span class="p">(</span><span class="nx">app</span><span class="p">)</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/foo&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">expect</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="nx">done</span><span class="p">);</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>  <span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the test case we can see the <strong>app.use(router.middleware)</strong> mount the routes to the application. In <strong>router.middleware</strong>, it call the <strong>_dispatch(req, res, next)</strong> function,
it call the <strong>route.matchRequest</strong> method to get the matched route, handle param callback and execute the callback chain:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Router</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_dispatch</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">params</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">params</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">debug</span><span class="p">(</span><span class="s1">&#39;dispatching %s %s (%s)&#39;</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">method</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">originalUrl</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// route dispatch</span>
</span><span class='line'>  <span class="p">(</span><span class="kd">function</span> <span class="nx">pass</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="nx">err</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// match next route</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">nextRoute</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">pass</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">_route_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// match route</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">route</span> <span class="o">=</span> <span class="nx">route</span> <span class="o">=</span> <span class="nx">self</span><span class="p">.</span><span class="nx">matchRequest</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="err">…</span>
</span><span class='line'>  
</span><span class='line'>    <span class="c1">// we have a route</span>
</span><span class='line'>    <span class="c1">// start at param 0</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">params</span> <span class="o">=</span> <span class="nx">route</span><span class="p">.</span><span class="nx">params</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">keys</span> <span class="o">=</span> <span class="nx">route</span><span class="p">.</span><span class="nx">keys</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// param callbacks</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">param</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="err">…</span> <span class="c1">// execute param callbacks and execute route callbacks(err) in the end.</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">param</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// invoke route callbacks</span>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">callbacks</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">fn</span> <span class="o">=</span> <span class="nx">route</span><span class="p">.</span><span class="nx">callbacks</span><span class="p">[</span><span class="nx">i</span><span class="o">++</span><span class="p">];</span>
</span><span class='line'>      <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="s1">&#39;route&#39;</span> <span class="o">==</span> <span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">nextRoute</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">err</span> <span class="o">&amp;&amp;</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">fn</span><span class="p">.</span><span class="nx">length</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callbacks</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">fn</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">callbacks</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">fn</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">callbacks</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">nextRoute</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">callbacks</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">})(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Request / Response</h2>

<p>Request and Response object in express is inheritate http.IncomingMessage and http.ServerResponse from node. Request provide helpers for http header, content-type, URL and param parsing.</p>

<p>Response is providing helpers for status and results too. Also provide the send function from &#8216;response-send&#8217; module. Which detect response type and set corresponding content-type.</p>

<h2>View</h2>

<p>In the <strong>lib/view.js</strong>, the main functions is <strong>render</strong> and <strong>lookup</strong>, which find the template and call the render function on engine. The <strong>render</strong> function on app initialize new View, the view set the <strong>lookup(name)</strong> to <strong>path</strong>, and call the <strong>view.render</strong> method to return result:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">View</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">lookup</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</span><span class="p">){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ext</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">ext</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// &lt;path&gt;.&lt;engine&gt;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">utils</span><span class="p">.</span><span class="nx">isAbsolute</span><span class="p">(</span><span class="nx">path</span><span class="p">))</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">join</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">root</span><span class="p">,</span> <span class="nx">path</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">exists</span><span class="p">(</span><span class="nx">path</span><span class="p">))</span> <span class="k">return</span> <span class="nx">path</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// &lt;path&gt;/index.&lt;engine&gt;</span>
</span><span class='line'>  <span class="nx">path</span> <span class="o">=</span> <span class="nx">join</span><span class="p">(</span><span class="nx">dirname</span><span class="p">(</span><span class="nx">path</span><span class="p">),</span> <span class="nx">basename</span><span class="p">(</span><span class="nx">path</span><span class="p">,</span> <span class="nx">ext</span><span class="p">),</span> <span class="s1">&#39;index&#39;</span> <span class="o">+</span> <span class="nx">ext</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">exists</span><span class="p">(</span><span class="nx">path</span><span class="p">))</span> <span class="k">return</span> <span class="nx">path</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="err">…</span>
</span><span class='line'>
</span><span class='line'><span class="nx">View</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">render</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="nx">fn</span><span class="p">){</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">engine</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">path</span><span class="p">,</span> <span class="nx">options</span><span class="p">,</span> <span class="nx">fn</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>in the app.render:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">render</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">options</span><span class="p">,</span> <span class="nx">fn</span><span class="p">){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">opts</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">cache</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">cache</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">engines</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">engines</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">view</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="err">…</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// primed cache</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">opts</span><span class="p">.</span><span class="nx">cache</span><span class="p">)</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">cache</span><span class="p">[</span><span class="nx">name</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// view</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">view</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">View</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">defaultEngine</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;view engine&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="p">,</span> <span class="nx">root</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;views&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="nx">process</span><span class="p">.</span><span class="nx">cwd</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;/views&#39;</span>
</span><span class='line'>      <span class="p">,</span> <span class="nx">engines</span><span class="o">:</span> <span class="nx">engines</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">view</span><span class="p">.</span><span class="nx">path</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">err</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Failed to lookup view &quot;&#39;</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">err</span><span class="p">.</span><span class="nx">view</span> <span class="o">=</span> <span class="nx">view</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">fn</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// prime the cache</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">opts</span><span class="p">.</span><span class="nx">cache</span><span class="p">)</span> <span class="nx">cache</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">view</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// render</span>
</span><span class='line'>  <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">view</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="nx">opts</span><span class="p">,</span> <span class="nx">fn</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">fn</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>MVC example</h2>

<p>In the examples/mvc directory, it shows you how to structure a mvc style application in express.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">controllers</span><span class="o">/</span>
</span><span class='line'>  <span class="nx">main</span><span class="o">/</span>
</span><span class='line'>  <span class="nx">pet</span><span class="o">/</span>
</span><span class='line'>  <span class="nx">user</span><span class="o">-</span><span class="nx">pet</span><span class="o">/</span>
</span><span class='line'>  <span class="nx">user</span><span class="o">/</span>
</span><span class='line'><span class="nx">views</span><span class="o">/</span>
</span><span class='line'><span class="kr">public</span><span class="o">/</span>
</span><span class='line'><span class="nx">lib</span><span class="o">/</span>
</span><span class='line'>  <span class="nx">boot</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">db</span><span class="p">.</span><span class="nx">js</span>
</span><span class='line'><span class="nx">index</span><span class="p">.</span><span class="nx">js</span>
</span></code></pre></td></tr></table></div></figure>


<p>The followed structure is a sample of mvc in express, the index.js load the boot.js, which mount all the routes under controllers/ in a RESTful style. And set the views path and static path.</p>

<p>There are no restriction on how to build the structure of express application. The <a href="http://railwayjs.com">Railway</a> is one of the example that it extend express to be a Rails like Mvc application.</p>

<h2>Conclusion</h2>

<p>Express is a lightweight web framework and it is a good entry point to know how to build a web framework in Node.js. Hope this walkthrough can help you understand how express work. And can be more comfortable with new framework like meteor.</p>

<p>Also it is a well styled and documented project, so when you find some problem in developing express application, don&#8217;t be hesitate to use the source code (luke!) and the Guide of <a href="http://expressjs.com/">Express</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Go Programming Example]]></title>
    <link href="http://neethack.com/2012/04/go-programming/" />
    <updated>2012-04-25T23:26:00-04:00</updated>
    <id>http://neethack.com/2012/04/go-programming</id>
    <content type="html"><![CDATA[<h2>GO v1</h2>

<p>Recently, the Go language release it&#8217;s version 1.0, which have a more constant api that aiming on
attracting enterprise developers to use go as part of their solution.</p>

<p>I read the tutorial when it&#8217;s first release. At that time, Go was positioned as a new system language, Like C or C++. But right now it become more powerful that can be use on any general programming topic that require efficiency and concurrency.</p>

<p>As a language, Go has pretty weird syntax such as postfix type decleration and interface oriented. But other then that, Go is more like a compiled version scripting language. Which is pretty easy to write, and focusing on making threading easier through It&#8217;s Go routine.</p>

<!--more-->


<h2>Install go</h2>

<p>On OSX you can use homebrew:</p>

<pre><code>brew install go
</code></pre>

<h2>Concurrent</h2>

<p>One main feature of Go is go routine:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">package</span> <span class="n">main</span>
</span><span class='line'>
</span><span class='line'><span class="k">import</span> <span class="p">(</span>
</span><span class='line'>  <span class="s">&quot;fmt&quot;</span>
</span><span class='line'>  <span class="s">&quot;runtime&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">HelloGo</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">&quot;Hello Go!&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="n">i</span><span class="p">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">go</span> <span class="n">HelloGo</span><span class="p">()</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&#8217;s equivalent to Java:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">HelloRunnable</span> <span class="kd">implements</span> <span class="n">Runnable</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Hello Go!&quot;</span><span class="o">);</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="o">;</span> <span class="n">i</span><span class="o">++){</span>
</span><span class='line'>          <span class="o">(</span><span class="k">new</span> <span class="n">Thread</span><span class="o">(</span><span class="k">new</span> <span class="n">HelloRunnable</span><span class="o">())).</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>While using go routine, the function will fork to run on different thread. Which won&#8217;t block the main process and can be efficient on multicore.</p>

<p>Although there are other framework that can make threading easy too, but Go provide language level support and another useful feature: Channel</p>

<p>In Java, if we want to implement a multithread program, a big problem is how to passing data between Threads. One solution is using shared memory. For example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Counter</span><span class="o">{</span>
</span><span class='line'>  <span class="kd">private</span> <span class="kt">int</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
</span><span class='line'>  <span class="c1">//synchronized access for multithreads</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kd">synchronized</span> <span class="kt">void</span> <span class="nf">increment</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">counter</span><span class="o">++;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">getCounter</span><span class="o">(){</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">counter</span><span class="o">;</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(){</span>
</span><span class='line'>      <span class="kd">final</span> <span class="n">Counter</span> <span class="n">counter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Counter</span><span class="o">();</span>
</span><span class='line'>      <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">;</span> <span class="n">i</span><span class="o">++){</span>
</span><span class='line'>          <span class="k">new</span> <span class="nf">Thread</span><span class="o">(</span><span class="k">new</span> <span class="n">Runnable</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>              <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>                      <span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">100000000</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span>
</span><span class='line'>                          <span class="n">counter</span><span class="o">.</span><span class="na">increment</span><span class="o">();</span>
</span><span class='line'>              <span class="o">}</span>
</span><span class='line'>          <span class="o">}).</span><span class="na">start</span><span class="o">();</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>      
</span><span class='line'>        <span class="k">try</span><span class="o">{</span>
</span><span class='line'>          <span class="c1">//wait for thread finish</span>
</span><span class='line'>          <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">10000</span><span class="o">);</span>
</span><span class='line'>        <span class="o">}</span><span class="k">catch</span> <span class="o">(</span><span class="n">InterruptedException</span> <span class="n">e</span><span class="o">){</span>
</span><span class='line'>          <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">e</span><span class="o">.</span><span class="na">getMessage</span><span class="o">());</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">counter</span><span class="o">.</span><span class="na">getCounter</span><span class="o">());</span>
</span><span class='line'>        <span class="c1">// 200000000</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example, There are 2 thread both increasing the counter, if without the synchronzed keyword, the counter will not be 200000000 in the end because when thread 1 and 2 accessing counter at same time, result will be overwritten by other thread and only increase by 1. The synronized keyword enable deadlock to prevent this happened. But even with lock protection, the communication between threads is still a problem that reduce performence and make the parallel computation harder. Therefore the Go language make a new approach: channel, to solve this problem:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">package</span> <span class="n">main</span>
</span><span class='line'>
</span><span class='line'><span class="k">import</span> <span class="s">&quot;fmt&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">counter</span><span class="p">(</span><span class="n">id</span> <span class="nb">int</span><span class="p">,</span> <span class="n">channel</span> <span class="k">chan</span> <span class="nb">int</span><span class="p">,</span> <span class="n">closer</span> <span class="n">bool</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="mi">10000000</span><span class="p">;</span> <span class="n">i</span><span class="p">++</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// send count data to channel</span>
</span><span class='line'>    <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">&quot;process&quot;</span><span class="p">,</span> <span class="n">id</span><span class="p">,</span><span class="s">&quot; send&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">channel</span> <span class="p">&lt;-</span> <span class="mi">1</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">closer</span> <span class="p">{</span> <span class="nb">close</span><span class="p">(</span><span class="n">channel</span> <span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">channel</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="nb">int</span><span class="p">)</span>
</span><span class='line'>  <span class="k">go</span> <span class="n">counter</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">false</span><span class="p">)</span>
</span><span class='line'>  <span class="k">go</span> <span class="n">counter</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">channel</span><span class="p">,</span> <span class="n">true</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">x</span> <span class="p">:=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="c1">// receiving data from channel</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="k">range</span> <span class="n">channel</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">&quot;receiving&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">x</span> <span class="p">+=</span> <span class="n">i</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This version of counter send the data through go channel.
There are 2 counter routine running in thread, invoke by go counter(channel, closer).
In the main process, the for loop wait to read the channel until it is closed.</p>

<p>What happened here is the cpu core will switch between threads, and main process can be run when there&#8217;s data in channel, if not, switch to other threads. Until the channel is closed.</p>

<p>Example in 5 count:</p>

<pre><code>Thread 1 send 0
Thread 2 send 0
Thread 1 send 1
receiving
receiving
Thread 2 send 1
receiving
Thread 1 send 2
receiving
Thread 2 send 2
receiving
Thread 1 send 3
receiving
Thread 2 send 3
receiving
Thread 1 send 4
receiving
Thread 2 send 4
receiving
receiving
</code></pre>

<p>Moreover, we can increase the channel buffer to optimize threads, for example:</p>

<pre><code>channel := make(chan int, 10)
</code></pre>

<p>Increase buffer to 10 will make the execute sequence different:</p>

<pre><code>Thread 1 send 0
Thread 2 send 0
Thread 1 send 1
Thread 2 send 1
receiving
Thread 1 send 2
Thread 2 send 2
receiving
Thread 1 send 3
Thread 2 send 3
receiving
Thread 1 send 4
Thread 2 send 4
receiving
receiving
receiving
receiving
receiving
receiving
receiving
</code></pre>

<p>By the channel model, thread can easily wait and receive data but not exchange data by shared memory. Making parallel programming more easy and natural.</p>

<p>However, accessing channel is still a heavy job. If we tweak the counter program above to only send back the result:</p>

<pre><code>func counter(id int, channel chan int, closer bool) {
  x := 0
  for i := 0; i &lt; 10000000; i++ {
    x++;
  }
  channel &lt;- x
}
</code></pre>

<p>The execution time can be pretty different:</p>

<pre><code>//count to 200000000
//channel count:
real    0m32.650s
//result only:
real    0m0.359s
</code></pre>

<h2>Interface Oriented</h2>

<p>In Go, there is no Class. Go take a lightweight approach that the data and function are seperate.
And we can attach function to data as receiver.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="c1">//define datatype Name is string</span>
</span><span class='line'><span class="k">type</span> <span class="n">Name</span> <span class="nb">string</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//define name.print() that type Name can receive function call &quot;print()&quot;</span>
</span><span class='line'><span class="k">func</span> <span class="p">(</span><span class="n">name</span> <span class="n">Name</span><span class="p">)</span> <span class="n">print</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">name</span> <span class="p">:=</span> <span class="n">Name</span><span class="p">(</span><span class="s">&quot;John&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">name</span><span class="p">.</span><span class="n">print</span><span class="p">()</span> <span class="c1">// John</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>On the other hand, interface is the collection of methods. That describe the behavior of a type.
Go is using ducktype approach, as long as the type have all method defined in interface, it can be treat as the interface type:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">package</span> <span class="n">main</span>
</span><span class='line'>
</span><span class='line'><span class="k">import</span> <span class="p">(</span>
</span><span class='line'>  <span class="s">&quot;fmt&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//define interface Runner which can Run</span>
</span><span class='line'><span class="k">type</span> <span class="n">Runner</span> <span class="k">interface</span><span class="p">{</span>
</span><span class='line'>  <span class="n">Run</span><span class="p">()</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">type</span> <span class="n">Person</span> <span class="nb">string</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//A person can Run =&gt; p.Run()</span>
</span><span class='line'><span class="k">func</span> <span class="p">(</span><span class="n">p</span> <span class="n">Person</span><span class="p">)</span> <span class="n">Run</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="s">&quot;is running&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">type</span> <span class="n">Dog</span> <span class="k">struct</span><span class="p">{</span>
</span><span class='line'>  <span class="n">Name</span> <span class="nb">string</span>
</span><span class='line'>  <span class="n">Type</span> <span class="nb">string</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//A dog can Run =&gt; d.Run()</span>
</span><span class='line'><span class="k">func</span> <span class="p">(</span><span class="n">d</span> <span class="n">Dog</span><span class="p">)</span> <span class="n">Run</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">&quot;A&quot;</span> <span class="p">,</span><span class="n">d</span><span class="p">.</span><span class="n">Type</span><span class="p">,</span> <span class="s">&quot;dog is running&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//A runner can start running</span>
</span><span class='line'><span class="k">func</span> <span class="n">Start</span><span class="p">(</span><span class="n">r</span> <span class="n">Runner</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">r</span><span class="p">.</span><span class="n">Run</span><span class="p">()</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">p</span> <span class="p">:=</span> <span class="n">Person</span><span class="p">(</span><span class="s">&quot;John&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">Start</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="c1">// &quot;John is running&quot;</span>
</span><span class='line'>  <span class="n">d</span> <span class="p">:=</span> <span class="n">Dog</span><span class="p">{</span><span class="s">&quot;Johnny&quot;</span><span class="p">,</span><span class="s">&quot;Husky&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="n">Start</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="c1">// &quot;A Husky dog is running&quot;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Map Reduce</h2>

<p>Map Reduce is a programming model that distribute the calculation and collect the results.
The most famous example is Google. When Google build the index of web pages. Because the calculation is too big. They need to distribute the task to different server, and run as parallel as possible. The result is that they use the map reduce structure, each server received some amount of web page. Parse and count the words of that page, and the result index will be collected and added to the main index.</p>

<p>Here is the structure of Map Reduce by Go, from <a href="http://dan.bravender.us/2009/11/24/MapReduce_for_Go.html">Dan Bravender</a></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">package</span> <span class="n">main</span>
</span><span class='line'>
</span><span class='line'><span class="k">import</span> <span class="p">(</span>
</span><span class='line'>  <span class="s">&quot;fmt&quot;</span>
</span><span class='line'>  <span class="s">&quot;math/rand&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">type</span> <span class="n">Object</span> <span class="k">interface</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">MapReduce</span><span class="p">(</span><span class="n">input</span> <span class="k">chan</span> <span class="n">Object</span><span class="p">,</span>
</span><span class='line'>               <span class="n">mapper</span> <span class="k">func</span><span class="p">(</span><span class="n">Object</span><span class="p">,</span> <span class="k">chan</span> <span class="n">Object</span><span class="p">),</span>
</span><span class='line'>               <span class="n">reducer</span> <span class="k">func</span><span class="p">(</span><span class="k">chan</span> <span class="n">Object</span><span class="p">)</span> <span class="n">Object</span><span class="p">,</span>
</span><span class='line'>               <span class="n">pool_size</span> <span class="nb">int</span><span class="p">)</span> <span class="n">Object</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">worker_outputs</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="k">chan</span> <span class="n">Object</span><span class="p">,</span> <span class="n">pool_size</span><span class="p">)</span>
</span><span class='line'>    <span class="k">go</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">//read input, assign input to mapper(item, output)</span>
</span><span class='line'>      <span class="k">for</span> <span class="n">item</span> <span class="p">:=</span> <span class="k">range</span> <span class="n">input</span> <span class="p">{</span>
</span><span class='line'>          <span class="n">worker_output</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="n">Object</span><span class="p">)</span>
</span><span class='line'>          <span class="n">worker_outputs</span> <span class="p">&lt;-</span> <span class="n">worker_output</span>
</span><span class='line'>          <span class="k">go</span> <span class="n">mapper</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">worker_output</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nb">close</span><span class="p">(</span><span class="n">worker_outputs</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}()</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">reduce_input</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="n">Object</span><span class="p">)</span>
</span><span class='line'>    <span class="k">go</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">//listening worker_outputs as reduce_input</span>
</span><span class='line'>      <span class="k">for</span> <span class="n">worker</span> <span class="p">:=</span> <span class="k">range</span> <span class="n">worker_outputs</span> <span class="p">{</span>
</span><span class='line'>          <span class="n">reduce_input</span> <span class="p">&lt;-</span> <span class="p">(&lt;-</span><span class="n">worker</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nb">close</span><span class="p">(</span><span class="n">reduce_input</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">reducer</span><span class="p">(</span><span class="n">reduce_input</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I use the type &#8220;Object&#8221; to reference an empty interface. Because the Go don&#8217;t have generic type.</p>

<p>The first section send input to mapper, and receive worker_outputs as the collection of each worker&#8217;s result channel. Afterward, second section of the code send worker_output to reducer. Reducer return the result of calculation.</p>

<p>For example, we can try to calculate PI by some amounts of random points. Assume there&#8217;s a circle with radius 1. we get a random point on the square of 1. The PI will be the number of points in circle / total points. That the more points we collect, the more accurate the result will be.</p>

<p>For example, we can distribute the calculate of 2000 points to 2000 worker, and the PI will be equal to the result / total points</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">func</span> <span class="n">CalculatePI</span><span class="p">(</span><span class="n">n</span> <span class="n">Object</span><span class="p">,</span> <span class="n">c</span> <span class="k">chan</span> <span class="n">Object</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">sum</span> <span class="p">:=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">n</span><span class="p">.(</span><span class="nb">int</span><span class="p">);</span> <span class="n">i</span><span class="p">++</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">x</span> <span class="p">:=</span> <span class="n">rand</span><span class="p">.</span><span class="n">Float64</span><span class="p">()</span>
</span><span class='line'>    <span class="n">y</span> <span class="p">:=</span> <span class="n">rand</span><span class="p">.</span><span class="n">Float64</span><span class="p">()</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="p">*</span> <span class="n">x</span> <span class="p">+</span> <span class="n">y</span> <span class="p">*</span> <span class="n">y</span> <span class="p">)</span> <span class="p">&lt;=</span> <span class="mf">1.0</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">sum</span> <span class="p">+=</span> <span class="mi">1</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">c</span> <span class="p">&lt;-</span> <span class="n">sum</span>
</span><span class='line'>  <span class="nb">close</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">CollectPI</span><span class="p">(</span><span class="n">in</span> <span class="k">chan</span> <span class="n">Object</span><span class="p">)</span> <span class="n">Object</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">sum</span> <span class="p">:=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="k">range</span> <span class="n">in</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">sum</span> <span class="p">+=</span> <span class="n">i</span><span class="p">.(</span><span class="nb">int</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">sum</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">input</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="n">Object</span><span class="p">)</span>
</span><span class='line'>  <span class="k">go</span> <span class="k">func</span><span class="p">(){</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="mi">2000</span><span class="p">;</span> <span class="n">i</span><span class="p">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">input</span> <span class="p">&lt;-</span> <span class="mi">2000</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nb">close</span><span class="p">(</span><span class="n">input</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}()</span>
</span><span class='line'>  <span class="n">points_in_circle</span> <span class="p">:=</span> <span class="n">MapReduce</span><span class="p">(</span><span class="n">input</span><span class="p">,</span> <span class="n">CalculatePI</span><span class="p">,</span> <span class="n">CollectPI</span><span class="p">,</span> <span class="mi">10</span><span class="p">).(</span><span class="nb">int</span><span class="p">)</span>
</span><span class='line'>  <span class="n">result</span> <span class="p">:=</span> <span class="nb">float64</span><span class="p">(</span><span class="n">points_in_circle</span><span class="p">)</span> <span class="p">*</span> <span class="mi">4</span> <span class="p">/</span> <span class="p">(</span><span class="mi">2000</span> <span class="p">*</span> <span class="mi">2000</span><span class="p">)</span>
</span><span class='line'>  <span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//output: 3.141711</span>
</span><span class='line'><span class="c1">//output on 20000 * 20000 points: 3.14156549</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Unittest</h2>

<p>Go provide a unittest package and a buildin command for testing:</p>

<pre><code>go test
</code></pre>

<p>Will execute all *_test.go files as test cases.</p>

<p>Let&#8217;s write some test for the MapReduce mapper and reducer we have:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">package</span> <span class="n">main</span>
</span><span class='line'>
</span><span class='line'><span class="k">import</span> <span class="p">(</span>
</span><span class='line'>  <span class="s">&quot;testing&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">TestCalculatePI</span><span class="p">(</span><span class="n">t</span> <span class="p">*</span><span class="n">testing</span><span class="p">.</span><span class="n">T</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">result</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="n">Object</span><span class="p">)</span>
</span><span class='line'>  <span class="k">go</span> <span class="n">CalculatePI</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
</span><span class='line'>  <span class="n">sum</span> <span class="p">:=</span> <span class="p">&lt;-</span><span class="n">result</span>
</span><span class='line'>  <span class="n">PI</span> <span class="p">:=</span> <span class="nb">float64</span><span class="p">(</span><span class="n">sum</span><span class="p">.(</span><span class="nb">int</span><span class="p">))</span> <span class="p">*</span> <span class="mi">4</span> <span class="p">/</span> <span class="mi">2000</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">PI</span> <span class="p">&gt;</span> <span class="mf">3.5</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">t</span><span class="p">.</span><span class="n">Error</span><span class="p">(</span><span class="s">&quot;Calculation Error!!&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">func</span> <span class="n">buildChannel</span><span class="p">(</span><span class="n">in</span> <span class="k">chan</span> <span class="n">Object</span><span class="p">,</span> <span class="n">a</span> <span class="nb">int</span><span class="p">,</span> <span class="n">b</span> <span class="nb">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="p">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="n">i</span><span class="p">++</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">in</span> <span class="p">&lt;-</span> <span class="n">a</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nb">close</span><span class="p">(</span><span class="n">in</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">TestCollectPI</span><span class="p">(</span><span class="n">t</span> <span class="p">*</span><span class="n">testing</span><span class="p">.</span><span class="n">T</span><span class="p">){</span>
</span><span class='line'>  <span class="n">result</span> <span class="p">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="n">Object</span><span class="p">)</span>
</span><span class='line'>  <span class="k">go</span> <span class="n">buildChannel</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span><span class='line'>  <span class="n">sum</span> <span class="p">:=</span> <span class="n">CollectPI</span><span class="p">(</span><span class="n">result</span><span class="p">).(</span><span class="nb">int</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">sum</span> <span class="p">!=</span> <span class="mi">100</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">t</span><span class="p">.</span><span class="n">Error</span><span class="p">(</span><span class="s">&quot;Calculation Error!!&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The go testing framework passing a pointer for test case.
There is no extra syntax like assert to learn. Just use simple ==, != to check the results is correct or not. If Error happened, call testcase.Error for report error. Else the case will be mark as passed.</p>

<h2>Conclusion</h2>

<p>Go is a very interesting language. On the first hand, it might be awkward because of it&#8217;s syntax and no object oriented support. But once you know the simplicity and concurrency of Go. It would be a handy tool for the need fast calculation. However, we&#8217;re still waiting for a more complete eco system for developer and successful usecase for Go language.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[backbone-js javascript MVC Framework]]></title>
    <link href="http://neethack.com/2012/02/backbone-js-javascript-mvc-framework/" />
    <updated>2012-02-27T11:20:00-05:00</updated>
    <id>http://neethack.com/2012/02/backbone-js-javascript-mvc-framework</id>
    <content type="html"><![CDATA[<h2>What is Backbone.js?</h2>

<p>Backbone is a framework for front-end JavaScript, unlike jQuery focus on easier DOM manipulation and event binding, backbone provide a structure for separating data model and DOM, just like a MVC framework separate model, view and controller. Make heavy JavaScript application easier to develop and maintain.</p>

<h2>Why Backbone?</h2>

<!-- more -->


<p>In jQuery, we will write a sequence of chain selector for assign data model to DOM element like:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">article</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">author</span><span class="o">:</span><span class="s2">&quot;Joe&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;testing&quot;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#article&#39;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="s1">&#39;.content&#39;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">article</span><span class="p">.</span><span class="nx">content</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>For backbone, it provide the Model class and View class, which is the main two element of backbone.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Article</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">ArticleView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">el</span><span class="o">:</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#article&#39;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span><span class="k">this</span><span class="p">.</span><span class="nx">updateContent</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">events</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;click .content&quot;</span> <span class="o">:</span> <span class="s2">&quot;updateContent&quot;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">updateContent</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.content&#39;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;content&quot;</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">article</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Article</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">author</span><span class="o">:</span><span class="s2">&quot;Joe&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;testing&quot;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">articleView</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ArticleView</span><span class="p">({</span><span class="nx">model</span><span class="o">:</span><span class="nx">article</span><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>OK, it&#8217;s seen like a completely overwork, that&#8217;s my first thought when I saw a clientside MVC framework too, but we have to dig further to understand why people create it.</p>

<h2>Event Binding</h2>

<p>First, it separate the data model and view - which include event handle and DOM element, we can easily bind data model in view like:</p>

<pre><code>this.model.bind('change', this.updateContent, this);
</code></pre>

<p>It means when the data model change, the view will be automatically updated to DOM element.</p>

<p>Also, backbone provide literal event binding:</p>

<pre><code>events:{
  "click .content": "updateContent"
}
</code></pre>

<p>which bind the &#8220;click&#8221; event to &#8220;.content&#8221; class, trigger &#8220;updateContent&#8221; function in current view.
It&#8217;s useful when binding multiple events.</p>

<h2>Restful synchronization</h2>

<p>Furthermore, the backbone provide a RESTful format API for synchronize data model with server.
every model class in backbone have a corresponding url for synchronize, and when the &#8220;model.save&#8221; or &#8220;model.fetch&#8221; method is called, the model will make an Ajax request to update data with server.
For example:</p>

<pre><code>article.save({author:"John"});
</code></pre>

<p>will first find article.sync method, if undefined, call Backbone.sync.
The sync method will make an ajax request to server, and update model, trigger event and update to view.</p>

<p>the url of model is defined by RESTful API:</p>

<ul>
<li>create -> POST /model</li>
<li>read   -> GET /model[/id]</li>
<li>update -> PUT /model/id</li>
<li>delete -> DELETE /model/id</li>
</ul>


<p>and we can also change it by overwrite url parameter</p>

<h2>Dependency</h2>

<p>backbone.js depend on underscore.js and jQuery/Zepto library, since it is only a 5k framework focus on the structure of JavaScript application.</p>

<h2>Collection and Router</h2>

<p>Backbone provide Collection, which is the collection of Backbone.Model, and provide manipulation on underscore.js</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Article</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Model</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">Articles</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Collection</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">model</span><span class="o">:</span> <span class="nx">Article</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">articles</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Articles</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">articles</span><span class="p">.</span><span class="nx">add</span><span class="p">([{</span>
</span><span class='line'>  <span class="nx">author</span><span class="o">:</span><span class="s2">&quot;Joe&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;testing&quot;</span>
</span><span class='line'><span class="p">},{</span>
</span><span class='line'>  <span class="nx">author</span><span class="o">:</span><span class="s2">&quot;John&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;developing&quot;</span>
</span><span class='line'><span class="p">}]);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">articles</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">article</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">article</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;author&quot;</span><span class="p">));</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>the Router in backbone is like the route map in MVC framework, it provide clientside fragment url routing, eg. route &#8220;/#article/12&#8221; to match method &#8220;article(id)&#8221;. So the url can be recorded and bookmarked by browser.</p>

<h2>Template</h2>

<p>In Backbone, we can create template in view.
In that way we can add and remove multiple view and render with template.
The underscore.js provide template engine or we can use other engine too.</p>

<p>In view:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">render</span><span class="o">:</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="err">&quot;</span><span class="o">&lt;%=</span><span class="nx">content</span> <span class="o">%&gt;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$el</span><span class="p">.</span><span class="nx">html</span><span class="p">(</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">())</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>JavaScript MVC framework is good for rich client application and also can keep your javascript cleaner.
But whether to use it depend on how much script in your application, for small page, the MVC is total overhead, but it is good for large scale page like Mail or Desktop like application.</p>

<h2>More</h2>

<p><a href="http://documentcloud.github.com/backbone/">Backbone</a><br/>
<a href="http://documentcloud.github.com/backbone/docs/todos.html">Sample todo application</a><br/>
<a href="http://documentcloud.github.com/backbone/docs/backbone.html">Annotated source</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Amazon Interview]]></title>
    <link href="http://neethack.com/2012/02/amazon-interview/" />
    <updated>2012-02-25T01:41:00-05:00</updated>
    <id>http://neethack.com/2012/02/amazon-interview</id>
    <content type="html"><![CDATA[<p>  In 2011, I flew to Seattle for an on-site interview with Amazon, that is an interesting experience and I learned a lot from the preparation and knowing how these company finding new talents. I would like to share some of my experience on that interview.</p>

<h2>Invitation</h2>

<p>  After handing out my resume on school&#8217;s career fair, I got an email from Amazon campus recruiter that they have an interview event for campus hire hold on Amazon campus in Seattle, and they would like to pay me the trip to the interview. That really surprise me because what I heard is they will usually have one or two phone interview before you get to the on-site interview. However, this is a great oppurtunity, and also a free trip visiting Seattle. So I just go for it.</p>

<!-- more -->


<h2>Preparation</h2>

<p>  My sister in law live in Seattle, and she introduced me a friend who work in Amazon. I got lots of great advices about how to prepare the interview with Amazon. The position I applied for is general software engineer so I will not inteview with specific team members. Therefore I just prepare for general questions.</p>

<p>  First, for technical interview. There&#8217;re two books that really explain the process and questions they will ask:</p>

<ul>
<li><a href="http://www.amazon.com/Cracking-Coding-Interview-Fourth-Programming/dp/145157827X">Cracking the code interviews</a></li>
<li><p><a href="http://www.amazon.com/Programming-Interviews-Exposed-Secrets-Programmer/dp/047012167X/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1330300919&amp;sr=1-1">Programming interviews exposed</a></p>

<p>Those two book is really helpful. And is the main source of preparation. I started a github project and push answers on it for preparation, Also I wrote the code on notebook for practicing writing code on whiteboard.</p>

<p>Also, <a href="http://www.topcoder.com/">TopCoder</a> is your good friend, attend some Single Round Matches or do some questions in practice room to really get the tempo of solving questions.</p>

<p>For algorithms, the recruiter recommanded some books and resources:</p></li>
<li><p><a href="http://www.amazon.com/Algorithms-Nutshell-OReilly-George-Heineman/dp/059651624X/ref=sr_1_1?ie=UTF8&amp;qid=1330301272&amp;sr=8-1">Algorithm in Nutshells</a> is a digest book for the algorithms and data structures.</p></li>
<li><a href="http://www.topcoder.com/tc?d1=tutorials&amp;d2=alg_index&amp;module=Static">TopCoder algorithms tutorials</a> teach you the skills to solve problems on Topcoder using algorithms and data structures you learned.</li>
<li><a href="http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262033844/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1330301457&amp;sr=1-1">Introduction to Algorithms</a> is the masterbook of algorithms.</li>
<li><a href="http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880">Programming Pearl</a> is another book about sophiscated pragramming questions. The friend in Amazon told me it is a good book for solving algorithm questions.</li>
<li><p>Also, <a href="http://caterpillar.onlyfun.net/Gossip/">http://caterpillar.onlyfun.net/</a> is a great resouce for basic algorithms if you can read chinese :)</p>

<p>For coding questions, I mainly prepared in Java so I reviewed the language basic through some internet resources, also remember to check regular expression and basic file and folder read, write Api in the language.</p>

<p>Also I read other resouces from internet:</p></li>
<li><a href="http://www.catonmat.net/blog/my-job-interview-at-google/">My job interview at google</a> is a great interview article that contains a lots of resources worth for reading. Also I translated it into <a href="http://neethack.blogspot.com/2010/01/my-job-interview-at-google-google.html">Chinese</a> before.</li>
<li><a href="https://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions">Five essential phone screen question</a> is also helpful on the basic problems.</li>
<li><p><a href="http://projecteuler.net/">Euler project</a> is a resource for mathmatical computer programming questions.</p>

<p>Before the departure, I asked my brother for some mock up interview and try to solve the problems by writing codes and speak my thought in the same time. Also I got a mock up interview on phone with the friend in Amazon, that is helpful because he can point out my errors and ask questions on my answer like real interviewer. (actually he is, all Amazon Engineer need to be interviewer).</p></li>
</ul>


<h2>Interview</h2>

<p>  After 8 hours flight and transfer, I arrived in Seattle at night and took Taxi to Hilton Bellevue. The main traffic tool Amazon suggest is Taxi, they will reimburse all traffic expenses during the interview.</p>

<p>  Next day, I took taxi to Amazon campus near Bellevue, the texi driver said Amazon just move their campus to south lake union recently. I arrived around 10:00, the interview hold on 11:00. So I visited the South Lake Union park before interview.</p>

<p>  <img src="https://lh5.googleusercontent.com/-d81HUr6PFYM/T0spwNwRIQI/AAAAAAAABPU/znY3hTZWpTs/s640/P1010155.JPG" alt="Amazon" />
  <img src="https://lh6.googleusercontent.com/-QboFdHY-fnk/T0sp9MSy43I/AAAAAAAABPc/uDJWErDFpuA/s640/P1010165.JPG" alt="South Lake Union Park" /></p>

<p>  On 11:00, the interview began with a lunch with Amazon engineers, who will also be the interviewer afterward. It is not part of the interview, but a chance to let you understand more about Amazon. I sit on the table with an engineer who work in customer service team. I asked some questions about software development and life in Amazon. The interesting thing is, Amazon is composed by lots of small and medium teams running Agile, each team using the languages and services by their requirements and scale, the stack is differ from team to team. The culture looks pretty Engineer driven. And he said the life and workload balance is reasonable in Amazon.
  After lunch, we was taken to different rooms with whiteboard, which is the place we will stay in the rest of the interview. There&#8217;s four sessions, each is 45 minutes and no rest netween sessions. It seens like a really hard schedule for both side.</p>

<hr />

<p>  First session was from an enginner in Kindle app store. I signed the NDA so better not to talk about the question. But it is a simple programming question, not too hard but need to handle some details. I wrote the question in a python-like pseudo code first, and rewrote in java. It takes more time but make you able to write code with fewer errors. I am pretty comfortable in this way, but need to control the time of writing pseudo code and real code.</p>

<p>  Second session was from web team (probally), He asked about some data structure. how do you implement it, pros and cons, and some optimize questions. As the same I write the data structure in Pseudo code first and rewrite with Java.</p>

<p>  Third session was from an engineer in wireless team. He asked a tricky question about data structure. After answer that, he asked about the pro and cons of my implmentation and the design decision. I made a small mistake when answering a design question. I said I put the method in class just to keep code concise for interview, but I should rather talked more about the pro and cons about how I made the decision.</p>

<p>  Last session was from kindle team. He asked a practical question that he solved in Amazon website before. In the beginning I wrote the pseudo code in python, and he suggest me just wrote in python. But I got confused with Python api of folder. And didn&#8217;t answer well on the optimize question afterward. So the lesson is, just make sure you are familier with API of the language you use.</p>

<p>  Afterward, they escorted me to the lobby and I took taxi back to meet my sister in law. Having some authentic Taiwanese dinner and met some friends who works in Amazon and Microsoft. I took to flight back to New York in the next morning.</p>

<h2>Conclusion</h2>

<p>  In the end I didn&#8217;t get the job, and they encouraging me to try again in half year. But I learned a lot through the preparation of the interview. The interview process is pretty fun - solving different problems with engineers on whiteboard - is like playing a big quiz game. Not every programmer like these pop questions, but at least I think it is pretty interesting and challenging to solve. I will definatlly have more technical interview in future. And this experience will help a lot.</p>

<p>  Thanks for the friends who help me on the interview. And for this oppurtunity to visit Seattle - it is a nice city to live. Wish I can visit there again in near future.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bootstrap 2.0]]></title>
    <link href="http://neethack.com/2012/02/bootstrap-2-dot-0/" />
    <updated>2012-02-24T22:55:00-05:00</updated>
    <id>http://neethack.com/2012/02/bootstrap-2-dot-0</id>
    <content type="html"><![CDATA[<h2><a href="http://twitter.github.com/bootstrap/">Bootstrap</a> , from twitter</h2>

<p>  Bootstrap, a css framework that developed by Twitter, created by <a href="https://twitter.com/#!/mdo">Mark Otto</a> and <a href="https://twitter.com/#!/fat">Jacob Thronton</a>. Which original was the internal framework in twitter for their products and quick prototyping.
  On the github page, Bootstrap is described as:</p>

<blockquote><p>Simple and flexible HTML, CSS, and Javascript for popular user interface components <br/>  and interactions.</p></blockquote>


<p>  That is, Bootstrap is not only just a css framework, but actually an UI framework base
on HTML, CSS and Javascripts. It includes the basic css framework that handle details like css reset, typography and grid system. Moreover, it includes the base UI elements like navigation bar, button, form and paginition&#8230; and the interaction
UI elements like dropdown, popover and tooltips. Evenmore, all of the color and elements is customizable because the css is generated by <a href="http://lesscss.org">less</a>, all setting is in varibles.less file and allow user to change the variables or reuse the elements class in less.</p>

<!--more-->


<p>As twitter engineers describe:</p>

<blockquote><p>In the earlier days of Twitter, engineers used almost any library they were familiar with to meet front-end requirements. Bootstrap began as an answer to the challenges that presented and development quickly accelerated during Twitter’s first Hackweek. In twitter, this framework is widly use among different products as the base UI framework</p></blockquote>


<p>Bootstrap solves the problem of how to reuse css and UI components. Also it improves the productivity of designer and programmer because it is very easy to use on prototyping new products.</p>

<h2>Project Structure</h2>

<p>The project is hosted on <a href="https://github.com/twitter/bootstrap/">Github</a></p>

<p>It includes 3 main parts: less css files, jQuery plugins,
and documents.</p>

<pre><code>docs/    #example and github-page
img/     #css sprite for icons
js/      #jQuery plugins for UI interaction
less/    #main css files
  |- ...
  |-bootstrap.less   #main entry point, includes all other .less file
  |-grid.less        #setting grid system
  |-layouts.less     #setting container width
  |-mixins.less      #mixin functions for clearfix, grid, border, box-shadow and more.
  |-reset.less       #css reset
  |-responsive.less  #responsive css, will compile to bootstrap-responsive.css
  |-scaffolding.less #basic structural layout
  |-type.less        #Typography for elements
  |-utilities.less   #Quick css functions like float:left and display:hide
  |-variables.less   #All varibales like font, background, grid-width 
  |-...
Makefile             #build script on bootstrap, use lessc to compile all .less file to bootstrap.css
</code></pre>

<h2>Reset</h2>

<p>  CSS reset is an important topic to display unify layout among all browsers and devices. It reset the layout by overwriting the different default style on browser.
There are also a lot of reset framework that we can choose beside bootstrap, like <a href="http://yuilibrary.com/yui/docs/cssreset/">YUI reset</a> or <a href="http://meyerweb.com/eric/tools/css/reset/">Eric Meyer&#8217;s Reset</a>
Twitter&#8217;s reset is adapted from <a href="http://github.com/necolas/normalize.css">normalize.css</a></p>

<h2>Grid System</h2>

<p>  Grid system is a way to simplify the positioning and floating of css, which defines the grid with fixed width, so user can use the grid without setting float and calulating persentages. There are differents grid system like <a href="http://960.gs/">960gs</a>, <a href="http://developer.yahoo.com/yui/grids/">YUI Grid</a> or <a href="http://www.blueprintcss.org/">blueprint css</a>. Each have different implementation.</p>

<p>  On Bootstrap 2.0, it use the 960px-12column Grid system:</p>

<p>  <img src="http://neethack.com/images/bootstrap/grid.png" alt="Grid" /></p>

<p>  Each grid is 60px width with 20px left-margin, we can easily use the grid in our html file by adding the span* class to elements:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;div class="container">
</span><span class='line'>  &lt;div class="row">
</span><span class='line'>    &lt;div class="span4">
</span><span class='line'>      &lt;h1>Heading&lt;/h1>
</span><span class='line'>      &lt;p>
</span><span class='line'>      Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus 
</span><span class='line'>      commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. 
</span><span class='line'>      Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.
</span><span class='line'>      &lt;/p>
</span><span class='line'>    &lt;/div>
</span><span class='line'>    &lt;div class="span4">...&lt;/div>
</span><span class='line'>    &lt;div class="span4">...&lt;/div>
</span><span class='line'>  &lt;/div>
</span><span class='line'>&lt;/div></span></code></pre></td></tr></table></div></figure>


<p>Output:</p>

<p>  <img src="http://neethack.com/images/bootstrap/grid_example1.png" alt="Grid example" /></p>

<p>We can also use the fluid layout to make the layout and grid width become fluid with screen width:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;div class="container-fluid">
</span><span class='line'>  &lt;div class="row-fluid">
</span><span class='line'>    &lt;div class="span4">
</span><span class='line'>      &lt;h1>Heading&lt;/h1>
</span><span class='line'>      &lt;p>
</span><span class='line'>      Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus 
</span><span class='line'>      commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. 
</span><span class='line'>      Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.
</span><span class='line'>      &lt;/p>
</span><span class='line'>    &lt;/div>
</span><span class='line'>    &lt;div class="span4">...&lt;/div>
</span><span class='line'>    &lt;div class="span4">...&lt;/div>
</span><span class='line'>  &lt;/div>
</span><span class='line'>&lt;/div></span></code></pre></td></tr></table></div></figure>


<p><img src="http://neethack.com/images/bootstrap/grid_example2.png" alt="Grid Fluid" /></p>

<h2>UI Elements</h2>

<p>  The Bootstrap provide decent style for html elements like button, form and table.
Also, It provide some popular UI elements such as navigation bar, tooltip, popover,
modal&#8230;, Here we will just pick some popular UI elements.</p>

<h3>Button</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;div class="btn btn-primary">Active Action&lt;/div>
</span><span class='line'>&lt;div class="btn">Action&lt;/div>
</span><span class='line'>&lt;div class="btn btn-large btn-danger">Don't press this!&lt;/div></span></code></pre></td></tr></table></div></figure>


<p><img src="http://neethack.com/images/bootstrap/button_example1.png" alt="Button1" /></p>

<p>Here&#8217;s part of the buttons source:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>//less/buttons.less
</span><span class='line'>// Core
</span><span class='line'>.btn {
</span><span class='line'>  display: inline-block;
</span><span class='line'>  padding: 4px 10px 4px;
</span><span class='line'>  margin-bottom: 0; // For input.btn
</span><span class='line'>  font-size: @baseFontSize;
</span><span class='line'>  line-height: @baseLineHeight;
</span><span class='line'>  color: @grayDark;
</span><span class='line'>  text-align: center;
</span><span class='line'>  text-shadow: 0 1px 1px rgba(255,255,255,.75);
</span><span class='line'>  vertical-align: middle;
</span><span class='line'>  .buttonBackground(@white, darken(@white, 10%));
</span><span class='line'>  border: 1px solid #ccc;
</span><span class='line'>  border-bottom-color: #bbb;
</span><span class='line'>  .border-radius(4px);
</span><span class='line'>  @shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
</span><span class='line'>  .box-shadow(@shadow);
</span><span class='line'>  cursor: pointer;
</span><span class='line'>
</span><span class='line'>  // Give IE7 some love
</span><span class='line'>  .reset-filter();
</span><span class='line'>  .ie7-restore-left-whitespace();
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<h3>Navigation</h3>

<p>Navigation bar is the top menu bar of twitter, we can set it as fixed or non-fixed:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;div class="navbar navbar-fixed-top">
</span><span class='line'>  &lt;div class="navbar-inner">
</span><span class='line'>    &lt;div class="container">
</span><span class='line'>      &lt;a class="brand" href="#">
</span><span class='line'>        Neethack
</span><span class='line'>      &lt;/a>
</span><span class='line'>      &lt;ul class="nav">
</span><span class='line'>        &lt;li class="active">
</span><span class='line'>          &lt;a href="#">Home&lt;/a>
</span><span class='line'>        &lt;/li>
</span><span class='line'>        &lt;li class="divider-vertical">&lt;/li>
</span><span class='line'>        &lt;li>&lt;a href="#">Link&lt;/a>&lt;/li>
</span><span class='line'>        &lt;li>&lt;a href="#">Link&lt;/a>&lt;/li>
</span><span class='line'>      &lt;/ul>
</span><span class='line'>    &lt;/div>
</span><span class='line'>  &lt;/div>
</span><span class='line'>&lt;/div></span></code></pre></td></tr></table></div></figure>


<p><img src="http://neethack.com/images/bootstrap/nav_example1.png" alt="nav-bar" /></p>

<p>By setting the .nav-collapse class and include bootstrap-collapse.js,
bootstrap-responsive.css, the nav-bar can automatic correspond with mobile device:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;div class="navbar navbar-fixed-top">
</span><span class='line'>  &lt;div class="navbar-inner">
</span><span class='line'>    &lt;div class="container-fluid">
</span><span class='line'>      &lt;!-- placeholder when navbar collapse -->
</span><span class='line'>      &lt;a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
</span><span class='line'>        &lt;span class="icon-bar">&lt;/span>
</span><span class='line'>        &lt;span class="icon-bar">&lt;/span>
</span><span class='line'>        &lt;span class="icon-bar">&lt;/span>
</span><span class='line'>      &lt;/a>
</span><span class='line'>      &lt;a class="brand" href="#">Neethack&lt;/a>
</span><span class='line'>      &lt;!-- set .nav-collapse for responsive -->
</span><span class='line'>      &lt;div class="nav-collapse">
</span><span class='line'>        &lt;ul class="nav">
</span><span class='line'>          &lt;li class="active">&lt;a href="#">Home&lt;/a>&lt;/li>
</span><span class='line'>          &lt;li class="divider-vertical">&lt;/li>
</span><span class='line'>          &lt;li>&lt;a href="#about">About&lt;/a>&lt;/li>
</span><span class='line'>          &lt;li>&lt;a href="#contact">Contact&lt;/a>&lt;/li>
</span><span class='line'>        &lt;/ul>
</span><span class='line'>      &lt;/div>
</span><span class='line'>    &lt;/div>
</span><span class='line'>  &lt;/div>
</span><span class='line'>&lt;/div></span></code></pre></td></tr></table></div></figure>


<p><img src="http://neethack.com/images/bootstrap/nav_example2.png" alt="nav-bar" /></p>

<h3>Form</h3>

<p>Bootstrap enhance the html form components into more decent elements, we can just use original form elements and append the grid class .span* to control the width.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;form>
</span><span class='line'>  &lt;fieldset>
</span><span class='line'>    &lt;label for="input01">Label name&lt;/label>
</span><span class='line'>    &lt;input id="input01" type="text" class="span3" placeholder="Type something…">
</span><span class='line'>    &lt;span class="help-inline">Associated help text!&lt;/span>
</span><span class='line'>    &lt;label class="checkbox">
</span><span class='line'>      &lt;input type="checkbox"> Check me out
</span><span class='line'>    &lt;/label>
</span><span class='line'>    &lt;button type="submit" class="btn">Submit&lt;/button> 
</span><span class='line'>  &lt;/fieldset>
</span><span class='line'>&lt;/form></span></code></pre></td></tr></table></div></figure>


<p><img src="http://neethack.com/images/bootstrap/form_example1.png" alt="form" /></p>

<p>Here&#8217;s only a few examples of UI elements, check more UI elements on the <a href="http://twitter.github.com/bootstrap/components.html">components page</a>.</p>

<h2>Responsive</h2>

<p>  Responsive design is a big topic recently, since more and more mobile and tablet devices have become the main consumer of web pages.
Bootstrap provide the responsive design by using the media query and grids.
  Take a look at the bootstrap-responsive.less file:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>// LANDSCAPE PHONE TO SMALL DESKTOP & PORTRAIT TABLET
</span><span class='line'>// --------------------------------------------------
</span><span class='line'>
</span><span class='line'>@media (max-width: 767px) {
</span><span class='line'>  // GRID & CONTAINERS
</span><span class='line'>  // -----------------
</span><span class='line'>  // Remove width from containers
</span><span class='line'>  .container {
</span><span class='line'>    width: auto;
</span><span class='line'>    padding: 0 20px;
</span><span class='line'>  }
</span><span class='line'>  // Fluid rows
</span><span class='line'>  .row-fluid {
</span><span class='line'>    width: 100%;
</span><span class='line'>  }
</span><span class='line'>  // Undo negative margin on rows
</span><span class='line'>  .row {
</span><span class='line'>    margin-left: 0;
</span><span class='line'>  }
</span><span class='line'>  // Make all columns even
</span><span class='line'>  .row > [class*="span"],
</span><span class='line'>  .row-fluid > [class*="span"] {
</span><span class='line'>    float: none;
</span><span class='line'>    display: block;
</span><span class='line'>    width: auto;
</span><span class='line'>    margin: 0;
</span><span class='line'>  }
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>This is a small part in responsive.less. As we can see, it use the media query to apply the propriate style for device.
On the device that max-width is under 767px, like LANDSCAPE Phone and PORTRAIT TABLET, container width will be set to auto,
and the span width will be set to full width to display propally on device. For example:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;div class="container">
</span><span class='line'>  &lt;div class="row">
</span><span class='line'>    &lt;div class="span4">
</span><span class='line'>      &lt;h1>Heading&lt;/h1>
</span><span class='line'>      &lt;p>
</span><span class='line'>      Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus 
</span><span class='line'>      commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. 
</span><span class='line'>      Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.
</span><span class='line'>      &lt;/p>
</span><span class='line'>    &lt;/div>
</span><span class='line'>    &lt;div class="span4">...&lt;/div>
</span><span class='line'>    &lt;div class="span4">...&lt;/div>
</span><span class='line'>  &lt;/div>
</span><span class='line'>&lt;/div></span></code></pre></td></tr></table></div></figure>


<p>display in desktop device as:</p>

<p><img src="http://neethack.com/images/bootstrap/grid_example1.png" alt="normal-grid" /></p>

<p>but when the device width is lower than 767px, the span width will become full, the layout will become vertical:</p>

<p><img src="http://neethack.com/images/bootstrap/grid_example3.png" alt="mobile-grid" /></p>

<p>  Bootstrap provide that with media query, all UI elements include navigation, form, tab and others is responsive. The user only need to include the bootstrap-responsive.css to apply those feature without designing mobile version of pages.</p>

<h2>Compile your own bootstrap</h2>

<p>  Bootstrap use less to compile the .less file into css.
  And all the params is in variables.less file. Therefore we can easily change the color and layout setting and recompile our own version of bootstrap.</p>

<p>  First, we need to install the node.js with npm(node package manager)
Using npm to install less.js(you can also install by rubygem, bug less.rb have some bugs on finding .less file on reletive folder)</p>

<pre><code>npm install -g less 
</code></pre>

<p>  Next, install javascript compressor uglify-js by npm</p>

<pre><code>npm install -g uglify-js 
</code></pre>

<p>  After that, we can start to tune on the color and varibles, and pack it with</p>

<pre><code>make bootstrap 
</code></pre>

<p>  We can start to use our own version of bootstrap.css. With bootstrap-responsive.css, bootstrap.min.js</p>

<p>  Here&#8217;s some <a href="http://neethack.com/examples/bootstrap.html">Sample Page</a> that build with different color scheme.</p>

<p>  Moreover, you can also start to build your own new css framework from <a href="http://markdotto.com/bootstrap/">preboot.less</a> includes basic grids and mixins.</p>

<h2>Conclusion</h2>

<p>  Bootstrap is one of the easiest framework to use and integrate. Because it have great project documents and rich examples. Also it is open sourced that we can easily fork and customize on the base of twitter.
  For the nearly future, apperently there will be more and more css UI framework that make web development much easier.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Code Odyssey : Sinatra]]></title>
    <link href="http://neethack.com/2012/02/code-odyssey-sinatra/" />
    <updated>2012-02-22T00:09:00-05:00</updated>
    <id>http://neethack.com/2012/02/code-odyssey-sinatra</id>
    <content type="html"><![CDATA[<p>In 2012, I am planning to start contribute and participate more on opensource projects.
The target of this series is to read through the source of open source projects that I am interested with,
and explain the structure and interesting pieces that I found in the source.</p>

<h2><a href="http://www.sinatrarb.com">Sinatra</a></h2>

<p><a href="http://www.sinatrarb.com">Sinatra</a> is a rack-base , lightweight web framework implemented in ruby.
Written and desinged by <a href="https://github.com/bmizerany">Blake Mizerany</a>. Famous for it&#8217;s dsl syntax and simpliness.</p>

<!--more-->


<h2>Source structure</h2>

<pre><code>examples/
lib/
  sinatra/
    base.rb   #all codes are in here
    main.rb   #Application class, extends Base class in base.rb
    showException.rb #output exception and trace message as Html error page
  sinatra.rb  
test/
Rakefile
Gemfile.gem
</code></pre>

<h2>base.rb</h2>

<p>Main Sinatra application, includes:</p>

<p>1.Rack Module :<br/>
  Implement Rack:Request and Rack:Response</p>

<p>2.Helper Module :
  Helper methods that available in routes, filters and views ,
  handle tasks like redirect, status code, url, html header, session, mime type, http stearming&#8230; etc</p>

<p>3.Template Module :
  Handle multiple template engines using <a href="https://github.com/rtomayko/tilt">tilt</a></p>

<p>4.Base class:<br/>
  The main class that include all modules above. Handling routes and invoke correspond code blocks and filters.</p>

<p>5.Application class:
  Inherit Base class, the run instance of Sinatra application.</p>

<p>6.Delegator module:<br/>
  Delegate DSL methods in Top-level file to Sinatra Application.</p>

<h2>main.rb</h2>

<p>Patch Sinatra::Application class, set the hooks to run application at exit and Parse option. Also it includes the delegator to send all methods on Top-level to application.</p>

<h2>Dependencies</h2>

<p>Sinatra source seperate the declaration of external ,stdlib and project depedencies.
Which is pretty clean and easy to understand:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># external dependencies</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rack&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;tilt&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s2">&quot;rack/protection&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># stdlib dependencies</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;thread&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;time&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;uri&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># other files we need</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;sinatra/showexceptions&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;sinatra/version&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Delegator</h2>

<p>Delegator is an interesting part in Sinatra, since it creates a really simple API that user can just write method with HTTP verb in Top level file, without creating any class.<br/>
For example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#myapp.rb</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;sinatra&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">get</span> <span class="s1">&#39;/&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="s1">&#39;Hello world!&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Execute this file will run Sinatra application handle route &#8220;/&#8221; with GET request.
But how do Sinatra do this?</p>

<p>Take a look at the source of Delegator:</p>

<figure class='code'><figcaption><span>base.rb</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1"># Sinatra delegation mixin. Mixing this module into an object causes all</span>
</span><span class='line'><span class="c1"># methods to be delegated to the Sinatra::Application class. Used primarily</span>
</span><span class='line'><span class="c1"># at the top-level.</span>
</span><span class='line'><span class="k">module</span> <span class="nn">Delegator</span> <span class="c1">#:nodoc:</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">delegate</span><span class="p">(</span><span class="o">*</span><span class="nb">methods</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">methods</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">method_name</span><span class="o">|</span>
</span><span class='line'>      <span class="n">define_method</span><span class="p">(</span><span class="n">method_name</span><span class="p">)</span> <span class="k">do</span> <span class="o">|*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="o">|</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">super</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span> <span class="k">if</span> <span class="nb">respond_to?</span> <span class="n">method_name</span>
</span><span class='line'>        <span class="no">Delegator</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="kp">private</span> <span class="n">method_name</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">delegate</span> <span class="ss">:get</span><span class="p">,</span> <span class="ss">:patch</span><span class="p">,</span> <span class="ss">:put</span><span class="p">,</span> <span class="ss">:post</span><span class="p">,</span> <span class="ss">:delete</span><span class="p">,</span> <span class="ss">:head</span><span class="p">,</span> <span class="ss">:options</span><span class="p">,</span> <span class="ss">:template</span><span class="p">,</span> <span class="ss">:layout</span><span class="p">,</span>
</span><span class='line'>           <span class="ss">:before</span><span class="p">,</span> <span class="ss">:after</span><span class="p">,</span> <span class="ss">:error</span><span class="p">,</span> <span class="ss">:not_found</span><span class="p">,</span> <span class="ss">:configure</span><span class="p">,</span> <span class="ss">:set</span><span class="p">,</span> <span class="ss">:mime_type</span><span class="p">,</span>
</span><span class='line'>           <span class="ss">:enable</span><span class="p">,</span> <span class="ss">:disable</span><span class="p">,</span> <span class="ss">:use</span><span class="p">,</span> <span class="ss">:development?</span><span class="p">,</span> <span class="ss">:test?</span><span class="p">,</span> <span class="ss">:production?</span><span class="p">,</span>
</span><span class='line'>           <span class="ss">:helpers</span><span class="p">,</span> <span class="ss">:settings</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>    <span class="kp">attr_accessor</span> <span class="ss">:target</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="no">Application</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, if we want to delegate method to another class, we can include the methods in files :</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Delegator</span>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="no">Application</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="n">target</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="kp">include</span> <span class="no">Delegator</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#then we can call &#39;get&#39; method in file and delegate to target </span>
</span><span class='line'><span class="n">get</span> <span class="s1">&#39;/&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="s2">&quot;Hello delegator!!&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span></code></pre></td></tr></table></div></figure>


<p>But how would we do if we have lots of method to delegate? In Sinatra, it has lots of methods and Http verbs to be delegated. The code will be pretty ugly if we have to implement all these repeated methods.
The answer here is metaprogramming: We can use ruby&#8217;s ability of metaprogramming to create repeated methods in a few lines of code:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Delegator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">delegate</span><span class="p">(</span><span class="n">method_name</span><span class="p">)</span>
</span><span class='line'>    <span class="n">define_method</span><span class="p">(</span><span class="n">method_name</span><span class="p">)</span> <span class="k">do</span> <span class="o">|*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="o">|</span>
</span><span class='line'>      <span class="no">Delegator</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="kp">private</span> <span class="n">method_name</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">delegate</span> <span class="ss">:get</span>
</span><span class='line'>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="no">Application</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In ruby, we can use &#8220;define_method&#8221; to create method programmically, and use &#8220;send(method_name, *args, &amp;block)&#8221; To call the target method by the method_name. This makes the code a lot cleaner in Sinatra</p>

<h2>Routes</h2>

<p>In sinatra, after user call the dsl methods(like get, post) in file,
the HTTP verbs ,path and code block will be registered in application,
And will be executed when receiving matched request.</p>

<p>When the dsl method get called, the Application will generate a Proc with the name of
HttpVerb and path (like &#8220;get /&#8221;) save the Proc, url path (include the keys, pattern and conditions on paths, like &#8220;/:id&#8221; ) in @routes.</p>

<p>Here&#8217;s the simplify version of routes :</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">App</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>    <span class="kp">attr_reader</span> <span class="ss">:routes</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{},</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="n">route</span><span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">route</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@routes</span> <span class="o">||=</span> <span class="p">{}</span>
</span><span class='line'>      <span class="n">signature</span> <span class="o">=</span> <span class="n">compile!</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">block</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@routes</span><span class="o">[</span><span class="n">verb</span><span class="o">]</span> <span class="o">||=</span> <span class="o">[]</span>
</span><span class='line'>      <span class="vi">@routes</span><span class="o">[</span><span class="n">verb</span><span class="o">]</span> <span class="o">&lt;&lt;</span> <span class="n">signature</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">compile!</span><span class="p">(</span><span class="n">verb</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">block</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>      <span class="n">unbound_method</span> <span class="o">=</span> <span class="n">generate_method</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">verb</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">[</span><span class="n">path</span><span class="p">,</span> <span class="nb">proc</span> <span class="p">{</span><span class="o">|</span><span class="n">base</span><span class="o">|</span> <span class="n">unbinded_method</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">base</span><span class="p">)</span><span class="o">.</span><span class="n">call</span><span class="p">()</span> <span class="p">}</span> <span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">generate_method</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="n">define_method</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="nb">method</span> <span class="o">=</span> <span class="nb">instance_method</span> <span class="n">method_name</span>
</span><span class='line'>      <span class="n">remove_method</span> <span class="n">method_name</span>
</span><span class='line'>      <span class="nb">method</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">App</span><span class="o">.</span><span class="n">get</span> <span class="s2">&quot;/&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="s2">&quot;Hello world&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">base</span> <span class="o">=</span> <span class="no">App</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'><span class="no">App</span><span class="o">.</span><span class="n">routes</span><span class="o">[</span><span class="s2">&quot;GET&quot;</span><span class="o">][</span><span class="mi">0</span><span class="o">][</span><span class="mi">1</span><span class="o">].</span><span class="n">call</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
</span><span class='line'><span class="c1">#print:: &quot;Hello world&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In here, sinatra generates the code block as an <a href="http://www.ruby-doc.org/core-1.9.3/UnboundMethod.html">unbound_method</a>, it is a kind of instance method that you can bind it to any other instance dynamically before call. Sinatra use this to bind Application instance with Proc on runtime.</p>

<h2>Route call</h2>

<p>After register the code block, sinatra wait for request and invoke correspond routes to handle request.
The entry point of all request is the <a href="http://chneukirchen.org/blog/archive/2007/02/introducing-rack.html">rack call interface</a>. All rack application must implement the interface.</p>

<p>Overall, the request execution stack is:
  call => call! => invoke => dispatch! => route! => route_eval</p>

<figure class='code'><figcaption><span>base.rb</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">dup</span><span class="o">.</span><span class="n">call!</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">call!</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>  <span class="vi">@env</span> <span class="o">=</span> <span class="n">env</span>
</span><span class='line'>  <span class="vi">@request</span> <span class="o">=</span> <span class="no">Request</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>  <span class="vi">@response</span> <span class="o">=</span> <span class="no">Response</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="vi">@params</span> <span class="o">=</span> <span class="n">indifferent_params</span><span class="p">(</span><span class="vi">@request</span><span class="o">.</span><span class="n">params</span><span class="p">)</span>
</span><span class='line'>  <span class="n">template_cache</span><span class="o">.</span><span class="n">clear</span> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">reload_templates</span>
</span><span class='line'>  <span class="n">force_encoding</span><span class="p">(</span><span class="vi">@params</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@response</span><span class="o">[</span><span class="s1">&#39;Content-Type&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="n">invoke</span> <span class="p">{</span> <span class="n">dispatch!</span><span class="p">}</span>
</span><span class='line'>  <span class="n">invoke</span> <span class="p">{</span> <span class="n">error_block!</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">unless</span> <span class="vi">@response</span><span class="o">[</span><span class="s1">&#39;Content-Type&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="k">if</span> <span class="nb">Array</span> <span class="o">===</span> <span class="n">body</span> <span class="ow">and</span> <span class="n">body</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">respond_to?</span> <span class="ss">:content_type</span>
</span><span class='line'>      <span class="n">content_type</span> <span class="n">body</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">content_type</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">content_type</span> <span class="ss">:html</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@response</span><span class="o">.</span><span class="n">finish</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The code above is the first part of how Sinatra handle incoming requests.
First, as a Rack application, all request will invoke the call(env) function
Sinatra application will duplicate an instance, invoke the call!(env) on new instance (because HTTP is stateless)
in the call! function, sinatra will new the Rack::Request and Rack::Response object by env, than set the params.</p>

<p>After all object is set, it will start to invoke the routes by &#8220;invoke{ dispatch! }&#8221;, the result will be store
on @response, and return to user by call the @response.finish</p>

<figure class='code'><figcaption><span>base.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'>  <span class="c1"># Run the block with &#39;throw :halt&#39; support and apply result to the response.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">invoke</span>
</span><span class='line'>    <span class="n">res</span> <span class="o">=</span> <span class="kp">catch</span><span class="p">(</span><span class="ss">:halt</span><span class="p">)</span> <span class="p">{</span> <span class="k">yield</span> <span class="p">}</span>
</span><span class='line'>    <span class="n">res</span> <span class="o">=</span> <span class="o">[</span><span class="n">res</span><span class="o">]</span> <span class="k">if</span> <span class="no">Fixnum</span> <span class="o">===</span> <span class="n">res</span> <span class="ow">or</span> <span class="nb">String</span> <span class="o">===</span> <span class="n">res</span>
</span><span class='line'>    <span class="k">if</span> <span class="nb">Array</span> <span class="o">===</span> <span class="n">res</span> <span class="ow">and</span> <span class="no">Fixnum</span> <span class="o">===</span> <span class="n">res</span><span class="o">.</span><span class="n">first</span>
</span><span class='line'>      <span class="n">status</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">shift</span><span class="p">)</span>
</span><span class='line'>      <span class="n">body</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">pop</span><span class="p">)</span>
</span><span class='line'>      <span class="n">headers</span><span class="p">(</span><span class="o">*</span><span class="n">res</span><span class="p">)</span>
</span><span class='line'>    <span class="k">elsif</span> <span class="n">res</span><span class="o">.</span><span class="n">respond_to?</span> <span class="ss">:each</span>
</span><span class='line'>      <span class="n">body</span> <span class="n">res</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="kp">nil</span> <span class="c1"># avoid double setting the same response tuple twice</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The invoke function wrap and execute the handler codeblock ,catch the :halt
(which throw by route! as interrupt signal), and than set status, header and result to @response.</p>

<p>for example, when you execute the code wrapped by invoke, you can set the @response by throw :halt and Array response:</p>

<pre><code>invoke do 
  #do something...
  throw :halt ,[200,"Hello world!"] #this will go to @response
end
</code></pre>

<p>With the structure like this, error_block or other function can also throw :halt with result and return to user.</p>

<figure class='code'><figcaption><span>base.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1"># Dispatch a request with error handling.</span>
</span><span class='line'><span class="k">def</span> <span class="nf">dispatch!</span>
</span><span class='line'>  <span class="n">invoke</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">static!</span> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">static?</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">get?</span> <span class="o">||</span> <span class="n">request</span><span class="o">.</span><span class="n">head?</span><span class="p">)</span>
</span><span class='line'>    <span class="n">filter!</span> <span class="ss">:before</span>
</span><span class='line'>    <span class="n">route!</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">rescue</span> <span class="o">::</span><span class="no">Exception</span> <span class="o">=&gt;</span> <span class="n">boom</span>
</span><span class='line'>  <span class="n">invoke</span> <span class="p">{</span> <span class="n">handle_exception!</span><span class="p">(</span><span class="n">boom</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="k">ensure</span>
</span><span class='line'>  <span class="n">filter!</span> <span class="ss">:after</span> <span class="k">unless</span> <span class="n">env</span><span class="o">[</span><span class="s1">&#39;sinatra.static_file&#39;</span><span class="o">]</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In dispatch function, it check the static file first, than execute before filter, then execute the route! function follow by the after filter.</p>

<figure class='code'><figcaption><span>base.rb</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">route!</span><span class="p">(</span><span class="n">base</span> <span class="o">=</span> <span class="n">settings</span><span class="p">,</span> <span class="n">pass_block</span><span class="o">=</span><span class="kp">nil</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">routes</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">routes</span><span class="o">[</span><span class="vi">@request</span><span class="o">.</span><span class="n">request_method</span><span class="o">]</span>
</span><span class='line'>    <span class="n">routes</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">pattern</span><span class="p">,</span> <span class="n">keys</span><span class="p">,</span> <span class="n">conditions</span><span class="p">,</span> <span class="n">block</span><span class="o">|</span>
</span><span class='line'>      <span class="n">pass_block</span> <span class="o">=</span> <span class="n">process_route</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">keys</span><span class="p">,</span> <span class="n">conditions</span><span class="p">)</span> <span class="k">do</span> <span class="o">|*</span><span class="n">args</span><span class="o">|</span>
</span><span class='line'>        <span class="n">route_eval</span> <span class="p">{</span> <span class="n">block</span><span class="o">[*</span><span class="n">args</span><span class="o">]</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Run routes defined in superclass.</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">base</span><span class="o">.</span><span class="n">superclass</span><span class="o">.</span><span class="n">respond_to?</span><span class="p">(</span><span class="ss">:routes</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">route!</span><span class="p">(</span><span class="n">base</span><span class="o">.</span><span class="n">superclass</span><span class="p">,</span> <span class="n">pass_block</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">route_eval</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pass_block</span><span class="p">)</span> <span class="k">if</span> <span class="n">pass_block</span>
</span><span class='line'>  <span class="n">route_missing</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Run a route block and throw :halt with the result.</span>
</span><span class='line'><span class="k">def</span> <span class="nf">route_eval</span>
</span><span class='line'>  <span class="kp">throw</span> <span class="ss">:halt</span><span class="p">,</span> <span class="k">yield</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>At the bottom of execution stack, the route! function check the registered routes with request path and params.
If it find correct route, execute the codeblock and throw :halt with result. the invoke function will catch the :halt,
than set the result to @response.</p>

<p>If no route is executed, route_missing will be called and return not_found page.</p>

<h2>Template</h2>

<p>Sinatra is compatible with a lots of different templates, from erb, haml, markdown to sass, less&#8230;
almost any kind of templates that you can find, but how do Sinatra handle all of these different format?
It turns out using <a href="https://github.com/rtomayko/tilt">Tilt</a> gem that includes all kinds of template engines.</p>

<p>For example, with Tilt, we can compile an erb template like this:</p>

<figure class='code'><figcaption><span>base.rb</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="nb">require</span> <span class="s2">&quot;tilt&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">template</span> <span class="o">=</span> <span class="no">Tilt</span><span class="o">[</span><span class="ss">:erb</span><span class="o">]</span>
</span><span class='line'><span class="c1"># =&gt; Tilt::ErubisTemplate </span>
</span><span class='line'>
</span><span class='line'><span class="c1"># pass the file path or pass content body</span>
</span><span class='line'><span class="n">compiled_template</span> <span class="o">=</span> <span class="n">template</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;path/to/file&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;hello world&quot;</span> <span class="p">}</span>
</span><span class='line'><span class="c1"># =&gt; &lt;Tilt::ErubisTemplate: ... @path=&quot;path/to/file&quot; @data = &quot;hello world&quot;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="n">compiled_template</span><span class="o">.</span><span class="n">render</span><span class="p">()</span>
</span><span class='line'><span class="c1"># =&gt; &quot;hello world&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In application, we can call &#8220;erb&#8221; method to render erb template:</p>

<pre><code>get "/" do
  #render erb template in views/index.html.erb
  erb :index
end
</code></pre>

<p>under the hood in Template module:</p>

<figure class='code'><figcaption><span>base.rb</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">erb</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{},</span> <span class="n">locals</span><span class="o">=</span><span class="p">{})</span>
</span><span class='line'>  <span class="n">render</span> <span class="ss">:erb</span><span class="p">,</span> <span class="n">template</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">locals</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{},</span> <span class="n">locals</span><span class="o">=</span><span class="p">{},</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># merge app-level options</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># compile and render template</span>
</span><span class='line'>  <span class="k">begin</span>
</span><span class='line'>    <span class="n">layout_was</span>      <span class="o">=</span> <span class="vi">@default_layout</span>
</span><span class='line'>    <span class="vi">@default_layout</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>    <span class="n">template</span>        <span class="o">=</span> <span class="n">compile_template</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">views</span><span class="p">)</span>
</span><span class='line'>    <span class="n">output</span>          <span class="o">=</span> <span class="n">template</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">scope</span><span class="p">,</span> <span class="n">locals</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="k">ensure</span>
</span><span class='line'>    <span class="vi">@default_layout</span> <span class="o">=</span> <span class="n">layout_was</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># render layout</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">output</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">compile_template</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">views</span><span class="p">)</span>
</span><span class='line'>  <span class="n">eat_errors</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">delete</span> <span class="ss">:eat_errors</span>
</span><span class='line'>  <span class="n">template_cache</span><span class="o">.</span><span class="n">fetch</span> <span class="n">engine</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">options</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">template</span> <span class="o">=</span> <span class="no">Tilt</span><span class="o">[</span><span class="n">engine</span><span class="o">]</span>
</span><span class='line'>    <span class="k">raise</span> <span class="s2">&quot;Template engine not found: </span><span class="si">#{</span><span class="n">engine</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">template</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">case</span> <span class="n">data</span>
</span><span class='line'>    <span class="k">when</span> <span class="no">Symbol</span>
</span><span class='line'>      <span class="n">body</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">line</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">templates</span><span class="o">[</span><span class="n">data</span><span class="o">]</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">body</span>
</span><span class='line'>        <span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="o">.</span><span class="n">call</span> <span class="k">if</span> <span class="n">body</span><span class="o">.</span><span class="n">respond_to?</span><span class="p">(</span><span class="ss">:call</span><span class="p">)</span>
</span><span class='line'>        <span class="n">template</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">to_i</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> <span class="p">{</span> <span class="n">body</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="n">found</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>        <span class="vi">@preferred_extension</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'>        <span class="n">find_template</span><span class="p">(</span><span class="n">views</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">template</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span>
</span><span class='line'>          <span class="n">path</span> <span class="o">||=</span> <span class="n">file</span> <span class="c1"># keep the initial path rather than the last one</span>
</span><span class='line'>          <span class="k">if</span> <span class="n">found</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
</span><span class='line'>            <span class="n">path</span> <span class="o">=</span> <span class="n">file</span>
</span><span class='line'>            <span class="k">break</span>
</span><span class='line'>          <span class="k">end</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>        <span class="kp">throw</span> <span class="ss">:layout_missing</span> <span class="k">if</span> <span class="n">eat_errors</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">found</span>
</span><span class='line'>        <span class="n">template</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">when</span> <span class="no">Proc</span><span class="p">,</span> <span class="nb">String</span>
</span><span class='line'>      <span class="n">body</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="nb">String</span><span class="p">)</span> <span class="p">?</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="n">data</span> <span class="p">}</span> <span class="p">:</span> <span class="n">data</span>
</span><span class='line'>      <span class="n">path</span><span class="p">,</span> <span class="n">line</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">caller_locations</span><span class="o">.</span><span class="n">first</span>
</span><span class='line'>      <span class="n">template</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">to_i</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">body</span><span class="p">)</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">,</span> <span class="s2">&quot;Sorry, don&#39;t know how to render </span><span class="si">#{</span><span class="n">data</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2">.&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, the helper method will call the render method with format,
and render method compile the template and return output, than output will be catch by invoke method (in previous section)
and set to @response.</p>

<p>In compile_template, the Tilt engine will be called and return correct Tilt::Template instance.
here&#8217;s the digest version:</p>

<figure class='code'><figcaption><span>base.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">compile_template</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">views</span><span class="p">)</span>
</span><span class='line'>  <span class="n">template_cache</span><span class="o">.</span><span class="n">fetch</span> <span class="n">engine</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">options</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">template</span> <span class="o">=</span> <span class="no">Tilt</span><span class="o">[</span><span class="n">engine</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">body</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">line</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">templates</span><span class="o">[</span><span class="n">data</span><span class="o">]</span>
</span><span class='line'>    <span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="o">.</span><span class="n">call</span> <span class="k">if</span> <span class="n">body</span><span class="o">.</span><span class="n">respond_to?</span><span class="p">(</span><span class="ss">:call</span><span class="p">)</span>
</span><span class='line'>    <span class="n">template</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">to_i</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span> <span class="p">{</span> <span class="n">body</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The template_cache is an instance of Tilt::Cache, is a very simple hash implementation of cache:</p>

<pre><code>class Cache
    def initialize
      @cache = {}
    end

    def fetch(*key)
      @cache[key] ||= yield
    end

    def clear
      @cache = {}
    end
  end
end
</code></pre>

<h2>Streaming</h2>

<p>Stream is another interesting part in Sinatra, and probally one of the most complex part.
It use the <a href="http://rubyeventmachine.com/">EventMachine</a> to implement streaming APIs that let you able to keep
sending data asynchronize without I/O blocking.
For example,</p>

<pre><code>get '/' do
  stream :keep_open do |out|
    out &lt;&lt; "hello "
    EventMachine.defer do 
      #something slow...
      sleep(3)
      out &lt;&lt; "world"
    end
  end
end
</code></pre>

<p>will output the responses chunk to user while the content is ready, and keep the connection open.
For doing that, it use the EventMachine.defer , EventMachine.schedule to create threads to avoid i/o blocking while generating result.</p>

<figure class='code'><figcaption><span>base.rb</span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1"># Allows to start sending data to the client even though later parts of</span>
</span><span class='line'><span class="c1"># the response body have not yet been generated.</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># The close parameter specifies whether Stream#close should be called</span>
</span><span class='line'><span class="c1"># after the block has been executed. This is only relevant for evented</span>
</span><span class='line'><span class="c1"># servers like Thin or Rainbows.</span>
</span><span class='line'><span class="k">def</span> <span class="nf">stream</span><span class="p">(</span><span class="n">keep_open</span> <span class="o">=</span> <span class="kp">false</span><span class="p">)</span>
</span><span class='line'>  <span class="n">scheduler</span> <span class="o">=</span> <span class="n">env</span><span class="o">[</span><span class="s1">&#39;async.callback&#39;</span><span class="o">]</span> <span class="p">?</span> <span class="no">EventMachine</span> <span class="p">:</span> <span class="no">Stream</span>
</span><span class='line'>  <span class="n">current</span>   <span class="o">=</span> <span class="vi">@params</span><span class="o">.</span><span class="n">dup</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">block</span>     <span class="o">=</span> <span class="nb">proc</span> <span class="k">do</span> <span class="o">|</span><span class="n">out</span><span class="o">|</span>
</span><span class='line'>    <span class="k">begin</span>
</span><span class='line'>      <span class="n">original</span><span class="p">,</span> <span class="vi">@params</span> <span class="o">=</span> <span class="vi">@params</span><span class="p">,</span> <span class="n">current</span>
</span><span class='line'>      <span class="k">yield</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
</span><span class='line'>    <span class="k">ensure</span>
</span><span class='line'>      <span class="vi">@params</span> <span class="o">=</span> <span class="n">original</span> <span class="k">if</span> <span class="n">original</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">out</span> <span class="o">=</span> <span class="no">Stream</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">scheduler</span><span class="p">,</span> <span class="n">keep_open</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="n">body</span> <span class="n">out</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>What stream method do is, first it detect the Server is support streamming or not. If so, use EventMachine.
And it wrap the code block with params, create a Stream instance than send it to body helper.
and body helper will send stream to Rack::Response.</p>

<figure class='code'><figcaption><span>base.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Stream</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">scheduler</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="p">,</span> <span class="n">keep_open</span> <span class="o">=</span> <span class="kp">false</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">back</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@back</span><span class="p">,</span> <span class="vi">@scheduler</span><span class="p">,</span> <span class="vi">@keep_open</span> <span class="o">=</span> <span class="n">back</span><span class="o">.</span><span class="n">to_proc</span><span class="p">,</span> <span class="n">scheduler</span><span class="p">,</span> <span class="n">keep_open</span>
</span><span class='line'>    <span class="vi">@callbacks</span><span class="p">,</span> <span class="vi">@closed</span> <span class="o">=</span> <span class="o">[]</span><span class="p">,</span> <span class="kp">false</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">each</span><span class="p">(</span><span class="o">&amp;</span><span class="n">front</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@front</span> <span class="o">=</span> <span class="n">front</span>
</span><span class='line'>    <span class="vi">@scheduler</span><span class="o">.</span><span class="n">defer</span> <span class="k">do</span>
</span><span class='line'>      <span class="k">begin</span>
</span><span class='line'>        <span class="vi">@back</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span>
</span><span class='line'>      <span class="k">rescue</span> <span class="no">Exception</span> <span class="o">=&gt;</span> <span class="n">e</span>
</span><span class='line'>        <span class="vi">@scheduler</span><span class="o">.</span><span class="n">schedule</span> <span class="p">{</span> <span class="k">raise</span> <span class="n">e</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="n">close</span> <span class="k">unless</span> <span class="vi">@keep_open</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">&lt;&lt;</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@scheduler</span><span class="o">.</span><span class="n">schedule</span> <span class="p">{</span> <span class="vi">@front</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>According to Rack interface, the response body need to respond to &#8220;each&#8221; method.
The each method will be called with &amp;front block, which can sent result to user.
Stream class use the EventMachine.schedule to call codeblock asynchronizly,
and the &lt;&lt; method will sent data to @front with EventMachine.schedule.</p>

<h2>Configure</h2>

<p>In sinatra, we can set configuration by &#8220;set&#8221; or &#8220;configure&#8221; method.</p>

<pre><code>set :server , :thin 

#or 
configure do 
  set :server, :thin
end
</code></pre>

<p>what configure do here is just call yield self, and act as a place for all settings.
And also those 2 methods are delegated methods.</p>

<p>What set doing here is a little different with normal setting methods:
It use the metaprogramming skills again.</p>

<p>while we call the set method,
it will generate getter and setter methods for self.server</p>

<pre><code>configure do |app|
    set :server, :thin 

    app.server # =&gt; :thin
    app.server = :unicorn # Application.server =&gt; :unicorn
end
</code></pre>

<figure class='code'><figcaption><span>base.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="c1"># Sets an option to the given value.  If the value is a proc,</span>
</span><span class='line'><span class="c1"># the proc will be called every time the option is accessed.</span>
</span><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">set</span><span class="p">(</span><span class="n">option</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">not_set</span> <span class="o">=</span> <span class="kp">true</span><span class="p">),</span> <span class="n">ignore_setter</span> <span class="o">=</span> <span class="kp">false</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="n">setter</span> <span class="o">=</span> <span class="nb">proc</span> <span class="p">{</span> <span class="o">|</span><span class="n">val</span><span class="o">|</span> <span class="n">set</span> <span class="n">option</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="kp">true</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">getter</span> <span class="o">=</span> <span class="nb">proc</span> <span class="p">{</span> <span class="n">value</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">case</span> <span class="n">value</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="k">when</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">Fixnum</span><span class="p">,</span> <span class="no">FalseClass</span><span class="p">,</span> <span class="no">TrueClass</span><span class="p">,</span> <span class="no">NilClass</span>
</span><span class='line'>    <span class="c1"># we have a lot of enable and disable calls, let&#39;s optimize those</span>
</span><span class='line'>    <span class="nb">class_eval</span> <span class="s2">&quot;def self.</span><span class="si">#{</span><span class="n">option</span><span class="si">}</span><span class="s2">() </span><span class="si">#{</span><span class="n">value</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2"> end&quot;</span>
</span><span class='line'>    <span class="n">getter</span> <span class="o">=</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">(</span><span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span><span class="p">;</span> <span class="nb">self</span><span class="p">;</span> <span class="k">end</span><span class="p">)</span><span class="o">.</span><span class="n">class_eval</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">define_method</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">option</span><span class="si">}</span><span class="s2">=&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">setter</span><span class="p">)</span> <span class="k">if</span> <span class="n">setter</span>
</span><span class='line'>    <span class="n">define_method</span><span class="p">(</span><span class="n">option</span><span class="p">,</span>       <span class="o">&amp;</span><span class="n">getter</span><span class="p">)</span> <span class="k">if</span> <span class="n">getter</span>
</span><span class='line'>    <span class="k">unless</span> <span class="nb">method_defined?</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">option</span><span class="si">}</span><span class="s2">?&quot;</span>
</span><span class='line'>      <span class="nb">class_eval</span> <span class="s2">&quot;def </span><span class="si">#{</span><span class="n">option</span><span class="si">}</span><span class="s2">?() !!</span><span class="si">#{</span><span class="n">option</span><span class="si">}</span><span class="s2"> end&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="nb">self</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>Sinatra is a very simple and delegate web framework. It takes lots of advantage on ruby&#8217;s metaprogramming feature
to make code more digest and clean. Also with decent features support.(Template, Streaming, Filter, Route&#8230;)</p>

<p>The dsl syntax and delegator makes learning Sinatra application become very easy.
It will be great for implement api service or small website when you don&#8217;t need the heavy stacks like Rails.</p>
]]></content>
  </entry>
  
</feed>
