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

  <title><![CDATA[valve's]]></title>
  <link href="http://valve.github.io/atom.xml" rel="self"/>
  <link href="http://valve.github.io/"/>
  <updated>2014-08-27T13:03:29+04:00</updated>
  <id>http://valve.github.io/</id>
  <author>
    <name><![CDATA[valve]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[JSON serialization in Rust, part 2]]></title>
    <link href="http://valve.github.io/blog/2014/08/26/json-serialization-in-rust-part-2/"/>
    <updated>2014-08-26T09:09:00+04:00</updated>
    <id>http://valve.github.io/blog/2014/08/26/json-serialization-in-rust-part-2</id>
    <content type="html"><![CDATA[<p>This post is intended for people coming from high level languages, such as
Ruby or JavaScript and who may be surprised with the complexity of
the JSON serialization infrastructure in Rust.</p>

<p>This is the second part of the 2 part post that deals with decoding JSON
strings into Rust values.
<a href="http://valve.github.io/blog/2014/08/25/json-serialization-in-rust-part-1/">First part is available here</a>.</p>

<h2>Overview</h2>

<p>When working with JSON deserialization, we&rsquo;re interested in
<a href="http://doc.rust-lang.org/serialize/trait.Decodable.html">Decodable</a> and
<a href="http://doc.rust-lang.org/serialize/trait.Decoder.html">Decoder</a> traits.</p>

<p>As with serialization, <code>hex</code> and <code>base64</code> modules are not relevant to JSON
deserialization, so we should not pay attention to them.</p>

<!--more -->


<h2>Deserialization</h2>

<p>In order for a type to be decodable from JSON, it must implement
<a href="http://doc.rust-lang.org/serialize/trait.Decodable.html">Decodable</a>
trait. Almost all built-in types already implement it, so you can deserialize
them with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">numeric_s</span> <span class="o">=</span> <span class="s">&quot;3.14&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">greeting</span> <span class="o">=</span> <span class="s">&quot;</span><span class="se">\&quot;</span><span class="s">Hello, world</span><span class="se">\&quot;</span><span class="s">&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">pi</span><span class="o">:</span> <span class="k">f64</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">numeric_s</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">pi</span><span class="p">);</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">decoded_greeting</span><span class="o">:</span> <span class="n">String</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">greeting</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">decoded_greeting</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// 3.14</span>
</span><span class='line'><span class="c1">// Hello, world</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/N3p1IE">playpen</a></p>

<h3>Option</h3>

<p>Deserializing to Option is somewhat redundant, because <code>json::decode</code>
<a href="https://github.com/rust-lang/rust/blob/5fb2dfaa200f2cb32e77c54ae8a5e0f4823b65c8/src/libserialize/json.rs#L288">returns</a>
<a href="http://doc.rust-lang.org/serialize/json/type.DecodeResult.html">DecodeResult</a>, which is a type alias
for a regular result. That means you can pattern match on DecodeResult
and handle potential failure.</p>

<h3>Vector</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="c1">// assuming in main with json in scope</span>
</span><span class='line'><span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="s">&quot;[42, 43, 44, 45]&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">let</span> <span class="n">vec</span><span class="o">:</span> <span class="n">Vec</span><span class="o">&lt;</span><span class="k">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">vec</span><span class="p">);</span>
</span><span class='line'><span class="c1">// [42, 43, 44, 56]</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/z5cLqu">playpen</a></p>

<h3>Tuple</h3>

<p>Decoding JSON to a tuple is identical to vector, just specify the
correct type:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="c1">// assuming in main with json in scope</span>
</span><span class='line'><span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="s">&quot;[42, 43]&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">let</span> <span class="n">tup</span><span class="o">:</span> <span class="p">(</span><span class="k">i32</span><span class="p">,</span> <span class="k">i32</span><span class="p">)</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">tup</span><span class="p">);</span>
</span><span class='line'><span class="c1">// (42, 43)</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/KTvqSC">playpen</a></p>

<h3>HashMap</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">};</span>
</span><span class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">collections</span><span class="o">::</span><span class="n">HashMap</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="s">&quot;{</span><span class="se">\&quot;</span><span class="s">e</span><span class="se">\&quot;</span><span class="s">:2.71,</span><span class="se">\&quot;</span><span class="s">pi</span><span class="se">\&quot;</span><span class="s">:3.14}&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">map</span><span class="o">:</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span> <span class="k">f64</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">map</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// {pi: 3.14, e: 2.71}</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/f2Smhd">playpen</a></p>

<h3>Array</h3>

<p>As with serializing, Rust cannot automatically deserialize JSON string
into a fixed-length array. The reason for this is the same: arrays&#8217; type
signature contain length as part of the type, but Rust currently (and
most likely not until after v1.0) can&rsquo;t be generic over array&rsquo;s length.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="s">&quot;[42, 43]&quot;</span><span class="p">;</span>
</span><span class='line'><span class="k">let</span> <span class="n">arr</span><span class="o">:</span> <span class="p">[</span><span class="k">i32</span><span class="p">,..</span><span class="m">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">arr</span><span class="p">);</span>
</span><span class='line'><span class="c1">// failed to find an implementation of trait</span>
</span><span class='line'><span class="c1">// serialize::serialize::Decodable&lt;serialize::json::Decoder,serialize::json::DecoderError&gt; </span>
</span><span class='line'><span class="c1">// for [i32, .. 2]</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/c8N3CV">playpen</a></p>

<p>To remedy this, we will use custom decoding, as we did with custom array
encoding in part 1.
I&rsquo;ll show an example of this below.</p>

<h3>Structs</h3>

<p>As with serialization, it&rsquo;s possible to have Rust deserialize structs
automatically for you. You will need to add the
<code>#[deriving(Decodable)]</code> attribute to your struct:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="s">&quot;{</span><span class="se">\&quot;</span><span class="s">name</span><span class="se">\&quot;</span><span class="s">:</span><span class="se">\&quot;</span><span class="s">John Doe</span><span class="se">\&quot;</span><span class="s">,</span><span class="se">\&quot;</span><span class="s">age</span><span class="se">\&quot;</span><span class="s">:33}&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">person</span><span class="o">:</span> <span class="n">Person</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">person</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#[deriving(Encodable, Decodable, Show)]</span>
</span><span class='line'><span class="n">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">name</span><span class="o">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>  <span class="n">age</span><span class="o">:</span> <span class="k">int</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// Person { name: John Doe, age: 33 }</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/SdeDWO">playpen</a></p>

<p>Note that I&rsquo;m using 3 deriving trait implementations for a struct:
<code>Encodable</code>, <code>Decodable</code> and <code>Show</code>. This is to make my struct fully
JSON (de)serializable and printable automatically.</p>

<h3>Custom deserialization</h3>

<p>This is probably the cornerstone of the JSON infrastructure.
In real life you often cannot control the shape of the JSON that comes to
you, so you must be able to convert arbitrary JSON strings into your
objects. Luckily, Rust decoding capabilities will help us here.</p>

<p>Let us continue with our <code>Person</code> struct example and deserialize the
object from a complex JSON where our object is in the <code>data</code>
key. The example might be contrived, but it serves the demo purpose.</p>

<p>To make a type JSON deserializable we need to implement the <code>Decodable</code>
trait.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">,</span> <span class="n">Decodable</span><span class="p">,</span> <span class="n">Decoder</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="n">r</span><span class="err">#</span><span class="s">&quot;{&quot;</span><span class="k">type</span><span class="s">&quot;: &quot;</span><span class="n">Person</span><span class="s">&quot;, &quot;</span><span class="n">data</span><span class="s">&quot;: {&quot;</span><span class="n">name</span><span class="s">&quot;: &quot;</span><span class="n">John</span> <span class="n">Doe</span><span class="s">&quot;, &quot;</span><span class="n">age</span><span class="s">&quot;: 33}}&quot;</span><span class="err">#</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">person</span><span class="o">:</span> <span class="n">Person</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">person</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#[deriving(Show)]</span>
</span><span class='line'><span class="n">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">name</span><span class="o">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>  <span class="n">age</span><span class="o">:</span> <span class="k">int</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">impl</span><span class="o">&lt;</span><span class="n">S</span><span class="o">:</span> <span class="n">Decoder</span><span class="o">&lt;</span><span class="n">E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="n">Decodable</span><span class="o">&lt;</span><span class="n">S</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">fn</span> <span class="n">decode</span><span class="p">(</span><span class="n">decoder</span><span class="o">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">S</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Result</span><span class="o">&lt;</span><span class="n">Person</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">decoder</span><span class="p">.</span><span class="n">read_struct</span><span class="p">(</span><span class="s">&quot;root&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="o">|</span><span class="n">decoder</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">decoder</span><span class="p">.</span><span class="n">read_struct_field</span><span class="p">(</span><span class="s">&quot;data&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="o">|</span><span class="n">decoder</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>         <span class="n">Ok</span><span class="p">(</span><span class="n">Person</span><span class="p">{</span>
</span><span class='line'>          <span class="n">name</span><span class="o">:</span> <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">decoder</span><span class="p">.</span><span class="n">read_struct_field</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="o">|</span><span class="n">decoder</span><span class="o">|</span> <span class="n">Decodable</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">decoder</span><span class="p">))),</span>
</span><span class='line'>          <span class="n">age</span><span class="o">:</span> <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">decoder</span><span class="p">.</span><span class="n">read_struct_field</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="o">|</span><span class="n">decoder</span><span class="o">|</span> <span class="n">Decodable</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">decoder</span><span class="p">)))</span>
</span><span class='line'>        <span class="p">})</span>
</span><span class='line'>      <span class="p">})</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// Person { name: John Doe, age: 33 }</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/TKPROs">playpen</a></p>

<p>Let&rsquo;s break down the code line by line to see what&rsquo;s going on here.</p>

<p><code>Line 2:</code> We need to bring both <code>Decodable</code> and <code>Decoder</code> traits into
scope. <code>Decodable</code> trait is for the struct to implement, to conform to
the JSON deserialization interface, while the
<code>Decoder</code> is the low level workhorse of deserialization, which tokenizes
and parses the JSON string to convert it to Rust values later.</p>

<p><code>Line 5:</code> I&rsquo;m using a raw string literal to avoid escaping double quotes.</p>

<p><code>Line 6:</code> The line where I&rsquo;m decoding JSON string into an instance of
<code>Person</code> struct. Note that I need to type-annotate the variable when
decoding it.</p>

<p><code>Line 10:</code> We no longer need to use the <code>#[deriving(Decodable)]</code>
attribute, because we implement the <code>Decodable</code> trait ourselves.</p>

<p><code>Line 16:</code> This is the <code>Decodable</code> implementation. It is very similar to
the <code>Encodable</code> implementation from part 1 with the exception of <code>S</code> being
type restricted to <code>Decoder</code> trait now.</p>

<p><code>Line 17:</code> Two differences from <code>encode</code> method counterpart:
we&rsquo;re no longer accepting <code>&amp;self</code> as the first argument,
because <code>decode</code> is an associated function, rather than a method.
The analogy is class methods in Ruby or static methods
in Java. Second difference is the return type. It is now <code>Result&lt;Person,
E&gt;</code>.</p>

<p><code>Line 18:</code> This is where the parsing starts. We do actual parsing with
<code>read_*</code> family of methods on <code>Decoder</code> instance. Here we&rsquo;re reading the
top-level struct with <code>read_struct</code> method. First argument is the name
of the sturct(not used), second is the length (not applicable). The third argument is an
instance of anonymous function (lambda). Why are the first and the
second arguments not used?
I think this is because the entire family of <code>read_*</code> methods of
<code>Encoder</code> strives to be uniform and thus a unified set of arguments
is used, even when the encoder does not need them.</p>

<p>You can think of the <code>read_struct</code> call as &ldquo;opening&rdquo; the top-level JSON
object to be able to move inside to read actual values. The lambda is
where we descend and continue with reading.</p>

<p><code>Line 19:</code> The object we&rsquo;re trying to read is in the <code>data</code> field, so
we&rsquo;re reading it on this line with <code>read_struct_field</code> method.
This time the first argument is necessary, because it tells the decoder
the actual name of the field. 3rd argument is the lambda again to
descend further into the the object in the <code>data</code> field.</p>

<p><code>Lines 20-21:</code> Field reading happens here. By this time the parser
has reached the contents of the <code>data</code> object so we can now just read the
fields we&rsquo;re interested in one-by-one. We&rsquo;re using <code>read_struct_field</code>
again, passing it the name of the field and the index(not used).
The third argument is the value of the field, correctly decoded from
JSON representation. Since all primitive values in Rust already
implement the <code>Decodable</code> trait, we can safely call <code>Decodable::decode</code>
on them to deserialize them as the <code>Person</code> struct fields.</p>

<h4>Deserializing fixed length arrays</h4>

<p>As in part 1, let&rsquo;s use this knowledge to deserialize a fixed-length
array from JSON.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">default</span><span class="o">::</span><span class="n">Default</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">,</span> <span class="n">Decodable</span><span class="p">,</span> <span class="n">Decoder</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="n">static</span> <span class="n">BUFFER_SIZE</span><span class="o">:</span> <span class="k">uint</span> <span class="o">=</span> <span class="m">4</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">raw_json</span> <span class="o">=</span> <span class="s">&quot;[42, 43, 44, 45]&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">buf</span><span class="o">:</span> <span class="n">Buffer</span><span class="o">&lt;</span><span class="k">i32</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">json</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">raw_json</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">Buffer</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="o">=</span> <span class="n">buf</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="n">in</span> <span class="n">arr</span><span class="p">.</span><span class="n">iter</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">struct</span> <span class="n">Buffer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">([</span><span class="n">T</span><span class="p">,..</span><span class="n">BUFFER_SIZE</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'><span class="k">impl</span><span class="o">&lt;</span><span class="n">S</span><span class="o">:</span> <span class="n">Decoder</span><span class="o">&lt;</span><span class="n">E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">T</span><span class="o">:</span> <span class="n">Default</span><span class="o">+</span><span class="n">Copy</span><span class="o">+</span><span class="n">Decodable</span><span class="o">&lt;</span><span class="n">S</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="n">Decodable</span><span class="o">&lt;</span><span class="n">S</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">Buffer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">fn</span> <span class="n">decode</span><span class="p">(</span><span class="n">decoder</span><span class="o">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">S</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Result</span><span class="o">&lt;</span><span class="n">Buffer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">decoder</span><span class="p">.</span><span class="n">read_seq</span><span class="p">(</span><span class="o">|</span><span class="n">decoder</span><span class="p">,</span> <span class="n">len</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">len</span> <span class="o">!=</span> <span class="n">BUFFER_SIZE</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">return</span> <span class="n">Err</span><span class="p">(</span><span class="n">decoder</span><span class="p">.</span><span class="n">error</span><span class="p">(</span><span class="n">format</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;Expecting array of length: {}, but found {}&quot;</span><span class="p">,</span> <span class="n">BUFFER_SIZE</span><span class="p">,</span> <span class="n">len</span><span class="p">).</span><span class="n">as_slice</span><span class="p">()));</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">let</span> <span class="k">mut</span> <span class="n">arr</span><span class="o">:</span> <span class="p">[</span><span class="n">T</span><span class="p">,..</span><span class="n">BUFFER_SIZE</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">Default</span><span class="o">::</span><span class="n">default</span><span class="p">(),..</span><span class="n">BUFFER_SIZE</span><span class="p">];</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span> <span class="n">in</span> <span class="n">arr</span><span class="p">.</span><span class="n">mut_iter</span><span class="p">().</span><span class="n">enumerate</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="o">*</span><span class="n">val</span> <span class="o">=</span> <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">decoder</span><span class="p">.</span><span class="n">read_seq_elt</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Decodable</span><span class="o">::</span><span class="n">decode</span><span class="p">));</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="n">Ok</span><span class="p">(</span><span class="n">Buffer</span><span class="p">(</span><span class="n">arr</span><span class="p">))</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// 42</span>
</span><span class='line'><span class="c1">// 43</span>
</span><span class='line'><span class="c1">// 44</span>
</span><span class='line'><span class="c1">// 45</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/zl076C">playpen</a></p>

<p>Since rust will not allow to provide the implementation of a trait for
a type where both the trait and the type were defined in the external
crate, we need to create a tuple struct (newtype) for the array.</p>

<p>Overall, this implementation looks similar to the previous, but there are
nuances I&rsquo;d like to point out.</p>

<p><code>Line 18:</code> Note that the implementation signature adds new <code>T</code> type parameter,
which is the type of the array. It can be anything that implements
<code>Default</code>+<code>Copy</code>+<code>Encodable&lt;S, E&gt;</code> traits.
<code>Default</code> is to be able to fill array with default values (line 24).
<code>Copy</code> is to be able to copy the default values
into the new array, while the <code>Decodable&lt;S, E&gt;</code> is to be able to decode
the array elements from JSON.</p>

<p><code>Lines 22-24:</code> Here I&rsquo;m checking if the array we&rsquo;re about to decode contains
exactly the number of elements we expect. If not, I exit early with an
error.</p>

<p><code>Lines 26-28:</code> Here I&rsquo;m iterating the array, obtaining mutable
references to its elements and filling them from JSON, using
<code>decoder::read_seq_elt</code>.</p>

<p><code>Line 29:</code> Here I&rsquo;m returning the result wrapped in <code>Buffer</code> newtype.</p>

<h3>deriving(Decodable)</h3>

<p>As in part 1, let&rsquo;s look at the expanded implementation of the
<code>#[deriving(Decodable)]</code> attribute.
Let&rsquo;s use the <code>Person</code> struct example again
and compile it with <code>--pretty expanded</code> flag:</p>

<p><code>rustc app.rs --pretty expanded</code></p>

