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

  <title><![CDATA[BigBinary Blog]]></title>
  <link href="http://blog.bigbinary.com//atom.xml" rel="self"/>
  <link href="http://blog.bigbinary.com//"/>
  <updated>2012-05-11T18:30:55-04:00</updated>
  <id>http://blog.bigbinary.com//</id>
  <author>
    <name><![CDATA[Neeraj Singh]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[jquery-ujs and jquery trigger]]></title>
    <link href="http://blog.bigbinary.com//2012/05/11/jquery-ujs-and-jquery-trigger.html"/>
    <updated>2012-05-11T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2012/05/11/jquery-ujs-and-jquery-trigger</id>
    <content type="html"><![CDATA[<h3>ajax using jquery</h3>

<p>jQuery&#8217;s ajax method&#8217;s <code>success</code> callback function takes three
parameters. Here is the <a href="http://api.jquery.com/jQuery.ajax/">api</a></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">success</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">jqXHR</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So if you are making ajax call using jQuery the code might look like</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;ajax/test.html&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">jqXHR</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>ajax using jquery-ujs</h3>

<p>If you are using Rails and jquery-ujs then you might have code like this</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;/users/1&quot;</span> <span class="nx">data</span><span class="o">-</span><span class="nx">remote</span><span class="o">=</span><span class="s2">&quot;true&quot;</span> <span class="nx">data</span><span class="o">-</span><span class="nx">type</span><span class="o">=</span><span class="s2">&quot;json&quot;</span><span class="o">&gt;</span><span class="nx">Show</span><span class="o">&lt;</span><span class="err">/a&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;ajax:success&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">xhr</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code will not work.  In order to make it work the very first
element passed to the callback must be an event object. Here is the code
that will work.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;ajax:success&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">xhr</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Remember that jQuery api says that the first parameter should be &#8220;data&#8221; then why we
need to pass event object to make it work.</p>

<h3>Why event object is needed</h3>

<p>Here is snippet from jquery-ujs code</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">xhr</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">element</span><span class="p">.</span><span class="nx">trigger</span><span class="p">(</span><span class="s1">&#39;ajax:success&#39;</span><span class="p">,</span> <span class="p">[</span><span class="nx">data</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">xhr</span><span class="p">]);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The thing about <a href="http://api.jquery.com/trigger/">trigger</a> method is that the event object is always passed as the first parameter to the event handler. This is why when you are using jquery-ujs you have to have the first parameter in the callback function an event object.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[XSS and Rails]]></title>
    <link href="http://blog.bigbinary.com//2012/05/10/xss-and-rails.html"/>
    <updated>2012-05-10T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2012/05/10/xss-and-rails</id>
    <content type="html"><![CDATA[<p>XSS stands for <strong>Cross-site scripting</strong>. However it has nothing to do with <em>cross-site</em>. It has everything to do with your site.</p>

<p>XSS is consistently  a <a href="https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project">top</a> web application security risk as per <a href="https://www.owasp.org/index.php/Main_Page">The Open Web Application Security Project (OWASP)</a> .</p>

<p>XSS vulnerability allows hacker to <strong>execute JavaScript code</strong>.</p>

<p>Your site has a form. I enter <code>&lt;script&gt;alert(document.cookie)&lt;/script&gt;</code> and I hit submit. If I see an alert then it means I can execute <strong>JavaScript code</strong> on your site and your site has XSS vulnerability.</p>

<p>If hacker can execute JavaScript code then then can see your cookie.</p>

<p>If you are logged into your application then your application sets a
cookie. That is how your application knows that you are logged in.</p>

<p>If a hacker can see your cookie then the hacker can log in.</p>

<p>By the way having SSL does not protect the site from XSS vulnerability.</p>

<h3>Prevention</h3>

<p>An easy way to prevent XSS is to not to allow users to execute JavaScript
code. This is the reason why when you go to post comment many sites have
messages similar to this one.</p>

<p><img src="https://img.skitch.com/20120509-g1icks7wgreqmeym67g8mm2ikt.jpg" alt="limited html example" /></p>

<p>Some sites allow some html code and other do not allow any html code at
all.</p>

<p>It is possible for the hacker to insert JavaScript code in your system.
For example if database stores <code>&lt;script&gt;alert(document.cookie)&lt;/script&gt;</code>
then JavaScript code has come inside the application. However
as long as you deny the opportunity for that code to be executed in
browser you are safe.</p>

<p>You can also take precaution and sanitize all user input so that
JavaScript code does not comes into the system at all.</p>

<p>The right approach depends on your need and the application framework
you are working with.</p>

<h3>What tools Rails provides</h3>

<p>In the earlier version of Rails we were encouraged to use <code>&lt;%= h post.comment %&gt;</code> in views. Here <code>h</code> is a short name for <a href="http://api.rubyonrails.org/classes/ERB/Util.html#method-c-html_escape">html_escape</a>. In Rails 3.x the content is automatically escaped. It means if the hacker enters <code>&lt;script&gt;alert(document.cookie)&lt;/script&gt;</code> then after <code>html_escape</code> has performed its operation the browser sees <code>"&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt;"</code>. In this way the user does not get to see the alert message which is a good thing. It means users cannot execute JavaScript code on your site and your site is XSS safe.</p>

<p>If you do want to format the text a little bit then you can use
<a href="http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format">simple_format</a> . If user enters a bunch of text in text area then simple_format can help make the text look pretty without compromising security. It will strip away <code>&lt;script&gt;</code> and security sensitive tags. <code>html_escape</code> internally uses <a href="https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/sanitize_helper.rb">sanitize</a> method. Checkout that method to see what options you can pass. Think before you act because you might be opening a security vulnerability.</p>

<p>Also be careful with <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/OutputSafetyHelper.html#method-i-raw">raw</a> method. It will output without escaping the string.</p>

<h3>In case of Json you need to handle escaping yourself</h3>

<p>Note that when user entered <code>&lt;script&gt;alert(document.cookie)&lt;/script&gt;</code> in
the textarea then database stored the value as <code>&lt;script&gt;alert(document.cookie)&lt;/script&gt;</code> . No escaping is done before storing the value in the database. It is the ERB that does the escaping and ensures that site is protected.</p>

<p>All is well and after a few months boss comes and asks to  make that page ajaxy. Now data is sent to browser in JSON format.</p>

<p>Now Controller looks like <code>format.json { render json: @user }</code>.</p>

<p>This will produce JSON structure
like this <code>"{\"about\":\"&lt;script&gt;alert(document.cookie)&lt;/script&gt;\"}"</code>.</p>

<p>On the client side you have code to display the content.
<code>$('body').append(data.about)</code>. Well when the about content is added to
dom the script will be executed and now your site is vulnerable to XSS.</p>

<p>You would think that using <a href="http://api.rubyonrails.org/classes/ERB/Util.html#method-c-json_escape">json_escape</a> should solve the problem. However <code>json_escape</code> produces invalid JSON. Yes that is right. The output of <code>json_escape</code> is invalid JSON. There is an <a href="https://github.com/rails/rails/pull/6094">open pull request</a> to take care of that issue.</p>

<p>The point is that if you are passing JSON data to be displayed on the
browser then , by default, you do not have the escape protection that
ERB provides.</p>

<p>Please post comments at <a href="http://news.ycombinator.com/item?id=3952745">Hacker news</a> .</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CSRF and Rails]]></title>
    <link href="http://blog.bigbinary.com//2012/05/10/csrf-and-rails.html"/>
    <updated>2012-05-10T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2012/05/10/csrf-and-rails</id>
    <content type="html"><![CDATA[<p>CSRF stands for <strong>Cross-site request forgery</strong>.</p>

<p>Unlike <a href="xxx">XSS</a> CSRF does not try to steal your informationt to log into the system.  CSRF assumes that you are aleady logged in at your site and when you visit comments section of some other site then an attack is done on your site without you knowing it.</p>

<p>Here is how it might work</p>

<ul>
<li>User logs in at www.mysite.com .</li>
<li>User visits www.gardening.com site since he is interested in gardeing
.</li>
<li>He is browsing the comments posted on the gardening.com forum and one of the comments posted is <code>&lt;img src="http://www.mysite.com/grant_access?user_id=1&amp;project_id=123" /&gt;</code></li>
<li>If the user is admin of the project &#8220;123&#8221; then unknowingly he might
grant access to user_id 1 .</li>
</ul>


<p>I know. You are thiniking that loading an image will make a <code>GET</code>
request and granting access is hidden behind <code>POST</code> request. So you are
safe. Well the hacker can easily change code to make a <code>POST</code> request.
The code might look like this</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&lt;script&gt;
</span><span class='line'> document.write('&lt;form name=hack method=post action="http://mysite.com/grant_access?user_id=1&project_id=123"&gt;&lt;/form&gt;')
</span><span class='line'>&lt;/script&gt;
</span><span class='line'>&lt;img src='' onLoad="document.hack.submit()" /&gt;</span></code></pre></td></tr></table></div></figure>


<p>Now when the image is loaded then a <code>POST</code> request is sent to the
server and the application might  grant access to this new user. Not
good.</p>

<h2>Prevention</h2>

<p>In order to prevent such things from happening Rails uses
<code>authenticity_token</code>.</p>

<p>If you look at source code of any form generated through Rails
scaffolding you will see that form markup contains following code</p>

<p><code>&lt;input name="authenticity_token" type="hidden" value="LhT7dqqRByvOhJJ56BsPb7jJ2p24hxNu6ZuJA+8l+YA=" /&gt;</code>.</p>

<p>The exact value of the authenticity_token will be different. When form
is submitted then <a href="https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/request_forgery_protection.rb">Rails checks</a> the authenticity_token and only when it is verified the request is sent for further processing.</p>

<p>In a brand new rails application the <code>application_controller.rb</code> has
only one line.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">ApplicationController</span> <span class="o">&lt;</span> <span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">protect_from_forgery</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>That line <code>protect_from_forgery</code> checks for the authentication of the
incoming request.</p>

<p>Here is code that is responsible for generating <code>csrf_token</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Sets the token value for the current session.</span>
</span><span class='line'><span class="k">def</span> <span class="nf">form_authenticity_token</span>
</span><span class='line'>  <span class="n">session</span><span class="o">[</span><span class="ss">:_csrf_token</span><span class="o">]</span> <span class="o">||=</span> <span class="no">SecureRandom</span><span class="o">.</span><span class="n">base64</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since this &#8220;csrf_token&#8221; is a random value there is no way for hacker to
know what the &#8220;csrf_token&#8221; is for my session. And he will not be able to
pass the correct &#8220;authenticity_token&#8221;.</p>

<p>Note that if the site is vulnerable to XSS then the hacker submits
request as if he is logged in and in that case the CSRF attack will go
through.</p>

<p>Please post comments at <a href="http://news.ycombinator.com/item?id=3952741">Hacker news</a> .</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[tsort in ruby]]></title>
    <link href="http://blog.bigbinary.com//2012/03/16/tsort-in-ruby.html"/>
    <updated>2012-03-16T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2012/03/16/tsort-in-ruby</id>
    <content type="html"><![CDATA[<p>You have been assigned the task of figuring out in what order following tasks should be executed given their dependencies on other tasks.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Task11 takes input from task5 and task7.
</span><span class='line'>Task10 takes input from task11 and task3.
</span><span class='line'>Task9 takes input from task8 and task11.
</span><span class='line'>Task8 takes input from task3 and task7.
</span><span class='line'>Task2 takes input from task11.
</span></code></pre></td></tr></table></div></figure>


<p>If you look at these tasks and draw a graph then it might look like this.</p>

<p><img src="http://blog.bigbinary.com/images/directed_acyclic_graph.png" alt="directed acyclic graph" /></p>

<h2>Directed acyclic graph</h2>

<p>The graph shown above is a &#8220;Directed acyclic graph&#8221; . In Directed acyclic graphs if you start following the arrow then you should never be able to get to the node from where you started.</p>

<p>Directed acyclic graphs are great at describing problems where a task is dependent on another set of tasks.</p>

<p>We started off with a set of tasks that are dependent on another set of tasks. To get the solution we need to sort the tasks in such a way that first task is not dependent on any task and the next task is only dependent on task previously done. So basically we need to sort the directed acyclic graph such that the prerequisites are done before getting to the next task.</p>

<p>Sorting of directed acyclic graph in the manner described above is called <em>topological sorting</em> .</p>

<h2>TSort</h2>

<p>Ruby provides <a href="http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tsort/rdoc/TSort.html">TSort</a> which allows us to implement &#8220;topological sorting&#8221;.</p>

<p>Lets write code to find solution to the original problem.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s2">&quot;tsort&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Project</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">TSort</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@requirements</span> <span class="o">=</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span><span class="p">{</span><span class="o">|</span><span class="n">h</span><span class="p">,</span><span class="n">k</span><span class="o">|</span> <span class="n">h</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="o">[]</span><span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">add_requirement</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">*</span><span class="n">requirement_dependencies</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@requirements</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="o">=</span> <span class="n">requirement_dependencies</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">tsort_each_node</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@requirements</span><span class="o">.</span><span class="n">each_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">tsort_each_child</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@requirements</span><span class="o">[</span><span class="nb">name</span><span class="o">].</span><span class="n">each</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span> <span class="k">if</span> <span class="vi">@requirements</span><span class="o">.</span><span class="n">has_key?</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">p</span> <span class="o">=</span> <span class="no">Project</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="nb">p</span><span class="o">.</span><span class="n">add_requirement</span><span class="p">(</span><span class="ss">:r11</span><span class="p">,</span> <span class="ss">:r5</span><span class="p">,</span> <span class="ss">:r2</span><span class="p">)</span>
</span><span class='line'><span class="nb">p</span><span class="o">.</span><span class="n">add_requirement</span><span class="p">(</span><span class="ss">:r10</span><span class="p">,</span> <span class="ss">:r11</span><span class="p">,</span> <span class="ss">:r3</span><span class="p">)</span>
</span><span class='line'><span class="nb">p</span><span class="o">.</span><span class="n">add_requirement</span><span class="p">(</span><span class="ss">:r9</span><span class="p">,</span> <span class="ss">:r8</span><span class="p">,</span> <span class="ss">:r11</span><span class="p">)</span>
</span><span class='line'><span class="nb">p</span><span class="o">.</span><span class="n">add_requirement</span><span class="p">(</span><span class="ss">:r8</span><span class="p">,</span> <span class="ss">:r3</span><span class="p">,</span> <span class="ss">:r7</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="nb">p</span><span class="o">.</span><span class="n">tsort</span>
</span></code></pre></td></tr></table></div></figure>


<p>If I execute above code in <code>ruby 1.9.2</code> I get following result.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">r5</span>
</span><span class='line'><span class="n">r2</span>
</span><span class='line'><span class="n">r11</span>
</span><span class='line'><span class="n">r3</span>
</span><span class='line'><span class="n">r10</span>
</span><span class='line'><span class="n">r7</span>
</span><span class='line'><span class="n">r8</span>
</span><span class='line'><span class="n">r9</span>
</span></code></pre></td></tr></table></div></figure>


<p>So that is the order in which tasks should be executed .</p>

<h2>Where it is  used</h2>

<p>When Rails boots it invokes a lot of initializers. Rails uses tsort to get the order in which initializers should be invoked. <a href="https://gist.github.com/2051633">Here is the list</a> of unsorted initializers. After sorting the initializers list is <a href="https://gist.github.com/2051649">this</a> .</p>

<p>Here is the code from Rails.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">alias</span> <span class="ss">:tsort_each_node</span> <span class="ss">:each</span>
</span><span class='line'><span class="k">def</span> <span class="nf">tsort_each_child</span><span class="p">(</span><span class="n">initializer</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">select</span> <span class="p">{</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">i</span><span class="o">.</span><span class="n">before</span> <span class="o">==</span> <span class="n">initializer</span><span class="o">.</span><span class="n">name</span> <span class="o">||</span> <span class="n">i</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">initializer</span><span class="o">.</span><span class="n">after</span> <span class="p">}</span><span class="o">.</span><span class="n">each</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">initializers</span><span class="o">.</span><span class="n">tsort</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">initializer</span><span class="o">|</span>
</span><span class='line'>  <span class="n">initializer</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">if</span> <span class="n">initializer</span><span class="o">.</span><span class="n">belongs_to?</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://gembundler.com/">Bundler</a> uses tsort to find the order in which gems should be installed.</p>

<p>Tsort can also be used to statically analyze programming code by looking at method dependency graph.</p>

<p>Image source: <a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph">http://en.wikipedia.org/wiki/Directed_acyclic_graph</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[alias vs alias_method]]></title>
    <link href="http://blog.bigbinary.com//2012/01/08/alias-vs-alias-method.html"/>
    <updated>2012-01-08T00:00:00-05:00</updated>
    <id>http://blog.bigbinary.com//2012/01/08/alias-vs-alias-method</id>
    <content type="html"><![CDATA[<p>It comes up very often. Should I use <code>alias</code> or <code>alias_method</code> . Lets take a look at them in a bit detail.</p>

<h2>Usage of alias</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">full_name</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Johnnie Walker&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">alias</span> <span class="nb">name</span> <span class="n">full_name</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">name</span> <span class="c1">#=&gt;Johnnie Walker</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Usage of alias_method</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">full_name</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Johnnie Walker&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">alias_method</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:full_name</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">name</span> <span class="c1">#=&gt;Johnnie Walker</span>
</span></code></pre></td></tr></table></div></figure>


<p>First difference you will notice is that in case of <em>alias_method</em> we need to use a comma between the &#8220;new method name&#8221; and &#8220;old method name&#8221;.</p>

<p><em>alias_method</em> takes both symbols and strings as input. Following code would also work.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">alias_method</span> <span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="s1">&#39;full_name&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>That was easy. Now lets take a look at how scoping impacts usage of <em>alias</em> and <em>alias_method</em> .</p>

<h2>Scoping with alias</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">full_name</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Johnnie Walker&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">add_rename</span>
</span><span class='line'>    <span class="n">alias_method</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:full_name</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Developer</span> <span class="o">&lt;</span> <span class="no">User</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">full_name</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Geeky geek&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">add_rename</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Developer</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">name</span> <span class="c1">#=&gt; &#39;Gekky geek&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case method &#8220;name&#8221; picks the method &#8220;full_name&#8221; defined in &#8220;Developer&#8221; class. Now lets try with <em>alias</em>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">full_name</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Johnnie Walker&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">add_rename</span>
</span><span class='line'>    <span class="k">alias</span> <span class="ss">:name</span> <span class="ss">:full_name</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Developer</span> <span class="o">&lt;</span> <span class="no">User</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">full_name</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Geeky geek&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">add_rename</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Developer</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">name</span> <span class="c1">#=&gt; &#39;Johnnie Walker&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>With the usage of <em>alias</em> the method &#8220;name&#8221; is not able to pick the method &#8220;full_name&#8221; defined in <em>Developer</em>.</p>

<p>This is because <em>alias</em> is a keyword and it is lexically scoped. It means it treats <code>self</code> as the value of <em>self</em> at the time the source code was read . In contrast <em>alias_method</em> treats <em>self</em> as the value determined not at the run time.</p>

<p>Overall my recommendation would be to use <em>alias_method</em>. Since <em>alias_method</em> is a method defined in class <em>Module</em> it can be overridden later and it offers more flexibility. Also because of lexical scoping of <em>alias</em> it can do some weird things unless all the developers who whats going on.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Understanding bind and bindAll in Backbone.js]]></title>
    <link href="http://blog.bigbinary.com//2011/08/18/understanding-bind-and-bindall-in-backbone.html"/>
    <updated>2011-08-18T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2011/08/18/understanding-bind-and-bindall-in-backbone</id>
    <content type="html"><![CDATA[<p><a href="http://documentcloud.github.com/backbone">Backbone.js</a> users use <a href="http://documentcloud.github.com/underscore/#bind">bind</a> and <a href="http://documentcloud.github.com/underscore/#bindAll">bindAll</a> methods provide by <a href="http://documentcloud.github.com/underscore">underscore.js</a> a lot. In this blog I am going to discuss why these methods are needed and how it all works.</p>

<h2>It all starts with apply</h2>

<p>Function <code>bindAll</code> internally uses <code>bind</code> . And <em>bind</em> internally uses <code>apply</code>. So it is important to understand what <em>apply</em> does.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">beautiful</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="k">this</span> <span class="o">+</span> <span class="s1">&#39; is beautiful&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">func</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>If I execute above code then I get <em>[object window] is beautiful</em>. I am getting that message because when function is invoked then <em>this</em> is <em>window</em>, the default global object.</p>

<p>In order to change the value of <em>this</em> we can make use of method <em>apply</em> as given below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">beautiful</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="k">this</span> <span class="o">+</span> <span class="s1">&#39; is beautiful&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="s1">&#39;Internet&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case the alert message will be <em>Internet is beautiful</em> . Similarly following code will produce <em>Beach is beautiful</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">beautiful</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">alert</span><span class="p">(</span><span class="k">this</span> <span class="o">+</span> <span class="s1">&#39; is beautiful&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="s1">&#39;Beach&#39;</span><span class="p">);</span> <span class="c1">//Beach is beautiful</span>
</span></code></pre></td></tr></table></div></figure>


<p>In short, <em>apply</em> lets us control the value of <em>this</em> when the function is invoked.</p>

<h2>Why bind is needed</h2>

<p>In order to understand why <em>bind</em> method is needed first let&#8217;s look at following example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Developer</span><span class="p">(</span><span class="nx">skill</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">skill</span> <span class="o">=</span> <span class="nx">skill</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">says</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">skill</span> <span class="o">+</span> <span class="s1">&#39; rocks!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">john</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Developer</span><span class="p">(</span><span class="s1">&#39;Ruby&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">john</span><span class="p">.</span><span class="nx">says</span><span class="p">();</span> <span class="c1">//Ruby rocks!</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above example is pretty straight forward. <em>john</em> is an instance of <em>Developer</em> and when <em>says</em> function is invoked then we get the right alert message.</p>

<p>Notice that when we invoked <em>says</em> we invoked like this <em>john.says()</em>. If we just want to get hold of the function that is returned by <em>says</em> then we need to do <em>john.says</em>. So the above code could be broken down to following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Developer</span><span class="p">(</span><span class="nx">skill</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">skill</span> <span class="o">=</span> <span class="nx">skill</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">says</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">skill</span> <span class="o">+</span> <span class="s1">&#39; rocks!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">john</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Developer</span><span class="p">(</span><span class="s1">&#39;Ruby&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="nx">john</span><span class="p">.</span><span class="nx">says</span><span class="p">;</span>
</span><span class='line'><span class="nx">func</span><span class="p">();</span><span class="c1">// undefined rocks!</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code is similar to the code above it. All we have done is to store the function in a variable called <em>func</em>. If we invoke this function then we should get the alert message we expected. However if we run this code then the alert message will be <em>undefined rocks!</em>.</p>

<p>We are getting <em>undefined rocks!</em> because in this case <em>func</em> is being invoked in the global context. <em>this</em> is pointing to global object called <em>window</em> when the function is executed. And <em>window</em> does not have any attribute called <em>skill</em> . Hence the output of <em>this.skill</em> is <em>undefined</em>.</p>

<p>Earlier we saw that using <em>apply</em> we can fix the problem arising out of <em>this</em>. So lets try to use <em>apply</em> to fix it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Developer</span><span class="p">(</span><span class="nx">skill</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">skill</span> <span class="o">=</span> <span class="nx">skill</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">says</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">skill</span> <span class="o">+</span> <span class="s1">&#39; rocks!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">john</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Developer</span><span class="p">(</span><span class="s1">&#39;Ruby&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="nx">john</span><span class="p">.</span><span class="nx">says</span><span class="p">;</span>
</span><span class='line'><span class="nx">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">john</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code fixes our problem. This time the alert message we got was <em>Ruby rocks!</em>. However there is an issue and it is a big one.</p>

<p>In JavaScript world functions are first class citizens. The reason why we create function is so that we can easily pass it around. In the above case we created a function called <em>func</em>. However along with the function <em>func</em> now we need to keep passing <em>john</em> around. That is not a good thing. Secondly the responsibility of rightly invoking this function has been shifted from the function creator to the function consumer. That&#8217;s not a good API.</p>

<p>We should try to create functions which can easily be called by the consumers of the function. This is where <em>bind</em> comes in</p>

<h2>How bind solves the problem</h2>

<p>First lets see how using <em>bind</em> solves the problem.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Developer</span><span class="p">(</span><span class="nx">skill</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">skill</span> <span class="o">=</span> <span class="nx">skill</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">says</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">skill</span> <span class="o">+</span> <span class="s1">&#39; rocks!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">john</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Developer</span><span class="p">(</span><span class="s1">&#39;Ruby&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">john</span><span class="p">.</span><span class="nx">says</span><span class="p">,</span> <span class="nx">john</span><span class="p">);</span>
</span><span class='line'><span class="nx">func</span><span class="p">();</span><span class="c1">// Ruby rocks!</span>
</span></code></pre></td></tr></table></div></figure>


<p>To solve the problem regarding <em>this</em> issue we need a function that is already mapped to <em>john</em> so that we do not need to keep carrying <em>john</em> around. That&#8217;s precisly what <em>bind</em> does. It returns a new function and this new function has <em>this</em> bound to the value that we provide.</p>

<p>Here is a snippet of code from <em>bind</em> method</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">return</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">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">args</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">)));</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see <em>bind</em> internally uses <em>apply</em> to set <em>this</em> to the second parameter we passed while invoking <em>bind</em>.</p>

<p>Notice that <em>bind</em> does not change existing function. It returns a new function and that new function should be used.</p>

<h2>How bindAll solves the problem</h2>

<p>Instead of <em>bind</em> we can also use <em>bindAll</em> . Here is solution with <em>bindAll</em>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Developer</span><span class="p">(</span><span class="nx">skill</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">skill</span> <span class="o">=</span> <span class="nx">skill</span><span class="p">;</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">says</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">alert</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">skill</span> <span class="o">+</span> <span class="s1">&#39; rocks!&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">john</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Developer</span><span class="p">(</span><span class="s1">&#39;Ruby&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="nx">john</span><span class="p">,</span> <span class="s1">&#39;says&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="nx">john</span><span class="p">.</span><span class="nx">says</span><span class="p">;</span>
</span><span class='line'><span class="nx">func</span><span class="p">();</span> <span class="c1">//Ruby rocks!</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code is similar to <em>bind</em> solution but there are some big differences.</p>

<p>The first big difference is that we do not have to worry about the returned value of <em>bindAll</em> . In case of <em>bind</em> we must use the returned function. In <em>bindAll</em> we do not have to worry about the returned value but it comes with a price. <em>bindAll</em> actually mutates the function. What does that mean.</p>

<p>See <em>john</em> object has an attribute called <em>says</em> which returns a function . <em>bindAll</em> goes and changes the attribute <em>says</em> so that when it returns a function, that function is already bound to <em>john</em>.</p>

<p>Herer is a snippet of code from <em>bindAll</em> method.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span><span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">f</span><span class="p">]</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">obj</span><span class="p">[</span><span class="nx">f</span><span class="p">],</span> <span class="nx">obj</span><span class="p">);</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that <em>bindAll</em> internally calls <em>bind</em> and it overrides the existing attribute with the function returned by <em>bind</em>.</p>

<p>The other difference between <em>bind</em> and <em>bindAll</em> is that in <em>bind</em> first paramter is a function <em>john.says</em> and the second parameter is the value of this <em>john</em>. In <em>bindAll</em> first paramter is value of this <em>john</em> and the second parameter is not a function but the attribute name.</p>

<h2>Things to watch out for</h2>

<p>While developing a Backbone.js application someone had code like this</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">ProductView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extrend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code will not work because the returned value of <em>bind</em> is not being used. The correct usage will be</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">ProductView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extrend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">,</span> <span class="k">this</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Or you can use <em>bindAll</em> as given below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">ProductView</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extrend</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">model</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">render</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby pack unpack]]></title>
    <link href="http://blog.bigbinary.com//2011/07/20/ruby-pack-unpack.html"/>
    <updated>2011-07-20T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2011/07/20/ruby-pack-unpack</id>
    <content type="html"><![CDATA[<p>C programming language allows developers to directly access the memory where variables are stored. Ruby does not allow that. There are times while working in Ruby when you need to access the underlying bits and bytes. Ruby provides two methods <em>pack</em> and <em>unpack</em> for that.</p>

<p>Here is an example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s1">&#39;A&#39;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;b*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;10000010&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case &#8216;A&#8217; is a string which is being stored and using <em>unpack</em> I am trying to read the bit value. The <a href="http://www.asciitable.com">ASCII table</a> says that ASCII valule of &#8216;A&#8217; is 65 and the binary representation of 65 is <em>10000010</em> .</p>

<p>Here is another example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s1">&#39;A&#39;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;B*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;01000001&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice the difference in result from the first case. What&#8217;s the difference between <em>b<em></em> and <em>B</em></em>.  In order to understand the difference first lets discuss MSB and LSB.</p>

<h2>Most significant bit vs Least significant bit</h2>

<p>All bits are not created equal. <em>C</em> has ascii value of 67. The binary value of 67 is <em>1000011</em>.</p>

<p>First let&#8217;s discuss MSB (most significant bit) style . If you are following MSB style then going from left to right (and you always go from left to right) then the most significant bit will come first.  Because the most significant bit comes first we can pad an additional zero to the left to make the number of bits eight. After adding an additional zero to the left the binary value looks like <em>01000011</em>.</p>

<p>If we want to convert this value in the LSB (Least Significant Bit) style then we need to store the least significant bit first going from left to right. Given below is how the bits will be moved if we are converting from MSB to LSB. Note that in the below case position 1 is being referred to the leftmost bit.</p>

<pre><code>move value 1 from position 8 of MSB to position 1 of LSB
move value 1 from position 7 of MSB to position 2 of LSB
move value 0 from position 6 of MSB to position 3 of LSB
and so on and so forth
</code></pre>

<p>After the exercise is over the value will look like <em>11000010</em>.</p>

<p>We did this exercise manually to understand the difference between <em>most significant bit</em> and <em>least significant bit</em>. However unpack method can directly give the result in both MSB and LSB. The <em>unpack</em> method can take both <em>b<em></em> and <em>B</em></em> as the input.  As per the ruby documentation here is the differnce.</p>

<pre><code>B | bit string (MSB first)
b | bit string (LSB first)
</code></pre>

<p>Now let&#8217;s take a look at two examples.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s1">&#39;C&#39;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;b*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;11000010&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="err">$</span> <span class="s1">&#39;C&#39;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;B*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;01000011&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Both <code>b<em></code> and <code>B</em></code> are looking at the same underlying data. It&#8217;s just that they represent the data differently.</p>

<h2>Different ways of getting the same data</h2>

<p>Let&#8217;s say that I want binary value for string <em>hello</em> . Based on the discussion in the last section that should be easy now.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;B*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;0110100001100101011011000110110001101111&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same information can also be derived as</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C*&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">e</span><span class="o">|</span> <span class="n">e</span><span class="o">.</span><span class="n">to_s</span> <span class="mi">2</span><span class="p">}</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;1101000&quot;</span><span class="p">,</span> <span class="s2">&quot;1100101&quot;</span><span class="p">,</span> <span class="s2">&quot;1101100&quot;</span><span class="p">,</span> <span class="s2">&quot;1101100&quot;</span><span class="p">,</span> <span class="s2">&quot;1101111&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s break down the previous statement in small steps.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">111</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Directive <code>C*</code> gives the <em>8-bit unsigned integer</em> value of the character. Note that ascii value of <em>h</em> is <em>104</em>, ascii value of <em>e</em> is <em>101</em> and so on.</p>

<p>Using the technique discussed above I can find hex value of the string.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C*&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">e</span><span class="o">|</span> <span class="n">e</span><span class="o">.</span><span class="n">to_s</span> <span class="mi">16</span><span class="p">}</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;68&quot;</span><span class="p">,</span> <span class="s2">&quot;65&quot;</span><span class="p">,</span> <span class="s2">&quot;6c&quot;</span><span class="p">,</span> <span class="s2">&quot;6c&quot;</span><span class="p">,</span> <span class="s2">&quot;6f&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hex value can also be achieved directly.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;H*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;68656c6c6f&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>High nibble first vs Low nibble first</h2>

<p>Notice the difference in the below two cases.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;H*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;68656c6c6f&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;h*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;8656c6c6f6&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>As per ruby documentation for unpack</p>

<pre><code>H | hex string (high nibble first)
h | hex string (low nibble first)
</code></pre>

<p>A byte consists of 8 bits. A nibble consists of 4 bits. So a byte has two nibbles. The ascii value of &#8216;h&#8217; is <em>104</em>. Hex value of 104 is <em>68</em>. This <em>68</em> is stored in two nibbles. First nibble, meaning 4 bits, contain the value <em>6</em> and the second nibble contains the value <em>8</em>. In general we deal with high nibble first and going from left to right we pick the value <em>6</em> and then <em>8</em>.</p>

<p>However if you are dealing with low nibble first then low nibble value <em>8</em> will take the first slot and then </em>6</em> will come. Hence the result in &#8220;low nibble first&#8221; mode will be <em>86</em>.</p>

<p>This pattern is repeated for each byte. And because of that a hex value of <em>68 65 6c 6c 6f</em> looks like <em>86 56 c6 c6 f6</em> in low nibble first format.</p>

<h2>Mix and match directives</h2>

<p>In all the previous examples I used <em><em></em>. And a <em></em></em> means to keep going as long as it has to keep going. Lets see a few examples.</p>

<p>A single <em>C</em> will get a single byte.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can add more <em>Cs</em> if you like.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;CC&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="p">,</span> <span class="mi">101</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;CCC&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">108</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;CCCCC&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">111</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Rather than repeating all those directives, I can put a number to denote how many times you want previous directive to be repeated.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C5&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">111</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>I can use <em>*</em> to capture al the remaining bytes.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">104</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">111</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Below is an example where <em>MSB</em> and <em>LSB</em> are being mixed.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;aa&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;b8B8&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;10000110&quot;</span><span class="p">,</span> <span class="s2">&quot;01100001&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>pack is reverse of unpack</h2>

<p>Method <em>pack</em> is used to read the stored data. Let&#8217;s discuss a few examples.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span>  <span class="o">[</span><span class="mi">1000001</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;C&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="s2">&quot;A&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case the binary value is being interpreted as <em>8 bit unsigned integer</em> and the result is &#8216;A&#8217;.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="o">[</span><span class="s1">&#39;A&#39;</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;H&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="se">\xA0</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case the input &#8216;A&#8217; is not ASCII &#8216;A&#8217; but the hex &#8216;A&#8217;. Why is it hex &#8216;A&#8217;. It is hex &#8216;A&#8217; because the directive &#8216;H&#8217; is telling pack to treat input value as hex value. Since &#8216;H&#8217; is high nibble first and since the input has only one nibble then that means the second nibble is zero. So the input changes from <em>[&#8216;A&#8217;]</em> to <em>[&#8216;A0&#8217;]</em> .</p>

<p>Since hex value <em>A0</em> does not translate into anything in the ASCII table the final output is left as it and hence the result is <em>\xA0</em>. The leading <em>\x</em> indicates that the value is hex value.</p>

<p>Notice the in hex notation <em>A</em> is same as <em>a</em>. So in the above example I can replace <em>A</em> with <em>a</em> and the result should not change. Let&#8217;s try that.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="o">[</span><span class="s1">&#39;a&#39;</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;H&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="se">\xA0</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s discuss another example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="o">[</span><span class="s1">&#39;a&#39;</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;h&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above example notice the change. I changed directive from <em>H</em> to <em>h</em>. Since <em>h</em> means low nibble first and since the input has only one nibble the value of low nibble becomes zero and the input value is treated as high nibble value. That means value changes from <em>[&#8216;a&#8217;]</em> to <em>[&#8216;0a&#8217;]</em>. And the output will be <em>\x0A</em>. If you look at ASCII table then hex value <em>A</em> is ASCII value 10 which is <em>NL line feed, new line</em>. Hence we see <em>\n</em> as the output because it represents &#8220;new line feed&#8221;.</p>

<h2>Usage of unpack in Rails source code</h2>

<p>I did a quick grep in Rails source code and found following usage of unpack.</p>

<pre><code>email_address_obfuscated.unpack('C*')
'mailto:'.unpack('C*')
email_address.unpack('C*')
char.unpack('H2')
column.class.string_to_binary(value).unpack("H*")
data.unpack("m")
s.unpack("U*")
</code></pre>

<p>Already we have seen the usage of directive <em>C<em></em> and <em>H</em> for unpack. The directive <em>m</em> gives the base64 encoded value and the directive <em>U</em></em> gives the UTF-8 character. Here is an example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="s2">&quot;Hello&quot;</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;U*&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">72</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">111</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Tested with</h2>

<p>Above code was tested with ruby 1.9.2 .</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Infinite hash and default_proc]]></title>
    <link href="http://blog.bigbinary.com//2010/12/31/default_proc_in_infinite_hash.html"/>
    <updated>2010-12-31T00:00:00-05:00</updated>
    <id>http://blog.bigbinary.com//2010/12/31/default_proc_in_infinite_hash</id>
    <content type="html"><![CDATA[<p>I you already know how <a href="http://twitter.com/#!/tenderlove/status/5687291469107200">this infinite hash</a> works then you are all set. If not read along.</p>

<h2>Default value of Hash</h2>

<p>If I want a hash to have a default value then that&#8217;s easy.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;usa&#39;</span><span class="o">]</span> <span class="c1">#=&gt; 0</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code will give me a fixed value if key is not found. If I want dynamic value then I can use block form.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span><span class="p">{</span><span class="o">|</span><span class="n">h</span><span class="p">,</span><span class="n">k</span><span class="o">|</span> <span class="n">h</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="n">k</span><span class="o">.</span><span class="n">upcase</span><span class="p">}</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;usa&#39;</span><span class="o">]</span> <span class="c1">#=&gt; USA</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;india&#39;</span><span class="o">]</span> <span class="c1">#=&gt; INDIA</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Default value is hash</h2>

<p>If I want the default value to be a <em>hash</em> then it seems easy but it falls apart soon.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span><span class="p">{</span><span class="o">|</span><span class="n">h</span><span class="p">,</span><span class="n">k</span><span class="o">|</span> <span class="n">h</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="p">{}</span> <span class="p">}</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;usa&#39;</span><span class="o">].</span><span class="n">inspect</span> <span class="c1">#=&gt; {}</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;usa&#39;</span><span class="o">][</span><span class="s1">&#39;ny&#39;</span><span class="o">].</span><span class="n">inspect</span> <span class="c1">#=&gt; nil</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;usa&#39;</span><span class="o">][</span><span class="s1">&#39;ny&#39;</span><span class="o">][</span><span class="s1">&#39;nyc&#39;</span><span class="o">].</span><span class="n">inspect</span> <span class="c1">#=&gt; NoMethodError: undefined method `[]&#39; for nil:NilClass</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above if a key is missing for <em>h</em> then it returns a hash. However that returned hash is an ordinary hash which does not have a capability of returning another hash if a key is missing.</p>

<p>This is where <em>default_proc</em> comes into picture. <a href="http://ruby-doc.org/core-1.8.6/classes/Hash.html#M002854">hash.default_proc</a> returns the block which was passed to <em>Hash.new</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span><span class="p">{</span><span class="o">|</span><span class="n">h</span><span class="p">,</span><span class="n">k</span><span class="o">|</span> <span class="no">Hash</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="o">&amp;</span><span class="n">h</span><span class="o">.</span><span class="n">default_proc</span><span class="p">)}</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">h</span><span class="o">[</span><span class="s1">&#39;usa&#39;</span><span class="o">][</span><span class="s1">&#39;ny&#39;</span><span class="o">][</span><span class="s1">&#39;nyc&#39;</span><span class="o">].</span><span class="n">inspect</span> <span class="c1">#=&gt; {}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mime type resolution in Rails]]></title>
    <link href="http://blog.bigbinary.com//2010/11/23/mime-type-resolution-in-rails.html"/>
    <updated>2010-11-23T00:00:00-05:00</updated>
    <id>http://blog.bigbinary.com//2010/11/23/mime-type-resolution-in-rails</id>
    <content type="html"><![CDATA[<p>This is a long blog. If you want a summary then José Valim has provided a <a href="http://twitter.com/#!/josevalim/status/7928782685995009">summary in less than 140 characters</a>.</p>

<p>It is common to see following code in Rails</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">html</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">xml</span>  <span class="p">{</span> <span class="n">render</span> <span class="ss">:xml</span> <span class="o">=&gt;</span> <span class="vi">@users</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you want output in xml format then request with <em>.xml</em> extension at the end like this <code>localhost:3000/users.xml</code> and you will get the outupt in xml format.</p>

<p>What we saw is only one part of the puzzle. The other side of the equation is HTTP header field <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">Accept</a>  defined in HTTP RFC.</p>

<h2>HTTP Header Field Accept</h2>

<p>When browser sends a request then it also sends the information about what kind of resources the browser is capable of handling. Here are some of the examples of the <em>Accept</em> header a browser can send.</p>

<pre><code>text/plain

image/gif, images/x-xbitmap, images/jpeg, application/vnd.ms-excel, application/msword,
application/vnd.ms-powerpoint, */*

text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml,
application/xhtml+xml, text/html, multipart/mixed, */*
</code></pre>

<p>If you are reading this blog on a browser then you can find out what kind of <em>Accept</em> header your browser is sending by visiting <a href="http://pgl.yoyo.org/http/browser-headers.php">this link</a>. Here is list of <em>Accept</em> header sent by different browsers on my machine.</p>

<pre><code>Chrome: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Firefox: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Safari: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif,
image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*
</code></pre>

<p>Let&#8217;s take a look at the <em>Accept</em> header sent by Safari.</p>

<pre><code>Safari: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
</code></pre>

<p>Safari is saying that I can handle documents which are xml (application/xml), html (text/html) or plain text (text/plain) documents. And I can handle images such as image/png. If all else fails then send me whatever you can and I will try to render that document to the best of my ability.</p>

<p>Notice that there are also <strong>q</strong> values. That signifies the priority order. This is what HTTP spec has to say about <strong>q</strong>.</p>

<blockquote><p>Each media-range MAY be followed by one or more accept-params, beginning with the &#8220;q&#8221; parameter for indicating a relative quality factor. The first &#8220;q&#8221; parameter (if any) separates the media-range parameter(s) from the accept-params. Quality factors allow the user or user agent to indicate the relative degree of preference for that media-range, using the qvalue scale from 0 to 1 (section 3.9). The default value is q=1.</p></blockquote>

<p>The spec is saying is that each document type has a default value of <em>q</em> as 1. When <em>q</em> value is specified then take that value into account. For all documents that have same <em>q</em> value give high priority to the one that came first in the list. Based on that this should be the order in which documents should be sent to safari browser.</p>

<pre><code>application/xml (q is 1)
application/xhtml+xml (q is 1)
image/png (q is 1)
text/html (q is 0.9)
text/plain (q is 0.8)
\*/\* (q is 0.5)
</code></pre>

<p>Notice that Safari is nice enough to put a lower priority for */*. Chrome and Firefox also puts */* at a lower priority which is a good thing. Not so with IE which does not declare any q value for */* .</p>

<p>Look at the order again and you can see that <em>application/xml</em> has higher priority over <em>text/html</em>. What it means is that safari is telling Rails that I would prefer <em>application/xml</em> over <em>text/html</em>. Send me <em>text/html</em> only if you cannot send <em>application/xml</em>.</p>

<p>And let&#8217;s say that you have developed a RESTful app which is capable of sending output in both html and xml formats.</p>

<p>Rails being a good HTTP citizen should follow the HTTP_ACCEPT protocol and should send an xml document in this case. Again all you did was visit a website and safari is telling rails that send me xml document over html document. Clearly HTTP_ACCEPT values being sent by Safari is broken.</p>

<h2>HTTP_ACCEPT is broken</h2>

<p>HTTP_ACCEPT attribute concept is neat. It defines the order and the priority. However the implementation is broken by all the browser vendors. Given the case that browsers do not send proper HTTP_ACCEPT what can rails do. One solution is to ignore it completely. If you want <em>xml</em> output then request <em>http://localhost:3000/users.xml</em> . Solely relying on formats make life easy and less buggy. This is what Rails did for a long time.</p>

<p>Starting <a href="https://github.com/rails/rails/commit/2f4aaed7b3feb3be787a316fab3144c06bb21a27">this commit</a> ,by default, rails did ignore HTTP_ACCEPT attribute. Same is true for <a href="http://dev.twitter.com/doc/get/search">Twitter API</a> where HTTP_ACCEPT attribute is ignored and twitter solely relies on format to find out what kind of document should be returned.</p>

<p>Unfortunately this solution has its own sets of problems. Web has been there for a long time and there are a lot of applications who expect the response type to be RSS feed if they are sending <em>application/rss+xml</em> in their HTTP_ACCEPT attribute. It is not nice to take a hard stand and ask all of them to request with extension <em>.rss</em> .</p>

<h2>Parsing HTTP_ACCEPT attribute</h2>

<p>Parsing and obeying HTTP_ACCEPT attribute is filled with many edge cases. First let&#8217;s look at the code that decides what to parse and how to handle the data.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">BROWSER_LIKE_ACCEPTS</span> <span class="o">=</span> <span class="sr">/,\s*\*\/\*|\*\/\*\s*,/</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">formats</span>
</span><span class='line'>  <span class="n">accept</span> <span class="o">=</span> <span class="vi">@env</span><span class="o">[</span><span class="s1">&#39;HTTP_ACCEPT&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@env</span><span class="o">[</span><span class="s2">&quot;action_dispatch.request.formats&quot;</span><span class="o">]</span> <span class="o">||=</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">parameters</span><span class="o">[</span><span class="ss">:format</span><span class="o">]</span>
</span><span class='line'>      <span class="nb">Array</span><span class="p">(</span><span class="no">Mime</span><span class="o">[</span><span class="n">parameters</span><span class="o">[</span><span class="ss">:format</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>    <span class="k">elsif</span> <span class="n">xhr?</span> <span class="o">||</span> <span class="p">(</span><span class="n">accept</span> <span class="o">&amp;&amp;</span> <span class="n">accept</span> <span class="o">!~</span> <span class="no">BROWSER_LIKE_ACCEPTS</span><span class="p">)</span>
</span><span class='line'>      <span class="n">accepts</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="o">[</span><span class="no">Mime</span><span class="o">::</span><span class="no">HTML</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that if a format is passed like <em>http://localhost:3000/users.xml</em> or <em>http://localhost:3000/users.js</em> then Rails does not even parse  the HTTP_ACCEPT values. Also note that if browser is sending */* along with other values then Rails totally bails out and just returns Mime::HTML unless the request is ajax request.</p>

<p>Next I am going to discuss some of the cases in greater detail which should bring more clarity around this issue.</p>

<h2>Case 1: HTTP_ACCEPT is */*</h2>

<p>I have following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">html</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;this is html&#39;</span> <span class="p">}</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">js</span>  <span class="p">{</span> <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;this is js&#39;</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I am assuming that <em>HTTP_ACCEPT</em> value is */* . In this case browser is saying that send me whatever you got. Since browser is not dictating the order in which documents should be sent Rails will look at the order in which Mime types are declared in respond_to block and will pick the first one. Here is the corresponding code</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">negotiate_mime</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="n">formats</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">priority</span><span class="o">|</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">priority</span> <span class="o">==</span> <span class="no">Mime</span><span class="o">::</span><span class="no">ALL</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">order</span><span class="o">.</span><span class="n">first</span>
</span><span class='line'>    <span class="k">elsif</span> <span class="n">order</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">priority</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">priority</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">order</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="no">Mime</span><span class="o">::</span><span class="no">ALL</span><span class="p">)</span> <span class="p">?</span> <span class="n">formats</span><span class="o">.</span><span class="n">first</span> <span class="p">:</span> <span class="kp">nil</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>What it&#8217;s saying is that if Mime::ALL is sent then pick the first one declared in the respond_to block. So be careful with order in which formats are declared inside the respond_to block.</p>

<p>The order in which formats are declared can be real issue. Checkout these <a href="http://www.danielcadenas.com/2008/10/internet-explorer-7-accept-header-and.html">two</a> <a href="http://www.brentmc79.com/posts/ie7-accept-header-and-rails-respon-to-bug">cases</a> where the author ran into issue because of the order in which formats are declared.</p>

<p>So far so good. However what if there is no respond_to block. If I don&#8217;t have respond_to block and if I have <em>index.html.erb</em>, <em>index.js.erb</em> and <em>index.xml.builder</em> files in my view directory then which one will be picked up. In this case Rails will go over all the registered formats in the order in which they are delcared and will try to find a match . So in this case it matters in what order Mime types are registered. Here is the code that registers Mime types.</p>

<pre><code>Mime::Type.register "text/html", :html, %w( application/xhtml+xml ), %w( xhtml )
Mime::Type.register "text/plain", :text, [], %w(txt)
Mime::Type.register "text/javascript", :js, %w( application/javascript application/x-javascript )
Mime::Type.register "text/css", :css
Mime::Type.register "text/calendar", :ics
Mime::Type.register "text/csv", :csv
Mime::Type.register "application/xml", :xml, %w( text/xml application/x-xml )
Mime::Type.register "application/rss+xml", :rss
Mime::Type.register "application/atom+xml", :atom
Mime::Type.register "application/x-yaml", :yaml, %w( text/yaml )

Mime::Type.register "multipart/form-data", :multipart_form
Mime::Type.register "application/x-www-form-urlencoded", :url_encoded_form

# http://www.ietf.org/rfc/rfc4627.txt
# http://www.json.org/JSONRequest.html
Mime::Type.register "application/json", :json, %w( text/x-json application/jsonrequest )

# Create Mime::ALL but do not add it to the SET.
Mime::ALL = Mime::Type.new("*/*", :all, [])
</code></pre>

<p>As you can see <em>text/html</em> is first in the list, <em>text/javascript</em> next and then <em>application/xml</em>. So Rails will look for view file in the following order: <em>index.html.erb</em> , <em>index.js.erb</em> and <em>index.xml.builder</em> .</p>

<h2>Case 2: HTTP_ACCEPT with no */*</h2>

<p>I am going to assume that in this case HTTP_ACCEPT sent by browser looks really simple like this</p>

<pre><code>text/javascript, text/html, text/plain
</code></pre>

<p>I am also assuming that my respond_to block looks like this</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">html</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;this is html&#39;</span> <span class="p">}</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">js</span>  <span class="p">{</span> <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;this is js&#39;</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So browser is saying that I prefer documents in following order</p>

<pre><code> js
 html
 plain
</code></pre>

<p>The order in which formats are delcared is</p>

<pre><code>html (format.html)
js (format.js)
</code></pre>

<p>In this case rails will go through each Mime type that browser supports from top to bottom one by one. If a match is found then response is sent otherwise rails tries find match for next Mime type. First in the list of Mime types suppported by browser is js and Rails does find that my respond_to block supports <em>.js</em> . Rails executes <em>format.js</em> block and response is sent to browser.</p>

<h2>Case 3: Ajax requests</h2>

<p>When an AJAX request is made the Safari, Firefox and Chrome send only one item in HTTP_ACCEPT and that is */*. So if you are making an AJAX request then HTTP_ACCEPT for these three browsers will look like</p>

<pre><code>Chrome: */*
Firefox: */*
Safari: */*
</code></pre>

<p>and if your respond_to block looks like this</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">html</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;this is html&#39;</span> <span class="p">}</span>
</span><span class='line'>  <span class="nb">format</span><span class="o">.</span><span class="n">js</span>  <span class="p">{</span> <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;this is js&#39;</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>then the first one will be served based on the formats order. And in this case html respsone would be sent for an AJAX request. This is not what you want.</p>

<p>This is the reason why if you are using jQuery and if you are sending AJAX request then you should add something like this in your <em>application.js</em> file</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</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">$</span><span class="p">.</span><span class="nx">ajaxSetup</span><span class="p">({</span>
</span><span class='line'>    <span class="s1">&#39;beforeSend&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">xhr</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">xhr</span><span class="p">.</span><span class="nx">setRequestHeader</span><span class="p">(</span><span class="s2">&quot;Accept&quot;</span><span class="p">,</span> <span class="s2">&quot;text/javascript&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you are using a newer version of rails.js then you don&#8217;t need to add above code since it is already take care of for you through <a href="https://github.com/rails/jquery-ujs/commit/b6a3500bfb4b845d2c5e2f81b3c57a62fffd0845">this commit</a> .</p>

<h2>Trying it out</h2>

<p>If you want to play with HTTP_ACCEPT header then put the following line in your controller to inspect the HTTP_ACCEPT attribute.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">puts</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">[</span><span class="s1">&#39;HTTP_ACCEPT&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>I used following rake task to set custom HTTP_ACCEPT attribute.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s2">&quot;net/http&quot;</span>
</span><span class='line'><span class="nb">require</span> <span class="s2">&quot;uri&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">task</span> <span class="ss">:custom_accept</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">uri</span> <span class="o">=</span> <span class="no">URI</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s2">&quot;http://localhost:3000/users&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">http</span> <span class="o">=</span> <span class="no">Net</span><span class="o">::</span><span class="no">HTTP</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">uri</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">uri</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">request</span> <span class="o">=</span> <span class="no">Net</span><span class="o">::</span><span class="no">HTTP</span><span class="o">::</span><span class="no">Get</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">uri</span><span class="o">.</span><span class="n">request_uri</span><span class="p">)</span>
</span><span class='line'>  <span class="n">request</span><span class="o">[</span><span class="s2">&quot;Accept&quot;</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;text/html, application/xml, */*&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">response</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">response</span><span class="o">.</span><span class="n">body</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Thanks</h2>

<p>I got familiar with intricacies of mime parsing while working on <a href="https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6022-content-negotiation-fails-for-some-headers-regression#ticket-6022-10">ticket #6022</a> . A big thanks to <a href="http://twitter.com/#!/josevalim">José Valim</a> for patiently dealing with me while working on this ticket.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Variable declaration at the top is not just pretty thing]]></title>
    <link href="http://blog.bigbinary.com//2010/11/22/variable-hoisting-is-not-just-pretty-thing.html"/>
    <updated>2010-11-22T00:00:00-05:00</updated>
    <id>http://blog.bigbinary.com//2010/11/22/variable-hoisting-is-not-just-pretty-thing</id>
    <content type="html"><![CDATA[<p>I was discussing JavaScript code with a friend and he noticed that I had declared all the variables at the top.</p>

<p>He likes to declare the variable where they are used to be sure that the variable being used is declared with var otherwise that variable will become global variable. This fear of accidentally creating a global variables wants him to see variable declaration next to where it is being used.</p>

<h2>Use the right tool</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">payment</span><span class="p">;</span>
</span><span class='line'><span class="nx">payment</span> <span class="o">=</span> <span class="nx">soldPrice</span> <span class="o">+</span> <span class="nx">shippingCost</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case user has declared payment variable in the middle so that he is sure that payment is declared. However if there is a typo as given below then he has accidentally created a global variable &#8220;payment&#8221;.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">paymnet</span><span class="p">;</span> <span class="c1">//there is a typo</span>
</span><span class='line'><span class="nx">payment</span> <span class="o">=</span> <span class="nx">soldPrice</span> <span class="o">+</span> <span class="nx">shippingCost</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Having variable declaration next to where variable is being used is not a safe way of guarnateeing that variable is declared. Use the right tool and that would be <a href="http://www.jslint.com/">jslint</a> validation. I use MacVim and I use <a href="http://www.javascriptlint.com/">Javascript Lint</a>. So every time I save a JavaScript file validation is done and I get warning if I am accidentally creating a global variable.</p>

<p>You can configure such that JSLint validation runs when you check your code into git or when you push to github. Or you can have a custom rake task. Many solutions are available choose the one that fits you. But do not rely on manual inspection.</p>

<h2>Variable declaration are being moved to the top by the browser</h2>

<p>Take a look at following code. One might expect that console.log will print &#8220;Neeraj&#8221; but the output will be &#8220;undefined&#8221; . That is because even though you have declaration variables next to where they are being used, browsers lift those declarations to the very top.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;Neeraj&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">lab</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">name</span><span class="p">);</span>
</span><span class='line'> <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</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">name</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">lab</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Browser converts above code into one shown below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;Neeraj&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">lab</span><span class="p">(){</span>
</span><span class='line'> <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="kc">undefined</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">name</span><span class="p">);</span>
</span><span class='line'> <span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</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">name</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">lab</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order to avoid this kind of mistakes it is preferred to declared variables at the top like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;Neeraj&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">lab</span><span class="p">(){</span>
</span><span class='line'> <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="s1">&#39;John&#39;</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">name</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">name</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">lab</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looking at the first set of code a person might think that</p>

<p>Also remember that scope of variable in JavaScript at the function level.</p>

<h2>Implications on how functions are declared</h2>

<p>There are two ways of declaring a function.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">myfunc</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){};</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">myfunc2</span><span class="p">(){};</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the first case only the variable declaration <em>myfunc</em> is getting hoisted up. The defintion of myfunc is <em>NOT</em> getting hoisted. In the second case both variable declaration and function defintion is getting hoisted up. For more information on this refer to my <a href="http://BigBinary.com/blog/2010/03/15/two-ways-of-declaring-functions.html">previous blog on the same topic</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[An inline confirmation utility powered by jQuery]]></title>
    <link href="http://blog.bigbinary.com//2010/11/02/iconfirm-an-inline-confirmation-jquery-plugin.html"/>
    <updated>2010-11-02T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/11/02/iconfirm-an-inline-confirmation-jquery-plugin</id>
    <content type="html"><![CDATA[<p>I needed inline confirmation utility.</p>

<p>With jQuery it was easy.</p>

<p>After a few hours I had <em>iconfirm</em>.</p>

<p><a href="http://github.com/neerajdotname/iconfirm">Source code</a> is at github.</p>

<p><a href="http://neerajdotname.github.com/iconfirm/">Live Demo</a> is also available.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Return false has changed in jquery 1.4.3]]></title>
    <link href="http://blog.bigbinary.com//2010/10/25/return-false-in-jquery-1.4.3.html"/>
    <updated>2010-10-25T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/10/25/return-false-in-jquery-1.4.3</id>
    <content type="html"><![CDATA[<p>jQuery 1.4.3 was recently <a href="http://blog.jquery.com/2010/10/16/jquery-143-released/">released</a>. If you upgrade to jQuery 1.4.3 you will notice that the behavior of <em>return false</em> has changed in this version. First let&#8217;s see what <em>return false</em> does.</p>

<h2>return false</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><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;clicked&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>First ensure that above code is executed on domready. Now if I click on any link then two things will happen.</p>

<pre><code>e.preventDefault() will be called .
e.stopPropagation() will be called .
</code></pre>

<h2>e.preventDefault()</h2>

<p>As the name suggets, calling <em>e.preventDefault()</em> will make sure that the default beahvior is not executed.</p>

<pre><code>&lt;a href='www.google.com'&gt;click me&lt;/a&gt;
</code></pre>

<p>If above link is clicked then the default behavior of the browser is to take you to <em>www.google.com</em>. However by invoking <em>e.preventDefault()</em> browser will not go ahead with default behavior and I will <strong>not</strong> be taken to <em>www.google.com</em>.</p>

<h2>e.stopPropagation</h2>

<p>When a link is clicked then an event &#8220;click event&#8221; is created. And this event bubbles all the way up to the top. By invoking <em>e.stopPropagation</em> I am asking browser to not to propagate the event. In other words the event will stop bubbling.</p>

<pre><code>&lt;div class='first'&gt;
  &lt;div class='two'&gt;
    &lt;a href='www.google.com'&gt;click me&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>If I click on &#8220;click me&#8221; then &#8220;click event&#8221; will start bubbling. Now let&#8217;s say that I catch this event at <em>.two</em> and if I call <em>e.stopPropagation()</em> then this event will never reach to <em>.first</em> .</p>

<h2>e.stopImmediatePropagation</h2>

<p>First note that you can bind more than one event to an element. Take a look at following case.</p>

<pre><code>&lt;a class='one'&gt;one&lt;/a&gt;
</code></pre>

<p>I am going to bind three events to the above element.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</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;first&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</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;second&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">e</span><span class="p">.</span><span class="nx">stopImmediatePropagation</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s1">&#39;click&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</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;third&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this case there are three events bound to the same element. Notice that second event binding invokes <em>e.stopImmediatePropagation()</em> . Calling <em>e.stopImmediatePropagation</em> does two things.</p>

<p>Just like <em>stopPropagation</em> it will stop the bubbling of the event. So any parent of this element will not get this event.</p>

<p>However <em>stopImmdiatePropagation</em> stops the event bubbling even to the siblings. It kills the event right then and there. That&#8217;s it. End of the event.</p>

<p>Once again calling <em>stopPropagation</em> means stop this event going to parent. And calling <em>stopImmediatePropagation</em> means stop passing this even to other evevent handlers bound to itself.</p>

<p>If you are interested <a href="http://www.w3.org/TR/2006/WD-DOM-Level-3-Events-20060413/events.html#Events-Event-stopImmediatePropagation">here is link to </a> DOM Level 3 Events sepc.</p>

<h2>Back to original problem</h2>

<p>Now that I have described what <em>preventDefault</em>, <em>stopPropagation</em> and <em>stopImmediatePropagation</em> does lets see what changed in jQuery 1.4.3.</p>

<p>In jQuery 1.4.2 when I execute &#8220;return false&#8221; then that action was same as executing:</p>

<pre><code>e.preventDefault()
e.stopPropagation()
e.stopImmediatePropagation()
</code></pre>

<p>Now <em>e.stopImmediatePropagation</em> internally calls <em>e.stopPragation</em> but I have added here for visual clarity.</p>

<p>Fact that <em>return false</em> was calling <em>e.stopImmeidatePropagation</em> was a bug. Get that. It was a bug which got fixed in jquery 1.4.3.</p>

<p>So in jquery 1.4.3 <em>e.stopImmediatePropagation</em> is not called. Checkout this piece of code from <em>events.js</em> of jquery code base.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span> <span class="nx">ret</span> <span class="o">!==</span> <span class="kc">undefined</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">event</span><span class="p">.</span><span class="nx">result</span> <span class="o">=</span> <span class="nx">ret</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span> <span class="nx">ret</span> <span class="o">===</span> <span class="kc">false</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">event</span><span class="p">.</span><span class="nx">stopPropagation</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see when <em>return false</em> is invoked then <em>e.stopImmediatePropagation</em> is <strong>not</strong> called.</p>

<p>I tried to find which commit made this change but I could not go far because of <a href="http://github.com/jeresig/sizzle/commit/852d3d0a60de709e83b65ddb54e6a095498ad1a8#commitcomment-174932">this issue</a>.</p>

<h2>It gets complicated with live and a bug in jQuery 1.4.3</h2>

<p>To make the case complicated, jQuery 1.4.3 has a bug in which <em>e.preventStopImmediatePropagation</em> doest not work. Here is <a href="http://forum.jquery.com/topic/e-stopimmedidatepropagation-does-not-work-with-live-or-with-delegate">a link to this bug</a> I reported.</p>

<p>To understand the bug take a look at following code:</p>

<pre><code>&lt;a href='' class='first'&gt;click me&lt;/a&gt;

$('a.first').live('click', function(e){
    alert('hello');
    e.preventDefault();
    e.stopImmediatePropagation();
});

$('a.first').live('click', function(){
    alert('world');
});
</code></pre>

<p>Since I am invoking <em>e.stopImmediatePropagation</em> I should never see <em>alert world</em>. However you will see that alert if you are using jQuery 1.4.3. You can play with it <a href="http://jsbin.com/ujipi4/3#html">here</a> .</p>

<p>This bug has been fixed as per <a href="http://github.com/jquery/jquery/commit/974b5aeab7a3788ff5fb9db87b9567784e0249fc">this commit</a> . Note that the commit mentioned was done after the release of jQuery 1.4.3. To get the fix you will have to wait for jQuery 1.4.4 release or use jQuery edge.</p>

<h2>I am using rails.js (jquery-ujs). What do I do?</h2>

<p>As I have shown &#8220;return false&#8221; does not work in jQuery 1.4.3 . However I would have to like have as much backward compatibility in <em>jquery-ujs</em> as much possible so that the same code base works with jQuery 1.4 through 1.4.3 since not every one upgrades immediately.</p>

<p><a href="http://github.com/rails/jquery-ujs/commit/f991faf0074487b43a061168cdbfd102ee0c182c">This commit</a> should make <em>jquery-ujs</em> jquery 1.4.3 compatible. <a href="http://github.com/rails/jquery-ujs/issues">Many issues</a> have been logged at jquery-ujs and I will take a look at all of them one by one. Pleaes do provide your feedback.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[instance_exec , changing self and params]]></title>
    <link href="http://blog.bigbinary.com//2010/05/28/instance-exec-changing-self-and-parameters-to-proc.html"/>
    <updated>2010-05-28T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/05/28/instance-exec-changing-self-and-parameters-to-proc</id>
    <content type="html"><![CDATA[<p>Following code will print <em>99</em> as the output.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Klass</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@secret</span> <span class="o">=</span> <span class="mi">99</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="nb">puts</span> <span class="no">Klass</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">instance_eval</span> <span class="p">{</span> <span class="vi">@secret</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Nothing great there. However try passing a paramter to <em>instance_eval</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">puts</span> <span class="no">Klass</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">instance_eval</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="p">{</span> <span class="vi">@secret</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You will get following error.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">wrong</span> <span class="n">number</span> <span class="n">of</span> <span class="n">arguments</span> <span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="mi">0</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So <em>instance_eval</em> does not allow you to pass parameters to a block.</p>

<h2>How to get around to the restriction that instance_eval does not accept parameters</h2>

<p><em>instance_exec</em> was added to ruby 1.9 and it allows you to pass parameters to a proc. This feature has been backported to ruby 1.8.7 so we don&#8217;t really need ruby 1.9 to test this feature. Try this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Klass</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@secret</span> <span class="o">=</span> <span class="mi">99</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="nb">puts</span> <span class="no">Klass</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">instance_exec</span><span class="p">(</span><span class="s1">&#39;secret&#39;</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span> <span class="nb">eval</span><span class="s2">&quot;@</span><span class="si">#{</span><span class="n">t</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code works. So now we can pass parameters to block. Good.</p>

<h2>Changing value of self</h2>

<p>Another feature of <em>instance_exec</em> is that it changes the value of <em>self</em>. To illustrate that I need to give a longer example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<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='ruby'><span class='line'><span class="k">module</span> <span class="nn">Kernel</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">singleton_class</span>
</span><span class='line'>    <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>      <span class="nb">self</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Human</span>
</span><span class='line'>  <span class="nb">proc</span> <span class="o">=</span> <span class="nb">lambda</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s1">&#39;proc says my class is &#39;</span> <span class="o">+</span> <span class="nb">self</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">to_s</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">singleton_class</span><span class="o">.</span><span class="n">instance_eval</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">define_method</span><span class="p">(</span><span class="ss">:lab</span><span class="p">)</span>  <span class="k">do</span>
</span><span class='line'>      <span class="nb">proc</span><span class="o">.</span><span class="n">call</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Developer</span> <span class="o">&lt;</span> <span class="no">Human</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Human</span><span class="o">.</span><span class="n">lab</span> <span class="c1"># class is Human</span>
</span><span class='line'><span class="no">Developer</span><span class="o">.</span><span class="n">lab</span> <span class="c1"># class is Human ; oops</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that in that above case <em>Developer.lab</em> says &#8220;Human&#8221;. And that is the right answer from ruby perspective. However that is not what I intended. ruby stores the binding of the proc in the context it was created and hence it rightly reports that self is &#8220;Human&#8221; even though it is being called by <em>Developer</em>.</p>

<p>Go to <a href="http://facets.rubyforge.org/apidoc/api/core/index.html">http://facets.rubyforge.org/apidoc/api/core/index.html</a> and look for <em>instance_exec</em> method. The doc says</p>

<blockquote>
Evaluate the block with the given arguments within the context of this object, so self is set to the method receiver.
</blockquote>


<p>It means that <em>instance_exec</em> evaluates self in a new context. Now try the same code with <em>instance_exec</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Kernel</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">singleton_class</span>
</span><span class='line'>    <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>      <span class="nb">self</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Human</span>
</span><span class='line'>  <span class="nb">proc</span> <span class="o">=</span> <span class="nb">lambda</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s1">&#39;proc says my class is &#39;</span> <span class="o">+</span> <span class="nb">self</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">to_s</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">singleton_class</span><span class="o">.</span><span class="n">instance_eval</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">define_method</span><span class="p">(</span><span class="ss">:lab</span><span class="p">)</span>  <span class="k">do</span>
</span><span class='line'>      <span class="nb">self</span><span class="o">.</span><span class="n">instance_exec</span> <span class="o">&amp;</span><span class="nb">proc</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Developer</span> <span class="o">&lt;</span> <span class="no">Human</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Human</span><span class="o">.</span><span class="n">lab</span> <span class="c1"># class is Human</span>
</span><span class='line'><span class="no">Developer</span><span class="o">.</span><span class="n">lab</span> <span class="c1"># class is Developer</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this case <em>Developer.lab</em> says <em>Developer</em> and not <em>Human</em>.</p>

<p>You can also checkout <a href="http://eigenclass.org/hiki.rb?instance_exec#f01">this page</a> which has much more detailed explanation of <em>instance_exec</em> and also emphasizes that <em>instance_exec</em> does pass a new value of <em>self</em> .</p>

<p><em>instance_exec</em> is so useful that <em>ActiveSupport</em> needs it. And since ruby 1.8.6 does not have it <em>ActiveSupport</em> has code to support it.</p>

<p>I came across <em>instance_exec</em> issue while resolving <a href="https://rails.lighthouseapp.com/projects/8994/tickets/4507">#4507 rails ticket</a> . The final solution did not need <em>instance_exec</em> but I learned a bit about it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[$LOADED_FEATURES and require, load, require_dependency]]></title>
    <link href="http://blog.bigbinary.com//2010/05/12/require-load-loaded_features.html"/>
    <updated>2010-05-12T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/05/12/require-load-loaded_features</id>
    <content type="html"><![CDATA[<p>Rails developers know that in development mode classes are loaded on demand. In production mode all the classes are loaded as part of bootstrapping the system. Also in development mode classes are reloaded every single time page is refreshed.</p>

<p>In order to reload the class, Rails first has to <em>unload</em> . That unloading is done something like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># unload User class</span>
</span><span class='line'><span class="no">Objet</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:remove_const</span><span class="p">,</span> <span class="ss">:User</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>However a class might have other constants and they need to be unloaded too. Before you unload those constants you need to know all the constants that are defined in the class that is being loaded. Long story short rails keep track of every single constant that is loaded when it loads <em>User</em> or <em>UserController</em>.</p>

<h2>Dependecy mechanism is not perfect</h2>

<p>Sometimes dependecy mechanism by rails lets a few things fall through the crack. Try following case.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;open-uri&#39;</span>
</span><span class='line'><span class="k">class</span> <span class="nc">UsersController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;http://www.ruby-lang.org/&quot;</span><span class="p">)</span> <span class="p">{</span><span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="p">}</span>
</span><span class='line'>    <span class="n">render</span> <span class="ss">:text</span> <span class="o">=&gt;</span> <span class="s1">&#39;hello&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Start the server in development mode and visit <em>http://localhost:3000/users</em> . First time every thing will come up fine. Now refresh the page. This time you should get an exception <em>uninitialized constant OpenURI</em> .</p>

<p>So what&#8217;s going on.</p>

<p>After the page is served the very first time then at the end of response rails will unload all the constants that were autoloaded including <em>UsersController</em>. However while unloading <em>UsersContorller</em> rails will also unload <em>OpenURI</em>.</p>

<p>When the page is refreshed then <em>UsersController</em> will be loaded and <em>require &#8216;open-uri&#8217;</em> will be called. However that require will return <em>false</em>.</p>

<h2>Why require returns false</h2>

<p>Try the following test case in irb.</p>

<p>step 1</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">002</span><span class="p">:</span><span class="mi">0</span><span class="o">&gt;</span> <span class="nb">require</span> <span class="s1">&#39;ostruct&#39;</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>step 2</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">005</span><span class="p">:</span><span class="mi">0</span><span class="o">*</span> <span class="no">Object</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:remove_const</span><span class="p">,</span> <span class="ss">:OpenStruct</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="no">OpenStruct</span>
</span></code></pre></td></tr></table></div></figure>


<p>step 3 : ensure that OpenStruct is truly removed</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">006</span><span class="p">:</span><span class="mi">0</span><span class="o">&gt;</span> <span class="no">Object</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:remove_const</span><span class="p">,</span> <span class="ss">:OpenStruct</span><span class="p">)</span>
</span><span class='line'><span class="no">NameError</span><span class="p">:</span> <span class="n">constant</span> <span class="no">Object</span><span class="o">::</span><span class="no">OpenStruct</span> <span class="ow">not</span> <span class="n">defined</span>
</span><span class='line'>        <span class="n">from</span> <span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">6</span><span class="ss">:in</span> <span class="sb">`remove_const&#39;</span>
</span><span class='line'><span class="sb">        from (irb):6:in `</span><span class="nb">send</span><span class="err">&#39;</span>
</span><span class='line'>        <span class="n">from</span> <span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">6</span>
</span></code></pre></td></tr></table></div></figure>


<p>step 4</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">007</span><span class="p">:</span><span class="mi">0</span><span class="o">&gt;</span> <span class="nb">require</span> <span class="s1">&#39;ostruct&#39;</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="kp">false</span>
</span></code></pre></td></tr></table></div></figure>


<p>step 5</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">00</span><span class="mi">9</span><span class="p">:</span><span class="mi">0</span><span class="o">&gt;</span> <span class="no">OpenStruct</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="no">NameError</span><span class="p">:</span> <span class="n">uninitialized</span> <span class="n">constant</span> <span class="no">OpenStruct</span>
</span><span class='line'>        <span class="n">from</span> <span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">9</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that in the above case in step 4 require returns <em>false</em>. &#8216;require&#8217; checks against <em>$LOADED_FEATURES</em>. When <em>OpenStruct</em> was removed then it was not removed from <em>$LOADED_FEATURES</em> and hence ruby thought <em>ostruct</em> is already loaded.</p>

<p>How to get around to this issue.</p>

<p><em>require</em> loads only once. However <em>load</em> loads every single time. In stead of &#8216;require&#8217;, &#8216;load&#8217; could be used in this case.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">001</span><span class="p">:</span><span class="mi">0</span><span class="o">&gt;</span> <span class="nb">load</span> <span class="s1">&#39;ostruct.rb&#39;</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">002</span><span class="p">:</span><span class="mi">0</span><span class="o">&gt;</span> <span class="no">OpenStruct</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="c1">#&lt;OpenStruct&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Back to the original problem</h2>

<p>In our rails application refresh of the page is failing. To get around to that issue use <em>require_dependency</em> instead of <em>require</em>. <em>require_dependency</em> is a rails thing. Under the hood rails does the same trick we did in the previous step. Rails calls <em>kernel.load</em> to load the constants that would fail if require were used.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I am not seeing hoptoad messages. Now I know why.]]></title>
    <link href="http://blog.bigbinary.com//2010/04/23/I-am-not-seeing-hoptoad-messages.html"/>
    <updated>2010-04-23T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/04/23/I-am-not-seeing-hoptoad-messages</id>
    <content type="html"><![CDATA[<p><em>Following code has been tested with Rails 2.3.5 .</em></p>

<p>Every one knows for sure that hoptoad notifier sends exception messages to server in <em>production</em> environment. Between &#8216;development&#8217; and &#8216;production&#8217; there could be a number of environments. Some of these would have settings closer to &#8216;development&#8217; environment and some would have setting closely matching the settings of &#8216;production&#8217; environment.</p>

<p>When you have many environments and when an exception occurrs, one is not really sure if that message is getting logged at hoptoad or not. Here is a run down of which messages will get logged and why.</p>

<h2>It alls starts with rails</h2>

<p>When an exception occurs while rendering a page then <em>action_controller</em> catches the exception.  Following logic is evaluated to decide if user should see an error page with full stack trace or &#8216;we are sorry something went wrong&#8217; message.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">consider_all_requests_local</span> <span class="o">||</span> <span class="n">local_request?</span>
</span><span class='line'>  <span class="n">rescue_action_locally</span><span class="p">(</span><span class="n">exception</span><span class="p">)</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="n">rescue_action_in_public</span><span class="p">(</span><span class="n">exception</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s look at first part <em>consider_all_requests_local</em> . Open <em>~/config/environments/development.rb</em> and <em>~/config/environemtns/production.rb</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># ~/config/environments/development.rb</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">action_controller</span><span class="o">.</span><span class="n">consider_all_requests_local</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ~/config/environments/production.rb</span>
</span><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">action_controller</span><span class="o">.</span><span class="n">consider_all_requests_local</span> <span class="o">=</span> <span class="kp">false</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see in development mode all requests are local. Be careful with what you put in your intermediary environments.</p>

<p>If you want to override that value then you can do like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#~/app/contollers/application_controller.rb</span>
</span><span class='line'><span class="no">ActionController</span><span class="o">::</span><span class="no">Base</span><span class="o">.</span><span class="n">consider_all_requests_local</span> <span class="o">=</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>The second part of the equation was <em>local_request?</em> .</p>

<p>Rails has following code for that method.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">LOCALHOST</span> <span class="o">=</span> <span class="s1">&#39;127.0.0.1&#39;</span><span class="o">.</span><span class="n">freeze</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">local_request?</span>
</span><span class='line'>  <span class="n">request</span><span class="o">.</span><span class="n">remote_addr</span> <span class="o">==</span> <span class="no">LOCALHOST</span> <span class="o">&amp;&amp;</span> <span class="n">request</span><span class="o">.</span><span class="n">remote_ip</span> <span class="o">==</span> <span class="no">LOCALHOST</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see all requests coming from <em>127.0.0.1</em> are considered local even if RAILS_ENV is &#8216;production&#8217;. For testing purpose you can override this value like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#~/app/contollers/application_controller.rb</span>
</span><span class='line'><span class="k">def</span> <span class="nf">local_request?</span>
</span><span class='line'> <span class="kp">false</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Hoptoad has access to exception now what</h2>

<p>If <em>consider_all_request_local</em> is false and if request is not local then hoptoad will get access to exception thanks to <em>alias_method_chain</em>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">included</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
</span><span class='line'>  <span class="n">base</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:alias_method</span><span class="p">,</span> <span class="ss">:rescue_action_in_public_without_hoptoad</span><span class="p">,</span> <span class="ss">:rescue_action_in_public</span><span class="p">)</span>
</span><span class='line'>  <span class="n">base</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:alias_method</span><span class="p">,</span> <span class="ss">:rescue_action_in_public</span><span class="p">,</span> <span class="ss">:rescue_action_in_public_with_hoptoad</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In <em>rescue_action_in_public_with_hoptoad</em> there is a call to <em>notify_or_ignore</em> like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">unless</span> <span class="n">hoptoad_ignore_user_agent?</span>
</span><span class='line'>  <span class="no">HoptoadNotifier</span><span class="o">.</span><span class="n">notify_or_ignore</span><span class="p">(</span><span class="n">exception</span><span class="p">,</span> <span class="n">hoptoad_request_data</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>For majority of us there is no special handling for a particular <em>user_agent</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">notify_or_ignore</span><span class="p">(</span><span class="n">exception</span><span class="p">,</span> <span class="n">opts</span> <span class="o">=</span> <span class="p">{})</span>
</span><span class='line'>  <span class="n">notice</span> <span class="o">=</span> <span class="n">build_notice_for</span><span class="p">(</span><span class="n">exception</span><span class="p">,</span> <span class="n">opts</span><span class="p">)</span>
</span><span class='line'>  <span class="n">send_notice</span><span class="p">(</span><span class="n">notice</span><span class="p">)</span> <span class="k">unless</span> <span class="n">notice</span><span class="o">.</span><span class="n">ignore?</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hoptoad defines following methods as ignorable by default and you won&#8217;t get notifications for following types of exceptions.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">IGNORE_DEFAULT</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;ActiveRecord::RecordNotFound&#39;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s1">&#39;ActionController::RoutingError&#39;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s1">&#39;ActionController::InvalidAuthenticityToken&#39;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s1">&#39;CGI::Session::CookieStore::TamperedWithCookie&#39;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s1">&#39;ActionController::UnknownAction&#39;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next hop is method <em>send_notice</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">send_notice</span><span class="p">(</span><span class="n">notice</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">configuration</span><span class="o">.</span><span class="n">public?</span>
</span><span class='line'>    <span class="n">sender</span><span class="o">.</span><span class="n">send_to_hoptoad</span><span class="p">(</span><span class="n">notice</span><span class="o">.</span><span class="n">to_xml</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>configuration.public?</em> is defined like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="vi">@development_environments</span> <span class="o">=</span> <span class="sx">%w(development test cucumber)</span>
</span><span class='line'><span class="k">def</span> <span class="nf">public?</span>
</span><span class='line'>  <span class="o">!</span><span class="n">development_environments</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">environment_name</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see if the <em>Rails.env</em> is <em>development</em> or <em>test</em> or <em>cucumber</em> the exception will not be reported to hoptoad server.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[List of only the elements that contains]]></title>
    <link href="http://blog.bigbinary.com//2010/04/12/list-of-only-the-elements.html"/>
    <updated>2010-04-12T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/04/12/list-of-only-the-elements</id>
    <content type="html"><![CDATA[<p>I was toying with the <a href="http://kilianvalkhof.com/2010/javascript/how-to-build-a-fast-simple-list-filter-with-jquery">simple list filter plugin</a> and ended up with this markup.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">div</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;lab&quot;</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">ul</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;list&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="o">&gt;</span><span class="nx">USA</span><span class="o">&lt;</span><span class="err">/a&gt;&lt;/li&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="o">&gt;</span><span class="nx">USA</span><span class="o">&lt;</span><span class="err">/a&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/p&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>I want to get all links that contains the word <em>USA</em>. Simple enough. jQuery supports <em>contains</em> selector.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;:contains(&#39;USA&#39;)&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above query results in following items.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">[</span><span class="n">html</span><span class="p">,</span> <span class="n">body</span><span class="c1">#body, div#lab, ul#list, li, a, ul, p, a]</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is because {contains](http://api.jquery.com/contains-selector) looks for given string under all the descendants.</p>

<h2>has method to rescue</h2>

<p>jQuery has <a href="http://api.jquery.com/has">has</a> method which returns the list of elements which have a descendant which has the given string.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">b</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">).</span><span class="nx">has</span><span class="p">(</span><span class="s2">&quot;:contains(&#39;USA&#39;)&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above query results in following items.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">[</span><span class="n">html</span><span class="p">,</span> <span class="n">body</span><span class="c1">#body, div#lab, ul#list, li, ul, p]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Final result</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">a</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;:contains(&#39;USA&#39;)&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">b</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">).</span><span class="nx">has</span><span class="p">(</span><span class="s2">&quot;:contains(&#39;USA&#39;)&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">c</span> <span class="o">=</span> <span class="nx">a</span><span class="p">.</span><span class="nx">not</span><span class="p">(</span><span class="nx">b</span><span class="p">)</span> <span class="p">;</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above query results in following items.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'> <span class="o">[</span><span class="n">a</span><span class="p">,</span> <span class="n">a</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Singleton function in JavaScript]]></title>
    <link href="http://blog.bigbinary.com//2010/04/11/singleton-function-in-javascript.html"/>
    <updated>2010-04-11T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/04/11/singleton-function-in-javascript</id>
    <content type="html"><![CDATA[<p>Recently I was discussed with a friend how to create a singleton function in JavaScript. I am putting the same information here in case it might help someone understand JavaScript better.</p>

<h2>Creating an Object</h2>

<p>Simplest solution is creating an instance of the object.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Logger</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</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">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">l1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="s1">&#39;/home&#39;</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">l1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">l2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="s1">&#39;/dev&#39;</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">l2</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">l1</span> <span class="o">===</span> <span class="nx">l2</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above solution works. However <em>l2</em> is a new instance of <em>Logger</em> .</p>

<h2>Singleton solution using a global variable</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">global_logger</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Logger</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">global_logger</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;global logger already present&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">;</span>
</span><span class='line'>      <span class="nb">window</span><span class="p">.</span><span class="nx">global_logger</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="nb">window</span><span class="p">.</span><span class="nx">global_logger</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">l1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="s1">&#39;/home&#39;</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">l1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">l2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="s1">&#39;/dev&#39;</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">l2</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">l1</span> <span class="o">===</span> <span class="nx">l2</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above solution works. However this solution relies on creating a global variable. To the extent possible it is best to avoid polluting global namespace.</p>

<h2>Single solution without polluting global namespace</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Logger</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">_instance</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">path</span><span class="p">)</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">_instance</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;an instance is already present&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">this</span><span class="p">.</span><span class="nx">path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">;</span>
</span><span class='line'>          <span class="nx">_instance</span> <span class="o">=</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="k">return</span> <span class="nx">_instance</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span> <span class="p">();</span> <span class="c1">//note that it is self invoking function</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">l1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="s1">&#39;/root&#39;</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">l1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">l2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Logger</span><span class="p">(</span><span class="s1">&#39;/dev&#39;</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">l2</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">l1</span> <span class="o">===</span> <span class="nx">l2</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This solution does not pollute global namespace.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Regular expression in JavaScript]]></title>
    <link href="http://blog.bigbinary.com//2010/03/31/regular-expressions-in-JavaScript.html"/>
    <updated>2010-03-31T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/03/31/regular-expressions-in-JavaScript</id>
    <content type="html"><![CDATA[<p>Regular expressions is a powerful tool in any language. Here I am discussing how to use regular expression in JavaScript.</p>

<h2>Defining regular expressions</h2>

<p>In JavaScript regular expression can be defined two ways.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello/ig</span><span class="p">;</span> <span class="c1">// i is for ignore case. g is for global.</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">&quot;hello&quot;</span><span class="p">,</span> <span class="s2">&quot;ig&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>If I am defining regular expression using &#8220;RegExp&#8221;:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp#Properties_2 then I need to add escape character in certain cases.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello_\w*/ig</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">&quot;hello_\\w*&quot;</span><span class="p">,</span> <span class="s2">&quot;ig&quot;</span><span class="p">);</span> <span class="c1">//notice the extra backslash before \w</span>
</span></code></pre></td></tr></table></div></figure>


<p>When I am defining regular expression using RegExp then <em>\w</em> needs to be escaped otherwise it would be
taken literally.</p>

<h2>test method</h2>

<p><a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/test">test method</a> is to check if a match is found or not. This method returns true or false.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello/ig</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;hello_you&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bool</span> <span class="o">=</span> <span class="nx">regex</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>exec method</h2>

<p><a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp/exec">exec method</a> finds if a match is found or not. It returns an array if a match is found. Otherwise it returns null.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello_\w*/ig</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;hello_you&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">matches</span> <span class="o">=</span> <span class="nx">regex</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">text</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">matches</span><span class="p">);</span> <span class="c1">//=&gt; hello_you</span>
</span></code></pre></td></tr></table></div></figure>


<h2>match method</h2>

<p><a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/match">match method</a> acts exactly like exec method if no <em>g</em> parameter is passed. When global flag is turned on the match returns an Array containing all the matches.</p>

<p>Note that in <em>exec</em> the syntax was <em>regex.exec(text)</em> while in <em>match</em> method the syntax is
<em>text.match(regex)</em> .</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello_\w*/i</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;hello_you and hello_me&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">matches</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</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">matches</span><span class="p">);</span> <span class="c1">//=&gt; [&#39;hello_you&#39;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now with global flag turned on.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/hello_\w*/ig</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;hello_you and hello_me&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">matches</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</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">matches</span><span class="p">);</span> <span class="c1">//=&gt; [&#39;hello_you&#39;, &#39;hello_me&#39;]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Getting multiple matches</h2>

<p>Once again both <em>exec</em> and <em>match</em> method without <em>g</em> option do not get all the matching values from a string. If you want all the matching values then you need to iterate through the text. Here is an example.</p>

<p>Get both the bug numbers in the following case.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">matches</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/#(\d+)/ig</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bugs #1234 and #5678&#39;</span><span class="p">;</span>
</span><span class='line'><span class="k">while</span> <span class="p">(</span><span class="nx">match</span> <span class="o">=</span> <span class="nx">regex</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">text</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">matches</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'><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">matches</span><span class="p">);</span> <span class="c1">// [&#39;1234&#39;, &#39;5678&#39;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note that in the above case global flag <em>g</em>. Without that above code will run forever.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">matches</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/#(\d+)/ig</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bugs #1234 and #5678&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">matches</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</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">matches</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above case match is used instead of regex . However since match with global flag option brings all
the matches there was no need to iterate in a loop.</p>

<h2>match attributes</h2>

<p>When a match is made then an array is returned. That array has two methods.</p>

<ul>
<li>index: This tells where in the string match was done</li>
<li>input: the original string</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/#(\d+)/i</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bugs #1234 and #5678&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">match</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</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">match</span><span class="p">.</span><span class="nx">index</span><span class="p">);</span> <span class="c1">//13</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">match</span><span class="p">.</span><span class="nx">input</span><span class="p">);</span> <span class="c1">//I fixed bugs #1234 and #5678</span>
</span></code></pre></td></tr></table></div></figure>


<h2>replace</h2>

<p><a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace">replace method</a>
takes both regexp and string as argument.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bugs #1234 and #5678&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;bugs&#39;</span><span class="p">,</span> <span class="s1">&#39;defects&#39;</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">output</span><span class="p">);</span> <span class="c1">//I fixed defects #1234 and #5678</span>
</span></code></pre></td></tr></table></div></figure>


<p>Example of using a function to replace text.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bugs #1234 and #5678&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\d+/g</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">match</span><span class="p">){</span> <span class="k">return</span> <span class="nx">match</span> <span class="o">*</span> <span class="mi">2</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">output</span><span class="p">);</span> <span class="c1">//I fixed bugs #2468 and #11356</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another case.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// requirement is to change all like within &lt;b&gt; &lt;/b&gt; to love.</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39; I like JavaScript. &lt;b&gt; I like JavaScript&lt;/b&gt; &#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/&lt;b&gt;.*?&lt;\/b&gt;/g</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">match</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">match</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/like/g</span><span class="p">,</span> <span class="s2">&quot;love&quot;</span><span class="p">)</span> <span class="p">}</span> <span class="p">);</span>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span> <span class="c1">//I like JavaScript. &lt;b&gt; I love JavaScript&lt;/b&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Example of using special variables.</p>

<ul>
<li>$&amp; -  the matched substring.</li>
<li>$` -  the portion of the string that precedes the matched substring.</li>
<li>$&#8217; -  the portion of the string that follows the matched substring.</li>
<li>$n -  $0, $1, $2 etc where number means the captured group.</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/(\w+)\s(\w+)/</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s2">&quot;John Smith&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">regex</span><span class="p">,</span> <span class="s2">&quot;$2, $1&quot;</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">output</span><span class="p">);</span><span class="c1">//Smith, John</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/JavaScript/</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s2">&quot;I think JavaScript is awesome&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">regex</span><span class="p">,</span> <span class="s2">&quot;before:$` after:$&#39; full:$&amp;&quot;</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">output</span><span class="p">);</span><span class="c1">//I think before:I think after: is awesome full:JavaScript is awesome</span>
</span></code></pre></td></tr></table></div></figure>


<p>Replace method also accepts caputured groups as parameters in the function. Here is an example;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">regex</span>  <span class="o">=</span> <span class="sr">/#(\d*)(.*)@(\w*)/</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bug #1234 and twitted to @javascript&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">regex</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">,</span><span class="nx">c</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">log</span><span class="p">(</span><span class="nx">_</span><span class="p">);</span> <span class="c1">//#1234 and twitted to @javascript</span>
</span><span class='line'>  <span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">);</span> <span class="c1">//1234</span>
</span><span class='line'>  <span class="nx">log</span><span class="p">(</span><span class="nx">b</span><span class="p">);</span> <span class="c1">//  and twitted to</span>
</span><span class='line'>  <span class="nx">log</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span> <span class="c1">// javascript</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see the very first argument to function is the fully matched text. Other captured groups are subsequent arguments. This strategy can be applied recursively.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">bugs</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/#(\d+)/g</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;I fixed bugs #1234 and #5678&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">regex</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">,</span><span class="nx">f</span><span class="p">){</span>
</span><span class='line'>    <span class="nx">bugs</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">f</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nx">log</span><span class="p">(</span><span class="nx">bugs</span><span class="p">);</span> <span class="c1">//[&quot;1234&quot;, &quot;5678&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Split method</h2>

<p><a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/split">split method</a> can take both string or a regular expression.</p>

<p>An example of split using a string.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s2">&quot;Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">log</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span> <span class="c1">// [&quot;Jan&quot;, &quot;Feb&quot;, &quot;Mar&quot;, &quot;Apr&quot;, &quot;May&quot;, &quot;Jun&quot;, &quot;Jul&quot;, &quot;Aug&quot;, &quot;Sep&quot;, &quot;Oct&quot;, &quot;Nov&quot;, &quot;Dec&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>An example of split using regular expression.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s2">&quot;Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand &quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/\s*;\s*/</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">output</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="nx">regex</span><span class="p">);</span>
</span><span class='line'><span class="nx">log</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span> <span class="c1">// [&quot;Harry Trump&quot;, &quot;Fred Barney&quot;, &quot;Helen Rigby&quot;, &quot;Bill Abel&quot;, &quot;Chris Hand &quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Non capturing Group</h2>

<p>The requirement given to me states that I should strictly look for word <em>java</em>, <em>ruby</em> or <em>rails</em> within word boundary. This can be done like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;java&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/\bjava\b|\bruby\b|\brails\b/</span><span class="p">;</span>
</span><span class='line'><span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code works. However notice the code duplication. This can be refactored to the one given below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;rails&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/\b(java|ruby|rails)\b/</span><span class="p">;</span>
</span><span class='line'><span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code works and there is no code duplication. However in this case I am asking regular expression engine to create a captured group which I&#8217;ll not be using. Regex engines need to do extra work to keep track of captured groups. It would be nice if I could say to regex engine do not capture this into a group because I will not be
using it.</p>

<p><em>?:</em> is a special symbol that tells regex engine to create non capturing group. Above code can be refactored into the one given below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;rails&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">regex</span> <span class="o">=</span> <span class="sr">/\b(?:java|ruby|rails)\b/</span><span class="p">;</span>
</span><span class='line'><span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">regex</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">text</span> <span class="o">=</span> <span class="s1">&#39;#container a.filter(.top).filter(.bottom).filter(.middle)&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">matches</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^[^.]*|\.[^.]*(?=\))/g</span><span class="p">);</span>
</span><span class='line'><span class="nx">log</span><span class="p">(</span><span class="nx">matches</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Get started with nodejs in steps]]></title>
    <link href="http://blog.bigbinary.com//2010/03/25/getting-started-with-nodejs-in-steps.html"/>
    <updated>2010-03-25T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/03/25/getting-started-with-nodejs-in-steps</id>
    <content type="html"><![CDATA[<p><a href="http://nodejs.org">nodejs</a> is awesome. To get people started with nodejs, <a href="http://chat.nodejs.org">node-chat</a> has been developed. Source code for node-chat app is <a href="http://github.com/ry/node_chat">here</a> .</p>

<p>When I looked at source code for the first time, it looked intimidating. In order to get started with nodejs, I have developed a small portion of the node-chat application in 13 incremental steps.</p>

<p>The first step is as simple as <a href="http://github.com/neerajdotname/node-chat-in-steps/raw/step1/server.js">15 lines of code</a> .</p>

<p>If you want to follow along then go through <a href="http://github.com/neerajdotname/node-chat-in-steps">README</a> and you can get a feel of nodejs very quickly. How to checkout each step and other information is mentioned in README.</p>

<p>Enjoy nodejs.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Two ways of declaring functions and impact on variable hoisting]]></title>
    <link href="http://blog.bigbinary.com//2010/03/15/two-ways-of-declaring-functions.html"/>
    <updated>2010-03-15T00:00:00-04:00</updated>
    <id>http://blog.bigbinary.com//2010/03/15/two-ways-of-declaring-functions</id>
    <content type="html"><![CDATA[<p>All the JavaScript books I read so far do not distinguish between following two ways of declaring a function.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){};</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">foo</span><span class="p">(){};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Thanks to <a href="http://www.adequatelygood.com">Ben</a> today I learned that <a href="http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting">there is a difference</a> .</p>

<h2>When a var is used to declare a function then only the variable declaration gets hoisted up</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">test</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">foo</span><span class="p">();</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span> <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">test</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code is same as one given below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">test</span><span class="p">(){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">foo</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">foo</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">foo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span> <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">test</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>When a function variable is declared without var then both variable declaration and body gets hoisted up</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">test</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">foo</span><span class="p">();</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">foo</span><span class="p">(){</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span> <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">test</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Above code is same as one given below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">test</span><span class="p">(){</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">foo</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">foo</span> <span class="o">=</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">foo</span><span class="p">());</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nx">test</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>Now it will be clear why <em>foo()</em> does not work in the following case while <em>bar()</em> does work.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">test</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">foo</span><span class="p">();</span> <span class="c1">// TypeError &quot;foo is not a function&quot;</span>
</span><span class='line'>    <span class="nx">bar</span><span class="p">();</span> <span class="c1">// &quot;this will run!&quot;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="c1">// function expression assigned to local variable &#39;foo&#39;</span>
</span><span class='line'>        <span class="nx">alert</span><span class="p">(</span><span class="s2">&quot;this won&#39;t run!&quot;</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">bar</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// function declaration, given the name &#39;bar&#39;</span>
</span><span class='line'>        <span class="nx">alert</span><span class="p">(</span><span class="s2">&quot;this will run!&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">test</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
</feed>

