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

  <title><![CDATA[about:benjie]]></title>
  <link href="http://www.benjiegillam.com/atom.xml" rel="self"/>
  <link href="http://www.benjiegillam.com/"/>
  <updated>2012-02-14T00:38:52+00:00</updated>
  <id>http://www.benjiegillam.com/</id>
  <author>
    <name><![CDATA[Benjie Gillam]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[12 Years Together!]]></title>
    <link href="http://www.benjiegillam.com/2012/02/12-years-together/"/>
    <updated>2012-02-14T00:38:00+00:00</updated>
    <id>http://www.benjiegillam.com/2012/02/12-years-together</id>
    <content type="html"><![CDATA[<p>Today marks the 12th anniversary of Jem and I being a couple. We met
when we were 13 on a Scout camp site near Southampton and immediately
became pen-pals. We wrote each other frequently, meeting up when we
could, and soon fell in love. That love, despite being the painfully
intense all-encompassing love of teenagers, has matured, strengthened
and grown over time. We&#8217;ve now been married for over 3 years and our son
Xander is 16 months old.</p>

<p>I want to take this opportunity to thank my wife for everything. Her
constant loving support helps me in every aspect of my life from
fatherhood to business to helping me deal with my health problems. I
honestly don&#8217;t know what I would do without her.</p>

<p style='font-size:4em;text-align:center;font-weight:bold;line-height:1.3em;margin-bottom:0.3em'>&#10084; Thank You, Jem &#10084;</p>


<p>You&#8217;re the most wonderful woman I know - beautiful, funny, clever,
loving, honest, understanding and a fantastic wife and mother.  Every
day I feel grateful to have you in my life and I truly hope I make you
feel loved and appreciated. Together we make a brilliant team - the
future never scares me, because I know whatever happens you&#8217;ll be there,
by my side.</p>

<h2 style='background:none'>
To me, you are perfect; I love you now, always and forever.
</h2>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A Plugin-Free Web]]></title>
    <link href="http://www.benjiegillam.com/2012/02/a-plugin-free-web/"/>
    <updated>2012-02-06T11:11:00+00:00</updated>
    <id>http://www.benjiegillam.com/2012/02/a-plugin-free-web</id>
    <content type="html"><![CDATA[<p>It&#8217;s almost unheard of for me to complement something that Microsoft are
doing - especially when it comes to Internet Explorer - but I&#8217;m 100%
behind a <a href="http://daringfireball.net/linked/2012/02/02/plugin-free-web">plugin-free web</a>:</p>

<blockquote><p>John Hrvatin from the Internet Explorer team:</p><p><blockquote> The transition to a plug-in free Web is happening today. Any site that uses plug-ins needs to understand what their customers experience when browsing plug-in free. Lots of Web browsing today happens on devices that simply don’t support plug-ins. Even browsers that do support plug-ins offer many ways to run plug-in free.</p><p>Metro style IE runs plug-in free to improve battery life as well as security, reliability, and privacy for consumers.<br/></blockquote></p><p>How long until Google joins the party?</p><footer><strong>John Gruber</strong> <cite><a href='http://daringfireball.net/linked/2012/02/02/plugin-free-web'>Microsoft Pushes for Plugin-Free Web</a></cite></footer></blockquote>


<p>Frequently friends and acquaintances will talk to me about iOS/Android
(being an iOS developer) and one of the things they&#8217;ll very often say is
&#8220;yeah, but iOS can&#8217;t run Flash,&#8221; as if that&#8217;s a bad thing! Banning Flash
from the platform is one of the things that makes me really glad I own
iOS devices and that they&#8217;ve such a large market share. Many websites
that use Flash are being forced to redevelop into open and
standards-compliant HTML &amp; JS so that they can capture the mobile
audience.</p>

<p><span class='pullquote-right' data-pullquote='If a shopping website forces me to use Flash to shop there then I simply don&#8217;t shop there '>
Flash is the most common browser plugin, and I loathe it. I block it on
all my computers and only use it where I absolutely have to.
If a shopping website forces me to use Flash to shop there then I simply don&#8217;t shop there.
And with HTML5 Video/Audio and the speed of JavaScript
in todays modern browsers (even the latest Internet Explorers!) there&#8217;s
less and less justification for websites to use Flash (or worse:
Silverlight! I&#8217;m looking at you, <a href="http://blog.lovefilm.com/uncategorized/why-were-switching-from-flash-to-silverlight.html">LoveFilm</a>).
</span></p>

<p>I&#8217;m not the only person who hates Flash, just look at <a href="http://www.google.co.uk/search?q=flash+block">all the plugins to
disable it</a>!</p>

<h2>Why Plugins Suck</h2>

<p>There&#8217;s many reasons, but mostly it comes down to non-compatibility,
performance, security and user experience.</p>

<h2>Compatibility</h2>

<p>For a long time there was no Flash player for Linux. Then
there was no Flash player for 64-bit operating systems. There&#8217;s no Flash
for iOS. My Blu-ray player can&#8217;t run Flash. Apparently my Tivo does run
Flash, but it&#8217;s god-awful. <!-- more --></p>

<p>And because Flash runs in a different rendering pipeline it doesn&#8217;t
integrate well with web browsers - especially when it comes to
transparency. (See &#8220;User Experience&#8221;)</p>

<h2>Performance</h2>

<p>A lot of devices are easily capable of rendering HTML/CSS/JS but Flash
pushes them too hard and the experience is ugly and slow. And Flash
seems to be used for a whole host of things that HTML/CSS/JS have been
capable of for years and years across all major browsers - one thing
that comes to mind is all the advertising you get on certain websites.</p>

<h2>Security</h2>

<p><span class='pullquote-right' data-pullquote='sharing your webcam feed without your permission '>
Bugs in plugins expose your browser to a lot of potential security risks -
<a href="http://www.google.co.uk/search?&amp;q=flash+xss">cross site scripting</a> (XSS) attacks, <a href="http://www.google.co.uk/search?q=flash+information+disclosure">information
disclosure</a>, even
sharing your webcam feed without your permission
(<a href="http://news.yahoo.com/blogs/technology-blog/adobe-flash-exploit-allows-websites-access-webcam-without-010049284.html">October 2011</a>)! Over
the years a lot of these issues have been patched, but it should be the
job of the web browser to allow/deny access to various resources, having
two interfaces increases the attack surface - it&#8217;s risky and confusing.
</span></p>

<h2>User Experience</h2>

<p>When hover to expand adverts first came out they used to actually block
the viewing of the content on some websites in some browsers - so I
simply stopped visiting those website. What&#8217;s the point if you can&#8217;t
actually read the content?!</p>

<p>Once you&#8217;ve got 10 Flash adverts on a web-page the scroll performance
drops significantly, even on a dual core computer. There&#8217;s also the
increased render time of the webpage as a whole, and the annoying (and
unnecessary!) loading indicators.</p>

<p>When you close a browser tab, plugins on that page playing audio/etc
often won&#8217;t close until a couple of seconds later, which can be very
irritating. And don&#8217;t get me started on websites that suddenly start
talking to you without you asking them to! (Though this is possible with
HTML5 also&#8230;)</p>

<h2>Acceptable Use Cases</h2>

<p>There used to be lots of use-cases for which I found the use of Flash
acceptable, but many of these are being diminished due to HTML5 adding
extra capabilities to the browser:</p>

<ul>
<li>3D browser games (soon to be invalid due to <a href="http://get.webgl.org/">WebGL</a> and similar technologies)</li>
<li>streaming video/audio (now supported by <a href="https://developer.mozilla.org/en/Using_HTML5_audio_and_video">HTML5 audio and
video</a>)</li>
<li>video conferencing (there&#8217;s many workarounds for this - W3 are
attempting to create a <a href="http://www.w3.org/TR/html-media-capture/">Media Capture API</a>)</li>
<li>real-time socket communications (<a href="http://www.w3.org/TR/websockets/">WebSockets</a> allow real time
communications by extending HTTP)</li>
</ul>


<h2>Progress</h2>

<p>Apple, Microsoft I applaud your efforts to rid the internet of these
plugins (despite the existence of QuickTime, Silverlight and the like).</p>

<p>Google, I&#8217;m disappointed with you integrating Flash so deeply into
Chrome, but Chrome&#8217;s an awesome browser for development so I shall use it
anyway. Good work on making YouTube work with HTML5 though :)</p>

<p>HTML5 guys, you all rock.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Happy New Year 2012]]></title>
    <link href="http://www.benjiegillam.com/2012/02/happy-new-year-2012/"/>
    <updated>2012-02-04T18:57:00+00:00</updated>
    <id>http://www.benjiegillam.com/2012/02/happy-new-year-2012</id>
    <content type="html"><![CDATA[<p><span class='pullquote-right' data-pullquote='Xander&#8217;s walking well and he&#8217;s getting closer to speech every day '>
How&#8217;s your year going so far? Mine&#8217;s going really well.
Xander&#8217;s walking well and he&#8217;s getting closer to speech every day
which is fascinating and exciting to watch, my health has improved
massively over last year and I&#8217;m really enjoying work.
</span></p>

<p><span class='pullquote-right' data-pullquote='making an effort to do the things I&#8217;ve always meant to '>
This year I&#8217;m
making an effort to do the things I&#8217;ve always meant to
do as a programmer; and playing with lots of new (to me)
tech in the process! I intend to cover a few of these topics in the coming
weeks/months, but here&#8217;s a summary:
</span></p>

<h2>Vim</h2>

<p><span class='pullquote-right' data-pullquote='you don&#8217;t have to jump in at the deep end '>
I&#8217;ve started using Vim as my main editor (or more specifically
<a href="https://github.com/b4winckler/macvim">MacVim</a> with the <a href="https://github.com/carlhuda/janus">Janus vim distribution</a>) and I&#8217;m
loving it. It&#8217;s a relatively steep learning curve, but
you don&#8217;t have to jump in at the deep end
 - just start with <code>i</code> to enter insert mode, use
it like a normal editor, and then to save press <code>&lt;Esc&gt;</code> followed by
<code>:wq&lt;Enter&gt;</code> to save and exit (drop the <code>q</code> if you don&#8217;t want to exit).
Slowly start learning new things and forcing yourself to start using
normal mode (where you type commands like <code>:wq</code>) and as you use more,
you&#8217;ll want to use more. Once you&#8217;ve mastered the whole
count-verb-modifier-noun grammar of vim you&#8217;ll be using it for
everything and wondering how you ever managed without it!
</span></p>

<h2>Node.js</h2>

<p><span class='pullquote-right' data-pullquote='anything that needs scripting I now do in JavaScript '>
Okay, so I&#8217;ve been playing with this for a while, but I&#8217;m using it for
more and more stuff now - pretty much
anything that needs scripting I now do in JavaScript, or more specifically&#8230;
</span></p>

<h2>CoffeeScript</h2>

<p><span class='pullquote-right' data-pullquote='I&#8217;m now using it for ALL my JavaScript programming '>
&#8230; <a href="http://coffeescript.org/">CoffeeScript</a>, which is bloody brilliant - especially
if you have a strong understanding of how the underlying JavaScript
functions. This isn&#8217;t new either, but
I&#8217;m now using it for ALL my JavaScript programming
</span></p>

<h2>Underscore.js</h2>

<p><a href="http://documentcloud.github.com/underscore/">Underscore.js</a> is a light library of helpful JavaScript
functions for working with objects, arrays, collections and other such
things in a functional programming way <strong>without</strong> extending the native
objects. jQuery/Mootools use <code>$</code> for working with DOM nodes, Underscore
uses <code>_</code> for dealing with everything else.</p>

<h2>Backbone.js</h2>

<p><a href="http://documentcloud.github.com/backbone/">Backbone.js</a> extends Underscore.js and is a great way of
keeping the code of your <abbr title="Rich Internet Applications">RIAs</abbr> organised.
It&#8217;s very flexible and can fit to many different programming
methodologies, but I use it in a M-VC (Model, ViewController) manner not
dissimilar to iOS. Event are emitted from models when they&#8217;re added,
changed or deleted; hooking into these events allows your app to always
display consistent information without the need for lots of hard-coded
callbacks.</p>

<h2>jQuery</h2>

<p>It seems everybody uses jQuery, and has done since its inception. I
refused to jump on the band-wagon and I&#8217;m glad I did - I coded
everything in JavaScript from scratch using native methods and help
from articles across the web (especially sites such as
<a href="http://www.quirksmode.org/">QuirksMode</a>) and now have a very good understanding of how
different parts of a modern web browser piece together and the
faster/slower ways to go about doing things.</p>

<p><span class='pullquote-right' data-pullquote='reduces programming time significantly and adds flexibility '>
However, jQuery is a lot faster than it used to be, as are modern web
browsers, so my concerns are much less valid. It
reduces programming time significantly and adds flexibility
so I now use it (or
<a href="http://zeptojs.com/">Zepto.js</a>) in a lot of my projects and I really like it - it
doesn&#8217;t take long to learn and master, and it improves the speed of
Backbone development considerably.
</span></p>

<h2>Git</h2>

<p><span class='pullquote-right' data-pullquote='brilliant - lightening fast and so flexible '>
Git, as you should know, is a brilliant version control software. I&#8217;ve
been using SVN for years but have had the itch to switch for ages, so
with some new projects that I&#8217;ve been working on (using the above
technologies) I decided to switch to using git where possible. It&#8217;s
brilliant - lightening fast and so flexible. The lack of the old
<code>/trunk/</code>, <code>/branches/</code>, <code>/tags/</code> layout makes me happy too - trying to
convince employees to use <code>svn switch</code> was very hard, but with <code>git</code>
they&#8217;ve got no choice but to do it the right way! I&#8217;m using
<a href="https://github.com/sitaramc/gitolite">gitolite</a> for our internal (private) hosting, and &#8230;
</span></p>

<h2>Open Sourcing</h2>

<p><span class='pullquote-right' data-pullquote='I intend to release much more in the coming year '>
&#8230; I&#8217;ve started Open Sourcing some stuff I&#8217;m working on to GitHub.
First is my <a href="https://github.com/BenjieGillam/ec2-prune-snapshots">ec2-prune-snapshots</a> script for
automatically deleting sensibly old <abbr title="Elastic Block Storage">EBS</abbr>
snapshots on <a href="https://aws.amazon.com/">AWS</a>, but
I intend to release much more in the coming year, and
possibly even retro-actively releasing some older software,
such as <a href="http://code.google.com/p/mythpywii/">MythPyWii</a> which currently sits on Google Code.
</span></p>

<h2>What Are You Using?</h2>

<p>If you&#8217;re using some cool technology for web/mobile application
development that you think I might enjoy experimenting with then please
let me know in the cooments!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Multiple Asynchronous Callbacks]]></title>
    <link href="http://www.benjiegillam.com/2011/11/multiple-asynchronous-callbacks/"/>
    <updated>2011-11-23T10:01:00+00:00</updated>
    <id>http://www.benjiegillam.com/2011/11/multiple-asynchronous-callbacks</id>
    <content type="html"><![CDATA[<p>When programming in JavaScript (or CoffeeScript) you sometimes face a
situation where you need to complete multiple independant asynchronous
methods before continuing. This situation crops up in web browsers but
its much more common when writing server-side JavaScript, e.g. with
<a href="http://nodejs.org/">Node.js</a> - for example you might need to fetch from a
database, fetch from a <abbr title="Key value store, e.g. Redis/Memcached">KVS</abbr>,
read a file and perform a remote HTTP request before outputting the
compiled information to the end user.</p>

<p>One method of solving this issue is to chain the asynchronous calls, however this
means that they&#8217;re run one after the other (serially) - and thus it will
take longer to complete them. A better way would be to run them in
parallel and have something track their completion. This is exactly what
my very simple <code>AsyncBatch</code> class does:</p>

<figure class='code'><figcaption><span class="switchLang"><a class="switchLang selected" onclick="switchLang(event,this,'figure_167528627');">.coffee</a><a class="switchLang" onclick="switchLang(event,this,'figure_167528627');">.js</a></span><span>AsyncBatch class, triggers event once all wrapped callbacks complete</span></figcaption><div clang='CoffeeScript' id="figure_167528627"><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='coffee-script'><span class='line'><span class="k">class</span> <span class="nx">AsyncBatch</span> <span class="k">extends</span> <span class="nx">EventEmitter</span>
</span><span class='line'>  <span class="nv">constructor: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="vi">@_complete = </span><span class="p">{}</span>
</span><span class='line'>    <span class="vi">@_scheduled = </span><span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">wrap: </span><span class="nf">(name,cb) -&gt;</span>
</span><span class='line'>    <span class="nx">@_scheduled</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span>
</span><span class='line'>    <span class="k">return</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">@_complete</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">cb</span><span class="p">.</span><span class="nx">apply</span> <span class="nx">@</span><span class="p">,</span> <span class="nx">arguments</span>
</span><span class='line'>      <span class="k">if</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">@_complete</span><span class="p">).</span><span class="nx">length</span> <span class="o">==</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">@_scheduled</span><span class="p">).</span><span class="nx">length</span>
</span><span class='line'>        <span class="nx">@emit</span> <span class="s">&#39;done&#39;</span><span class="p">,</span> <span class="nx">@_complete</span>
</span></code></pre></td></tr></table></div></div><div clang='JavaScript' id="figure_167528627_alt" style="display:none;"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">AsyncBatch</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">__hasProp</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">__extends</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">child</span><span class="p">,</span> <span class="nx">parent</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">parent</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">__hasProp</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">parent</span><span class="p">,</span> <span class="nx">key</span><span class="p">))</span> <span class="nx">child</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">ctor</span><span class="p">()</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">child</span><span class="p">;</span> <span class="p">}</span> <span class="nx">ctor</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span> <span class="nx">child</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ctor</span><span class="p">;</span> <span class="nx">child</span><span class="p">.</span><span class="nx">__super__</span> <span class="o">=</span> <span class="nx">parent</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span> <span class="k">return</span> <span class="nx">child</span><span class="p">;</span> <span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">AsyncBatch</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">_super</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">__extends</span><span class="p">(</span><span class="nx">AsyncBatch</span><span class="p">,</span> <span class="nx">_super</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">AsyncBatch</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">_complete</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">_scheduled</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">AsyncBatch</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">wrap</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_this</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">_scheduled</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">_this</span><span class="p">.</span><span class="nx">_complete</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">cb</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">_this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">_this</span><span class="p">.</span><span class="nx">_complete</span><span class="p">).</span><span class="nx">length</span> <span class="o">===</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">_this</span><span class="p">.</span><span class="nx">_scheduled</span><span class="p">).</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">_this</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s1">&#39;done&#39;</span><span class="p">,</span> <span class="nx">_this</span><span class="p">.</span><span class="nx">_complete</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">AsyncBatch</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">})(</span><span class="nx">EventEmitter</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></div></figure>


<p>To use AsyncBatch, just do the following</p>

<figure class='code'><figcaption><span class="switchLang"><a class="switchLang selected" onclick="switchLang(event,this,'figure_338186292');">.coffee</a><a class="switchLang" onclick="switchLang(event,this,'figure_338186292');">.js</a></span><span>How to use AsyncBatch</span></figcaption><div clang='CoffeeScript' id="figure_338186292"><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='coffee-script'><span class='line'><span class="cm">###</span>
</span><span class='line'><span class="cm">Create a new AsyncBatch instance</span>
</span><span class='line'><span class="cm">###</span>
</span><span class='line'><span class="nv">batch = </span><span class="k">new</span> <span class="nx">AsyncBatch</span>
</span><span class='line'>
</span><span class='line'><span class="cm">###</span>
</span><span class='line'><span class="cm">Wrap your callbacks with batch.wrap and a name</span>
</span><span class='line'><span class="cm">The name is used to store the result returned by your callback</span>
</span><span class='line'><span class="cm">(Don&#39;t forget to return the result you&#39;re interested in!)</span>
</span><span class='line'><span class="cm">###</span>
</span><span class='line'><span class="nx">delay</span> <span class="mi">50</span><span class="p">,</span> <span class="nx">batch</span><span class="p">.</span><span class="nx">wrap</span> <span class="s">&#39;timer&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>  <span class="k">return</span> <span class="s">&quot;Timer complete&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">###</span>
</span><span class='line'><span class="cm">Add a completion handler that accepts `results` as a parameter.</span>
</span><span class='line'><span class="cm">  `results` is a JS object where the keys are the callback names </span>
</span><span class='line'><span class="cm">  from above and the values are the return values of the</span>
</span><span class='line'><span class="cm">  callbacks.</span>
</span><span class='line'><span class="cm">###</span>
</span><span class='line'><span class="nx">batch</span><span class="p">.</span><span class="kc">on</span> <span class="s">&#39;done&#39;</span><span class="p">,</span> <span class="nf">(results) -&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;Batch complete, timer result: </span><span class="si">#{</span><span class="nx">results</span><span class="p">.</span><span class="nx">timer</span><span class="si">}</span><span class="s">&quot;</span>
</span></code></pre></td></tr></table></div></div><div clang='JavaScript' id="figure_338186292_alt" style="display:none;"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">Create a new AsyncBatch instance</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">batch</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">batch</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">AsyncBatch</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">Wrap your callbacks with batch.wrap and a name</span>
</span><span class='line'><span class="cm">The name is used to store the result returned by your callback</span>
</span><span class='line'><span class="cm">(Don&#39;t forget to return the result you&#39;re interested in!)</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'>
</span><span class='line'><span class="nx">delay</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="nx">batch</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="s1">&#39;timer&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="s2">&quot;Timer complete&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">Add a completion handler that accepts `results` as a parameter.</span>
</span><span class='line'><span class="cm">  `results` is a JS object where the keys are the callback names </span>
</span><span class='line'><span class="cm">  from above and the values are the return values of the</span>
</span><span class='line'><span class="cm">  callbacks.</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'>
</span><span class='line'><span class="nx">batch</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;done&#39;</span><span class="p">,</span> <span class="kd">function</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">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;Batch complete, timer result: &quot;</span> <span class="o">+</span> <span class="nx">results</span><span class="p">.</span><span class="nx">timer</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></div></figure>


<p><strong>NOTE</strong>: If your asynchronous method accepts both a success and
  failure callback then simply wrap both individually but
  ensure you use the same name for both.</p>

<p><strong>NOTE</strong>: Other than the case in the previous NOTE, all callbacks
  should have different names.</p>

<p>A full example (including a stub <code>EventEmitter</code> implementation) follows:</p>

<!-- more -->




<figure class='code'><figcaption><span>An example of how to use AsyncBatch to handle parallel callbacks in Node.JS  (async-batch.coffee)</span> <a href='http://www.benjiegillam.com/code/async-batch.coffee'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
</pre></td><td class='code'><pre><code class='coffee-script'><span class='line'><span class="c1">#EventEmitter = require(&#39;events&#39;).EventEmitter</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">!</span><span class="nx">EventEmitter</span><span class="o">?</span>
</span><span class='line'>  <span class="k">class</span> <span class="nx">EventEmitter</span>
</span><span class='line'>    <span class="kc">on</span><span class="o">:</span> <span class="nf">(eventName, cb) -&gt;</span>
</span><span class='line'>      <span class="vi">@_eventCallbacks = </span><span class="p">{}</span> <span class="nx">unless</span> <span class="nx">@_eventCallbacks</span>
</span><span class='line'>      <span class="nx">@_eventCallbacks</span><span class="p">[</span><span class="nx">eventName</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span> <span class="nx">unless</span> <span class="nx">@_eventCallbacks</span><span class="p">[</span><span class="nx">eventName</span><span class="p">]</span>
</span><span class='line'>      <span class="nx">@_eventCallbacks</span><span class="p">[</span><span class="nx">eventName</span><span class="p">].</span><span class="nx">push</span> <span class="nx">cb</span>
</span><span class='line'>    <span class="nv">emit: </span><span class="nf">(eventName, args...) -&gt;</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">@_eventCallbacks</span> <span class="o">&amp;&amp;</span> <span class="nx">@_eventCallbacks</span><span class="p">[</span><span class="nx">eventName</span><span class="p">]</span>
</span><span class='line'>        <span class="nx">cb</span><span class="p">.</span><span class="nx">apply</span> <span class="nx">@</span><span class="p">,</span> <span class="nx">args</span> <span class="k">for</span> <span class="nx">cb</span> <span class="k">in</span> <span class="nx">@_eventCallbacks</span><span class="p">[</span><span class="nx">eventName</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nx">AsyncBatch</span> <span class="k">extends</span> <span class="nx">EventEmitter</span>
</span><span class='line'>  <span class="nv">constructor: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="vi">@_complete = </span><span class="p">{}</span>
</span><span class='line'>    <span class="vi">@_scheduled = </span><span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">wrap: </span><span class="nf">(name,cb) -&gt;</span>
</span><span class='line'>    <span class="nx">@_scheduled</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span>
</span><span class='line'>    <span class="k">return</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">@_complete</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">cb</span><span class="p">.</span><span class="nx">apply</span> <span class="nx">@</span><span class="p">,</span> <span class="nx">arguments</span>
</span><span class='line'>      <span class="k">if</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">@_complete</span><span class="p">).</span><span class="nx">length</span> <span class="o">==</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">@_scheduled</span><span class="p">).</span><span class="nx">length</span>
</span><span class='line'>        <span class="nx">@emit</span> <span class="s">&#39;done&#39;</span><span class="p">,</span> <span class="nx">@_complete</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nv">batch = </span><span class="k">new</span> <span class="nx">AsyncBatch</span>
</span><span class='line'>
</span><span class='line'><span class="cm">########################</span><span class="c1">##</span>
</span><span class='line'><span class="c1"># Task 1</span>
</span><span class='line'><span class="nv">http = </span><span class="nx">require</span> <span class="s">&#39;http&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">options =</span>
</span><span class='line'>  <span class="nv">host: </span><span class="s">&#39;www.example.com&#39;</span>
</span><span class='line'>  <span class="nv">port: </span><span class="mi">80</span>
</span><span class='line'>  <span class="nv">path: </span><span class="s">&#39;/&#39;</span>
</span><span class='line'>  <span class="nv">method: </span><span class="s">&#39;GET&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">req = </span><span class="nx">http</span><span class="p">.</span><span class="nx">request</span> <span class="nx">options</span><span class="p">,</span> <span class="nx">batch</span><span class="p">.</span><span class="nx">wrap</span> <span class="s">&#39;status&#39;</span><span class="p">,</span> <span class="nf">(res) -&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;STATUS: &#39;</span> <span class="o">+</span> <span class="nx">res</span><span class="p">.</span><span class="nx">statusCode</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;HEADERS: &#39;</span> <span class="o">+</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">headers</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nx">statusCode</span>
</span><span class='line'>
</span><span class='line'><span class="nx">req</span><span class="p">.</span><span class="kc">on</span> <span class="s">&#39;error&#39;</span><span class="p">,</span> <span class="nx">batch</span><span class="p">.</span><span class="nx">wrap</span> <span class="s">&#39;status&#39;</span><span class="p">,</span> <span class="nf">(e) -&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;problem with request: &#39;</span> <span class="o">+</span> <span class="nx">e</span><span class="p">.</span><span class="nx">message</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">null</span>
</span><span class='line'>
</span><span class='line'><span class="nx">req</span><span class="p">.</span><span class="nx">end</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="cm">########################</span><span class="c1">#</span>
</span><span class='line'><span class="c1"># Task 2</span>
</span><span class='line'><span class="nv">fs = </span><span class="nx">require</span> <span class="s">&#39;fs&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span> <span class="s">&#39;/etc/hosts&#39;</span><span class="p">,</span> <span class="s">&#39;utf8&#39;</span><span class="p">,</span> <span class="nx">batch</span><span class="p">.</span><span class="nx">wrap</span> <span class="s">&#39;hosts&#39;</span><span class="p">,</span> <span class="nf">(err, data) -&gt;</span>
</span><span class='line'>  <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">null</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="nx">data</span>
</span><span class='line'>  <span class="nv">tmp = </span><span class="nx">data</span><span class="p">.</span><span class="nx">split</span> <span class="s">&quot;\n&quot;</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">tmp</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span><span class="o">*</span><span class="nx">tmp</span><span class="p">.</span><span class="nx">length</span><span class="p">)]</span>
</span><span class='line'>
</span><span class='line'><span class="cm">########################</span>
</span><span class='line'><span class="c1"># Task 3</span>
</span><span class='line'><span class="nv">delay = </span><span class="nf">(ms, cb) -&gt;</span> <span class="nx">setTimeout</span> <span class="nx">cb</span><span class="p">,</span> <span class="nx">ms</span>
</span><span class='line'>
</span><span class='line'><span class="nx">delay</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span><span class="o">*</span><span class="mi">100</span><span class="p">,</span> <span class="nx">batch</span><span class="p">.</span><span class="nx">wrap</span> <span class="s">&#39;timer&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;Timer done&quot;</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">true</span>
</span><span class='line'>
</span><span class='line'><span class="cm">########################</span><span class="c1">#</span>
</span><span class='line'><span class="c1"># Completion:</span>
</span><span class='line'><span class="nx">batch</span><span class="p">.</span><span class="kc">on</span> <span class="s">&#39;done&#39;</span><span class="p">,</span> <span class="nf">(results) -&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;\n\n\nThe fetch, read and timer have completed.&quot;</span>
</span><span class='line'>  <span class="k">if</span> <span class="nx">results</span><span class="p">.</span><span class="nx">status</span> <span class="o">!=</span> <span class="kc">null</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;Fetch succeeded, status code: </span><span class="si">#{</span><span class="nx">results</span><span class="p">.</span><span class="nx">status</span><span class="si">}</span><span class="s">&quot;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">error</span> <span class="s">&quot;Fetch failed!&quot;</span>
</span><span class='line'>  <span class="k">if</span> <span class="nx">results</span><span class="p">.</span><span class="nx">hosts</span> <span class="o">!=</span> <span class="kc">null</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;Random entry from /etc/hosts: &quot;</span><span class="o">+</span><span class="nx">results</span><span class="p">.</span><span class="nx">hosts</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">error</span> <span class="s">&quot;Couldn&#39;t read /etc/hosts!&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">batch</span><span class="p">.</span><span class="kc">on</span> <span class="s">&#39;done&#39;</span><span class="p">,</span> <span class="nf">(results) -&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;\nSecond completion callback, raw results:&quot;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="nx">results</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CoffeeScript: JavaScript, but clearer]]></title>
    <link href="http://www.benjiegillam.com/2011/11/coffeescript-lets-you-express-yourself-more-clearly/"/>
    <updated>2011-11-21T13:59:00+00:00</updated>
    <id>http://www.benjiegillam.com/2011/11/coffeescript-lets-you-express-yourself-more-clearly</id>
    <content type="html"><![CDATA[<p>I really like <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>. I really like JavaScript. I&#8217;m trying to get
into the habit of writing more CoffeeScript since, I think, it allows
me to express myself clearer and more concisely, leading to shorter
code and (hopefully) less mistakes/bugs. It also makes jumping back into
code a month later a much simpler affair since reading the code is so
much easier.</p>

<p>The following JavaScript creates a new closure inside each iteration of
a loop to store the value of the loop variable <code>i</code> into the closure&#8217;s
local variable <code>j</code> so that we don&#8217;t just <code>console.log(10)</code> 10 times.
Though this example is trivial it represents a common method for
solving closure related issues in asynchronous code.</p>

<figure class='code'><figcaption><span>JavaScript closure required for correct output</span></figcaption><div clang='' id="figure_196786807"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">j</span> <span class="o">=</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">delay</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="kd">function</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">j</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></div><div clang='' id="figure_196786807_alt" style="display:none;"></div></figure>


<p>The following CoffeeScript does exactly the same thing, you can see the
translation line by line from the JavaScript. However once you&#8217;ve learnt
the syntax you can much more clearly see what is going on with the
CoffeeScript than in the verbose and parenthesis-heavy JavaScript above.</p>

<figure class='code'><figcaption><span class="switchLang"><a class="switchLang selected" onclick="switchLang(event,this,'figure_581302999');">.coffee</a><a class="switchLang" onclick="switchLang(event,this,'figure_581302999');">.js</a></span><span>CoffeeScript to do the same thing</span></figcaption><div clang='CoffeeScript' id="figure_581302999"><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='coffee-script'><span class='line'><span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="mi">10</span><span class="p">]</span>
</span><span class='line'>  <span class="nx">do</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nv">j = </span><span class="nx">i</span>
</span><span class='line'>    <span class="nx">delay</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="nx">j</span>
</span></code></pre></td></tr></table></div></div><div clang='JavaScript' id="figure_581302999_alt" style="display:none;"><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">i</span><span class="p">,</span> <span class="nx">_fn</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">_fn</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">j</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">j</span> <span class="o">=</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">delay</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">j</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">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">_fn</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></div></figure>


<p>As a bonus, <!-- more -->when CoffeeScript compiles to JavaScript it automatically takes the anonymous function
from line 2 and defines it outside the loop so that it need not be
interpretted/defined 10 times - it does this optimization for us.
(Though I suspect most modern JavaScript engines do this automatically
anyway.) To view the compiled JavaScript press the <code>View JavaScript</code>
link at the top left of the code snippet.</p>

<p>Note the delay function is just a reordered <code>setTimeout</code>:</p>

<figure class='code'><figcaption><span class="switchLang"><a class="switchLang selected" onclick="switchLang(event,this,'figure_152280052');">.coffee</a><a class="switchLang" onclick="switchLang(event,this,'figure_152280052');">.js</a></span><span>The delay function</span></figcaption><div clang='CoffeeScript' id="figure_152280052"><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='coffee-script'><span class='line'><span class="nv">delay = </span><span class="nf">(ms, cb) -&gt;</span> <span class="nx">setTimeout</span> <span class="nx">cb</span><span class="p">,</span> <span class="nx">ms</span>
</span></code></pre></td></tr></table></div></div><div clang='JavaScript' id="figure_152280052_alt" style="display:none;"><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="kd">var</span> <span class="nx">delay</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">delay</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ms</span><span class="p">,</span> <span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">cb</span><span class="p">,</span> <span class="nx">ms</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ASA Regulating 'Unlimited' Broadband Claims]]></title>
    <link href="http://www.benjiegillam.com/2011/09/asa-regulating-unlimited-broadband-claims/"/>
    <updated>2011-09-29T11:08:00+01:00</updated>
    <id>http://www.benjiegillam.com/2011/09/asa-regulating-unlimited-broadband-claims</id>
    <content type="html"><![CDATA[<blockquote><p>Strict guidelines will also be placed on internet providers which offer so-called  unlimited packages, where users can download to their heart&#8217;s content. If a user incurs an &#8220;additional charge or suspension of service as a consequence of exceeding a usage threshold,&#8221; the ISP cannot use the term &#8220;unlimited&#8221;.</p><footer><strong>Wired</strong> <cite><a href='http://www.wired.co.uk/news/archive/2011-09/29/asa-cracks-down-on-isps'>ASA Cracks Down on ISPs</a></cite></footer></blockquote>


<p>Finally! I hate it when providers are allowed to say &#8216;Unlimited&#8217; and then place a limit on it (generally via a Fair Usage Policy). What a load of rubbish! I&#8217;m a heavy bandwidth user so it makes it very hard for me to find out what the limit is and then choose the relevant provider. Fortunately Virgin&#8217;s XXL broadband <a href="http://shop.virginmedia.com/help/traffic-management/traffic-management-policy.html">truly is unlimited</a> - at least for now!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress/Disqus Issue Resolved]]></title>
    <link href="http://www.benjiegillam.com/2011/09/octopress-slash-disqus-issue-resolved/"/>
    <updated>2011-09-28T11:26:00+01:00</updated>
    <id>http://www.benjiegillam.com/2011/09/octopress-slash-disqus-issue-resolved</id>
    <content type="html"><![CDATA[<p>I was having an issue with Disqus - my comments were showing on post pages, but the comment count was not. Turns out that this is a simple to fix error relating to JavaScript scope.</p>

<h2>Scope issue</h2>

<p>The developer of Octopress has kindly protected our <code>window</code> object from being polluted with various unnecessary variables by wrapping the whole disqus include in an anonymous function.</p>

<p>However, the Disqus script actually injects another <code>&lt;script&gt;</code> element into the <code>&lt;head&gt;</code> (or <code>&lt;body&gt;</code>) of the page. This injected script, like all other scripts on the page, inherits the global (<code>window</code>) scope, and not the scope of this anonymous function. Thus it will not have access to the disqus variables such as <code>disqus_shortname</code> defined within the anonymous function. Without these variables, disqus loads such domains as <code>undefined.disqus.com</code> which is not very helpful!</p>

<h2>Solution</h2>

<p>The fix is simple - open up <code>source/_includes/disqus.html</code> and move the beginning of the anonymous function (<code>(function () {</code>) so that it does not contain the <code>var disqus_*</code> variable definitions. We also need to insert a couple of semi-colons that have been <abbr title="at the end of the `var disqus_script =` lines">accidentally omitted</abbr>. Here&#8217;s the resulting file:</p>

<figure class='code'><figcaption><span>Modified disqus include to fix disqus comment count. (disqus.html)</span> <a href='http://www.benjiegillam.com/code/source/_includes/disqus.html'>download</a></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='html'><span class='line'>{% comment %} Load script if disquss comments are enabled and `page.comments` is either empty (index) or set to true {% endcomment %}
</span><span class='line'>{% if site.disqus_short_name and page.comments != false %}
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">disqus_shortname</span> <span class="o">=</span> <span class="s1">&#39;{{ site.disqus_short_name }}&#39;</span><span class="p">;</span>
</span><span class='line'>      <span class="p">{</span><span class="o">%</span> <span class="k">if</span> <span class="nx">page</span><span class="p">.</span><span class="nx">comments</span> <span class="o">==</span> <span class="kc">true</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>        <span class="p">{</span><span class="o">%</span> <span class="nx">comment</span> <span class="o">%</span><span class="p">}</span> <span class="err">`</span><span class="nx">page</span><span class="p">.</span><span class="nx">comments</span><span class="err">`</span> <span class="nx">can</span> <span class="nx">be</span> <span class="nx">only</span> <span class="nx">be</span> <span class="nx">set</span> <span class="nx">to</span> <span class="kc">true</span> <span class="nx">on</span> <span class="nx">pages</span><span class="o">/</span><span class="nx">posts</span><span class="p">,</span> <span class="nx">so</span> <span class="nx">we</span> <span class="nx">embed</span> <span class="nx">the</span> <span class="nx">comments</span> <span class="nx">here</span><span class="p">.</span> <span class="p">{</span><span class="o">%</span> <span class="nx">endcomment</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>        <span class="c1">// var disqus_developer = 1;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">disqus_identifier</span> <span class="o">=</span> <span class="s1">&#39;{{ site.url }}{{ page.url }}&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">disqus_url</span> <span class="o">=</span> <span class="s1">&#39;{{ site.url }}{{ page.url }}&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">disqus_script</span> <span class="o">=</span> <span class="s1">&#39;embed.js&#39;</span><span class="p">;</span>
</span><span class='line'>      <span class="p">{</span><span class="o">%</span> <span class="k">else</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>        <span class="p">{</span><span class="o">%</span> <span class="nx">comment</span> <span class="o">%</span><span class="p">}</span> <span class="nx">As</span> <span class="err">`</span><span class="nx">page</span><span class="p">.</span><span class="nx">comments</span><span class="err">`</span> <span class="nx">is</span> <span class="nx">empty</span><span class="p">,</span> <span class="nx">we</span> <span class="nx">must</span> <span class="nx">be</span> <span class="nx">on</span> <span class="nx">the</span> <span class="nx">index</span> <span class="nx">page</span><span class="p">.</span> <span class="p">{</span><span class="o">%</span> <span class="nx">endcomment</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">disqus_script</span> <span class="o">=</span> <span class="s1">&#39;count.js&#39;</span><span class="p">;</span>
</span><span class='line'>      <span class="p">{</span><span class="o">%</span> <span class="nx">endif</span> <span class="o">%</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">dsq</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;script&#39;</span><span class="p">);</span> <span class="nx">dsq</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s1">&#39;text/javascript&#39;</span><span class="p">;</span> <span class="nx">dsq</span><span class="p">.</span><span class="nx">async</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">dsq</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s1">&#39;http://&#39;</span> <span class="o">+</span> <span class="nx">disqus_shortname</span> <span class="o">+</span> <span class="s1">&#39;.disqus.com/&#39;</span> <span class="o">+</span> <span class="nx">disqus_script</span><span class="p">;</span>
</span><span class='line'>      <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">&#39;head&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">||</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">dsq</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}());</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span><span class='line'>{% endif %}
</span></code></pre></td></tr></table></div></figure>


<h2>One more thing</h2>

<p><del>If you want your links to be absolute, then you should set <code>root</code> to be your root URL in <code>_config.yml</code> - e.g. <code>root: http://www.benjiegillam.com/</code> rather than <code>root: /</code>. This may or may not be required for Disqus to function properly.</del></p>

<p><strong>EDIT</strong>: @Octopress has confirmed that root must not contain the scheme and host.</p>

<h2>Bonus</h2>

<p>Now that I&#8217;ve implemented the above, my comments and comment counts successfully display on my <code>benjiegillam.dev</code> site (hosted by Pow)!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Sed to Replace Newlines]]></title>
    <link href="http://www.benjiegillam.com/2011/09/using-sed-to-replace-newlines/"/>
    <updated>2011-09-27T12:17:00+01:00</updated>
    <id>http://www.benjiegillam.com/2011/09/using-sed-to-replace-newlines</id>
    <content type="html"><![CDATA[<p>Annoyingly, Mac OS X&#8217;s sed is not 100% compatible with GNU sed, and so this solution from StackOverflow did not immediately solve my issue:</p>

<blockquote><p>Or use this solution with sed:<br/>  <code>sed ':a;N;$!ba;s/\n/ /g'</code><br/>This will read the whole file in a loop, then replaces the newline(s) with a space.</p><p>Update: explanation.</p><p><ol><li>create a register via <code>:a</code></li><li>append the current and next line to the register via <code>N</code></li><li>if we are before the last line, branch to the created register <code>$!ba</code> (<code>$!</code> means not to do it on the last line (as there should be one final newline)).</li><li>finally the substitution replaces every newline with a space on the pattern space (which is the contents of the a register = the whole file.</li></ol></p><footer><strong>Zsolt Botykai</strong> <cite><a href='http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n'>Sed: How Can I Replace a Newline (\n)?</a></cite></footer></blockquote>


<p>The solution I found was to split the command up into explicit separate commands:</p>

<figure class='code'><figcaption><span>Replacing newlines with spaces using sed on Mac OS X</span></figcaption><div clang='' id="figure_618326826"><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'>sed -e <span class="s1">&#39;:a&#39;</span> -e <span class="s1">&#39;N&#39;</span> -e <span class="s1">&#39;$!ba&#39;</span> -e <span class="s1">&#39;s/\n/ /g&#39;</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_618326826_alt" style="display:none;"></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress UTF-8 Issues]]></title>
    <link href="http://www.benjiegillam.com/2011/09/octopress-utf-8-issues/"/>
    <updated>2011-09-25T11:23:00+01:00</updated>
    <id>http://www.benjiegillam.com/2011/09/octopress-utf-8-issues</id>
    <content type="html"><![CDATA[<p>After running <code>exitwp</code> to <a href="http://www.benjiegillam.com/2011/09/from-wordpress-to-octopress/">import my blog</a>, I ran <code>rake generate</code> to build it, and got the following issue:</p>

<pre><code>$ rake generate
(in /Users/benjiegillam/Documents/Blog/octopress)
## Generating Site with Jekyll
Configuration from /Users/benjiegillam/Documents/Blog/octopress/_config.yml
unchanged sass/screen.scss
Building site: source -&gt; public
/Users/benjiegillam/Documents/Blog/octopress/plugins/raw.rb:11:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
    from /Users/benjiegillam/Documents/Blog/octopress/plugins/raw.rb:11:in `unwrap'
    [...]
</code></pre>

<p>However, converting the file was perfectly valid UTF-8 as confirmed by an <code>iconv -c</code> conversion followed by a <code>diff -u</code>.</p>

<p>After a quick bit of hacking in the <code>octopress/plugins/raw.rb</code> file to spit out the content that was being converted, I found the file at fault. After some iteration I got to the root of the issue - Octopress&#8217; default markdown parser, <code>rdiscount</code>, REALLY doesn&#8217;t like UTF-8 characters in URLs. I&#8217;ve built a test here:</p>

<!-- more -->




<figure class='code'><figcaption><span>rdiscount UTF-8 URL test (rdiscounttest.rb)</span> <a href='http://www.benjiegillam.com/code/rdiscounttest.rb'>download</a></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='rb'><span class='line'><span class="c1"># encoding: utf-8</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rdiscount&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">print</span> <span class="s2">&quot;Test 1: &quot;</span>
</span><span class='line'><span class="n">markdown</span> <span class="o">=</span> <span class="no">RDiscount</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;http://commons.wikipedia.org/wiki/Image:Dara_Ó_Briain.jpg&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">if</span> <span class="n">markdown</span><span class="o">.</span><span class="n">to_html</span> <span class="o">==</span> <span class="s2">&quot;&lt;p&gt;http://commons.wikipedia.org/wiki/Image:Dara&lt;em&gt;Ó&lt;/em&gt;Briain.jpg&lt;/p&gt;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;PASS&quot;</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="nb">print</span> <span class="s2">&quot;FAIL: &quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">markdown</span><span class="o">.</span><span class="n">to_html</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># Correct: &lt;p&gt;http://commons.wikipedia.org/wiki/Image:Dara&lt;em&gt;Ó&lt;/em&gt;Briain.jpg&lt;/p&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">print</span> <span class="s2">&quot;Test 2: &quot;</span>
</span><span class='line'><span class="n">markdown</span> <span class="o">=</span> <span class="no">RDiscount</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;[Wikipedia](http://commons.wikipedia.org/wiki/Image:Dara_Ó_Briain.jpg)&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">if</span> <span class="n">markdown</span><span class="o">.</span><span class="n">to_html</span> <span class="o">==</span> <span class="s2">&quot;&lt;p&gt;&lt;a href=</span><span class="se">\&quot;</span><span class="s2">http://commons.wikipedia.org/wiki/Image:Dara_%C3%93_Briain.jpg</span><span class="se">\&quot;</span><span class="s2">&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;PASS&quot;</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="nb">print</span> <span class="s2">&quot;FAIL: &quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">markdown</span><span class="o">.</span><span class="n">to_html</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># Incorrect: &lt;p&gt;&lt;a href=&quot;http://commons.wikipedia.org/wiki/Image:Dara_?%93_Briain.jpg&quot;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;</span>
</span><span class='line'><span class="c1"># Note the invalid character (represented by ?)</span>
</span><span class='line'><span class="c1"># Expected: &lt;p&gt;&lt;a href=&quot;http://commons.wikipedia.org/wiki/Image:Dara_%C3%93_Briain.jpg&quot;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It was converting <code>Dara_Ó_Briain.jpg</code> to <code>Dara_?%93_Briain.jpg</code>, where the ? is an invalid UTF-8 character. (Should be <code>Dara_%C3%93_Briain.jpg</code>)</p>

<h2>Solution?</h2>

<p>Annoyingly <code>pandoc</code> (a tool employed by <code>exitwp</code>) seems to be converting the link from <code>Dara_%C3%93_Briain.jpg</code> to <code>Dara_Ó_Briain.jpg</code> in the markdown file, which is then breaking when it is <code>rdiscount</code>ed. As it only affected 2 characters in my entire blog history I&#8217;ve not bothered with an automated fix - I just manually re-encoded the characters. I&#8217;ve commented on <a href="https://github.com/jgm/pandoc/issues/284#issuecomment-2209098">this issue with pandoc</a> so that hopefully they will fix it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[From Wordpress to Octopress]]></title>
    <link href="http://www.benjiegillam.com/2011/09/from-wordpress-to-octopress/"/>
    <updated>2011-09-25T10:09:00+01:00</updated>
    <id>http://www.benjiegillam.com/2011/09/from-wordpress-to-octopress</id>
    <content type="html"><![CDATA[<p>I had a few issues going from Wordpress to Octopress (which I did <a href="https://github.com/thomasf/exitwp">using <code>exitwp</code></a>) - I&#8217;ve outlined
some of my solutions below.</p>

<h2>Crossed out code blocks</h2>

<p>The markdown produced by <code>pandoc</code> (an <code>exitwp</code> dependency) uses <code>~~~~</code> in places to denote a code block. However, <code>rdiscount</code> (Octopress&#8217; markdown parser) recognises this instead as strike-through. A simple <code>bash</code> command fixes this (though it does lose some of the formatting details).</p>

<figure class='code'><figcaption><span>Fix tildes generated by pandoc (exitwptildes.sh)</span> <a href='http://www.benjiegillam.com/code/exitwptildes.sh'>download</a></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='sh'><span class='line'><span class="k">for </span>I in *; <span class="k">do </span>sed -i <span class="s1">&#39;&#39;</span> -e <span class="s1">&#39;s/^~~~~ {\(.*\)}$/\</span>
</span><span class='line'><span class="s1">&lt;!-- \1 --&gt;\</span>
</span><span class='line'><span class="s1">```/g&#39;</span> <span class="nv">$I</span>; <span class="k">done</span>
</span><span class='line'><span class="k">for </span>I in *; <span class="k">do </span>sed -i <span class="s1">&#39;&#39;</span> -e <span class="s1">&#39;s/^~~~~$/\</span>
</span><span class='line'><span class="s1">```/g&#39;</span> <span class="nv">$I</span>; <span class="k">done</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Line breaks in links</h2>

<p>For some reason <code>exitwp</code> added some linebreaks into the markup for the links. And for some other
reason, octopress&#8217; style sheet (<code>screen.css</code>) tells <code>&lt;a&gt;</code> tags that their <code>white-space</code> should be
<code>pre-wrap</code>, these two issues combine to give you broken links.</p>

<p>This next command should fix these newline issues. <!-- more --> (It finds a <code>[</code> with no matching <code>]</code> on the
same line and then removes the newline at the end of said line, being careful not to have two newlines next to one another.)</p>

<figure class='code'><figcaption><span>Fix newlines in links  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="k">for </span>I in <span class="nb">source</span>/*.markdown <span class="nb">source</span>/*/*.markdown; <span class="k">do </span>sed -E -i <span class="s1">&#39;&#39;</span> -e <span class="s1">&#39;:a&#39;</span> -e <span class="s1">&#39;N&#39;</span> -e <span class="s1">&#39;$!ba&#39;</span> -e <span class="s1">&#39;s/\n?(\[[^]]*)\n([\t ]*)/\</span>
</span><span class='line'><span class="s1">\2\1 /g&#39;</span> <span class="s2">&quot;$I&quot;</span>; <span class="k">done</span>
</span></code></pre></td></tr></table></div></figure>


<p>NOTE: You may need to run the above more than once.</p>

<p>Turns out that the above broke some image embeds - no worries - here&#8217;s the solution:</p>

<figure class='code'><figcaption><span>Fix image embeds that were broken by previous command  </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='sh'><span class='line'><span class="k">for </span>I in *; <span class="k">do </span>sed -i <span class="s1">&#39;&#39;</span> -e <span class="s1">&#39;:a&#39;</span> -e <span class="s1">&#39;N&#39;</span> -e <span class="s1">&#39;$!ba&#39;</span> -e <span class="s1">&#39;s/\!\n\[/\![/g&#39;</span> <span class="nv">$I</span>; <span class="k">done</span>;
</span></code></pre></td></tr></table></div></figure>


<h2>Ordered/Unordered Lists</h2>

<p><code>exitwp</code> does not insert newlines before lists, and rdiscount does not always recognise it as a list unless it has a blank newline above it. Simply find the &#8216;1.&#8217; entry and put a blank newline above it.</p>

<h2>Tildes</h2>

<p><code>rdiscount</code> doesn&#8217;t do strikethrough with a single tilde, so it does not need escaping. However <code>exitwp</code> escapes them, so text like ~/Documents/ will become \~/Documents/</p>

<h2>Random quotes</h2>

<p><code>rdiscount</code> and <code>exitwp</code> seem to disagree on indentation - causing <code>rdiscount</code> to render indentation (sometimes) as a quote rather than continuation of the text.</p>

<h2>URLs with brackets in</h2>

<p><code>exitwp</code> or <code>pandoc</code> do not correctly escape (with a backslash) brackets within links, so captions/etc may be broken. Simply add in the backslashes.</p>

<h2>/blog/archives/</h2>

<p>I was looking for a line in <code>_config.yml</code> to configure the archives. Turns out it&#8217;s actually the file <code>source/blog/archives/index.html</code> that needs to move - I moved this to <code>source/archives/index.html</code></p>

<figure class='code'><figcaption><span>Change /blog/archives/ to just /archives/  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'>mv <span class="nb">source</span>/blog/archives <span class="nb">source</span>/
</span><span class='line'>rmdir <span class="nb">source</span>/blog/
</span></code></pre></td></tr></table></div></figure>


<p>And then updated the navigation <code>source/_includes/custom/navigation.html</code></p>

<h2>Hosting on S3</h2>

<p>I followed <a href="http://www.ianwootten.co.uk/2011/09/09/hosting-an-octopress-blog-on-amazon-s3">these instructions</a> from Ian Wootten (which reference <a href="http://www.jerome-bernard.com/blog/2011/08/20/quick-tip-for-easily-deploying-octopress-blog-on-amazon-s3/">these instructions</a> by Jerome Bernard) - thanks!</p>

<h2><em>Disclaimer</em></h2>

<p>This code in this post worked for me, but it is quite dumb - you will need to check the changes it
makes are good (this is where <code>git diff</code> comes in handy - make sure to commit before running these
commands!)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[NodeJS: Express/Socket.io/RedisStore headache]]></title>
    <link href="http://www.benjiegillam.com/2011/09/nodejs-expresssocket-ioredisstore-headache/"/>
    <updated>2011-09-02T17:35:59+01:00</updated>
    <id>http://www.benjiegillam.com/2011/09/nodejs-expresssocket-ioredisstore-headache</id>
    <content type="html"><![CDATA[<p>If you&#8217;re trying to access a session from a socket.io socket, I
recommend following
<a href="http://www.danielbaulig.de/socket-ioexpress/">these instructions</a> which work
great for <code>MemoryStore</code>. However for <code>RedisStore</code> you need to do a
little more work because the object returned is just a JSON object - not
a <code>Session</code> object as it should be. I&#8217;ve hacked around it by adding the
following (CoffeeScript) to convert it to a <code>Session</code> object if
required:</p>

<figure class='code'><figcaption><span class="switchLang"><a class="switchLang selected" onclick="switchLang(event,this,'figure_767763871');">.coffee</a><a class="switchLang" onclick="switchLang(event,this,'figure_767763871');">.js</a></span><span>Make sure &#8216;session&#8217; is a Session object</span></figcaption><div clang='CoffeeScript' id="figure_767763871"><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='coffee-script'><span class='line'><span class="k">if</span> <span class="nx">session</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">session</span><span class="p">.</span><span class="nx">prototype</span><span class="o">?</span><span class="p">.</span><span class="nx">reload</span>
</span><span class='line'>    <span class="nv">req =</span>
</span><span class='line'>        <span class="nv">sessionStore: </span><span class="nx">sessionStore</span>
</span><span class='line'>        <span class="nv">sessionID: </span><span class="nx">data</span><span class="p">.</span><span class="nx">sessionID</span>
</span><span class='line'>    <span class="nv">session = </span><span class="k">new</span> <span class="nx">express</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">Session</span> <span class="nx">req</span><span class="p">,</span> <span class="nx">session</span>
</span></code></pre></td></tr></table></div></div><div clang='JavaScript' id="figure_767763871_alt" style="display:none;"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">req</span><span class="p">,</span> <span class="nx">session</span><span class="p">,</span> <span class="nx">_ref</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">session</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="p">((</span><span class="nx">_ref</span> <span class="o">=</span> <span class="nx">session</span><span class="p">.</span><span class="nx">prototype</span><span class="p">)</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="nx">_ref</span><span class="p">.</span><span class="nx">reload</span> <span class="o">:</span> <span class="k">void</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">req</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">sessionStore</span><span class="o">:</span> <span class="nx">sessionStore</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">sessionID</span><span class="o">:</span> <span class="nx">data</span><span class="p">.</span><span class="nx">sessionID</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="nx">session</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">express</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">Session</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">session</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></div></figure>


<p>immediately inside the <code>sessionStore.get</code> callback.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Node.JS: Clean Restart and Faster Development with nodemon]]></title>
    <link href="http://www.benjiegillam.com/2011/08/node-js-clean-restart-and-faster-development-with-nodemon/"/>
    <updated>2011-08-31T16:35:22+01:00</updated>
    <id>http://www.benjiegillam.com/2011/08/node-js-clean-restart-and-faster-development-with-nodemon</id>
    <content type="html"><![CDATA[<p>If you&#8217;re using <code>nodemon</code> to automatically restart your node/coffee
server process when the source code changes (and if you&#8217;re not, why
not?), you may find (as I did) that it can kill the script quite
abruptly. If you want to do something when the code shuts down (close
connections, flush to database/disk/redis/memcached, etc) then you can
do so by intercepting the <code>SIGUSR2</code> signal that <code>nodemon</code> uses to kill
your script, and then setting up these actions. Once these actions are
complete, you can exit but <code>nodemon</code> will see that as a crash and stop
restarting. So you then have to kill your app again with <code>SIGUSR2</code>.
Here&#8217;s the solution I use in CoffeeScript (click Toggle for JavaScript):</p>

<figure class='code'><figcaption><span class="switchLang"><a class="switchLang selected" onclick="switchLang(event,this,'figure_739413644');">.coffee</a><a class="switchLang" onclick="switchLang(event,this,'figure_739413644');">.js</a></span><span>Cleanly restart on nodemon SIGUSR2 (.coffee)</span></figcaption><div clang='CoffeeScript' id="figure_739413644"><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='coffee-script'><span class='line'><span class="c1"># Alias for setTimeout that reorders parameters to look neater in CoffeeScript</span>
</span><span class='line'><span class="nv">delay = </span><span class="nf">(ms, cb) -&gt;</span> <span class="nx">setTimeout</span> <span class="nx">cb</span><span class="p">,</span> <span class="nx">ms</span>
</span><span class='line'><span class="c1"># Handle SIGUSR2, but only once</span>
</span><span class='line'><span class="nx">process</span><span class="p">.</span><span class="nx">once</span> <span class="s">&#39;SIGUSR2&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;Doing shutdown tasks...&#39;</span>
</span><span class='line'>  <span class="nx">delay</span> <span class="mi">5000</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;All done, exiting&#39;</span>
</span><span class='line'>    <span class="c1"># Kill ourself with the SIGUSR2 signal again</span>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">kill</span> <span class="nx">process</span><span class="p">.</span><span class="nx">pid</span><span class="p">,</span> <span class="s">&#39;SIGUSR2&#39;</span>
</span><span class='line'><span class="c1"># This next line just to prevent the app exiting in case you want to use this as a demo</span>
</span><span class='line'><span class="nx">delay</span> <span class="mi">99999999</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;App exiting naturally&#39;</span>
</span></code></pre></td></tr></table></div></div><div clang='JavaScript' id="figure_739413644_alt" style="display:none;"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">delay</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">delay</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ms</span><span class="p">,</span> <span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">cb</span><span class="p">,</span> <span class="nx">ms</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">process</span><span class="p">.</span><span class="nx">once</span><span class="p">(</span><span class="s1">&#39;SIGUSR2&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Doing shutdown tasks...&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">delay</span><span class="p">(</span><span class="mi">5000</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;All done, exiting&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">process</span><span class="p">.</span><span class="nx">kill</span><span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">pid</span><span class="p">,</span> <span class="s1">&#39;SIGUSR2&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">delay</span><span class="p">(</span><span class="mi">99999999</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;App exiting naturally&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></div></figure>


<p>By the way, to install nodemon globally: <code>sudo npm install -g nodemon</code></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to interface your Cocoa app with Skype]]></title>
    <link href="http://www.benjiegillam.com/2011/08/how-to-interface-your-cocoa-app-with-skype/"/>
    <updated>2011-08-25T15:22:02+01:00</updated>
    <id>http://www.benjiegillam.com/2011/08/how-to-interface-your-cocoa-app-with-skype</id>
    <content type="html"><![CDATA[<p><strong>Update: </strong> Give up now. Skype
<a href="http://forum.skype.com/index.php?showtopic=820705">never</a>
<a href="https://jira.skype.com/browse/SPA-749">responds</a> to the
<code>[SkypeAPI connect]</code> method!</p>

<p>Original post follows:</p>

<!-- more -->


<p>(Mac OS X only, works on Lion, Xcode 4.1,
Skype 5.3)</p>

<p>Here are the steps to starting work on interfacing a Cocoa
app with Skype:</p>

<ol>
<li><p>Don&#8217;t try and get the framework from the documentation (what the hell?!
Invalid link? PowerPC issues? Come on Skype!)</p></li>
<li><p>Copy <code>Skype.framework</code> into your app&#8217;s folder from within Skype (find
the Skype app, control-click and Show Package Contents)</p></li>
<li><p>Drag your copy of <code>Skype.framework</code> into the <code>Frameworks</code> folder of your
Xcode project.</p></li>
<li><p>In Project -> Target -> Build Phases:</p>

<ol>
<li>Ensure Link Binary with Libraries contains <code>Skype.framework</code></li>
<li>Add a new build phase (Editor -> Add Build Phase -> New Copy Files
Build Phase), set the destination to Frameworks, the Subpath blank,
and drag <code>Skype.framework</code> here from your <code>Frameworks</code> group.</li>
</ol>
</li>
<li><p>In the relevant source file add</p></li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div clang='' id="figure_493811659"><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='objc'><span class='line'><span class="cp">#include &lt;Skype/Skype.h&gt;</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_493811659_alt" style="display:none;"></div></figure>


<ol>
<li>Code your app. You might want to start with the following:</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div clang='' id="figure_895085418"><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='objc'><span class='line'><span class="k">if</span> <span class="p">([</span><span class="n">SkypeAPI</span> <span class="n">isSkypeRunning</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Skype is running.&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_895085418_alt" style="display:none;"></div></figure>


<p>Hopefully that&#8217;ll get you started a bit faster than I did! API
documentation can be found here:
<a href="https://developer.skype.com/resources/public_api_ref.zip" title="Skype Accessory API">https://developer.skype.com/resources/public_api_ref.zip</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Manually Migrating FileVault]]></title>
    <link href="http://www.benjiegillam.com/2011/07/manually-migrating-filevault/"/>
    <updated>2011-07-22T01:00:34+01:00</updated>
    <id>http://www.benjiegillam.com/2011/07/manually-migrating-filevault</id>
    <content type="html"><![CDATA[<p><strong>DISCLAIMER</strong>: As always, you follow this at your own risk - keep good
backups, I take no responsibility for you doing anything whatsoever -
you&#8217;re a big boy/girl now, take responsibility for your own actions!</p>

<p>So you can&#8217;t use MigrationAssistant because you already have an account
(<code>Alice</code>) on the new machine (<code>New</code>) and don&#8217;t have the disk space on the
old one (<code>Old</code>) to turn FV off? Fear not! Let&#8217;s assume the username you
want to move is <code>steve</code>:</p>

<ol>
<li>As <code>Alice</code>, create (admin) account on <code>New</code> with
same username, <code>steve</code>, and same password, and enable FileVault.</li>
<li>Replace <code>/Users/steve/steve.sparsebundle</code> on <code>New</code> with
<code>/Users/.steve/steve.sparsebundle</code> from <code>Old</code>. (you could use <code>scp</code>, <code>rsync</code>, an
external hard drive, or any other method to transfer these files) (I did
this with <code>steve</code> logged in, but you can do it logged out though the path
may be different)</li>
<li>As <code>Alice</code>, fix the permissions on <code>New</code>: <code>chown -R steve /Users/steve</code></li>
<li>Log in as <code>steve</code> on <code>New</code> (unlocks the sparsebundle
and mounts it at <code>/Users/steve</code>)</li>
<li>Fix permissions again: either as <code>Alice</code>
or <code>steve</code>, <code>sudo chown -R steve /Users/steve</code></li>
<li>Log out an in again Voila!</li>
</ol>


<p>If this helps you, please drop me a comment :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript: Defining a window level function with eval()]]></title>
    <link href="http://www.benjiegillam.com/2011/04/javascript-defining-a-window-level-function-with-eval/"/>
    <updated>2011-04-14T13:05:39+01:00</updated>
    <id>http://www.benjiegillam.com/2011/04/javascript-defining-a-window-level-function-with-eval</id>
    <content type="html"><![CDATA[<p>You know the old mantra: <code>eval</code> is evil! Well, maybe, but I hate writing
lots of code, and I like my debugging to be simple. I wanted to write a
shorter way to extend a parent class into a child class. Long way (too
much repeated code/risk of copy &amp; paste errors):</p>

<figure class='code'><figcaption><span>Long winded: manually creating each class from scratch</span></figcaption><div clang='' id="figure_242896602"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Root class</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">MyClass</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create first subclass</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">MyChildClass1</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">MyChildClass1</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyClass</span><span class="p">();</span>
</span><span class='line'><span class="nx">MyChildClass1</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">parent</span> <span class="o">=</span> <span class="nx">MyClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'><span class="nx">MyChildClass1</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">MyChildClass1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create second subclass</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">MyChildClass2</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">MyChildClass2</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyClass</span><span class="p">();</span>
</span><span class='line'><span class="nx">MyChildClass2</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">parent</span> <span class="o">=</span> <span class="nx">MyClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'><span class="nx">MyChildClass2</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">MyChildClass2</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create an instance</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyChildClass2</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_242896602_alt" style="display:none;"></div></figure>


<p>Shorter way (gives wrong output on <code>console.log()</code>):</p>

<!--more-->




<figure class='code'><figcaption><span>Shorter, but class names are console.log&#8217;d incorrectly</span></figcaption><div clang='' id="figure_561494132"><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='javascript'><span class='line'><span class="c1">// Automation function</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">NS_Extend</span><span class="p">(</span><span class="nx">parentClass</span><span class="p">,</span><span class="nx">childClassName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">childClass</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span><span class="k">return</span> <span class="k">this</span><span class="p">;}</span>
</span><span class='line'>  <span class="nx">childClass</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">parentClass</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">childClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">parent</span> <span class="o">=</span> <span class="nx">parentClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">childClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">childClass</span><span class="p">;</span>
</span><span class='line'>  <span class="nb">window</span><span class="p">[</span><span class="nx">childClassName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">childClass</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Root Class</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">MyClass</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// First subclass</span>
</span><span class='line'><span class="nx">NS_Extend</span><span class="p">(</span><span class="nx">MyClass</span><span class="p">,</span><span class="s1">&#39;MyChildClass1&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Second subclass</span>
</span><span class='line'><span class="nx">NS_Extend</span><span class="p">(</span><span class="nx">MyClass</span><span class="p">,</span><span class="s1">&#39;MyChildClass2&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create an instance</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyChildClass2</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_561494132_alt" style="display:none;"></div></figure>


<p>Simple, but when I <code>console.log(instance)</code> it gives me
<code>NS_Extend.childClass</code> as the name of the class, rather than
<code>MyChildClass2</code> as was done previously. It makes no difference to the
functionality of the app, but it makes my debugging a bit harder. And I
really don&#8217;t want to have to keep defining
<code>function ClassName(){return this;}</code> everywhere - waste of time typing
all that repeated code! So I figured I&#8217;d define the function through
<code>eval()</code>. However that didn&#8217;t work, until I realised that <code>eval()</code> is
scoped to the current context. So to define a window level function we&#8217;d
need to change the scope to the <code>window</code> object. Easy enough with
JavaScript&#8217;s <code>.call()</code> method. The solution:</p>

<figure class='code'><figcaption><span>Eval isn&#8217;t always evil: Fixing the console.log class names.</span></figcaption><div clang='' id="figure_799295626"><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">MyClass</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">NS_Extend</span><span class="p">(</span><span class="nx">parentClass</span><span class="p">,</span><span class="nx">childClassName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">js</span> <span class="o">=</span> <span class="s1">&#39;function &#39;</span><span class="o">+</span><span class="nx">childClassName</span><span class="o">+</span><span class="s1">&#39;(){return this;}&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nb">eval</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nb">window</span><span class="p">,</span><span class="nx">js</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">childClass</span> <span class="o">=</span> <span class="nb">window</span><span class="p">[</span><span class="nx">childClassName</span><span class="p">];</span>
</span><span class='line'>  <span class="nx">childClass</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">parentClass</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">childClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">parent</span> <span class="o">=</span> <span class="nx">parentClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">childClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">constructor</span> <span class="o">=</span> <span class="nx">childClass</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">NS_Extend</span><span class="p">(</span><span class="nx">MyClass</span><span class="p">,</span><span class="s1">&#39;MyChildClass1&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">NS_Extend</span><span class="p">(</span><span class="nx">MyClass</span><span class="p">,</span><span class="s1">&#39;MyChildClass2&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyChildClass2</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_799295626_alt" style="display:none;"></div></figure>


<p>Now when I <code>console.log(instance)</code> it tells me <code>MyChildClass2</code> - WIN!</p>

<p>[I use Chrome under Linux, by the way.]</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Backup Your Logs to S3]]></title>
    <link href="http://www.benjiegillam.com/2010/12/backup-your-logs-to-s3/"/>
    <updated>2010-12-13T15:17:42+00:00</updated>
    <id>http://www.benjiegillam.com/2010/12/backup-your-logs-to-s3</id>
    <content type="html"><![CDATA[<p>We&#8217;ve got an auto-scaling EC2 setup, so servers can appear and disappear
at will, each with random IP addresses. We want to store the apache
error/access logs (or system logs) from these servers for later
debugging and analysis, but nothing else on them matters (they&#8217;re
basically read only, except the logging). How should we store these?</p>

<p>Seems like a simple problem, there must be a simple solution? Here are the existing options:</p>

<!-- more -->


<ul>
<li><strong>syslog-ng</strong> or <strong>rsyslogd</strong> logging to a central location.

<ul>
<li>Pros: centralized logs, easy to analyse, near to real time</li>
<li>Cons: Requires extra dedicated server (costs). Have to extend
storage or upload to S3 periodically. PITA setup from a security POV
unless you know the IP addresses in advance (you can set up your own
CA and generate a number of SSL keys and distribute these to the
servers on startup and use TLS encrypted communications, but I
really CBA with all that hassle - not to mention that last time I
checked Amazon Linux didn&#8217;t support these servers <abbr title="Out of the box">OOTB</abbr> so I&#8217;d have
to install them from a CentOS RPM or similar)</li>
</ul>
</li>
<li><strong>Message queuing</strong>

<ul>
<li>(I don&#8217;t think this is a perfect match)</li>
</ul>
</li>
<li><strong>Hadoop cluster</strong>

<ul>
<li>Pros: awesome data crunching ability</li>
<li>Cons: we don&#8217;t have 10million users yet, I think this is a bit
heavy handed (not to mention expensive)</li>
</ul>
</li>
<li><strong>Scribe</strong> from Facebook

<ul>
<li>Cons: too much setup, requires specific server heirarchy.</li>
</ul>
</li>
<li><strong>logg.ly</strong> and <strong>splunk</strong>

<ul>
<li>Cons: too expensive/untested/unknown for now</li>
</ul>
</li>
<li><strong>Something else</strong>&#8230;</li>
</ul>


<p>I chose &#8220;something else&#8221; - a custom solution using logrotate to upload
the logs to S3 on a per server basis. Here&#8217;s how I did it (and how you
can do it too) You&#8217;ll need:</p>

<ul>
<li><code>/usr/local/bin/s3uploadfile</code> <a href="http://www.benjiegillam.com/code/s3uploadfile">download</a> - a script that uploads a file to
S3&#8230;</li>
<li><code>/etc/init.d/s3logrotate</code> <a href="http://www.benjiegillam.com/code/s3logrotate">download</a> - an init script to trigger <code>logrotate</code> to be called (twice) on server shutdown</li>
<li><code>/usr/local/bin/s3logrotated</code> <a href="http://www.benjiegillam.com/code/s3logrotated">download</a> - a callback script to call when a log
has been rotated (process the logrotate message and calls
<code>s3uploadfile</code> to upload the log to S3)</li>
<li><code>/root/.s3env</code> - a simple bash script to export your s3 credentials
for <code>s3uploadfile</code> to work</li>
</ul>


<figure class='code'><figcaption><span>/root/.s3env</span></figcaption><div clang='' id="figure_92552423"><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='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'><span class="nb">export </span><span class="nv">S3BUCKETNAME</span><span class="o">=</span><span class="s1">&#39;MyBucketNameHere&#39;</span>
</span><span class='line'><span class="nb">export </span><span class="nv">AWS_ACCESS_KEY_ID</span><span class="o">=</span><span class="s1">&#39;MyKeyHere&#39;</span>
</span><span class='line'><span class="nb">export </span><span class="nv">AWS_SECRET_ACCESS_KEY</span><span class="o">=</span><span class="s1">&#39;MySecretHere&#39;</span>
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_92552423_alt" style="display:none;"></div></figure>


<p><strong>Step 1</strong>: Create your dedicated server log S3 bucket (if you haven&#8217;t
already)</p>

<p><strong>Step 2</strong>: Download and install the scripts above to the
locations above, including <code>/root/.s3env</code> and then make them all executable (<code>chmod +x [file]</code>)</p>

<p><strong>Step 3</strong>: Modify the relevant logrotate scripts to use <code>s3logrotated</code>
callback and add <code>s3logrotate</code> to the server <code>rc*.d</code> scripts. When
configuring <code>logrotate</code>: don&#8217;t use <code>dateext</code>, do use <code>compress</code>, do use
<code>delaycompress</code>, do use <code>sharedscripts</code>. Here&#8217;s what I use:</p>

<figure class='code'><figcaption><span>Commands I run to configure logrotate/etc, REQUIRE MODIFICATION</span></figcaption><div clang='' id="figure_266651924"><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='bash'><span class='line'><span class="c"># This is what I used, you will need to customize this for your own servers</span>
</span><span class='line'>sed -i /etc/logrotate.conf -e <span class="s1">&#39;s/^dateext$/#dateext/;s/^weekly$/daily/;s/^rotate 4$/rotate 15/;s/^#compress$/compress/&#39;</span>
</span><span class='line'>sed -i /etc/logrotate.d/httpd -e <span class="s1">&#39;s/^\([ \t]*endscript\)/\t\/usr\/local\/bin\/s3logrotated &quot;.2.gz&quot; &quot;\$1&quot;\n\1/&#39;</span>
</span><span class='line'>sed -i /etc/logrotate.d/syslog -e <span class="s1">&#39;s/^\([ \t]*sharedscripts\)/\1\n    delaycompress/;s/^\([ \t]*endscript\)/\t\/usr\/local\/bin\/s3logrotated &quot;.2.gz&quot; &quot;\$1&quot;\n\1/&#39;</span>
</span><span class='line'><span class="c"># This is the centos command to add the s3logrotate script (it contains the levels configuration within it) - </span>
</span><span class='line'><span class="c"># you&#39;ll want to update-rc.d or similar on debian/ubuntu hosts.</span>
</span><span class='line'>chkconfig --add s3logrotate
</span></code></pre></td></tr></table></div></div><div clang='' id="figure_266651924_alt" style="display:none;"></div></figure>


<p>Note that the <code>".2.gz"</code> is because of <code>compress</code> and <code>delaycompress</code> -
it is the first compressed log file. This is why we need
<code>/etc/init.d/s3logrotate</code> to run &#8221;<code>logrotate -f</code>&#8221; twice on server
shutdown.</p>

<p><strong>Step 4</strong>: Analytics I suppose, but I leave that as an
exercise for the reader. I hope this helps someone - if it does, let me
know in the comments. If you want any help setting it up (or
understanding how it works) then just shoot me an email or leave me a
comment.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dear Virgin Media...]]></title>
    <link href="http://www.benjiegillam.com/2010/10/dear-virgin-media/"/>
    <updated>2010-10-06T10:30:38+01:00</updated>
    <id>http://www.benjiegillam.com/2010/10/dear-virgin-media</id>
    <content type="html"><![CDATA[<p>I think I <strong>do</strong> have fibre optic at my house already, even though it does
not show up on your system. The previous resident had V+HD, and they
left their equipment, so I&#8217;ve plugged it in to show the system working:</p>

<!-- more -->


<p>The cable comes out of the wall:</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot842.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot842-202x300.jpg" title="screenshot842" alt="image" /></a></p>

<p>And then via a splitter:</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot843.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot843.jpg" title="screenshot843" alt="image" /></a>
<a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot844.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot844-300x142.jpg" title="screenshot844" alt="image" /></a></p>

<p>To the V+HD box:</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot845.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot845-300x107.jpg" title="screenshot845" alt="image" /></a>
<a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot846.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot846-300x181.jpg" title="screenshot846" alt="image" /></a>
<a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot847.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot847-300x194.jpg" title="screenshot847" alt="image" /></a></p>

<p>Note that the &#8220;online&#8221; LED is lit up, suggesting the system might be
online? And the modem:</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot848.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot848-300x195.jpg" title="screenshot848" alt="image" /></a></p>

<p>(it&#8217;s not clear here because my flash drowned it out, but the &#8220;enet&#8221;,
&#8220;sync&#8221; and &#8220;ready&#8221; indicators are all green, and the &#8220;recv&#8221; and &#8220;send&#8221;
indicators flash when I load the website below.)</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot849.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot849-300x254.jpg" title="screenshot849" alt="image" /></a></p>

<p>(It&#8217;s an ambit 256 modem)</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot852.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot852-300x143.jpg" title="screenshot852" alt="image" /></a></p>

<p>(Note that <strong>cable</strong> plugs in the back.) Here&#8217;s what happens when I
connect my laptop to the modem:</p>

<ol>
<li>I am given an IP address of
213.107.40.198 (I have proof this is an NTL/Virgin Media IP address at
the bottom of the post)</li>
</ol>


<!-- style="color:green;font-weight:bold;" -->


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>jem@jem-laptop:~$ ifconfig
</span><span class='line'>eth0      Link encap:Ethernet  HWaddr 00:22:15:8f:a5:50  
</span><span class='line'>          inet addr:&lt;strong&gt;213.107.40.198&lt;/strong&gt;  Bcast:213.107.40.255  Mask:255.255.255.0
</span><span class='line'>          inet6 addr: fe80::222:15ff:fe8f:a550/64 Scope:Link
</span><span class='line'>          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
</span><span class='line'>          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
</span><span class='line'>          TX packets:43 errors:0 dropped:0 overruns:0 carrier:2
</span><span class='line'>          collisions:0 txqueuelen:1000 
</span><span class='line'>          RX bytes:2606 (2.6 KB)  TX bytes:9440 (9.4 KB)
</span><span class='line'>          Interrupt:28 
</span><span class='line'>lo        Link encap:Local Loopback  
</span><span class='line'>          inet addr:127.0.0.1  Mask:255.0.0.0
</span><span class='line'>          inet6 addr: ::1/128 Scope:Host
</span><span class='line'>          UP LOOPBACK RUNNING  MTU:16436  Metric:1
</span><span class='line'>          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
</span><span class='line'>          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
</span><span class='line'>          collisions:0 txqueuelen:0 
</span><span class='line'>          RX bytes:800 (800.0 B)  TX bytes:800 (800.0 B)
</span></code></pre></td></tr></table></div></figure>


<ol>
<li>I am taken to the following screen, asking me to activate broadband
 <a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot853.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot853-1024x192.jpg" title="screenshot853" alt="image" /></a></li>
<li>When I click the link, it asks me to choose between Virgin Media and
ntl/telewest
 <a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot854.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot854-1024x249.jpg" title="screenshot854" alt="image" /></a></li>
<li><p>I choose virginmedia and the page asks me to phone you:
 <a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot855.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot855.jpg" title="screenshot855" alt="image" /></a></p>

<p> Here&#8217;s what I see from the V+HD box:</p>

<p> <a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot856.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot856-300x216.jpg" title="screenshot856" alt="image" /></a>
 <a href="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot857.jpg"><img src="http://www.benjiegillam.com/wp-content/uploads/2010/10/screenshot857-300x128.jpg" title="screenshot857" alt="image" /></a></p></li>
</ol>


<p>Here&#8217;s a
<a href="http://www.youtube.com/watch?v=CQ38AfIRWns">video of the V+HD box in action</a>, showing the
terrestrial channels delivered over cable, but the premium channels
cannot be viewed because I don&#8217;t have a subscription: The radio channels
also work for me through the V+HD box as I guess they are unprotected.</p>

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


<p><strong>In conclusion: please believe me now that I do in fact already have
fibre optic at this house and let me sign up!</strong></p>

<hr />

<p>Proof that the IP address I was given is a Virgin Media (NTL) address:</p>

<pre><code>$ whois 213.107.40.198
% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Note: This output has been filtered.
%       To receive output for a database update, use the "-B" flag.

% Information related to '213.107.40.0 - 213.107.45.255'

inetnum:        213.107.40.0 - 213.107.45.255
netname:        NTL-BIA-LONDON-BROMLEY
descr:          NTL Infrastructure - Southampton
country:        GB
admin-c:        NNMC1-RIPE
tech-c:         NNMC1-RIPE
status:         ASSIGNED PA
mnt-by:         AS5089-MNT
source:         RIPE # Filtered

role:           NTLI Network Management Centre
address:        NTL Internet
address:        Crawley Court
address:        Winchester
address:        Hampshire
address:        SO21 2QA
phone:          +44 1633710142
admin-c:        MH22007-RIPE
admin-c:        NR731-RIPE
admin-c:        CW1083-RIPE
tech-c:         MH22007-RIPE
tech-c:         CW1083-RIPE
nic-hdl:        NNMC1-RIPE
mnt-by:         AS5089-MNT
e-mail:         pim@virginmedia.co.uk
source:         RIPE # Filtered

% Information related to '213.104.0.0/14AS5089'

route:        213.104.0.0/14
descr:        NTL-UK-IP-BLOCK-4
origin:       AS5089
mnt-by:       AS5089-MNT
source:       RIPE # Filtered

% Information related to '213.107.0.0/16AS5089'

route:        213.107.0.0/16
descr:        NTL-UK-IP-BLOCK
origin:       AS5089
mnt-by:       AS5089-MNT
source:       RIPE # Filtered

% Information related to '213.107.0.0/17AS5089'

route:        213.107.0.0/17
descr:        NTL-UK-IP-BLOCK
origin:       AS5089
mnt-by:       AS5089-MNT
source:       RIPE # Filtered
</code></pre>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iPhone Music and Sound Effects in Parallel]]></title>
    <link href="http://www.benjiegillam.com/2010/04/iphone-music-and-sound-effects-in-parallel/"/>
    <updated>2010-04-06T14:49:55+01:00</updated>
    <id>http://www.benjiegillam.com/2010/04/iphone-music-and-sound-effects-in-parallel</id>
    <content type="html"><![CDATA[<p>I was trying to find out how to use
<code>[MPMusicPlayerController iPodMusicPlayer]</code> and <code>AVAudioPlayer</code> in parallel. I&#8217;d read before that I&#8217;d
need Audio Sessions, but the documentation for that was huge and
confusing. Fortunately Andrew pointed me at
<a href="http://www.sputnikgames.com/blog/?p=14" title="iPhone games and iPod Music">this post</a>
from Mark at Sputnik Games which solved my issue immediately just by
copying and pasting 14 lines of code into the
<code>applicationDidFinishLaunching</code> method of my application delegate (see
below). Sputnik Games&#8217; blog doesn&#8217;t seem to support comments, so I
thought I&#8217;d buy his latest game,
<a href="http://www.sputnikgames.com/aerolite_iphone_game.htm">Aerolite</a>, and
write this post to show my appreciation. Thanks Mark!</p>

<figure class='code'><figcaption><span>Add to applicationDidFinishLaunching to enable music & sound effects at the same time  </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='objc'><span class='line'><span class="n">OSStatus</span> <span class="n">result</span> <span class="o">=</span> <span class="n">AudioSessionInitialize</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">self</span><span class="p">);</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Init error, handle error here</span>
</span><span class='line'><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">UInt32</span> <span class="n">category</span> <span class="o">=</span> <span class="n">kAudioSessionCategory_AmbientSound</span><span class="p">;</span>
</span><span class='line'>  <span class="n">result</span> <span class="o">=</span> <span class="n">AudioSessionSetProperty</span><span class="p">(</span><span class="n">kAudioSessionProperty_AudioCategory</span><span class="p">,</span>
</span><span class='line'>                                    <span class="k">sizeof</span><span class="p">(</span><span class="n">category</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">category</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// set audio session error, handle error here</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">result</span> <span class="o">=</span> <span class="n">AudioSessionSetActive</span><span class="p">(</span><span class="n">true</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// Set audio session active error, handle error here</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>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[MythPyWii - now on Google Code]]></title>
    <link href="http://www.benjiegillam.com/2010/01/mythpywii-now-on-google-code/"/>
    <updated>2010-01-04T19:58:10+00:00</updated>
    <id>http://www.benjiegillam.com/2010/01/mythpywii-now-on-google-code</id>
    <content type="html"><![CDATA[<p>Fancy <a href="http://code.google.com/p/mythpywii/">submitting to MythPyWii</a>?
Let me know! It&#8217;s now on Google Code. Code, documentation, bugs,
bugfixes, etc all welcome!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[N900: first impressions]]></title>
    <link href="http://www.benjiegillam.com/2009/12/n900-first-impressions/"/>
    <updated>2009-12-19T10:18:39+00:00</updated>
    <id>http://www.benjiegillam.com/2009/12/n900-first-impressions</id>
    <content type="html"><![CDATA[<p><strong><em>This post is part 2 of a three part series. You may also be
interested in:
<a href="http://www.benjiegillam.com/2009/12/n900-the-tale-of-the-indestructible-box/">Part 1: N900: the tale of the indestructible box</a>
Part 3: N900: a phone for hackers? (coming soon&#8230;)</em></strong></p>

<p>After
<a href="http://www.benjiegillam.com/2009/12/n900-the-tale-of-the-indestructible-box/">conquering the indestructible box</a>
and charging the N900 I decided to have a quick play. I watched the
getting started video which I found to be both beautifully smooth,
showing off the high definition of the N900 screen immediately, and
somewhat slow content-wise.</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4230.JPG"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4230-300x121.jpg" title="G1 (top), N900 (left), iPhone 3GS (right)" alt="G1 (top), N900 (left), iPhone 3GS (right)" /></a></p>

<p>The N900 is similar in width and height to the
<a href="http://www.apple.com/iphone" title="iPhone">iPhone</a> but <!--more --> is much greater in
depth at 1.8cm - just a millimetre deeper than the G1. This is not
surprising due to it&#8217;s hard keyboard and more advanced hardware.</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4219.JPG"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4219-300x57.jpg" title="G1 (back), N900 (left), iPhone 3GS (right)" alt="G1 (back), N900 (left), iPhone 3GS (right)" /></a></p>

<p>The first thing that struck me about the N900 (other than how high
definition the hands were in the famous Nokia splash video!) was how
much force it required to press on the screen. The iPhone (my current
primary phone because I develop iPhone fitness apps) only requires the
lightest of touches; whilst the
<a href="http://en.wikipedia.org/wiki/HTC_Dream" title="HTC Dream">Android G1</a> (my wife&#8217;s
phone) requires a bit more. I later discovered the reason for this
heavier interface was probably the stylus (which I discovered
accidentally while interrogating the outside of the device), which is
great to use - reminds me of my old iPaqs only much much higher
resolution and more responsive! I noticed that every time I touched the
screen firmly enough the phone would do a very small vibration in the
way of
<a href="http://en.wikipedia.org/wiki/Haptic_technology" title="Haptic technology">haptic feedback</a>.
This would be good if it weren&#8217;t for the fact that it does it <strong>every</strong>
time, and not only the times when your touch actually triggers an action
(opening a menu, etc) - this is becoming more annoying than useful.
Because of the devices HD screen I found it quite hard to be exact with
my touches (my thumbs must be almost 200 pixels wide on that screen!)
though the interface deals with this well by using large touch areas.
After failing at playing Marbles (a pre-installed game with small touch
areas) for a minute or so I quickly learned where the device thought my
presses were and the device became even easier to use. (Sure this would
have been much easier with a stylus but I hadn&#8217;t discovered that yet!)
The web browser is a pleasure to use, though it appears to support in
page Flash which I personally hate - especially on a small screen mobile
device. I went to YouTube to see how it handles and &#8220;very well&#8221; was the
answer. The device supports the double tap to zoom in to a region of
text paradigm of Safari on the iPhone though it obviously lacks the
multi-touch pinch and zoom.</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/IMG_0231-2.JPG"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/IMG_0231-2-300x148.jpg" title="N900 vs G1" alt="N900 vs G1" /></a></p>

<p>Pressing play on a YouTube video, I wished to turn the volume up and so
I pressed the volume rocker on the outside of the phone. This
surprisingly zoomed the web page (very smoothly!) but not the volume - a
useful feature but definitely not what I had expected. I attempted to
change the volume using the YouTube Flash control but could not drag the
slider up as my fingers were too fat and dragging scrolled the page. (I
hadn&#8217;t discovered the stylus at this time but have since attempted with
they stylus with the same result.) To change the volume I had to click
the web page, click the &#8220;toggle fullscreen&#8221; button at the bottom right,
the status icons at the top and then drag the volume slider. Not too
hard, but certainly more effort than just using the volume rocker - the
video would play on a good few seconds more before you can change the
volume and get back to it. Perhaps there&#8217;s a better way of doing it, but
this is a &#8220;first impressions&#8221; post so I feel I should stick to first
impressions! One very cool feature of the N900 is how blazingly fast the
screen lock/unlock is. There&#8217;s a sprung switch on the right side of the
phone which when you flick it will lock or unlock the screen seemingly
instantly (no slider here!). If you prefer the iPhone style slider then
you can press the power button at the top of the phone and use the
slider there, though I much prefer the flick button on the side.</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4238.JPG"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4238-300x156.jpg" title="N900 lock screen switch (left) and kickstand." alt="N900 lock screen switch (left) and kickstand." /></a></p>

<p>I like the stand on the back of the phone - this would be immensely
useful when you&#8217;re trying to watch a film on the train on the way back
from London (rather than constructing a stand with your backpack, wallet
and other accessories like I do for my iPhone&#8230;). The stand is fairly
sturdy and definitely supports the phone well, though it does rock a bit
when you use the stylus at the top right of the screen (not really the
stands intention to be fair!). I know virtually nothing about
photography, but to me the camera seems to be a decent quality 5MP phone
camera with a fairly decent flash. Coming from a 3MP iPhone with no
flash the difference is astounding. The N900&#8217;s sheer performance is very
visible here - as you move the phone around you can clearly see the
surroundings - there is no massive blurring like when you wobble the
iPhone&#8217;s camera. The photos themselves come out quite well, though there
is still minor blurring due to handshake - but no where near the
magnitude of the blurring on the iPhone. I bet a &#8220;bar code scanner&#8221;
application on the N900 would be far faster and more accurate than any I
have used on the iPhone or Android!</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot09.png"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot09.png" title="N900-YouTube Windowed" alt="N900-YouTube Windowed" /></a></p>

<p>Connecting the device to my
<a href="http://en.wikipedia.org/wiki/Wi-Fi" title="Wi-Fi">WiFi</a> network was painless
and intuitive. The major widgets (menu button [top left], fullscreen
button [bottom right], close button [top right], status tray
[top, right of menu button]) are well laid out and application switching (and
closing [<a href="http://www.symbian.com" title="Symbian">Symbian</a>: I&#8217;m talking to
you]!) is simple and intuitive.</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot04.png"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot04-300x180.png" title="N900 - Home Screen" alt="N900 - Home Screen" /></a>
<a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot05.png"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot05-300x180.png" title="N900 - Running Applications" alt="N900 - Running Applications" /></a>
<a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot06.png"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot06-300x180.png" title="N900 - Applications Home" alt="N900 - Applications Home" /></a>
<a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot07.png"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/screenshot07-300x180.png" title="N900 - Applications More" alt="N900 - Applications More" /></a></p>

<p>Opening applications could do with some work - the menu first opens and
shows you 15 icons (standard icons like Contacts, Phone, Web, Email,
Conversations), with a More button at the bottom right. Pressing More is
how you get to your other apps - games, utilities, etc. Unfortunately
these apps appear ordered by the time they were installed and not
separated into folders, and there is no obviously intuitive way to
organise them. In fact I have yet to find out how to organise them
through exploring the device - I will search the internet later.</p>

<p><a href="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4216.JPG"><img src="http://www.benjiegillam.com/wp-content/uploads/2009/12/DSCF4216-300x198.jpg" title="N900 (top left), G1 (top right), iPhone 3GS (bottom)" alt="N900 (top left), G1 (top right), iPhone 3GS (bottom)" /></a></p>

<p>That&#8217;s the end of my first impressions&#8230; When I discovered the X
Terminal application I got immediately a lot more excited as I am by
nature a hacker. Read on&#8230;</p>

<p><strong><em>This post is part 2 of a three part
series. You may also be interested in:
<a href="http://www.benjiegillam.com/2009/12/n900-the-tale-of-the-indestructible-box/">Part 1: N900: the tale of the indestructible box</a>
Part 3: N900: a phone for hackers? (coming soon&#8230;)</em></strong></p>
]]></content>
  </entry>
  
</feed>