<p>The output:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="err">#</span><span class="o">!</span><span class="p">[</span><span class="n">feature</span><span class="p">(</span><span class="n">phase</span><span class="p">)]</span>
</span><span class='line'><span class="err">#</span><span class="o">!</span><span class="p">[</span><span class="n">no_std</span><span class="p">]</span>
</span><span class='line'><span class="err">#</span><span class="o">!</span><span class="p">[</span><span class="n">feature</span><span class="p">(</span><span class="n">globs</span><span class="p">)]</span>
</span><span class='line'><span class="cp">#[phase(plugin, link)]</span>
</span><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">std</span> <span class="o">=</span> <span class="s">&quot;std&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">rt</span> <span class="o">=</span> <span class="s">&quot;native&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="cp">#[prelude_import]</span>
</span><span class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">prelude</span><span class="o">::*</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">Decodable</span><span class="p">};</span>
</span><span class='line'><span class="n">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">name</span><span class="o">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>    <span class="n">age</span><span class="o">:</span> <span class="k">int</span><span class="p">,</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="cp">#[automatically_derived]</span>
</span><span class='line'><span class="k">impl</span> <span class="o">&lt;</span><span class="n">__D</span><span class="o">:</span> <span class="o">::</span><span class="n">serialize</span><span class="o">::</span><span class="n">Decoder</span><span class="o">&lt;</span><span class="n">__E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">__E</span><span class="o">&gt;</span> <span class="o">::</span><span class="n">serialize</span><span class="o">::</span><span class="n">Decodable</span><span class="o">&lt;</span><span class="n">__D</span><span class="p">,</span> <span class="n">__E</span><span class="o">&gt;</span>
</span><span class='line'>     <span class="k">for</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">fn</span> <span class="n">decode</span><span class="p">(</span><span class="n">__arg_0</span><span class="o">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">__D</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="o">::</span><span class="n">std</span><span class="o">::</span><span class="n">result</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</span><span class="n">Person</span><span class="p">,</span> <span class="n">__E</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">__arg_0</span><span class="p">.</span><span class="n">read_struct</span><span class="p">(</span><span class="s">&quot;Person&quot;</span><span class="p">,</span> <span class="m">2</span><span class="k">u</span><span class="p">,</span>
</span><span class='line'>                            <span class="n">ref</span> <span class="o">|</span><span class="n">_d</span><span class="o">|</span>
</span><span class='line'>        <span class="o">::</span><span class="n">std</span><span class="o">::</span><span class="n">result</span><span class="o">::</span><span class="n">Ok</span><span class="p">(</span><span class="n">Person</span><span class="p">{</span><span class="n">name</span><span class="o">:</span>
</span><span class='line'>           <span class="n">match</span> <span class="n">_d</span><span class="p">.</span><span class="n">read_struct_field</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">,</span>
</span><span class='line'>                                      <span class="m">0</span><span class="k">u</span><span class="p">,</span>
</span><span class='line'>                                      <span class="n">ref</span>
</span><span class='line'>                                          <span class="o">|</span><span class="n">_d</span><span class="o">|</span>
</span><span class='line'>                                          <span class="o">::</span><span class="n">serialize</span><span class="o">::</span><span class="n">Decodable</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">_d</span><span class="p">))</span>
</span><span class='line'>               <span class="p">{</span>
</span><span class='line'>               <span class="n">Ok</span><span class="p">(</span><span class="n">__try_var</span><span class="p">)</span>
</span><span class='line'>               <span class="o">=&gt;</span> <span class="n">__try_var</span><span class="p">,</span>
</span><span class='line'>               <span class="n">Err</span><span class="p">(</span><span class="n">__try_var</span><span class="p">)</span>
</span><span class='line'>               <span class="o">=&gt;</span>
</span><span class='line'>               <span class="n">return</span> <span class="n">Err</span><span class="p">(</span><span class="n">__try_var</span><span class="p">),</span>
</span><span class='line'>           <span class="p">},</span>
</span><span class='line'>       <span class="n">age</span><span class="o">:</span>
</span><span class='line'>           <span class="n">match</span> <span class="n">_d</span><span class="p">.</span><span class="n">read_struct_field</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">,</span>
</span><span class='line'>                                      <span class="m">1</span><span class="k">u</span><span class="p">,</span>
</span><span class='line'>                                      <span class="n">ref</span>
</span><span class='line'>                                          <span class="o">|</span><span class="n">_d</span><span class="o">|</span>
</span><span class='line'>                                          <span class="o">::</span><span class="n">serialize</span><span class="o">::</span><span class="n">Decodable</span><span class="o">::</span><span class="n">decode</span><span class="p">(</span><span class="n">_d</span><span class="p">))</span>
</span><span class='line'>               <span class="p">{</span>
</span><span class='line'>               <span class="n">Ok</span><span class="p">(</span><span class="n">__try_var</span><span class="p">)</span>
</span><span class='line'>               <span class="o">=&gt;</span> <span class="n">__try_var</span><span class="p">,</span>
</span><span class='line'>               <span class="n">Err</span><span class="p">(</span><span class="n">__try_var</span><span class="p">)</span>
</span><span class='line'>               <span class="o">=&gt;</span>
</span><span class='line'>               <span class="n">return</span> <span class="n">Err</span><span class="p">(</span><span class="n">__try_var</span><span class="p">),</span>
</span><span class='line'>           <span class="p">},}))</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The output is very similar to the manual deserialization code we
saw earlier, except that compiler further expanded the <code>try!</code> macros into <code>Err</code> and
<code>Ok</code> branches.</p>

<h3>Further reading</h3>

<p>There is a convenience <code>ToJson</code>
<a href="https://github.com/rust-lang/rust/blob/5fb2dfaa200f2cb32e77c54ae8a5e0f4823b65c8/src/libserialize/json.rs#L2222">trait</a> that allows implementors to quickly convert itself into JSON using
intermediate <a href="https://github.com/rust-lang/rust/blob/5fb2dfaa200f2cb32e77c54ae8a5e0f4823b65c8/src/libserialize/json.rs#L211">Json enum</a> representation, but I recommend using it only for small and relatively simple data structures.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JSON serialization in Rust, part 1]]></title>
    <link href="http://valve.github.io/blog/2014/08/25/json-serialization-in-rust-part-1/"/>
    <updated>2014-08-25T10:08:00+04:00</updated>
    <id>http://valve.github.io/blog/2014/08/25/json-serialization-in-rust-part-1</id>
    <content type="html"><![CDATA[<p>This post is intended for people coming from high level languages, such as
Ruby or JavaScript and who may be surprised with the complexity of
the JSON serialization infrastructure in Rust.</p>

<p>This is the first part of the 2 part post that deals with encoding Rust
values into JSON. Second part will deal with converting JSON strings
back into Rust values.</p>

<h2>Overview</h2>

<p>JSON serialization lives in the <a href="http://doc.rust-lang.org/serialize/index.html">serialize</a> crate.
It contains <a href="http://doc.rust-lang.org/serialize/json/">json</a> module where low-level implementation
details live and two traits which we are interested in:
<a href="http://doc.rust-lang.org/serialize/trait.Encodable.html">Encodable</a> and
<a href="http://doc.rust-lang.org/serialize/trait.Encoder.html">Encoder</a>.</p>

<p>Please note that hex and base64 modules are not relevant to JSON
serialization, so we should not pay attention to them.</p>

<!--more -->


<h2>Serialization</h2>

<p>In order for a type to be JSON serializable, it must implement
<a href="http://doc.rust-lang.org/serialize/trait.Encodable.html">Encodable</a>
trait. Almost all built-in types already implement it, so you can serialize
them as easily as:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="n">json</span><span class="p">;</span>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">numeric</span> <span class="o">=</span> <span class="m">3.14</span><span class="k">f64</span><span class="p">;</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">str</span> <span class="o">=</span> <span class="s">&quot;Hello, world&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">numeric</span><span class="p">));</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">str</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// 3.14</span>
</span><span class='line'><span class="c1">// &quot;Hello, world&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/lrjNyD">playpen</a></p>

<h3>Option</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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='rust'><span class='line'><span class="c1">// assuming inside main and json in scope</span>
</span><span class='line'><span class="k">let</span> <span class="n">opt</span> <span class="o">=</span> <span class="n">Some</span><span class="p">(</span><span class="m">3.14</span><span class="p">)</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">opt</span><span class="p">));</span>
</span><span class='line'><span class="k">let</span> <span class="n">opt2</span><span class="o">:</span> <span class="n">Option</span><span class="o">&lt;</span><span class="k">f64</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">None</span><span class="p">;</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">opt2</span><span class="p">));</span>
</span><span class='line'><span class="c1">// 3.14</span>
</span><span class='line'><span class="c1">// null</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/uSciLe">playpen</a></p>

<h3>Vector</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="k">let</span> <span class="n">vec</span> <span class="o">=</span> <span class="n">vec</span><span class="o">!</span><span class="p">(</span><span class="m">1939</span><span class="k">i</span><span class="p">,</span> <span class="m">1945</span><span class="p">);</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vec</span><span class="p">));</span>
</span><span class='line'><span class="c1">// [1939,1945]</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/9e5L5L">playpen</a></p>

<h3>HashMap</h3>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="k">let</span> <span class="k">mut</span> <span class="n">map</span> <span class="o">=</span> <span class="n">HashMap</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</span><span class='line'><span class="n">map</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">&quot;pi&quot;</span><span class="p">,</span> <span class="m">3.14</span><span class="k">f64</span><span class="p">);</span>
</span><span class='line'><span class="n">map</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">&quot;e&quot;</span><span class="p">,</span> <span class="m">2.71</span><span class="p">);</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">map</span><span class="p">));</span>
</span><span class='line'><span class="c1">// {&quot;e&quot;:2.71,&quot;pi&quot;:3.14}</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/PZJOxY">playpen</a></p>

<h3>Array</h3>

<p>Currently Rust cannot automatically serialize fixed sized arrays to JSON.</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='rust'><span class='line'><span class="k">let</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="m">1</span><span class="k">i</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">];</span>
</span><span class='line'><span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">numbers</span><span class="p">);</span>
</span><span class='line'><span class="c1">// failed to find an implementation of trait </span>
</span><span class='line'><span class="c1">// serialize::serialize::Encodable&lt;serialize::json::Encoder&lt;&#39;_&gt;,std::io::IoError&gt; for [int, .. 3]</span>
</span><span class='line'><span class="c1">// json::encode(&amp;numbers);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Array&rsquo;s type signature includes its length, but Rust can&rsquo;t be generic with array&rsquo;s
length. So in order to serialize an array into JSON, we&rsquo;ll need to use
custom serialization, which I&rsquo;ll explain further.</p>

<h4>UPDATE: Thanks to <a href="http://www.reddit.com/r/rust/comments/2eiyzh/json_serialization_in_rust_part_1/ck1j4ni">Reddit user ASeriesOfTubes</a></h4>

<p>It is possible to serialize an array to JSON automatically. You just
need to convert it to slice.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="k">let</span> <span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="m">1</span><span class="k">i</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">];</span>
</span><span class='line'><span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">numbers</span><span class="p">.</span><span class="n">as_slice</span><span class="p">()));</span>
</span><span class='line'><span class="c1">// [1,2,3]</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/1GM2WF">playpen</a></p>

<h3>Structs</h3>

<p>It&rsquo;s possible to have Rust automatically implement JSON serialization
for your structs. You&rsquo;ll need to adorn the struct with
<code>deriving(Encodable)</code> attribute.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">,</span> <span class="n">Encodable</span><span class="p">};</span>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">{</span><span class="n">name</span><span class="o">:</span> <span class="s">&quot;John Doe&quot;</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span> <span class="n">age</span><span class="o">:</span> <span class="m">33</span><span class="p">};</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">person</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="cp">#[deriving(Encodable)]</span>
</span><span class='line'><span class="n">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">name</span><span class="o">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>  <span class="n">age</span><span class="o">:</span> <span class="k">int</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// {&quot;name&quot;:&quot;John Doe&quot;,&quot;age&quot;:33}</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/8p8V31">playpen</a></p>

<h3>Custom serialization</h3>

<p>You will inevitably come to the point when Rust&rsquo;s supplied serialization
will not work for you. Luckily we have full control over the serialization
process. In order to serialize your type the way you want it, you will
need to implement the <code>Encodable</code> trait. Let&rsquo;s continue with our <code>Person</code>
struct example and change it to include a summary field.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">,</span> <span class="n">Encodable</span><span class="p">,</span> <span class="n">Encoder</span><span class="p">};</span>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">{</span><span class="n">name</span><span class="o">:</span> <span class="s">&quot;John Doe&quot;</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span> <span class="n">age</span><span class="o">:</span> <span class="m">33</span><span class="p">,};</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span> <span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">person</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">name</span><span class="o">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>  <span class="n">age</span><span class="o">:</span> <span class="k">int</span><span class="p">,</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">impl</span> <span class="o">&lt;</span><span class="n">S</span><span class="o">:</span> <span class="n">Encoder</span><span class="o">&lt;</span><span class="n">E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="n">Encodable</span><span class="o">&lt;</span><span class="n">S</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">fn</span> <span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">encoder</span><span class="o">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">S</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Result</span><span class="o">&lt;</span><span class="p">(),</span> <span class="n">E</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">match</span> <span class="o">*</span><span class="n">self</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">Person</span><span class="p">{</span><span class="n">name</span><span class="o">:</span> <span class="n">ref</span> <span class="n">p_name</span><span class="p">,</span> <span class="n">age</span><span class="o">:</span> <span class="n">ref</span> <span class="n">p_age</span><span class="p">}</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">encoder</span><span class="p">.</span><span class="n">emit_struct</span><span class="p">(</span><span class="s">&quot;Person&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="o">|</span><span class="n">encoder</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>          <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">encoder</span><span class="p">.</span><span class="n">emit_struct_field</span><span class="p">(</span> <span class="s">&quot;age&quot;</span><span class="p">,</span> <span class="m">0</span><span class="k">u</span><span class="p">,</span> <span class="o">|</span><span class="n">encoder</span><span class="o">|</span> <span class="n">p_age</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="n">encoder</span><span class="p">)));</span>
</span><span class='line'>          <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">encoder</span><span class="p">.</span><span class="n">emit_struct_field</span><span class="p">(</span> <span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="m">1</span><span class="k">u</span><span class="p">,</span> <span class="o">|</span><span class="n">encoder</span><span class="o">|</span> <span class="n">p_name</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="n">encoder</span><span class="p">)));</span>
</span><span class='line'>          <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">encoder</span><span class="p">.</span><span class="n">emit_struct_field</span><span class="p">(</span> <span class="s">&quot;summary&quot;</span><span class="p">,</span> <span class="m">2</span><span class="k">u</span><span class="p">,</span> <span class="o">|</span><span class="n">encoder</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>            <span class="p">(</span><span class="n">format</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;Nice person named {}, {} years of age&quot;</span><span class="p">,</span> <span class="n">p_name</span><span class="p">,</span> <span class="n">p_age</span><span class="p">)).</span><span class="n">encode</span><span class="p">(</span><span class="n">encoder</span><span class="p">)</span>
</span><span class='line'>          <span class="p">}));</span>
</span><span class='line'>          <span class="n">Ok</span><span class="p">(())</span>
</span><span class='line'>        <span class="p">})</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// {&quot;age&quot;:33,&quot;name&quot;:&quot;John Doe&quot;,&quot;summary&quot;:&quot;Nice person named John Doe, 33 years of age&quot;}</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/s1rsXL">playpen</a></p>

<p>Let us break down this code line by line to understand what&rsquo;s going on.</p>

<p><code>Line 2:</code> We need to bring both <code>Encodable</code> and <code>Encoder</code> traits into
scope. <code>Encodable</code> trait is for the struct to implement, to conform to
the JSON serialization interface, while the
<code>Encoder</code> is the low level workhorse of serialization, which transforms
primitive values into JSON bits and combines them all together.</p>

<p><code>Line 8:</code> We no longer need to use the <code>#[deriving(Encodable)]</code>
attribute, because we&rsquo;re implementing the <code>Encodable</code> trait ourselves.</p>

<p><code>Line 13:</code> We implement <code>Encodable</code> trait for the <code>Person</code> struct.
<code>Encodable</code> full type signature is <code>Encodable&lt;S, E&gt;</code> where
<code>S</code> should be an instance of <code>Encoder&lt;E&gt;</code>.
<code>E</code> is a type parameter for <a href="http://doc.rust-lang.org/std/result/type.Result.html">Result&lt;T, E></a>,
which our implementation returns.</p>

<p><code>Line 14:</code> In order to implement the <code>Encodable</code> trait, we need to write
the <code>encode</code> method, which accepts a single <code>S</code> argument. Remember, that
<code>S</code> is an instance of <code>Encoder</code>, which is a low level JSON emitter.</p>

<p><code>Lines 15-16:</code> We&rsquo;re destructuring (decomposing) the struct to access
its fields. To do that we use pattern matching and assign the person
fields to <code>p_name</code> and <code>p_age</code> variables.</p>

<p><code>Line 17:</code> This is where JSON writing begins. We call <code>emit_struct</code> on
our encoder and pass it 3 arguments: the name of the struct, current
index and an anonymous function(aka lambda). The name of the struct
<a href="https://github.com/rust-lang/rust/blob/0b3e43d2a47ecf4908a912c1144942e5216703ea/src/libserialize/json.rs#L500">is not used</a>; current index
<a href="https://github.com/rust-lang/rust/blob/0b3e43d2a47ecf4908a912c1144942e5216703ea/src/libserialize/json.rs#L501">is not used too</a>.
What is important is the anonymous function that we&rsquo;re passing as the
3rd argument.
The <code>emit_struct</code> method simply writes <code>{</code>, calls the lambda and then
writes closing <code>}</code>. Why are the 1st and the 2nd arguments not used?
I think they are there to conform to the uniform style of encoder&rsquo;s <code>emit_*</code> methods,
but they don&rsquo;t make any sense when writing a JSON object.</p>

