<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Javascript on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in Javascript on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Sun, 25 Aug 2013 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/javascript/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>SMS Character Count</title>
      <link>https://blog.bramp.net/post/2013/08/25/sms-character-count/</link>
      <pubDate>Sun, 25 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2013/08/25/sms-character-count/</guid>
      <description><p>It is commonly known that Twitter allows 140 character messages, and some will tell you that a single SMS message is limited to 160 characters. However, it’s not as simple as that. In the US a single SMS message can contain 140 bytes of data, which if using <a href="http://en.wikipedia.org/wiki/GSM_03.38">GSM encoding</a>, we can squeeze up to 160 7-bit characters. Those 7-bit GSM characters don’t match up with normal ASCII characters, and even worse, not all characters take 7 bits, some take up 14 bits (for example the { character)!</p>
<p>When we start talking about messaging in non-latin scripts, such as Chinese, then a different encoding must be used. In the SMS world the encoding of choice is <a href="http://en.wikipedia.org/wiki/UTF-16">UCS-2</a>, which uses 16 bits per character. This limits a single part message to 70 characters (down from 160).</p>
<p>On top of that, most SMS clients will let you send concatenated SMS messages. That is, multiple message parts that appear as one long SMS message. A two part message allow up to 304 characters, not the 320 (160×2) you might expect. This is due to the overhead required to store meta data about each part.</p>
<p>This all makes it very hard to count how long a SMS message will be, what characters are allowed, and how many parts it will take. To help with these isuses, I’ve created this simple tool which allows you to type out your message, and see how well it’ll fit</p>
<a href="https:/blog.bramp.net/sms/">
<img src="sms-count.png" alt="SMS Character Count" width="741" height="196" class="aligncenter" /><br />
https:/blog.bramp.net/sms/</a>
</description>
    </item>
    
    <item>
      <title>Draw UML Sequence Diagrams with Javascript</title>
      <link>https://blog.bramp.net/post/2013/03/23/draw-uml-sequence-diagrams-with-javascript/</link>
      <pubDate>Sat, 23 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2013/03/23/draw-uml-sequence-diagrams-with-javascript/</guid>
      <description><p>I’m happy to announce one of my projects, <a href="https://bramp.github.io/js-sequence-diagrams/">js-sequence-diagrams</a>. This uses Javascript to draw UML sequence diagrams in SVG format. Here is an example:</p>
<div class="text-center">
    <a href="https://bramp.github.io/js-sequence-diagrams/">
		<img src="sample-with-editor.png" alt="js-sequence-diagram example" width="865" height="333" />
	</a>
</div>
<p>You can alter the diagram in real time, and I even have a simple jQuery plugin to make this easy to use on your own sites.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="ni">&amp;lt;</span>script src=&#34;sequence-diagram-min.js&#34;<span class="ni">&amp;gt;&amp;lt;</span>/script<span class="ni">&amp;gt;</span>
</span></span><span class="line"><span class="cl"><span class="ni">&amp;lt;</span>div class=&#34;diagram&#34;<span class="ni">&amp;gt;</span>A-<span class="ni">&amp;gt;</span>B: Message<span class="ni">&amp;lt;</span>/div<span class="ni">&amp;gt;</span>
</span></span><span class="line"><span class="cl"><span class="ni">&amp;lt;</span>script<span class="ni">&amp;gt;</span>
</span></span><span class="line"><span class="cl">$(&#34;.diagram&#34;).sequenceDiagram({theme: <span class="ni">&amp;#39;</span>hand<span class="ni">&amp;#39;</span>});
</span></span><span class="line"><span class="cl"><span class="ni">&amp;lt;</span>/script<span class="ni">&amp;gt;</span>
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>JSHint ‘x’ is an implied global variable</title>
      <link>https://blog.bramp.net/post/2012/11/23/jshint-x-is-an-implied-global-variable/</link>
      <pubDate>Fri, 23 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2012/11/23/jshint-x-is-an-implied-global-variable/</guid>
      <description><p>I’ve started using <a href="http://www.jshint.com/">JSHint</a> to check my javascript. One error I encountered was:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Errors:
</span></span><span class="line"><span class="cl">     85,5:&#39;grammar&#39; is not defined.
</span></span><span class="line"><span class="cl">Warning:
</span></span><span class="line"><span class="cl">     85,1: &#39;grammar&#39; is an implied global variable.
</span></span></code></pre></div><p>This is saying that I’m using some variable that I’ve not declared in my javascript file. In most cases that would be a mistake, but in my case I was expecting it to be in the global scope included from another javascript file.</p>
<p>To make JSHint stop complaining about this, you can simply place the following at the top of your javascript document:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="cm">/*global grammar */</span>
</span></span></code></pre></div><p>This will tell it that the variable is declared at a global scope. Check out one of <a href="https://github.com/bramp/js-sequence-diagrams/blob/master/diagram.js">my projects</a> for example.</p></description>
    </item>
    
    <item>
      <title>My experiences with developing multi-threaded nodejs addon</title>
      <link>https://blog.bramp.net/post/2011/10/17/my-experiences-with-developing-multi-threaded-nodejs-addon/</link>
      <pubDate>Mon, 17 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/10/17/my-experiences-with-developing-multi-threaded-nodejs-addon/</guid>
      <description><p>I’ve been modifying an <a href="https://github.com/tbranyen/nodewii">existing nodejs extension</a>, that wraps <a href="http://abstrakraft.org/cwiid/wiki/libcwiid">libcwiid</a> (a C library written to interface with a <a href="http://en.wikipedia.org/wiki/Wii_Remote">Wiimote</a>). This extension uses polling to check if the state of the Wiimote has changed (such as a button being pressed). Libcwiid however provides a callback mechanism to be alerted as soon as a state change occurs. This has the benefit of being instantaneous, instead of at the polling interval.</p>
<p>While adapting <a href="https://github.com/bramp/nodewii">nodewii</a> to use this callback mechanism I learnt a couple of things about developing multi-threaded nodejs extensions that I thought I’d share.</p>
<h4 id="1-all-v8-operations-must-run-from-the-main-thread">1) All V8 operations must run from the main thread</h4>
<p><a href="http://nodejs.org/">Nodejs</a> uses a single thread for executing the <a href="http://code.google.com/p/v8/">V8 JavaScript engine</a>, and multiple worker threads to execute longer running non-JavaScript blocking tasks. Because V8 is not thread safe, all V8 operations must be executed from this single V8 thread. That means you are not allowed to create V8 objects, integers, strings, etc, from any other thread. If you try, race conditions happen, memory get corrupted and nodejs is likely to crash. Helpfully, nodejs does provide a mechanism to simplify using these threads:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">eio_custom</span><span class="p">(</span><span class="n">eio_cb</span> <span class="n">execute</span><span class="p">,</span> <span class="kt">int</span> <span class="n">pri</span><span class="p">,</span> <span class="n">eio_cb</span> <span class="n">cb</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">data</span><span class="p">);</span>
</span></span></code></pre></div><p>This function allows you to execute a blocking task in a worker thread. Once that task is finished another callback is called on the main JavaScript thread. Multiple extensions use it, and this is the basis for how nodejs provides it’s callback mechanism. Here is a very short example (adapted from <a href="https://github.com/bramp/nodewii/blob/master/src/wiimote.cc">wiimote.cc</a>) of how to use eio_custom.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">Handle</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">Value</span><span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span> <span class="n">WiiMote</span><span class="o">::</span><span class="n">Connect</span><span class="p">(</span><span class="k">const</span> <span class="n">Arguments</span><span class="o">&amp;</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">WiiMote</span><span class="o">*</span> <span class="n">wiimote</span> <span class="o">=</span> <span class="n">ObjectWrap</span><span class="o">::</span><span class="n">Unwrap</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">WiiMote</span><span class="o">&amp;</span><span class="n">gt</span><span class="p">;(</span><span class="n">args</span><span class="p">.</span><span class="n">This</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">  <span class="n">Local</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">Function</span><span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span> <span class="n">callback</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">HandleScope</span> <span class="n">scope</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Pass the arguments like you would any other method
</span></span></span><span class="line"><span class="cl">  <span class="k">if</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">Length</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">||</span> <span class="o">!</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">IsFunction</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nf">ThrowException</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">Exception</span><span class="o">::</span><span class="n">Error</span><span class="p">(</span><span class="n">String</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="s">&#34;Callback is required and must be a Function.&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">callback</span> <span class="o">=</span> <span class="n">Local</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">Function</span><span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span><span class="o">::</span><span class="n">Cast</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Create a struct to pass into worker thread
</span></span></span><span class="line"><span class="cl">  <span class="n">connect_request</span><span class="o">*</span> <span class="n">ar</span> <span class="o">=</span> <span class="k">new</span> <span class="n">connect_request</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="n">ar</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">wiimote</span> <span class="o">=</span> <span class="n">wiimote</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">ar</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">callback</span> <span class="o">=</span> <span class="n">Persistent</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">Function</span><span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">callback</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Add a reference to the wiimote, so it isn&#39;t garbage collected between now
</span></span></span><span class="line"><span class="cl">  <span class="c1">// and the callback being run
</span></span></span><span class="line"><span class="cl">  <span class="n">wiimote</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">Ref</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Add reference to the EV (JavaScript) thread
</span></span></span><span class="line"><span class="cl">  <span class="n">ev_ref</span><span class="p">(</span><span class="n">EV_DEFAULT_UC</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Schedule the Connect function to be called.
</span></span></span><span class="line"><span class="cl">  <span class="n">eio_custom</span><span class="p">(</span><span class="n">Connect</span><span class="p">,</span> <span class="n">EIO_PRI_DEFAULT</span><span class="p">,</span> <span class="n">AfterConnect</span><span class="p">,</span> <span class="n">ar</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="nf">Undefined</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">WiiMote</span><span class="o">::</span><span class="n">Connect</span><span class="p">(</span><span class="n">eio_req</span><span class="o">*</span> <span class="n">req</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// This method is running in a worker thread, and NOT the main nodejs
</span></span></span><span class="line"><span class="cl">  <span class="c1">// thread. This mean you can&#39;t use any V8 methods.
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">connect_request</span><span class="o">*</span> <span class="n">ar</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">connect_request</span><span class="o">*</span> <span class="o">&amp;</span><span class="n">gt</span><span class="p">;(</span><span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">data</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Do some work with the connect_request, and put the results back into the struct
</span></span></span><span class="line"><span class="cl">  <span class="p">...</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">WiiMote</span><span class="o">::</span><span class="n">AfterConnect</span><span class="p">(</span><span class="n">eio_req</span><span class="o">*</span> <span class="n">req</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Once the &#34;Connect&#34; method has finished, this method will be called on
</span></span></span><span class="line"><span class="cl">  <span class="c1">// the main nodejs thread. This means we can now use normal V8 methods.
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">HandleScope</span> <span class="n">scope</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Retrieve the info from the request
</span></span></span><span class="line"><span class="cl">  <span class="n">connect_request</span><span class="o">*</span> <span class="n">ar</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">connect_request</span><span class="o">*</span> <span class="o">&amp;</span><span class="n">gt</span><span class="p">;(</span><span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">data</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">WiiMote</span> <span class="o">*</span> <span class="n">wiimote</span> <span class="o">=</span> <span class="n">ar</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">wiimote</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// We no longer need a reference to the follow things
</span></span></span><span class="line"><span class="cl">  <span class="n">ev_ref</span><span class="p">(</span><span class="n">EV_DEFAULT_UC</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">wiimote</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">Unref</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Create some JavaScript objects, and call the callback
</span></span></span><span class="line"><span class="cl">  <span class="n">Local</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">Value</span><span class="o">&amp;</span><span class="n">gt</span><span class="p">;</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">Integer</span><span class="o">::</span><span class="n">New</span><span class="p">(</span><span class="n">ar</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">err</span><span class="p">)</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">TryCatch</span> <span class="n">try_catch</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">ar</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">callback</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">Call</span><span class="p">(</span><span class="n">Context</span><span class="o">::</span><span class="n">GetCurrent</span><span class="p">()</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">Global</span><span class="p">(),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">argv</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">if</span><span class="p">(</span><span class="n">try_catch</span><span class="p">.</span><span class="n">HasCaught</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="n">FatalException</span><span class="p">(</span><span class="n">try_catch</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Now cleanup!
</span></span></span><span class="line"><span class="cl">  <span class="n">ar</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">callback</span><span class="p">.</span><span class="n">Dispose</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="k">delete</span> <span class="n">ar</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This simple pattern makes writing callback code relatively simple. However, this only works well if you are in control of creating the callback.</p>
<h4 id="2-how-to-run-something-on-the-main-thread-without-eio_custom">2) How to run something on the main thread without eio_custom</h4>
<p>Libcwiid creates it’s own thread, which is uses to read data from the wiimote. When data is received, it invokes a callback function passing this new data. This callback function is run on the libcwiid thread. This restricts us from interacting with V8. We ideally need this callback function running in the context of the main thread. The answer to this problem is:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">eio_req</span> <span class="o">*</span><span class="nf">eio_nop</span>       <span class="p">(</span><span class="kt">int</span> <span class="n">pri</span><span class="p">,</span> <span class="n">eio_cb</span> <span class="n">cb</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">data</span><span class="p">);</span>
</span></span></code></pre></div><p>It is safe to call this function from any thread. It will place the eio_cb callback task on the main event queue. This task is then eventually executed on the V8′s thread. An example of this follows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">WiiMote</span><span class="o">::</span><span class="n">HandleMessages</span><span class="p">(</span><span class="n">cwiid_wiimote_t</span> <span class="o">*</span><span class="n">wiimote</span><span class="p">,</span> <span class="kt">int</span> <span class="n">len</span><span class="p">,</span> <span class="k">union</span> <span class="nc">cwiid_mesg</span> <span class="n">mesgs</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// This thread is running on the libcwiid&#39;s thread, and thus we can not use V8 operations
</span></span></span><span class="line"><span class="cl">  <span class="n">WiiMote</span> <span class="o">*</span><span class="n">self</span> <span class="o">=</span> <span class="k">const_cast</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">WiiMote</span><span class="o">*&amp;</span><span class="n">gt</span><span class="p">;(</span><span class="k">static_cast</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="k">const</span> <span class="n">WiiMote</span><span class="o">*&amp;</span><span class="n">gt</span><span class="p">;(</span><span class="n">cwiid_get_data</span><span class="p">(</span><span class="n">wiimote</span><span class="p">)));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Create a struct to pass to the V8 thread
</span></span></span><span class="line"><span class="cl">  <span class="k">struct</span> <span class="nc">message_request</span> <span class="o">*</span> <span class="n">req</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="nc">message_request</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span> <span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">req</span><span class="p">)</span> <span class="o">+</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">mesgs</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Copy all the data into this struct
</span></span></span><span class="line"><span class="cl">  <span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">wiimote</span> <span class="o">=</span> <span class="n">self</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">len</span> <span class="o">=</span> <span class="n">len</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">memcpy</span><span class="p">(</span><span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">mesgs</span><span class="p">,</span> <span class="n">mesgs</span><span class="p">,</span> <span class="n">len</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">union</span> <span class="nc">cwiid_mesg</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Now pass this over to the main V8 thread
</span></span></span><span class="line"><span class="cl">  <span class="n">eio_nop</span> <span class="p">(</span><span class="n">EIO_PRI_DEFAULT</span><span class="p">,</span> <span class="n">WiiMote</span><span class="o">::</span><span class="n">HandleMessagesAfter</span><span class="p">,</span> <span class="n">req</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">WiiMote</span><span class="o">::</span><span class="n">HandleMessagesAfter</span><span class="p">(</span><span class="n">eio_req</span> <span class="o">*</span><span class="n">req</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// We are now running in the V8 thread.
</span></span></span><span class="line"><span class="cl">  <span class="n">message_request</span><span class="o">*</span> <span class="n">r</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&amp;</span><span class="n">lt</span><span class="p">;</span><span class="n">message_request</span><span class="o">*</span> <span class="o">&amp;</span><span class="n">gt</span><span class="p">;(</span><span class="n">req</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">data</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">WiiMote</span> <span class="o">*</span> <span class="n">self</span> <span class="o">=</span> <span class="n">r</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">wiimote</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">HandleScope</span> <span class="n">scope</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Create JavaScript objects with the message_request
</span></span></span><span class="line"><span class="cl">  <span class="p">...</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Emit this event to a JavaScript callback.
</span></span></span><span class="line"><span class="cl">  <span class="k">this</span><span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span><span class="n">Emit</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">argv</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Using a combination of eio_custom and eio_nop you should be able to interface with any external library of service. You just have to make sure you always know what thread you are on, and what methods you are allowed to use in that context.</p>
<p>Finally, writing correct thread-safe code is hard. From the various nodejs extensions I have come across I regularlly find memory management, or threading issues with them. So I suggest you rigorously use <a href="http://valgrind.org/">valgrind</a> while developing, and simplify your designs so that most of the heavily lifting is done by nodejs itself.</p>
</description>
    </item>
    
    <item>
      <title>Google Chrome Javascript console.log bug?</title>
      <link>https://blog.bramp.net/post/2011/08/02/google-chrome-javascript-console.log-bug/</link>
      <pubDate>Tue, 02 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/08/02/google-chrome-javascript-console.log-bug/</guid>
      <description><p>I recently stumbled across this issue while debugging some Javascript. Take the following example code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">array</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mi">10</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span><span class="p">(</span><span class="nx">array</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="o">++</span><span class="p">,</span> <span class="nx">array</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="c1">//alert(&#34;pause&#34;);
</span></span></span><span class="line"><span class="cl">	<span class="nx">array</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>If you run it in your browser you would expect to see the following printed (in your Javascript console):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
</span></span><span class="line"><span class="cl">1 [1, 2, 3, 4, 5, 6, 7, 8, 9]
</span></span><span class="line"><span class="cl">2 [1, 2, 3, 4, 5, 6, 7, 8]
</span></span><span class="line"><span class="cl">3 [1, 2, 3, 4, 5, 6, 7]
</span></span><span class="line"><span class="cl">4 [1, 2, 3, 4, 5, 6]
</span></span><span class="line"><span class="cl">5 [1, 2, 3, 4, 5]
</span></span><span class="line"><span class="cl">6 [1, 2, 3, 4]
</span></span><span class="line"><span class="cl">7 [1, 2, 3]
</span></span><span class="line"><span class="cl">8 [1, 2]
</span></span><span class="line"><span class="cl">9 [1]
</span></span></code></pre></div><p>However, I instead saw:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1 []
</span></span><span class="line"><span class="cl">2 []
</span></span><span class="line"><span class="cl">3 []
</span></span><span class="line"><span class="cl">4 []
</span></span><span class="line"><span class="cl">5 []
</span></span><span class="line"><span class="cl">6 []
</span></span><span class="line"><span class="cl">7 []
</span></span><span class="line"><span class="cl">8 []
</span></span><span class="line"><span class="cl">9 []
</span></span></code></pre></div><p>The issue seems to be that console.log() does not log straight away. In fact it most likely logs in a background thread for performance reasons. Thus by the time it actually logs the array it has changed. I tested this in Firefox (with Firebug) and it logged everything correctly. I also tried slowing down the loop by adding a alert() call. That fixed the issue at the cost of a popup every iterations.</p>
<p>What really should happen is either</p>
<ul>
<li><code>console.log()</code> should block until the logging is complete</li>
<li><code>console.log()</code> should copy all objects to avoid them being changed after log() returns but before they are printed.</li>
<li>add a <code>console.flush()</code> and make me aware this race condition could occur.</li>
</ul>
<p>I filed this as a <a href="https://code.google.com/p/chromium/issues/detail?id=91303">bug report</a> on the Chromium site, but I suspect I should have filed it over at the Webkit site.</p>
<p>For the moment I came up with a “fix”. I copy the array before I log it, so in this case I do the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">i</span><span class="o">++</span><span class="p">,</span> <span class="nx">array</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
</span></span></code></pre></div><p><strong>Update:</strong> I previously searched for this bug, but didn’t find it before writing this article. However, I have just found someone else had <a href="https://code.google.com/p/chromium/issues/detail?id=50316">reported</a> it a few days ago:</p>
</description>
    </item>
    
    <item>
      <title>HTML5 Canvas: Lunch Wheel</title>
      <link>https://blog.bramp.net/post/2011/07/27/html5-canvas-lunch-wheel/</link>
      <pubDate>Wed, 27 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2011/07/27/html5-canvas-lunch-wheel/</guid>
      <description><p>In the on going battle to make my lunch time more optimised I decided to learn some Javascript, and how to use the HTML5 <a href="https://html.spec.whatwg.org/multipage/scripting.html#the-canvas-element">Canvas</a> element. Turns out it’s not that hard, and I have now created</p>
<p><a href="https://blog.bramp.net/wheel/"><figure><img src="/post/2011/07/27/html5-canvas-lunch-wheel/lunchwheel.png"><figcaption>
      <h4>Click to win</h4>
    </figcaption>
</figure>
</a></p>
<p>The Lunch Wheel]<a href="https://blog.bramp.net/wheel/">3</a>. It helps me find lunch close to my office in the <a href="http://maps.google.com/maps?q=Courthouse,+Arlington,+VA&amp;hl=en&amp;sll=37.0625,-95.677068&amp;sspn=59.206892,135.263672&amp;z=15">Courthouse area of Arlington, VA</a>.</p>
<p>While making this I found that information on the Canvas element seemed to be lacking. For example, not many sites talked about ways to optimise or profile the javascript. Also I was disappointed to see that not all browsers supported the Canvas completely. Here is a quick list of the problems:</p>
<ol>
<li>
<p>Firefox 3.5 (linux) doubled the size of the fonts when I was setting the font in “pt”. When I switched to “em” things seemed to work consistently across browsers. 30fps</p>
</li>
<li>
<p>Android 2.2 (Droid 2) works well but slowly. It also didn’t support the <a href="https://developer.mozilla.org/En/HTML/Element/audio">Audio</a> tag. 6fps</p>
</li>
<li>
<p>Android 3.0 (Xoom Tablet) seemed to have some issues rendering half of the wheel. It looked like a bug with the hardware acceleration. I made some minor tweaks to the rendering and things started to work. 15fps</p>
</li>
<li>
<p>iPhone 3 didn’t render any of the text, but played the sound and spun the wheel. 3fps</p>
</li>
<li>
<p>iPhone 4 rendered fine but as slowly as the Android 2.2 device. 5fps</p>
</li>
<li>
<p>Chrome (linux) worked great, and was the platform I was developing on. 30fps (max)</p>
</li>
</ol>
<p>I was also using the <a href="https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-clip">clip()</a> method to ensure the text didn’t go outside of the wheel, but this heavily impacted performance. So instead I just chopped the text manually and performance doubled.</p>
<p>I realise HTML5 is new, but I’m really hoping all browsers will start to support it consistently and across the board. I’d hate to start writing large blocks of code to cope with all the browser quirks.</p>
<p>Also, thanks to <a href="http://jquery.com/">jQuery</a>, <a href="http://tinysort.sjeiti.com/">TinySort</a> and <a href="http://excanvas.sourceforge.net/">ExplorerCanvas</a> (which I still haven’t made work).</p>
<p><strong>Update:</strong> Soon to come, the ability to find your own lunch places, as well as integration with <a href="https://foursquare.com/">foursquare</a> so you can see how popular the venues are with your friends.</p>
</description>
    </item>
    
  </channel>
</rss>
