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

  <title><![CDATA[Olivier Lalonde's blog]]></title>
  <link href="http://syskall.com/atom.xml" rel="self"/>
  <link href="http://syskall.com/"/>
  <updated>2013-06-12T01:03:14+08:00</updated>
  <id>http://syskall.com/</id>
  <author>
    <name><![CDATA[Olivier Lalonde]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Introducing Boolasync - a library for async boolean logic]]></title>
    <link href="http://syskall.com/introducing-boolasync-async-boolean-logic-library/"/>
    <updated>2013-06-12T00:23:00+08:00</updated>
    <id>http://syskall.com/introducing-boolasync-async-boolean-logic-library</id>
    <content type="html"><![CDATA[<ul>
<li>Github: <a href="https://github.com/olalonde/boolasync">olalonde/boolasync</a></li>
<li>NPM: <code>npm install boolasync</code></li>
<li>License: MIT</li>
</ul>


<p>Who would have thoughts things would have gone that far? Yes, I have
created a Javascript library for handling boolean logic that involves asynchronous
callbacks.</p>

<p>Let&#8217;s say you have a web app that has an authorization layer like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">is_user</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">is_admin</span><span class="p">()</span> <span class="o">||</span> <span class="nx">is_super_admin</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Authorize!&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note: this is a fictional example for demonstration purposes.</p>

<p>However, here is the catch: your functions are asynchronous which means
that they take a callback argument which in turns takes an error and
result argument. <code>function callback(err, res) {}</code></p>

<p>How do you rewrite the above code elegantly?</p>

<p>You could use the nice <code>async</code> library.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">async</span><span class="p">.</span><span class="nx">parallel</span><span class="p">([</span>
</span><span class='line'>  <span class="nx">is_user</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">is_admin</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">is_super_admin</span>
</span><span class='line'><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">results</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">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">results</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">||</span> <span class="nx">results</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Authorize!&#39;</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>There are two problems however:</p>

<ol>
<li><p>The code is not very expressive.</p></li>
<li><p>We have to wait for all functions to finish.</p>

<p> In the example above, if <code>is_user</code> returns <code>false</code>, we would already know that the user is not
 authorized. <code>false &amp;&amp; ...</code> is always false no matter what the <code>...</code>
 represents. In computer science, this is called lazy evaluation.</p></li>
</ol>


<p>Here is how you would rewrite the above with boolasync:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">is_user</span><span class="p">.</span><span class="nx">and</span><span class="p">(</span><span class="nx">is_admin</span><span class="p">.</span><span class="nx">or</span><span class="p">(</span><span class="nx">is_super_admin</span><span class="p">)).</span><span class="nb">eval</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">authorized</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">authorized</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Authorize!&#39;</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></p>

<p>Notice how terse and expressive the code is compared to the async
example. In bonus, boolasync won&#8217;t wait for an async call to terminate if it already knows the result
of an expression.</p>

<p>For more documentation and examples, visit the Github page: <a href="https://github.com/olalonde/boolasync">https://github.com/olalonde/boolasync</a></p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Executing multiple shell commands cleanly in Node.js with async]]></title>
    <link href="http://syskall.com/executing-multiple-shell-commands-cleanly-in-node-dot-js-with-async/"/>
    <updated>2013-05-27T18:04:00+08:00</updated>
    <id>http://syskall.com/executing-multiple-shell-commands-cleanly-in-node-dot-js-with-async</id>
    <content type="html"><![CDATA[<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">async</span><span class="p">.</span><span class="nx">parallel</span><span class="p">([</span>
</span><span class='line'>  <span class="nx">async</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">exec</span><span class="p">,</span> <span class="s1">&#39;git rev-parse HEAD&#39;</span><span class="p">),</span>
</span><span class='line'>  <span class="nx">async</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">exec</span><span class="p">,</span> <span class="s1">&#39;git symbolic-ref --short HEAD&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">],</span>
</span><span class='line'><span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">results</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">results</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, the <code>async.parallel</code> call executes all functions in the array
concurrently. If you need the commands to be executed in order, use
<code>async.series</code> instead. <code>async.apply</code> returns the function passed as a
first argument with values already applied to its arguments and sets the
<code>async.parallel</code> callback for us. Finally, the last functions receives
the results in order when all functions have finished executing. It
preserves the order of results as you would expect them.</p>

<p>For more info:</p>

<p><a href="https://github.com/caolan/async">https://github.com/caolan/async</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My biggest Vim productivity boost]]></title>
    <link href="http://syskall.com/my-biggest-vim-productivity-boost/"/>
    <updated>2013-05-21T10:50:00+08:00</updated>
    <id>http://syskall.com/my-biggest-vim-productivity-boost</id>
    <content type="html"><![CDATA[<p>This week I added the following snippet to my .vimrc (.vimrc.after if you are using Janus):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='vim'><span class='line'>map <span class="p">&lt;</span>C<span class="p">-</span>J<span class="p">&gt;</span> :<span class="k">bnext</span><span class="p">&lt;</span>CR<span class="p">&gt;</span>
</span><span class='line'>map <span class="p">&lt;</span>C<span class="p">-</span>K<span class="p">&gt;</span> :<span class="k">bprev</span><span class="p">&lt;</span>CR<span class="p">&gt;</span>
</span><span class='line'>map <span class="p">&lt;</span>C<span class="p">-</span>L<span class="p">&gt;</span> :<span class="k">tabn</span><span class="p">&lt;</span>CR<span class="p">&gt;</span>
</span><span class='line'>map <span class="p">&lt;</span>C<span class="p">-</span>H<span class="p">&gt;</span> :<span class="k">tabp</span><span class="p">&lt;</span>CR<span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It maps <code>CTRL-j</code> and <code>CTRL-k</code> to next and previous buffer and <code>CTRL-l</code> and <code>CTRL-h</code> to next and previous tabs.</p>

<p>It is by far the biggest productivity boost I have gotten out of my
<code>.vimrc</code> file.</p>

<p>Buffer and tab switching has never been that fast and easy.</p>

<p>Macbook tip: remap your CAPS LOCK key to CTRL.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Connectr: Programmatically manipulating the Connect stack]]></title>
    <link href="http://syskall.com/connectr-programmatically-manipulating-the-connect-stack/"/>
    <updated>2013-05-18T12:36:00+08:00</updated>
    <id>http://syskall.com/connectr-programmatically-manipulating-the-connect-stack</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/olalonde/connectr">Connectr</a> is a Node.js module I wrote that aims to solve the following problem: how
to manipulate the <a href="https://github.com/senchalabs/connect">Connect</a> stack after it has been created.</p>

<p>This is a problem I faced while writing a REST framework on top of <a href="http://expressjs.com">Express.js</a>. The framework initialized the middleware stack but there was no easy way to expose the stack to end users of the framework so they could add their own middlewares at arbitrary positions on the stack.</p>

<h1>Install</h1>

<pre><code>npm install connectr
</code></pre>

<h1>Usage</h1>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">connectr</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;connectr&#39;</span><span class="p">)(</span><span class="nx">app</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add labeled middleware</span>
</span><span class='line'><span class="nx">connectr</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">as</span><span class="p">(</span><span class="nx">label</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Insert before middleware</span>
</span><span class='line'><span class="nx">connectr</span><span class="p">.</span><span class="nx">before</span><span class="p">(</span><span class="nx">label</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">as</span><span class="p">(</span><span class="nx">label</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Insert after middleware</span>
</span><span class='line'><span class="nx">connectr</span><span class="p">.</span><span class="nx">after</span><span class="p">(</span><span class="nx">label</span><span class="p">).</span><span class="nx">use</span><span class="p">(</span><span class="nx">middleware</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Remove middleware</span>
</span><span class='line'><span class="nx">connectr</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="nx">label</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// the .as, .before and .after calls are optional</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Simple Example</h1>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><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="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="kd">var</span> <span class="nx">connectr</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;connectr&#39;</span><span class="p">)(</span><span class="nx">app</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">connectr</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">cookieParser</span><span class="p">).</span><span class="nx">as</span><span class="p">(</span><span class="s1">&#39;cookieParser&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/* ... */</span>
</span><span class='line'>
</span><span class='line'><span class="nx">connectr</span><span class="p">.</span><span class="nx">before</span><span class="p">(</span><span class="s1">&#39;cookieParser&#39;</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 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;Before cookie parser...&#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 class="nx">as</span><span class="p">(</span><span class="s1">&#39;log before cookie parser&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>I am hoping the methods that Connectr provide can eventually be
supported natively by Connect but until then, Connectr does the job.</p>

<p>If you use Connectr, please <a href="https://github.com/olalonde/connectr/blob/master/README.md">star the project on Github</a> to show your support.</p>

<p>Happy coding!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pagination with Handlebars]]></title>
    <link href="http://syskall.com/pagination-with-handlebars/"/>
    <updated>2012-11-17T09:05:00+08:00</updated>
    <id>http://syskall.com/pagination-with-handlebars</id>
    <content type="html"><![CDATA[<p>Pagination can be quite tricky with Handlebars since Handlebars does not
have any built in way to do for/while loops. One solution mix some presentation code
within your logic layer and passing an array containing all your pages in an array.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">pagination</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">{</span> <span class="nx">previous</span><span class="o">:</span> <span class="nx">disabled</span> <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span> <span class="nx">page</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">active</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span> <span class="nx">page</span><span class="o">:</span> <span class="mi">2</span> <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span> <span class="nx">page</span><span class="o">:</span> <span class="mi">3</span> <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span> <span class="nx">page</span><span class="o">:</span> <span class="mi">4</span> <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span> <span class="nx">page</span><span class="o">:</span> <span class="mi">5</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>This solution has several drawbacks: mixing of logic/view code, code
duplication, difficult to reuse, etc.</p>

<p>The other, cleaner solution, is to write a Handlebars helper, which I
have already done so you don&#8217;t have to!</p>

<p><img src="https://github.com/olalonde/handlebars-paginate/raw/master/screenshot.png" alt="screenshot" /></p>

<p>The helper is available for download or forking on Github:</p>

<p><a href="https://github.com/olalonde/handlebars-paginate">https://github.com/olalonde/handlebars-paginate</a></p>

<p>or through NPM:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>npm install handlebars-paginate
</span></code></pre></td></tr></table></div></figure>


<p>To use it, all you have to do is register it as an helper:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Handlebars</span><span class="p">.</span><span class="nx">registerHelper</span><span class="p">(</span><span class="s1">&#39;paginate&#39;</span><span class="p">,</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;handlebars-paginate&#39;</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all you need to pass to your template is an object containing a
<code>page</code> parameter which is the number of the current page and a
<code>pageCount</code> parameter which is the total number of pages.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">pagination</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">page</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">pageCount</span><span class="o">:</span> <span class="mi">10</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>Handlebars-paginate let&#8217;s you define three types of blocks in your
template:</p>

<p><strong>middle</strong>:</p>

<p>This will iterate over all the possible pages. An optional <code>limit</code>
parameter is available if you&#8217;d like to limit how many page links to
display. <code>limit=7</code> will only display 3 links to the left of the active
page and 3 pages to its right.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{{#paginate pagination type=&quot;middle&quot; limit=&quot;7&quot;}}
</span><span class='line'>  <span class="nt">&lt;li</span> <span class="err">{{#</span><span class="na">if</span> <span class="na">active</span><span class="err">}}</span><span class="na">class=</span><span class="s">&quot;active&quot;</span><span class="err">{{/</span><span class="na">if</span><span class="err">}}</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;?p={{n}}&quot;</span><span class="nt">&gt;</span>{{n}}<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>{{/paginate}}
</span></code></pre></td></tr></table></div></figure>


<p><strong>previous</strong> and <strong>next</strong>:</p>

<p>Finally, previous and next are used to define how you want to display the
&#8220;previous&#8221; and &#8220;next&#8221; buttons.</p>

<p>For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{{#paginate pagination type=&quot;previous&quot;}}
</span><span class='line'>  <span class="nt">&lt;li</span> <span class="err">{{#</span><span class="na">if</span> <span class="na">disabled</span><span class="err">}}</span><span class="na">class=</span><span class="s">&quot;disabled&quot;</span><span class="err">{{/</span><span class="na">if</span><span class="err">}}</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;?p={{n}}&quot;</span> <span class="nt">&gt;</span>Prev<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>{{/paginate}}
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{{#paginate pagination type=&quot;next&quot;}}
</span><span class='line'>  <span class="nt">&lt;li</span> <span class="err">{{#</span><span class="na">if</span> <span class="na">disabled</span><span class="err">}}</span><span class="na">class=</span><span class="s">&quot;disabled&quot;</span><span class="err">{{/</span><span class="na">if</span><span class="err">}}</span><span class="nt">&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;?p={{n}}&quot;</span><span class="nt">&gt;</span>Next<span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
</span><span class='line'>{{/paginate}}
</span></code></pre></td></tr></table></div></figure>


<p>Enjoy and feel free to fork or <a href="https://github.com/olalonde/handlebars-paginate/issues">report issues</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to follow HTTP redirects in Node.js]]></title>
    <link href="http://syskall.com/how-to-follow-http-redirects-in-node-dot-js/"/>
    <updated>2012-11-16T06:16:00+08:00</updated>
    <id>http://syskall.com/how-to-follow-http-redirects-in-node-dot-js</id>
    <content type="html"><![CDATA[<p>One of the biggest annoyance with Node.js&#8217; native HTTP and HTTPS
clients is that there is no way to automatically follow HTTP redirects.
Let&#8217;s say you want to fetch the content of a page that has moved (301
redirect), you will have to write a lot of <em>boilerplate code</em> to handle
the redirect(s) by yourself.</p>

<p>Since following redirects is fairly common, I decided to write a
a drop-in replacement for the native HTTP and HTTPS module that would handle redirection seamlessly.</p>

<p>This module has exactly the same interface has the native HTTP and HTTPS
module but it will handle redirects automatically. In other words, if
you want to automatically start following redirects, all you have to do
is replace</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>by</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;follow-redirects&#39;</span><span class="p">).</span><span class="nx">http</span>
</span></code></pre></td></tr></table></div></figure>


<p>Before that, you will of course need to install the module through NPM:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>npm install follow-redirects
</span></code></pre></td></tr></table></div></figure>


<p>Here are some usage examples:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;follow-redirects&#39;</span><span class="p">).</span><span class="nx">http</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">https</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;follow-redirects&#39;</span><span class="p">).</span><span class="nx">https</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/* </span>
</span><span class='line'><span class="cm"> * http and https are just like Node.js&#39; http and https modules except </span>
</span><span class='line'><span class="cm"> * that they follow redirects seamlessly. </span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="nx">http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;http://bit.ly/900913&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;data&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">chunk</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">chunk</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;error&#39;</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="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">error</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="cm">/*</span>
</span><span class='line'><span class="cm"> * You can optionnally pass the maxRedirect option which defaults to 5</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="nx">https</span><span class="p">.</span><span class="nx">request</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">host</span><span class="o">:</span> <span class="s1">&#39;bitly.com&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">path</span><span class="o">:</span> <span class="s1">&#39;/UHfDGO&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">maxRedirects</span><span class="o">:</span> <span class="mi">3</span>
</span><span class='line'><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;data&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">chunk</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">chunk</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;error&#39;</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="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>More info is available at the Github repository: <a href="https://github.com/olalonde/follow-redirects/">https://github.com/olalonde/follow-redirects/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Tips and tricks when learning a new technology]]></title>
    <link href="http://syskall.com/tips-for-learning-new-technologies/"/>
    <updated>2012-10-27T18:33:00+08:00</updated>
    <id>http://syskall.com/tips-for-learning-new-technologies</id>
    <content type="html"><![CDATA[<p>In this post, I&#8217;ll share some tricks I use before diving into a new technology. Technology could mean anything from programming language to an operating system (note that some steps are specifically for programming languages/frameworks).</p>

<p>For the sake of demonstration, I&#8217;ll pretend that I want to learn the Haskell programming language.</p>

<h2>Wikipedia</h2>

<p><img src="http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png" alt="wikipedia logo" /></p>

<p>Get a high level perspective of the technology by reading its Wikipedia page.</p>

<p><a href="http://en.wikipedia.org/wiki/Haskell_(programming_language">http://en.wikipedia.org/wiki/Haskell_(programming_language)</a>)</p>

<h2>Hacker News</h2>

<p><img src="http://i.minus.com/iMq59X5KMX2km.png" alt="Hacker news search screenshot" /></p>

<p>Get hands on feedback from people who have previous or current experience with the technology through comments. Find interesting articles about the technology (by popularity or date) through stories.</p>

<p>Stories:
<a href="http://www.hnsearch.com/search#request/submissions&amp;q=haskell&amp;sortby=points+desc&amp;start=0">http://www.hnsearch.com/search#request/submissions&amp;q=haskell&amp;sortby=points+desc&amp;start=0</a></p>

<p>Comments:
<a href="http://www.hnsearch.com/search#request/comments&amp;q=haskell&amp;sortby=points+desc&amp;start=0">http://www.hnsearch.com/search#request/comments&amp;q=haskell&amp;sortby=points+desc&amp;start=0</a></p>

<h2>StackOverflow / StackExchange</h2>

<p><img src="http://i.minus.com/irSOFFbrvmnyE.png" alt="stackoverflow logo" /></p>

<p>Find out the highest voted questions relating to the
technology. It is very likely that you&#8217;ll have those questions
as well when learning the technology so why not find out the answers right now. There will also usually be a question about the best resources to learn from. This can be a good starting point for your own learning process.</p>

<p><a href="http://stackoverflow.com/search?tab=votes&amp;q=title%3ahaskell">http://stackoverflow.com/search?tab=votes&amp;q=title%3ahaskell</a></p>

<p><a href="http://stackoverflow.com/questions/tagged/haskell?sort=votes&amp;pagesize=15">http://stackoverflow.com/questions/tagged/haskell?sort=votes&amp;pagesize=15</a></p>

<h2>GitHub</h2>

<p><img src="http://i.minus.com/ibtrg1FgG2LGmB.jpg" alt="github logo" /></p>

<p>Find out the most popular open source projects that relate to the technology. This is especially helpful when you start a project with this new technology and aren&#8217;t sure which are the latest and greatest libraries to use. It&#8217;s also a good idea to study the codebase of open source projects to get familiar with common idioms and coding styles.</p>

<p><a href="https://github.com/search?langOverride=&amp;language=Haskell&amp;q=language%3Ahaskell&amp;repo=&amp;start_value=1&amp;type=Repositories">https://github.com/search?langOverride=&amp;language=Haskell&amp;q=language%3Ahaskell&amp;repo=&amp;start_value=1&amp;type=Repositories</a></p>

<h2>IRC</h2>

<p><img src="http://i.minus.com/ibaU7T6UBkmY3g.png" alt="irc screenshot" /></p>

<p>Find out if the technology has an IRC channel. You can usually
find that out by simply connecting to Freenode and joining
<code>#technology-name</code> or Googling <code>irc technology-name</code>.</p>

<p><a href="https://www.google.com/?q=haskell%20irc">https://www.google.com/?q=haskell%20irc</a></p>

<h1>Conclusion</h1>

<p>Don&#8217;t forget many people have gone through what you are about to go through. Don&#8217;t repeat the same mistakes they did and leverage every piece of information you can from them!</p>

<p>I&#8217;d love to hear more tips and tricks in the comments below.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using the debugger statement with node-inspector]]></title>
    <link href="http://syskall.com/using-the-debugger-statement-with-node-inspector/"/>
    <updated>2012-10-25T15:41:00+08:00</updated>
    <id>http://syskall.com/using-the-debugger-statement-with-node-inspector</id>
    <content type="html"><![CDATA[<p>The first thing client-side Javascript developers miss when
starting out with Node.js is the ability to debug their code through
a GUI debugger as they are acustomed to when developing for the browser.</p>

<p>Fortunately, it wasn&#8217;t long before the Node.js community came up with
GUI debuggers and as of today, the most widespread one is <a href="https://github.com/dannycoates/node-inspector">node-inspector</a>.</p>

<p>In this post, I won&#8217;t go into the details of using node-inspector but I
will instead introduce a neat feature that many Node.js developers aren&#8217;t aware of
or don&#8217;t know how to use.</p>

<p>This feature is called the <code>debugger</code> statement. If you have ever caught
yourself firing up node-inspector and browsing through the huge file
pane on the left in order to find a file and insert a breakpoint, then
this post should save you a lot of trouble in the future.</p>

<p>Here&#8217;s what the <a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf">ECMA-262 specification</a>
has to say about the <code>debugger</code> statement:</p>

<blockquote><p>Syntax</p>

<p> DebuggerStatement :</p>

<p>   <code>debugger ;</code></p>

<p>Evaluating the DebuggerStatement  production may allow an implementation to cause a  breakpoint when run
under a debugger. If a debugger is not present or active this statement has no observable effect.</p></blockquote>

<p>In other words, you can insert breakpoints directly in your code using
<code>debugger;</code>, fire up your app in debug mode, open your debugging client
and the breakpoint will be set. Don&#8217;t forget to remove <code>debugger;</code> from
your code once you are done debugging!</p>

<p>Here&#8217;s a quick demonstration.</p>

<ol>
<li><p>Insert debugger; statement in your code</p>

<p> <img src="http://i.minus.com/ibd1ju4lGR4i1u.png" alt="screen shot" /></p></li>
<li><p>Fire up node-inspector</p>

<p> <code>bash
 node-inspector;
</code></p></li>
<li><p>Launch your app in debugging mode (don&#8217;t forget to use the
<code>--debug-brk</code> flag if your debugger statement is &#8220;early&#8221; in your code)</p>

<p> <code>bash
 node --debug server.js
</code></p></li>
<li><p>Open the debugging client</p>

<p> <img src="http://i.minus.com/ibqWEpgANEWaeM.png" alt="screenshot" /></p></li>
</ol>


<p>No more hunting for files!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Don't run Node.js as root!]]></title>
    <link href="http://syskall.com/dont-run-node-dot-js-as-root/"/>
    <updated>2012-10-24T01:56:00+08:00</updated>
    <id>http://syskall.com/dont-run-node-dot-js-as-root</id>
    <content type="html"><![CDATA[<p>The <a href="http://en.wikipedia.org/wiki/Root_user">root user</a> on Linux and Unix operating systems is a special user that has absolutely total power over a machine. It is therefore very important to use the root account only when absolutely necessary and preferrably through the use of a program such as <a href="http://en.wikipedia.org/wiki/Sudo">sudo</a>. From Wikipedia:</p>

<blockquote><p>In operating systems which have the concept of a superuser, it is generally recommended that most application work be done using an ordinary account which does not have the ability to make system-wide changes.</p></blockquote>

<p>Indeed, if you are running your server as root and it gets hacked
through a vulnerability in your code, the attacker will have total control
over your machine. This means the attacker could potentially wipe out
your whole disk or worse. On the other hand, if your server runs with
the permissions of a regular user, the attacker will be limited
by those permissions.</p>

<p>The problem most Node.js developers will face is that in order to open
ports below 1024 (i.e. port 80), one has to possess superuser
permissions.  There are a few solutions around that problem, one being the use of <code>iptables</code> to redirect port 80 to a higher port such as port 3000 and another one being the use of a proxy such as <code>nginx</code> that will redirect requests to your server. However, today I will focus on a solution that can be done entirely within your code.</p>

<p>We still start our server with root permissions using sudo but once we
have opened our port(s), we will revert back our server&#8217;s permission to that of
a regular user using a special trick. That trick is to read the SUDO_UID
environment variable which sudo passes to any process it launches and
using Node&#8217;s global <code>process.setuid()</code> function.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http&#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="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="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">http</span><span class="p">.</span><span class="nx">createServer</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">listen</span><span class="p">(</span><span class="mi">80</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="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="k">return</span> <span class="nx">cb</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">// Find out which user used sudo through the environment variable</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">uid</span> <span class="o">=</span> <span class="nb">parseInt</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">SUDO_UID</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// Set our server&#39;s uid to that user</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">uid</span><span class="p">)</span> <span class="nx">process</span><span class="p">.</span><span class="nx">setuid</span><span class="p">(</span><span class="nx">uid</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;Server\&#39;s UID is now &#39;</span> <span class="o">+</span> <span class="nx">process</span><span class="p">.</span><span class="nx">getuid</span><span class="p">());</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>No excuses for running your server as root anymore!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A better require() for Node.js]]></title>
    <link href="http://syskall.com/a-better-require-for-node-dot-js/"/>
    <updated>2012-10-22T17:20:00+08:00</updated>
    <id>http://syskall.com/a-better-require-for-node-dot-js</id>
    <content type="html"><![CDATA[<p><strong>UPDATE:</strong> <a href="https://github.com/olalonde/better-require">better-require</a>
now supports <code>json</code>, <code>yaml</code>, <code>csv</code>, <code>xml</code>, <code>ini</code> as well as
<code>coffeescript</code>, <code>clojurescript</code>, <code>typescript</code>, <code>dart</code> and <code>six</code>.</p>

<p>While reading the Node.js API documentation today, I stumbled upon an <a href="http://nodejs.org/api/all.html#all_require_extensions">interesting feature</a>. This feature let&#8217;s you add handlers for arbitrary file extensions that <code>require()</code>  will call when requiring a file of that extension. Internally, it looks for the extension in <code>require.extensions</code> and if the extension is found, the handler is called instead of the default require routine.</p>

<p>I thought that was pretty cool so I couldn&#8217;t resist the urge of wrapping a bunch of file parsers into a standalone NPM module that would make it easy to support for multiple file formats through <code>require()</code>.</p>

<p>This gave birth to <a href="https://github.com/olalonde/better-require">better-require</a>.</p>

<pre><code>npm install better-require
</code></pre>

<p>If allows developers to seamlessly require <code>json</code>, <code>yaml</code>, <code>csv</code>, <code>xml</code> and <code>ini</code> files without having to deal with <code>require.extensions</code> or finding the appropriate parsing libraries. It is also easily extensible so feel free to fork and add additional file formats!</p>

<p>Here&#8217;s a usage example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;better-require&#39;</span><span class="p">)(</span><span class="s1">&#39;json yaml xml&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// we can now require .xml, .yaml and .xml files!</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">yaml</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config.yaml&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">,</span> <span class="nx">json</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config.json&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">,</span> <span class="nx">xml</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config.xml&#39;</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">yaml</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">json</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">xml</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Enjoy!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Migrated blog to Jekyll]]></title>
    <link href="http://syskall.com/migrated-blog-to-jekyll/"/>
    <updated>2012-10-21T01:21:00+08:00</updated>
    <id>http://syskall.com/migrated-blog-to-jekyll</id>
    <content type="html"><![CDATA[<p>I just finished migrating my blog from
<a href="http://posterous.com">Posterous</a> to <a href="http://jekyllrb.com">Jekyll</a>.
Posterous was acquired by Twitter a few months ago and is now in
maintenance mode. I&#8217;m now hosting this blog for free on
<a href="http://github.com/olalonde/olalonde.github.com">Github</a> and
use Octopress/Jekyll to generate the files. So far, it is really a joy to write all
my posts in Markdown. I&#8217;m basically blogging from Vim right now (and using the <a href="https://github.com/matthias-guenther/hammer.vim">Hammer plugin</a> to preview my posts). I wish I had done this move earlier.</p>

<pre><code>&lt;3 Jekyll + Octopress + Github + Markdown + Vim + Hammer.vim
</code></pre>

<p>Please let me know if you find any broken links or images not loading:
<a href="mailto:olalonde@gmail.com?subject=Blog%20bug">olalonde@gmail.com</a>.</p>

<p>Thanks!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[17 crazy and not so crazy startup and project ideas]]></title>
    <link href="http://syskall.com/some-crazy-and-not-so-crazy-startup-and-proje/index.html"/>
    <updated>2012-10-17T00:00:00+08:00</updated>
    <id>http://syskall.com/some-crazy-and-not-so-crazy-startup-and-proje/some-crazy-and-not-so-crazy-startup-and-proje</id>
    <content type="html"><![CDATA[<p>So today I am cleaning up my phone&rsquo;s Memo app so this post will be
dedicated to dumping all those late night ideas I had when I was very
tired or had a few too many beers. Note that I had most of those ideas
independently but some of them were (partially) implemented later on
or I simply hadn&rsquo;t heard of them.</p>




<h2>1. Beetcoin</h2>




<p>Mobile app that acts as a nice UI on top of various Bitcoin exchanges.
It should be possible to view pending trades, get current bid/ask
prices and place new trades.</p>




<p><strong>The twist:</strong> Sell it as a paid app and give away &ldquo;free&rdquo; Bitcoins. The
app should be expensive enough that when you give away Bitcoins you
still make a profit.</p>




<p><strong>Why it will work:</strong> This would enable regular people to buy Bitcoins
with their credit card by buying the app on the Android market.</p>




<p><strong>Why it won&rsquo;t work:</strong> It is possibly against most markets / credit card
processors TOS.</p>




<h2>2. Code reading web app</h2>




<p>Reading other people&rsquo;s code is one of the surest way to improve your
programming skills. For each programming language, this app would list
open source projects by difficulty level (from beginner to expert) and
make it easy to browse and comment the code from within the website.
The MVP could simply list links to Github repos. Inspiration comes
from <a href="http://todomvc.com">http://todomvc.com</a>.</p>




<p>Use case: I just started to learn Javascript and I want to see some
real world Javascript code. I go to the site, select the Javascript
language and I can see a list of projects rated from Beginner level to
Expert level. Each projects that are at the same difficulty level are
grouped together. The beginner level should list simple &ldquo;Hello world&rdquo;
apps while the expert level should be reserved for complex projects.</p>




<h2>3. Prediction market, Hacker News style</h2>




<p>Not sure what I meant when writing this. I think the idea is that it
would be a news aggregator like Hacker News but when you vote up it
costs you real money (you are investing in a vote). If the vote count
goes up, you are rewarded for predicting correctly that the article
was interesting to the community. The reward should be proportional to
how many people up voted after you. I guess someone still needs to
work out the &ldquo;details&rdquo;. The whole idea is to mix karma with money to
self-moderate a community (most people care more about money than
karma).</p>




<h2>4. OAuth for payments</h2>




<p>I&rsquo;m not sure why I haven&rsquo;t seen this yet in the wild. Probably due to
legal compliance and security issues. But well, I think it would be
cool if I could just buy stuff by clicking &ldquo;Pay 10$&rdquo; and whenever I
click that button, I get the standard OAuth dialog asking me to
authorize the payment. There should be a maximum amount by transaction
which should be fairly low if security is an issue (50$?).</p>




<h2>5. URL#hash renderer API</h2>




<p>I first had this idea when developing a website with Backbone.js. All
my URLs looked like <a href="http://domain/#a/b/c">http://domain/#a/b/c</a> and I thought it would be
nice if my server could proxy all requests to <a href="http://domain/a/b/c">http://domain/a/b/c</a>
through an API that returns the rendered HTML of <a href="http://domain/#a/b/c">http://domain/#a/b/c</a>.</p>




<p>Some websites are not crawlable or unusable if users don&rsquo;t have
Javascript enabled. This service takes an url of the form
<a href="http://domain/#hash">http://domain/#hash</a> and returns the rendered HTML that a user would
see if they had Javascript enabled. Web developers could use this
service to easily offer a crawlable website that is friendly to
visitors that have Javascript disabled.</p>




<h2>6. Startups for front-end developers</h2>




<p>Build a service that makes it possible to develop a full website
completely on the client side (probably using Backbone.js or similar),
interfacing with a list of predefined APIs. This startups&#8217; job would
be to take care of providing a list of easily accessible APIs and make
it easy for designers to publish UIs that interact with the APIs. The
startup should also take care of common issues like cross-origin
request sharing, caching, etc. Eventually, there would be a market
where developers can publish APIs. This idea is rooted in the idea of
division of labor. Backend developers should focus on what they do
best and so should frontend developers. Wouldn&rsquo;t it be nice if all
startups out there were simply a REST API with dozens of UIs you can
chose from. What if Paypal was simply an API and anyone could build a
nice UI on top of that API.</p>




<h2>7. Hacker News directory</h2>




<p>List all Hacker News related services, websites, Chrome extensions,
publications, apps, etc. There is currently no such official website.</p>




<h2>8. &ldquo;Hello dear [social network] user. I would really appreciate if you [tweeted/liked/up voted] this.&rdquo;</h2>




<p>This idea was inspired by seeing a few &ldquo;I see you are coming from HN.
Please up vote and comment.&rdquo; when clicking submissions on HN.</p>




<p>This should be a small embeddable script or iframe which should
display a small message asking to share the current page on a given
social network. The social network is chosen using the visitor&rsquo;s HTTP
referer header or their browser&rsquo;s history. The script should first
check if their referrer matches a social network and if not, use the
browser history hack to see if the user has recently visited a known
social network. This would be a good alternative for people who want
to have multiple sharing buttons but don&rsquo;t want to clutter the screen
real estate with too many choices.</p>




<h2>9. Offline Hacker News mobile app</h2>




<p>Whenever I have to go on a long subway ride with no 3G or Wifi, I
really wish I could just click a button that would load all HN&rsquo;s front
page submissions + comments and load them in my browser&rsquo;s tab before I
leave. Hence, the offline HN app idea.</p>




<h2>10. Github orphan</h2>




<p><strong>Update:</strong> this appears to have been somewhat solved since I had this
idea. See <a href="http://stillmaintained.com">http://stillmaintained.com</a></p>




<p>There should be an easy way to orphan and adopt new projects in Github.</p>




<h3>Use case: You want to orphan a project</h3>




<p>Connect with Github. Select project to orphan.</p>




<p>This automatically writes this at the top of your README file:</p>




<div class="CodeRay">
  <div class="code"><pre># ADOPT ME! #
I am no longer able to maintain this project. Click here to adopt it!</pre></div>
</div>




<h3>Use case: You want to adopt a project</h3>




<ol>
<li>Visit a Github project. See that it is open for adoption.</li>
<li>Click the adopt link in the README file.</li>
<li>Authenticate with Github</li>
<li>Wait for adoption authorization by current maintainer</li>
</ol>




<h3>Use case: Approve adopter</h3>




<ol>
<li>You see that someone applied to become a new maintainer for your project.</li>
<li>Click Approve.</li>
<li><p>Erase everything in your repository except a single README file:</p>

<p>   # THIS PROJECT IS NOW MAITAINED BY &lsquo;new maintainer&rsquo; AT
   github.com/new-maintainer/blabla #</p></li>
</ol>




<h2>11. Public transportation visualization and simulation</h2>




<p>Update: There is something in that vein available for London:
<a href="http://busmapper.co.uk/">http://busmapper.co.uk/</a>. Hey guys, if you are reading this, I&rsquo;m
available for hire :)</p>




<p>Wouldn&rsquo;t it be cool if you could see buses and subways on a map
traveling &ldquo;real time&rdquo; and seeing where they are going at a glance.
Let&rsquo;s say your on some street and want to go in some direction (let&rsquo;s
say downtown), you could just open that mobile app, see which buses
are coming your way and where they are going to. The simulation could
be computed by using bus schedule and averaging the speed between two
stops. I prototyped this a few years ago at
<a href="http://dev.syskall.com/map">http://dev.syskall.com/map</a>.</p>




<h2>12. Quadcopter delivery</h2>




<p><strong>Update:</strong> <a href="http://tacocopter.com/">Taco Copter</a></p>




<p>In areas of high density and high rise buildings, wouldn&rsquo;t it be nice
if you could order something from 7/11 and have a quadcopter (semi-)
autonomously deliver your stuff through the window/balcony?</p>




<h2>13. Pixel copter advertising</h2>




<p><strong>Update:</strong> <a href="http://senseable.mit.edu/flyfire/">MIT flyfire</a></p>




<p>Wouldn&rsquo;t it be nice to have a fleet of programmable mini pixel copters
(small helicopters that carry a colored light) draw images / video in
the sky. This could be used for promotion and advertising.</p>




<h2>14. Online food delivery</h2>




<p>This problem has been tackled many times and there are a few companies
doing it right now but it still hasn&rsquo;t gain lots of momentum. Anyways,
the idea is that you could just open up a mobile app / web app and
through geolocation, get a list of restaurants that can deliver to
your location. You can filter out the restaurants by cost, food type,
etc. You can then navigate to the menu and place your order.</p>




<p><strong>The twist:</strong> There are a lot of &ldquo;Amazon&rdquo; and &ldquo;Ebays&rdquo; in that space but I
haven&rsquo;t seen any &ldquo;Shopifys&rdquo; so far. Meaning that most of the startups
in that space, have a central website where they list restaurants.
Probably some restaurants would be interested in a white label
solution where they could host on their own domain and customize
everything to their needs.</p>




<h2>15. Instant UML diagram for a given Github repository</h2>




<p>I&rsquo;ve always wanted something like this. Select a given Github
repository and instantly get an UML class diagram, whatever the
language is. UML is not really a good fit for more dynamical languages
but nowadays there are statical analysis tools even for Javascript and
company.</p>




<h2>16. Ad-hoc sport teams</h2>




<p>You want to play a game of soccer? Open up this web app, change you
status to &ldquo;I want to play soccer in the next X hours&rdquo;. When there is
enough people who want to play at the same time as you within a given
geographical zone, we all notify you, you chose a location/time and
the game begins!</p>




<h2>17. Hotel Wifi web app</h2>




<p>You connect to your hotel&rsquo;s wifi and on first browser request, you get
redirected to this web app. The web app, displays events in the area,
there is a chatroom for other lonely and bored travelers, you can
order stuff from the hotel directly from the web app, there hotel
guest specific promotions from local businesses, etc. Maybe you will
find someone with similar tastes in the chatroom and you can hang out
together in this unknown city?</p>




<h2>Conclusion</h2>




<p>I think that&rsquo;s about it for now. I will update the post if I bump into
more crazy ideas while cleaning up my phone. Let me know what you
think in the comments and I&rsquo;d love to know if you&rsquo;re solving one of
these problems or planning to!</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Trouble installing ImageMagick on OS X 10.7.2]]></title>
    <link href="http://syskall.com/trouble-installing-imagemagick-on-os-x-1072/index.html"/>
    <updated>2012-10-08T00:00:00+08:00</updated>
    <id>http://syskall.com/trouble-installing-imagemagick-on-os-x-1072/trouble-installing-imagemagick-on-os-x-1072</id>
    <content type="html"><![CDATA[<p>I wanted to use the node-imagemagick library but was getting weird error messages coming from the `identify` binary although I had installed ImageMagick through brew (brew install imagemagick).</p>


<script src="https://gist.github.com/3852226.js?file=bug"></script>


<p>I fixed it by grabbing the latest libfreetype from another brew package and linking it to the old library:</p>


<script src="https://gist.github.com/3852226.js?file=fix"></script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[YC W12 startups' hosting decisions]]></title>
    <link href="http://syskall.com/yc-w12-startups-hosting-decisions/index.html"/>
    <updated>2012-08-23T00:00:00+08:00</updated>
    <id>http://syskall.com/yc-w12-startups-hosting-decisions/yc-w12-startups-hosting-decisions</id>
    <content type="html"><![CDATA[<div>Back in 2011,&nbsp;<a href="https://github.com/jpf">Jo&euml;l Franusic</a> published a <a href="http://jpf.github.com/domain-profiler/ycombinator.html">neat visualization</a> of all <a href="http://www.ycombinator.com">Y Combinator</a> startups&#8217; hosting decisions using his neat open source <a href="https://github.com/jpf/domain-profiler">domain-profiler</a> software. I was curious to know what had changed since then, so instead of profiling all YC startups this time, I only profiled the Winter 2012 batch as retrieved from this <a href="https:docs.google.comspreadsheetccc?key=0AkkhSN3vaY4jdF90b1l1Vnl5NmZjaTBNQWlJYVozMEE#gid=0 ">unofficial YC startups spreadsheet</a>.</div>


<p />
<div>So below are the hosting decisions for Y Combinator&#8217;s Winter 2012 startups:</div>
<p />
<div><img src="http://chart.apis.google.com/chart?chco=CFF09E,A8DBA8,79BD9A,3B8686,0B486B&amp;chd=s:CCCCCFHHHP9&amp;chl=SoftLayer|DreamHost|CloudFlare|1+and+1|Rackspace|DNS+issue|Linode|Go+Daddy|Media+Temple|Other+%2F+Self+Hosted|Amazon&amp;chtt=Web+Host&amp;cht=p&amp;chs=400x200&amp;chxr=0,1,24" alt="" /> <img src="http://chart.apis.google.com/chart?chco=CFF09E,A8DBA8,79BD9A,3B8686,0B486B&amp;chd=s:BBBBBD9&amp;chl=1+and+1|None|Self+Hosted|Mailgun|Other+%2F+Self+Hosted|Go+Daddy|Google&amp;chtt=Email+Host&amp;cht=p&amp;chs=400x200&amp;chxr=0,1,35" alt="" /> <img src="http://chart.apis.google.com/chart?chco=CFF09E,A8DBA8,79BD9A,3B8686,0B486B&amp;chd=s:FFFFFLLLQQQ49&amp;chl=Self+Hosted|DreamHost|Rackspace|WebFaction|eNom|Name.com|1+and+1|Media+Temple|Linode|CloudFlare|Other+%2F+Self+Hosted|Go+Daddy|Amazon&amp;chtt=DNS+Host&amp;cht=p&amp;chs=400x200&amp;chxr=0,1,11" alt="" /> <img src="http://chart.apis.google.com/chart?chco=CFF09E,A8DBA8,79BD9A,3B8686,0B486B&amp;chd=s:CCFFRX9&amp;chl=Tucows|1+and+1|Gandi+SAS|Name.com|Other+%2F+Self+Hosted|eNom|Go+Daddy&amp;chtt=Registrar&amp;cht=p&amp;chs=400x200&amp;chxr=0,1,21" alt="" /> <img src="http://chart.apis.google.com/chart?chco=CFF09E,A8DBA8,79BD9A,3B8686,0B486B&amp;chd=s:Hmu2229&amp;chl=VeriSign|Go+Daddy|Other+%2F+Self+Hosted|GeoTrust|Comodo+Group|None|DigiCert&amp;chtt=SSL+Issuer&amp;cht=p&amp;chs=400x200&amp;chxr=0,1,8" alt="" /> <img src="http://chart.apis.google.com/chart?chco=CFF09E,A8DBA8,79BD9A,3B8686,0B486B&amp;chd=s:Um9&amp;chl=None|normal|star&amp;chtt=Certificate+Type&amp;cht=p&amp;chs=400x200&amp;chxr=0,7,21" alt="" /></div>
<p><a href="https://docs.google.com/spreadsheet/ccc?key=0Ara_YbXDNXjrdEFnM3h3RlZZZFdfQmFCdFZEWFVpQmc">Raw data</a>:</p>
<p><iframe src="https://docs.google.com/spreadsheet/pub?key=0Ara_YbXDNXjrdEFnM3h3RlZZZFdfQmFCdFZEWFVpQmc&amp;single=true&amp;gid=0&amp;output=html&amp;widget=true" frameborder="0" height="300" width="500"></iframe></p>
<p>Credits to <a href="https://github.com/jpf">jpf</a> for the awesome <a href="https://github.com/jpf/domain-profiler">domain profiling software</a>.</p>
<p><a href="http://news.ycombinator.com/item?id=4429438">Discussion on Hacker News.</a></p>
<p>You should follow me on Twitter <a href="http://www.youtube.com/watch?v=dQw4w9WgXcQ">here</a>.</p>
<p><strong>UPDATE</strong>: Amazon hosting may include Heroku or other services using Amazon as infrastructure. According to the certificate type column in the raw data, at least 6 domains are using Heroku.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First "Startup Tuesday" in Shenzhen a success!]]></title>
    <link href="http://syskall.com/first-startup-tuesdays-in-shenzhen-a-success/index.html"/>
    <updated>2011-08-10T00:00:00+08:00</updated>
    <id>http://syskall.com/first-startup-tuesdays-in-shenzhen-a-success/first-startup-tuesdays-in-shenzhen-a-success</id>
    <content type="html"><![CDATA[<p>Only a few weeks ago, there seemed to be absolutely no interest for tech startups in Shenzhen, China (or at least, among the English speaking community). As a startup guy, I was pretty upset by the seemingly&nbsp;nonexistent&nbsp;community. Of course, there was Hong Kong nearby with a <a href="http://www.hksua.com.hk/">vibrant</a> <a href="http://boot.hk">community</a> but I wanted something in Shenzhen.&nbsp;I decided I&#8217;d prove myself wrong by creating a &#8221;<a href="http://www.shenzhenstuff.com/group/startups">Startups and technology SZ</a>&#8221; group on a popular expat social network called <a href="http://ShenzhenStuff.com">ShenzhenStuff.com</a>.&nbsp;</p>


<p>It turned I was wrong about the lack of interest! The group grew to 32 members within only a few days. Within the same time frame, <a href="http://blog.michaelmichelini.com/">Michael Michelini</a>, an American expat, and his associates were officially launching a <a href="http://www.szteam.com">coworking space</a> aimed at web workers and freelancers. Talk about timing! Michael from&nbsp;<a href="http://www.szteam.com">SZTeam</a>&nbsp;offered to host and run a first &#8220;Startup Tuesday&#8221; meeting which turned out to be a huge success.</p>


<p>Michael wrote a nice <a href="http://szteam.com/387">outline of the event</a>&nbsp;and published <a href="http://szteam.com/wp-content/uploads/2011/08/Shenzhen-Team-Startups-Tuesday.pdf">his slides</a>. The ~50 (I suck at guesstimates) attendees came from all kinds of backgrounds (technical, business, finance, curious people, etc.) and the crowd was about half foreigners, half Chinese.&nbsp;</p>


<p />
<div><img src="http://blog.michaelmichelini.com/wp-content/uploads/2011/08/hugely-successful-shenzhen-startup-meeting-tuesday.jpg" alt="" /></div>
<p />
<div>For the upcoming events, many suggestions were made: invite speakers to talk about a specific topic, co-founder &#8220;speed dating&#8221;, startup weekends, pitch nights, etc. I&#8217;m particularly interested in co-founder speed dating as I&#8217;m <a href="mailto:olalonde@gmail.com">looking for a co-founder</a> :)</div>
<p />
<div>This first meeting was a huge success and Michael deserves all the credit. I would also&nbsp;recommend <a href="http://www.szteam.com">SZTeam</a> to freelancers or anyone who is working on a startup. The people are friendly, there is a nice conference room, free coffee and the pricing is pretty cheap: hot desk for 500 RMB/month (80 USD/month) and fixed desk for 1500 RMB/month (235 USD/month).</div>
<p />
<div>
<div>From now on, we will try to gather the community around the <a href="http://groups.google.com/group/shenzhen-startup/subscribe">Shenzhen Startup</a> mailing list and the <a href="http://www.shenzhenstuff.com/group/startups">Startups and technology SZ</a> group. <a href="http://www.szteam.com">SZTeam</a> will continue to host <a href="http://szteam.com/location">Startup Tuesday</a>&nbsp;every Tuesday 7pm.</div>
</div>
<p />
<div>I think we are on the right path to build a vibrant startup community in Shenzhen!</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Adding Google's +1 (plus one) button to your Posterous]]></title>
    <link href="http://syskall.com/adding-googles-1-plus-one-button-to-your-post/index.html"/>
    <updated>2011-06-01T00:00:00+08:00</updated>
    <id>http://syskall.com/adding-googles-1-plus-one-button-to-your-post/adding-googles-1-plus-one-button-to-your-post</id>
    <content type="html"><![CDATA[<p>As well all know, Javascript isn&rsquo;t allowed in Posterous themes. Luckily, iframes are and that&rsquo;s what we&rsquo;ll use to go around the no Javascript limitation.</p>




<p><img src="http://i.imgur.com/DnUlw.png" alt="posterous screenshot" /></p>




<p>Simply go to your Posterous dashboard, click &quot;Settings&quot; on the top right, then click the &quot;Edit Theme&quot; button and select the &quot;Advanced tab&quot;. Now, all you have to do is paste one of the following snippets where you want the button to show up and click the &quot;Save, I&rsquo;m done!&quot; button.</p>




<ul>
<li>Standard button:</li>
</ul>




<p><script src="https://gist.github.com/1003860.js"></script></p>




<ul>
<li>Tall button:</li>
</ul>




<p><script src="https://gist.github.com/1003872.js"></script></p>




<p>That&rsquo;s all you have to do to integrate Google +1 to your Posterous.</p>




<p>If you want to host the script yourself, the <a href="https://github.com/olalonde/google-plusone-posterous">source code</a> is available on Github:</p>




<div class="CodeRay">
  <div class="code"><pre>git clone https://olalonde@github.com/olalonde/google-plusone-posterous.git</pre></div>
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to write your own native Node.js extension]]></title>
    <link href="http://syskall.com/how-to-write-your-own-native-nodejs-extension/index.html"/>
    <updated>2011-05-12T00:00:00+08:00</updated>
    <id>http://syskall.com/how-to-write-your-own-native-nodejs-extension/how-to-write-your-own-native-nodejs-extension</id>
    <content type="html"><![CDATA[<p><strong>UPDATE:</strong> There is now a Node.js addon for loading and calling dynamic libraries using pure JavaScript: <a href="https://github.com/rbranson/node-ffi">node-ffi</a>. Also, <code>node-waf</code> is no longer being used to compile Node.js extensions.</p>

<p><em>TRANSLATIONS</em>: This post was translated to Chinese:
<a href="http://www.oschina.net/translate/how-to-write-your-own-native-nodejs-extension">http://www.oschina.net/translate/how-to-write-your-own-native-nodejs-extension</a></p>

<h2>Introduction</h2>

<p><em>This is a follow up to <a href="http://syskall.com/how-to-roll-out-your-own-javascript-api-with">How to roll out your own Javascript API with V8</a>. You should still be able to follow if you haven&#8217;t read it.</em></p>

<p>We will now port the <a href="https://github.com/olalonde/node-notify">code we have written for V8</a> to <a href="http://nodejs.org/">Node.js</a> and package it for <a href="http://npmjs.org/">npm</a>.</p>

<p><img src="http://i.imgur.com/n7ZIw.png" alt="node-notify screenshot" /></p>

<p>The full source code of this tutorial is available <a href="https://github.com/olalonde/node-notify">from github</a>:</p>

<pre><code>git clone git://github.com/olalonde/jsnotify.git
</code></pre>

<p>You can also install it through <code>npm</code>:</p>

<pre><code>npm install notify
</code></pre>

<p>The code was tested on Ubuntu 10.10 64-bit and Node.js v0.5.0-pre.</p>

<h2>Getting started</h2>

<p>First let’s create a node-notify folder and with the following directory structure.</p>

<pre><code>.
|-- build/                   # This is where our extension is built. 
|-- demo/
|   `-- demo.js              # This is a demo Node.js script to test our extension.
|-- src/
|   `-- node_gtknotify.cpp   # This is the where we do the mapping from C++ to Javascript.
`-- wscript                  # This is our build configuration used by node-waf
</code></pre>

<p><em>This fine looking tree was generated with the <code>tree</code> utility.</em></p>

<p>Now let&#8217;s create our test script <code>demo.js</code> and decide upfront what our extension&#8217;s API should look like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// This loads our extension on the notify variable. </span>
</span><span class='line'><span class="c1">// It will only load a constructor function, notify.notification().</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">notify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../build/default/gtknotify.node&quot;</span><span class="p">);</span> <span class="c1">// path to our extension</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">notification</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">notify</span><span class="p">.</span><span class="nx">notification</span><span class="p">();</span>
</span><span class='line'><span class="nx">notification</span><span class="p">.</span><span class="nx">title</span> <span class="o">=</span> <span class="s2">&quot;Notification title&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">notification</span><span class="p">.</span><span class="nx">icon</span> <span class="o">=</span> <span class="s2">&quot;emblem-default&quot;</span><span class="p">;</span> <span class="c1">// see /usr/share/icons/gnome/16x16</span>
</span><span class='line'><span class="nx">notification</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s2">&quot;Notification message&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Writing our Node.js extension</h2>

<h3>The Init method</h3>

<p>In order to create a Node.js extension, we need to write a C++ class that extends <a href="https://github.com/joyent/node/blob/master/src/node_object_wrap.h">node::ObjectWrap</a>. ObjectWrap implements some utility methods that lets us easily interface with Javascript.</p>

<p>Let&#8217;s write the skeletton for our class:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;v8.h&gt; </span><span class="c1">// v8 is the Javascript engine used by Node</span>
</span><span class='line'><span class="cp">#include &lt;node.h&gt;</span>
</span><span class='line'><span class="c1">// We will need the following libraries for our GTK+ notification </span>
</span><span class='line'><span class="cp">#include &lt;string&gt;</span>
</span><span class='line'><span class="cp">#include &lt;gtkmm.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libnotifymm.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">using</span> <span class="k">namespace</span> <span class="n">v8</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Gtknotify</span> <span class="o">:</span> <span class="n">node</span><span class="o">::</span><span class="n">ObjectWrap</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">private</span><span class="o">:</span>
</span><span class='line'>  <span class="k">public</span><span class="o">:</span>
</span><span class='line'>    <span class="n">Gtknotify</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>    <span class="o">~</span><span class="n">Gtknotify</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'>    <span class="k">static</span> <span class="kt">void</span> <span class="n">Init</span><span class="p">(</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">Object</span><span class="o">&gt;</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// This is what Node will call when we load the extension through require(), see boilerplate code below.</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="cm">/*</span>
</span><span class='line'><span class="cm"> * WARNING: Boilerplate code ahead.</span>
</span><span class='line'><span class="cm"> * </span>
</span><span class='line'><span class="cm"> * See https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/ &amp; http://www.freebsd.org/cgi/man.cgi?query=dlsym</span>
</span><span class='line'><span class="cm"> *  </span>
</span><span class='line'><span class="cm"> * Thats it for actual interfacing with v8, finally we need to let Node.js know how to dynamically load our code. </span>
</span><span class='line'><span class="cm"> * Because a Node.js extension can be loaded at runtime from a shared object, we need a symbol that the dlsym function can find, </span>
</span><span class='line'><span class="cm"> * so we do the following:  </span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="n">v8</span><span class="o">::</span><span class="n">Persistent</span><span class="o">&lt;</span><span class="n">FunctionTemplate</span><span class="o">&gt;</span> <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="p">;</span>
</span><span class='line'><span class="k">extern</span> <span class="s">&quot;C&quot;</span> <span class="p">{</span> <span class="c1">// Cause of name mangling in C++, we use extern C here</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">void</span> <span class="n">init</span><span class="p">(</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">Object</span><span class="o">&gt;</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">Gtknotify</span><span class="o">::</span><span class="n">Init</span><span class="p">(</span><span class="n">target</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="c1">// @see http://github.com/ry/node/blob/v0.2.0/src/node.h#L101</span>
</span><span class='line'>  <span class="n">NODE_MODULE</span><span class="p">(</span><span class="n">gtknotify</span><span class="p">,</span> <span class="n">init</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, we&#8217;ll have to we have to write the following code in our Init() method:</p>

<ol>
<li>Declare our constructor function and bind it to our target variable. <code>var n = require("notification");</code> will bind notification() to n: <code>n.notification()</code>.</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// Wrap our C++ New() method so that it&#39;s accessible from Javascript</span>
</span><span class='line'><span class="c1">// This will be called by the new operator in Javascript, for example: new notification();</span>
</span><span class='line'><span class="n">v8</span><span class="o">::</span><span class="n">Local</span><span class="o">&lt;</span><span class="n">FunctionTemplate</span><span class="o">&gt;</span> <span class="n">local_function_template</span> <span class="o">=</span> <span class="n">v8</span><span class="o">::</span><span class="n">FunctionTemplate</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">New</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Make it persistent and assign it to persistent_function_template which is a static attribute of our class.</span>
</span><span class='line'><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span> <span class="o">=</span> <span class="n">v8</span><span class="o">::</span><span class="n">Persistent</span><span class="o">&lt;</span><span class="n">FunctionTemplate</span><span class="o">&gt;::</span><span class="n">New</span><span class="p">(</span><span class="n">local_function_template</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Each JavaScript object keeps a reference to the C++ object for which it is a wrapper with an internal field.</span>
</span><span class='line'><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">InstanceTemplate</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">SetInternalFieldCount</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="c1">// 1 since a constructor function only references 1 object</span>
</span><span class='line'><span class="c1">// Set a &quot;class&quot; name for objects created with our constructor</span>
</span><span class='line'><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">SetClassName</span><span class="p">(</span><span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">NewSymbol</span><span class="p">(</span><span class="s">&quot;Notification&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Set the &quot;notification&quot; property of our target variable and assign it to our constructor function</span>
</span><span class='line'><span class="n">target</span><span class="o">-&gt;</span><span class="n">Set</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">NewSymbol</span><span class="p">(</span><span class="s">&quot;notification&quot;</span><span class="p">),</span> <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">GetFunction</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure>


<ol>
<li>Declare our attributes: <code>n.title</code> and <code>n.icon</code>.</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// Set property accessors</span>
</span><span class='line'><span class="c1">// SetAccessor arguments: Javascript property name, C++ method that will act as the getter, C++ method that will act as the setter</span>
</span><span class='line'><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">InstanceTemplate</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">SetAccessor</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">),</span> <span class="n">GetTitle</span><span class="p">,</span> <span class="n">SetTitle</span><span class="p">);</span>
</span><span class='line'><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">InstanceTemplate</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">SetAccessor</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;icon&quot;</span><span class="p">),</span> <span class="n">GetIcon</span><span class="p">,</span> <span class="n">SetIcon</span><span class="p">);</span>
</span><span class='line'><span class="c1">// For instance, n.title = &quot;foo&quot; will now call SetTitle(&quot;foo&quot;), n.title will now call GetTitle()</span>
</span></code></pre></td></tr></table></div></figure>


<ol>
<li>Declare our prototype method: <code>n.send()</code></li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// This is a Node macro to help bind C++ methods to Javascript methods (see https://github.com/joyent/node/blob/v0.2.0/src/node.h#L34)</span>
</span><span class='line'><span class="c1">// Arguments: our constructor function, Javascript method name, C++ method name</span>
</span><span class='line'><span class="n">NODE_SET_PROTOTYPE_METHOD</span><span class="p">(</span><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="p">,</span> <span class="s">&quot;send&quot;</span><span class="p">,</span> <span class="n">Send</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our Init() method should now look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// Our constructor</span>
</span><span class='line'><span class="k">static</span> <span class="n">v8</span><span class="o">::</span><span class="n">Persistent</span><span class="o">&lt;</span><span class="n">FunctionTemplate</span><span class="o">&gt;</span> <span class="n">persistent_function_template</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">static</span> <span class="kt">void</span> <span class="n">Init</span><span class="p">(</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">Object</span><span class="o">&gt;</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">HandleScope</span> <span class="n">scope</span><span class="p">;</span> <span class="c1">// used by v8 for garbage collection</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Our constructor</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">Local</span><span class="o">&lt;</span><span class="n">FunctionTemplate</span><span class="o">&gt;</span> <span class="n">local_function_template</span> <span class="o">=</span> <span class="n">v8</span><span class="o">::</span><span class="n">FunctionTemplate</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">New</span><span class="p">);</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span> <span class="o">=</span> <span class="n">v8</span><span class="o">::</span><span class="n">Persistent</span><span class="o">&lt;</span><span class="n">FunctionTemplate</span><span class="o">&gt;::</span><span class="n">New</span><span class="p">(</span><span class="n">local_function_template</span><span class="p">);</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">InstanceTemplate</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">SetInternalFieldCount</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="c1">// 1 since this is a constructor function</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">SetClassName</span><span class="p">(</span><span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">NewSymbol</span><span class="p">(</span><span class="s">&quot;Notification&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Our getters and setters</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">InstanceTemplate</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">SetAccessor</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;title&quot;</span><span class="p">),</span> <span class="n">GetTitle</span><span class="p">,</span> <span class="n">SetTitle</span><span class="p">);</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">InstanceTemplate</span><span class="p">()</span><span class="o">-&gt;</span><span class="n">SetAccessor</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;icon&quot;</span><span class="p">),</span> <span class="n">GetIcon</span><span class="p">,</span> <span class="n">SetIcon</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Our methods</span>
</span><span class='line'>  <span class="n">NODE_SET_PROTOTYPE_METHOD</span><span class="p">(</span><span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="p">,</span> <span class="s">&quot;send&quot;</span><span class="p">,</span> <span class="n">Send</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Binding our constructor function to the target variable</span>
</span><span class='line'>  <span class="n">target</span><span class="o">-&gt;</span><span class="n">Set</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">NewSymbol</span><span class="p">(</span><span class="s">&quot;notification&quot;</span><span class="p">),</span> <span class="n">Gtknotify</span><span class="o">::</span><span class="n">persistent_function_template</span><span class="o">-&gt;</span><span class="n">GetFunction</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All that is left to do is to write the C++ methods that we used in our Init method: <code>New</code>, <code>GetTitle</code>, <code>SetTitle</code>, <code>GetIcon</code>, <code>SetIcon</code>, <code>Send</code></p>

<h3>Our constructor method: New()</h3>

<p>The New() method creates an instance of our class (a Gtknotify object), sets some default values to our properties and returns a Javascript handle to this object. This is the expected behavior when calling a constructor function with the new operator in Javascript.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">title</span><span class="p">;</span>
</span><span class='line'><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">icon</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// new notification()</span>
</span><span class='line'><span class="k">static</span> <span class="n">Handle</span><span class="o">&lt;</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">New</span><span class="p">(</span><span class="k">const</span> <span class="n">Arguments</span><span class="o">&amp;</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">HandleScope</span> <span class="n">scope</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">*</span> <span class="n">gtknotify_instance</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Gtknotify</span><span class="p">();</span>
</span><span class='line'>  <span class="c1">// Set some default values</span>
</span><span class='line'>  <span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">title</span> <span class="o">=</span> <span class="s">&quot;Node.js&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">icon</span> <span class="o">=</span> <span class="s">&quot;terminal&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Wrap our C++ object as a Javascript object</span>
</span><span class='line'>  <span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">Wrap</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">This</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">args</span><span class="p">.</span><span class="n">This</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Our getters and setters: GetTitle(), SetTitle(), GetIcon(), SetIcon()</h3>

<p>The following is pretty much boilerplate code. It boils down to back and forth conversion between C++ values to Javascript (V8) values.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// this.title</span>
</span><span class='line'><span class="k">static</span> <span class="n">v8</span><span class="o">::</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">GetTitle</span><span class="p">(</span><span class="n">v8</span><span class="o">::</span><span class="n">Local</span><span class="o">&lt;</span><span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">property</span><span class="p">,</span> <span class="k">const</span> <span class="n">v8</span><span class="o">::</span><span class="n">AccessorInfo</span><span class="o">&amp;</span> <span class="n">info</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Extract the C++ request object from the JavaScript wrapper.</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">*</span> <span class="n">gtknotify_instance</span> <span class="o">=</span> <span class="n">node</span><span class="o">::</span><span class="n">ObjectWrap</span><span class="o">::</span><span class="n">Unwrap</span><span class="o">&lt;</span><span class="n">Gtknotify</span><span class="o">&gt;</span><span class="p">(</span><span class="n">info</span><span class="p">.</span><span class="n">Holder</span><span class="p">());</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">title</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// this.title=</span>
</span><span class='line'><span class="k">static</span> <span class="kt">void</span> <span class="n">SetTitle</span><span class="p">(</span><span class="n">Local</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">property</span><span class="p">,</span> <span class="n">Local</span><span class="o">&lt;</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">value</span><span class="p">,</span> <span class="k">const</span> <span class="n">AccessorInfo</span><span class="o">&amp;</span> <span class="n">info</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">*</span> <span class="n">gtknotify_instance</span> <span class="o">=</span> <span class="n">node</span><span class="o">::</span><span class="n">ObjectWrap</span><span class="o">::</span><span class="n">Unwrap</span><span class="o">&lt;</span><span class="n">Gtknotify</span><span class="o">&gt;</span><span class="p">(</span><span class="n">info</span><span class="p">.</span><span class="n">Holder</span><span class="p">());</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">Utf8Value</span> <span class="n">v8str</span><span class="p">(</span><span class="n">value</span><span class="p">);</span>
</span><span class='line'>  <span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">title</span> <span class="o">=</span> <span class="o">*</span><span class="n">v8str</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// this.icon</span>
</span><span class='line'><span class="k">static</span> <span class="n">v8</span><span class="o">::</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">GetIcon</span><span class="p">(</span><span class="n">v8</span><span class="o">::</span><span class="n">Local</span><span class="o">&lt;</span><span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">property</span><span class="p">,</span> <span class="k">const</span> <span class="n">v8</span><span class="o">::</span><span class="n">AccessorInfo</span><span class="o">&amp;</span> <span class="n">info</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Extract the C++ request object from the JavaScript wrapper.</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">*</span> <span class="n">gtknotify_instance</span> <span class="o">=</span> <span class="n">node</span><span class="o">::</span><span class="n">ObjectWrap</span><span class="o">::</span><span class="n">Unwrap</span><span class="o">&lt;</span><span class="n">Gtknotify</span><span class="o">&gt;</span><span class="p">(</span><span class="n">info</span><span class="p">.</span><span class="n">Holder</span><span class="p">());</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">icon</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// this.icon=</span>
</span><span class='line'><span class="k">static</span> <span class="kt">void</span> <span class="n">SetIcon</span><span class="p">(</span><span class="n">Local</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">property</span><span class="p">,</span> <span class="n">Local</span><span class="o">&lt;</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">value</span><span class="p">,</span> <span class="k">const</span> <span class="n">AccessorInfo</span><span class="o">&amp;</span> <span class="n">info</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">*</span> <span class="n">gtknotify_instance</span> <span class="o">=</span> <span class="n">node</span><span class="o">::</span><span class="n">ObjectWrap</span><span class="o">::</span><span class="n">Unwrap</span><span class="o">&lt;</span><span class="n">Gtknotify</span><span class="o">&gt;</span><span class="p">(</span><span class="n">info</span><span class="p">.</span><span class="n">Holder</span><span class="p">());</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">Utf8Value</span> <span class="n">v8str</span><span class="p">(</span><span class="n">value</span><span class="p">);</span>
</span><span class='line'>  <span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">icon</span> <span class="o">=</span> <span class="o">*</span><span class="n">v8str</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Our prototype method: Send()</h3>

<p>First we have to extract the C++ object <code>this</code> references. We then build our notification using the object&#8217;s properties (title, icon) and finally display it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// this.send()</span>
</span><span class='line'><span class="k">static</span> <span class="n">v8</span><span class="o">::</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">Send</span><span class="p">(</span><span class="k">const</span> <span class="n">Arguments</span><span class="o">&amp;</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">HandleScope</span> <span class="n">scope</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// Extract C++ object reference from &quot;this&quot;</span>
</span><span class='line'>  <span class="n">Gtknotify</span><span class="o">*</span> <span class="n">gtknotify_instance</span> <span class="o">=</span> <span class="n">node</span><span class="o">::</span><span class="n">ObjectWrap</span><span class="o">::</span><span class="n">Unwrap</span><span class="o">&lt;</span><span class="n">Gtknotify</span><span class="o">&gt;</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">This</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Convert first argument to V8 String</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">Utf8Value</span> <span class="n">v8str</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// For more info on the Notify library: http://library.gnome.org/devel/libnotify/0.7/NotifyNotification.html </span>
</span><span class='line'>  <span class="n">Notify</span><span class="o">::</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;Basic&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Arguments: title, content, icon</span>
</span><span class='line'>  <span class="n">Notify</span><span class="o">::</span><span class="n">Notification</span> <span class="n">n</span><span class="p">(</span><span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">title</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="o">*</span><span class="n">v8str</span><span class="p">,</span> <span class="n">gtknotify_instance</span><span class="o">-&gt;</span><span class="n">icon</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="c1">// *v8str points to the C string it wraps</span>
</span><span class='line'>  <span class="c1">// Display the notification</span>
</span><span class='line'>  <span class="n">n</span><span class="p">.</span><span class="n">show</span><span class="p">();</span>
</span><span class='line'>  <span class="c1">// Return value</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">v8</span><span class="o">::</span><span class="n">Boolean</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Compiling our extension</h2>

<p><code>node-waf</code> is the build tool used to compile Node extensions which is basically a wrapper for <a href="http://code.google.com/p/waf/">waf</a>. The build process can be configured with a file called <code>wscript</code> in our top directory:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">set_options</span><span class="p">(</span><span class="n">opt</span><span class="p">):</span>
</span><span class='line'>  <span class="n">opt</span><span class="o">.</span><span class="n">tool_options</span><span class="p">(</span><span class="s">&quot;compiler_cxx&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="n">conf</span><span class="p">):</span>
</span><span class='line'>  <span class="n">conf</span><span class="o">.</span><span class="n">check_tool</span><span class="p">(</span><span class="s">&quot;compiler_cxx&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">conf</span><span class="o">.</span><span class="n">check_tool</span><span class="p">(</span><span class="s">&quot;node_addon&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="c"># This will tell the compiler to link our extension with the gtkmm and libnotifymm libraries.</span>
</span><span class='line'>  <span class="n">conf</span><span class="o">.</span><span class="n">check_cfg</span><span class="p">(</span><span class="n">package</span><span class="o">=</span><span class="s">&#39;gtkmm-2.4&#39;</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="s">&#39;--cflags --libs&#39;</span><span class="p">,</span> <span class="n">uselib_store</span><span class="o">=</span><span class="s">&#39;LIBGTKMM&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">conf</span><span class="o">.</span><span class="n">check_cfg</span><span class="p">(</span><span class="n">package</span><span class="o">=</span><span class="s">&#39;libnotifymm-1.0&#39;</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="s">&#39;--cflags --libs&#39;</span><span class="p">,</span> <span class="n">uselib_store</span><span class="o">=</span><span class="s">&#39;LIBNOTIFYMM&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">build</span><span class="p">(</span><span class="n">bld</span><span class="p">):</span>
</span><span class='line'>  <span class="n">obj</span> <span class="o">=</span> <span class="n">bld</span><span class="o">.</span><span class="n">new_task_gen</span><span class="p">(</span><span class="s">&quot;cxx&quot;</span><span class="p">,</span> <span class="s">&quot;shlib&quot;</span><span class="p">,</span> <span class="s">&quot;node_addon&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">obj</span><span class="o">.</span><span class="n">cxxflags</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;-g&quot;</span><span class="p">,</span> <span class="s">&quot;-D_FILE_OFFSET_BITS=64&quot;</span><span class="p">,</span> <span class="s">&quot;-D_LARGEFILE_SOURCE&quot;</span><span class="p">,</span> <span class="s">&quot;-Wall&quot;</span><span class="p">]</span>
</span><span class='line'>  <span class="c"># This is the name of our extension.</span>
</span><span class='line'>  <span class="n">obj</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="s">&quot;gtknotify&quot;</span>
</span><span class='line'>  <span class="n">obj</span><span class="o">.</span><span class="n">source</span> <span class="o">=</span> <span class="s">&quot;src/node_gtknotify.cpp&quot;</span>
</span><span class='line'>  <span class="n">obj</span><span class="o">.</span><span class="n">uselib</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;LIBGTKMM&#39;</span><span class="p">,</span> <span class="s">&#39;LIBNOTIFYMM&#39;</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>We&#8217;re now ready to build! In the top directory, run the following command:</p>

<pre><code>node-waf configure &amp;&amp; node-waf build
</code></pre>

<p>If everything goes right, we should now have our compiled extension in <code>./build/default/gtknotify.node</code>. Let&#8217;s try it!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>node
</span><span class='line'>&gt; var <span class="nv">notif</span> <span class="o">=</span> require<span class="o">(</span><span class="s1">&#39;./build/default/gtknotify.node&#39;</span><span class="o">)</span>;
</span><span class='line'>&gt; <span class="nv">n</span> <span class="o">=</span> new notif.notification<span class="o">()</span>;
</span><span class='line'><span class="o">{</span> icon: <span class="s1">&#39;terminal&#39;</span>, title: <span class="s1">&#39;Node.js&#39;</span> <span class="o">}</span>
</span><span class='line'>&gt; n.send<span class="o">(</span><span class="s2">&quot;Hello World!&quot;</span><span class="o">)</span>;
</span><span class='line'><span class="nb">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>The previous code should display a notification in the top right corner of your screen!</p>

<h2>Packaging for npm</h2>

<p>That&#8217;s pretty cool, but how about sharing your hard work with the Node community? That&#8217;s primarily what the Node Package Manager is used for: making it easy to import extensions/modules and distribute them.</p>

<p>Packaging an extension for npm is very straightforward. All you have to do is create a <code>package.json</code> file in your top directory which contains some info about your extension:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="c1">// Name of your extension (do not include node or js in the name, this is implicit). </span>
</span><span class='line'>  <span class="c1">// This is the name that will be used to import the extension through require().</span>
</span><span class='line'>
</span><span class='line'>  <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;notify&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Version should be http://semver.org/ compliant</span>
</span><span class='line'>
</span><span class='line'>  <span class="s2">&quot;version&quot;</span> <span class="o">:</span> <span class="s2">&quot;v0.1.0&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// These scripts will be run when calling npm install and npm uninstall.</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">,</span> <span class="s2">&quot;scripts&quot;</span> <span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;preinstall&quot;</span> <span class="o">:</span> <span class="s2">&quot;node-waf configure &amp;&amp; node-waf build&quot;</span>
</span><span class='line'>      <span class="p">,</span> <span class="s2">&quot;preuninstall&quot;</span> <span class="o">:</span> <span class="s2">&quot;rm -rf build/*&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// This is the relative path to our built extension.</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">,</span> <span class="s2">&quot;main&quot;</span> <span class="o">:</span> <span class="s2">&quot;build/default/gtknotify.node&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// The following fields are optional:</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">,</span> <span class="s2">&quot;description&quot;</span> <span class="o">:</span> <span class="s2">&quot;Description of the extension....&quot;</span>
</span><span class='line'>  <span class="p">,</span> <span class="s2">&quot;homepage&quot;</span> <span class="o">:</span> <span class="s2">&quot;https://github.com/olalonde/node-notify&quot;</span>
</span><span class='line'>  <span class="p">,</span> <span class="s2">&quot;author&quot;</span> <span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;Olivier Lalonde&quot;</span>
</span><span class='line'>      <span class="p">,</span> <span class="s2">&quot;email&quot;</span> <span class="o">:</span> <span class="s2">&quot;olalonde@gmail.com&quot;</span>
</span><span class='line'>      <span class="p">,</span> <span class="s2">&quot;url&quot;</span> <span class="o">:</span> <span class="s2">&quot;http://www.syskall.com/&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">,</span> <span class="s2">&quot;repository&quot;</span> <span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;type&quot;</span> <span class="o">:</span> <span class="s2">&quot;git&quot;</span>
</span><span class='line'>      <span class="p">,</span> <span class="s2">&quot;url&quot;</span> <span class="o">:</span> <span class="s2">&quot;https://github.com/olalonde/node-notify.git&quot;</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><em>For more details on the package.json format, documentation is available through <code>npm help json</code>. Note that most fields are optional.</em></p>

<p>You can now install your new npm package by running <code>npm install</code> in your top directory. If everything goes right, you should be able to load your extension with a simple <code>var notify = require('your-package-name');</code>. Another useful command is <code>npm link</code> which creates a symlink to your development directory so that any change to your code is reflected instantly - no need to install/uninstall perpetually.</p>

<p>Assuming you wrote a cool extension, you might want to publish it online in the central npm repository. In order to do that, you first need to create an account:</p>

<pre><code>$ npm adduser
</code></pre>

<p>Next, go back to the root of your package code and run:</p>

<pre><code>$ npm publish
</code></pre>

<p>That&#8217;s it, your package is now available for anyone to install through the <code>npm install your-package-name</code> command.</p>

<h2>Conclusion</h2>

<p>Writing a native Node extension can be cumbersome and verbose at times but it is well worth the hard earned bragging rights!</p>

<p>Thanks for reading. Let me know in the comments if you run into any problem, I’ll be glad to help.</p>

<p><em>If you liked this, maybe you&#8217;d also like what I <a href="http://twitter.com/o_lalonde">tweet on Twitter</a>! Might even want to <a href="mailto:olalonde@gmail.com">hire me</a>?</em></p>

<h2>References</h2>

<ul>
<li><a href="http://syskall.com/how-to-roll-out-your-own-javascript-api-with">How to roll out your own Javascript API with V8</a></li>
<li><a href="https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/">Writing Node.js Native Extensions</a></li>
<li><a href="http://code.google.com/apis/v8/embed.html">V8 JavaScript Engine Embedder&#8217;s Guide</a></li>
<li><a href="http://howtonode.org/introduction-to-npm">Introduction to npm</a></li>
<li><a href="http://nodejs.org/">Node.js</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Resizing a VDI in VirtualBox 3 with one command]]></title>
    <link href="http://syskall.com/resizing-a-vdi-in-virtualbox-3-in-one-command/index.html"/>
    <updated>2011-03-10T00:00:00+08:00</updated>
    <id>http://syskall.com/resizing-a-vdi-in-virtualbox-3-in-one-command/resizing-a-vdi-in-virtualbox-3-in-one-command</id>
    <content type="html"><![CDATA[<p>Here&rsquo;s a quick way to expand a (VDI) Virtual Disk Image in VirtualBox 3.</p>




<ol>
<li>Create a new VDI with the new size of your choice. (File / Virtual
Media Manager / New&hellip;)</li>
<li><p>Run this command:</p>

<div class="CodeRay">
  <div class="code"><pre>$ VBoxManage clonehd --existing old.vdi new.vdi</pre></div>
</div>


<p> This may take a few minutes.</p></li>
<li><p>Simply replace the attached old.vdi with the new.vdi in your virtual machine&rsquo;s storage settings.</p></li>
<li>You will need to extend your partition from your guest OS. This can be done under Windows 7 from the control panel (Create and format hard disk partitions) and with GParted in Ubuntu and compatible Linux distributions.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Minimalist shell in C (for educational purposes only!)]]></title>
    <link href="http://syskall.com/minimalist-shell-in-c-for-educational-purpose/index.html"/>
    <updated>2011-03-10T00:00:00+08:00</updated>
    <id>http://syskall.com/minimalist-shell-in-c-for-educational-purpose/minimalist-shell-in-c-for-educational-purpose</id>
    <content type="html"><![CDATA[<h2>Introduction</h2>

<p>I was kind of bored tonight so I decided to write a very minimalist
shell in C. Here&#8217;s how it looks:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm"> * DISCLAIMER: THIS CODE IS FOR EDUCATIONAL PURPOSES ONLY. USE AT YOUR OWN RISKS.</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * This code shows the basic workings of a shell.</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * Append &quot;/path/to/dashell&quot; to /etc/shells, to make it a valid shell:</span>
</span><span class='line'><span class="cm"> * sudo echo &quot;/path/to/dashell&quot; &gt;&gt; /etc/shells</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * Change your &quot;username&quot;&#39;s shell. &quot;username&quot; should have execute permission for the shell:</span>
</span><span class='line'><span class="cm"> * chsh --shell /path/to/dashell username</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#include &lt;unistd.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;string.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stddef.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdlib.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;ctype.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;sys/signal.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define STDIN 0</span>
</span><span class='line'><span class="cp">#define STDOUT 1</span>
</span><span class='line'><span class="cp">#define STDERR 2</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define BUFFER_SIZE 1024</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="nf">parse_arguments</span><span class="p">(</span><span class="kt">char</span> <span class="n">buffer</span><span class="p">[],</span> <span class="kt">int</span> <span class="o">*</span><span class="n">args_count</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">args</span><span class="p">[])</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">char</span> <span class="o">*</span><span class="n">delimiters</span> <span class="o">=</span> <span class="s">&quot; </span><span class="se">\r\n</span><span class="s">&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">char</span> <span class="o">*</span><span class="n">token</span><span class="p">;</span>
</span><span class='line'>  <span class="o">*</span><span class="n">args_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// &quot;abc def ghi&quot; =&gt; {&quot;abc&quot;, &quot;def&quot;, &quot;ghi&quot;}</span>
</span><span class='line'>  <span class="k">while</span><span class="p">(</span><span class="n">token</span> <span class="o">=</span> <span class="n">strsep</span><span class="p">(</span><span class="o">&amp;</span><span class="n">buffer</span><span class="p">,</span> <span class="n">delimiters</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">args</span><span class="p">[</span><span class="o">*</span><span class="n">args_count</span><span class="p">]</span> <span class="o">=</span> <span class="n">token</span><span class="p">;</span>
</span><span class='line'>    <span class="p">(</span><span class="o">*</span><span class="n">args_count</span><span class="p">)</span><span class="o">++</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="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// The weird characters are used to format the text&#39;s appearance.</span>
</span><span class='line'>  <span class="c1">// See http://en.wikipedia.org/wiki/ANSI_escape_code</span>
</span><span class='line'>  <span class="kt">char</span> <span class="n">prompt</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;</span><span class="se">\033</span><span class="s">[1mdashell</span><span class="se">\033</span><span class="s">[2m&gt;</span><span class="se">\033</span><span class="s">[0m &quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">char</span> <span class="n">exec_error</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&quot;Cannot execute program %s.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">char</span> <span class="n">buffer</span><span class="p">[</span><span class="n">BUFFER_SIZE</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">int</span> <span class="n">args_count</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">char</span> <span class="o">*</span><span class="n">args</span><span class="p">[</span><span class="n">BUFFER_SIZE</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">write</span><span class="p">(</span><span class="n">STDOUT</span><span class="p">,</span> <span class="n">prompt</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">STDIN</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">BUFFER_SIZE</span><span class="p">);</span> <span class="c1">// Read from STDIN (keyboard input)</span>
</span><span class='line'>    <span class="n">buffer</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;\0&#39;</span><span class="p">;</span> <span class="c1">// Null character to indicate string end</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// &quot;abc def ghi&quot; =&gt; {&quot;abc&quot;, &quot;def&quot;, &quot;ghi&quot;}</span>
</span><span class='line'>    <span class="n">parse_arguments</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">args_count</span><span class="p">,</span> <span class="n">args</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// No arguments</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="n">args_count</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">strcmp</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s">&quot;&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Argument = exit</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="n">strcmp</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s">&quot;exit&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">pid_t</span> <span class="n">child_pid</span> <span class="o">=</span> <span class="n">fork</span><span class="p">();</span> <span class="c1">// Duplicate process</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="n">child_pid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Child</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="n">execvp</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">args</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Replace executable code by command passed</span>
</span><span class='line'>        <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="n">exec_error</span><span class="p">,</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</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">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Parent</span>
</span><span class='line'>      <span class="c1">// Wait for child to finish</span>
</span><span class='line'>      <span class="n">wait</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>The full source code is freely <a href="https://github.com/olalonde/dashell">available at Github</a>:</p>

<pre><code>git clone git://github.com/olalonde/dashell.git
</code></pre>

<p>Note that I never code in C so it might not be perfect&#8230; I&#8217;m looking at you <code>parse_arguments()</code> ;)</p>

<h2>Install &amp; have fun</h2>

<p>The optional steps will let you use the shell as a login shell for a given user.</p>

<ol>
<li><p><code>make</code></p></li>
<li><p>(optional) Append &#8220;/path/to/dashell&#8221; to /etc/shells, to make it a
valid shell:</p></li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo <span class="nb">echo</span> <span class="s2">&quot;/path/to/dashell&quot;</span> &gt;&gt; /etc/shells
</span></code></pre></td></tr></table></div></figure>


<ol>
<li>(optional) Change &#8220;username&#8220;&#8216;s shell. &#8220;username&#8221; should have
execute permission for the shell:</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>chsh --shell /path/to/dashell username
</span></code></pre></td></tr></table></div></figure>


<p>Now, you can launch the shell and start having fun with it and be
reminded how great bash really is!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>./dashell
</span><span class='line'>dashell&gt; ls -al
</span><span class='line'>dashell&gt; ./launchme 1 2 3
</span><span class='line'>....
</span><span class='line'>dashell&gt; <span class="nb">exit</span>
</span></code></pre></td></tr></table></div></figure>


<p>Feel free to ask questions!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to roll out your own Javascript API with V8]]></title>
    <link href="http://syskall.com/how-to-roll-out-your-own-javascript-api-with/index.html"/>
    <updated>2011-02-26T00:00:00+08:00</updated>
    <id>http://syskall.com/how-to-roll-out-your-own-javascript-api-with/how-to-roll-out-your-own-javascript-api-with</id>
    <content type="html"><![CDATA[<p><em>Update: I wrote a new tutorial on porting our V8 code as a Node.js extension: <a href="http://syskall.com/how-to-write-your-own-native-nodejs-extension">How to write your own native Node.js extension</a>.</em></p>


<h2>Introduction</h2>

<p>This tutorial will teach you how to:</p>

<ol>
<li>Compile the V8 Javascript engine</li>
<li>Bind a Javascript function to your own C++ function</li>
</ol>


<p>For the sake of demonstration and to impress your co-workers, we will bind a Javascript function &#8220;alert()“ that will display desktop notifications through the GTK library. Here’s what the end result looks like:</p>

<p><img src="http://i.imgur.com/nUsWG.png" alt="jsnotify screenshot" /></p>

<p>You can get the full source code of this tutorial <a href="https://github.com/olalonde/jsnotify">from github</a>:</p>

<pre><code>git clone git://github.com/olalonde/jsnotify.git
</code></pre>

<p>This tutorial was tested on Ubuntu 10.04 and 10.10 64-bit but should work fine on any Linux distribution. The notification part requires the GTK+ library.</p>

<h2>Compiling Google’s V8 Javascript engine</h2>

<p>First, let’s make sure we have all the <a href="http://code.google.com/apis/v8/build.html">required tools and dependencies</a> to compile.</p>

<pre><code>sudo apt-get install build-essential scons subversion 
</code></pre>

<ul>
<li>The build-essential package is a meta package that installs all the necessary tools and libraries to compile C++ programs.</li>
<li>SCons is a build tool which attempts to replace the classic “make” and is used by the V8 project.</li>
<li>Subversion is needed to checkout the source code of V8.</li>
</ul>


<p>Now, let’s grab V8’s source from the <a href="http://code.google.com/p/v8/wiki/Source?tm=4">official repository</a>:</p>

<pre><code>svn checkout http://v8.googlecode.com/svn/trunk/ v8 
</code></pre>

<p>We can now move into the V8 directory and try to compile!</p>

<pre><code>cd v8;
scons arch=x64; 
</code></pre>

<p>The “arch=x64” option specifies that we want to build a 64-bit version of V8 (the default value would be 32-bit otherwise).</p>

<p>If V8 compiled fine, you should now have a libv8.a file in your v8/ directory. As you probably guessed, libv8.a is the library that our C++ program will use to execute Javascript code.</p>

<p>So, if everything compiled fine, just skip to the next section. Otherwise, keep on reading.</p>

<p>When you get errors as a result of compiling third party code, it is usually due to the fact that the compiler can’t find required libraries (/usr/lib) and/or their associated header files (/usr/lib/include). The latter are usually available through packages conventionally named <em>libname</em>-dev . In order to find out which package installs a given file, there is a neat utility called <code>apt-file</code>.</p>

<pre><code>sudo apt-get install apt-file;
apt-file search missing-header-file.h; 
</code></pre>

<p>The <code>apt-file search</code> command lists the package(s) that install a given file (<em>missing-header-file.h</em> in this case). If there are more than one package listed, we have to take a semi-educated guess on which package we should install based on its name (let me know in the comments if you know of a better trick!). We then simply install the package with the usual <code>apt-get install package-name</code> command.</p>

<p>Hint: If you are on Ubuntu 10.04, you might need to install the following packages:</p>

<pre><code>sudo apt-get install libc6-dev-i368 lib32stdc++6
</code></pre>

<p>Now that we’ve installed all the missing files, the compilation should work. Let&#8217;s move on to the next section.</p>

<p>If you are still stuck with compiling V8, <a href="http://www.travisswicegood.com/2009/07/11/compiling-node-js-olibc6-dev-i368n-ubuntu-9-04/">this tutorial</a> might help.</p>

<h2>Building our own Javascript API</h2>

<p>Now that we have successfully compiled the V8 library, we will build our own C++ project that will be “Javascript scriptable”. This means that our program will be able to run Javascript code which in turn will be able to call our custom C++ functions.</p>

<p><em>Note:</em> You can also get the full source code of this tutorial from my <a href="(https://github.com/olalonde/jsnotify">jsnotify github repository</a>): <code>git clone git://github.com/olalonde/jsnotify.git</code></p>

<p>First let’s create our file structure.</p>

<pre><code>jsnotify/
  |-- deps/  # third party code
  |   `-- v8  # move your v8 folder here
  `-- src/ # our code goes here
      `-- jsnotify.cpp
</code></pre>

<p>Now let’s copy the sample code available at <code>deps/v8/samples/shell.cc</code> and paste it into jsnotify.cpp. The sample code given by V8 let’s you execute a Javascript file or start an interactive Javascript shell. It also binds some useful Javascript functions such as print() which will output text to the terminal.</p>

<p>Let’s try to compile this!</p>

<pre><code>g++ src/jsnotify.cpp; 
</code></pre>

<p>Of course, this gives us a bunch of errors since we haven’t specified where the V8 header and library files are. Let’s try again!</p>

<pre><code>g++ src/jsnotify.cpp -Ideps/v8/include -Ldeps/v8/ -lv8
</code></pre>

<p>Oops, still some errors. Looks like we also have to link the pthread library.</p>

<pre><code>g++ src/jsnotify.cpp -Ideps/v8/include -Ldeps/v8/ -lv8 -lpthread
</code></pre>

<p>This finally compiles! Now that we have our mini Javascript shell, let’s play a bit with it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>./a.out
</span><span class='line'>V8 version 3.1.5
</span><span class='line'>&gt; var <span class="nv">foo</span> <span class="o">=</span> “Hello World”;
</span><span class='line'>&gt; print<span class="o">(</span>foo<span class="o">)</span>;
</span><span class='line'>Hello World
</span></code></pre></td></tr></table></div></figure>


<p>Now, all we have to do is to create our custom alert() function in C++.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// INSERT THIS BEFORE int RunMain(int argc, char* argv[]) {</span>
</span><span class='line'><span class="c1">// We need those two libraries for the GTK+ notification </span>
</span><span class='line'><span class="cp">#include &lt;gtkmm.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;libnotifymm.h&gt;</span>
</span><span class='line'><span class="n">v8</span><span class="o">::</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">v8</span><span class="o">::</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">Alert</span><span class="p">(</span><span class="k">const</span> <span class="n">v8</span><span class="o">::</span><span class="n">Arguments</span><span class="o">&amp;</span> <span class="n">args</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// INSERT THIS AT END OF FILE   </span>
</span><span class='line'><span class="c1">// The callback that is invoked by v8 whenever the JavaScript &#39;alert&#39;</span>
</span><span class='line'><span class="c1">// function is called.  Displays a GTK+ notification.</span>
</span><span class='line'><span class="n">v8</span><span class="o">::</span><span class="n">Handle</span><span class="o">&lt;</span><span class="n">v8</span><span class="o">::</span><span class="n">Value</span><span class="o">&gt;</span> <span class="n">Alert</span><span class="p">(</span><span class="k">const</span> <span class="n">v8</span><span class="o">::</span><span class="n">Arguments</span><span class="o">&amp;</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">Utf8Value</span> <span class="n">str</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// Convert first argument to V8 String</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">cstr</span> <span class="o">=</span> <span class="n">ToCString</span><span class="p">(</span><span class="n">str</span><span class="p">);</span> <span class="c1">// Convert V8 String to C string</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">Notify</span><span class="o">::</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;Basic&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Arguments: title, content, icon</span>
</span><span class='line'>  <span class="n">Notify</span><span class="o">::</span><span class="n">Notification</span> <span class="n">n</span><span class="p">(</span><span class="s">&quot;Alert&quot;</span><span class="p">,</span> <span class="n">cstr</span><span class="p">,</span> <span class="s">&quot;terminal&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// Display notification</span>
</span><span class='line'>  <span class="n">n</span><span class="p">.</span><span class="n">show</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">v8</span><span class="o">::</span><span class="n">Undefined</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we have our Alert C++ function, we need to tell V8 to bind it to the Javascript alert() function. This is done by adding the following code in the RunMain function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="c1">// INSERT AFTER v8::Handle&lt;v8::ObjectTemplate&gt; global = v8::ObjectTemplate::New();</span>
</span><span class='line'><span class="c1">// Bind the global &#39;alert&#39; function to the C++ Alert callback.</span>
</span><span class='line'><span class="n">global</span><span class="o">-&gt;</span><span class="n">Set</span><span class="p">(</span><span class="n">v8</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;alert&quot;</span><span class="p">),</span> <span class="n">v8</span><span class="o">::</span><span class="n">FunctionTemplate</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">Alert</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, in order to compile, the compiler needs to know where to find the two header files we introduced. This is done using the pkg-config utility:</p>

<pre><code>g++ src/jsnotify.cpp -Ideps/v8/include -Ldeps/v8/ -lv8 -lpthread `pkg-config --cflags --libs gtkmm-2.4 libnotifymm-1.0`
</code></pre>

<p>We can now try our new alert function.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$.</span>/a.out
</span><span class='line'>V8 version 3.1.5
</span><span class='line'>&gt; alert<span class="o">(</span>“wow, it works!”<span class="o">)</span>;
</span></code></pre></td></tr></table></div></figure>


<p>You should see a nice notification in the top right of your screen! Note that you can also put you Javascript code in a file and pass the file name as an argument <code>./a.out filename.js</code>.</p>

<h2>Conclusion</h2>

<p>It&#8217;s quite easy to make a C++ program &#8220;Javascriptable&#8221; with V8 and the proper setup. If you&#8217;d like to practice your newfound skills, I suggest you try to add a title argument to the alert function. You might also want to follow me on Posterous if you&#8217;d like to be informed when I post the follow up to this tutorial which will explain how to extend <a href="http://nodejs.org/">Node.js</a> with our alert function.</p>

<p>That’s all for today, thanks for reading! Let me know in the comments if you run into any problem, I’ll be glad to help.</p>

<p><em>If you liked this, maybe you&#8217;d also like what I <a href="http://twitter.com/o_lalonde">tweet on Twitter</a>!</em></p>
]]></content>
  </entry>
  
</feed>