<p><code>Lines 18-22:</code> This is where the body of the JSON object is written.
Each field is written with <code>emit_struct_field</code> method that accepts same
3 arguments: name, index and lambda. Name is how you want your object
field to be named, index is to correctly insert comma after each field
and the lambda&rsquo;s job is to return correctly escaped JSON representation of
the struct&rsquo;s field value. Since the built-in types already implement the
<code>Encodable</code> trait, we can safely call <code>encode</code> on integers and strings
to encode their values into JSON.</p>

<p><code>Line 23:</code> To indicate the successful JSON encoding, we return unit
wrapped in Ok enum value of the Result.</p>

<p><code>Line 24:</code> The line where the closing <code>}</code> of the object is written,
because lambda finishes here.</p>

<h4>Serializing fixed length arrays</h4>

<p>Now armed with the knowledge to write our own implementation of
<code>Encodable</code>, we can convert an array into JSON.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">json</span><span class="p">,</span> <span class="n">Encodable</span><span class="p">,</span> <span class="n">Encoder</span><span class="p">};</span>
</span><span class='line'><span class="n">static</span> <span class="n">BUFFER_SIZE</span><span class="o">:</span> <span class="k">uint</span> <span class="o">=</span> <span class="m">4</span><span class="p">;</span>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">buffer</span> <span class="o">=</span> <span class="n">Buffer</span><span class="p">([</span><span class="m">42</span><span class="k">i</span><span class="p">,</span> <span class="m">43</span><span class="p">,</span> <span class="m">44</span><span class="p">,</span> <span class="m">45</span><span class="p">]);</span>
</span><span class='line'>  <span class="n">println</span><span class="o">!</span><span class="p">(</span><span class="s">&quot;{}&quot;</span><span class="p">,</span> <span class="n">json</span><span class="o">::</span><span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">buffer</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">struct</span> <span class="n">Buffer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">([</span><span class="n">T</span><span class="p">,..</span><span class="n">BUFFER_SIZE</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">impl</span> <span class="o">&lt;</span><span class="n">S</span><span class="o">:</span> <span class="n">Encoder</span><span class="o">&lt;</span><span class="n">E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">T</span><span class="o">:</span> <span class="n">Encodable</span><span class="o">&lt;</span><span class="n">S</span><span class="p">,</span><span class="n">E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="n">Encodable</span><span class="o">&lt;</span><span class="n">S</span><span class="p">,</span> <span class="n">E</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">Buffer</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">{</span>
</span><span class='line'>  <span class="k">fn</span> <span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">encoder</span><span class="o">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">S</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Result</span><span class="o">&lt;</span><span class="p">(),</span> <span class="n">E</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">match</span> <span class="o">*</span><span class="n">self</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">Buffer</span><span class="p">(</span><span class="n">ref</span> <span class="n">data</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mut</span> <span class="n">counter</span> <span class="o">=</span> <span class="m">0</span><span class="k">u</span><span class="p">;</span>
</span><span class='line'>        <span class="n">encoder</span><span class="p">.</span><span class="n">emit_seq</span><span class="p">(</span><span class="n">BUFFER_SIZE</span><span class="p">,</span> <span class="o">|</span><span class="n">encoder</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">for</span> <span class="n">i</span> <span class="n">in</span> <span class="n">data</span><span class="p">.</span><span class="n">iter</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">try</span><span class="o">!</span><span class="p">(</span><span class="n">encoder</span><span class="p">.</span><span class="n">emit_seq_elt</span><span class="p">(</span><span class="n">counter</span><span class="p">,</span> <span class="o">|</span><span class="n">encoder</span><span class="o">|</span> <span class="n">i</span><span class="p">.</span><span class="n">encode</span><span class="p">(</span><span class="n">encoder</span><span class="p">)));</span>
</span><span class='line'>            <span class="n">counter</span> <span class="o">+=</span> <span class="m">1</span><span class="p">;</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>          <span class="n">Ok</span><span class="p">(())</span>
</span><span class='line'>        <span class="p">})</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// [42,43,44,45]</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://is.gd/urSwVE">playpen</a></p>

<p>Since rust will not allow to provide the implementation of a trait for
a type where both the trait and the type were defined in the external
crate, we need to create a tuple struct (newtype) for the array.</p>

<p>Overall, this implementation looks similar to the previous, except we&rsquo;re using
the combination of <code>emit_seq</code> + <code>emit_seq_elt</code> to emit <code>[</code> + elements +
<code>]</code>. We also keep a counter variable to correctly handle the comma.</p>

<p>Note that the implementation signature adds new <code>T</code> type parameter,
which is the type of the array. It can be anything that implements
<code>Encodable&lt;S, E&gt;</code> trait.</p>

<h3>deriving(Encodable)</h3>

<p>Now you&rsquo;re ready to understand what happens when you use
<code>#[deriving(Encodable)]</code>. Let&rsquo;s use the <code>Person</code> struct example again
and compile it with <code>--pretty expanded</code> flag:</p>

<p><code>rustc app.rs --pretty expanded</code></p>

<p>We see the output:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="err">#</span><span class="o">!</span><span class="p">[</span><span class="n">feature</span><span class="p">(</span><span class="n">phase</span><span class="p">)]</span>
</span><span class='line'><span class="err">#</span><span class="o">!</span><span class="p">[</span><span class="n">no_std</span><span class="p">]</span>
</span><span class='line'><span class="err">#</span><span class="o">!</span><span class="p">[</span><span class="n">feature</span><span class="p">(</span><span class="n">globs</span><span class="p">)]</span>
</span><span class='line'><span class="cp">#[phase(plugin, link)]</span>
</span><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">std</span> <span class="o">=</span> <span class="s">&quot;std&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">extern</span> <span class="n">crate</span> <span class="n">serialize</span><span class="p">;</span>
</span><span class='line'><span class="cp">#[prelude_import]</span>
</span><span class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">prelude</span><span class="o">::*</span><span class="p">;</span>
</span><span class='line'><span class="k">use</span> <span class="n">serialize</span><span class="o">::</span><span class="p">{</span><span class="n">Encodable</span><span class="p">};</span>
</span><span class='line'><span class="n">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">name</span><span class="o">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>    <span class="n">age</span><span class="o">:</span> <span class="k">int</span><span class="p">,</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="cp">#[automatically_derived]</span>
</span><span class='line'><span class="k">impl</span> <span class="o">&lt;</span><span class="n">__S</span><span class="o">:</span> <span class="o">::</span><span class="n">serialize</span><span class="o">::</span><span class="n">Encoder</span><span class="o">&lt;</span><span class="n">__E</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">__E</span><span class="o">&gt;</span> <span class="o">::</span><span class="n">serialize</span><span class="o">::</span><span class="n">Encodable</span><span class="o">&lt;</span><span class="n">__S</span><span class="p">,</span> <span class="n">__E</span><span class="o">&gt;</span>
</span><span class='line'>     <span class="k">for</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">fn</span> <span class="n">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">__arg_0</span><span class="o">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">__S</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="o">::</span><span class="n">std</span><span class="o">::</span><span class="n">result</span><span class="o">::</span><span class="n">Result</span><span class="o">&lt;</span><span class="p">(),</span> <span class="n">__E</span><span class="o">&gt;</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">match</span> <span class="o">*</span><span class="n">self</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">Person</span> <span class="p">{</span> <span class="n">name</span><span class="o">:</span> <span class="n">ref</span> <span class="n">__self_0_0</span><span class="p">,</span> <span class="n">age</span><span class="o">:</span> <span class="n">ref</span> <span class="n">__self_0_1</span> <span class="p">}</span> <span class="o">=&gt;</span>
</span><span class='line'>            <span class="n">__arg_0</span><span class="p">.</span><span class="n">emit_struct</span><span class="p">(</span><span class="s">&quot;Person&quot;</span><span class="p">,</span> <span class="m">2</span><span class="k">u</span><span class="p">,</span> <span class="n">ref</span> <span class="o">|</span><span class="n">_e</span><span class="o">|</span> <span class="p">{</span>
</span><span class='line'>                                <span class="n">match</span> <span class="n">_e</span><span class="p">.</span><span class="n">emit_struct_field</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="m">0</span><span class="k">u</span><span class="p">,</span>
</span><span class='line'>                                                           <span class="n">ref</span> <span class="o">|</span><span class="n">_e</span><span class="o">|</span>
</span><span class='line'>                                                               <span class="p">(</span><span class="o">*</span><span class="n">__self_0_0</span><span class="p">).</span><span class="n">encode</span><span class="p">(</span><span class="n">_e</span><span class="p">))</span>
</span><span class='line'>                                    <span class="p">{</span>
</span><span class='line'>                                    <span class="n">Ok</span><span class="p">(</span><span class="n">__try_var</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="n">__try_var</span><span class="p">,</span>
</span><span class='line'>                                    <span class="n">Err</span><span class="p">(</span><span class="n">__try_var</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="n">return</span> <span class="n">Err</span><span class="p">(</span><span class="n">__try_var</span><span class="p">),</span>
</span><span class='line'>                                <span class="p">};</span>
</span><span class='line'>                                <span class="n">return</span> <span class="n">_e</span><span class="p">.</span><span class="n">emit_struct_field</span><span class="p">(</span><span class="s">&quot;age&quot;</span><span class="p">,</span> <span class="m">1</span><span class="k">u</span><span class="p">,</span>
</span><span class='line'>                                                            <span class="n">ref</span> <span class="o">|</span><span class="n">_e</span><span class="o">|</span>
</span><span class='line'>                                                                <span class="p">(</span><span class="o">*</span><span class="n">__self_0_1</span><span class="p">).</span><span class="n">encode</span><span class="p">(</span><span class="n">_e</span><span class="p">));</span>
</span><span class='line'>                            <span class="p">}),</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The implementation provided by the Rust compiler is almost identical to
ours, except that it further expanded the <code>try!</code> macros into <code>Err</code> and
<code>Ok</code> branches.</p>

<p>Second part of this article will explain the reverse process: how to
decode Rust objects from JSON string.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[immutability in Ruby]]></title>
    <link href="http://valve.github.io/blog/2014/07/04/from-object-to-functional-immutability/"/>
    <updated>2014-07-04T15:30:00+04:00</updated>
    <id>http://valve.github.io/blog/2014/07/04/from-object-to-functional-immutability</id>
    <content type="html"><![CDATA[<p>Like many other developers, I&rsquo;ve been intrigued with functional
programming for a long while. I remember myself reading articles
promising programming heaven for those who are brave enough to go
functional. I bought a used <a href="http://book.realworldhaskell.org/">Real World Haskell</a>
on Ebay, but sadly never finished it.
I then bought <a href="http://www.amazon.com/Scala-Impatient-Cay-S-Horstmann/dp/0321774094">Scala for the Impatient</a>,
but this time had the persistence to finish the book.</p>

<p>All these years functional programming seemed like a holy grail,
but as a true holy grail, I was afraid it was meant to stay
undiscovered.</p>

<p>All these years I paid my bills writing Ruby-on-Rails and JavaScript
code and never made the functional leap. I never became a full-time
Haskell or Scala developer and probably will never become one.</p>

<p>But you know what? It&rsquo;s possible to be slightly more functional with
<em>normal</em> languages we&rsquo;re using every day. This article will try to demonstrate
several concrete examples where functional programming is useful
or elegant. I will show you the old way of doing things in Ruby and the
new, more functional way of doing similar things in Ruby again.</p>

<!--more-->


<p>Let me start by saying that this article assumes you&rsquo;re interested in
functional programming. It also assumes that you&rsquo;ve probably seen
other examples of functional code before.</p>

<p>I&rsquo;m going to split this article into several parts and each part will
elaborate upon a specific example.</p>

<h2>Part 1: Immutability</h2>

<p>What is immutability? When people speak about immutability they usually
mean <a href="http://en.wikipedia.org/wiki/Immutable_object">immutable objects</a>.
Quoting from wikipedia:</p>

<blockquote><blockquote><p>an immutable object is an object whose state cannot be modified after it is created.
This is in contrast to a mutable object, which can be modified after it is created.</p></blockquote></blockquote>

<p>A very simple concept with far reaching consequences.</p>

<p>First let&rsquo;s define what &lsquo;whose state cannot be modified&rsquo; really means.
At first you may think that such an object is useless. How can we possibly
use an object if we cannot change it?
Usually an immutable object creates a copy of
itself with desired modifications. The original object remains
unchanged. You will see the examples of it further in the article.</p>

<h3>Immutability and functional programming</h3>

<p>Now, another foundational question: why does functional programming favor
immutable values and data structures over mutable ones? Is <em>real</em> functional
programming possible with mutable values?
You probably know that functional programming is more than &lsquo;programming
with functions&rsquo;. It also requires the functions to be <em>pure</em>.
I&rsquo;m not a mathematician and  my explanation of pure functions may
not be scientifically correct, but you can think of them simply as functions that:
always accept an argument, always return a result and
the computing of the result depends solely on the input.
In other words, a pure function cannot depend on some other data,
existing elsewhere, called <em>state</em>, to influence how the result is computed.
The only thing that dictates how the result is computed is the
function&rsquo;s argument. Pure functions cannot change the external state
either. This is called <em>creating side effects</em>.</p>

<p>Sometimes programmers call the external state &ldquo;the world&rdquo; and refer
to pure functions as functions that cannot depend on &ldquo;the world&rdquo; and
read &ldquo;the world&rdquo; state, nor change &ldquo;the world&rdquo; while making its job.</p>

<p>Why worry at all about the purity of functions? Composability.
When your functions are pure, you can compose large
programs from small functions. Knowing that a function is pure
provides guarantees that it will not change the external state.</p>

<p>Is it possible to write a real program using only pure functions?
How can you talk to the database, write to files, charge
credit cards and do everything else real programs do? Functional
applications are usually built using a pure core (where the bulk of
the logic lives) and a thin, impure shell (that provides access to the
pure core from the outside world). This way you have a large part
of the code that is easy to reason about, easy to test and easy to understand.</p>

<p>Example of a pure function:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">sum_two_numbers</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can see that this function computes the result only using its
arguments.</p>

<p>Example of an impure function:</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='ruby'><span class='line'><span class="k">def</span> <span class="nf">sum_two_numbers</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;calculating sum of two numbers&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function writes to the file system in addition to computing the result.
In other words, this function changes &ldquo;the world&rdquo; by creating side
effects.</p>

<p>Using v2 of this function you hurt composability; you limit yourself in
the ways you can use this function in other parts of your program.</p>

<h4>Immutability and purity</h4>

<p>Now let&rsquo;s look why function purity demands immutability with a concrete
example. We all know that strings in ruby are <a href="http://stackoverflow.com/q/2608493/430254">mutable</a>.
You can mutate the string with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;Hello&quot;</span>
</span><span class='line'><span class="c1"># mutating with &#39;&lt;&lt;&#39;</span>
</span><span class='line'><span class="n">s</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;, world&quot;</span>
</span><span class='line'><span class="c1"># mutating with bang methods</span>
</span><span class='line'><span class="n">s</span><span class="o">.</span><span class="n">upcase!</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span>
</span><span class='line'><span class="c1"># =&gt; &quot;HELLO, WORLD&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code fragment modifies the string in-place, mutating it.
Now let&rsquo;s use the string as a function argument:</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='ruby'><span class='line'><span class="k">def</span> <span class="nf">upcase_string</span><span class="p">(</span><span class="n">input</span><span class="p">)</span>
</span><span class='line'>  <span class="n">input</span><span class="o">.</span><span class="n">upcase!</span>
</span><span class='line'>  <span class="n">input</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This method mutates the argument and returns it.
On the surface, this looks OK, but we have just inadvertently created a
side effect. Any external code that relies on this string may break.</p>

<p>Let&rsquo;s create an example of 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>
<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="k">def</span> <span class="nf">upcase_string</span><span class="p">(</span><span class="n">input</span><span class="p">)</span>
</span><span class='line'>  <span class="n">input</span><span class="o">.</span><span class="n">upcase!</span>
</span><span class='line'>  <span class="n">input</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">current_user_name</span> <span class="o">=</span> <span class="n">get_current_user</span><span class="o">.</span><span class="n">name</span>
</span><span class='line'><span class="n">upcased_user_name</span> <span class="o">=</span> <span class="n">upcase_string</span><span class="p">(</span><span class="n">current_user_name</span><span class="p">)</span>
</span><span class='line'><span class="c1"># ...</span>
</span><span class='line'><span class="c1"># ...</span>
</span><span class='line'><span class="c1"># somewhere else still thinking that current_user_name is downcased</span>
</span><span class='line'><span class="k">if</span> <span class="n">current_user_name</span> <span class="o">==</span> <span class="s1">&#39;admin&#39;</span>
</span><span class='line'>  <span class="c1"># this will never be true</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>You see now that in order to keep function pure we should never mutate
its arguments, but create new objects and return them instead.
Same function, but this time implemented as pure:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">upcase_string</span><span class="p">(</span><span class="n">input</span><span class="p">)</span>
</span><span class='line'>  <span class="n">input</span><span class="o">.</span><span class="n">upcase</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just a minor modification gives us many benefits:
we&rsquo;re no longer modifying &ldquo;the world&rdquo; and only return a new string with
the required modifications.</p>

<p>How can we guarantee that functions never mutate their arguments?
By making the arguments immutable, of course!</p>

<p>The key thing to take away here is that by making each object immutable,
we can guarantee that functions do not create side effects and remain pure.</p>

<p>Hopefully, by now I have convinced you that immutable objects are useful.
Now you probably understand that by limiting the &ldquo;reach&rdquo; of the function
to only the local function&rsquo;s scope you automatically decrease the number
of potential bugs and unpleasant surprises.
However, you may still be unsure about the performance of immutable objects,
and think that it is wasteful to create a copy of an object each time
it needs to be modified.
The following part of the article will hopefully make everything clear.</p>

<h3>Immutability and primitives</h3>

<p>Let&rsquo;s define what primitives are. For our purposes, we can refer to
primitives as data types, that serve as basic building blocks of the language.
Usually the primitives are directly supported by the language.
Ints, floats, characters and booleans are primitives and are usually
treated in a special way by languages.</p>

<p>You don&rsquo;t need to do something like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># in fact you can&#39;t do this in Ruby</span>
</span><span class='line'><span class="n">num</span> <span class="o">=</span> <span class="nb">Integer</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="mi">99</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can use primitives directly:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">num</span> <span class="o">=</span> <span class="mi">99</span>
</span><span class='line'><span class="n">fnum</span> <span class="o">=</span> <span class="mi">3</span><span class="o">.</span><span class="mi">14</span>
</span></code></pre></td></tr></table></div></figure>


<p>Why does a language usually divide objects into, well, objects and
primitives? The reason is performance.
Primitives are closer to computer hardware and creating an object for
every number is slow.</p>

<p>However, Ruby does not have true <a href="http://en.wikipedia.org/wiki/Primitive_data_type">primitives</a>,
because in Ruby, <a href="https://www.ruby-lang.org/en/about/">everything is an object</a>.
You can call methods and properties on numbers and extend them with
user-defined methods. I will still call them primitives, because it&rsquo;s
what they are on a conceptual level.</p>

<p>On one hand, primitives behave like immutable objects
in Ruby:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">i</span> <span class="o">=</span> <span class="mi">99</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">i</span><span class="o">.</span><span class="n">object_id</span>
</span><span class='line'><span class="c1"># =&gt; 7</span>
</span><span class='line'><span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">i</span><span class="o">.</span><span class="n">object_id</span>
</span><span class='line'><span class="c1"># =&gt; 12</span>
</span></code></pre></td></tr></table></div></figure>


<p>This snippet demonstrates that you cannot modify a number. In real life
this doesn&rsquo;t make sense either, if you have the number 4 it&rsquo;s the number 4 &mdash;
eternal and beautiful. If you add 1 to it, you get completely different
number 5, the old 4 stays the same.</p>

<p>On the other hand, you can define your own methods and properties:</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='ruby'><span class='line'><span class="k">class</span> <span class="nc">TrueClass</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:name</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="kp">true</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;one&quot;</span>
</span><span class='line'><span class="kp">false</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;two&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Integers and floats are <em>frozen</em> by default, while booleans are not.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">1</span><span class="o">.</span><span class="n">frozen?</span> <span class="c1"># true</span>
</span><span class='line'><span class="mi">3</span><span class="o">.</span><span class="mi">14</span><span class="o">.</span><span class="n">frozen?</span> <span class="c1"># true</span>
</span><span class='line'><span class="kp">true</span><span class="o">.</span><span class="n">frozen?</span> <span class="c1"># false</span>
</span></code></pre></td></tr></table></div></figure>


<p>So while some primitives are not frozen, Ruby does not provide mutation
methods for them and they <em>usually</em> can be treated as immutable objects.
You should remember that this is easily overridden (as is everything in Ruby)
and can cause potential problems.</p>

<h3>Strings</h3>

<p>Before diving into the specifics of Ruby strings, let&rsquo;s
talk about string mutability in general. In most languages strings are
immutable: string concatenation or upcasing produces a new
string rather than modifying it in-place.</p>

<p>Why do language designers usually make their string implementations
immutable? To answer that we need to remember that strings are one of
the most used data structures in any programming language.</p>

<p>Let&rsquo;s consider the cases when string immutability is useful.</p>

<h4>Concurrency.</h4>

<p>This is a complex topic and I will talk about it later in
the article. What you should know at this point is that when any data
structure is immutable, it can be freely shared across threads
without any locking or synchronization. Immutable data structures
don&rsquo;t need synchronisation at all when used in multithreaded
environments.</p>

<p>Modern programming languages are designed from the ground up to be
concurrent (go, rust), and having a single string instance to be
shared across multiple threads helps to save a lot of memory and avoid
the necessity of defensive copying when passing immutable strings
around.</p>

<h4>Hash table keys</h4>

<p>More often than other data types, strings are used as keys in hash
tables. This usage demands for strings to return the same hash code
after the key and value were added to the hash table. With mutable
strings a hash table would need to copy the string in order to guarantee
the hash code staying the same. With immutable strings this is not needed.</p>

<h4>Security</h4>

<p>As I&rsquo;ve mentioned, strings are used very frequently in any program.
This entails a special treatment in terms of security.
Strings are used when comparing user-names and passwords, storing
credit card numbers and much more. Immutable strings guarantee
that a malicious party is unable to tamper with the string after
creation.</p>

<p>However, there is a performance downside of immutable strings.
Mutable strings allow fast indexing and modifying  in-place,
as with regular arrays.</p>

<h4>String immutability and Ruby</h4>

<p>As with <em>primitives</em>, Ruby has no real immutable strings. To be precise,
Ruby strings are mutable behind an immutable facade. That is, most
operations on strings return new strings, while some of them still allow
in-place modification.</p>

<p>Consider these examples:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># immutable operations</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;hello&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">object_id</span> <span class="c1"># 70093095097920</span>
</span><span class='line'><span class="n">s</span> <span class="o">+=</span> <span class="s2">&quot;, world&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">object_id</span> <span class="c1"># 70093096228400</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">upcase</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">object_id</span> <span class="c1"># 70093096177000</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># mutable operations</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;hello&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">object_id</span> <span class="c1"># 70093096113460</span>
</span><span class='line'><span class="n">s</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;, world&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">object_id</span> <span class="c1"># 70093096113460</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">upcase!</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">object_id</span> <span class="c1"># 70093096113460</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see mutable operations do not create new strings but rather
modify existing strings in-place.</p>

<h5>Strings as hash keys</h5>

<p>Earlier I mentioned that mutable strings do not make good hash keys.
Let me prove 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>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">bad_key</span> <span class="o">=</span> <span class="s2">&quot;hal9000&quot;</span>
</span><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="n">bad_key</span> <span class="o">=&gt;</span> <span class="s2">&quot;Odyssey&quot;</span><span class="p">}</span>
</span><span class='line'><span class="n">h</span><span class="o">[</span><span class="n">bad_key</span><span class="o">]</span> <span class="c1"># &quot;Odyssey&quot;</span>
</span><span class='line'><span class="n">bad_key</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;!&quot;</span>
</span><span class='line'><span class="n">h</span><span class="o">[</span><span class="n">bad_key</span><span class="o">]</span> <span class="c1"># nil</span>
</span></code></pre></td></tr></table></div></figure>


<p>After I modified the string key we can no longer find the value,
because the key&rsquo;s hashcode has changed! Since it&rsquo;s so easy to mutate the
Ruby string, you can end up with a useless hash.
This is why it is not recommended to use mutable strings as hash keys.</p>

<p>How can we remedy it?
The first option is to freeze the string:</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='ruby'><span class='line'><span class="n">better_key</span> <span class="o">=</span> <span class="s2">&quot;hall9000&quot;</span><span class="o">.</span><span class="n">freeze</span>
</span><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="n">better_key</span> <span class="o">=&gt;</span> <span class="s2">&quot;Odyssey&quot;</span><span class="p">}</span>
</span><span class='line'><span class="n">better_key</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;!&quot;</span>
</span><span class='line'><span class="c1"># RuntimeError: can&#39;t modify frozen String</span>
</span></code></pre></td></tr></table></div></figure>


<p>A second and better option is to use <a href="http://www.ruby-doc.org/core-2.1.2/Symbol.html">symbols</a>,
which are immutable versions of strings often used as identifiers.</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='ruby'><span class='line'><span class="n">best_key</span> <span class="o">=</span> <span class="ss">:hal9000</span>
</span><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="n">best_key</span> <span class="o">=&gt;</span> <span class="s2">&quot;Odyssey&quot;</span><span class="p">}</span>
</span><span class='line'><span class="n">best_key</span> <span class="o">&lt;&lt;</span> <span class="ss">:a</span>
</span><span class='line'><span class="ss">NoMethodError</span><span class="p">:</span> <span class="n">undefined</span> <span class="nb">method</span> <span class="sb">`&lt;&lt;&#39; for :hal9000:Symbol</span>
</span></code></pre></td></tr></table></div></figure>


<p>When using literal symbols as hash keys, Ruby provides a shorter syntax:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="ss">hal9000</span><span class="p">:</span> <span class="s2">&quot;Odyssey&quot;</span><span class="p">}</span>
</span><span class='line'><span class="c1"># hal9000: gets converted to :hal9000 =&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You might say at this point, &ldquo;Why can&rsquo;t I just use symbols instead of
strings if they&rsquo;re immutable equivalents?&rdquo;. The short answer is you may not be
able to, depending on your use case.
One reason is that symbols don&rsquo;t have immutable equivalents of
string&rsquo;s many methods, so it&rsquo;s inconvenient to use symbols as an immutable replacement.
Just compare the number of methods in <a href="http://www.ruby-doc.org/core-2.1.2/Symbol.html">Symbol</a>
and <a href="http://www.ruby-doc.org/core-2.1.2/String.html">String</a> to see the
difference.</p>

<h3>Immutable data structures</h3>

<p>So far my discussion was around built-in data types and their
relationships with immutability. Real-life applications, however,
require using data structures in order to be efficient.</p>

<p>What is a data structure?</p>

<p>It&rsquo;s a complex question, but you can think of
it as a way to organize other, simpler data structures in a convenient or efficient
way. Some data structures are designed for ease of use, while others are
built solely with efficiency in mind.</p>

<p>We all know about lists, queues, hash tables, arrays, trees and many, many
more. These data structres can have both mutable and immutable implementations.</p>

<p>Mutable implementations are considered &lsquo;classic&rsquo;, because they are more
widely used, have been around for longer and generally are easier to implement.
Immutable counterparts offer advantages in concurrency and security.</p>

<p>While some people use &lsquo;immutable&rsquo; and &lsquo;persistent&rsquo; interchangeably,
they are not the same. <a href="http://en.wikipedia.org/wiki/Persistent_data_structure">Persistent data structure</a>
is immutable and keeps and reuses large
parts of itself while constructing an immutable copy. As an example, you can think of a persistent
linked list that reuses its tail when appending a new node.
If you&rsquo;re interested in functional, persistent data structures, have a
look at <a href="http://www.amazon.com/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504">Purely functional data structures</a>
by Chris Okasaki.</p>

<p>Let me also add that many modern programming languages that focus on
concurrency have their data structures implemented in an immutable
fashion: <a href="http://www.scala-lang.org/api/2.11.1/#scala.collection.immutable.package">Scala</a>
offers both immutable and mutable collections. <a href="http://clojure.org/functional_programming#Functional%20Programming--Immutable%20Data%20Structures">Clojure</a> and  <a href="http://msdn.microsoft.com/en-us/library/dn385366(v=vs.110).aspx">C#</a> offer immutable collections as well.</p>

<p>Let&rsquo;s go ahead and implement a classic, mutable stack in Ruby and
then reimplement it as immutable.
A <a href="http://en.wikipedia.org/wiki/Stack_(abstract_data_type">stack</a> is a data structure that follows this interface:</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'>self push(item)
</span><span class='line'>self pop()
</span><span class='line'>item peek()
</span><span class='line'>bool empty?</span></code></pre></td></tr></table></div></figure>


<p>Here is mutable implementation that uses a Ruby array as a backing store:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">MutableStack</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@store</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@store</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">pop</span>
</span><span class='line'>    <span class="vi">@store</span><span class="o">.</span><span class="n">pop</span>
</span><span class='line'>    <span class="nb">self</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">peek</span>
</span><span class='line'>    <span class="vi">@store</span><span class="o">[-</span><span class="mi">1</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">empty?</span>
</span><span class='line'>    <span class="vi">@store</span><span class="o">.</span><span class="n">empty?</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>This implementation is basically a thin wrapper around array.
Whenever you call <code>stack.push(item)</code>, you&rsquo;re modifying this array
in-place. This implementation possesses all the weaknesses that we discussed
previously.</p>

<p>Now to an immutable implementation:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">ImmutableStack</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">EmptyStack</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">empty?</span>
</span><span class='line'>      <span class="kp">true</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">push</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span><span class='line'>      <span class="no">ImmutableStack</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">self</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">pop</span>
</span><span class='line'>      <span class="k">raise</span> <span class="s1">&#39;Cannot pop empty stack&#39;</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">peek</span>
</span><span class='line'>      <span class="k">raise</span> <span class="s1">&#39;Cannot peek empty stack&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">empty</span>
</span><span class='line'>    <span class="no">EmptyStack</span><span class="o">.</span><span class="n">new</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">initialize</span><span class="p">(</span><span class="n">head</span><span class="p">,</span> <span class="n">tail</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@head</span> <span class="o">=</span> <span class="n">head</span>
</span><span class='line'>    <span class="vi">@tail</span> <span class="o">=</span> <span class="n">tail</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">attr_reader</span> <span class="ss">:head</span><span class="p">,</span> <span class="ss">:tail</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">peek</span>
</span><span class='line'>    <span class="n">head</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">push</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ImmutableStack</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">self</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">pop</span>
</span><span class='line'>    <span class="n">tail</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">empty?</span>
</span><span class='line'>    <span class="kp">false</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>Usage pattern:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="no">ImmutableStack</span><span class="o">.</span><span class="n">empty</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="mi">99</span><span class="p">)</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">peek</span> <span class="c1"># 100</span>
</span><span class='line'><span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">pop</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">s</span><span class="o">.</span><span class="n">peek</span> <span class="c1"># 99</span>
</span><span class='line'><span class="n">s</span><span class="o">.</span><span class="n">peek</span> <span class="c1"># Cannot peek empty stack (RuntimeError)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Each destructive operation does not mutate the stack but
rather returns a copy of itself with the required modifications.
What&rsquo;s more, it reuses a large portion of itself while doing so, thus
making this stack a persistent data structure.</p>

<p>Unfortunately, Ruby does not allow you to directly create private
constructors and users can potentially call</p>

<figure class='code'><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="no">ImmutableStack</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="no">ImmutableStack</span><span class="o">.</span><span class="n">empty</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you want a good ruby library of immutable collections, I suggest
using <a href="https://github.com/hamstergem/hamster">hamster</a>.</p>

<h4>Immutable data structures and multithreading</h4>

<p>When writing a multi-threaded applications, follow these rules:</p>

<ol>
<li>Avoid sharing data across threads.</li>
<li>If you have to share your data across threads, make this data immutable.</li>
<li>If you can&rsquo;t avoid sharing mutable data, synchronize access to that
data with synchronization constructs, such as <a href="http://www.ruby-doc.org/core-2.1.1/Mutex.html">Mutex</a>.</li>
</ol>


<p>In our two stack implementations it is safe to share an
immutable version across multiple threads, because they will not be able to
modify it in place. Whenever a thread makes a <code>push</code> or a <code>pop</code>, a
new instance of the stack is created and returned so that the existing
instance is never changed.</p>

<h3>Conclusion</h3>

<p>Now that you&rsquo;ve read the article, you might have the impression that
immutability is a silver bullet.  It is not.
It is only one possible way to design software and has its own strengths
and weaknesses. Immutability let&rsquo;s you design your functions and data
structures in a new way, gaining much and losing much too.
We&rsquo;ve all been living in a world where the sequential computation was
the de-facto standard.
In the past immutability was not worth it.
For a single core computer, immutability has too much overhead.
You must carefully control the state and
pay close attention to reusing and copying in order to be efficient.
The performance impact that some of the immutable data structures incur can
be too significant.</p>

<p>But the world is changing and the sequential model is disappearing.
We all have smartphones with 2 or 4 cores. Our smart watches will have 8
cores in a couple of years, which means that concurrent will become
the new sequential. If we want to exploit the power of modern hardware, we need
to embrace the concurrent way of doing things. This is where
immutability advantages outweigh the bad parts.
I think that immutability is the way you should design your
software now in order to be prepared for the concurrent future.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introduction to full text search for Rails developers]]></title>
    <link href="http://valve.github.io/blog/2014/02/22/rails-developer-guide-to-full-text-search-with-solr/"/>
    <updated>2014-02-22T15:05:00+04:00</updated>
    <id>http://valve.github.io/blog/2014/02/22/rails-developer-guide-to-full-text-search-with-solr</id>
    <content type="html"><![CDATA[<p>Every developer has heard of full-text search. However, most developers search with SQL and relational databases.</p>

<p>Almost every developer knows deep inside that full-text search is better suited for searching text, but continues to use old <code>LIKE '%?%'</code> queries.</p>

<p>I was one of those developers who never used full-text search,
but I have changed and I invite others to join me and discover
the other side of search with Solr.</p>

<!--more-->


<p></p>

<p>This article assumes you&rsquo;re comfortable with Ruby, Rails and PostgreSQL. I&rsquo;ll build a simple <em>people near me</em> application using Solr in small incremental steps and hopefully help readers to
overcome the feeling of uncomfortable uneasiness when thinking about full text search technology.</p>

<p><strong>Disclaimer:</strong> <em>My goal here is to familiarize the reader with full-text search,
not create an ideal rails application structure.
I&rsquo;ll be using long views and JavaScript inside ERB templates.
The point is to make a small but complete application in a single article
and it is possible to do so only by keeping it really simple.</em></p>

<p>OK, enough talk, let&rsquo;s build the app!</p>

<p>Let&rsquo;s call this app <code>Neibo</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>personal  ruby -v
</span><span class='line'>ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin13.0.0]
</span><span class='line'>personal  rails -v
</span><span class='line'>Rails 4.0.2
</span><span class='line'>personal  rails new neibo
</span><span class='line'>      create
</span><span class='line'>      create  README.rdoc
</span><span class='line'>      create  Rakefile
</span><span class='line'>      create  config.ru
</span><span class='line'>      create  .gitignore
</span><span class='line'>      create  Gemfile
</span><span class='line'>      create  app
</span><span class='line'>      ...</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s remove the <code>sqlite3</code>, <code>turbolinks</code>, <code>coffee-rails</code>, <code>jbuilder</code> and <code>jquery-rails</code> gems
as we will not need them. We should also add the <code>pg</code> gem to talk to Postgres DB.</p>

<p>My Gemfile is now:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>source 'https://rubygems.org'
</span><span class='line'>
</span><span class='line'>gem 'rails', '4.0.2'
</span><span class='line'>gem 'pg'
</span><span class='line'>gem 'sass-rails', '~> 4.0.0'
</span><span class='line'>gem 'uglifier', '>= 1.3.0'</span></code></pre></td></tr></table></div></figure>


<p>Now you need to set the pg connection in <code>config/database.yml</code> file:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="c1"># config/database.yml</span>
</span><span class='line'><span class="l-Scalar-Plain">common</span><span class="p-Indicator">:</span> <span class="nl">&amp;common</span>
</span><span class='line'>  <span class="l-Scalar-Plain">adapter</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">postgresql</span>
</span><span class='line'>  <span class="l-Scalar-Plain">encoding</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">unicode</span>
</span><span class='line'>  <span class="l-Scalar-Plain">pool</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">5</span>
</span><span class='line'>  <span class="l-Scalar-Plain">timeout</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">5000</span>
</span><span class='line'>  <span class="l-Scalar-Plain">min_messages</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">warning</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">development</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">&lt;&lt;</span><span class="p-Indicator">:</span> <span class="nv">*common</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">neibo</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">test</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">&lt;&lt;</span><span class="p-Indicator">:</span> <span class="nv">*common</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">neibo_test</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">production</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">&lt;&lt;</span><span class="p-Indicator">:</span> <span class="nv">*common</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">neibo_production</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then let&rsquo;s create a <code>Person</code> model and generate a migration for it:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># app/models/person.rb</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Person</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>neibo  rails g migration create_people
</span><span class='line'>    invoke  active_record
</span><span class='line'>    create    db/migrate/20140222113048_create_people.rb</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># db/migrate/20140222113048_create_people.rb</span>
</span><span class='line'><span class="k">class</span> <span class="nc">CreatePeople</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Migration</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">change</span>
</span><span class='line'>    <span class="n">create_table</span> <span class="ss">:people</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">string</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">null</span><span class="p">:</span> <span class="kp">false</span>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">text</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">null</span><span class="p">:</span> <span class="kp">false</span>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">string</span> <span class="ss">:likes</span>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">string</span> <span class="ss">:dislikes</span>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">float</span> <span class="ss">:lat</span><span class="p">,</span> <span class="ss">null</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">float</span> <span class="ss">:lon</span><span class="p">,</span> <span class="ss">null</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">t</span><span class="o">.</span><span class="n">timestamps</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>For every person we store a <code>name</code>,
an <code>about</code> &ndash; this is where a person can tell the world about himself,
<code>likes</code> &ndash; things person likes and <code>dislikes</code>.
We also want to store a person&rsquo;s location, so that other people can locate him within certain radius.</p>

<p>We store a location using two <a href="http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-FLOAT">floating point</a> numbers, <code>lat</code> &ndash; for latitude, and <code>lon</code> &ndash; for longitude.
It&rsquo;s possible to use a
specialized <a href="http://www.postgresql.org/docs/current/static/datatype-geometric.html#AEN6547">Point</a> data type, but I want to keep it simple here.</p>

<p>I make <code>lat</code> &amp; <code>lon</code> attributes nullable in case a user
denies the browser geolocation permission.</p>

<p>Let&rsquo;s create the databases and run the migration.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>neibo  rake db:create
</span><span class='line'> neibo  rake db:migrate
</span><span class='line'>==  CreatePeople: migrating ===================================================
</span><span class='line'>-- create_table(:people)
</span><span class='line'>   -> 0.0080s
</span><span class='line'>==  CreatePeople: migrated (0.0080s) ==========================================</span></code></pre></td></tr></table></div></figure>


<p>We now need to create a controller, a route and a view:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># app/controllers/people_controller.rb</span>
</span><span class='line'><span class="k">class</span> <span class="nc">PeopleController</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="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<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='ruby'><span class='line'><span class="c1"># config/routes.rb</span>
</span><span class='line'><span class="ss">Neibo</span><span class="p">:</span><span class="ss">:Application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">root</span> <span class="ss">to</span><span class="p">:</span> <span class="s1">&#39;people#index&#39;</span>
</span><span class='line'>  <span class="n">resources</span> <span class="ss">:people</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>app/views/people/index.html.erb</code></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='erb'><span class='line'><span class="cp">&lt;%</span> <span class="k">if</span> <span class="n">flash</span><span class="o">[</span><span class="ss">:alert</span><span class="o">].</span><span class="n">present?</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">  &lt;h1 style=&quot;color:red&quot;&gt;</span><span class="cp">&lt;%=</span> <span class="n">flash</span><span class="o">[</span><span class="ss">:alert</span><span class="o">]</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="k">if</span> <span class="n">current_user</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">  &lt;h2&gt;Hello, </span><span class="cp">&lt;%=</span> <span class="n">current_user</span><span class="o">.</span><span class="n">name</span> <span class="cp">%&gt;</span><span class="x">&lt;/h2&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="x">  &lt;h3&gt;Search people near you: &lt;/h3&gt;</span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%=</span> <span class="n">form_tag</span> <span class="n">people_path</span><span class="p">,</span> <span class="nb">method</span><span class="p">:</span> <span class="ss">:get</span> <span class="k">do</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">    &lt;div&gt;</span>
</span><span class='line'><span class="x">      </span><span class="cp">&lt;%=</span> <span class="n">text_field_tag</span> <span class="ss">:search</span><span class="p">,</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>      <span class="ss">placeholder</span><span class="p">:</span> <span class="s1">&#39;Search nearby people&#39;</span><span class="p">,</span> <span class="ss">type</span><span class="p">:</span> <span class="ss">:search</span><span class="p">,</span> <span class="ss">style</span><span class="p">:</span> <span class="s1">&#39;width: 400px&#39;</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">      &lt;label&gt;Search within mile radius:</span>
</span><span class='line'><span class="x">        </span><span class="cp">&lt;%=</span> <span class="n">select_tag</span> <span class="ss">:radius</span><span class="p">,</span> <span class="n">options_for_select</span><span class="p">(</span><span class="o">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">100</span><span class="o">]</span><span class="p">)</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">      &lt;/label&gt;</span>
</span><span class='line'><span class="x">    &lt;/div&gt;</span>
</span><span class='line'><span class="x">    &lt;div&gt;</span><span class="cp">&lt;%=</span> <span class="n">submit_tag</span> <span class="s1">&#39;Search&#39;</span> <span class="cp">%&gt;</span><span class="x">&lt;/div&gt;</span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="k">else</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">  &lt;h2&gt;Hello, guest&lt;/h2&gt;</span>
</span><span class='line'><span class="x">  &lt;h3&gt;</span>
</span><span class='line'><span class="x">    Fill your profile so that people could find you.</span>
</span><span class='line'><span class="x">    Allow browser to access your location if you want to be found by people near you.</span>
</span><span class='line'><span class="x">  &lt;/h3&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%=</span> <span class="n">form_for</span> <span class="vi">@new_person</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">    &lt;div&gt; </span><span class="cp">&lt;%=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">placeholder</span><span class="p">:</span> <span class="s1">&#39;Enter your name&#39;</span> <span class="cp">%&gt;</span><span class="x"> &lt;/div&gt;</span>
</span><span class='line'><span class="x">    &lt;div&gt; </span><span class="cp">&lt;%=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_area</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">placeholder</span><span class="p">:</span> <span class="s1">&#39;Tell about yourself&#39;</span> <span class="cp">%&gt;</span><span class="x"> &lt;/div&gt;</span>
</span><span class='line'><span class="x">    &lt;div&gt; </span><span class="cp">&lt;%=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:likes</span><span class="p">,</span> <span class="ss">placeholder</span><span class="p">:</span> <span class="s1">&#39;Stuff you like&#39;</span> <span class="cp">%&gt;</span><span class="x"> &lt;/div&gt;</span>
</span><span class='line'><span class="x">    &lt;div&gt; </span><span class="cp">&lt;%=</span> <span class="n">f</span><span class="o">.</span><span class="n">text_field</span> <span class="ss">:dislikes</span><span class="p">,</span> <span class="ss">placeholder</span><span class="p">:</span> <span class="s1">&#39;Stuff you don\&#39;t &#39;</span> <span class="cp">%&gt;</span><span class="x"> &lt;/div&gt;</span>
</span><span class='line'><span class="x">    &lt;div&gt; </span><span class="cp">&lt;%=</span> <span class="n">f</span><span class="o">.</span><span class="n">submit</span> <span class="s1">&#39;Save&#39;</span> <span class="cp">%&gt;</span><span class="x"> &lt;/div&gt;</span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span><span class="x"></span>
</span></code></pre></td></tr></table></div></figure>


<p>This UI has two parts: if a user has already filled his details,
he can use the search form and search for people nearby.
If this is a new user, he fills his details, optionally allows a browser to get his location and
saves his profile in the database.</p>

<p>We now need to modify the <code>app/assets/javascripts/application.js</code>
and remove the files we&rsquo;re not using.
I remove them all and leave the <code>application.js</code> empty.</p>

<p>The view code checks the <code>current_user</code> method to see if the current user profile has been filled.
Let&rsquo;s create this method:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># app/controllers/application_controller.rb</span>
</span><span class='line'><span class="k">class</span> <span class="nc">ApplicationController</span> <span class="o">&lt;</span> <span class="ss">ActionController</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'>  <span class="n">protect_from_forgery</span> <span class="ss">with</span><span class="p">:</span> <span class="ss">:exception</span>
</span><span class='line'>  <span class="n">helper_method</span> <span class="ss">:current_user</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">current_user</span>
</span><span class='line'>    <span class="vi">@current_user</span> <span class="o">||=</span> <span class="no">Person</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">session</span><span class="o">[</span><span class="ss">:current_user_id</span><span class="o">]</span><span class="p">)</span> <span class="k">if</span> <span class="n">session</span><span class="o">[</span><span class="ss">:current_user_id</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>I&rsquo;ll be storing current user&rsquo;s id in session and get the user object from the database.</p>

<p>Let&rsquo;s concentrate on the <code>new user</code> scenario.
In order for the application to learn the user&rsquo;s location, we need to grab it from the browser and save.</p>

<p>Adding the code to the view:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>  <span class="nt">&lt;h2&gt;</span>Hello, guest<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h3&gt;</span>
</span><span class='line'>    Fill your profile so that people could find you.
</span><span class='line'>    Allow browser to access your location if you want to be found by people near you.
</span><span class='line'>  <span class="nt">&lt;/h3&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="err">&lt;</span>%= form_for @new_person do |f| %&gt;
</span><span class='line'>    <span class="nt">&lt;div&gt;</span> <span class="err">&lt;</span>%= f.text_field :name, placeholder: &#39;Enter your name&#39; %&gt; <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span> <span class="err">&lt;</span>%= f.text_area :about, placeholder: &#39;Tell about yourself&#39; %&gt; <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span> <span class="err">&lt;</span>%= f.text_field :likes, placeholder: &#39;Stuff you like&#39; %&gt; <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span> <span class="err">&lt;</span>%= f.text_field :dislikes, placeholder: &#39;Stuff you don\&#39;t &#39; %&gt; <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="err">&lt;</span>%= f.hidden_field :lat %&gt;
</span><span class='line'>    <span class="err">&lt;</span>%= f.hidden_field :lon %&gt;
</span><span class='line'>    <span class="nt">&lt;div&gt;</span> <span class="err">&lt;</span>%= f.submit &#39;Save&#39; %&gt; <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="err">&lt;</span>% end %&gt;
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">.</span><span class="nx">getCurrentPosition</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">position</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#person_lat&#39;</span><span class="p">).</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">latitude</span><span class="p">;</span>
</span><span class='line'>      <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#person_lon&#39;</span><span class="p">).</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">longitude</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The lines we&rsquo;re interested in are:</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>
</pre></td><td class='code'><pre><code class='html'><span class='line'>    <span class="err">&lt;</span>%= f.hidden_field :lat %&gt;
</span><span class='line'>    <span class="err">&lt;</span>%= f.hidden_field :lon %&gt;
</span></code></pre></td></tr></table></div></figure>


<p>And the JavaScript:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'>  <span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="nx">navigator</span><span class="p">.</span><span class="nx">geolocation</span><span class="p">.</span><span class="nx">getCurrentPosition</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">position</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#person_lat&#39;</span><span class="p">).</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">latitude</span><span class="p">;</span>
</span><span class='line'>      <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;#person_lon&#39;</span><span class="p">).</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">position</span><span class="p">.</span><span class="nx">coords</span><span class="p">.</span><span class="nx">longitude</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>When a view loads, JavaScripts asks a user for permission to get his location.
If the user agrees, the callback is invoked and the location is saved in the hidden fields
so that the form can
submit them back to the server.</p>

<p>Now the controller part:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># app/controllers/people_controller.rb</span>
</span><span class='line'><span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>  <span class="vi">@new_person</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">new</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">create</span>
</span><span class='line'>  <span class="vi">@new_person</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">person_params</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="vi">@new_person</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>    <span class="n">session</span><span class="o">[</span><span class="ss">:current_user_id</span><span class="o">]</span> <span class="o">=</span> <span class="vi">@new_person</span><span class="o">.</span><span class="n">id</span>
</span><span class='line'>    <span class="n">redirect_to</span> <span class="n">people_path</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">alert</span> <span class="o">=</span> <span class="s1">&#39;Please fill your profile&#39;</span>
</span><span class='line'>    <span class="n">render</span> <span class="ss">:index</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="kp">private</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">person_params</span>
</span><span class='line'>  <span class="n">params</span><span class="o">.</span><span class="n">require</span><span class="p">(</span><span class="ss">:person</span><span class="p">)</span><span class="o">.</span><span class="n">permit</span><span class="p">(</span><span class="ss">:name</span><span class="p">,</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">:likes</span><span class="p">,</span> <span class="ss">:dislikes</span><span class="p">,</span> <span class="ss">:lat</span><span class="p">,</span> <span class="ss">:lon</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we have boilerplate ruby code, we&rsquo;re using strong parameters to only allow a known
set of attributes.
We then try to create a user and save the new user ID in the session.
This way <code>current_user</code> helper method will retrieve the current user from the
database.
If the validation fails, we just display the message about it and render the view again.</p>

<p>Let&rsquo;s add those validations:</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='ruby'><span class='line'><span class="c1"># app/models/person.rb</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Person</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">:likes</span><span class="p">,</span> <span class="ss">:dislikes</span><span class="p">,</span> <span class="ss">presence</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when we go back to the browser and reload the page we can enter the profile data,
allow the browser to get our geolocation and click save.</p>

<p>At this point we introduced ourselves to
the system and <code>current_user.id</code> is stored in the encrypted cookie.</p>

<p>Next part is where the fun starts: we need to be able to search for other users nearby.
We should allow limiting the search radius, specify the search term and see the results.</p>

<p>We must remove people who have our search term in their <code>dislikes</code> attribute.
For example if a person dislikes Chinese couisine, and we&rsquo;re searching for people
who like it,&hellip; you get the idea.</p>

<p>Let&rsquo;s take a little detour and speak about Solr and the gems that enable it in Rails.
We&rsquo;ll be using <a href="https://github.com/sunspot/sunspot">sunspot</a> &ndash; an excellent gem that
adds a nice DSL (really, it&rsquo;s nice) on top of <a href="https://github.com/rsolr/rsolr">rsolr</a>.</p>

<p>At this point you might be asking: <em>&ldquo;Wait! What&rsquo;s RSolr? I&rsquo;m now totally confused between Solr, RSolr and Sunspot and how they relate to each other&rdquo;</em>.
I totally understand your confusion. Let&rsquo;s break this mess into pieces:</p>

<ol>
<li>Solr &ndash; a Java server that runs as a separate service and communicates
via XML over HTTP API. It is generally considered a robust and full-featured</li>
<li>yet hard to learn full-text search solution.
The only way you can communicate directly with Solr from a Rails application
is to send rather cryptic XML requests.</li>
<li>Nobody wants to mess with raw XML over HTTP, so here enters RSolr &ndash; a wrapper around the
Solr HTTP API that allows interacting with Solr from Ruby.</li>
<li>However RSolr is still rather low-level and does not provide any DSL or convenience methods
to define which Rails models should be searchable and how the indexes will be updated.
The need for a new library was apparent, so the Sunspot was born. A really nice DSL that
integrates directly into ActiveRecord models and allows specifying which attributes we need
to index, as well as how to transform and query the data.</li>
</ol>


<p>Now you&rsquo;re saying: &ldquo;<em>I still don&rsquo;t understand, if Solr is a Java service it means
I need to install and configure it on my system?
That&rsquo;s a horrible perspective, get me out of this!</em>&rdquo;.
Absolutely not. The Sunspot gem is bundled with a development version of Solr and has a nice set of rake tasks to manage it. You can start, stop, reindex the data, all using rake tasks. There is no need to install Solr manually, all you need is to add two gems:</p>

<p><code>sunspot_solr</code> and <code>sunspot_rails</code>.</p>

<p><code>sunspot_solr</code> is the pre-packaged development version of Solr and <code>sunspot_rails</code>
is the Sunspot gem itself. So you need to make sure you place the <code>sunspot_solr</code> into <code>:development</code> group in your Gemfile.</p>

<p>Now you can start bundled Solr with <code>rake sunspot:solr:start</code>, stop it with <code>rake sunspot:solr:stop</code> and
reindex all data with <code>rake sunspot:reindex</code>.</p>

<p>OK, now that confusion is hopefully out of the way, let&rsquo;s continue with our person search
scenario.</p>

<p>Let us define the searchable attributes on our <code>Person</code> model:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Person</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'>  <span class="n">validates</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">:likes</span><span class="p">,</span> <span class="ss">:dislikes</span><span class="p">,</span> <span class="ss">presence</span><span class="p">:</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">searchable</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">text</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">boost</span><span class="p">:</span> <span class="mi">5</span><span class="o">.</span><span class="mi">0</span>
</span><span class='line'>    <span class="n">text</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">:likes</span>
</span><span class='line'>    <span class="n">latlon</span><span class="p">(</span><span class="ss">:location</span><span class="p">)</span> <span class="p">{</span> <span class="ss">Sunspot</span><span class="p">:</span><span class="ss">:Util</span><span class="o">::</span><span class="no">Coordinates</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="n">lon</span><span class="p">)</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>Let&rsquo;s break it down piece by piece:</p>

<ol>
<li><code>searchable</code> block is a place where you define the full-text indexing behavior.
Inside this block you can specify various rules describing which attributes should
be indexed, their pre-index transformations, facets, filters and so on.</li>
<li><code>text :name</code> &ndash; A person should be searchable by his name.</li>
<li><code>boost: 5.0</code> &ndash; boost option tells Solr to prioritize the results found by this particular attribute.
If you&rsquo;re searching for <code>John Doe</code>,
all the people with this name will come first,
and only after those who dislike John Does.</li>
<li><code>text :about, :likes</code> &ndash; <code>Person</code> should be searchable by these attributes.</li>
<li><code>latlon(:location) { Sunspot::Util::Coordinates.new(lat, lon) }</code> &ndash; create a geo-spatial
index on person&rsquo;s location using <code>lat</code> and <code>lon</code> attributes.
This will allow searching for people within a certain mile radius.</li>
</ol>


<p>Great, wasn&rsquo;t that simple? We&rsquo;ve defined a set of searchable attributes on a <code>Person</code> model.
Now we&rsquo;re ready to actually search for people.</p>

<p>Let us add a <code>_person</code> partial where search result item will be displayed:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='erb'><span class='line'><span class="cp">&lt;%#</span><span class="c"> app/views/people/_person.html.erb </span><span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">&lt;div class=&quot;person&quot;&gt;</span>
</span><span class='line'><span class="x"> &lt;h4&gt;</span><span class="cp">&lt;%=</span> <span class="n">person</span><span class="o">.</span><span class="n">name</span> <span class="cp">%&gt;</span><span class="x"> &lt;/h4&gt;</span>
</span><span class='line'><span class="x"> &lt;h5&gt;About:&lt;/h5&gt;</span>
</span><span class='line'><span class="x"> &lt;italic&gt;</span><span class="cp">&lt;%=</span> <span class="n">person</span><span class="o">.</span><span class="n">about</span> <span class="cp">%&gt;</span><span class="x">&lt;/italic&gt;</span>
</span><span class='line'><span class="x"> &lt;h5&gt;Likes:&lt;/h5&gt;</span>
</span><span class='line'><span class="x"> &lt;italic&gt;</span><span class="cp">&lt;%=</span> <span class="n">person</span><span class="o">.</span><span class="n">likes</span> <span class="cp">%&gt;</span><span class="x">&lt;/italic&gt;</span>
</span><span class='line'><span class="x"> &lt;h5&gt;Dislikes:&lt;/h5&gt;</span>
</span><span class='line'><span class="x"> &lt;italic&gt;</span><span class="cp">&lt;%=</span> <span class="n">person</span><span class="o">.</span><span class="n">dislikes</span> <span class="cp">%&gt;</span><span class="x">&lt;/italic&gt;</span>
</span><span class='line'><span class="x">&lt;/div&gt;</span>
</span><span class='line'><span class="x">&lt;hr/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We also need to add the iteration to the <code>index</code> view:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='erb'><span class='line'><span class="cp">&lt;%#</span><span class="c"> app/views/people/index.html.erb </span><span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="vi">@people</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">person</span><span class="o">|</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="x">  </span><span class="cp">&lt;%=</span> <span class="n">render</span> <span class="ss">partial</span><span class="p">:</span> <span class="s1">&#39;person&#39;</span><span class="p">,</span> <span class="ss">locals</span><span class="p">:</span> <span class="p">{</span><span class="ss">person</span><span class="p">:</span> <span class="n">person</span><span class="p">}</span> <span class="cp">%&gt;</span><span class="x"></span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span><span class="x"></span>
</span></code></pre></td></tr></table></div></figure>


<p>So the view is ready, let&rsquo;s modify the controller code:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<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='ruby'><span class='line'><span class="c1"># app/controllers/people_controller.rb</span>
</span><span class='line'><span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">current_user</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">].</span><span class="n">present?</span> <span class="o">||</span> <span class="n">params</span><span class="o">[</span><span class="ss">:radius</span><span class="o">].</span><span class="n">present?</span>
</span><span class='line'>      <span class="n">search</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">search</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">fulltext</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">]</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">current_user</span><span class="o">.</span><span class="n">has_location?</span>
</span><span class='line'>          <span class="n">with</span><span class="p">(</span><span class="ss">:location</span><span class="p">)</span><span class="o">.</span><span class="n">in_radius</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">lat</span><span class="p">,</span> <span class="n">current_user</span><span class="o">.</span><span class="n">lon</span><span class="p">,</span> <span class="n">params</span><span class="o">[</span><span class="ss">:radius</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="vi">@people</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">results</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="vi">@people</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="vi">@new_person</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">new</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>On line <code>3</code> we check if current user is saved, on line <code>4</code> we verify we have something to
search by, either a search term or a radius. Then on lines <code>5 - 10</code> is where the actual
full-text search happens. We use a <code>Model.search</code> method and pass it a block.
Inside this block we need to specify the logic of the search.
In our case we call the <code>fulltext</code> method and pass it our search term.</p>

<p>Let me be clear, we have two phases: <strong>indexing</strong> and <strong>searching</strong>. Indexing is defined
inside a model in a <code>searchable</code> block. You use <code>text</code> method to specify which attributes
should be full-text searchable.</p>

<p>Search by calling <code>Model.search</code> method and passing it a block too. But this time
we call <code>fulltext</code> method to actually do full-text search on indexed attributes.</p>

<p>OK, we now understand how to do full-text search on text attributes, we&rsquo;re already doing it on
<code>name</code>, <code>about</code> and <code>likes</code> attributes. What we also need is a way to restrict the results
to a certain radius on a map. This is what lines <code>7 - 9</code> are for.</p>

<p>In our application it&rsquo;s possible for a user to deny geolocation permissions and his
profile to be saved without coordinates. So, we need a convenience method to see
if the current user has a location:</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='ruby'><span class='line'><span class="c1"># app/models/person.rb</span>
</span><span class='line'><span class="k">def</span> <span class="nf">has_location?</span>
</span><span class='line'>  <span class="n">lat</span> <span class="o">&amp;&amp;</span> <span class="n">lon</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This method is useful in <code>Person.search</code> block where we specify the search radius:</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='ruby'><span class='line'><span class="c1"># app/controllers/people_controller.rb</span>
</span><span class='line'><span class="k">if</span> <span class="n">current_user</span><span class="o">.</span><span class="n">has_location?</span>
</span><span class='line'>  <span class="n">with</span><span class="p">(</span><span class="ss">:location</span><span class="p">)</span><span class="o">.</span><span class="n">in_radius</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">lat</span><span class="p">,</span> <span class="n">current_user</span><span class="o">.</span><span class="n">lon</span><span class="p">,</span> <span class="n">params</span><span class="o">[</span><span class="ss">:radius</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We&rsquo;re using the current user&rsquo;s <code>lat</code> &amp; <code>lon</code> attributes and the radius from params to perform the
filtering. You should remember to convert miles to kilometers, because Sunspot operates on
kilometers.</p>

<p>OK, first version of the people search is ready to try, let&rsquo;s run it.</p>

<p>Works fine, but when I search for someone within 10 mile radius, I find myself too.
There should be a way to search for <em>other</em> people, excluding myself. Let&rsquo;s fix it.</p>

<p>Sunspot allows using attributes as filters. For this we should call methods like <code>integer</code>,
<code>string</code>, <code>datetime</code> etc. In this case we need to search for all people except those
with <code>:id</code> equal to the <code>:id</code> of current user. We also need to filter out the people with
<code>dislikes</code> equal to the search term:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># app/models/person.rb</span>
</span><span class='line'><span class="n">searchable</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">text</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">boost</span><span class="p">:</span> <span class="mi">5</span><span class="o">.</span><span class="mi">0</span>
</span><span class='line'>  <span class="n">text</span> <span class="ss">:about</span><span class="p">,</span> <span class="ss">:likes</span>
</span><span class='line'>  <span class="n">integer</span> <span class="p">(</span><span class="ss">:id</span><span class="p">)</span>
</span><span class='line'>  <span class="n">string</span><span class="p">(</span><span class="ss">:dislikes</span><span class="p">)</span>
</span><span class='line'>  <span class="n">latlon</span><span class="p">(</span><span class="ss">:location</span><span class="p">)</span> <span class="p">{</span> <span class="ss">Sunspot</span><span class="p">:</span><span class="ss">:Util</span><span class="o">::</span><span class="no">Coordinates</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span> <span class="n">lon</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>On line <code>5</code> we&rsquo;re creating an indexed filter on <code>:id</code> column, and on the next line a filter on
<code>:dislikes</code> column.</p>

<p>Now the filtering itself:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># app/controllers/people_controller.rb</span>
</span><span class='line'><span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">current_user</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">].</span><span class="n">present?</span> <span class="o">||</span> <span class="n">params</span><span class="o">[</span><span class="ss">:radius</span><span class="o">].</span><span class="n">present?</span>
</span><span class='line'>      <span class="n">search</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">search</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">without</span><span class="p">(</span><span class="ss">:id</span><span class="p">,</span> <span class="n">current_user</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'>        <span class="n">without</span><span class="p">(</span><span class="ss">:dislikes</span><span class="p">,</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">]</span><span class="p">)</span> <span class="k">if</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">].</span><span class="n">present?</span>
</span><span class='line'>        <span class="n">fulltext</span> <span class="n">params</span><span class="o">[</span><span class="ss">:search</span><span class="o">]</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">current_user</span><span class="o">.</span><span class="n">has_location?</span>
</span><span class='line'>          <span class="n">with</span><span class="p">(</span><span class="ss">:location</span><span class="p">)</span><span class="o">.</span><span class="n">in_radius</span><span class="p">(</span><span class="n">current_user</span><span class="o">.</span><span class="n">lat</span><span class="p">,</span> <span class="n">current_user</span><span class="o">.</span><span class="n">lon</span><span class="p">,</span> <span class="n">params</span><span class="o">[</span><span class="ss">:radius</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="vi">@people</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">results</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="vi">@people</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="vi">@new_person</span> <span class="o">=</span> <span class="no">Person</span><span class="o">.</span><span class="n">new</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>On line <code>6</code> we&rsquo;re filtering out people with <code>:id</code> equal to current user&rsquo;s id.
On line <code>7</code> we&rsquo;re filtering out people who dislike stuff I&rsquo;m searching for.</p>

<p>What does <code>Person.search</code> return? It&rsquo;s a special Sunspot object that has a <code>results</code>
method. So to grab actual active record items, we use <code>@people = search.results</code> code.</p>

<p>Finally we have all pieces of the puzzle. If we run the app now we should be able to save
current user&rsquo;s profile and then go search for other people.</p>

<p>In this article I&rsquo;ve barely scratched the surface of the Solr &amp; Sunspot capabilities. You should definitely look for more in the documentation if you want to create a full-featured
application.</p>

<h3>But why should I use fulltext search if I can do everything in SQL?</h3>

<p>You&rsquo;re right, except you can&rsquo;t.
Full text search is a huge topic with a huge set of capabilities.
It can do synonym search, wildcard search, stemming
and a <a href="https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters">lot, lot more</a>.</p>

<p>Solr can be as intelligent as to perform word decomposition during a search, operate on
word parts and generally behave as a human (almost).</p>

<p>Full-text search is faster too. How much faster? This is a tricky question, because it all
depends on the indexed data, but one can safely assume it can be at least several times
faster than equivalent SQL searching. For complex searches Solr can be orders of magnitude
faster than SQL.</p>

<h3>How is new data indexed?</h3>

<p>Sunspot handles it for you. It registers a set of hooks that trigger the automatic indexing
of updated and new records. If you look into rails log, you&rsquo;ll see something like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>SOLR Request (455.4ms)  [ path=update parameters={} ]
</span><span class='line'>   (1.1ms)  COMMIT
</span><span class='line'>Redirected to http://localhost:3000/people
</span><span class='line'>  SOLR Request (60.9ms)  [ path=update parameters={} ]</span></code></pre></td></tr></table></div></figure>


<h3>How do I test it?</h3>

<p>You should generally avoid touching Solr in unit tests. Either design your tests to avoid
talking to Solr in unit tests, or just stub Solr to return pre-canned results.</p>

<p>As for integration tests, indexing data before running them worked best for me.
I first prepare some test data, then I reindex it with:
<code>rake sunspot:reindex</code>
and then run the integration tests.</p>

<p>If you find the topic of testing interesting, drop me a line, I&rsquo;ll cover it in the next article.</p>

<h3>Code</h3>

<p><a href="https://github.com/Valve/neibo">https://github.com/Valve/neibo</a></p>

<p>Well, I hope the explanation wasn&rsquo;t too packed, share your ideas in the comments :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Constant resolution in Ruby]]></title>
    <link href="http://valve.github.io/blog/2013/10/26/constant-resolution-in-ruby/"/>
    <updated>2013-10-26T11:47:00+04:00</updated>
    <id>http://valve.github.io/blog/2013/10/26/constant-resolution-in-ruby</id>
    <content type="html"><![CDATA[<p>Ruby constant resolution has always been somewhat confusing to me.
In this article I&rsquo;m going to demistify it for myself and hopefully help other readers.</p>

<!--more-->


<p></p>

<h2>What is a constant?</h2>

<p>Ruby constant is anything that starts with a capital.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">PI</span> <span class="o">=</span> <span class="mi">3</span><span class="o">.</span><span class="mi">1415</span>
</span><span class='line'>
</span><span class='line'><span class="no">MINUTES_IN_ONE_HOUR</span> <span class="o">=</span> <span class="mi">60</span>
</span><span class='line'>
</span><span class='line'><span class="no">LOOK_MA</span> <span class="o">=</span> <span class="s2">&quot;I&#39;m a constant!&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">A</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">Person</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">Screen::Widget::Button</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yes, regular <code>ALL_CAPITAL</code> are constants, module and class names are constants too.</p>

<h2>How Ruby searches constants.</h2>

<p>When Ruby tries to resolve a constant, it starts looking in current lexical scope by searching the current module or class. If it can&rsquo;t find it there, it searches the enclosing scope and so on.</p>

<p>It&rsquo;s easy to see the lexical scopes search chain with <a href="http://ruby-doc.org/core-2.0.0/Module.html#method-c-nesting">Module::nesting</a> method:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">A</span>
</span><span class='line'>  <span class="no">A_CONSTANT</span> <span class="o">=</span> <span class="s1">&#39;I am defined in module A&#39;</span>
</span><span class='line'>  <span class="k">module</span> <span class="nn">B</span>
</span><span class='line'>    <span class="k">module</span> <span class="nn">C</span>
</span><span class='line'>      <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">inspect_nesting</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">puts</span> <span class="no">Module</span><span class="o">.</span><span class="n">nesting</span><span class="o">.</span><span class="n">inspect</span>
</span><span class='line'>        <span class="nb">puts</span> <span class="no">A_CONSTANT</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 class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="ss">A</span><span class="p">:</span><span class="ss">:B</span><span class="o">::</span><span class="n">C</span><span class="o">.</span><span class="n">inspect_nesting</span>
</span><span class='line'><span class="c1"># =&gt; [A::B::C, A::B, A]</span>
</span><span class='line'><span class="c1"># =&gt; I am defined in module A</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>Module::nesting</code> returns an array of searcheable lexical scopes, starting from current.
In above case the search for <code>A_CONSTANT</code> starts from module C, then goes to enclosing scope &ndash; module B, and then to module A where it finally finds it.</p>

<h2>Nesting modules using alternative syntax</h2>

<p>You&rsquo;ve probably seen the alternative way of defining the enclosing modules:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Screen</span>
</span><span class='line'>  <span class="no">DEFAULT_RESOLUTION</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1024</span><span class="p">,</span> <span class="mi">768</span><span class="o">]</span>
</span><span class='line'>  <span class="k">module</span> <span class="nn">Widgets</span>
</span><span class='line'>    <span class="k">module</span> <span class="nn">MacOS</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Alternative syntax</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">Screen::Widgets::MacOS::Button</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">inspect_nesting</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="no">Module</span><span class="o">.</span><span class="n">nesting</span><span class="o">.</span><span class="n">inspect</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="no">DEFAULT_RESOLUTION</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="ss">Screen</span><span class="p">:</span><span class="ss">:Widgets</span><span class="o">::</span><span class="ss">MacOS</span><span class="p">:</span><span class="ss">:Button</span><span class="o">.</span><span class="n">inspect_nesting</span>
</span><span class='line'><span class="c1"># =&gt; [Screen::Widgets::MacOS::Button]</span>
</span><span class='line'><span class="ss">NameError</span><span class="p">:</span> <span class="n">uninitialized</span> <span class="n">constant</span> <span class="ss">Screen</span><span class="p">:</span><span class="ss">:Widgets</span><span class="o">::</span><span class="ss">MacOS</span><span class="p">:</span><span class="ss">:Button</span><span class="o">::</span><span class="no">DEFAULT_RESOLUTION</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">26</span><span class="ss">:in</span> <span class="sb">`inspect_nesting&#39;</span>
</span><span class='line'><span class="sb">  from (irb):29</span>
</span></code></pre></td></tr></table></div></figure>


