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

  <title><![CDATA[benfalk.com]]></title>
  <link href="http://benfalk.com/atom.xml" rel="self"/>
  <link href="http://benfalk.com/"/>
  <updated>2022-04-01T17:34:18+00:00</updated>
  <id>http://benfalk.com/</id>
  <author>
    <name><![CDATA[Benjamin Falk]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Got a New PC]]></title>
    <link href="http://benfalk.com/blog/2022/04/01/got-a-new-pc/"/>
    <updated>2022-04-01T17:22:49+00:00</updated>
    <id>http://benfalk.com/blog/2022/04/01/got-a-new-pc</id>
    <content type="html"><![CDATA[<p>A couple weeks back I lost my personal PC to a VR project that I&rsquo;ve been wanting
to get setup for awhile now.  Without it I&rsquo;ve been somewhat dead in the water so
I started looking for a PC replacement.  With my upcoming goals to get more into
game development there was a desire to get a beefier workstation.</p>

<p>After a fair chunk of research I&rsquo;ve landed on getting a
<a href="https://system76.com/desktops/thelio-mira">Thelio Mira from System76</a>.  It
ships with a flavor of Ubuntu called &ldquo;PopOS!&rdquo; and it seems to be pretty darn
good.  This blog-post is the first thing I&rsquo;ve done with the new machine but it
won&rsquo;t be the last :D.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Solving Wordle With Rust]]></title>
    <link href="http://benfalk.com/blog/2022/03/15/solving-wordle-with-rust/"/>
    <updated>2022-03-15T00:30:16+00:00</updated>
    <id>http://benfalk.com/blog/2022/03/15/solving-wordle-with-rust</id>
    <content type="html"><![CDATA[<p>Last weekend my brother introduced me to a fun little puzzle game called
<code>Wordle</code>.  With it you guess a word and it highlights which letters are
in the word <strong>and</strong> in the correct location or it will signal if the letter is
correct but isn&rsquo;t in the proper location.  After watching a few game rounds I
decided to write something to solve it.</p>

<p><img src="http://benfalk.com/images/worded-example.png" title="&#34;Worded in Action&#34;" alt="&#34;Worded in Action&#34;"></p>

<p>The <a href="https://github.com/benfalk/worded">code is on github</a>.</p>

<p>The <a href="http://benfalk.com/wordle-solver/">demo is self hosted</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rust HashMap to Store Anything]]></title>
    <link href="http://benfalk.com/blog/2022/02/27/rust-hashmap-to-store-anything/"/>
    <updated>2022-02-27T15:31:11+00:00</updated>
    <id>http://benfalk.com/blog/2022/02/27/rust-hashmap-to-store-anything</id>
    <content type="html"><![CDATA[<p>I came across the <code>Any</code> trait this week and it got me to thinking on how it
could be used to stored different kinds of data at runtime.  In this post
we&rsquo;ll look at this magical trait and get a better understanding of whats
possible.</p>

<!-- more -->


<h2>What is the Any Trait</h2>

<blockquote><p><code>Any</code> itself can be used to get a <code>TypeId</code>, and has more features when used as
a trait object. As <code>&amp;dyn Any</code> (a borrowed trait object), it has the <code>is</code> and
<code>downcast_ref</code> methods, to test if the contained value is of a given type,
and to get a reference to the inner value as a type. As <code>&amp;mut dyn Any</code>,
there is also the <code>downcast_mut</code> method, for getting a mutable reference to
the inner value. <code>Box&lt;dyn Any&gt;</code> adds the downcast method, which attempts to
convert to a <code>Box&lt;T&gt;</code>. See the Box documentation for the full details.</p></blockquote>

<p>So what does that mean?  Essentially code such as the following is possible:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">any</span><span class="o">::</span><span class="n">Any</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="n">pub</span> <span class="n">struct</span> <span class="n">Foo</span><span class="p">{}</span>
</div><div class='line'> </div><div class='line'><span class="n">pub</span> <span class="k">fn</span> <span class="n">is_a_foo</span><span class="p">(</span><span class="n">maybe_foo</span><span class="o">:</span> <span class="o">&amp;</span><span class="n">dyn</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">bool</span> <span class="p">{</span>
</div><div class='line'>  <span class="n">maybe_foo</span><span class="p">.</span><span class="n">is</span><span class="o">::&lt;</span><span class="n">Foo</span><span class="o">&gt;</span><span class="p">()</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="cp">#[cfg(test)]</span>
</div><div class='line'><span class="k">mod</span> <span class="n">test</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">use</span> <span class="n">super</span><span class="o">::*</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="cp">#[test]</span>
</div><div class='line'>    <span class="k">fn</span> <span class="n">is_a_foo_works</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">let</span> <span class="n">foo</span> <span class="o">=</span> <span class="n">Foo</span><span class="p">{};</span>
</div><div class='line'> </div><div class='line'>        <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">is_a_foo</span><span class="p">(</span><span class="o">&amp;</span><span class="n">foo</span><span class="p">));</span>
</div><div class='line'>        <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="o">!</span><span class="n">is_a_foo</span><span class="p">(</span><span class="o">&amp;</span><span class="m">42</span><span class="p">));</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>If you check out the <code>is</code> function under the hood what it&rsquo;s really doing is the
following:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="n">pub</span> <span class="k">fn</span> <span class="n">is</span><span class="o">&lt;</span><span class="n">T</span><span class="o">:</span> <span class="n">Any</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">bool</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// Get `TypeId` of the type this function is instantiated with.</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">t</span> <span class="o">=</span> <span class="n">TypeId</span><span class="o">::</span><span class="n">of</span><span class="o">::&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">();</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// Get `TypeId` of the type in the trait object (`self`).</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">concrete</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">type_id</span><span class="p">();</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// Compare both `TypeId`s on equality.</span>
</div><div class='line'>    <span class="n">t</span> <span class="o">==</span> <span class="n">concrete</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>The <code>TypeId</code> appears to be the real star of the show, and if you look into it a
bit more you&rsquo;ll find that not only can it be compared for equality; it can also
be hashed!</p>

<h2>The HashMap to Store Any Data</h2>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div><div data-line='77' class='line-number'></div><div data-line='78' class='line-number'></div><div data-line='79' class='line-number'></div><div data-line='80' class='line-number'></div><div data-line='81' class='line-number'></div><div data-line='82' class='line-number'></div><div data-line='83' class='line-number'></div><div data-line='84' class='line-number'></div><div data-line='85' class='line-number'></div><div data-line='86' class='line-number'></div><div data-line='87' class='line-number'></div><div data-line='88' class='line-number'></div><div data-line='89' class='line-number'></div><div data-line='90' class='line-number'></div><div data-line='91' class='line-number'></div><div data-line='92' class='line-number'></div><div data-line='93' class='line-number'></div><div data-line='94' class='line-number'></div><div data-line='95' class='line-number'></div><div data-line='96' class='line-number'></div><div data-line='97' class='line-number'></div><div data-line='98' class='line-number'></div><div data-line='99' class='line-number'></div><div data-line='100' class='line-number'></div><div data-line='101' class='line-number'></div><div data-line='102' class='line-number'></div><div data-line='103' class='line-number'></div><div data-line='104' class='line-number'></div><div data-line='105' class='line-number'></div><div data-line='106' class='line-number'></div><div data-line='107' class='line-number'></div><div data-line='108' class='line-number'></div><div data-line='109' class='line-number'></div><div data-line='110' class='line-number'></div><div data-line='111' class='line-number'></div><div data-line='112' class='line-number'></div><div data-line='113' class='line-number'></div><div data-line='114' class='line-number'></div><div data-line='115' class='line-number'></div><div data-line='116' class='line-number'></div><div data-line='117' class='line-number'></div><div data-line='118' class='line-number'></div><div data-line='119' class='line-number'></div><div data-line='120' class='line-number'></div><div data-line='121' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="c1">//</span>
</div><div class='line'><span class="c1">// rustc 1.60.0-nightly (b17226fcc 2022-02-18)</span>
</div><div class='line'><span class="c1">//</span>
</div><div 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">box_into_inner</span><span class="p">)]</span>
</div><div class='line'> </div><div class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">any</span><span class="o">::</span><span class="p">{</span><span class="n">Any</span><span class="p">,</span> <span class="n">TypeId</span><span class="p">};</span>
</div><div class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">cmp</span><span class="o">::</span><span class="n">Eq</span><span class="p">;</span>
</div><div 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>
</div><div class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">hash</span><span class="o">::</span><span class="n">Hash</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="k">type</span> <span class="n">HashKey</span><span class="o">&lt;</span><span class="n">K</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">(</span><span class="n">K</span><span class="p">,</span> <span class="n">TypeId</span><span class="p">);</span>
</div><div class='line'><span class="k">type</span> <span class="n">Anything</span> <span class="o">=</span> <span class="n">Box</span><span class="o">&lt;</span><span class="n">dyn</span> <span class="n">Any</span><span class="o">&gt;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="n">pub</span> <span class="n">struct</span> <span class="n">AnyMap</span><span class="o">&lt;</span><span class="n">K</span><span class="o">:</span> <span class="n">Eq</span> <span class="o">+</span> <span class="n">Hash</span><span class="o">&gt;</span><span class="p">(</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="n">HashKey</span><span class="o">&lt;</span><span class="n">K</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Anything</span><span class="o">&gt;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'><span class="k">impl</span><span class="o">&lt;</span><span class="n">K</span><span class="o">:</span> <span class="n">Eq</span> <span class="o">+</span> <span class="n">Hash</span><span class="o">&gt;</span> <span class="n">AnyMap</span><span class="o">&lt;</span><span class="n">K</span><span class="o">&gt;</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">/// Creates a new hashmap that can store</span>
</div><div class='line'>    <span class="c1">/// any data which can be tagged with the</span>
</div><div class='line'>    <span class="c1">/// `Any` trait.</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">new</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Self</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">Self</span><span class="p">(</span><span class="n">HashMap</span><span class="o">::</span><span class="n">new</span><span class="p">())</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">/// Creates a new hashmap that can store</span>
</div><div class='line'>    <span class="c1">/// at least the capacity given.</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">new_with_capacity</span><span class="p">(</span><span class="n">capacity</span><span class="o">:</span> <span class="n">usize</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Self</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">Self</span><span class="p">(</span><span class="n">HashMap</span><span class="o">::</span><span class="n">with_capacity</span><span class="p">(</span><span class="n">capacity</span><span class="p">))</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">/// Inserts the provided value under the key.  Keys</span>
</div><div class='line'>    <span class="c1">/// are tracked with their type; meaning you can</span>
</div><div class='line'>    <span class="c1">/// have the same key used multiple times with different</span>
</div><div class='line'>    <span class="c1">/// values.</span>
</div><div class='line'>    <span class="c1">///</span>
</div><div class='line'>    <span class="c1">/// If the storage had a value of the type being stored</span>
</div><div class='line'>    <span class="c1">/// under the same key it is returned.</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">insert</span><span class="o">&lt;</span><span class="n">V</span><span class="o">:</span> <span class="n">Any</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="o">:</span> <span class="n">K</span><span class="p">,</span> <span class="n">val</span><span class="o">:</span> <span class="n">V</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Option</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">let</span> <span class="n">boxed</span> <span class="o">=</span> <span class="n">self</span>
</div><div class='line'>            <span class="p">.</span><span class="m">0</span>
</div><div class='line'>            <span class="p">.</span><span class="n">insert</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">.</span><span class="n">type_id</span><span class="p">()),</span> <span class="n">Box</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="n">val</span><span class="p">))</span><span class="o">?</span>
</div><div class='line'>            <span class="p">.</span><span class="n">downcast</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()</span>
</div><div class='line'>            <span class="p">.</span><span class="n">ok</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>        <span class="n">Some</span><span class="p">(</span><span class="n">Box</span><span class="o">::</span><span class="n">into_inner</span><span class="p">(</span><span class="n">boxed</span><span class="p">))</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">/// Fetch a reference for the type given under a</span>
</div><div class='line'>    <span class="c1">/// given key.  Note that the key needs to be provided</span>
</div><div class='line'>    <span class="c1">/// with ownership.  This may change in the future if</span>
</div><div class='line'>    <span class="c1">/// I can figure out how to only borrow the key for</span>
</div><div class='line'>    <span class="c1">/// comparison.</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">get</span><span class="o">&lt;</span><span class="n">V</span><span class="o">:</span> <span class="n">Any</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="o">:</span> <span class="n">K</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Option</span><span class="o">&lt;&amp;</span><span class="n">V</span><span class="o">&gt;</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">self</span><span class="p">.</span><span class="m">0.</span><span class="n">get</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">TypeId</span><span class="o">::</span><span class="n">of</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()))</span><span class="o">?</span><span class="p">.</span><span class="n">downcast_ref</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">/// A mutable reference for the type given under</span>
</div><div class='line'>    <span class="c1">/// a given key.  Note that the key needs to be provided</span>
</div><div class='line'>    <span class="c1">/// with ownership.</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">get_mut</span><span class="o">&lt;</span><span class="n">V</span><span class="o">:</span> <span class="n">Any</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="o">:</span> <span class="n">K</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Option</span><span class="o">&lt;&amp;</span><span class="k">mut</span> <span class="n">V</span><span class="o">&gt;</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">self</span><span class="p">.</span><span class="m">0</span>
</div><div class='line'>            <span class="p">.</span><span class="n">get_mut</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">TypeId</span><span class="o">::</span><span class="n">of</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()))</span><span class="o">?</span>
</div><div class='line'>            <span class="p">.</span><span class="n">downcast_mut</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">/// Removes the data of the given type under they key</span>
</div><div class='line'>    <span class="c1">/// if it&#39;s found.  The data found is returned in an</span>
</div><div class='line'>    <span class="c1">/// Option after it&#39;s removed.</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">remove</span><span class="o">&lt;</span><span class="n">V</span><span class="o">:</span> <span class="n">Any</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="o">:</span> <span class="n">K</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Option</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">let</span> <span class="n">boxed</span> <span class="o">=</span> <span class="n">self</span>
</div><div class='line'>            <span class="p">.</span><span class="m">0</span>
</div><div class='line'>            <span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">TypeId</span><span class="o">::</span><span class="n">of</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()))</span><span class="o">?</span>
</div><div class='line'>            <span class="p">.</span><span class="n">downcast</span><span class="o">::&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">()</span>
</div><div class='line'>            <span class="p">.</span><span class="n">ok</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>        <span class="n">Some</span><span class="p">(</span><span class="n">Box</span><span class="o">::</span><span class="n">into_inner</span><span class="p">(</span><span class="n">boxed</span><span class="p">))</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="cp">#[cfg(test)]</span>
</div><div class='line'><span class="k">mod</span> <span class="n">test</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">use</span> <span class="n">super</span><span class="o">::*</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="cp">#[test]</span>
</div><div class='line'>    <span class="k">fn</span> <span class="n">you_can_add_different_types_and_work_with_them</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">let</span> <span class="k">mut</span> <span class="n">storage</span> <span class="o">=</span> <span class="n">AnyMap</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>        <span class="n">storage</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">,</span> <span class="m">3.142</span><span class="p">);</span>
</div><div class='line'>        <span class="n">storage</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">,</span> <span class="s">&quot;apple&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span>
</div><div class='line'>            <span class="o">&amp;</span><span class="m">3.142</span><span class="p">,</span>
</div><div class='line'>            <span class="n">storage</span><span class="p">.</span><span class="n">get</span><span class="o">::&lt;</span><span class="k">f64</span><span class="o">&gt;</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">).</span><span class="n">unwrap</span><span class="p">()</span>
</div><div class='line'>        <span class="p">);</span>
</div><div class='line'> </div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span>
</div><div class='line'>            <span class="o">&amp;</span><span class="s">&quot;apple&quot;</span><span class="p">,</span>
</div><div class='line'>            <span class="n">storage</span><span class="p">.</span><span class="n">get</span><span class="o">::&lt;&amp;</span><span class="n">str</span><span class="o">&gt;</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">).</span><span class="n">unwrap</span><span class="p">()</span>
</div><div class='line'>        <span class="p">);</span>
</div><div class='line'> </div><div class='line'>        <span class="o">*</span><span class="n">storage</span><span class="p">.</span><span class="n">get_mut</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">).</span><span class="n">unwrap</span><span class="p">()</span> <span class="o">=</span> <span class="m">3.14159</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span>
</div><div class='line'>            <span class="o">&amp;</span><span class="m">3.14159</span><span class="p">,</span>
</div><div class='line'>            <span class="n">storage</span><span class="p">.</span><span class="n">get</span><span class="o">::&lt;</span><span class="k">f64</span><span class="o">&gt;</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">).</span><span class="n">unwrap</span><span class="p">()</span>
</div><div class='line'>        <span class="p">);</span>
</div><div class='line'> </div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span>
</div><div class='line'>            <span class="n">None</span><span class="p">,</span>
</div><div class='line'>            <span class="n">storage</span><span class="p">.</span><span class="n">get</span><span class="o">::&lt;</span><span class="k">f32</span><span class="o">&gt;</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">)</span>
</div><div class='line'>        <span class="p">);</span>
</div><div class='line'> </div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span>
</div><div class='line'>            <span class="m">3.14159</span><span class="p">,</span>
</div><div class='line'>            <span class="n">storage</span><span class="p">.</span><span class="n">remove</span><span class="o">::&lt;</span><span class="k">f64</span><span class="o">&gt;</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">).</span><span class="n">unwrap</span><span class="p">()</span>
</div><div class='line'>        <span class="p">);</span>
</div><div class='line'> </div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span>
</div><div class='line'>            <span class="n">None</span><span class="p">,</span>
</div><div class='line'>            <span class="n">storage</span><span class="p">.</span><span class="n">get</span><span class="o">::&lt;</span><span class="k">f64</span><span class="o">&gt;</span><span class="p">(</span><span class="s">&quot;pie&quot;</span><span class="p">)</span>
</div><div class='line'>        <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Elasticsearch Document Size Bloat]]></title>
    <link href="http://benfalk.com/blog/2022/02/18/elasticsearch-document-size-bloat/"/>
    <updated>2022-02-18T18:42:57+00:00</updated>
    <id>http://benfalk.com/blog/2022/02/18/elasticsearch-document-size-bloat</id>
    <content type="html"><![CDATA[<p>I&rsquo;ve been working with Elasticsearch off and on in my career and more so on then
off it seems for the last couple years.  It&rsquo;s a great tool to get aggregations
and quick searching on data; however, sometimes you need to be careful or the
size of your documents can get out of hand.</p>

<!-- more -->


<p>To illustrate my point, let&rsquo;s come up with a somewhat believable schema that you
could likely have in your application.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>Author:                Category:
</div><div class='line'>  id                     id
</div><div class='line'>  name                   tag
</div><div class='line'>  country
</div><div class='line'>  language
</div><div class='line'>                       PostCategory:
</div><div class='line'>Post:                    post_id
</div><div class='line'>  id                     category_id
</div><div class='line'>  title
</div><div class='line'>  content</div></pre></td></tr></table></div></figure>


<p>If you wanted posts and related data to be searchable in Elasticsearch your
document structure would likely look like this:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;_id&quot;</span><span class="p">:</span><span class="s2">&quot;the-post-id&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;_source&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;some-title&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;content&quot;</span><span class="p">:</span><span class="s2">&quot;full text content stuff&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;author&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Ben&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;country&quot;</span><span class="p">:</span> <span class="s2">&quot;United States&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;language&quot;</span><span class="p">:</span> <span class="s2">&quot;English&quot;</span>
</div><div class='line'>    <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;categories&quot;</span><span class="p">:</span> <span class="p">[</span>
</div><div class='line'>      <span class="p">{</span>
</div><div class='line'>        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;tag&quot;</span><span class="p">:</span> <span class="s2">&quot;json&quot;</span>
</div><div class='line'>      <span class="p">},</span>
</div><div class='line'>      <span class="p">{</span>
</div><div class='line'>        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;tag&quot;</span><span class="p">:</span> <span class="s2">&quot;programming&quot;</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">]</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>As you can see, this document is essentially a denormalized data structure of
what you can expect to find in the schema.  It comes with the same benefits and
drawbacks when you denormalize data.  It&rsquo;s fast because you don&rsquo;t have to look
at any other data sources; however, the data contains duplications which
increases space. Every <code>Post</code> caries with it an <code>Author</code> and any number of
<code>Category</code> objects.</p>

<p>If you search by <code>author.name</code> there is a good chance you&rsquo;ll have duplicate
authors in each of the posts.  If you fetch N number of documents and all of
them have the same <code>Author</code> you&rsquo;re needlessly deserializing N-1 of them.  In
this example that doesn&rsquo;t seem bad, but suppose it was a more complex model&hellip;
You&rsquo;re just compounding the number of allocations you&rsquo;ll incur and the size of
the total payload just keeps growing.</p>

<p>If you run into these kinds of scenarios they can be mitigated by using the
<code>_source</code> and <code>fields</code> directives in your Elasticsearch queries to pair down
the data you need.  There is a lot of nuance with these and it is highly
recommended that you <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.0/search-fields.html">read the docs</a>
for yourself. Having said that, what follows are a couple examples you may want
to think about in your application.</p>

<h3>Fetch Primary Keys and Build It Yourself</h3>

<p>One strategy may be to fetch only the keys from the document and in a second
parallel manner retrieve the data from cache or the database it came from.</p>

<p><strong>Request:</strong></p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>GET /_search
</div><div class='line'>{
</div><div class='line'>  "query": {
</div><div class='line'>    "match": {
</div><div class='line'>      "author.name": "Ben"
</div><div class='line'>    }
</div><div class='line'>  },
</div><div class='line'>  "fields": [
</div><div class='line'>    "author.id",
</div><div class='line'>    "categories.id"
</div><div class='line'>  ],
</div><div class='line'>  "_source": false
</div><div class='line'>}</div></pre></td></tr></table></div></figure>


<p><strong>Reply:</strong></p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>{
</div><div class='line'>  "hits" : {
</div><div class='line'>    "total" : {
</div><div class='line'>      "value" : 420,
</div><div class='line'>      "relation" : "eq"
</div><div class='line'>    },
</div><div class='line'>    "max_score" : 1.0,
</div><div class='line'>    "hits" : [
</div><div class='line'>      {
</div><div class='line'>        "_index" : "my-index-000001",
</div><div class='line'>        "_id" : "the-post-id",
</div><div class='line'>        "_score" : 1.0,
</div><div class='line'>        "fields" : {
</div><div class='line'>          "author.id" : [42]
</div><div class='line'>          "categories.id" : [13, 42]
</div><div class='line'>        }
</div><div class='line'>      }
</div><div class='line'>      ... 419 more hits ...
</div><div class='line'>    ]
</div><div class='line'>  }
</div><div class='line'>}</div></pre></td></tr></table></div></figure>


<p><em>Slight side note; if you noticed the <code>author.id</code> field is an array even though
our document has a single author it&rsquo;s because the underlying mappings actually
store these leafs as a list.</em></p>

<p>This is a tremendous savings on Elasticsearch as it doesn&rsquo;t need to send the
original document and all it needs to do is supply the mappings that matched the
document instead.  The trade-off of course is you now need to wait for the
response from Elasticsearch and then kick off extra potential requests to other
data stores so weigh your application needs accordingly.  Obviously if all you
care about is several fields in your document this is a big win indeed.</p>

<h3>Source filtering to Pair Down Data</h3>

<p>A secondary strategy, that you can actually combine with the previous, is to have
Elasticsearch pair down the JSON document it sends to you.</p>

<p><strong>Request:</strong></p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>GET /_search
</div><div class='line'>{
</div><div class='line'>  "query": {
</div><div class='line'>    "match": {
</div><div class='line'>      "author.name": "Ben"
</div><div class='line'>    }
</div><div class='line'>  },
</div><div class='line'>  "_source": {
</div><div class='line'>    "include": {
</div><div class='line'>      "includes": ["title", "content", "author.name", "categories.tag"],
</div><div class='line'>      "excludes": []
</div><div class='line'>    }
</div><div class='line'>  }
</div><div class='line'>}</div></pre></td></tr></table></div></figure>


<p><strong>Reply:</strong></p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>{
</div><div class='line'>  "hits": {
</div><div class='line'>    [
</div><div class='line'>      {
</div><div class='line'>        "_index" : "my-index-000001",
</div><div class='line'>        "_id" : "the-post-id",
</div><div class='line'>        "_score" : 1.0
</div><div class='line'>        "_source": {
</div><div class='line'>          "title": "some title",
</div><div class='line'>          "content": "some content",
</div><div class='line'>          "author": {
</div><div class='line'>            "name": "Ben"
</div><div class='line'>          },
</div><div class='line'>          "categories": [
</div><div class='line'>            { "tag": "json" },
</div><div class='line'>            { "tag": "programming" }
</div><div class='line'>          ]
</div><div class='line'>        }
</div><div class='line'>      }
</div><div class='line'>    ]
</div><div class='line'>  }
</div><div class='line'>}</div></pre></td></tr></table></div></figure>


<p>This prunes the document down to just the fields you&rsquo;ll be using but maintains
the relative structure of it.  You&rsquo;ll still be incurring allocation costs to
deserialize duplicates but at least it only for the data you&rsquo;ll be directly
using.  One giant bullet point to <code>_source</code> filtering is it&rsquo;s not free.  By
default Elasticsearch will simply pass the whole document without parsing it at
all; however, source filtering will require Elasticsearch to deserialize the
document to derive the filtered structure.  You&rsquo;ll see a fair amount more memory
being utilized with this so at larger scale and volume of data you&rsquo;ll probably
want to find other optimizations.</p>

<h2>Conclusion</h2>

<p>Using Elasticsearch as a document store is pretty descent, but as your data
requirements change and grow it can be easy to simply keep tacking on fields to
your documents.  There are a number of solutions to mitigate how much data you
transfer to avoid large chunks of overhead, and sometimes they come with their
own costs.  Here we covered the two primary ways of filtering data, <code>fields</code> and
<code>_source</code> filtering.  If at all possible you should reach for <code>fields</code> when
possible.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My Current NeoVim Setup]]></title>
    <link href="http://benfalk.com/blog/2022/02/15/my-current-neovim-setup/"/>
    <updated>2022-02-15T00:19:56+00:00</updated>
    <id>http://benfalk.com/blog/2022/02/15/my-current-neovim-setup</id>
    <content type="html"><![CDATA[<p>It&rsquo;s been almost six years since switching over to NeoVim, and every so often I
find myself showing off my current setup to other Vim / NeoVim users to give
them an idea of what is possible with it.  This post will be a quick list of
recommended plugins and other tidbits you may want to incorporate in your setup
as well.</p>

<p><img src="http://benfalk.com/images/neovim-demo.png" title="&#34;My NeoVim Setup Demo&#34;" alt="&#34;My NeoVim Setup Demo&#34;"></p>

<!-- more -->


<h2>1. <a href="https://sw.kovidgoyal.net/kitty/">Kitty</a></h2>

<p>So it&rsquo;s not anything <em>directly</em> related to NeoVim; however, if you&rsquo;re looking at
that sweet eye-candy and digging it then you&rsquo;ll most likely want the terminal
emulator that works the best with it across every OS.  I rock it on both OSX and
Ubuntu personally and I&rsquo;ve heard it works well on Windows as well.  I highly
recommend <a href="https://github.com/ryanoasis/nerd-fonts">Nerd Fonts</a> with it as well
with the patched <code>Fira Code</code> font with ligature support.  This is what gives my
icons in the demo picture above in the file explorer, which is NerdTree.</p>

<h2>2. <a href="https://github.com/nvim-telescope/telescope.nvim">Telescope</a></h2>

<p><img src="http://benfalk.com/images/telescope-demo.png" title="&#34;Telescope Demo&#34;" alt="&#34;Telescope Demo&#34;"></p>

<p>This is an incredibly useful plugin that can really replace or augment some of
the plugins you might already have in your tool-belt.  It has a very good
interface that lets plugin makers use it for all kinds of things, from the
simple file fuzzy finder, to text searching capabilities, and even for things
such as searching for all places a reference is located in a project.</p>

<h2>3. <a href="https://github.com/nvim-treesitter/nvim-treesitter">Treesitter</a></h2>

<p>If you&rsquo;ve wished that syntax color highlighting was better, then you probably
haven&rsquo;t heard of or used <code>nvim-treesitter</code>.  This amazing plugin has a deeper
understanding for code and can give you a richer coloring.  I&rsquo;ve noticed with
Ruby it does better then what I&rsquo;ve seen with any of the bigger IDEs I see people
using.  The same is true for <code>C#</code> and <code>Rust</code>.  I highly recommend you try it
with a treesitter compatible color theme.</p>

<h2>4. <a href="https://github.com/neoclide/coc.nvim">Conquer of Completion</a></h2>

<p>If you&rsquo;ve tried setting up different language servers with NeoVim you know it
can be a pain.  This largely takes away that headache using it&rsquo;s own form of
additional plugins.  If you&rsquo;ve ever used VSCode, it is very much like that in my
opinion.  I believe the story for setting up language servers has gotten a lot
easier; however, this is extremely easy-mode so I haven&rsquo;t tried anything else in
almost three years when it comes to autocompletion.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[When Slices Should Be Iterators]]></title>
    <link href="http://benfalk.com/blog/2022/02/13/when-slices-should-be-iterators/"/>
    <updated>2022-02-13T16:04:34+00:00</updated>
    <id>http://benfalk.com/blog/2022/02/13/when-slices-should-be-iterators</id>
    <content type="html"><![CDATA[<p>Today I had a bit of fun learning how to get more into the head-space on defining
better parameters in my rust functions when they work with a collection.  Let&rsquo;s
go on a journey and get to the final evolution of where I ended up and what was
learned.</p>

<!-- more -->


<p>First we&rsquo;ll need to start with a small snippet of code to get an idea of where
it started.  In this case I was tinkering with a simple cache store of a <code>RwLock</code>
around a <code>HashMap</code> where the values are insulated in an <code>Arc</code>.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div></pre></td><td class='main  rust'><pre><div 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>
</div><div class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">hash</span><span class="o">::</span><span class="n">Hash</span><span class="p">;</span>
</div><div class='line'><span class="k">use</span> <span class="n">std</span><span class="o">::</span><span class="n">sync</span><span class="o">::</span><span class="p">{</span><span class="n">Arc</span><span class="p">,</span> <span class="n">RwLock</span><span class="p">};</span>
</div><div class='line'> </div><div class='line'><span class="n">pub</span> <span class="n">struct</span> <span class="n">Cache</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span><span class="p">(</span><span class="n">RwLock</span><span class="o">&lt;</span><span class="n">HashMap</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">Arc</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;&gt;&gt;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'><span class="k">impl</span><span class="o">&lt;</span><span class="n">K</span><span class="o">:</span> <span class="n">Eq</span> <span class="o">+</span> <span class="n">Hash</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span> <span class="n">Cache</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span> <span class="p">{</span>
</div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">new</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Self</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">Cache</span><span class="p">(</span><span class="n">RwLock</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="n">HashMap</span><span class="o">::</span><span class="n">new</span><span class="p">()))</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">store</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="o">:</span> <span class="n">K</span><span class="p">,</span> <span class="n">value</span><span class="o">:</span> <span class="n">V</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">self</span><span class="p">.</span><span class="m">0</span>
</div><div class='line'>            <span class="p">.</span><span class="n">write</span><span class="p">()</span>
</div><div class='line'>            <span class="p">.</span><span class="n">expect</span><span class="p">(</span><span class="s">&quot;A write lock to store cache item&quot;</span><span class="p">)</span>
</div><div class='line'>            <span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="n">value</span><span class="p">));</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="n">pub</span> <span class="k">fn</span> <span class="n">get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">key</span><span class="o">:</span> <span class="o">&amp;</span><span class="n">K</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Option</span><span class="o">&lt;</span><span class="n">Arc</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
</div><div class='line'>        <span class="n">self</span><span class="p">.</span><span class="m">0</span>
</div><div class='line'>            <span class="p">.</span><span class="n">read</span><span class="p">()</span>
</div><div class='line'>            <span class="p">.</span><span class="n">expect</span><span class="p">(</span><span class="s">&quot;A reading lock to read cache item&quot;</span><span class="p">)</span>
</div><div class='line'>            <span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</div><div class='line'>            <span class="p">.</span><span class="n">map</span><span class="p">(</span><span class="n">Arc</span><span class="o">::</span><span class="n">clone</span><span class="p">)</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="cp">#[cfg(test)]</span>
</div><div class='line'><span class="k">mod</span> <span class="n">test</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">use</span> <span class="n">super</span><span class="o">::</span><span class="n">Cache</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="cp">#[test]</span>
</div><div class='line'>    <span class="k">fn</span> <span class="n">a_simple_read_and_write</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">let</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">Cache</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>        <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="s">&quot;test&quot;</span><span class="p">,</span> <span class="s">&quot;it&quot;</span><span class="p">);</span>
</div><div class='line'>        <span class="k">let</span> <span class="n">fetched</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="o">&amp;</span><span class="s">&quot;test&quot;</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span>
</div><div class='line'>        <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span><span class="o">*</span><span class="n">fetched</span><span class="p">,</span> <span class="s">&quot;it&quot;</span><span class="p">);</span>
</div><div class='line'>        <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">cache</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="o">&amp;</span><span class="s">&quot;junk&quot;</span><span class="p">).</span><span class="n">is_none</span><span class="p">());</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>I then wanted to add a bulk fetch method which would utilize a single read lock
to bulk fetch as many cached items via keys.  My first pass ended up looking
like this:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="c1">// Inside impl for Cache&lt;K, V&gt;</span>
</div><div class='line'><span class="n">pub</span> <span class="k">fn</span> <span class="n">get_for_keys</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">keys</span><span class="o">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">K</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Vec</span><span class="o">&lt;</span><span class="n">Arc</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">hash</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="m">0.</span><span class="n">read</span><span class="p">().</span><span class="n">expect</span><span class="p">(</span><span class="s">&quot;A reading lock to get for keys&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="n">keys</span><span class="p">.</span><span class="n">iter</span><span class="p">()</span>
</div><div class='line'>        <span class="p">.</span><span class="n">flat_map</span><span class="p">(</span><span class="o">|</span><span class="n">key</span><span class="o">|</span> <span class="p">{</span>
</div><div class='line'>            <span class="n">hash</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</div><div class='line'>                <span class="p">.</span><span class="n">map</span><span class="p">(</span><span class="n">Arc</span><span class="o">::</span><span class="n">clone</span><span class="p">)</span>
</div><div class='line'>        <span class="p">})</span>
</div><div class='line'>        <span class="p">.</span><span class="n">collect</span><span class="p">()</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'> </div><div class='line'><span class="c1">// Added to tests</span>
</div><div class='line'><span class="cp">#[test]</span>
</div><div class='line'><span class="k">fn</span> <span class="n">simple_get_for_keys</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">Cache</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="s">&quot;apple&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="s">&quot;banana&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;c&#39;</span><span class="p">,</span> <span class="s">&quot;crayon&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="k">let</span> <span class="n">keys</span> <span class="o">=</span> <span class="n">vec</span><span class="o">!</span><span class="p">[</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="sc">&#39;z&#39;</span><span class="p">];</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">hits</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get_for_keys</span><span class="p">(</span><span class="o">&amp;</span><span class="n">keys</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">len</span><span class="p">(),</span> <span class="m">2</span><span class="p">);</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;apple&quot;</span><span class="p">)));</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;banana&quot;</span><span class="p">)));</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>Sweet, tests pass and we are in business!  Now lets plug it in roughly to the
code path I was hoping to use it in&hellip;</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="k">let</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">Cache</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'><span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="s">&quot;apples&quot;</span><span class="p">);</span>
</div><div class='line'><span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="s">&quot;bananas&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'><span class="k">let</span> <span class="k">mut</span> <span class="n">keys</span> <span class="o">=</span> <span class="n">HashSet</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'><span class="n">keys</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">);</span>
</div><div class='line'><span class="n">keys</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">);</span>
</div><div class='line'><span class="n">keys</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="sc">&#39;z&#39;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'><span class="k">let</span> <span class="n">hits</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get_for_keys</span><span class="p">(</span><span class="o">&amp;</span><span class="n">keys</span><span class="p">);</span>
</div><div class='line'><span class="c1">//                            ^^^^^ expected slice `[char]`, found struct `HashSet`</span>
</div></pre></td></tr></table></div></figure>


<p>It turns out a slice won&rsquo;t work, so it&rsquo;s back to the drawling board.  I&rsquo;m not
actually even using the slice directly really, I&rsquo;m just using the iterator it
provides via <code>.iter()</code>.  So why not just require an iterator to begin with? Here
is what my next try looked like.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="c1">// Had to add an `&#39;a` lifetime to the start of the impl:</span>
</div><div class='line'><span class="k">impl</span><span class="o">&lt;</span><span class="err">&#39;</span><span class="n">a</span><span class="p">,</span> <span class="n">K</span><span class="o">:</span> <span class="n">Eq</span> <span class="o">+</span> <span class="n">Hash</span> <span class="o">+</span> <span class="err">&#39;</span><span class="n">a</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span> <span class="n">Cache</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span> <span class="p">{}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// Updated get_for_keys</span>
</div><div class='line'><span class="n">pub</span> <span class="k">fn</span> <span class="n">get_for_keys</span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">keys</span><span class="o">:</span> <span class="n">I</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Vec</span><span class="o">&lt;</span><span class="n">Arc</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;&gt;</span>
</div><div class='line'><span class="n">where</span>
</div><div class='line'>    <span class="n">I</span><span class="o">:</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Item</span> <span class="o">=</span> <span class="o">&amp;</span><span class="err">&#39;</span><span class="n">a</span> <span class="n">K</span><span class="o">&gt;</span>
</div><div class='line'><span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">hash</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="m">0.</span><span class="n">read</span><span class="p">().</span><span class="n">expect</span><span class="p">(</span><span class="s">&quot;A reading lock to get for keys&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="n">keys</span><span class="p">.</span><span class="n">flat_map</span><span class="p">(</span><span class="o">|</span><span class="n">key</span><span class="o">|</span> <span class="p">{</span>
</div><div class='line'>            <span class="n">hash</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</div><div class='line'>                <span class="p">.</span><span class="n">map</span><span class="p">(</span><span class="n">Arc</span><span class="o">::</span><span class="n">clone</span><span class="p">)</span>
</div><div class='line'>        <span class="p">})</span>
</div><div class='line'>        <span class="p">.</span><span class="n">collect</span><span class="p">()</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// Had to update test</span>
</div><div class='line'><span class="cp">#[test]</span>
</div><div class='line'><span class="k">fn</span> <span class="n">simple_get_for_keys</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">Cache</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="s">&quot;apple&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="s">&quot;banana&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;c&#39;</span><span class="p">,</span> <span class="s">&quot;crayon&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="k">let</span> <span class="n">keys</span> <span class="o">=</span> <span class="n">vec</span><span class="o">!</span><span class="p">[</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="sc">&#39;z&#39;</span><span class="p">];</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">hits</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get_for_keys</span><span class="p">((</span><span class="o">&amp;</span><span class="n">keys</span><span class="p">).</span><span class="n">iter</span><span class="p">());</span>
</div><div class='line'> </div><div class='line'>    <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">len</span><span class="p">(),</span> <span class="m">2</span><span class="p">);</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;apple&quot;</span><span class="p">)));</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;banana&quot;</span><span class="p">)));</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>This works now for any iterator; however, I&rsquo;m not a fan of the <code>(&amp;keys).iter()</code>
that is needed now to get it to work for different collections that can produce
an iterator.  It turns out that there is also a trait that covers this as well,
and it&rsquo;s called <code>IntoIterator</code>.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div></pre></td><td class='main  rust'><pre><div class='line'><span class="c1">// Updated get_for_keys</span>
</div><div class='line'><span class="n">pub</span> <span class="k">fn</span> <span class="n">get_for_keys</span><span class="o">&lt;</span><span class="n">I</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">self</span><span class="p">,</span> <span class="n">keys</span><span class="o">:</span> <span class="n">I</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Vec</span><span class="o">&lt;</span><span class="n">Arc</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;&gt;</span>
</div><div class='line'><span class="n">where</span>
</div><div class='line'>    <span class="n">I</span><span class="o">:</span> <span class="n">IntoIterator</span><span class="o">&lt;</span><span class="n">Item</span> <span class="o">=</span> <span class="o">&amp;</span><span class="err">&#39;</span><span class="n">a</span> <span class="n">K</span><span class="o">&gt;</span>
</div><div class='line'><span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">hash</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="m">0.</span><span class="n">read</span><span class="p">().</span><span class="n">expect</span><span class="p">(</span><span class="s">&quot;A reading lock to get for keys&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="n">keys</span><span class="p">.</span><span class="n">into_iter</span><span class="p">()</span>
</div><div class='line'>        <span class="p">.</span><span class="n">flat_map</span><span class="p">(</span><span class="o">|</span><span class="n">key</span><span class="o">|</span> <span class="p">{</span>
</div><div class='line'>            <span class="n">hash</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
</div><div class='line'>                <span class="p">.</span><span class="n">map</span><span class="p">(</span><span class="n">Arc</span><span class="o">::</span><span class="n">clone</span><span class="p">)</span>
</div><div class='line'>        <span class="p">})</span>
</div><div class='line'>        <span class="p">.</span><span class="n">collect</span><span class="p">()</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// (&amp;keys).iter() still works, but now so does this</span>
</div><div class='line'><span class="cp">#[test]</span>
</div><div class='line'><span class="k">fn</span> <span class="n">simple_get_for_keys</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">Cache</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="s">&quot;apple&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="s">&quot;banana&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;c&#39;</span><span class="p">,</span> <span class="s">&quot;crayon&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="k">let</span> <span class="n">keys</span> <span class="o">=</span> <span class="n">vec</span><span class="o">!</span><span class="p">[</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="sc">&#39;z&#39;</span><span class="p">];</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">hits</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get_for_keys</span><span class="p">(</span><span class="o">&amp;</span><span class="n">keys</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">len</span><span class="p">(),</span> <span class="m">2</span><span class="p">);</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;apple&quot;</span><span class="p">)));</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;banana&quot;</span><span class="p">)));</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// And this also works:</span>
</div><div class='line'><span class="cp">#[test]</span>
</div><div class='line'><span class="k">fn</span> <span class="n">get_for_keys_with_hashset</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">let</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">Cache</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">,</span> <span class="s">&quot;apples&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">,</span> <span class="s">&quot;bananas&quot;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">cache</span><span class="p">.</span><span class="n">store</span><span class="p">(</span><span class="sc">&#39;c&#39;</span><span class="p">,</span> <span class="s">&quot;crayons&quot;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="k">let</span> <span class="k">mut</span> <span class="n">keys</span> <span class="o">=</span> <span class="n">HashSet</span><span class="o">::</span><span class="n">new</span><span class="p">();</span>
</div><div class='line'>    <span class="n">keys</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="sc">&#39;a&#39;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">keys</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="sc">&#39;b&#39;</span><span class="p">);</span>
</div><div class='line'>    <span class="n">keys</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="sc">&#39;z&#39;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="k">let</span> <span class="n">hits</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">get_for_keys</span><span class="p">(</span><span class="o">&amp;</span><span class="n">keys</span><span class="p">);</span>
</div><div class='line'>    <span class="n">assert_eq</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">len</span><span class="p">(),</span> <span class="m">2</span><span class="p">);</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;apples&quot;</span><span class="p">)));</span>
</div><div class='line'>    <span class="k">assert</span><span class="o">!</span><span class="p">(</span><span class="n">hits</span><span class="p">.</span><span class="n">contains</span><span class="p">(</span><span class="o">&amp;</span><span class="n">Arc</span><span class="o">::</span><span class="n">new</span><span class="p">(</span><span class="s">&quot;bananas&quot;</span><span class="p">)));</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>This lets you use a reference to any collection which implements <code>IntoIterator</code>.
I&rsquo;m pretty happy with what was learned while tinkering with this caching idea.
Can&rsquo;t say if the whole thing in total is worth anything, but this little bit of
insight gained is a big one.  When first starting with rust it felt like I was
wanting to work with slices; however, more often then not what&rsquo;s being called
for is an iterator.  If you find yourself in the same spot then hopefully this
has opened your eyes!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Guess Who's Back]]></title>
    <link href="http://benfalk.com/blog/2022/02/12/guess-whos-back/"/>
    <updated>2022-02-12T17:03:38+00:00</updated>
    <id>http://benfalk.com/blog/2022/02/12/guess-whos-back</id>
    <content type="html"><![CDATA[<p>You know it&rsquo;s been way to long when you have to spend about two hours figuring
out how to get your blog setup locally.  It turns out my Octopress setup has
been dead for quite a few years now and no longer builds with any recent version
of Ruby!  Thanks to some docker magic giving me a door to the past when this
tool-chain worked I&rsquo;m back in business!</p>

<!-- more -->


<p>I haven&rsquo;t really posted much in the last six years. The eager readers who
quickly scan back for other posts will see I made a lack-luster attempt to get
back into it.  Somewhere in between moves and a slump I was in really kept me
from exercising this practise, which has atrophied so far this feels very
foreign.</p>

<p>So what am I up to?  Well I&rsquo;m back to slinging ruby for a company called
<a href="https://www.truecar.com/">TrueCar</a>.  While I&rsquo;m not really of fan of ruby
anymore, I&rsquo;ve come to a point in my career where the language used isn&rsquo;t as
important to me as the problems I&rsquo;m solving and the people I work with.  Now,
having said that, there are some no-go languages still I just won&rsquo;t approach if
I can avoid it; such as Java and PHP.  On the flip side of the coin, the
languages I keep gravitating back to are Elixir, Rust, and C#.</p>

<p>Aside from my professional track, I&rsquo;ve been diving deeper and deeper into Rust
as a result from a side-journey I took in my life about 5 years ago.  Having
helped in the development of a &ldquo;FreeShard&rdquo;, a reverse engineered server
emulation for an MMORPG client, I have really become more and more entranced by
the idea of creating some of my own multiplayer games from the ground up.</p>

<p>I&rsquo;ve even dabbled into learning Blender over the last year or two, which I hope
to show off some of my work in posts to come, but here is one of the first works
I made which I was pretty proud of:</p>

<p><img src="http://benfalk.com/images/stargate-scene.png" title="&#34;Space themed Stargate Scene&#34;" alt="&#34;Space themed Stargate Scene&#34;"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Booting Back Up]]></title>
    <link href="http://benfalk.com/blog/2019/03/20/booting-back-up/"/>
    <updated>2019-03-20T16:58:13+00:00</updated>
    <id>http://benfalk.com/blog/2019/03/20/booting-back-up</id>
    <content type="html"><![CDATA[<p>Wow, it&rsquo;s been a minute.  I had to do a little bit of reading and fiddling to
even make sure I still knew how to update my own blog :\ .  What&rsquo;s up with my
absence?  I guess there isn&rsquo;t really a good reason for it, just fell out of a
practice and it&rsquo;s a shame that it happened.</p>

<!-- more -->


<p>I&rsquo;ve spent that last couple of years growing my Elixir craft as well as picking
up on dotnet-core; however, I don&rsquo;t think I&rsquo;m where I should be in my growth.
After really taking stock of my life both professionally and personally I&rsquo;m not
where I thought I&rsquo;d be.  Blogging is really a big part of that and it&rsquo;s for that
reason I&rsquo;m picking it back up.  There is so much I could be and will be talking
about.</p>

<p>So&hellip; what am I really saying?  I&rsquo;ve taken stock of my life recently and am ready
to make some changes in it; and blogging again is one of them.  For a starting
goal I&rsquo;ll try to post at <strong>least</strong> twice a week.  Hopefully as time goes on it
will pick up more consistently.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Looking Further Ahead]]></title>
    <link href="http://benfalk.com/blog/2016/11/08/looking-further-ahead/"/>
    <updated>2016-11-08T20:43:19+00:00</updated>
    <id>http://benfalk.com/blog/2016/11/08/looking-further-ahead</id>
    <content type="html"><![CDATA[<p>Have you ever had to mow the lawn?  If so then you&rsquo;re probably familiar with
getting into the pattern of glancing just head of the front left or right tire
and keeping it within a tolerance that ensures you can cut the most amount of
grass possible.  You&rsquo;ll often only need to break this subconscious practise
when obstacles come up such as trees, landscaping, or a perhaps a particularly
tricky turn.</p>

<p><video width='640' height='320' preload='metadata' controls ><source src='http://benfalk.com/movies/combining-corn.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'></video></p>

<p>At first glance if you&rsquo;ve ever had to combine corn in the field, it feels like
it&rsquo;s roughly the same activity.  However, if you try this tactic you&rsquo;ll quickly
find you&rsquo;re in for a world of hurt.  The trick to operating a combine is to keep
an eye on where you&rsquo;re going and glancing at how the corn is being brought in
as you go.  If you focus too much on the current corn being brought in you&rsquo;ll
get too wrapped up in the each set and quickly drown in a series of micro
corrections.</p>

<p>This applies to so many things in life.  It feels natural to want to focus on
what&rsquo;s immediately coming up and loose focus of the planned out row ahead of
you.  I find myself doing this with so many things in my life and being back on
the farm has helped bring it to my attention.  Don&rsquo;t get hung up on the
immediate success or failure of what&rsquo;s going on, but rather use it as a guide to
drive what you&rsquo;re striving for as an indicator of the overall goal.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Channels in Phoenix]]></title>
    <link href="http://benfalk.com/blog/2016/07/06/testing-channels-in-phoenix/"/>
    <updated>2016-07-06T23:48:22+00:00</updated>
    <id>http://benfalk.com/blog/2016/07/06/testing-channels-in-phoenix</id>
    <content type="html"><![CDATA[<h3>The Back-Story</h3>

<p>I&rsquo;ve been writing Phoenix applications for about four months now and really
enjoy it so far; however, I&rsquo;ve been stuck working mostly on boring web APIs and
haven&rsquo;t had a chance to build anything that is more rich and interactive with
a specific user application in mind.  That&rsquo;s all changed though as I decided to
beef up on my front-end skills a bit and work on a pet project I&rsquo;ve had cooking
in the noodle for awhile now.</p>

<!-- more -->


<h3>What are Channels?</h3>

<p>Chances are, if you&rsquo;ve heard about Phoenix you&rsquo;ve also heard people brag up the
&ldquo;Channel&rdquo; system that ships with it.  It gives you a great way to send real-time
updates to the browser and doesn&rsquo;t require a crazy amount of hardware to do it
either!  If you&rsquo;re familiar with
<a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">MVC</a> then
you can think of a channel as being a controller that maintains persistence and
a constant socket open with the browser.</p>

<p>What does that mean though?  Ask any web developer and they&rsquo;ll be able to tell
you about the life-cycle of a web request, which at it&rsquo;s heart is stateless.
This means every request you make to a web server requires it to build up state
every time you hop to a new page.  The overhead to build that up can be pretty
incredible.  With channels you&rsquo;re able to store the state and keep it around for
any requests that happen.</p>

<h3>Show Me Some Code Already</h3>

<p>Let&rsquo;s peel back what is going on with these channels by snooping through some of
the code from a fresh install. First you&rsquo;ll want to direct your attention to
<code>lib/project_name/endpoint.ex</code>.  This is the starting code base for a request,
and right away one of the things we find is this (assuming your application is
named MyApp):</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  elixir'><pre><div class='line'>  <span class="n">socket</span> <span class="s2">&quot;/socket&quot;</span><span class="p">,</span> <span class="no">MyApp</span><span class="o">.</span><span class="no">UserSocket</span>
</div></pre></td></tr></table></div></figure>


<p>If you&rsquo;re worked with <code>Plug</code> routing this should should feel pretty similar.
What&rsquo;s going on here is any requests to <code>/socket</code> are being handled by the
<code>MyApp.UserSocket</code> module.  Let&rsquo;s crack that open next and take a peek!</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div></pre></td><td class='main  elixir'><pre><div class='line'><span class="k">defmodule</span> <span class="no">MyApp</span><span class="o">.</span><span class="no">UserSocket</span> <span class="k">do</span>
</div><div class='line'><span class="k">  </span><span class="kn">use</span> <span class="no">Phoenix</span><span class="o">.</span><span class="no">Socket</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">## Channels</span>
</div><div class='line'>  <span class="c1"># channel &quot;rooms:*&quot;, MyApp.RoomChannel</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">## Transports</span>
</div><div class='line'>  <span class="n">transport</span> <span class="ss">:websocket</span><span class="p">,</span> <span class="no">Phoenix</span><span class="o">.</span><span class="no">Transports</span><span class="o">.</span><span class="no">WebSocket</span>
</div><div class='line'>  <span class="c1"># transport :longpoll, Phoenix.Transports.LongPoll</span>
</div><div class='line'> </div><div class='line'>  <span class="c1"># Socket params are passed from the client and can</span>
</div><div class='line'>  <span class="c1"># be used to verify and authenticate a user. After</span>
</div><div class='line'>  <span class="c1"># verification, you can put default assigns into</span>
</div><div class='line'>  <span class="c1"># the socket that will be set for all channels, ie</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1">#     {:ok, assign(socket, :user_id, verified_user_id)}</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1"># To deny connection, return `:error`.</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1"># See `Phoenix.Token` documentation for examples in</span>
</div><div class='line'>  <span class="c1"># performing token verification on connect.</span>
</div><div class='line'>  <span class="k">def</span> <span class="n">connect</span><span class="p">(</span><span class="n">_params</span><span class="p">,</span> <span class="n">socket</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="c1"># Socket id&#39;s are topics that allow you to identify all sockets for a given user:</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1">#     def id(socket), do: &quot;users_socket:#{socket.assigns.user_id}&quot;</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1"># Would allow you to broadcast a &quot;disconnect&quot; event and terminate</span>
</div><div class='line'>  <span class="c1"># all active sockets and channels for a given user:</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1">#     TaskMaster.Endpoint.broadcast(&quot;users_socket:#{user.id}&quot;, &quot;disconnect&quot;, %{})</span>
</div><div class='line'>  <span class="c1">#</span>
</div><div class='line'>  <span class="c1"># Returning `nil` makes this socket anonymous.</span>
</div><div class='line'>  <span class="k">def</span> <span class="n">id</span><span class="p">(</span><span class="n">_socket</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="no">nil</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure>


<p>Quite a bit is going on here, luckily a lot of it is being handled for us with
the <code>use Phoenix.Socket</code> statement.  This is where your web socket connection
becomes a channel.  Think of this module as being a initial starting point and
router for which the channel specific protocol takes shape.  The <code>channel</code> macro
wires up &ldquo;topics&rdquo; to more specific modules.  I like to think of topics as web
routes.  The <code>*</code> in the channel does what you would expect and allows anything
to match at that location.</p>

<p>Next up is the transport, I don&rsquo;t know much about this; but my assumption is
this specifies the underpinnings of how to actually talk with the web client.
Based on the commented out option of <code>:longpoll</code> it looks like this would
support older clients that don&rsquo;t have web socket support.  There are some
libraries out there that use a long polling ajax request to simulate websockets.</p>

<p>The comments do a pretty great job of explaining the rest of what&rsquo;s going on
here!  But what would a channel look like?  Here is the code for a channel that
I&rsquo;m working on at the moment:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div></pre></td><td class='main  elixir'><pre><div class='line'><span class="k">defmodule</span> <span class="no">TaskMaster</span><span class="o">.</span><span class="no">ProjectChannel</span> <span class="k">do</span>
</div><div class='line'><span class="k">  </span><span class="nv">@moduledoc</span> <span class="sd">&quot;&quot;&quot;</span>
</div><div class='line'><span class="sd">  This module is responsible for the high level on-going with projects.</span>
</div><div class='line'><span class="sd">  It notifies users of when projects are created, deleted, or updated,</span>
</div><div class='line'><span class="sd">  and allows a user to also perform those actions as well.</span>
</div><div class='line'><span class="sd">  &quot;&quot;&quot;</span>
</div><div class='line'>  <span class="kn">use</span> <span class="no">TaskMaster</span><span class="o">.</span><span class="no">Web</span><span class="p">,</span> <span class="ss">:channel</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">join</span><span class="p">(</span><span class="s2">&quot;projects&quot;</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">socket</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="n">send</span><span class="p">(</span><span class="n">self</span><span class="p">(),</span> <span class="ss">:after_join</span><span class="p">)</span>
</div><div class='line'>    <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">handle_in</span><span class="p">(</span><span class="s2">&quot;create&quot;</span><span class="p">,</span> <span class="n">project_params</span><span class="p">,</span> <span class="n">socket</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    case</span> <span class="no">Project</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">project_params</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="no">Repo</span><span class="o">.</span><span class="n">insert</span> <span class="k">do</span>
</div><div class='line'><span class="k">      </span><span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">project</span><span class="p">}</span> <span class="o">-&gt;</span>
</div><div class='line'>        <span class="n">broadcast!</span> <span class="n">socket</span><span class="p">,</span> <span class="s2">&quot;created&quot;</span><span class="p">,</span> <span class="n">project</span>
</div><div class='line'>        <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:ok</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'> </div><div class='line'>      <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">_</span><span class="p">}</span> <span class="o">-&gt;</span>
</div><div class='line'>        <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:error</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">handle_in</span><span class="p">(</span><span class="s2">&quot;delete&quot;</span><span class="p">,</span> <span class="err">%</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">=&gt;</span><span class="n">id</span><span class="p">},</span> <span class="n">socket</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    case</span> <span class="no">Repo</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="no">Project</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">      </span><span class="no">nil</span> <span class="o">-&gt;</span>
</div><div class='line'>        <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:error</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'> </div><div class='line'>      <span class="n">project</span> <span class="o">-&gt;</span>
</div><div class='line'>        <span class="no">TaskMaster</span><span class="o">.</span><span class="no">Repo</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">project</span><span class="p">)</span>
</div><div class='line'>        <span class="n">broadcast!</span> <span class="n">socket</span><span class="p">,</span> <span class="s2">&quot;deleted&quot;</span><span class="p">,</span> <span class="n">project</span>
</div><div class='line'>        <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:ok</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">handle_in</span><span class="p">(</span><span class="s2">&quot;update&quot;</span><span class="p">,</span> <span class="err">%</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">=&gt;</span><span class="n">id</span><span class="p">}</span><span class="o">=</span><span class="n">params</span><span class="p">,</span> <span class="n">socket</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    case</span> <span class="no">Repo</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="no">Project</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">      </span><span class="no">nil</span> <span class="o">-&gt;</span>
</div><div class='line'>        <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:error</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'> </div><div class='line'>      <span class="n">project</span> <span class="o">-&gt;</span>
</div><div class='line'>        <span class="k">case</span> <span class="no">Project</span><span class="o">.</span><span class="n">changeset</span><span class="p">(</span><span class="n">project</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span> <span class="o">|&gt;</span> <span class="no">Repo</span><span class="o">.</span><span class="n">update</span> <span class="k">do</span>
</div><div class='line'><span class="k">          </span><span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">_</span><span class="p">}</span> <span class="o">-&gt;</span>
</div><div class='line'>            <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:error</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'> </div><div class='line'>          <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">project</span><span class="p">}</span> <span class="o">-&gt;</span>
</div><div class='line'>            <span class="n">broadcast!</span> <span class="n">socket</span><span class="p">,</span> <span class="s2">&quot;updated&quot;</span><span class="p">,</span> <span class="n">project</span>
</div><div class='line'>            <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:ok</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'>        <span class="k">end</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">handle_info</span><span class="p">(</span><span class="ss">:after_join</span><span class="p">,</span> <span class="n">socket</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="n">projects</span> <span class="o">=</span> <span class="no">Repo</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="no">Project</span><span class="p">)</span>
</div><div class='line'>    <span class="n">push</span><span class="p">(</span><span class="n">socket</span><span class="p">,</span> <span class="s2">&quot;sync_project_list&quot;</span><span class="p">,</span> <span class="err">%</span><span class="p">{</span><span class="ss">projects:</span> <span class="n">projects</span><span class="p">})</span>
</div><div class='line'>    <span class="p">{</span><span class="ss">:noreply</span><span class="p">,</span> <span class="n">socket</span><span class="p">}</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure>


<p>If you&rsquo;ve worked with <code>GenServer</code> some of this is going to look eerily the same.
This is as much experience as I&rsquo;ve had so far so I&rsquo;ll let the code do most of
the talking for now&hellip;  This post has gone on a bit long so we&rsquo;ll wrap up here
for now and dive in again in a second post with how to test this stuff, stay
tuned!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Switching Over to NeoVim]]></title>
    <link href="http://benfalk.com/blog/2016/07/01/switching-over-to-neovim/"/>
    <updated>2016-07-01T21:10:05+00:00</updated>
    <id>http://benfalk.com/blog/2016/07/01/switching-over-to-neovim</id>
    <content type="html"><![CDATA[<p>I&rsquo;ve been using vim for coming up on four years now.  It&rsquo;s been an amazing ride
so far and it&rsquo;s impossible for me to imagine not using it anymore.  This fear is
what has kept me from exploring NeoVim until recently, and now I wish I would
have looked into it perhaps a little sooner!  In this post I&rsquo;ll explain how I
moved over to NeoVim and highlight some of the &ldquo;gotchas&rdquo; I&rsquo;ve found so far.</p>

<!-- more -->


<h3>Taking the Journey</h3>

<p>Some simple Google&#8217;ing and you&rsquo;ll find a quick little strategy to move from Vim
over to NeoVim via creating the new standard config directory and copying your
<code>vimrc</code> file over to the new <code>init.vim</code> format.  While that <em>may</em> work I took
this opportunity to take a hard look at the tools I was using and instead elected
to start with a blank slate.</p>

<p>Every plugin I had been using went through a simple checklist to determine <strong>if</strong>
and <strong>how</strong> it was ported over.</p>

<ol>
<li>Am I still using this?  Surprisingly quite a few fell in the <code>no</code> camp
with this and I flat out just didn&rsquo;t bring them over.</li>
<li>Is there a NeoVim specific version?  With all of the improvements that
have been baked into it, plugins that are written explicitly for it will
probably get some greater mileage.</li>
<li>Does it work the same as before?  For <code>almost</code> all of these the answer is
yes; however, I did run into one that had to get the boot: <code>Powerline</code>.</li>
</ol>


<h3>Notable Changes</h3>

<h4>YouCompleteMe</h4>

<p>I was using the popular <code>YouCompleteMe</code>; however, with NeoVim there is a better
option which takes advantage of it&rsquo;s asynchronous architecture:
<a href="https://github.com/Shougo/deoplete.nvim">deoplete</a>.  I was bit taken back at
first when the <code>TAB</code> key didn&rsquo;t cycle through the complete options; however,
with a bit of help from a member in the community I was back on track pretty
quickly.  Here is the solution to get your tab key to select auto-complete
options:</p>

<p><strong>In your init.vim</strong></p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>inoremap &lt;silent> &lt;expr> &lt;Tab> utils#tabComplete()</div></pre></td></tr></table></div></figure>


<p><strong>nvim/autoload/utils.vim</strong></p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>function! g:utils#tabComplete() abort
</div><div class='line'>  let l:col = col('.') -1
</div><div class='line'> </div><div class='line'>  if pumvisible()
</div><div class='line'>    return "\&lt;C-n>"
</div><div class='line'>  else
</div><div class='line'>    if !l:col || getline('.')[l:col - 1] !~# '\k'
</div><div class='line'>      return "\&lt;TAB>"
</div><div class='line'>    else
</div><div class='line'>      return "\&lt;C-n>"
</div><div class='line'>    endif
</div><div class='line'>  endif
</div><div class='line'>endfunction</div></pre></td></tr></table></div></figure>


<h4>Powerline</h4>

<p>Powerline just wasn&rsquo;t working.  I switched over to <code>vim-airline</code> and was pretty
pleased with how much it looked and functions &ndash; so no complaints there.</p>

<h4>Vundle</h4>

<p>Switched away from Vundle for Plug.  Like <code>deoplete</code>, it takes advantage of
the asynchronous capabilities of NeoVim and can install a full range of plugins
pretty quickly.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Time Between Posts]]></title>
    <link href="http://benfalk.com/blog/2016/06/29/the-time-between-posts/"/>
    <updated>2016-06-29T12:33:08+00:00</updated>
    <id>http://benfalk.com/blog/2016/06/29/the-time-between-posts</id>
    <content type="html"><![CDATA[<p><img class="left" src="http://benfalk.com/images/dali-melting-clock.png" width="250" height="250" title="&#34;Where is time going?&#34;" alt="&#34;Where is time going?&#34;"></p>

<p>A whirlwind of change has rocked my life since I&rsquo;ve posted last, some of which
has been the culprit for my lack of posts&hellip;  I would look at the calendar and
think to myself, &ldquo;Wow, it&rsquo;s been a couple weeks.  I should capture some of
what&rsquo;s been happening.&rdquo;  Here I am now trying to highlight some of the major
events and happenings since I last posted about five months ago.  I&rsquo;ll start
with the highs, move into informative, then end on the low.</p>

<!-- more -->


<h3>Getting Healthy</h3>

<p>About the time I stopped writing posts is the time I started getting serious
about my health.  I&rsquo;ve really been watching what I eat and try to do about 15
minutes of exercise everyday.  Since tracking it, I&rsquo;ve lost 75 lbs and am almost
back down to 200 lbs.  I&rsquo;m back to where I was before I left Austin, TX four
years ago and it feels great!  Being physically healthy has really become a big
part of my life so I plan to have more posts on what I&rsquo;ve done so far and how I
plan to keep it going.</p>

<h3>Becoming a Home Owner</h3>

<p><img src="http://benfalk.com/images/house-front.png" width="700" height="300" title="&#34;Home Sweet Home&#34;" alt="&#34;Home Sweet Home&#34;"></p>

<p>Almost a month ago my wife and I closed on and moved into our first house.
We&rsquo;ve spent the first five years of our marriage traveling from place to place
and living in apartments so this is a brand new and amazing feeling for both of
us.  I enjoy living in a rural area with a big back yard and neighbors that are
more then five yards away from me!  Looking forward to working on the pole barn
and turning it into a killer office to work out of!</p>

<h3>Transitioning Away from Ruby</h3>

<p>I&rsquo;ve been using Ruby for a long time now, and it was truly the first programming
language that I <strong>loved</strong> to write code in.  These last four months I&rsquo;ve written
mostly Elixir both in and outside of work and it has captured me with the same
great joy I got when starting off with Ruby.  The performance has been amazing
and the community top notch so far.  While I&rsquo;ll always keep a weathered eye on
my first love, Elixir is now my goto tool for most jobs that get sent my way.</p>

<h3>Getting Back to the Web GUI</h3>

<p>Several weeks ago I participated in a company internal hackathon in which we
broke up into teams, designed small applications, and went to town trying to
implement them in 36 hours.  I took that as an opportunity to play with Phoenix,
a popular web framework for Elixir.  While I have been getting a lot of good
experience in with Phoenix, one of it&rsquo;s big selling points of web-sockets is
something I hadn&rsquo;t yet dipped into.  Naturally I was able to focus our demo
around using web-sockets for real-time collaboration and fell in love with how
much you could do.</p>

<p>Since then I&rsquo;ve looked into tools that meld well with the functional languages I&rsquo;m
growing accustomed. I&rsquo;ve decided to spend some time each week learning Elm, a
web-client based language with some very interesting features.  I haven&rsquo;t done
serious front-end development in quite some time, we&rsquo;re talking since the
MooTool and DoJo days for any who remember; however, this may be enough to get
me dabbling in it again!</p>

<h3>The Struggle &hellip;</h3>

<p>A little over a month ago my uncle was diagnosed with very aggressive, terminal
pancreatic cancer.  There isn&rsquo;t a day yet that goes by where I find my mind
drifting toward thinking of him and the struggle he is going through.  Rage,
sadness, and an overall feeling of helplessness invades me every time I think
about it.  For those who know him, he&rsquo;s an argumentative and stubborn person who
lives life his own way &ndash; and I admired his fervor and strength.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JSON Hyper-Schema]]></title>
    <link href="http://benfalk.com/blog/2016/02/09/json-hyper-schema/"/>
    <updated>2016-02-09T22:57:56+00:00</updated>
    <id>http://benfalk.com/blog/2016/02/09/json-hyper-schema</id>
    <content type="html"><![CDATA[<p>Last week we looked at <a href="http://benfalk.com/blog/2016/02/02/json-schema-for-your-api/">JSON Schema</a>
and how it can be used it in describing the data of your API.  In this post
we&rsquo;ll be looking at the <code>JSON Hyper-schema</code>.  It is a schema built on top of the
<code>JSON Schema</code> and describes the URLs that can be built with a given resource.
Let&rsquo;s look at how we can use this spec to help supplement our APIs.</p>

<!-- more -->


<p>Like last time, let&rsquo;s work with an example.  Here is the schema similar to the
one from the last post:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="s2">&quot;http://benfalk.com/person.json&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;$schema&quot;</span><span class="p">:</span><span class="s2">&quot;http://json-schema.org/draft-04/schema#&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Person&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="s2">&quot;A simple data model of a social human being&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;required&quot;</span><span class="p">:[</span> <span class="s2">&quot;first_name&quot;</span><span class="p">,</span> <span class="s2">&quot;last_name&quot;</span><span class="p">,</span> <span class="s2">&quot;birthdate&quot;</span> <span class="p">],</span>
</div><div class='line'>  <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;first_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;last_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;birthdate&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="s2">&quot;date-time&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;friends&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;array&quot;</span><span class="p">,</span> <span class="nt">&quot;items&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/&quot;</span> <span class="p">}</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>Here is how we can enrich this with the hyper-schema spec.  With this schema we
have defined how to update the data, where to get the friends list, how to add a
friend, and lastly how to delete the person.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="s2">&quot;http://benfalk.com/person.json&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;$schema&quot;</span><span class="p">:</span><span class="s2">&quot;http://json-schema.org/draft-04/schema#&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Person&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="s2">&quot;A simple data model of a social human being&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;required&quot;</span><span class="p">:[</span> <span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="s2">&quot;first_name&quot;</span><span class="p">,</span> <span class="s2">&quot;last_name&quot;</span><span class="p">,</span> <span class="s2">&quot;birthdate&quot;</span> <span class="p">],</span>
</div><div class='line'>  <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;id&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;first_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;last_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;birthdate&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="s2">&quot;date-time&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;friends&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;array&quot;</span><span class="p">,</span> <span class="nt">&quot;items&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/&quot;</span> <span class="p">}</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="nt">&quot;links&quot;</span><span class="p">:[</span>
</div><div class='line'>    <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Update the person&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;rel&quot;</span><span class="p">:</span><span class="s2">&quot;update&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;href&quot;</span><span class="p">:</span><span class="s2">&quot;/people/{id}&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;method&quot;</span><span class="p">:</span><span class="s2">&quot;PUT&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;schema&quot;</span><span class="p">:{</span>
</div><div class='line'>        <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>          <span class="nt">&quot;first_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>          <span class="nt">&quot;last_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>          <span class="nt">&quot;birthdate&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="s2">&quot;date-time&quot;</span> <span class="p">}</span>
</div><div class='line'>        <span class="p">}</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">},</span>
</div><div class='line'>    <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Get friends list&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;rel&quot;</span><span class="p">:</span><span class="s2">&quot;friends&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;href&quot;</span><span class="p">:</span><span class="s2">&quot;/people/{id}/friends&quot;</span>
</div><div class='line'>    <span class="p">},</span>
</div><div class='line'>    <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Add a friend&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;rel&quot;</span><span class="p">:</span><span class="s2">&quot;add-friend&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;href&quot;</span><span class="p">:</span><span class="s2">&quot;/people/{id}/friends&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;method&quot;</span><span class="p">:</span><span class="s2">&quot;POST&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;schema&quot;</span><span class="p">:{</span>
</div><div class='line'>        <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>          <span class="nt">&quot;id&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span> <span class="p">}</span>
</div><div class='line'>        <span class="p">},</span>
</div><div class='line'>        <span class="nt">&quot;required&quot;</span><span class="p">:[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">},</span>
</div><div class='line'>    <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Delete person&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;rel&quot;</span><span class="p">:</span><span class="s2">&quot;delete&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;href&quot;</span><span class="p">:</span><span class="s2">&quot;/people/{id}&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;method&quot;</span><span class="p">:</span><span class="s2">&quot;DELETE&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">]</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>This is a great way to describe to clients how it can interact with your API in
a way that can be automated.  While a lot of clients still don&rsquo;t use it much you
can use the <code>Link</code> header of HTTP to point to these.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>Link: &lt;http://api.whatever.com/schemas/person.json>; rel="describedBy"</div></pre></td></tr></table></div></figure>


<p>I like to think of this as &ldquo;CSS for your API&rdquo;.  It describes to the client how
it can style the data with links to more resources.  Not many clients understand
this yet; however, with companies like GitHub using it for things like
pagination it feels like adoption will only get better as time goes by.</p>

<p>The <code>JSON Hyper-Schema</code> is very extensive and we&rsquo;ve only covered a small part of
it.  It also makes provisions for media-types and URI validations.  If you want
to read more in depth on the subject I recommend heading on over to the
<a href="http://json-schema.org">json-schema.org</a> and reading up more on it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fixed League of Legends Lag]]></title>
    <link href="http://benfalk.com/blog/2016/02/05/fixed-league-of-legends-lag/"/>
    <updated>2016-02-05T21:52:43+00:00</updated>
    <id>http://benfalk.com/blog/2016/02/05/fixed-league-of-legends-lag</id>
    <content type="html"><![CDATA[<p>I am a closet fan of the game &ldquo;League of Legends&rdquo;; mostly just as a spectator of
famous streamers such as <a href="https://twitter.com/Trick2g">Trick2G</a>.  However, my
wife loves to play the game and plays in the evenings. Things went wayward for
her about a month or so ago when she started having huge lag spikes and high
ping that seemed to start and then never clear up.  Having done network support
in the past I set out to try and solve this problem&hellip;</p>

<!-- more -->


<p>I did all of the normal things I could think of such as check the running tasks
on her computer, make sure nothing inside of our network was hogging the
bandwidth, etc.  Everything I checked seemed to suggest the problem was outside
of our home network.  Every test I ran back out from our router was great, so I
quickly began to suspect this problem was further up stream.  After sniffing the
network traffic from League I was able to do some trace-routes to determine the
problem seemed to reside on the connection somewhere between a router in Chicago
and Riot, the company which owns Leauge of Legends.  I contacted others in my
area that also used my ISP and they we&rsquo;re reporting the same problem.</p>

<p>I reached out to Riot tech support with all of the logs they wanted and got
back frankly what I thought was perhaps the poorest tech support response I&rsquo;ve
heard in a long time, &ldquo;Don&rsquo;t play when this is happening&hellip;.&rdquo;  After several more
back and forth emails with Riot I decided to give up and try another alternative
which has fixed this problem when it comes up.</p>

<p>What I did was setup OpenVPN on a Digital Ocean droplet out in San Franciso and
installed the OpenVPN client on my wifes computer.  When she starts to have
packet loss she can connect to the OpenVPN server and her packet loss magically
goes away!  I&rsquo;m sure there are some other methods I could have used to route her
traffic around this problem area, but this seemed like the surest way to go
since I was never able to get the same latency issues through my web-host
droplet that I have running.</p>

<p>If anyone else is having this problem where they get this lag that seems to
start up about the same time everynight this may work for you as well.  Here is
a <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04">walkthrough</a>
I found for getting a droplet setup on Digital Ocean and installing the client
on your local machine.  If you&rsquo;re just playing the game the $5 dollar droplet is
probly enough for you.</p>

<p>Riot &ndash; if you are reading this I would be happy to help you fix this problem;
provided I can work with tech support that stops insisting the problem is on my
wife&rsquo;s computer or is because of something internal to our network.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JSON Schema for Your API]]></title>
    <link href="http://benfalk.com/blog/2016/02/03/json-schema-for-your-api/"/>
    <updated>2016-02-03T00:20:02+00:00</updated>
    <id>http://benfalk.com/blog/2016/02/03/json-schema-for-your-api</id>
    <content type="html"><![CDATA[<p>It&rsquo;s pretty easy to stand up an API.  Unfortunately sometimes though, this
easiness is a false friend you can be paying for down the road.  Once you get
any amount of consumers; even if they are internal, expressing the data models
your API delivers and how it is validated can be a messy chore.  You may write
up some fancy documents describing your API (which is good); however, this can
lack a bit in the area of tooling.  This is where JSON Schema can really shine.</p>

<!-- more -->


<h3>What is JSON Schema?</h3>

<p>The JSON schema is a spec used to describe complex data structures.  Because it
has an official spec behind it, there are quite a few tools out there that you
can use to take advantage of it.  This gives you a way to publish agreed upon
documents that other vendors can use to model the data from your API.</p>

<h3>Simple Example</h3>

<p>This schema is simple, but shows off how data can be described.  This models a
person as having a <code>first_name</code>, <code>last_name</code>, <code>birthdate</code>, and optionally
<code>friends</code>.  Just glancing at it this all may seem pretty obvious except for
maybe the <code>friends</code> part.  The <code>$ref</code> is a way in the spec to reference another
part of your schema document.  In this case it references the top level of the
schema which means that <code>friends</code> can be an array of <code>Person</code> objects.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="s2">&quot;http://benfalk.com/person.json&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;$schema&quot;</span><span class="p">:</span><span class="s2">&quot;http://json-schema.org/draft-04/schema#&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Person&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="s2">&quot;A simple data model of a social human being&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;required&quot;</span><span class="p">:[</span> <span class="s2">&quot;first_name&quot;</span><span class="p">,</span> <span class="s2">&quot;last_name&quot;</span><span class="p">,</span> <span class="s2">&quot;birthdate&quot;</span> <span class="p">],</span>
</div><div class='line'>  <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;first_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;last_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;birthdate&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="s2">&quot;date-time&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;friends&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;array&quot;</span><span class="p">,</span> <span class="nt">&quot;items&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/&quot;</span> <span class="p">}</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<h3>More Complex Example</h3>

<p>Part of the spec sets aside the key <code>definitions</code> as an area where you can
define types so you don&rsquo;t have to repeat them in your schema.  Here is the same
schema from above using that as an example.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="s2">&quot;http://benfalk.com/person.json&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;$schema&quot;</span><span class="p">:</span><span class="s2">&quot;http://json-schema.org/draft-04/schema#&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Person&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="s2">&quot;A simple data model of a social human being&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;required&quot;</span><span class="p">:[</span> <span class="s2">&quot;first_name&quot;</span><span class="p">,</span> <span class="s2">&quot;last_name&quot;</span><span class="p">,</span> <span class="s2">&quot;birthdate&quot;</span> <span class="p">],</span>
</div><div class='line'>  <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;first_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/definitions/name_field&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;last_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/definitions/name_field&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;birthdate&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/definitions/datetime&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;friends&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;array&quot;</span><span class="p">,</span> <span class="nt">&quot;items&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/&quot;</span> <span class="p">}</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="nt">&quot;definitions&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;name_field&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;datetime&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="s2">&quot;date-time&quot;</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<h3>Example Referencing Another Schema</h3>