<p>See the difference?  Constant resolution only uses the innermost module for searching, ignoring the enclosing scopes. By defining the modules with this shorter syntax you lose the ability to search for constants in enclosing scopes.</p>

<h2>Inheritance</h2>

<p>Enclosing scopes is the first place where Ruby searches the constants. Second place is the inheritance hierarchy. Consider this code:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<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="k">class</span> <span class="nc">Person</span>
</span><span class='line'>  <span class="no">DRIVING_LICENSE_AGE</span> <span class="o">=</span> <span class="mi">18</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">BusDriver</span> <span class="o">&lt;</span> <span class="no">Person</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">can_drive_from</span>
</span><span class='line'>    <span class="no">DRIVING_LICENSE_AGE</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">bus_driver</span> <span class="o">=</span> <span class="no">BusDriver</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">bus_driver</span><span class="o">.</span><span class="n">can_drive_from</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># =&gt; 18</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Mixins</h3>

<p>Ruby can mixin modules into classes as an alternative to inheritance. When a class mixes in a module, this module inserts itself between the class being mixed in and the parent class in the inheritance hierarchy. The simple way to see this is using <a href="http://ruby-doc.org/core-2.0.0/Module.html#method-i-ancestors">ancestors</a> method.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Insurable</span>
</span><span class='line'>  <span class="no">LIFE_INSURANCE_AMOUNT</span> <span class="o">=</span> <span class="mi">150_000</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">Person</span>
</span><span class='line'>  <span class="no">DRIVING_LICENSE_AGE</span> <span class="o">=</span> <span class="mi">18</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">BusDriver</span> <span class="o">&lt;</span> <span class="no">Person</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Insurable</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">can_drive_from</span>
</span><span class='line'>    <span class="s2">&quot;Can drive from </span><span class="si">#{</span><span class="no">DRIVING_LICENSE_AGE</span><span class="si">}</span><span class="s2">, with life insurance of $</span><span class="si">#{</span><span class="no">LIFE_INSURANCE_AMOUNT</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="no">BusDriver</span><span class="o">.</span><span class="n">ancestors</span><span class="o">.</span><span class="n">inspect</span>
</span><span class='line'><span class="nb">puts</span> <span class="no">BusDriver</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">can_drive_from</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># =&gt; [BusDriver, Insurable, Person, Object, Kernel, BasicObject]</span>
</span><span class='line'><span class="c1"># =&gt; Can drive from 18, with life insurance of $150000</span>
</span></code></pre></td></tr></table></div></figure>


<p>What&rsquo;s going on here? We&rsquo;ve defined a base class <code>Person</code>, a child class <code>BusDriver</code> that inherits from <code>Person</code>. We also defined a <code>Insurable</code> module which we mixed into our <code>BusDriver</code> class. When we call the <code>ancestors</code> class method, we see the <code>BusDriver</code> class first, then <code>Insurable</code> module which was wedged between <code>BusDriver</code> and <code>Person</code>. Then goes the <code>Person</code> class, then, obviously, <code>Object</code>. This is all nice and clear.</p>

<p>But why do we see <code>Kernel</code> between <code>Object</code> and <code>BasicObject</code>? This is because <code>Kernel</code> is a module that is mixed into <code>Object</code> thus inserting itself into the inheritance hierarchy. This <code>ancestors</code> array is how the name resolution works throughout the inheritance chain.</p>

<h2>Full search path</h2>

<p>Now that you&rsquo;ve seen the inheritance part of the name search, you can see the full picture:</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"># searching from left to right</span>
</span><span class='line'><span class="n">full_path</span> <span class="o">=</span> <span class="o">[</span><span class="no">Module</span><span class="o">.</span><span class="n">nesting</span> <span class="o">+</span> <span class="no">Module</span><span class="o">.</span><span class="n">ancestors</span><span class="o">].</span><span class="n">uniq</span>
</span></code></pre></td></tr></table></div></figure>