<p>Of course sometimes you&rsquo;ll have a rich set of models which reference each other.
Don&rsquo;t worry, the spec also has a way to reference other documents via <em>http</em>.
This new spec expands upon the last one by adding in a <code>hobbies</code> key, which
references <code>/hobby.json#</code>.  So what is happening here?  The magic is in the
<code>id</code>.  When a reference is relative like this the spec says to default to the
host found in the id field to resolve another schema file.  If the uri in the
reference is a fully qualified url then the id is ignored and it will look for
it at the location given.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="s2">&quot;http://benfalk.com/person.json&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;$schema&quot;</span><span class="p">:</span><span class="s2">&quot;http://json-schema.org/draft-04/schema#&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="s2">&quot;Person&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="s2">&quot;A simple data model of a social human being&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;required&quot;</span><span class="p">:[</span> <span class="s2">&quot;first_name&quot;</span><span class="p">,</span> <span class="s2">&quot;last_name&quot;</span><span class="p">,</span> <span class="s2">&quot;birthdate&quot;</span> <span class="p">],</span>
</div><div class='line'>  <span class="nt">&quot;properties&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;first_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/definitions/name_field&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;last_name&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/definitions/name_field&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;birthdate&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/definitions/datetime&quot;</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;friends&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;array&quot;</span><span class="p">,</span> <span class="nt">&quot;items&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;#/&quot;</span> <span class="p">}</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;hobbies&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;array&quot;</span><span class="p">,</span> <span class="nt">&quot;items&quot;</span><span class="p">:{</span> <span class="nt">&quot;$ref&quot;</span><span class="p">:</span><span class="s2">&quot;/hobby.json#&quot;</span> <span class="p">}</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="nt">&quot;definitions&quot;</span><span class="p">:{</span>
</div><div class='line'>    <span class="nt">&quot;name_field&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;minLength&quot;</span><span class="p">:</span><span class="mi">1</span> <span class="p">},</span>
</div><div class='line'>    <span class="nt">&quot;datetime&quot;</span><span class="p">:{</span> <span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="s2">&quot;date-time&quot;</span> <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>A couple gotchas here are the spec really only makes way for http and anything
else, such as from disk, are unsupported.  The other gotcha when referencing
documents is there doesn&rsquo;t appear to be a relative location ability built into
the spec.  This means if you start serving your documents under a new
sub-directory you&rsquo;ll have to go through all of your references and update them.</p>

<h3>Wrap Up</h3>

<p>If you want to learn more about JSON Schema you can head on over to the official
website at <a href="http://json-schema.org/">json-schema.org</a>.  In my next post I&rsquo;ll
cover some more advanced sections of the spec, including parts which are geared
directly for determining what kind of urls you can build from the data models
you have!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I Have Returned]]></title>
    <link href="http://benfalk.com/blog/2016/02/02/i-have-returned/"/>
    <updated>2016-02-02T01:40:41+00:00</updated>
    <id>http://benfalk.com/blog/2016/02/02/i-have-returned</id>
    <content type="html"><![CDATA[<p>I have been absent awhile; mostly enjoying a lengthy break over Christmas
followed by an incredibly busy January.  I&rsquo;ve collected quite a bit over the
last month or so which is being drafted up into posts for the next couple of
weeks.  I feel ready to get back into the swing of another year and am excited
to see what awaits!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[No Refunds on Life Spent]]></title>
    <link href="http://benfalk.com/blog/2015/12/08/no-refunds-on-life-spent/"/>
    <updated>2015-12-08T01:07:27+00:00</updated>
    <id>http://benfalk.com/blog/2015/12/08/no-refunds-on-life-spent</id>
    <content type="html"><![CDATA[<p>After visiting my sick grandfather in the hospital I realised the time
spent in life offers no refunds.  Take the opportunities you have today for
the things you really want to do.  I have <em>really</em> been wanting to go back to
school and this hit home hard for me.  There is so much more I want to learn
and do with my life and the window I have to do it in is closing every day.</p>

<p>Sometimes we get complacent <em>&ldquo;dancing for the man&rdquo;</em>; staying comfortably
distracted by the workday.  Don&rsquo;t let it happen!  Always challenge and audit
yourself to ensure you&rsquo;re spending the time you have on the investments which
are important to you.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Elixir Agent - a Lightweight GenServer]]></title>
    <link href="http://benfalk.com/blog/2015/12/04/elixir-agent-a-lightweight-genserver/"/>
    <updated>2015-12-04T01:31:49+00:00</updated>
    <id>http://benfalk.com/blog/2015/12/04/elixir-agent-a-lightweight-genserver</id>
    <content type="html"><![CDATA[<p>If you come from Erlang and are familiar with the <code>GenServer</code> behaviour you may be
interested in the <code>Agent</code> set of methods that ship with Elixir.  They provide a
lightweight mechanic to save and retrieve state.  Here are two functionally
equivalent modules, one written as a <code>GenServer</code> and the other with <code>Agent</code>.</p>

<!-- more -->




<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div></pre></td><td class='main  elixir'><pre><div class='line'><span class="k">defmodule</span> <span class="no">NumberGenerator</span> <span class="k">do</span>
</div><div class='line'><span class="k">  </span><span class="kn">use</span> <span class="no">GenServer</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">start_link</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="no">GenServer</span><span class="o">.</span><span class="n">start_link</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">next_number</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="no">GenServer</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="ss">:next_number</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">handle_call</span><span class="p">(</span><span class="ss">:next_number</span><span class="p">,</span> <span class="n">number</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="n">number</span><span class="p">,</span> <span class="n">number</span> <span class="o">+</span> <span class="m">1</span><span class="p">}</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure>




<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div></pre></td><td class='main  elixir'><pre><div class='line'><span class="k">defmodule</span> <span class="no">NumberGenerator</span> <span class="k">do</span>
</div><div class='line'><span class="k">  def</span> <span class="n">start_link</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="no">Agent</span><span class="o">.</span><span class="n">start_link</span><span class="p">(</span><span class="k">fn</span> <span class="o">-&gt;</span> <span class="m">1</span> <span class="k">end</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">next_number</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="no">Agent</span><span class="o">.</span><span class="n">get_and_update</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="k">fn</span> <span class="n">num</span> <span class="o">-&gt;</span> <span class="p">{</span><span class="n">num</span><span class="p">,</span> <span class="n">num</span> <span class="o">+</span> <span class="m">1</span><span class="p">}</span> <span class="k">end</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure>


<p>Pretty nice how much you can shrink the code; and for things as trivial as this
you probably don&rsquo;t even need to have a module at all!  To be fair I used the
anonymous function version of <code>Agent</code>; which makes it seem a lot smaller.  Here
is the same one again with non-anonymous functions.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div></pre></td><td class='main  elixir'><pre><div class='line'><span class="k">defmodule</span> <span class="no">NumberGenerator</span> <span class="k">do</span>
</div><div class='line'><span class="k">  def</span> <span class="n">start_link</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="no">Agent</span><span class="o">.</span><span class="n">start_link</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="ss">:init</span><span class="p">,</span> <span class="p">[])</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">next_number</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'><span class="k">    </span><span class="no">Agent</span><span class="o">.</span><span class="n">get_and_update</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="bp">__MODULE__</span><span class="p">,</span> <span class="ss">:fetch_and_advance</span><span class="p">,</span> <span class="p">[])</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="n">init</span><span class="p">,</span> <span class="k">do</span><span class="p">:</span> <span class="m">1</span>
</div><div class='line'>  <span class="k">def</span> <span class="n">fetch_and_advance</span><span class="p">(</span><span class="n">number</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="p">{</span><span class="n">number</span><span class="p">,</span> <span class="n">number</span> <span class="o">+</span> <span class="m">1</span><span class="p">}</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Project Barrier of Entry]]></title>
    <link href="http://benfalk.com/blog/2015/11/22/project-barrier-of-entry/"/>
    <updated>2015-11-22T22:39:51+00:00</updated>
    <id>http://benfalk.com/blog/2015/11/22/project-barrier-of-entry</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://benfalk.com/images/project-barrier-of-entry.jpg" width="250" height="250" title="&#34;How much you know?&#34;" alt="&#34;How much you know?&#34;"></p>

<p>How hard is it for a new person to pick up your project and start working on it?
Think about the supporting database, message queues, mailer software, and any
other systems your project ties into.  Is there any kind of development
credentials they&rsquo;ll need?  What is the process to get a change into production?
When you go beyond the run-of-the-mill framework inside the vacuum of your local
machine the barrier to getting started on a project can start to sky rocket.
What are some ways we can help mitigate this?</p>

<!-- more -->


<h3>Use the README</h3>

<p>Your <code>README</code> should contain instructions and link to other resources that will
give a newcomer into the project answers to the questions above.  When someone
has to ask about how to get started, take it as an opportunity to document what
is missing.  If people can get your project setup and begin making changes
without having to ask questions you have succeeded.</p>

<p>As the project grows and changes keeping the <code>README</code> up to date can be a
challenge.  Try to remember that when you make changes to your process or
environment to reflect them in your document.  Make it part of your peer-review
and pre-master checklist:</p>

<blockquote><p>&ldquo;Has anything changed that should be documented in the README?&rdquo;</p></blockquote>

<h3>Automate the Development Environment</h3>

<p>There are some fantastic ways to remove the headache of setting up the
development environment for a project.  You&rsquo;d be surprised how far a good bash
script goes.  Look at all of the commands you have to type to get started on
your project.  Try to take those commands and put them into a script that can be
run from checkout to get developers as close to ready as possible.</p>

<p>I also recommend <a href="https://docs.docker.com/">Docker</a>.  This adds additional
requirements that Docker be installed and developers know the basics of how it
works; however, it gives you a great way to automate an environment that is
identical for everyone.  This is a <strong>huge</strong> winner when you are targeting
developers that all might not be using the same platform.  Removing the pain
of knowing how to set up your environment for OSX versus Linux versus Windows is
awesome.</p>

<h2>Final Thoughts</h2>

<p>Try to remember you won&rsquo;t be the only or last person to work on a project.  Make
it as easy as possible for others to get started with automated scripts and
documentation.  When you lower the barrier of entry into your project it ensures
it&rsquo;s continued survival.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Formatting JSON With Jq]]></title>
    <link href="http://benfalk.com/blog/2015/11/11/formatting-json-with-jq/"/>
    <updated>2015-11-11T00:02:57+00:00</updated>
    <id>http://benfalk.com/blog/2015/11/11/formatting-json-with-jq</id>
    <content type="html"><![CDATA[<p>If you haven&rsquo;t tried it out yet, I <strong>highly</strong> recommend checking out the
application <a href="https://stedolan.github.io/jq/">jq</a>.  It allows you to quickly
format json with bash or any other light weight scripting languages.  I&rsquo;ve been
playing around with this for about a week and I would like to share some of the
features it has.</p>

<!-- more -->


<h3>&mdash;sort-keys</h3>

<p>If you work with a service like ElasticSearch where the keys are never in the
same order this is an amazing feature.  I have used it with <code>vimdiff</code> to wire up
some quick diffs.  This example grabs two different documents from ElasticSearch
and shows a side-by-side difference of the two documents.  Note how it drills
strait down into the <code>._source</code> key, which is the data we care about.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>curl -s -XGET localhost:9200/items/item/1 | jq --sort-keys <span class="s1">&#39;._source&#39;</span> &gt; left
</div><div class='line'>curl -s -XGET localhost:9200/items/item/2 | jq --sort-keys <span class="s1">&#39;._source&#39;</span> &gt; right
</div><div class='line'>vimdiff left right
</div></pre></td></tr></table></div></figure>


<h3>variables with the dollar sign</h3>

<p>Sometimes what you are trying to extract out is pretty far down.  For instance
say you are using a pretty wordy hypermedia API that has the users in the
structure separate from the comments.</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://nobody.cares.com/post/6/comments.json&quot;</span><span class="p">,</span>
</div><div class='line'>  <span class="nt">&quot;data&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="nt">&quot;comments&quot;</span><span class="p">:</span> <span class="p">[</span>
</div><div class='line'>      <span class="p">{</span>
</div><div class='line'>        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">483</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;post_id&quot;</span><span class="p">:</span><span class="mi">6</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;user_id&quot;</span><span class="p">:</span><span class="mi">6</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Get to the chopper!&quot;</span>
</div><div class='line'>      <span class="p">},</span>
</div><div class='line'>      <span class="p">{</span>
</div><div class='line'>        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">487</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;post_id&quot;</span><span class="p">:</span><span class="mi">6</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;user_id&quot;</span><span class="p">:</span><span class="mi">5</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Life is like a box of chocolates...&quot;</span>
</div><div class='line'>      <span class="p">},</span>
</div><div class='line'>      <span class="p">{</span>
</div><div class='line'>        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">489</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;post_id&quot;</span><span class="p">:</span><span class="mi">6</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;user_id&quot;</span><span class="p">:</span><span class="mi">6</span><span class="p">,</span>
</div><div class='line'>        <span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="s2">&quot;Come with me if you want to live&quot;</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">]</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="nt">&quot;extra&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="nt">&quot;users&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://again.nobody.cares.com/users&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;read_only&quot;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;data&quot;</span><span class="p">:</span> <span class="p">[</span>
</div><div class='line'>        <span class="p">{</span>
</div><div class='line'>          <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
</div><div class='line'>          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Arnold&quot;</span>
</div><div class='line'>        <span class="p">},</span>
</div><div class='line'>        <span class="p">{</span>
</div><div class='line'>          <span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="mi">5</span><span class="p">,</span>
</div><div class='line'>          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Forest&quot;</span>
</div><div class='line'>        <span class="p">}</span>
</div><div class='line'>      <span class="p">]</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>


<p>The following will combine the user with the comment</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>jq <span class="s1">&#39;[</span>
</div><div class='line'><span class="s1">  .extra.users.data as $users |</span>
</div><div class='line'><span class="s1">  .data.comments[] |</span>
</div><div class='line'><span class="s1">  . as $comment |</span>
</div><div class='line'><span class="s1">  $comment + {user: ($users | map(select(.id == $comment.user_id))|first)} |</span>
</div><div class='line'><span class="s1">  del(.user_id)</span>
</div><div class='line'><span class="s1">  ]&#39;</span>
</div></pre></td></tr></table></div></figure>


<p>And produce the following output:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div></pre></td><td class='main  json'><pre><div class='line'><span class="p">[</span>
</div><div class='line'>  <span class="p">{</span>
</div><div class='line'>    <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">483</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;post_id&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Get to the chopper!&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;user&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Arnold&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="p">{</span>
</div><div class='line'>    <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">487</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;post_id&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Life is like a box of chocolates...&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;user&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Forest&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="p">{</span>
</div><div class='line'>    <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">489</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;post_id&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Come with me if you want to live&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="nt">&quot;user&quot;</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
</div><div class='line'>      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Arnold&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">]</span>
</div></pre></td></tr></table></div></figure>


<h2>&mdash;raw-output</h2>

<p>Being able to manipulate json into an easily digestible format for scripts gets
even better. Using the same example from above:</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>jq --raw-output <span class="s1">&#39;.extra.users.data[] | (.id | tostring) + &quot;:&quot; + .name&#39;</span>
</div></pre></td></tr></table></div></figure>


<p>Produces the following output</p>

<figure class='code'><div class='highlight' linenos='true'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>6:Arnold
</div><div class='line'>5:Forest</div></pre></td></tr></table></div></figure>


<p>There is a <strong>ton</strong> of features baked into this and I have only scratched the
surface.  As I run into uses for them I plan to put together a sticky page of
recipes I have used.  Stay tuned!</p>
]]></content>
  </entry>
  
</feed>