<h2>const_missing method</h2>

<p>When Ruby has finished searching the constants up the nesting and ancestors chain and didn&rsquo;t find it, it gives the calling code the last chance by calling the <a href="http://ruby-doc.org/core-2.0.0/Module.html#method-i-const_missing">const_missing</a> method.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Person</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">const_missing</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Oh me oh my, can&#39;t find the constant: </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="ss">Person</span><span class="p">:</span><span class="ss">:LOL</span>
</span><span class='line'><span class="c1"># =&gt; Oh me oh my, can&#39;t find the constant: LOL</span>
</span></code></pre></td></tr></table></div></figure>


<h3>NameError</h3>

<p>This error is called when Ruby can&rsquo;t find the constant and there is no <code>const_missing</code> method defined.</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='ruby'><span class='line'><span class="ss">Object</span><span class="p">:</span><span class="ss">:BLASTER</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># =&gt; NameError: uninitialized constant BLASTER</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">8</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Word about autoloading</h2>

<p>Let&rsquo;s say you&rsquo;d like to be flexible about your constants and load them automatically, following some naming convention?  Turns out, there is a way, it&rsquo;s called autoloading.</p>

<p>If we were to implememt autoloading from scratch, it would be something 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>
<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="nc">Object</span><span class="o">.</span><span class="nf">const_missing</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>  <span class="vi">@looked_for</span> <span class="o">||=</span> <span class="p">{}</span>
</span><span class='line'>  <span class="n">str_name</span> <span class="o">=</span> <span class="nb">name</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'>  <span class="k">raise</span> <span class="s2">&quot;Class not found: </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="vi">@looked_for</span><span class="o">[</span><span class="n">str_name</span><span class="o">]</span>
</span><span class='line'>  <span class="vi">@looked_for</span><span class="o">[</span><span class="n">str_name</span><span class="o">]</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>  <span class="n">file</span> <span class="o">=</span> <span class="n">str_name</span><span class="o">.</span><span class="n">downcase</span>
</span><span class='line'>  <span class="nb">require</span> <span class="n">file</span>
</span><span class='line'>  <span class="n">klass</span> <span class="o">=</span> <span class="nb">const_get</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">klass</span> <span class="k">if</span> <span class="n">klass</span>
</span><span class='line'>  <span class="k">raise</span> <span class="s2">&quot;Class not found: </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Turns out, we don&rsquo;t have to, because autoloading is built into Ruby. We have <a href="http://ruby-doc.org/core-2.0.0/Kernel.html#method-i-autoload">Kernel#autoload</a>, <a href="http://ruby-doc.org/core-2.0.0/Module.html#method-i-autoload">Module#autoload</a> and more sophisticated <a href="http://api.rubyonrails.org/classes/ActiveSupport/Autoload.html">ActiveSupport::Autoload</a>. I&rsquo;m not going to cover these topics here but will try to do it in a future post.</p>

<h2>Ambiguity</h2>

<p>Here comes the tricky part: what if you have multiple constants with the same name?
Consider this example:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Insurable</span>
</span><span class='line'>  <span class="no">LIFE_INSURANCE_AMOUNT</span> <span class="o">=</span> <span class="mi">150_000</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">Person</span>
</span><span class='line'>  <span class="no">LIFE_INSURANCE_AMOUNT</span> <span class="o">=</span> <span class="mi">50_000</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">Pilot</span> <span class="o">&lt;</span> <span class="no">Person</span>
</span><span class='line'>  <span class="no">INSURANCE_AMOUNT</span> <span class="o">=</span> <span class="mi">300_000</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Insurable</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="ss">Pilot</span><span class="p">:</span><span class="ss">:INSURANCE_AMOUNT</span>
</span><span class='line'><span class="nb">puts</span> <span class="ss">Pilot</span><span class="p">:</span><span class="ss">:LIFE_INSURANCE_AMOUNT</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># =&gt; 300_000</span>
</span><span class='line'><span class="c1"># =&gt; 150_000</span>
</span></code></pre></td></tr></table></div></figure>


<p>Results might seem strange at first, but please remember the full search path:</p>

<figure class='code'><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="no">Module</span><span class="o">.</span><span class="n">nesting</span> <span class="o">+</span> <span class="no">Module</span><span class="o">.</span><span class="n">ancestors</span><span class="o">].</span><span class="n">uniq</span>
</span></code></pre></td></tr></table></div></figure>


<p>First comes the lexical scope searching and only after the inheritance chain, where mixins are inserted between
child and parent classes. Also, when Ruby finds a constant with a given name, it stops looking further.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[jQuery inputmask plugin + AngularJS]]></title>
    <link href="http://valve.github.io/blog/2013/08/01/jquery-inputmask-plugin-plus-angularjs/"/>
    <updated>2013-08-01T13:09:00+04:00</updated>
    <id>http://valve.github.io/blog/2013/08/01/jquery-inputmask-plugin-plus-angularjs</id>
    <content type="html"><![CDATA[<p>The plugin I was going to use was <a href="https://github.com/RobinHerbots/jquery.inputmask">jquery inputmask</a> by Robin Herbots.</p>

<p>I was working on a small <a href="http://mobeedeals.ru">angularjs application</a> and needed a text input masking to force users to enter their telephone numbers in a certain format. &ldquo;So, what&rsquo;s the problem?&rdquo; &ndash; I thought.</p>

<!--more-->


<p>I added the neccessary code:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;form</span> <span class="na">ng-submit=</span><span class="s">&quot;saveApplication()&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;application.phone&quot;</span> <span class="na">id=</span><span class="s">&quot;phone&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  ...
</span><span class='line'><span class="nt">&lt;/form&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// ....</span>
</span><span class='line'><span class="c1">// phone mask for Russia </span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#phone&#39;</span><span class="p">).</span><span class="nx">inputmask</span><span class="p">(</span><span class="s1">&#39;+7(999)999-99-99&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// My controller</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="nx">$scope</span><span class="p">.</span><span class="nx">saveApplication</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">phone</span> <span class="o">=</span> <span class="nx">application</span><span class="p">.</span><span class="nx">phone</span><span class="p">;</span>
</span><span class='line'>  <span class="p">...</span> <span class="nx">saving</span> <span class="nx">phone</span> <span class="nx">here</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>&hellip; only to find out that <code>$scope.application</code> was <code>undefined</code> and no phone value never made it to controller.</p>

<p>I decided to use any angular-specific masking library and <a href="https://github.com/angular-ui/ui-utils#mask">found one</a>, but it was still buggy and couldn&rsquo;t handle my simple <code>+7(999)999-99-99</code> mask.</p>

<p>Exasperated, I tried several input masking plugins for jQuery, but none of them worked with angular.</p>

<p>Then I stumbled upon <a href="http://stackoverflow.com/questions/14994391">this</a> and <a href="http://stackoverflow.com/questions/16935095">this</a> and understood:</p>

<h4>One must wrap a jQuery plugin into a directive in order for the plugin to work.</h4>

<p>Easy-peasy, let&rsquo;s do it.</p>

<p>Having prepared myself with <a href="http://docs.angularjs.org/guide/directive">the documentation on the subject</a>, I wrote version #1:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span> <span class="nx">assuming</span> <span class="nx">I</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">module</span> <span class="nx">ngApp</span>
</span><span class='line'>
</span><span class='line'><span class="nx">ngApp</span><span class="p">.</span><span class="nx">directive</span><span class="p">(</span><span class="s1">&#39;inputMask&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">restrict</span><span class="o">:</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">link</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">el</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">){</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">inputmask</span><span class="p">(</span><span class="nx">scope</span><span class="p">.</span><span class="nx">$eval</span><span class="p">(</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">inputMask</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>And the html:</p>

<figure class='code'><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='html'><span class='line'><span class="nt">&lt;input</span> <span class="na">input-mask=</span><span class="s">&quot;{mask: &#39;+7(999)999-99-99&#39;}&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;application.phone&quot;</span><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Refreshing the browser, I saw the working mask, but the <code>$scope.application</code> was still <code>undefined</code> after filling in the phone, i.e mask was correctly initialized but the value never propagated to the controller. So I added some jQuery into the directive:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span> <span class="nx">assuming</span> <span class="nx">I</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">module</span> <span class="nx">ngApp</span>
</span><span class='line'>
</span><span class='line'><span class="nx">ngApp</span><span class="p">.</span><span class="nx">directive</span><span class="p">(</span><span class="s1">&#39;inputMask&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">restrict</span><span class="o">:</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">link</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">el</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">){</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">inputmask</span><span class="p">(</span><span class="nx">scope</span><span class="p">.</span><span class="nx">$eval</span><span class="p">(</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">inputMask</span><span class="p">));</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#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">scope</span><span class="p">.</span><span class="nx">application</span> <span class="o">==</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">application</span> <span class="o">||</span> <span class="p">{}</span>
</span><span class='line'>        <span class="nx">scope</span><span class="p">.</span><span class="nx">application</span><span class="p">.</span><span class="nx">phone</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>How do I get rid of hardcoded bindings? We can access the value of <code>ng-model</code> attribute and set
the appropriate scope value:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span> <span class="nx">assuming</span> <span class="nx">I</span> <span class="nx">have</span> <span class="nx">a</span> <span class="nx">module</span> <span class="nx">ngApp</span>
</span><span class='line'>
</span><span class='line'><span class="nx">ngApp</span><span class="p">.</span><span class="nx">directive</span><span class="p">(</span><span class="s1">&#39;inputMask&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">restrict</span><span class="o">:</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">link</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">el</span><span class="p">,</span> <span class="nx">attrs</span><span class="p">){</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">inputmask</span><span class="p">(</span><span class="nx">scope</span><span class="p">.</span><span class="nx">$eval</span><span class="p">(</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">inputMask</span><span class="p">));</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>        <span class="nx">scope</span><span class="p">.</span><span class="nx">$eval</span><span class="p">(</span><span class="nx">attrs</span><span class="p">.</span><span class="nx">ngModel</span> <span class="o">+</span> <span class="s2">&quot;=&#39;&quot;</span> <span class="o">+</span> <span class="nx">el</span><span class="p">.</span><span class="nx">val</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="c1">// or scope[attrs.ngModel] = el.val() if your expression doesn&#39;t contain dot.</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>I achieved what I wanted, but I&rsquo;m still not quite satisfied because of the nudging feeling that this code could still be made more idiomatic and robust.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[anonymous browser fingerprinting]]></title>
    <link href="http://valve.github.io/blog/2013/07/14/anonymous-browser-fingerprinting/"/>
    <updated>2013-07-14T12:29:00+04:00</updated>
    <id>http://valve.github.io/blog/2013/07/14/anonymous-browser-fingerprinting</id>
    <content type="html"><![CDATA[<h2>What is fingerprinting?</h2>

<p>Fingerprinting is a technique, outlined in the <a href="https://panopticlick.eff.org/browser-uniqueness.pdf">research by Electronic Frontier Foundation</a>, of anonymously identifying a web browser with accuracy of up to 94%.</p>

<p>Browser is queried its agent string, screen color depth, language, installed plugins with supported mime types, timezone offset and other capabilities, such as local storage and session storage. Then these values are passed through a hashing function to produce a fingerprint that gives weak guarantees of uniqueness.</p>

<p>No cookies are stored to identify a browser.</p>

<p>It&rsquo;s worth noting that a mobile share of browsers is much more uniform, so fingerprinting should be used only as a supplementary identifying mechanism there.</p>

<p>In this post I&rsquo;m going to explain how it works in detail and give you real-life statistics accumulated over the period of 4 months of production usage.</p>

<!--more-->


<p></p>

<h3>Why</h3>

<p>I was given an experimental task to implement the fingerprinting for both anonymous and logged-in users of one of our web sites. We wanted to see if it was possible at all to rely on identifying someone this way and not leave cookies. The idea was to accumulate the fingerprints and associated preferences and then pre-filter the information on front page based on what&rsquo;s known about a user.</p>

<h3>Implementation</h3>

<p>So I got to work and started making a basic outline in my head. What is that identifies a browser? I gathered it would be:
<em>browser agent, browser language, screen color depth, installed plugins and their mime types, timezone offset, local storage, and session storage.</em></p>

<p>Initially I added the screen resolution as well, but a colleague adviced that one can use multiple monitors with a single laptop, for example connect an external monitor when working in office, so I removed it.</p>

<p>On my laptop browser the values are:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Assuming jQuery in scope</span>
</span><span class='line'>
</span><span class='line'><span class="nx">navigator</span><span class="p">.</span><span class="nx">userAgent</span>
</span><span class='line'><span class="c1">// &quot;Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">navigator</span><span class="p">.</span><span class="nx">language</span>
</span><span class='line'><span class="c1">// &quot;en-US&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">plugins</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">navigator</span><span class="p">.</span><span class="nx">plugins</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">p</span><span class="p">){</span>
</span><span class='line'>   <span class="kd">var</span> <span class="nx">mimeTypes</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">p</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">mimeType</span><span class="p">){</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="nx">mimeType</span><span class="p">.</span><span class="nx">type</span><span class="p">,</span> <span class="nx">mimeType</span><span class="p">.</span><span class="nx">suffixes</span><span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;~&#39;</span><span class="p">);</span>
</span><span class='line'>   <span class="p">}).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">[</span><span class="nx">p</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">p</span><span class="p">.</span><span class="nx">description</span><span class="p">,</span> <span class="nx">mimeTypes</span><span class="p">].</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;::&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">plugins</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="nx">p</span><span class="p">){</span>
</span><span class='line'>  <span class="c1">// truncate only for blog example</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">80</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">p</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">77</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;...&#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="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">p</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">Shockwave Flash:Shockwave Flash 11.7 r700:application/x-shockwave-flash~swf,a... </span>
</span><span class='line'><span class="cm">Chrome Remote Desktop Viewer:This plugin allows you to securely access other ... </span>
</span><span class='line'><span class="cm">Widevine Content Decryption Module:Enables Widevine licenses for playback of ... </span>
</span><span class='line'><span class="cm">Native Client::application/x-nacl~nexe </span>
</span><span class='line'><span class="cm">Chrome PDF Viewer::application/pdf~pdf,application/x-google-chrome-print-prev... </span>
</span><span class='line'><span class="cm">Google Talk Plugin Video Accelerator:Google Talk Plugin Video Accelerator ver... </span>
</span><span class='line'><span class="cm">Google Talk Plugin:Version: 4.0.1.0:application/googletalk~googletalk </span>
</span><span class='line'><span class="cm">Google Talk Plugin Video Renderer:Version: 4.0.1.0:application/o1d~o1d </span>
</span><span class='line'><span class="cm">Shockwave Flash:Shockwave Flash 11.2 r202:application/x-shockwave-flash~swf,a...</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'>
</span><span class='line'><span class="nx">screen</span><span class="p">.</span><span class="nx">colorDepth</span>
</span><span class='line'><span class="c1">// 24</span>
</span><span class='line'>
</span><span class='line'><span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">getTimezoneOffset</span><span class="p">();</span>
</span><span class='line'><span class="c1">// -240</span>
</span><span class='line'>
</span><span class='line'><span class="o">!!</span><span class="nb">window</span><span class="p">.</span><span class="nx">localStorage</span>
</span><span class='line'><span class="c1">// true</span>
</span><span class='line'>
</span><span class='line'><span class="o">!!</span><span class="nb">window</span><span class="p">.</span><span class="nx">sessionStorage</span>
</span><span class='line'><span class="c1">// true</span>
</span></code></pre></td></tr></table></div></figure>


<p>So I now knew all my browser had, and I needed to produce the fingerprint itself.
For that I wanted to use a fast, non-cryptographic hashing function, such as <a href="http://en.wikipedia.org/wiki/MurmurHash">murmur hashing</a>.</p>

<p>Murmur hashing produces 32-bit integer as a result and works really well. <a href="http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed">When compared to other popular hash functions, MurmurHash performed well in a random distribution of regular keys.</a></p>

<p>I picked <a href="http://github.com/garycourt/murmurhash-js">this implementation</a> and added it to the code.</p>

<p>The last step was to combine all browser&rsquo;s capabilities into a long string and pass it through hashing.</p>

<p>The end result on my laptop was: <code>3723825959</code></p>

<p>As a finishing touch, I wanted to get rid of jQuery, so I implemented the <code>each</code> and <code>map</code> methods and got a no-dependencies script.</p>

<h4>How to improve accuracy?</h4>

<p>The above research states that the identification accuracy is surprisingly high. But to improve it even further, Flash or Java integration is required to get a list of installed fonts, thus making each browser even more unique.</p>

<h4>What about hash collisions?</h4>

<p>My tests show that for random strings Murmurh hashing indeed produces collisions, but their number is negligible for my purposes: 5-7 collisions per ~200K of capabilities strings.</p>

<h4>What about mobile browsers?</h4>

<p>It&rsquo;s simple: browser fingerprinting is not good with mobile browsers, unless you want to distinguish Android users from iPhone ones.</p>

<h3>Results</h3>

<p>After having had the fingerprinting on production for 4 months, I have some data to analyze. First of all, let me say that I&rsquo;m not at liberty to tell the exact number of visitors to the web site, but I can say it is several millions a month, so we have some data to play with. All numbers below represent our usage and do not represent what you might have.</p>

<p><strong>89%</strong> of fingerprints are unique</p>

<p><strong>20%</strong> of our users have more than one fingerprint, i.e. several browsers or devices.</p>

<p>Very few users have a staggering amount of fingerprints, for example 20-25. I don&rsquo;t know if they have a lot of devices, use different browsers or something else.</p>

<p>After viewing the results we removed the fingerprinting because of poor identification, especially with mobile devices.
If your traffic mostly comes from desktops and you&rsquo;re OK with 10-12% of false identifications you might want to try it.</p>

<h3>Show me the code</h3>

<h4><a href="https://github.com/Valve/fingerprintjs">code on github</a> &ndash; the version I had in production</h4>

<h4><a href="http://valve.github.io/fingerprintjs/">test your browser</a></h4>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[existential operator in CoffeeScript]]></title>
    <link href="http://valve.github.io/blog/2013/07/13/existential-operator-in-coffeescript/"/>
    <updated>2013-07-13T12:39:00+04:00</updated>
    <id>http://valve.github.io/blog/2013/07/13/existential-operator-in-coffeescript</id>
    <content type="html"><![CDATA[<p>Existential operator <code>?</code> can be used in three useful ways in CoffeeScript.</p>

<!--more-->


<h3>Checking the existence of a variable</h3>

<p>In JavaScript there is no built-in way of checking the existence of a variable.
You can try testing the existence with <code>if(variable){...}</code> but it won&rsquo;t work in these cases:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span><span class="p">(</span><span class="mi">0</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;this will not print&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span><span class="p">(</span><span class="s2">&quot;&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="s1">&#39;this will not print&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span><span class="p">(</span><span class="kc">false</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;this will not print&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// abc was never declared</span>
</span><span class='line'><span class="k">if</span><span class="p">(</span><span class="nx">abc</span><span class="p">){</span>
</span><span class='line'>  <span class="c1">//ReferenceError: abc is not defined</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The correct way to test if variable was both declared and initialized:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">variable</span> <span class="o">!==</span> <span class="s1">&#39;undefined&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">variable</span> <span class="o">!==</span> <span class="kc">null</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;variable was declared and initialized with a value&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You may be tempted to use direct comparison with <code>undefined</code>:</p>

<figure class='code'><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="k">if</span><span class="p">(</span><span class="nx">variable</span> <span class="o">!==</span> <span class="kc">undefined</span> <span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>But this is asking for trouble because in EcmaScript 3 (all older browsers, such as IE 6-8)  <code>undefined</code> can be overwritten:</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='javascript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="kc">undefined</span> <span class="o">=</span> <span class="s1">&#39;pancakes&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span><span class="p">(</span><span class="s1">&#39;pancakes&#39;</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="s1">&#39;This will print, if you are unfortunate enough to use IE 6-8&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><a href="http://kangax.github.io/es5-compat-table/">All ES5 compatible browsers</a> have <code>undefined</code> immutable, i.e. it can&rsquo;t be changed, but it&rsquo;s better to play it safe.</p>

<p>CoffeeScript has a syntactic shortcut for testing existence:</p>

<figure class='code'><figcaption><span>CoffeeScript </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='coffeescript'><span class='line'><span class="k">if</span> <span class="nx">variable</span><span class="o">?</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="s">&#39;variable is both declared and initialized with a non-null value&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code will be transpiled to:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">variable</span> <span class="o">!==</span> <span class="s2">&quot;undefined&quot;</span> <span class="o">&amp;&amp;</span> <span class="nx">variable</span> <span class="o">!==</span> <span class="kc">null</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;If variable was both declared and initialized with a non-null value&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Conditional assignment</h3>

<p>What if you want to initialize a variable only if it has not been already initialized?
In JavaScript you&rsquo;d usually do something like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">getUserLocale</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">locale</span> <span class="o">==</span> <span class="kc">null</span><span class="p">){</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">locale</span> <span class="o">=</span> <span class="nx">DB</span><span class="p">.</span><span class="nx">getLocaleByUser</span><span class="p">(</span><span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">locale</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This technique caches the result of an expensive computation or database query in a variable.
In above example, all subsequent <code>getUserLocale</code> function calls will not query the database.
The important part is comparing with <code>null</code> using <code>==</code>, rather than <code>===</code>, because <code>==</code> will evaluate to <code>true</code> if variable is either <code>undefined</code> or <code>null</code>.</p>

<p>Such <em>cache on first call</em> pattern is widely used in many programming languages, but CoffeeScript has a special syntax for it:</p>

<figure class='code'><figcaption><span>CoffeeScript </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='coffeescript'><span class='line'><span class="nv">getUserLocale = </span><span class="nf">-&gt;</span>
</span><span class='line'>  <span class="nx">@locale</span> <span class="o">?=</span> <span class="nx">DB</span><span class="p">.</span><span class="nx">getLocaleByUser</span><span class="p">(</span><span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>?=</code> is the operator that performs conditional assignment.</p>

<p>This will be transpiled to roughly the same JS as above, using ternary operator:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">getUserLocale</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">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">locale</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">locale</span> <span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">locale</span> <span class="o">=</span> <span class="nx">DB</span><span class="p">.</span><span class="nx">getLocaleByUser</span><span class="p">(</span><span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>What if you try to conditionally assign an undeclared variable? If you try this:</p>

<figure class='code'><figcaption><span>CoffeeScript </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='coffeescript'><span class='line'><span class="c1"># abc is not declared </span>
</span><span class='line'><span class="nx">abc</span> <span class="o">?=</span> <span class="mi">99</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will result in a compile-time error:
<code>the variable "abc" can't be assigned with ?= because it has not been declared before</code>.
This compile-time checking is very helpful, because it prevents a <code>ReferenceError</code> at run time.</p>

<p>If you know Ruby, <code>||=</code> is the same thing there.</p>

<h3>Safe property / function chaining</h3>

<p>Chaining function calls is a great way to write terse yet fluent code.
A good example is working with jQuery:</p>

<figure class='code'><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="s1">&#39;#header&#39;</span><span class="p">).</span><span class="nx">css</span><span class="p">(</span><span class="s1">&#39;color&#39;</span><span class="p">,</span> <span class="s1">&#39;#fadfad&#39;</span><span class="p">).</span><span class="nx">show</span><span class="p">(</span><span class="s1">&#39;slow&#39;</span><span class="p">).</span><span class="nx">off</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is made possible because these jQuery functions return a reference to <code>this</code>.
But what if one of the function returns <code>null</code> or <code>undefined</code>?</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">zip</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">.</span><span class="nx">address</span><span class="p">.</span><span class="nx">zip</span>
</span></code></pre></td></tr></table></div></figure>


<p>If current user&rsquo;s address is <code>null</code> or <code>undefined</code>, the <code>.zip</code> property call will result in <code>TypeError</code>.</p>

<p>A simple but ugly solution would be to use a lot of <code>if</code> checks:</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='javascript'><span class='line'><span class="kd">var</span> <span class="nx">zip</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="k">if</span><span class="p">(</span><span class="nx">User</span><span class="p">.</span><span class="nx">current</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">.</span><span class="nx">address</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">){</span>
</span><span class='line'>  <span class="c1">// only now this is safe</span>
</span><span class='line'>  <span class="nx">zip</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">.</span><span class="nx">address</span><span class="p">.</span><span class="nx">zip</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>But this can quickly get out of hand with deep nesting.</p>

<p>CoffeeScript has a safe way of accessing long property chains using <code>?.</code> variant of existential operator:</p>

<figure class='code'><figcaption><span>CoffeeScript </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='coffeescript'><span class='line'><span class="nv">zip = </span><span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="o">?</span><span class="p">.</span><span class="nx">address</span><span class="o">?</span><span class="p">.</span><span class="nx">zip</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will either soak up the <code>null</code> or <code>undefined</code> references and safely return <code>undefined</code> or
return the final property value. In our case the generated code looks like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">zip</span><span class="p">,</span> <span class="nx">_ref</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">zip</span> <span class="o">=</span> <span class="p">(</span><span class="nx">_ref</span> <span class="o">=</span> <span class="nx">User</span><span class="p">.</span><span class="nx">current</span><span class="p">)</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="nx">_ref</span><span class="p">.</span><span class="nx">address</span><span class="p">.</span><span class="nx">zip</span> <span class="o">:</span> <span class="k">void</span> <span class="mi">0</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>What is this weird <code>void 0</code> thing? This is to fight the pre AS5 <code>undefined</code> mutability I referred to earlier.
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void">JavaScript defines void as a unary operator</a> that returns <code>undefined</code> for any argument. In other words, CoffeeScript compiler uses a set of nested ternary operators to safely return either last property value or <code>undefined</code> with <code>void 0</code>.</p>

<p>Calling a function safely works similarly:</p>

<figure class='code'><figcaption><span>CoffeeScript </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='coffeescript'><span class='line'><span class="nx">noSuchFunction</span><span class="o">?</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>This transpiles to:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">noSuchFunction</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">noSuchFunction</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Key thing to take away here is that CoffeeScript first tests that callable function is defined and is a function.
It does this using <code>typeof bla === 'function'</code>. The function is called only if it is defined.</p>

<p>Safe function invocation can be chained as well with other function or property calls:</p>

<figure class='code'><figcaption><span>example from coffeescript.org </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='coffeescript'><span class='line'><span class="nx">lottery</span><span class="p">.</span><span class="nx">drawWinner</span><span class="o">?</span><span class="p">().</span><span class="nx">address</span><span class="o">?</span><span class="p">.</span><span class="nx">zip</span>
</span></code></pre></td></tr></table></div></figure>


<p>This transpiles to:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">zip</span><span class="p">,</span> <span class="nx">_ref</span><span class="p">;</span>
</span><span class='line'><span class="nx">zip</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">lottery</span><span class="p">.</span><span class="nx">drawWinner</span> <span class="o">===</span> <span class="s2">&quot;function&quot;</span>
</span><span class='line'>  <span class="o">?</span>
</span><span class='line'>    <span class="p">(</span><span class="nx">_ref</span> <span class="o">=</span> <span class="nx">lottery</span><span class="p">.</span><span class="nx">drawWinner</span><span class="p">().</span><span class="nx">address</span><span class="p">)</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="nx">_ref</span><span class="p">.</span><span class="nx">zipcode</span> <span class="o">:</span> <span class="k">void</span> <span class="mi">0</span>
</span><span class='line'>  <span class="o">:</span>
</span><span class='line'>    <span class="k">void</span> <span class="mi">0</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Drawing analogy with Ruby-on-Rails ActiveSupport, the safe chaining can be seen as <a href="http://api.rubyonrails.org/classes/NilClass.html#function-i-try">try</a> method.</p>

<h4>Conclusion:</h4>

<p>CoffeeScript existential operator is a useful tool to cut down the verbosity of JavaScript when dealing with existence and null checks.
It also can be used to shield inexperienced JavaScript developers from JavaScript bad parts.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[different SMTP settings for ActionMailer action]]></title>
    <link href="http://valve.github.io/blog/2013/07/03/different-smtp-settings-for-actionmailer-action/"/>
    <updated>2013-07-03T16:48:00+04:00</updated>
    <id>http://valve.github.io/blog/2013/07/03/different-smtp-settings-for-actionmailer-action</id>
    <content type="html"><![CDATA[<p>Sometimes you may want to set per-action SMTP settings that are different from site-wide settings.
You might try to set them in mailer:</p>

<!--more-->




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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="k">class</span> <span class="nc">UserMailer</span> <span class="o">&lt;</span> <span class="ss">ActionMailer</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'>  <span class="ss">ActionMailer</span><span class="p">:</span><span class="ss">:Base</span><span class="o">.</span><span class="n">smtp_settings</span> <span class="o">=</span> <span class="p">{</span><span class="ss">address</span><span class="p">:</span> <span class="s1">&#39;some.domain&#39;</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">user_registered</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span><span class='line'>    <span class="n">mail</span><span class="p">(</span><span class="ss">to</span><span class="p">:</span> <span class="n">user</span><span class="o">.</span><span class="n">email</span><span class="p">,</span> <span class="ss">subject</span><span class="p">:</span> <span class="s1">&#39;You registered here!&#39;</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>But this will override the smtp settings for the rest of mailers.</p>

<p>Instead, set them for the email instance:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># assuming in controller action</span>
</span><span class='line'><span class="n">mail</span> <span class="o">=</span> <span class="no">UserMailer</span><span class="o">.</span><span class="n">user_registered</span><span class="p">(</span><span class="n">current_user</span><span class="p">)</span>
</span><span class='line'><span class="n">custom_smtp_settings</span> <span class="o">=</span> <span class="p">{</span><span class="ss">address</span><span class="p">:</span> <span class="s1">&#39;some.domain&#39;</span><span class="p">,</span> <span class="ss">port</span><span class="p">:</span> <span class="mi">25</span><span class="p">}</span>
</span><span class='line'><span class="n">mail</span><span class="o">.</span><span class="n">delivery_method</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">merge!</span> <span class="n">custom_smtp_settings</span>
</span><span class='line'><span class="c1"># now this will send using custom SMTP settings</span>
</span><span class='line'><span class="n">mail</span><span class="o">.</span><span class="n">deliver</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>rails-3.1</code></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[reading command line arguments in rust]]></title>
    <link href="http://valve.github.io/blog/2013/07/03/reading-command-line-arguments-in-rust/"/>
    <updated>2013-07-03T13:31:00+04:00</updated>
    <id>http://valve.github.io/blog/2013/07/03/reading-command-line-arguments-in-rust</id>
    <content type="html"><![CDATA[<p>Since all rust hello world tutorials usually start like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="n">println</span><span class="p">(</span><span class="s">&quot;Hello, world&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&rsquo;s unclear where to take command line arguments.</p>

<!--more-->


<p>The solution:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='rust'><span class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">os</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">fn</span> <span class="n">main</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">args</span><span class="o">:</span> <span class="o">~</span><span class="p">[</span><span class="o">~</span><span class="n">str</span><span class="p">]</span> <span class="o">=</span> <span class="n">os</span><span class="o">::</span><span class="n">args</span><span class="p">();</span>
</span><span class='line'>  <span class="n">println</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">to_str</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will give you a vector with strings where first string will be the app being run and the rest is the
arguments provided.</p>

<p><code>rust-0.7</code></p>
]]></content>
  </entry>
  
</feed>
