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

  <title><![CDATA[Zac Gross]]></title>
  <link href="http://zacg.github.io/atom.xml" rel="self"/>
  <link href="http://zacg.github.io/"/>
  <updated>2016-06-05T13:41:57-04:00</updated>
  <id>http://zacg.github.io/</id>
  <author>
    <name><![CDATA[Zac Gross]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Postgres With Entity Framework Code First]]></title>
    <link href="http://zacg.github.io/blog/2016/06/04/postgres-and-entity-framework-code-first/"/>
    <updated>2016-06-04T20:47:11-04:00</updated>
    <id>http://zacg.github.io/blog/2016/06/04/postgres-and-entity-framework-code-first</id>
    <content type="html"><![CDATA[<p>
    Npgsql is the most popular Postgres data provider for .net. None of the integration examples involving entity framework I found online used the db first paradigm. After a lot of testing I posted a working example of EF code first with Npgsql below.
</p>




<div class="alert alert-danger">
<p>
<strong>Note:</strong> this example requires the database to already exist. EF automatic creation/migrations will not work.
</p>
</div>




<p>
    Db configuration class, this ensures the correct connection factory is used. My testing found this was the only way to get it set, various connection string formats were ignored/overridden at runtime.
</p>




<figure class='code'><figcaption><span>DB Config </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'>   
</span><span class='line'>  <span class="k">public</span> <span class="k">class</span> <span class="nc">NpgsqlConfiguration</span>
</span><span class='line'>      <span class="p">:</span> <span class="n">System</span><span class="p">.</span><span class="n">Data</span><span class="p">.</span><span class="n">Entity</span><span class="p">.</span><span class="n">DbConfiguration</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">public</span> <span class="nf">NpgsqlConfiguration</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">SetProviderServices</span><span class="p">(</span><span class="s">&quot;Npgsql&quot;</span><span class="p">,</span> <span class="n">Npgsql</span><span class="p">.</span><span class="n">NpgsqlServices</span><span class="p">.</span><span class="n">Instance</span><span class="p">);</span>
</span><span class='line'>            <span class="n">SetProviderFactory</span><span class="p">(</span><span class="s">&quot;Npgsql&quot;</span><span class="p">,</span> <span class="n">Npgsql</span><span class="p">.</span><span class="n">NpgsqlFactory</span><span class="p">.</span><span class="n">Instance</span><span class="p">);</span>
</span><span class='line'>            <span class="n">SetDefaultConnectionFactory</span><span class="p">(</span><span class="k">new</span> <span class="n">Npgsql</span><span class="p">.</span><span class="n">NpgsqlConnectionFactory</span><span class="p">());</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    Next define a context class decorated with the custom db config attribute. Ensure the default schema is set to &#8220;public&#8221; (or the relevant schema name). 
</p>


<p>Key Points:</p>

<ul>
    <li>Ensure context decorated with Npgsql config class</li>
    <li>Ensure correct schema name is set in OnMOdelCreating method</li>
    <li>Don&#8217;t use an initializer</li>
    <li>Apply any case/naming conversions needed</li>
</ul>




<p>
    Some sort of case conversion will likely need to made in the OnModelCreating method, in my case I made all column names lowercase and did the necessary column name transformation there. For table names I used decorator attributes on the entity classes.
</p>




<figure class='code'><figcaption><span>Context </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="na">  </span>
</span><span class='line'><span class="na">  [DbConfigurationType(typeof(NpgsqlConfiguration))]</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">class</span> <span class="nc">ExampleContext</span>
</span><span class='line'>        <span class="p">:</span> <span class="n">DbContext</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">public</span> <span class="n">DbSet</span><span class="p">&lt;</span><span class="n">Example</span><span class="p">&gt;</span> <span class="n">Examples</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>        <span class="k">public</span> <span class="nf">ExampleContext</span><span class="p">(</span><span class="kt">string</span> <span class="n">connectionString</span><span class="p">)</span>
</span><span class='line'>            <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">connectionString</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="n">Configuration</span><span class="p">.</span><span class="n">LazyLoadingEnabled</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="n">Configuration</span><span class="p">.</span><span class="n">ProxyCreationEnabled</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">//Helpful for debugging            </span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="n">Database</span><span class="p">.</span><span class="n">Log</span> <span class="p">=</span> <span class="n">s</span> <span class="p">=&gt;</span> <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</span><span class="p">.</span><span class="n">Debug</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>        <span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnModelCreating</span><span class="p">(</span><span class="n">DbModelBuilder</span> <span class="n">modelBuilder</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">Database</span><span class="p">.</span><span class="n">SetInitializer</span><span class="p">&lt;</span><span class="n">ExampleContext</span><span class="p">&gt;(</span><span class="k">null</span><span class="p">);</span>
</span><span class='line'>            <span class="n">modelBuilder</span><span class="p">.</span><span class="n">HasDefaultSchema</span><span class="p">(</span><span class="s">&quot;public&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="n">modelBuilder</span><span class="p">.</span><span class="n">Conventions</span><span class="p">.</span><span class="n">Remove</span><span class="p">&lt;</span><span class="n">OneToManyCascadeDeleteConvention</span><span class="p">&gt;();</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">modelBuilder</span><span class="p">.</span><span class="n">Properties</span><span class="p">().</span><span class="n">Configure</span><span class="p">(</span><span class="n">c</span> <span class="p">=&gt;</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="kt">var</span> <span class="n">name</span> <span class="p">=</span> <span class="n">c</span><span class="p">.</span><span class="n">ClrPropertyInfo</span><span class="p">.</span><span class="n">Name</span><span class="p">;</span>
</span><span class='line'>                <span class="kt">var</span> <span class="n">newName</span> <span class="p">=</span> <span class="n">name</span><span class="p">.</span><span class="n">ToLower</span><span class="p">();</span>
</span><span class='line'>                <span class="n">c</span><span class="p">.</span><span class="n">HasColumnName</span><span class="p">(</span><span class="n">newName</span><span class="p">);</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">}</span>  
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Migrating Existing Xamarin iOS App to Unified API]]></title>
    <link href="http://zacg.github.io/blog/2015/08/28/migrating-existing-xamarin-ios-app-to-unified-api/"/>
    <updated>2015-08-28T20:42:22-04:00</updated>
    <id>http://zacg.github.io/blog/2015/08/28/migrating-existing-xamarin-ios-app-to-unified-api</id>
    <content type="html"><![CDATA[<p>
    Recently I had to migrate an existing Xamarin iOS app to the unified API. The following are solutions to a few of the problems I encountered.
</p>




<p>
    After running the automated update command from the Xamarin Studio OSX build menu I encountered the following error on subsequent builds:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>The type MonoTouch.UIKit.UIViewController' is defined in an assembly that is not 
</span><span class='line'>referenced. Consider adding a reference to assemblymonotouch, Version=0.0.0.0,</span></code></pre></td></tr></table></div></figure>




<p>
    If you get a similar error it will probably be necessary to:
</p>


<ol>
<li>Clean the solution.</li>
<li>Reinstall all components.</li>
<li><p>Rebuild.</p>

<p> If the issue still persists (like in my case) and you are using Xamarin Studio you may have to manually delete the old component package files from your file system then reinstall them after you are sure they have been wiped. Xamarin studio can store them in multiple locations depending on platform be sure to check: <a href="https://kb.xamarin.com/customer/portal/articles/1865772-where-are-the-components-stored-on-my-machine-">https://kb.xamarin.com/customer/portal/articles/1865772-where-are-the-components-stored-on-my-machine-</a> to find the location on your machine.</p></li>
</ol>


<p>
    One other thing to note is the compiled binary size of your app will probably double because the resulting package now contains both 32 and 64 bit versions.
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Configuring Android Wear Emulator for Debugging With Physical Device]]></title>
    <link href="http://zacg.github.io/blog/2015/08/28/configuring-android-wear-emulator-for-debugging-with-physical-device/"/>
    <updated>2015-08-28T20:15:33-04:00</updated>
    <id>http://zacg.github.io/blog/2015/08/28/configuring-android-wear-emulator-for-debugging-with-physical-device</id>
    <content type="html"><![CDATA[<p>
I recently started developing an Android Wear app and needed to pair a watch running in an emulator to a physical phone(s4). The current documentation on the net is somewhat stale so the following is an up to date procedure:
</p>


<ol>
<li>Power on Android Watch AVD</li>
<li>Connect the physical phone via usb and ensure usb debugging is turned on in system options.</li>
<li>Turn on blue tooth debugging on the watch

<ul>
<li>swipe to get to the settings menu</li>
<li>scroll down to the about menu</li>
<li>tap 7 times on the build number to enable developer mode</li>
<li>navigate back to the main settings menu and select developer options</li>
<li>tap enable avd debugging</li>
<li>tap enable bluetooth debugging (disabled until avd is enabled)</li>
<li>on the home screen a notification should be displayed stating bluetooth debugging is enabled</li>
</ul>
</li>
<li>In an SDK console type &#8220;avd devices&#8221; both the physical phone and watch emulator should be listed</li>
<li>Type  &#8220;adb -d forward tcp:5601 tcp:5601&#8221; to map the emulator ports</li>
<li>On the phone download the Android Wear app from the play store.</li>
<li>Open the wear app and choose pair device.</li>
<li>On the pair device screen press the physical menu/settings button on the phone. An option to &#8220;connect to emulator&#8221; will appear, tap it.</li>
<li>The phone should find and connect to the emulator and display the connected options in the wear app. You can scroll to the bottom and tap one of test options to send a test notification to the paired watch.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Go Asserts and Multiple Return Values]]></title>
    <link href="http://zacg.github.io/blog/2014/10/05/go-asserts-and-multiple-return-values/"/>
    <updated>2014-10-05T14:14:52-04:00</updated>
    <id>http://zacg.github.io/blog/2014/10/05/go-asserts-and-multiple-return-values</id>
    <content type="html"><![CDATA[<p>
    Recently I have been writing many tests for functions with multiple return values. I was hoping to write a single line assertion. Something like the following:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   
</span><span class='line'>  <span class="kd">func</span> <span class="nx">testableFunc</span><span class="p">()</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">){</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">assert</span><span class="p">.</span><span class="nx">Equal</span><span class="p">([]</span><span class="kd">interface</span><span class="p">{}{</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">},</span><span class="nx">testableFunc</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Note Equal()&#39;s signature expects interface{} arguments</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    This won&#8217;t compile, the method signature for Equal takes interface{} parameters. Understandably the compiler can&#8217;t figure it out.
</p>




<p>
    After checking the <a href="https://code.google.com/p/go/issues/detail?id=973">mailing list</a> it turns out the compiler is smart enough to map multiple return values to function params when their types and order match. e.g:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="kd">func</span> <span class="nx">testableFunc</span><span class="p">()</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">){</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">anotherFunc</span><span class="p">(</span><span class="nx">a</span> <span class="kt">int</span><span class="p">,</span><span class="nx">b</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">c</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span> <span class="o">+</span> <span class="nx">c</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//valid because returned types match arguments</span>
</span><span class='line'>  <span class="nx">anotherFunc</span><span class="p">(</span><span class="nx">testableFunc</span><span class="p">())</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    With this behavior in mind we can write a shim function to map multiple return values to a slice of values that the assert function can compare. Here is a 2 value shim:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   
</span><span class='line'>  <span class="kd">func</span> <span class="nx">Shim</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    It can be used like so
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   
</span><span class='line'>  <span class="kd">func</span> <span class="nx">testableFunc</span><span class="p">()</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="p">){</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">5</span><span class="p">,</span><span class="mi">5</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">assert</span><span class="p">.</span><span class="nx">Equal</span><span class="p">(</span><span class="nx">Shim</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span><span class="nx">Shim</span><span class="p">(</span><span class="nx">testableFunc</span><span class="p">()))</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    Now shorten the name and create shims for different number of return values.
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="c1">//Shim for 2 param return values</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">M</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Shim for 3 param return values</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">M3</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Shim for 4 param return values</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">M4</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="nx">d</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="nx">d</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">assert</span><span class="p">.</span><span class="nx">Equal</span><span class="p">(</span><span class="nx">M</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span><span class="nx">M</span><span class="p">(</span><span class="nx">someMethod</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    And finally here is a complete working example.
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   
</span><span class='line'>  <span class="kn">import</span> <span class="p">(</span>
</span><span class='line'>      <span class="s">&quot;github.com/stretchr/testify/assert&quot;</span>
</span><span class='line'>      <span class="s">&quot;testing&quot;</span>
</span><span class='line'>  <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Shim for 2 param return values</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">M</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Shim for 3 param return values</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">M3</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Shim for 4 param return values</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">M4</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="nx">d</span> <span class="kd">interface</span><span class="p">{})</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">[]</span><span class="kd">interface</span><span class="p">{}{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="nx">d</span><span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">testableFunc</span><span class="p">()</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">otherTestableFunc</span><span class="p">()</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="s">&quot;hi&quot;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">TestMulti</span><span class="p">(</span><span class="nx">t</span> <span class="o">*</span><span class="nx">testing</span><span class="p">.</span><span class="nx">T</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">assert</span><span class="p">.</span><span class="nx">Equal</span><span class="p">(</span><span class="nx">t</span><span class="p">,</span> <span class="nx">M</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="nx">M</span><span class="p">(</span><span class="nx">testableFunc</span><span class="p">()))</span>
</span><span class='line'>      <span class="nx">assert</span><span class="p">.</span><span class="nx">Equal</span><span class="p">(</span><span class="nx">t</span><span class="p">,</span> <span class="nx">M3</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="s">&quot;hi&quot;</span><span class="p">),</span> <span class="nx">M3</span><span class="p">(</span><span class="nx">otherTestableFunc</span><span class="p">()))</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Noise Words]]></title>
    <link href="http://zacg.github.io/blog/2014/10/05/noise-words/"/>
    <updated>2014-10-05T14:14:03-04:00</updated>
    <id>http://zacg.github.io/blog/2014/10/05/noise-words</id>
    <content type="html"><![CDATA[<p>
    Here is a javascript array of &#8220;noisy&#8221; words that may help you with NLP related algorithms.
</p>




<figure class='code'><figcaption><span>Noisy Words </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'>   <span class="kd">var</span> <span class="nx">noiseWords</span> <span class="o">=</span>
</span><span class='line'>  <span class="p">[</span><span class="s2">&quot;able&quot;</span><span class="p">,</span><span class="s2">&quot;available&quot;</span><span class="p">,</span><span class="s2">&quot;bad&quot;</span><span class="p">,</span><span class="s2">&quot;big&quot;</span><span class="p">,</span><span class="s2">&quot;black&quot;</span><span class="p">,</span><span class="s2">&quot;central&quot;</span><span class="p">,</span><span class="s2">&quot;certain&quot;</span><span class="p">,</span><span class="s2">&quot;clear&quot;</span><span class="p">,</span><span class="s2">&quot;close&quot;</span><span class="p">,</span><span class="s2">&quot;common&quot;</span><span class="p">,</span><span class="s2">&quot;concerned&quot;</span><span class="p">,</span><span class="s2">&quot;current&quot;</span><span class="p">,</span><span class="s2">&quot;different&quot;</span><span class="p">,</span><span class="s2">&quot;difficult&quot;</span><span class="p">,</span><span class="s2">&quot;due&quot;</span><span class="p">,</span><span class="s2">&quot;early&quot;</span><span class="p">,</span><span class="s2">&quot;easy&quot;</span><span class="p">,</span><span class="s2">&quot;economic&quot;</span><span class="p">,</span><span class="s2">&quot;far&quot;</span><span class="p">,</span><span class="s2">&quot;final&quot;</span><span class="p">,</span><span class="s2">&quot;financial&quot;</span><span class="p">,</span><span class="s2">&quot;fine&quot;</span><span class="p">,</span><span class="s2">&quot;following&quot;</span><span class="p">,</span><span class="s2">&quot;foreign&quot;</span><span class="p">,</span><span class="s2">&quot;free&quot;</span><span class="p">,</span><span class="s2">&quot;full&quot;</span><span class="p">,</span><span class="s2">&quot;general&quot;</span><span class="p">,</span><span class="s2">&quot;good&quot;</span><span class="p">,</span><span class="s2">&quot;great&quot;</span><span class="p">,</span><span class="s2">&quot;happy&quot;</span><span class="p">,</span><span class="s2">&quot;hard&quot;</span><span class="p">,</span><span class="s2">&quot;high&quot;</span><span class="p">,</span><span class="s2">&quot;human&quot;</span><span class="p">,</span><span class="s2">&quot;individual&quot;</span><span class="p">,</span><span class="s2">&quot;industrial&quot;</span><span class="p">,</span><span class="s2">&quot;international&quot;</span><span class="p">,</span><span class="s2">&quot;important&quot;</span><span class="p">,</span><span class="s2">&quot;large&quot;</span><span class="p">,</span><span class="s2">&quot;last&quot;</span><span class="p">,</span><span class="s2">&quot;late&quot;</span><span class="p">,</span><span class="s2">&quot;legal&quot;</span><span class="p">,</span><span class="s2">&quot;likely&quot;</span><span class="p">,</span><span class="s2">&quot;line&quot;</span><span class="p">,</span><span class="s2">&quot;little&quot;</span><span class="p">,</span><span class="s2">&quot;local&quot;</span><span class="p">,</span><span class="s2">&quot;long&quot;</span><span class="p">,</span><span class="s2">&quot;low&quot;</span><span class="p">,</span><span class="s2">&quot;main&quot;</span><span class="p">,</span><span class="s2">&quot;major&quot;</span><span class="p">,</span><span class="s2">&quot;modern&quot;</span><span class="p">,</span><span class="s2">&quot;new&quot;</span><span class="p">,</span><span class="s2">&quot;name&quot;</span><span class="p">,</span><span class="s2">&quot;national&quot;</span><span class="p">,</span><span class="s2">&quot;natural&quot;</span><span class="p">,</span><span class="s2">&quot;necessary&quot;</span><span class="p">,</span><span class="s2">&quot;nice&quot;</span><span class="p">,</span><span class="s2">&quot;normal&quot;</span><span class="p">,</span><span class="s2">&quot;old&quot;</span><span class="p">,</span><span class="s2">&quot;only&quot;</span><span class="p">,</span><span class="s2">&quot;open&quot;</span><span class="p">,</span><span class="s2">&quot;other&quot;</span><span class="p">,</span><span class="s2">&quot;particular&quot;</span><span class="p">,</span><span class="s2">&quot;personal&quot;</span><span class="p">,</span><span class="s2">&quot;political&quot;</span><span class="p">,</span><span class="s2">&quot;poor&quot;</span><span class="p">,</span><span class="s2">&quot;possible&quot;</span><span class="p">,</span><span class="s2">&quot;present&quot;</span><span class="p">,</span><span class="s2">&quot;previous&quot;</span><span class="p">,</span><span class="s2">&quot;prime&quot;</span><span class="p">,</span><span class="s2">&quot;private&quot;</span><span class="p">,</span><span class="s2">&quot;public&quot;</span><span class="p">,</span><span class="s2">&quot;real&quot;</span><span class="p">,</span><span class="s2">&quot;recent&quot;</span><span class="p">,</span><span class="s2">&quot;red&quot;</span><span class="p">,</span><span class="s2">&quot;right&quot;</span><span class="p">,</span><span class="s2">&quot;royal&quot;</span><span class="p">,</span><span class="s2">&quot;serious&quot;</span><span class="p">,</span><span class="s2">&quot;short&quot;</span><span class="p">,</span><span class="s2">&quot;significant&quot;</span><span class="p">,</span><span class="s2">&quot;simple&quot;</span><span class="p">,</span><span class="s2">&quot;similar&quot;</span><span class="p">,</span><span class="s2">&quot;single&quot;</span><span class="p">,</span><span class="s2">&quot;small&quot;</span><span class="p">,</span><span class="s2">&quot;social&quot;</span><span class="p">,</span><span class="s2">&quot;sorry&quot;</span><span class="p">,</span><span class="s2">&quot;special&quot;</span><span class="p">,</span><span class="s2">&quot;strong&quot;</span><span class="p">,</span><span class="s2">&quot;sure&quot;</span><span class="p">,</span><span class="s2">&quot;true&quot;</span><span class="p">,</span><span class="s2">&quot;various&quot;</span><span class="p">,</span><span class="s2">&quot;was&quot;</span><span class="p">,</span><span class="s2">&quot;white&quot;</span><span class="p">,</span><span class="s2">&quot;whole&quot;</span><span class="p">,</span><span class="s2">&quot;wide&quot;</span><span class="p">,</span><span class="s2">&quot;wrong&quot;</span><span class="p">,</span><span class="s2">&quot;young&quot;</span><span class="p">,</span><span class="s2">&quot;labor&quot;</span><span class="p">,</span><span class="s2">&quot;left&quot;</span><span class="p">,</span><span class="s2">&quot;dead&quot;</span><span class="p">,</span><span class="s2">&quot;specific&quot;</span><span class="p">,</span><span class="s2">&quot;total&quot;</span><span class="p">,</span><span class="s2">&quot;appropriate&quot;</span><span class="p">,</span><span class="s2">&quot;military&quot;</span><span class="p">,</span><span class="s2">&quot;basic&quot;</span><span class="p">,</span><span class="s2">&quot;original&quot;</span><span class="p">,</span><span class="s2">&quot;successful&quot;</span><span class="p">,</span><span class="s2">&quot;aware&quot;</span><span class="p">,</span><span class="s2">&quot;popular&quot;</span><span class="p">,</span><span class="s2">&quot;professional&quot;</span><span class="p">,</span><span class="s2">&quot;heavy&quot;</span><span class="p">,</span><span class="s2">&quot;top&quot;</span><span class="p">,</span><span class="s2">&quot;dark&quot;</span><span class="p">,</span><span class="s2">&quot;ready&quot;</span><span class="p">,</span><span class="s2">&quot;useful&quot;</span><span class="p">,</span><span class="s2">&quot;not&quot;</span><span class="p">,</span><span class="s2">&quot;out&quot;</span><span class="p">,</span><span class="s2">&quot;up&quot;</span><span class="p">,</span><span class="s2">&quot;so&quot;</span><span class="p">,</span><span class="s2">&quot;then&quot;</span><span class="p">,</span><span class="s2">&quot;more&quot;</span><span class="p">,</span><span class="s2">&quot;now&quot;</span><span class="p">,</span><span class="s2">&quot;just&quot;</span><span class="p">,</span><span class="s2">&quot;also&quot;</span><span class="p">,</span><span class="s2">&quot;well&quot;</span><span class="p">,</span><span class="s2">&quot;only&quot;</span><span class="p">,</span><span class="s2">&quot;very&quot;</span><span class="p">,</span><span class="s2">&quot;how&quot;</span><span class="p">,</span><span class="s2">&quot;when&quot;</span><span class="p">,</span><span class="s2">&quot;as&quot;</span><span class="p">,</span><span class="s2">&quot;mean&quot;</span><span class="p">,</span><span class="s2">&quot;even&quot;</span><span class="p">,</span><span class="s2">&quot;there&quot;</span><span class="p">,</span><span class="s2">&quot;down&quot;</span><span class="p">,</span><span class="s2">&quot;back&quot;</span><span class="p">,</span><span class="s2">&quot;still&quot;</span><span class="p">,</span><span class="s2">&quot;here&quot;</span><span class="p">,</span><span class="s2">&quot;too&quot;</span><span class="p">,</span><span class="s2">&quot;on&quot;</span><span class="p">,</span><span class="s2">&quot;turn&quot;</span><span class="p">,</span><span class="s2">&quot;where&quot;</span><span class="p">,</span><span class="s2">&quot;over&quot;</span><span class="p">,</span><span class="s2">&quot;much&quot;</span><span class="p">,</span><span class="s2">&quot;is&quot;</span><span class="p">,</span><span class="s2">&quot;however&quot;</span><span class="p">,</span><span class="s2">&quot;again&quot;</span><span class="p">,</span><span class="s2">&quot;never&quot;</span><span class="p">,</span><span class="s2">&quot;all&quot;</span><span class="p">,</span><span class="s2">&quot;most&quot;</span><span class="p">,</span><span class="s2">&quot;about&quot;</span><span class="p">,</span><span class="s2">&quot;in&quot;</span><span class="p">,</span><span class="s2">&quot;why&quot;</span><span class="p">,</span><span class="s2">&quot;away&quot;</span><span class="p">,</span><span class="s2">&quot;really&quot;</span><span class="p">,</span><span class="s2">&quot;cause&quot;</span><span class="p">,</span><span class="s2">&quot;off&quot;</span><span class="p">,</span><span class="s2">&quot;always&quot;</span><span class="p">,</span><span class="s2">&quot;next&quot;</span><span class="p">,</span><span class="s2">&quot;rather&quot;</span><span class="p">,</span><span class="s2">&quot;quite&quot;</span><span class="p">,</span><span class="s2">&quot;right&quot;</span><span class="p">,</span><span class="s2">&quot;often&quot;</span><span class="p">,</span><span class="s2">&quot;yet&quot;</span><span class="p">,</span><span class="s2">&quot;perhaps&quot;</span><span class="p">,</span><span class="s2">&quot;already&quot;</span><span class="p">,</span><span class="s2">&quot;least&quot;</span><span class="p">,</span><span class="s2">&quot;almost&quot;</span><span class="p">,</span><span class="s2">&quot;long&quot;</span><span class="p">,</span><span class="s2">&quot;together&quot;</span><span class="p">,</span><span class="s2">&quot;are&quot;</span><span class="p">,</span><span class="s2">&quot;later&quot;</span><span class="p">,</span><span class="s2">&quot;less&quot;</span><span class="p">,</span><span class="s2">&quot;both&quot;</span><span class="p">,</span><span class="s2">&quot;once&quot;</span><span class="p">,</span><span class="s2">&quot;probably&quot;</span><span class="p">,</span><span class="s2">&quot;ever&quot;</span><span class="p">,</span><span class="s2">&quot;no&quot;</span><span class="p">,</span><span class="s2">&quot;far&quot;</span><span class="p">,</span><span class="s2">&quot;actually&quot;</span><span class="p">,</span><span class="s2">&quot;today&quot;</span><span class="p">,</span><span class="s2">&quot;enough&quot;</span><span class="p">,</span><span class="s2">&quot;therefore&quot;</span><span class="p">,</span><span class="s2">&quot;around&quot;</span><span class="p">,</span><span class="s2">&quot;soon&quot;</span><span class="p">,</span><span class="s2">&quot;particularly&quot;</span><span class="p">,</span><span class="s2">&quot;early&quot;</span><span class="p">,</span><span class="s2">&quot;else&quot;</span><span class="p">,</span><span class="s2">&quot;sometimes&quot;</span><span class="p">,</span><span class="s2">&quot;thus&quot;</span><span class="p">,</span><span class="s2">&quot;further&quot;</span><span class="p">,</span><span class="s2">&quot;ago&quot;</span><span class="p">,</span><span class="s2">&quot;yesterday&quot;</span><span class="p">,</span><span class="s2">&quot;usually&quot;</span><span class="p">,</span><span class="s2">&quot;indeed&quot;</span><span class="p">,</span><span class="s2">&quot;certainly&quot;</span><span class="p">,</span><span class="s2">&quot;home&quot;</span><span class="p">,</span><span class="s2">&quot;simply&quot;</span><span class="p">,</span><span class="s2">&quot;especially&quot;</span><span class="p">,</span><span class="s2">&quot;better&quot;</span><span class="p">,</span><span class="s2">&quot;either&quot;</span><span class="p">,</span><span class="s2">&quot;clearly&quot;</span><span class="p">,</span><span class="s2">&quot;instead&quot;</span><span class="p">,</span><span class="s2">&quot;round&quot;</span><span class="p">,</span><span class="s2">&quot;to&quot;</span><span class="p">,</span><span class="s2">&quot;finalty&quot;</span><span class="p">,</span><span class="s2">&quot;please&quot;</span><span class="p">,</span><span class="s2">&quot;forward&quot;</span><span class="p">,</span><span class="s2">&quot;quickly&quot;</span><span class="p">,</span><span class="s2">&quot;recently&quot;</span><span class="p">,</span><span class="s2">&quot;anyway&quot;</span><span class="p">,</span><span class="s2">&quot;suddenly&quot;</span><span class="p">,</span><span class="s2">&quot;generality&quot;</span><span class="p">,</span><span class="s2">&quot;nearly&quot;</span><span class="p">,</span><span class="s2">&quot;obviously&quot;</span><span class="p">,</span><span class="s2">&quot;though&quot;</span><span class="p">,</span><span class="s2">&quot;hard&quot;</span><span class="p">,</span><span class="s2">&quot;okay&quot;</span><span class="p">,</span><span class="s2">&quot;exactly&quot;</span><span class="p">,</span><span class="s2">&quot;above&quot;</span><span class="p">,</span><span class="s2">&quot;maybe&quot;</span><span class="p">,</span><span class="s2">&quot;and&quot;</span><span class="p">,</span><span class="s2">&quot;that&quot;</span><span class="p">,</span><span class="s2">&quot;help&quot;</span><span class="p">,</span><span class="s2">&quot;but&quot;</span><span class="p">,</span><span class="s2">&quot;or&quot;</span><span class="p">,</span><span class="s2">&quot;as&quot;</span><span class="p">,</span><span class="s2">&quot;it&quot;</span><span class="p">,</span><span class="s2">&quot;think&quot;</span><span class="p">,</span><span class="s2">&quot;than&quot;</span><span class="p">,</span><span class="s2">&quot;when&quot;</span><span class="p">,</span><span class="s2">&quot;because&quot;</span><span class="p">,</span><span class="s2">&quot;so&quot;</span><span class="p">,</span><span class="s2">&quot;while&quot;</span><span class="p">,</span><span class="s2">&quot;where&quot;</span><span class="p">,</span><span class="s2">&quot;although&quot;</span><span class="p">,</span><span class="s2">&quot;whether&quot;</span><span class="p">,</span><span class="s2">&quot;until&quot;</span><span class="p">,</span><span class="s2">&quot;though&quot;</span><span class="p">,</span><span class="s2">&quot;since&quot;</span><span class="p">,</span><span class="s2">&quot;alter&quot;</span><span class="p">,</span><span class="s2">&quot;before&quot;</span><span class="p">,</span><span class="s2">&quot;nor&quot;</span><span class="p">,</span><span class="s2">&quot;unless&quot;</span><span class="p">,</span><span class="s2">&quot;once&quot;</span><span class="p">,</span><span class="s2">&quot;the&quot;</span><span class="p">,</span><span class="s2">&quot;a&quot;</span><span class="p">,</span><span class="s2">&quot;form&quot;</span><span class="p">,</span><span class="s2">&quot;this&quot;</span><span class="p">,</span><span class="s2">&quot;this&quot;</span><span class="p">,</span><span class="s2">&quot;that&quot;</span><span class="p">,</span><span class="s2">&quot;which&quot;</span><span class="p">,</span><span class="s2">&quot;an&quot;</span><span class="p">,</span><span class="s2">&quot;their&quot;</span><span class="p">,</span><span class="s2">&quot;what&quot;</span><span class="p">,</span><span class="s2">&quot;all&quot;</span><span class="p">,</span><span class="s2">&quot;her&quot;</span><span class="p">,</span><span class="s2">&quot;some&quot;</span><span class="p">,</span><span class="s2">&quot;its&quot;</span><span class="p">,</span><span class="s2">&quot;my&quot;</span><span class="p">,</span><span class="s2">&quot;your&quot;</span><span class="p">,</span><span class="s2">&quot;no&quot;</span><span class="p">,</span><span class="s2">&quot;these&quot;</span><span class="p">,</span><span class="s2">&quot;any&quot;</span><span class="p">,</span><span class="s2">&quot;such&quot;</span><span class="p">,</span><span class="s2">&quot;our&quot;</span><span class="p">,</span><span class="s2">&quot;many&quot;</span><span class="p">,</span><span class="s2">&quot;those&quot;</span><span class="p">,</span><span class="s2">&quot;own&quot;</span><span class="p">,</span><span class="s2">&quot;more&quot;</span><span class="p">,</span><span class="s2">&quot;same&quot;</span><span class="p">,</span><span class="s2">&quot;each&quot;</span><span class="p">,</span><span class="s2">&quot;another&quot;</span><span class="p">,</span><span class="s2">&quot;next&quot;</span><span class="p">,</span><span class="s2">&quot;most&quot;</span><span class="p">,</span><span class="s2">&quot;both&quot;</span><span class="p">,</span><span class="s2">&quot;every&quot;</span><span class="p">,</span><span class="s2">&quot;much&quot;</span><span class="p">,</span><span class="s2">&quot;little&quot;</span><span class="p">,</span><span class="s2">&quot;several&quot;</span><span class="p">,</span><span class="s2">&quot;half&quot;</span><span class="p">,</span><span class="s2">&quot;whose&quot;</span><span class="p">,</span><span class="s2">&quot;few&quot;</span><span class="p">,</span><span class="s2">&quot;former&quot;</span><span class="p">,</span><span class="s2">&quot;whatever&quot;</span><span class="p">,</span><span class="s2">&quot;either&quot;</span><span class="p">,</span><span class="s2">&quot;less&quot;</span><span class="p">,</span><span class="s2">&quot;to&quot;</span><span class="p">,</span><span class="s2">&quot;yeah&quot;</span><span class="p">,</span><span class="s2">&quot;no&quot;</span><span class="p">,</span><span class="s2">&quot;yes&quot;</span><span class="p">,</span><span class="s2">&quot;well&quot;</span><span class="p">,</span><span class="s2">&quot;will&quot;</span><span class="p">,</span><span class="s2">&quot;would&quot;</span><span class="p">,</span><span class="s2">&quot;can&quot;</span><span class="p">,</span><span class="s2">&quot;could&quot;</span><span class="p">,</span><span class="s2">&quot;should&quot;</span><span class="p">,</span><span class="s2">&quot;may&quot;</span><span class="p">,</span><span class="s2">&quot;must&quot;</span><span class="p">,</span><span class="s2">&quot;might&quot;</span><span class="p">,</span><span class="s2">&quot;shall&quot;</span><span class="p">,</span><span class="s2">&quot;used&quot;</span><span class="p">,</span><span class="s2">&quot;come&quot;</span><span class="p">,</span><span class="s2">&quot;get&quot;</span><span class="p">,</span><span class="s2">&quot;give&quot;</span><span class="p">,</span><span class="s2">&quot;go&quot;</span><span class="p">,</span><span class="s2">&quot;keep&quot;</span><span class="p">,</span><span class="s2">&quot;let&quot;</span><span class="p">,</span><span class="s2">&quot;make&quot;</span><span class="p">,</span><span class="s2">&quot;put&quot;</span><span class="p">,</span><span class="s2">&quot;seem&quot;</span><span class="p">,</span><span class="s2">&quot;take&quot;</span><span class="p">,</span><span class="s2">&quot;be&quot;</span><span class="p">,</span><span class="s2">&quot;do&quot;</span><span class="p">,</span><span class="s2">&quot;have&quot;</span><span class="p">,</span><span class="s2">&quot;say&quot;</span><span class="p">,</span><span class="s2">&quot;see&quot;</span><span class="p">,</span><span class="s2">&quot;send&quot;</span><span class="p">,</span><span class="s2">&quot;may&quot;</span><span class="p">,</span><span class="s2">&quot;will&quot;</span><span class="p">,</span><span class="s2">&quot;about&quot;</span><span class="p">,</span><span class="s2">&quot;across&quot;</span><span class="p">,</span><span class="s2">&quot;after&quot;</span><span class="p">,</span><span class="s2">&quot;against&quot;</span><span class="p">,</span><span class="s2">&quot;among&quot;</span><span class="p">,</span><span class="s2">&quot;at&quot;</span><span class="p">,</span><span class="s2">&quot;before&quot;</span><span class="p">,</span><span class="s2">&quot;between&quot;</span><span class="p">,</span><span class="s2">&quot;by&quot;</span><span class="p">,</span><span class="s2">&quot;down&quot;</span><span class="p">,</span><span class="s2">&quot;from&quot;</span><span class="p">,</span><span class="s2">&quot;in&quot;</span><span class="p">,</span><span class="s2">&quot;off&quot;</span><span class="p">,</span><span class="s2">&quot;on&quot;</span><span class="p">,</span><span class="s2">&quot;over&quot;</span><span class="p">,</span><span class="s2">&quot;through&quot;</span><span class="p">,</span><span class="s2">&quot;to&quot;</span><span class="p">,</span><span class="s2">&quot;under&quot;</span><span class="p">,</span><span class="s2">&quot;up&quot;</span><span class="p">,</span><span class="s2">&quot;with&quot;</span><span class="p">,</span><span class="s2">&quot;as&quot;</span><span class="p">,</span><span class="s2">&quot;for&quot;</span><span class="p">,</span><span class="s2">&quot;of&quot;</span><span class="p">,</span><span class="s2">&quot;till&quot;</span><span class="p">,</span><span class="s2">&quot;than&quot;</span><span class="p">,</span><span class="s2">&quot;a&quot;</span><span class="p">,</span><span class="s2">&quot;the&quot;</span><span class="p">,</span><span class="s2">&quot;all&quot;</span><span class="p">,</span><span class="s2">&quot;any&quot;</span><span class="p">,</span><span class="s2">&quot;every&quot;</span><span class="p">,</span><span class="s2">&quot;little&quot;</span><span class="p">,</span><span class="s2">&quot;much&quot;</span><span class="p">,</span><span class="s2">&quot;no&quot;</span><span class="p">,</span><span class="s2">&quot;other&quot;</span><span class="p">,</span><span class="s2">&quot;some&quot;</span><span class="p">,</span><span class="s2">&quot;such&quot;</span><span class="p">,</span><span class="s2">&quot;that&quot;</span><span class="p">,</span><span class="s2">&quot;this&quot;</span><span class="p">,</span><span class="s2">&quot;I &quot;</span><span class="p">,</span><span class="s2">&quot;he&quot;</span><span class="p">,</span><span class="s2">&quot;you&quot;</span><span class="p">,</span><span class="s2">&quot;who&quot;</span><span class="p">,</span><span class="s2">&quot;and&quot;</span><span class="p">,</span><span class="s2">&quot;because&quot;</span><span class="p">,</span><span class="s2">&quot;but&quot;</span><span class="p">,</span><span class="s2">&quot;or&quot;</span><span class="p">,</span><span class="s2">&quot;if&quot;</span><span class="p">,</span><span class="s2">&quot;though&quot;</span><span class="p">,</span><span class="s2">&quot;while&quot;</span><span class="p">,</span><span class="s2">&quot;how&quot;</span><span class="p">,</span><span class="s2">&quot;when&quot;</span><span class="p">,</span><span class="s2">&quot;where&quot;</span><span class="p">,</span><span class="s2">&quot;why&quot;</span><span class="p">,</span><span class="s2">&quot;again&quot;</span><span class="p">,</span><span class="s2">&quot;ever&quot;</span><span class="p">,</span><span class="s2">&quot;far&quot;</span><span class="p">,</span><span class="s2">&quot;forward&quot;</span><span class="p">,</span><span class="s2">&quot;here&quot;</span><span class="p">,</span><span class="s2">&quot;near&quot;</span><span class="p">,</span><span class="s2">&quot;now&quot;</span><span class="p">,</span><span class="s2">&quot;out&quot;</span><span class="p">,</span><span class="s2">&quot;still&quot;</span><span class="p">,</span><span class="s2">&quot;then&quot;</span><span class="p">,</span><span class="s2">&quot;there&quot;</span><span class="p">,</span><span class="s2">&quot;together&quot;</span><span class="p">,</span><span class="s2">&quot;well&quot;</span><span class="p">,</span><span class="s2">&quot;almost&quot;</span><span class="p">,</span><span class="s2">&quot;enough&quot;</span><span class="p">,</span><span class="s2">&quot;even&quot;</span><span class="p">,</span><span class="s2">&quot;not&quot;</span><span class="p">,</span><span class="s2">&quot;only&quot;</span><span class="p">,</span><span class="s2">&quot;quite&quot;</span><span class="p">,</span><span class="s2">&quot;so&quot;</span><span class="p">,</span><span class="s2">&quot;very&quot;</span><span class="p">,</span><span class="s2">&quot;tomorrow&quot;</span><span class="p">,</span><span class="s2">&quot;yesterday&quot;</span><span class="p">,</span><span class="s2">&quot;north&quot;</span><span class="p">,</span><span class="s2">&quot;south&quot;</span><span class="p">,</span><span class="s2">&quot;east&quot;</span><span class="p">,</span><span class="s2">&quot;west&quot;</span><span class="p">,</span><span class="s2">&quot;please&quot;</span><span class="p">,</span><span class="s2">&quot;yes&quot;</span><span class="p">,</span><span class="s2">&quot;able&quot;</span><span class="p">,</span><span class="s2">&quot;acid&quot;</span><span class="p">,</span><span class="s2">&quot;angry&quot;</span><span class="p">,</span><span class="s2">&quot;automatic&quot;</span><span class="p">,</span><span class="s2">&quot;beautiful&quot;</span><span class="p">,</span><span class="s2">&quot;black&quot;</span><span class="p">,</span><span class="s2">&quot;boiling&quot;</span><span class="p">,</span><span class="s2">&quot;bright&quot;</span><span class="p">,</span><span class="s2">&quot;broken&quot;</span><span class="p">,</span><span class="s2">&quot;brown&quot;</span><span class="p">,</span><span class="s2">&quot;cheap&quot;</span><span class="p">,</span><span class="s2">&quot;chemical&quot;</span><span class="p">,</span><span class="s2">&quot;chief&quot;</span><span class="p">,</span><span class="s2">&quot;clean&quot;</span><span class="p">,</span><span class="s2">&quot;clear&quot;</span><span class="p">,</span><span class="s2">&quot;common&quot;</span><span class="p">,</span><span class="s2">&quot;complex&quot;</span><span class="p">,</span><span class="s2">&quot;conscious&quot;</span><span class="p">,</span><span class="s2">&quot;cut&quot;</span><span class="p">,</span><span class="s2">&quot;deep&quot;</span><span class="p">,</span><span class="s2">&quot;dependent&quot;</span><span class="p">,</span><span class="s2">&quot;early&quot;</span><span class="p">,</span><span class="s2">&quot;elastic&quot;</span><span class="p">,</span><span class="s2">&quot;electric&quot;</span><span class="p">,</span><span class="s2">&quot;equal&quot;</span><span class="p">,</span><span class="s2">&quot;fat&quot;</span><span class="p">,</span><span class="s2">&quot;fertile&quot;</span><span class="p">,</span><span class="s2">&quot;first&quot;</span><span class="p">,</span><span class="s2">&quot;fixed&quot;</span><span class="p">,</span><span class="s2">&quot;flat&quot;</span><span class="p">,</span><span class="s2">&quot;free&quot;</span><span class="p">,</span><span class="s2">&quot;frequent&quot;</span><span class="p">,</span><span class="s2">&quot;full&quot;</span><span class="p">,</span><span class="s2">&quot;general&quot;</span><span class="p">,</span><span class="s2">&quot;good&quot;</span><span class="p">,</span><span class="s2">&quot;great&quot;</span><span class="p">,</span><span class="s2">&quot;hanging&quot;</span><span class="p">,</span><span class="s2">&quot;happy&quot;</span><span class="p">,</span><span class="s2">&quot;hard&quot;</span><span class="p">,</span><span class="s2">&quot;healthy&quot;</span><span class="p">,</span><span class="s2">&quot;high&quot;</span><span class="p">,</span><span class="s2">&quot;hollow&quot;</span><span class="p">,</span><span class="s2">&quot;important&quot;</span><span class="p">,</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span><span class="s2">&quot;like&quot;</span><span class="p">,</span><span class="s2">&quot;living&quot;</span><span class="p">,</span><span class="s2">&quot;long&quot;</span><span class="p">,</span><span class="s2">&quot;male&quot;</span><span class="p">,</span><span class="s2">&quot;married&quot;</span><span class="p">,</span><span class="s2">&quot;material&quot;</span><span class="p">,</span><span class="s2">&quot;medical&quot;</span><span class="p">,</span><span class="s2">&quot;military&quot;</span><span class="p">,</span><span class="s2">&quot;natural&quot;</span><span class="p">,</span><span class="s2">&quot;necessary&quot;</span><span class="p">,</span><span class="s2">&quot;new&quot;</span><span class="p">,</span><span class="s2">&quot;normal&quot;</span><span class="p">,</span><span class="s2">&quot;open&quot;</span><span class="p">,</span><span class="s2">&quot;parallel&quot;</span><span class="p">,</span><span class="s2">&quot;past&quot;</span><span class="p">,</span><span class="s2">&quot;physical&quot;</span><span class="p">,</span><span class="s2">&quot;political&quot;</span><span class="p">,</span><span class="s2">&quot;poor&quot;</span><span class="p">,</span><span class="s2">&quot;possible&quot;</span><span class="p">,</span><span class="s2">&quot;present&quot;</span><span class="p">,</span><span class="s2">&quot;private&quot;</span><span class="p">,</span><span class="s2">&quot;probable&quot;</span><span class="p">,</span><span class="s2">&quot;quick&quot;</span><span class="p">,</span><span class="s2">&quot;quiet&quot;</span><span class="p">,</span><span class="s2">&quot;ready&quot;</span><span class="p">,</span><span class="s2">&quot;red&quot;</span><span class="p">,</span><span class="s2">&quot;regular&quot;</span><span class="p">,</span><span class="s2">&quot;responsible&quot;</span><span class="p">,</span><span class="s2">&quot;right&quot;</span><span class="p">,</span><span class="s2">&quot;round&quot;</span><span class="p">,</span><span class="s2">&quot;same&quot;</span><span class="p">,</span><span class="s2">&quot;second&quot;</span><span class="p">,</span><span class="s2">&quot;separate&quot;</span><span class="p">,</span><span class="s2">&quot;serious&quot;</span><span class="p">,</span><span class="s2">&quot;sharp&quot;</span><span class="p">,</span><span class="s2">&quot;smooth&quot;</span><span class="p">,</span><span class="s2">&quot;sticky&quot;</span><span class="p">,</span><span class="s2">&quot;stiff&quot;</span><span class="p">,</span><span class="s2">&quot;straight&quot;</span><span class="p">,</span><span class="s2">&quot;strong&quot;</span><span class="p">,</span><span class="s2">&quot;sudden&quot;</span><span class="p">,</span><span class="s2">&quot;sweet&quot;</span><span class="p">,</span><span class="s2">&quot;tall&quot;</span><span class="p">,</span><span class="s2">&quot;thick&quot;</span><span class="p">,</span><span class="s2">&quot;tight&quot;</span><span class="p">,</span><span class="s2">&quot;tired&quot;</span><span class="p">,</span><span class="s2">&quot;true&quot;</span><span class="p">,</span><span class="s2">&quot;violent&quot;</span><span class="p">,</span><span class="s2">&quot;waiting&quot;</span><span class="p">,</span><span class="s2">&quot;warm&quot;</span><span class="p">,</span><span class="s2">&quot;wet&quot;</span><span class="p">,</span><span class="s2">&quot;wide&quot;</span><span class="p">,</span><span class="s2">&quot;wise&quot;</span><span class="p">,</span><span class="s2">&quot;yellow&quot;</span><span class="p">,</span><span class="s2">&quot;young&quot;</span><span class="p">,</span><span class="s2">&quot;awake&quot;</span><span class="p">,</span><span class="s2">&quot;bad&quot;</span><span class="p">,</span><span class="s2">&quot;bent&quot;</span><span class="p">,</span><span class="s2">&quot;bitter&quot;</span><span class="p">,</span><span class="s2">&quot;blue&quot;</span><span class="p">,</span><span class="s2">&quot;certain&quot;</span><span class="p">,</span><span class="s2">&quot;cold&quot;</span><span class="p">,</span><span class="s2">&quot;complete&quot;</span><span class="p">,</span><span class="s2">&quot;cruel&quot;</span><span class="p">,</span><span class="s2">&quot;dark&quot;</span><span class="p">,</span><span class="s2">&quot;dead&quot;</span><span class="p">,</span><span class="s2">&quot;dear&quot;</span><span class="p">,</span><span class="s2">&quot;delicate&quot;</span><span class="p">,</span><span class="s2">&quot;different&quot;</span><span class="p">,</span><span class="s2">&quot;dirty&quot;</span><span class="p">,</span><span class="s2">&quot;dry&quot;</span><span class="p">,</span><span class="s2">&quot;false&quot;</span><span class="p">,</span><span class="s2">&quot;feeble&quot;</span><span class="p">,</span><span class="s2">&quot;female&quot;</span><span class="p">,</span><span class="s2">&quot;foolish&quot;</span><span class="p">,</span><span class="s2">&quot;future&quot;</span><span class="p">,</span><span class="s2">&quot;green&quot;</span><span class="p">,</span><span class="s2">&quot;ill&quot;</span><span class="p">,</span><span class="s2">&quot;last&quot;</span><span class="p">,</span><span class="s2">&quot;late&quot;</span><span class="p">,</span><span class="s2">&quot;left&quot;</span><span class="p">,</span><span class="s2">&quot;loose&quot;</span><span class="p">,</span><span class="s2">&quot;loud&quot;</span><span class="p">,</span><span class="s2">&quot;low&quot;</span><span class="p">,</span><span class="s2">&quot;mixed&quot;</span><span class="p">,</span><span class="s2">&quot;narrow&quot;</span><span class="p">,</span><span class="s2">&quot;old&quot;</span><span class="p">,</span><span class="s2">&quot;opposite&quot;</span><span class="p">,</span><span class="s2">&quot;public&quot;</span><span class="p">,</span><span class="s2">&quot;rough&quot;</span><span class="p">,</span><span class="s2">&quot;sad&quot;</span><span class="p">,</span><span class="s2">&quot;safe&quot;</span><span class="p">,</span><span class="s2">&quot;secret&quot;</span><span class="p">,</span><span class="s2">&quot;short&quot;</span><span class="p">,</span><span class="s2">&quot;shut&quot;</span><span class="p">,</span><span class="s2">&quot;simple&quot;</span><span class="p">,</span><span class="s2">&quot;slow&quot;</span><span class="p">,</span><span class="s2">&quot;small&quot;</span><span class="p">,</span><span class="s2">&quot;soft&quot;</span><span class="p">,</span><span class="s2">&quot;solid&quot;</span><span class="p">,</span><span class="s2">&quot;special&quot;</span><span class="p">,</span><span class="s2">&quot;strange&quot;</span><span class="p">,</span><span class="s2">&quot;thin&quot;</span><span class="p">,</span><span class="s2">&quot;white&quot;</span><span class="p">,</span><span class="s2">&quot;wrong&quot;</span><span class="p">,</span><span class="s2">&quot;this&quot;</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Go Snippets]]></title>
    <link href="http://zacg.github.io/blog/2014/07/21/go-snippets/"/>
    <updated>2014-07-21T12:08:28-04:00</updated>
    <id>http://zacg.github.io/blog/2014/07/21/go-snippets</id>
    <content type="html"><![CDATA[<p>
    Some random code snippets I wrote while learning GO.
</p>




<h2>Bitwise Ops</h2>




<figure class='code'><figcaption><span>Flip Bits </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="c1">//num is odd or even</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">isEven</span><span class="p">(</span><span class="nx">n</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">bool</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">n</span><span class="o">&amp;</span><span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//test nth bit is set</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">isSet</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">n</span> <span class="kt">uint</span><span class="p">)</span> <span class="kt">bool</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">(</span><span class="nx">x</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="nx">n</span><span class="p">))</span> <span class="p">&gt;</span> <span class="mi">0</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">setBit</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">n</span> <span class="kt">uint</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">x</span> <span class="p">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="nx">n</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">unSetBit</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">n</span> <span class="kt">uint</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// negate = all 0 except 1 position</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">x</span> <span class="o">&amp;</span> <span class="p">^(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="nx">n</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">toggleBit</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">n</span> <span class="kt">uint</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// ^ = xor = both same = 0 else 1</span>
</span><span class='line'>  <span class="c1">// only of or is true</span>
</span><span class='line'>  <span class="c1">//xor twice returns original value</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">x</span> <span class="p">^</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="nx">n</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//turn off rightmost 1-bit</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">turnOffRightMost</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">x</span> <span class="o">&amp;</span> <span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//turns off all other bits except rightmost &quot;on&quot; bit</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">isolateRightmostBit</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">x</span> <span class="o">&amp;</span> <span class="p">(</span><span class="o">-</span><span class="nx">x</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//produces all 1&#39;s if x = 0</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">rightPropogateRightmostBit</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">x</span> <span class="p">|</span> <span class="p">(</span><span class="nx">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//flip all bits in integer</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">flipBits</span><span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">uint</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="p">^</span><span class="nb">uint</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Sorting</h2>




<figure class='code'><figcaption><span>Counting Sort </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">func</span> <span class="nx">CountingSort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">maxVal</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">histogram</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">maxVal</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">val</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">vals</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">histogram</span><span class="p">[</span><span class="nx">val</span><span class="p">]</span><span class="o">++</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">pos</span> <span class="o">:=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="nx">maxVal</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">ok</span> <span class="o">:=</span> <span class="nx">histogram</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span> <span class="nx">ok</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">for</span> <span class="nx">j</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="p">&lt;</span> <span class="nx">histogram</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span> <span class="nx">j</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">vals</span><span class="p">[</span><span class="nx">pos</span><span class="p">]</span> <span class="p">=</span> <span class="nx">i</span>
</span><span class='line'>              <span class="nx">pos</span><span class="o">++</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Radix Sort </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">func</span> <span class="nx">RadixSort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">m</span> <span class="o">:=</span> <span class="nx">vals</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>  <span class="kd">const</span> <span class="nx">base</span> <span class="p">=</span> <span class="mi">10</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">val</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">vals</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">val</span> <span class="p">&gt;</span> <span class="nx">m</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">m</span> <span class="p">=</span> <span class="nx">val</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">exp</span> <span class="o">:=</span> <span class="mi">1</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">m</span><span class="o">/</span><span class="nx">exp</span> <span class="p">&gt;</span> <span class="mi">0</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">bucket</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([][]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">base</span><span class="p">)</span>
</span><span class='line'>      <span class="c1">//count keys</span>
</span><span class='line'>      <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="nx">vals</span><span class="p">);</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">key</span> <span class="o">:=</span> <span class="p">(</span><span class="nx">vals</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">/</span> <span class="nx">exp</span><span class="p">)</span> <span class="o">%</span> <span class="nx">base</span>
</span><span class='line'>          <span class="nx">bucket</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">bucket</span><span class="p">[</span><span class="nx">key</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nx">idx</span> <span class="o">:=</span> <span class="mi">0</span>
</span><span class='line'>      <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="nx">bucket</span><span class="p">);</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">for</span> <span class="nx">j</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="p">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="nx">bucket</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span> <span class="nx">j</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">vals</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">=</span> <span class="nx">bucket</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">j</span><span class="p">]</span>
</span><span class='line'>              <span class="nx">idx</span><span class="o">++</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nx">exp</span> <span class="o">*=</span> <span class="mi">10</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Insert Sort </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">func</span> <span class="nx">InsertSort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">vals</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">j</span> <span class="o">:=</span> <span class="nx">i</span>
</span><span class='line'>      <span class="k">for</span> <span class="nx">j</span> <span class="p">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="p">&gt;</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">j</span><span class="p">]</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">vals</span><span class="p">[</span><span class="nx">j</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="p">=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">j</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">j</span><span class="p">]</span>
</span><span class='line'>          <span class="nx">j</span><span class="o">--</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Merge Sort </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">func</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">helper</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">low</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">middle</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">high</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//copy both halves into helper slice</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="nx">low</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="nx">high</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">helper</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">helperLeft</span> <span class="o">:=</span> <span class="nx">low</span>
</span><span class='line'>  <span class="nx">helperRight</span> <span class="o">:=</span> <span class="nx">middle</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>  <span class="nx">current</span> <span class="o">:=</span> <span class="nx">low</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//iterate through helper array. Compare left and right</span>
</span><span class='line'>  <span class="c1">// half, copying the smaller of the 2 into original</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">helperLeft</span> <span class="o">&lt;=</span> <span class="nx">middle</span> <span class="o">&amp;&amp;</span> <span class="nx">helperRight</span> <span class="o">&lt;=</span> <span class="nx">high</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">helper</span><span class="p">[</span><span class="nx">helperLeft</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="nx">helper</span><span class="p">[</span><span class="nx">helperRight</span><span class="p">]</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">vals</span><span class="p">[</span><span class="nx">current</span><span class="p">]</span> <span class="p">=</span> <span class="nx">helper</span><span class="p">[</span><span class="nx">helperLeft</span><span class="p">]</span>
</span><span class='line'>          <span class="nx">helperLeft</span><span class="o">++</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">vals</span><span class="p">[</span><span class="nx">current</span><span class="p">]</span> <span class="p">=</span> <span class="nx">helper</span><span class="p">[</span><span class="nx">helperRight</span><span class="p">]</span>
</span><span class='line'>          <span class="nx">helperRight</span><span class="o">++</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="nx">current</span><span class="o">++</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Copy the rest of the left side of the array into the</span>
</span><span class='line'>  <span class="c1">// target array.</span>
</span><span class='line'>  <span class="nx">remaining</span> <span class="o">:=</span> <span class="nx">middle</span> <span class="o">-</span> <span class="nx">helperLeft</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="nx">remaining</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">vals</span><span class="p">[</span><span class="nx">current</span><span class="o">+</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nx">helper</span><span class="p">[</span><span class="nx">helperLeft</span><span class="o">+</span><span class="nx">i</span><span class="p">]</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">mergesort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">helper</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">low</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">high</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="nx">low</span> <span class="p">&lt;</span> <span class="nx">high</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">middle</span> <span class="o">:=</span> <span class="p">(</span><span class="nx">low</span> <span class="o">+</span> <span class="nx">high</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
</span><span class='line'>      <span class="nx">mergesort</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">helper</span><span class="p">,</span> <span class="nx">low</span><span class="p">,</span> <span class="nx">middle</span><span class="p">)</span>
</span><span class='line'>      <span class="nx">mergesort</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">helper</span><span class="p">,</span> <span class="nx">middle</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nx">high</span><span class="p">)</span>
</span><span class='line'>      <span class="nx">merge</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">helper</span><span class="p">,</span> <span class="nx">low</span><span class="p">,</span> <span class="nx">middle</span><span class="p">,</span> <span class="nx">high</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">MergeSort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">helper</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">vals</span><span class="p">))</span>
</span><span class='line'>  <span class="nx">mergesort</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">helper</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">vals</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Quick Sort </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">func</span> <span class="nx">partition</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">left</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">right</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">middle</span> <span class="o">:=</span> <span class="p">(</span><span class="nx">left</span> <span class="o">+</span> <span class="nx">right</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
</span><span class='line'>  <span class="nx">pivotVal</span> <span class="o">:=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">middle</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//swap middle/right</span>
</span><span class='line'>  <span class="nx">vals</span><span class="p">[</span><span class="nx">middle</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">right</span><span class="p">]</span> <span class="p">=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">right</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">middle</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">lessPointer</span> <span class="o">:=</span> <span class="nx">left</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">greaterPointer</span> <span class="o">:=</span> <span class="nx">left</span><span class="p">;</span> <span class="nx">greaterPointer</span> <span class="p">&lt;</span> <span class="nx">right</span><span class="p">;</span> <span class="nx">greaterPointer</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">greaterPointer</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="nx">pivotVal</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">vals</span><span class="p">[</span><span class="nx">greaterPointer</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">lessPointer</span><span class="p">]</span> <span class="p">=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">lessPointer</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">greaterPointer</span><span class="p">]</span>
</span><span class='line'>          <span class="nx">lessPointer</span><span class="o">++</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">vals</span><span class="p">[</span><span class="nx">lessPointer</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">right</span><span class="p">]</span> <span class="p">=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">right</span><span class="p">],</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">lessPointer</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">lessPointer</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">quickSort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">min</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">max</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="nx">min</span> <span class="p">&lt;</span> <span class="nx">max</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">p</span> <span class="o">:=</span> <span class="nx">partition</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">min</span><span class="p">,</span> <span class="nx">max</span><span class="p">)</span>
</span><span class='line'>      <span class="nx">quickSort</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">min</span><span class="p">,</span> <span class="nx">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="nx">quickSort</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">p</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nx">max</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">QuickSort</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">quickSort</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">vals</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Data Structures</h2>




<figure class='code'><figcaption><span>Heap </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">type</span> <span class="nx">Heap</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">data</span> <span class="p">[]</span><span class="kt">int</span>
</span><span class='line'>  <span class="c1">//maxSize      int</span>
</span><span class='line'>  <span class="c1">//itemsInArray int</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">NewHeap</span><span class="p">(</span><span class="nx">size</span> <span class="kt">int</span><span class="p">)</span> <span class="o">*</span><span class="nx">Heap</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">h</span> <span class="o">:=</span> <span class="nb">new</span><span class="p">(</span><span class="nx">Heap</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">data</span> <span class="p">=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">size</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">h</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//moves element up to its proper position</span>
</span><span class='line'><span class="c1">//respecting binary tree property</span>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">h</span> <span class="o">*</span><span class="nx">Heap</span><span class="p">)</span> <span class="nx">up</span><span class="p">(</span><span class="nx">idx</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">parent</span> <span class="o">:=</span> <span class="p">(</span><span class="nx">idx</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">idx</span> <span class="o">==</span> <span class="nx">parent</span> <span class="o">||</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">&lt;</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">parent</span><span class="p">]</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">//at end of array or idx is in proper position</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="c1">//Swap with parent</span>
</span><span class='line'>      <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">parent</span><span class="p">],</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">=</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">idx</span><span class="p">],</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">parent</span><span class="p">]</span>
</span><span class='line'>      <span class="nx">idx</span> <span class="p">=</span> <span class="nx">parent</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">h</span> <span class="o">*</span><span class="nx">Heap</span><span class="p">)</span> <span class="nx">down</span><span class="p">(</span><span class="nx">idx</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">end</span> <span class="o">:=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">//start with left child</span>
</span><span class='line'>      <span class="nx">child</span> <span class="o">:=</span> <span class="mi">2</span><span class="o">*</span><span class="nx">idx</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">child</span> <span class="p">&gt;</span> <span class="nx">end</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">child</span><span class="o">+</span><span class="mi">1</span> <span class="p">&lt;</span> <span class="nx">end</span> <span class="o">&amp;&amp;</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">child</span><span class="p">]</span> <span class="p">&lt;</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">child</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">//use right child</span>
</span><span class='line'>          <span class="nx">child</span><span class="o">++</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">child</span><span class="p">]</span> <span class="p">&lt;</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">//proper position</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">//swap parent with child</span>
</span><span class='line'>      <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">child</span><span class="p">],</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">=</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">idx</span><span class="p">],</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nx">child</span><span class="p">]</span>
</span><span class='line'>      <span class="c1">//move to grandchildren</span>
</span><span class='line'>      <span class="nx">idx</span> <span class="p">=</span> <span class="nx">child</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">h</span> <span class="o">*</span><span class="nx">Heap</span><span class="p">)</span> <span class="nx">Pop</span><span class="p">()</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">result</span> <span class="o">:=</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">down</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">data</span> <span class="p">=</span> <span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">[:</span><span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//shrink when excess capacity hits 3/4</span>
</span><span class='line'>  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="nb">cap</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span><span class="o">/</span><span class="mi">4</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">h</span><span class="p">.</span><span class="nx">resize</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span> <span class="o">/</span> <span class="mi">4</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">result</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">h</span> <span class="o">*</span><span class="nx">Heap</span><span class="p">)</span> <span class="nx">resize</span><span class="p">(</span><span class="nx">size</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">len</span> <span class="o">:=</span> <span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">temp</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">len</span><span class="p">,</span> <span class="nx">size</span><span class="p">)</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">idx</span><span class="p">,</span> <span class="nx">val</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">temp</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">temp</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">=</span> <span class="nx">val</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">data</span> <span class="p">=</span> <span class="nx">temp</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">h</span> <span class="o">*</span><span class="nx">Heap</span><span class="p">)</span> <span class="nx">Push</span><span class="p">(</span><span class="nx">v</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">data</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">h</span><span class="p">.</span><span class="nx">up</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="c1">//grow when cap hit</span>
</span><span class='line'>  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span> <span class="o">==</span> <span class="nb">cap</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">h</span><span class="p">.</span><span class="nx">resize</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">data</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Hash Table </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Linked List </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kd">type</span> <span class="nx">Node</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">Data</span> <span class="kt">int</span>
</span><span class='line'>  <span class="nx">Next</span> <span class="o">*</span><span class="nx">Node</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="p">(</span><span class="nx">n</span> <span class="o">*</span><span class="nx">Node</span><span class="p">)</span> <span class="nx">Append</span><span class="p">(</span><span class="nx">newNode</span> <span class="o">*</span><span class="nx">Node</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">temp</span> <span class="o">:=</span> <span class="nx">n</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">temp</span> <span class="p">=</span> <span class="nx">temp</span><span class="p">.</span><span class="nx">Next</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">n</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">newNode</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">reverseLinkedList</span><span class="p">(</span><span class="nx">node</span> <span class="o">*</span><span class="nx">Node</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">prev</span> <span class="o">*</span><span class="nx">Node</span>
</span><span class='line'>  <span class="nx">current</span> <span class="o">:=</span> <span class="nx">node</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="nx">current</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">next</span> <span class="o">:=</span> <span class="nx">current</span><span class="p">.</span><span class="nx">Next</span>
</span><span class='line'>      <span class="nx">current</span><span class="p">.</span><span class="nx">Next</span> <span class="p">=</span> <span class="nx">prev</span>
</span><span class='line'>      <span class="nx">prev</span> <span class="p">=</span> <span class="nx">current</span>
</span><span class='line'>      <span class="nx">current</span> <span class="p">=</span> <span class="nx">next</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">node</span> <span class="p">=</span> <span class="nx">prev</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Stack </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="c1">//simple stack structure</span>
</span><span class='line'>  <span class="kd">type</span> <span class="nx">stack</span> <span class="p">[]</span><span class="kt">int</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="nx">stack</span><span class="p">)</span> <span class="nx">Empty</span><span class="p">()</span> <span class="kt">bool</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">}</span>
</span><span class='line'>  <span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="nx">stack</span><span class="p">)</span> <span class="nx">Peek</span><span class="p">()</span> <span class="kt">int</span>   <span class="p">{</span> <span class="k">return</span> <span class="nx">s</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="p">}</span>
</span><span class='line'>  <span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><span class="nx">stack</span><span class="p">)</span> <span class="nx">Put</span><span class="p">(</span><span class="nx">i</span> <span class="kt">int</span><span class="p">)</span>  <span class="p">{</span> <span class="p">(</span><span class="o">*</span><span class="nx">s</span><span class="p">)</span> <span class="p">=</span> <span class="nb">append</span><span class="p">((</span><span class="o">*</span><span class="nx">s</span><span class="p">),</span> <span class="nx">i</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><span class="nx">stack</span><span class="p">)</span> <span class="nx">Pop</span><span class="p">()</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">d</span> <span class="o">:=</span> <span class="p">(</span><span class="o">*</span><span class="nx">s</span><span class="p">)[</span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">s</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'>      <span class="p">(</span><span class="o">*</span><span class="nx">s</span><span class="p">)</span> <span class="p">=</span> <span class="p">(</span><span class="o">*</span><span class="nx">s</span><span class="p">)[:</span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">s</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">d</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<h2>Misc</h2>




<figure class='code'><figcaption><span>And 2 Collections </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Binary Search </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="c1">//Binary search</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">Search</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">target</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">binarySearch</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">vals</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">binarySearch</span><span class="p">(</span><span class="nx">vals</span> <span class="p">[]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">target</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">start</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">end</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">start</span> <span class="p">&gt;</span> <span class="nx">end</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">//not found</span>
</span><span class='line'>          <span class="k">return</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">middle</span> <span class="o">:=</span> <span class="nb">int</span><span class="p">(</span><span class="nx">math</span><span class="p">.</span><span class="nx">Floor</span><span class="p">((</span><span class="nb">float64</span><span class="p">(</span><span class="nx">start</span><span class="p">)</span> <span class="o">+</span> <span class="nb">float64</span><span class="p">(</span><span class="nx">end</span><span class="p">))</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span>
</span><span class='line'>      <span class="nx">value</span> <span class="o">:=</span> <span class="nx">vals</span><span class="p">[</span><span class="nx">middle</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">value</span> <span class="p">&gt;</span> <span class="nx">target</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">binarySearch</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> <span class="nx">start</span><span class="p">,</span> <span class="nx">middle</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">value</span> <span class="p">&lt;</span> <span class="nx">target</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">binarySearch</span><span class="p">(</span><span class="nx">vals</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> <span class="nx">middle</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="nx">end</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="nx">middle</span> <span class="c1">//found</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Reverse Polish Calculator </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   
</span><span class='line'>  <span class="c1">//reverse polish notation calculator</span>
</span><span class='line'>  <span class="c1">//takes a string like &quot;699+/&quot;</span>
</span><span class='line'>  <span class="c1">//prints result e.g. 9</span>
</span><span class='line'>  <span class="kd">func</span> <span class="nx">ReversePolishCalculator</span><span class="p">(</span><span class="nx">expression</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">s</span> <span class="nx">stack</span>
</span><span class='line'>  <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">c</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">expression</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">switch</span> <span class="nx">c</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">case</span> <span class="sc">&#39;+&#39;</span><span class="p">:</span>
</span><span class='line'>          <span class="nx">a</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">b</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">s</span><span class="p">.</span><span class="nx">Put</span><span class="p">(</span><span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">)</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="k">case</span> <span class="sc">&#39;-&#39;</span><span class="p">:</span>
</span><span class='line'>          <span class="nx">a</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">b</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">s</span><span class="p">.</span><span class="nx">Put</span><span class="p">(</span><span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">)</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="k">case</span> <span class="sc">&#39;/&#39;</span><span class="p">:</span>
</span><span class='line'>          <span class="nx">a</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">b</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">s</span><span class="p">.</span><span class="nx">Put</span><span class="p">(</span><span class="nx">a</span> <span class="o">/</span> <span class="nx">b</span><span class="p">)</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="k">case</span> <span class="sc">&#39;*&#39;</span><span class="p">:</span>
</span><span class='line'>          <span class="nx">a</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">b</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">()</span>
</span><span class='line'>          <span class="nx">s</span><span class="p">.</span><span class="nx">Put</span><span class="p">(</span><span class="nx">a</span> <span class="o">*</span> <span class="nx">b</span><span class="p">)</span>
</span><span class='line'>          <span class="k">break</span>
</span><span class='line'>      <span class="k">default</span><span class="p">:</span>
</span><span class='line'>          <span class="nx">s</span><span class="p">.</span><span class="nx">Put</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">-</span> <span class="mi">48</span><span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//result</span>
</span><span class='line'>  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Printf</span><span class="p">(</span><span class="s">&quot;%v=%v&quot;</span><span class="p">,</span> <span class="nx">expression</span><span class="p">,</span> <span class="nx">s</span><span class="p">.</span><span class="nx">Pop</span><span class="p">())</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Porting Nupic to Go]]></title>
    <link href="http://zacg.github.io/blog/2014/06/28/porting-nupic-to-go/"/>
    <updated>2014-06-28T19:26:41-04:00</updated>
    <id>http://zacg.github.io/blog/2014/06/28/porting-nupic-to-go</id>
    <content type="html"><![CDATA[<p>Recently I ported the core parts of the Nupic project to Go.</p>

<p><a href="https://github.com/numenta/nupic/">Nupic</a> is Numenta&#8217;s current open source implementation of Jeff Hawkin&#8217;s hierarchical temporal memory(HTM) model. It currently consists of the CLA (cortical learning algorithm) which is a single stage/layer of the HTM implemented in a mix of python and C++.</p>

<p>In an effort to better understand the difference between the current implementation and the whitepaper I decided to try and port the spatial and temporal poolers to Go. Porting line by line gave me the opportunity to understand the design better as well as it&#8217;s dependencies: python, numpy, etc&#8230;</p>

<p>One of the more difficult parts of this project was interpreting the numpy expressions and translating them into a statically typed language. A few nested numpy expressions can easily end up being 10 of lines of Go.</p>

<p>The result is 2 simple APIs for the spatial and temporal pooler which are go gettable.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>    go get github.com/zacg/htm
</span><span class='line'>    go get github.com/zacg/htm/utils
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Spatial Pooler Example </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="nx">ssp</span> <span class="o">:=</span> <span class="nx">htm</span><span class="p">.</span><span class="nx">NewSpParams</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">ColumnDimensions</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">64</span><span class="p">,</span> <span class="mi">64</span><span class="p">}</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">InputDimensions</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">32</span><span class="p">,</span> <span class="mi">32</span><span class="p">}</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">PotentialRadius</span> <span class="p">=</span> <span class="nx">ssp</span><span class="p">.</span><span class="nx">NumInputs</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">NumActiveColumnsPerInhArea</span> <span class="p">=</span> <span class="nb">int</span><span class="p">(</span><span class="mf">0.02</span> <span class="o">*</span> <span class="nb">float64</span><span class="p">(</span><span class="nx">ssp</span><span class="p">.</span><span class="nx">NumColumns</span><span class="p">()))</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">GlobalInhibition</span> <span class="p">=</span> <span class="kc">true</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">SynPermActiveInc</span> <span class="p">=</span> <span class="mf">0.01</span>
</span><span class='line'>    <span class="nx">ssp</span><span class="p">.</span><span class="nx">SpVerbosity</span> <span class="p">=</span> <span class="mi">10</span>
</span><span class='line'>    <span class="nx">sp</span> <span class="o">:=</span> <span class="nx">htm</span><span class="p">.</span><span class="nx">NewSpatialPooler</span><span class="p">(</span><span class="nx">ssp</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="nx">activeArray</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">bool</span><span class="p">,</span> <span class="nx">sp</span><span class="p">.</span><span class="nx">NumColumns</span><span class="p">())</span>
</span><span class='line'>    <span class="nx">inputVector</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">bool</span><span class="p">,</span> <span class="nx">sp</span><span class="p">.</span><span class="nx">NumInputs</span><span class="p">())</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="nx">idx</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">inputVector</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">inputVector</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="p">=</span> <span class="nx">rand</span><span class="p">.</span><span class="nx">Intn</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">sp</span><span class="p">.</span><span class="nx">Compute</span><span class="p">(</span><span class="nx">inputVector</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">activeArray</span><span class="p">,</span> <span class="nx">sp</span><span class="p">.</span><span class="nx">InhibitColumns</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Active Indices:&quot;</span><span class="p">,</span> <span class="nx">utils</span><span class="p">.</span><span class="nx">OnIndices</span><span class="p">(</span><span class="nx">activeArray</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Temporal Pooler Example </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="kn">package</span> <span class="nx">main</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="p">(</span>
</span><span class='line'>    <span class="s">&quot;fmt&quot;</span>
</span><span class='line'>    <span class="s">&quot;github.com/zacg/htm&quot;</span>
</span><span class='line'>    <span class="s">&quot;github.com/zacg/htm/utils&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">tps</span> <span class="o">:=</span> <span class="nx">htm</span><span class="p">.</span><span class="nx">NewTemporalPoolerParams</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">Verbosity</span> <span class="p">=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">NumberOfCols</span> <span class="p">=</span> <span class="mi">50</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">CellsPerColumn</span> <span class="p">=</span> <span class="mi">2</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">ActivationThreshold</span> <span class="p">=</span> <span class="mi">8</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">MinThreshold</span> <span class="p">=</span> <span class="mi">10</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">InitialPerm</span> <span class="p">=</span> <span class="mf">0.5</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">ConnectedPerm</span> <span class="p">=</span> <span class="mf">0.5</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">NewSynapseCount</span> <span class="p">=</span> <span class="mi">10</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">PermanenceDec</span> <span class="p">=</span> <span class="mf">0.0</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">PermanenceInc</span> <span class="p">=</span> <span class="mf">0.1</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">GlobalDecay</span> <span class="p">=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">BurnIn</span> <span class="p">=</span> <span class="mi">1</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">PamLength</span> <span class="p">=</span> <span class="mi">10</span>
</span><span class='line'>    <span class="nx">tps</span><span class="p">.</span><span class="nx">CollectStats</span> <span class="p">=</span> <span class="kc">true</span>
</span><span class='line'>    <span class="nx">tp</span> <span class="o">:=</span> <span class="nx">htm</span><span class="p">.</span><span class="nx">NewTemporalPooler</span><span class="p">(</span><span class="o">*</span><span class="nx">tps</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Mock encoding of ABCDE</span>
</span><span class='line'>    <span class="nx">inputs</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([][]</span><span class="kt">bool</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">inputs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="nx">boolRange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>   <span class="c1">//bits 0-9 are &quot;on&quot;</span>
</span><span class='line'>    <span class="nx">inputs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">=</span> <span class="nx">boolRange</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span> <span class="c1">//bits 10-19 are &quot;on&quot;</span>
</span><span class='line'>    <span class="nx">inputs</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">=</span> <span class="nx">boolRange</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span> <span class="c1">//bits 20-29 are &quot;on&quot;</span>
</span><span class='line'>    <span class="nx">inputs</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">=</span> <span class="nx">boolRange</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">39</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span> <span class="c1">//bits 30-39 are &quot;on&quot;</span>
</span><span class='line'>    <span class="nx">inputs</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">=</span> <span class="nx">boolRange</span><span class="p">(</span><span class="mi">40</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span> <span class="c1">//bits 40-49 are &quot;on&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Learning and prediction can be done at the same time</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Learn 5 sequences above</span>
</span><span class='line'>    <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="nx">p</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">p</span> <span class="p">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">p</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">tp</span><span class="p">.</span><span class="nx">Compute</span><span class="p">(</span><span class="nx">inputs</span><span class="p">[</span><span class="nx">p</span><span class="p">],</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nx">tp</span><span class="p">.</span><span class="nx">Reset</span><span class="p">()</span> <span class="c1">//not required</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Predict sequences</span>
</span><span class='line'>    <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">tp</span><span class="p">.</span><span class="nx">Compute</span><span class="p">(</span><span class="nx">inputs</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span> <span class="kc">false</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span>
</span><span class='line'>        <span class="nx">p</span> <span class="o">:=</span> <span class="nx">tp</span><span class="p">.</span><span class="nx">DynamicState</span><span class="p">.</span><span class="nx">InfPredictedState</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">fmt</span><span class="p">.</span><span class="nx">Printf</span><span class="p">(</span><span class="s">&quot;Predicted: %v From input: %v \n&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">.</span><span class="nx">NonZeroRows</span><span class="p">(),</span> <span class="nx">utils</span><span class="p">.</span><span class="nx">OnIndices</span><span class="p">(</span><span class="nx">inputs</span><span class="p">[</span><span class="nx">i</span><span class="p">]))</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//helper method for creating boolean sequences</span>
</span><span class='line'><span class="kd">func</span> <span class="nx">boolRange</span><span class="p">(</span><span class="nx">start</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">end</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">length</span> <span class="kt">int</span><span class="p">)</span> <span class="p">[]</span><span class="kt">bool</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">result</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">bool</span><span class="p">,</span> <span class="nx">length</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="nx">start</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="nx">end</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">result</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="kc">true</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">result</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can grab the code @ <a href="https://github.com/zacg/htm">https://github.com/zacg/htm</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Encoding Data in DNA With Go]]></title>
    <link href="http://zacg.github.io/blog/2014/03/26/encoding-data-in-dna-with-go/"/>
    <updated>2014-03-26T23:58:00-04:00</updated>
    <id>http://zacg.github.io/blog/2014/03/26/encoding-data-in-dna-with-go</id>
    <content type="html"><![CDATA[<p>
    As a recent programming exercise I wrote a golang library that allows encoding/decoding arbitrary data in DNA segments.
</p>




<p>
    The encoding algorithm is based on the method described in this Nature paper: <a href="http://www.nature.com/nature/journal/v494/n7435/full/nature11875.html">http://www.nature.com/nature/journal/v494/n7435/full/nature11875.html</a> . Pseudo code and details can be found here: <a href="http://www.nature.com/nature/journal/vaop/ncurrent/extref/nature11875-s2.pdf">http://www.nature.com/nature/journal/vaop/ncurrent/extref/nature11875-s2.pdf</a>
</p>




<p>
Usage Example:
</p>




<figure class='code'><figcaption><span>Encoding </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="nx">str</span> <span class="o">:=</span> <span class="s">&quot;some string to encode in DNA&quot;</span>
</span><span class='line'>  <span class="nx">dna</span> <span class="o">:=</span> <span class="nx">dna</span><span class="p">.</span><span class="nx">Encode</span><span class="p">(</span><span class="nx">str</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Result: &quot;</span><span class="p">,</span> <span class="nx">dna</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<p>
The resulting string is a valid DNA sequence.
</p>




<p>
Sequences can be decoded back to human readable text the same way:
</p>




<figure class='code'><figcaption><span>Decoding </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>   <span class="nx">dna</span> <span class="o">:=</span> <span class="s">&quot;ATAGTATATCGACTAGTACAGCGTAGCATCTCGCAGCGAGATACGCTGCTACGCAGCATGCTGTGAGTATCGATGACGAGTGACTCTGTACAGTACGTACGATACGTACGTACGTCGTATAGTCGTACGTACGTACGTACGTACGTACGTACTGTACAGAGTCACTCGTCATCGATACTCACAGCATGCTGCGTAGCAGCGTATCTCGCTGCGAGATGATACGTACGTACGAGC&quot;</span>
</span><span class='line'>  <span class="nx">str</span> <span class="o">:=</span> <span class="nx">dna</span><span class="p">.</span><span class="nx">Decode</span><span class="p">(</span><span class="nx">dna</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;Result&quot;</span><span class="p">,</span><span class="nx">str</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    Source on github: <a href="https://github.com/zacg/dna">https://github.com/zacg/dna</a>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New Nupic Cerebro Docker Image]]></title>
    <link href="http://zacg.github.io/blog/2014/03/21/new-nupic-cerebro-docker-image/"/>
    <updated>2014-03-21T01:22:00-04:00</updated>
    <id>http://zacg.github.io/blog/2014/03/21/new-nupic-cerebro-docker-image</id>
    <content type="html"><![CDATA[<p>
    CLA and Hierarchical Temporal Memory are finally starting to grow in popularity and an open source community is starting to grow around the open source <a href="https://github.com/numenta/nupic/">Nupic framework</a>. Currently Cerebro is the best tool (and only) for prototyping CLA models it allows you to visually dissect your work.
</p>


<p>
    Because Cerebro is a webapp built on mongodb and python it requires a bit of work get setup. To make it easier for newcomers to get up and running quickly I created a dockerfile containing all the dependencies required to run Cerebro. Once the docker image is built Cerebro can be run with one command. (Eventually users will be able to pull an official built image from dockers index)
</p>


<p>
    The Dockerfile is now located in the Cerebro repository: <a href="https://github.com/numenta/nupic.cerebro/blob/master/Dockerfile">https://github.com/numenta/nupic.cerebro/blob/master/Dockerfile</a>
</p>


<p>
    To build the docker image:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> sudo docker build -t<span class="o">=</span><span class="s2">&quot;nupic.cerebro&quot;</span> .
</span></code></pre></td></tr></table></div></figure>




<p>
    To run Cerebro on port: 1955:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> sudo docker run -p<span class="o">=</span>1955:1955 nupic.cerebro
</span></code></pre></td></tr></table></div></figure>




<p>
    Simply navigate to http://localhost:1955 to start using Cerebro. For an introductory video checkout: <a href="http://youtu.be/WQWU1K5tE5o">http://youtu.be/WQWU1K5tE5o</a>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Android Using Custom Header Title]]></title>
    <link href="http://zacg.github.io/blog/2014/02/28/android-using-custom-header-title/"/>
    <updated>2014-02-28T01:17:00-05:00</updated>
    <id>http://zacg.github.io/blog/2014/02/28/android-using-custom-header-title</id>
    <content type="html"><![CDATA[<p>
Trying to configure a custom header/title layout with the newer Android Holo Theme can be painful, often producing cryptic error messages. According to google the issue is with the new actionbar added in the halo theme conflicting with the older title configuration.
</p>




<p>
    Here is what worked for me: after creating a layout named &#8220;CustomHeader.xml&#8221; I added the following lines to my activity OnCreate method:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'>   <span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnCreate</span> <span class="p">(</span><span class="n">Bundle</span> <span class="n">bundle</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="k">base</span><span class="p">.</span><span class="n">OnCreate</span> <span class="p">(</span><span class="n">bundle</span><span class="p">);</span>
</span><span class='line'>      <span class="n">RequestWindowFeature</span><span class="p">(</span><span class="n">WindowFeatures</span><span class="p">.</span><span class="n">CustomTitle</span><span class="p">);</span>
</span><span class='line'>      <span class="n">SetContentView</span> <span class="p">(</span><span class="n">Resource</span><span class="p">.</span><span class="n">Layout</span><span class="p">.</span><span class="n">Main</span><span class="p">);</span>
</span><span class='line'>      <span class="n">Window</span><span class="p">.</span><span class="n">SetFeatureInt</span> <span class="p">(</span><span class="n">WindowFeatures</span><span class="p">.</span><span class="n">CustomTitle</span><span class="p">,</span> <span class="n">Resource</span><span class="p">.</span><span class="n">Layout</span><span class="p">.</span><span class="n">CustomHeader</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
I then modified my androidmanifiest.xml and style.xml files to configure a custom theme that inherits from the oridinal halo theme but removes the action bar.
</p>




<figure class='code'><figcaption><span>androidmanifiest.xml </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>  <span class="nt">&lt;manifest&gt;</span>
</span><span class='line'>  <span class="nt">&lt;application</span> <span class="na">android:theme=</span><span class="s">&quot;@style/CustomTheme&quot;</span><span class="nt">&gt;&lt;/application&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/manifest&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>styles.xml </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>  <span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;</span>
</span><span class='line'>  <span class="nt">&lt;resources&gt;</span>
</span><span class='line'>  <span class="nt">&lt;style</span> <span class="na">name=</span><span class="s">&quot;CustomTheme&quot;</span> <span class="na">parent=</span><span class="s">&quot;android:Theme.Holo&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;item</span> <span class="na">name=</span><span class="s">&quot;android:windowActionBar&quot;</span><span class="nt">&gt;</span>false<span class="nt">&lt;/item&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/resources&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
If you don&#8217;t already have a styles.xml file, it should be created in /resources/values/
</p>




<p>
If you try setting a custom header/title without removing the actionbar you will get the following runtime exception: <strong>&#8220;Cannot combine custom title with other title features&#8221;</strong>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Azure Log4Net Appender]]></title>
    <link href="http://zacg.github.io/blog/2014/02/05/azure-log4net-appender/"/>
    <updated>2014-02-05T01:28:00-05:00</updated>
    <id>http://zacg.github.io/blog/2014/02/05/azure-log4net-appender</id>
    <content type="html"><![CDATA[<p>
    Recently when deploying an existing codebase to Azure I required the ability to configure log4net to write to azure storage services. 
</p>




<p>
    After some quick googling I found a NuGet package that seemed to be fairly well maintained and had a modest amount of users according to the NuGet download stats. NuGet Package here: <a href="http://www.nuget.org/packages/log4net.Appender.Azure/">http://www.nuget.org/packages/log4net.Appender.Azure/</a> or type the following in package manager console:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'> <span class="n">Install</span><span class="p">-</span><span class="n">Package</span> <span class="n">log4net</span><span class="p">.</span><span class="n">Appender</span><span class="p">.</span><span class="n">Azure</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    However I immediately ran into a few issues, first problems building it with my project as it was built with dependencies on older frameworks such as log4net. Additionally when running the table appender in a real application with multiple concurrent loggers I began to get errors related to the way it submitted batch inserts to the storage service.
</p>




<p>
    I was able to fork the NuGet project on github, update it&#8217;s dependencies, and fix the batch processing issue, you can find my branch here: <a href="https://github.com/zacg/log4net.Azure">https://github.com/zacg/log4net.Azure</a> I have submitted a pull request for these changes, hopefully they will appear in the next NuGet package release.
</p>




<p>
    Once referenced just choose your preferred storage method and set your connection string like so:
</p>




<figure class='code'><figcaption><span>Azure Appender Config Example </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;log4net&gt;</span>
</span><span class='line'>    <span class="nt">&lt;appender</span> <span class="na">name=</span><span class="s">&quot;TableAppender&quot;</span> <span class="na">type=</span><span class="s">&quot;log4net.Appender.AzureTableAppender, log4net.Appender.Azure&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&quot;TableName&quot;</span> <span class="na">value=</span><span class="s">&quot;testLoggingTable&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&quot;ConnectionString&quot;</span> <span class="na">value=</span><span class="s">&quot;UseDevelopmentStorage=true&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;layout</span> <span class="na">type=</span><span class="s">&quot;log4net.Layout.PatternLayout&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;conversionPattern</span> <span class="na">value=</span><span class="s">&quot;%date [%thread] %-5level %logger [%property{NDC}] - %message%newline&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/layout&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/appender&gt;</span>
</span><span class='line'>    <span class="nt">&lt;appender</span> <span class="na">name=</span><span class="s">&quot;BlobAppender&quot;</span> <span class="na">type=</span><span class="s">&quot;log4net.Appender.AzureBlobAppender, log4net.Appender.Azure&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&quot;ContainerName&quot;</span> <span class="na">value=</span><span class="s">&quot;testloggingblob&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&quot;DirectoryName&quot;</span> <span class="na">value=</span><span class="s">&quot;logs&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&quot;ConnectionString&quot;</span> <span class="na">value=</span><span class="s">&quot;UseDevelopmentStorage=true&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;layout</span> <span class="na">type=</span><span class="s">&quot;log4net.Layout.PatternLayout&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;conversionPattern</span> <span class="na">value=</span><span class="s">&quot;%date [%thread] %-5level %logger [%property{NDC}] - %message%newline&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/layout&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/appender&gt;</span>
</span><span class='line'>    <span class="nt">&lt;root&gt;</span>
</span><span class='line'>      <span class="nt">&lt;level</span> <span class="na">value=</span><span class="s">&quot;INFO&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;appender-ref</span> <span class="na">ref=</span><span class="s">&quot;TableAppender&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;appender-ref</span> <span class="na">ref=</span><span class="s">&quot;BlobAppender&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/root&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/log4net&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    If you ever have to debug log4net appenders here are a few snippets that may help you. The first is a function to flush the log buffers. The second turns on log4net debug logging, it will log to system.diagnostic.trace, just place the app setting in your config file. And the last snippet is just a setting to write your trace logs to file, again place in your config file.
</p>




<figure class='code'><figcaption><span>Flush Buffers </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="c1">//From: Alconja @ http://stackoverflow.com/questions/2045935/is-there-anyway-to-programmably-flush-the-buffer-in-log4net</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">FlushBuffers</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ILoggerRepository</span> <span class="n">rep</span> <span class="p">=</span> <span class="n">LogManager</span><span class="p">.</span><span class="n">GetRepository</span><span class="p">();</span>
</span><span class='line'>    <span class="k">foreach</span> <span class="p">(</span><span class="n">IAppender</span> <span class="n">appender</span> <span class="k">in</span> <span class="n">rep</span><span class="p">.</span><span class="n">GetAppenders</span><span class="p">())</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">buffered</span> <span class="p">=</span> <span class="n">appender</span> <span class="k">as</span> <span class="n">BufferingAppenderSkeleton</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">buffered</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">buffered</span><span class="p">.</span><span class="n">Flush</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Log log4net Debugging Info </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'>  <span class="nt">&lt;appSettings&gt;</span>
</span><span class='line'>    <span class="nt">&lt;add</span> <span class="na">key=</span><span class="s">&quot;log4net.Internal.Debug&quot;</span> <span class="na">value=</span><span class="s">&quot;true&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/appSettings&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Dump Trace Logs to File </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'> <span class="nt">&lt;system.diagnostics&gt;</span>
</span><span class='line'>    <span class="nt">&lt;trace&gt;</span>
</span><span class='line'>     <span class="nt">&lt;listeners&gt;</span>
</span><span class='line'>  <span class="nt">&lt;add</span>
</span><span class='line'>       <span class="na">name=</span><span class="s">&quot;textWriterTraceListener&quot;</span>
</span><span class='line'>       <span class="na">type=</span><span class="s">&quot;System.Diagnostics.TextWriterTraceListener&quot;</span>
</span><span class='line'>       <span class="na">initializeData=</span><span class="s">&quot;C:\dev\log4net.txt&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>       <span class="nt">&lt;/listeners&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/trace&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/system.diagnostics&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    And finally a list of the errors encountered and fixed to help out random googlers.
    <ul>
        <li>Could not load file or assembly &#8216;log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a&#8217; or one of its dependencies.</li>
        <li>WRN: Comparing the assembly name resulted in the mismatch: Build Number</li>
        <li>All entities in a single batch operation must have the same partition key</li>
    </ul>
</p>




<p>
    I ran into a few roadblocks along the way but ended up with a working log4net appender that can write logs to Azure storage services with a few simple configuration settings. If you have any comments feel free to share below.
</p>


<p>
  Source Code Here: <a href="https://github.com/zacg/log4net.Azure">https://github.com/zacg/log4net.Azure</a>
</p>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Checking Nested Models in Backbone Forms]]></title>
    <link href="http://zacg.github.io/blog/2013/11/28/checking-nested-models-in-backbone-forms/"/>
    <updated>2013-11-28T02:28:00-05:00</updated>
    <id>http://zacg.github.io/blog/2013/11/28/checking-nested-models-in-backbone-forms</id>
    <content type="html"><![CDATA[<p>
    When defining custom form templates in <a href="https://github.com/powmedia/backbone-forms">backbone forms</a> you may want to conditionally include content based on whether or not the form is nested. The following code will allow you to check using the template markup: 
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;%</span> <span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">.</span><span class="nx">fieldTemplate</span> <span class="o">!=</span> <span class="s2">&quot;nestedField&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="o">%&gt;</span>
</span><span class='line'>  <span class="c1">//form is nested inside another</span>
</span><span class='line'><span class="o">&lt;%</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="o">%&gt;</span>
</span><span class='line'>  <span class="c1">//form is not nested</span>
</span><span class='line'><span class="o">&lt;%</span> <span class="p">}</span> <span class="o">%&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    This check will enable you to write fewer, more reusable form templates. The following changes to the default bootstrap template included with backbone forms allows you to include form submit and cancel buttons by setting a template data flag.
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">Form</span><span class="p">.</span><span class="nx">template</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">template</span><span class="p">(</span><span class="s1">&#39;\</span>
</span><span class='line'><span class="s1">    &lt;div&gt;\</span>
</span><span class='line'><span class="s1">    &lt;form class=&quot;form-horizontal&quot; data-fieldsets&gt;\</span>
</span><span class='line'><span class="s1">    &lt;/form&gt;\</span>
</span><span class='line'><span class="s1">    &lt;% if(submitbtn &amp;&amp; this.options.fieldTemplate != &quot;nestedField&quot;) { %&gt;\</span>
</span><span class='line'><span class="s1">      &lt;button class=&quot;btn btn-primary createBtn&quot; &gt;Create&lt;/button&gt;\</span>
</span><span class='line'><span class="s1">      &lt;button class=&quot;btn btn-danger cancelBtn&quot; &gt;Cancel&lt;/button&gt;\</span>
</span><span class='line'><span class="s1">    &lt;% } %&gt;\</span>
</span><span class='line'><span class="s1">    &lt;/div&gt;\</span>
</span><span class='line'><span class="s1">  &#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Setting the submitbtn flag in the templateData</span>
</span><span class='line'><span class="c1">//paramater will cause the buttons to appear on the form</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">ExampleForm</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">Form</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">templateData</span><span class="o">:</span> <span class="p">{</span> <span class="nx">submitbtn</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>     <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Golang Type Comparisons and Struct Initialization Using Reflection]]></title>
    <link href="http://zacg.github.io/blog/2013/10/11/golang-type-comparisons-using-reflection/"/>
    <updated>2013-10-11T19:29:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/10/11/golang-type-comparisons-using-reflection</id>
    <content type="html"><![CDATA[<p>
While writing some basic <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a> code for a recent project, I decided to create a base struct containing the redundant fields for all of my data entities (id,date_created, etc&#8230;). I then embedded this struct in all data entities and tagged it as inline so json/bson marshalers would treat it accordingly. A problem arose when I wanted to pass newly created data entities from clients into a json webservice. Normally when instantiating a data entity struct I would use the associated creation method (NewSomeEntity()) which would set the appropriate id/created date etc&#8230; however the json marshaler is not smart enough to do this as it builds the object graph. If the object graph is only one level deep, you can just run an init function on the new object returned from the marshaler, when the object contains n-levels (n-many relationships) it becomes a problem.
</p>


<p>
I had two options: I could implement custom marshal interfaces for every data entity struct, or I could write a function that reflects over the object graph after it has been built by the json marshaler and run my initialization function against any new/unintitalized base entity structs. I decided to go with the later option.
</p>




<p>
There are a few key functions needed to achieve the method described above, mainly: reflecting over an object to get a list of it&#8217;s fields, checking the type of the reflected field against your base struct, checking if the reflected field value is uninitialized or in the case of a pointer nil, and finally setting the value of an empty field to an initialized struct. 
</p>




<p>
Here are some code examples:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'>  <span class="c1">//base struct for all data entities</span>
</span><span class='line'>  <span class="kd">type</span> <span class="nx">Entity</span> <span class="kd">struct</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">Id</span>        <span class="nx">Uuid</span> <span class="s">`bson:&quot;_id,omitempty&quot; json:id`</span>
</span><span class='line'>      <span class="nx">CreatedOn</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'> <span class="c1">//initialization function</span>
</span><span class='line'> <span class="kd">func</span> <span class="nx">NewEntity</span><span class="p">()</span> <span class="nx">Entity</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">Entity</span><span class="p">{</span><span class="nx">CreatedOn</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">(),</span> <span class="nx">Id</span><span class="p">:</span> <span class="nx">Uuid</span><span class="p">.</span><span class="nx">NewUuid</span><span class="p">()}</span>
</span><span class='line'> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Reflect over object and get list of fields
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="nx">obj</span> <span class="o">:=</span> <span class="nx">Entity</span><span class="p">{};</span>
</span><span class='line'><span class="c1">//retrieve list of fields</span>
</span><span class='line'><span class="nx">r</span> <span class="o">:=</span> <span class="nx">reflect</span><span class="p">.</span><span class="nx">ValueOf</span><span class="p">(</span><span class="nx">obj</span><span class="p">).</span><span class="nx">Elem</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//iterate over fields</span>
</span><span class='line'><span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="nx">r</span><span class="p">.</span><span class="nx">NumField</span><span class="p">();</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">f</span> <span class="o">:=</span> <span class="nx">r</span><span class="p">.</span><span class="nx">Field</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Compare reflected type
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">f</span><span class="p">.</span><span class="nx">Type</span><span class="p">()</span> <span class="o">==</span> <span class="nx">reflect</span><span class="p">.</span><span class="nx">TypeOf</span><span class="p">(</span><span class="nx">Entity</span><span class="p">{}))</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//reflected type is of type &quot;Entity&quot;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Checking for uninitialized/empty struct
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">f</span><span class="p">.</span><span class="nx">Interface</span><span class="p">().(</span><span class="nx">Entity</span><span class="p">)</span> <span class="o">==</span> <span class="nx">Entity</span><span class="p">{})</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//reflected field is an uninitialized entity struct</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Checking for nil pointer - if you are using pointers you may need to check for a nil pointer rather than an uninitialized struct.
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">f</span><span class="p">.</span><span class="nx">Kind</span><span class="p">()</span> <span class="o">==</span> <span class="nx">reflect</span><span class="p">.</span><span class="nx">Pointer</span> <span class="o">&amp;&amp;</span> <span class="nx">f</span><span class="p">.</span><span class="nx">IsNil</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//reflected field is a null pointer</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<p>
Finally once an empty field is found set it to an initialized Entity struct
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="c1">//sets field f to an initialized Entity struct</span>
</span><span class='line'><span class="nx">f</span><span class="p">.</span><span class="nx">Set</span><span class="p">(</span><span class="nx">reflect</span><span class="p">.</span><span class="nx">ValueOf</span><span class="p">(</span><span class="nx">NewEntity</span><span class="p">()))</span>
</span></code></pre></td></tr></table></div></figure>




<p>
With the above snippets you can easily build a custom function for iterating over your object graph and initialize empty structs.
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Beware When Installing Swig From Debian Package]]></title>
    <link href="http://zacg.github.io/blog/2013/09/01/beware-when-installing-swig-from-debian-package/"/>
    <updated>2013-09-01T22:52:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/09/01/beware-when-installing-swig-from-debian-package</id>
    <content type="html"><![CDATA[<p>
Recently while generating Go bindings for a C++ library with Swig I begain noticing memory issues. Specifically when memory pressure was placed on the application I noticed output paramaters of standard types like std::vector were being randomly deallocated. After triple checking my Swig template files for the correct wrapping signatures and reviewing the generated Go and C/C++ code I was at a loss.
</p>




<p>
 After reviewing the Swig project commit log and noticing some fixes for Go related issues, I remembered I had installed Swig from the debian aptitude manager. Sure enough after running &#8220;swig -version&#8221; my swig version was at 2.0.7 (the current version at this time of writing was 2.0.10). 2.0.7 lacks many bug fixes related to Go. Downloading and installing 2.0.10 from the Swig website solved my memory issues.
</p>




<p>
<strong>Solution:</strong>
</p>




<ol>
    <li>
        Check Installed Swig version
        
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>     swig -version
</span><span class='line'>      
</span></code></pre></td></tr></table></div></figure>

    </li>
    <li>
        If version is < latest: unistall packaged version, then download and install current release from the website: <a href="http://swig.org">http://swig.org</a>
    </li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[File Parameter Support for Portable Restsharp Library]]></title>
    <link href="http://zacg.github.io/blog/2013/08/18/file-parameter-support-for-portable-restsharp-library/"/>
    <updated>2013-08-18T14:14:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/08/18/file-parameter-support-for-portable-restsharp-library</id>
    <content type="html"><![CDATA[<p>
    When developing mobile cross platform apps with Xamarin I like to keep as much common code as possible in a shared portable class library (PCL) for easy reuse. This includes any webservice calls and the associated boilerplate code. I have  been using a fork of the Restsharp library which has been modified to be PCL compliant. This strategy was working fine until recently when I needed to start uploading files through webservices. The Restsharp library has robust file upload support but because it is often tied to OS specific file operations it was left out of the PCL port. As a work around I simply imported the necessary file upload code from the original library using raw bytes and streams as interfaces rather than filenames. Leaving it up to the caller to implement the file loading in their native OS code.
</p>




<p>
My fork can be found on github at: <a href="https://github.com/zacg/geoserver-csharp">https://github.com/zacg/geoserver-csharp</a>
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xamarin Simple Text List View Helper]]></title>
    <link href="http://zacg.github.io/blog/2013/08/18/xamarin-simple-text-list-view-helper/"/>
    <updated>2013-08-18T13:14:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/08/18/xamarin-simple-text-list-view-helper</id>
    <content type="html"><![CDATA[<p>
    Recently while working on an Xamarin based Android project I came up with a handy helper class for displaying basic list views. It saves alot of boilerplate code by not forcing a new adapter implementation for every domain object you want to use in a list view.
</p>


<p>
    The code:
</p>


<script src="https://gist.github.com/zacg/6262608.js"></script>




<p>
    And to use it:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="n">ListAdapter</span> <span class="p">=</span> <span class="k">new</span> <span class="n">SimpleTextAdapter</span><span class="p">&lt;</span><span class="n">SomeBusinessObject</span><span class="p">&gt;</span> <span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="n">objects</span><span class="p">,</span> <span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="k">return</span> <span class="n">item</span><span class="p">.</span><span class="n">Name</span><span class="p">;});</span>
</span></code></pre></td></tr></table></div></figure>




<p>
    Use it with a custom id field:
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="n">ListAdapter</span> <span class="p">=</span> <span class="k">new</span> <span class="n">SimpleTextAdapter</span><span class="p">&lt;</span><span class="n">SomeBusinessObject</span><span class="p">&gt;</span> <span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="n">objects</span><span class="p">,</span> <span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="k">return</span> <span class="n">item</span><span class="p">.</span><span class="n">Name</span><span class="p">;},</span> <span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="k">return</span> <span class="n">item</span><span class="p">.</span><span class="n">CustomId</span><span class="p">;});</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Running Qt Creator Build Commands as Sudo]]></title>
    <link href="http://zacg.github.io/blog/2013/08/07/running-qt-creator-build-commands-as-sudo/"/>
    <updated>2013-08-07T20:00:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/08/07/running-qt-creator-build-commands-as-sudo</id>
    <content type="html"><![CDATA[<p>
    Recently I had a requirement to install a shared library as a build/deployment step in a QtCreator project, which of course required sudo permissions. Not surprisingly Qt Creator does not simply let you prepend &#8220;sudo&#8221; to a custom build step, here is the workaround I found:
</p>




<p>
First I moved all the commands that needed to run with sudo into a single make file like the following, mine was called InstallLib.make:
</p>




<figure class='code'><figcaption><span>InstallLib.make </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>install:
</span><span class='line'>  @echo <span class="s2">&quot;Installing go shared lib...&quot;</span>
</span><span class='line'>  sudo cp -f libImgSearch.so.1.0.0 /usr/local/lib/
</span><span class='line'>  sudo cp -f libImgSearch.so.1.0 /usr/local/lib/
</span><span class='line'>  sudo cp -f libImgSearch.so.1 /usr/local/lib/
</span><span class='line'>  sudo cp -f libImgSearch.so /usr/local/lib/
</span><span class='line'>  sudo ldconfig
</span></code></pre></td></tr></table></div></figure>




<p>
    Next in Qt Creator with your project open, goto the project section, add a new &#8220;custom process&#8221; build step. In the command field type: &#8220;ssh-askpass&#8221; this program will popup a widget to enter the sudo password when executed. In the build step arguments field enter: &#8220;Sudo Password | sudo -S make -f InstallLib.make&#8221;. This will make the ssh-askpass program execute the &#8220;InstalledLib.make&#8221; make file when a correct sudo password is provided.
</p>




<p>
If you prefer not to use the GUI, you could also edit your projects .user file and add some xml similar to the following:
</p>




<figure class='code'><figcaption><span>project.user </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>   &lt;valuemap <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QVariantMap&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.BuildStepList.Step.10&quot;</span>&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;bool&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.BuildStep.Enabled&quot;</span>&gt;true&lt;/value&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QString&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.ProcessStep.Arguments&quot;</span>&gt;Sudo Password | sudo -S make -f InstallLib.make&lt;/value&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QString&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.ProcessStep.Command&quot;</span>&gt;ssh-askpass&lt;/value&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QString&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.ProcessStep.WorkingDirectory&quot;</span>&gt;%<span class="o">{</span>buildDir<span class="o">}</span>&lt;/value&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QString&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.ProjectConfiguration.DefaultDisplayName&quot;</span>&gt;Custom Process Step&lt;/value&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QString&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.ProjectConfiguration.DisplayName&quot;</span>&gt;&lt;/value&gt;
</span><span class='line'>      &lt;value <span class="nb">type</span><span class="o">=</span><span class="s2">&quot;QString&quot;</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&quot;ProjectExplorer.ProjectConfiguration.Id&quot;</span>&gt;ProjectExplorer.ProcessStep&lt;/value&gt;
</span><span class='line'>     &lt;/valuemap&gt;
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Binary Combinations in Javascript]]></title>
    <link href="http://zacg.github.io/blog/2013/08/02/binary-combinations-in-javascript/"/>
    <updated>2013-08-02T09:16:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/08/02/binary-combinations-in-javascript</id>
    <content type="html"><![CDATA[<p>
While writing test coverage for a recent javascript project I was required to test every possible call to a function with a large number of binary parameters. Here is the function I came up with to generate the combinations:
</p>




<script src="https://gist.github.com/zacg/6139955.js"></script>




<p>
It&#8217;s pretty straight forward, pass in the length (n) of binary digits and it will return an array of all possible combinations as boolean values.
</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Lowercase JSON Fields With Golang]]></title>
    <link href="http://zacg.github.io/blog/2013/07/31/lowercase-json-fields-with-golang/"/>
    <updated>2013-07-31T14:19:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/07/31/lowercase-json-fields-with-golang</id>
    <content type="html"><![CDATA[<p>
    The base GO libraries provide a handy function for marshaling structs into JSON. I recently came across an issue when writing webservices in GO for an existing javascript client. The problem was the client expected the JSON data to have field names starting with lowercase letters. GO&#8217;s naming convention is obviously going to make all struct fields uppercase by default as they need to be exported. I ended up copying the JSON marshaler code from GO&#8217;s library and modifiying it with a new paramater that will lowercase JSON field names when set. Because GO isn&#8217;t on github and I am strapped for time I just copied the code into a new util namespace and made the modifications as a couple of other gophers in #go-nuts were interested in using it.
</p>




<p>
Usage is simple, when the 2nd paramater is set to true, all fieldnames will start with a lowercase letter(other capitalization remains unchanged):
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='go'><span class='line'><span class="nx">b</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">jsonutils</span><span class="p">.</span><span class="nx">Marshal</span><span class="p">(&lt;</span><span class="nx">some</span> <span class="nx">obj</span><span class="p">&gt;,</span> <span class="p">&lt;</span><span class="nx">lowercase</span> <span class="nx">fieldnames</span><span class="p">:</span><span class="kc">true</span><span class="o">/</span><span class="kc">false</span><span class="p">&gt;)</span>
</span></code></pre></td></tr></table></div></figure>




<p>
The source code can be downloaded from github: <a href="https://github.com/zacg/goutils">https://github.com/zacg/goutils</a>
</p>




<p>And here is some boilerplate code to use it in a Revel controller:</p>




<div><script src='https://gist.github.com/6124880.js'></script>
<noscript><pre><code></code></pre></noscript></div>




<p>

</p>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Calling C++ Code From Go With SWIG]]></title>
    <link href="http://zacg.github.io/blog/2013/06/06/calling-c-plus-plus-code-from-go-with-swig/"/>
    <updated>2013-06-06T22:51:00-04:00</updated>
    <id>http://zacg.github.io/blog/2013/06/06/calling-c-plus-plus-code-from-go-with-swig</id>
    <content type="html"><![CDATA[<p>
 
 Recently while working on a Go based project I needed to use some functionality from another large C++ library. The library&#8217;s size and complexity made re-writing it in Go unfeasible. After some research I decided to use the popular SWIG (Simplified Wrapper and Interface Generator) framework to enable interop between my two projects.  

</p>




<p>
The following is a brief tutorial to guide you through wrapping a C++ class with a Go package which can be called from any Go program.
</p>




<!-- more -->




<p>
Start by installing GO and SWIG if not already installed
</p>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install golang
</span><span class='line'>sudo apt-get install swig
</span></code></pre></td></tr></table></div></figure>




<div class="alert alert-danger">
<p>
<strong>Update:</strong> The debian package is out of date and lacking many go related fixes, it is best to install current SWIG release from SWIG website: <a href="http://swig.org">http://swig.org</a>
</p>
<p>
    I also recommend installing golang from source as some of the following commands only work with go 1.1 and up. <a href="http://golang.org/doc/install/source">http://golang.org/doc/install/source</a>
</p>
</div>




<p>
Once everything in installed the first step is to define a module file which will tell the SWIG tool what code in the C++ project to expose in the resulting GO package. We&#8217;ll assume your project is object oriented with cpp/header files for each class, when this is the case we can just include the desired header files in our SWIG module.
</p>




<p><p>
 We will pretend our C++ project is a dynamically linked shared library called &#8220;simplelib&#8221; and contains the following files:
<p></p>

<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>simpleclass.h
</span><span class='line'>simpleclass.cpp
</span><span class='line'><br/>
</span></code></pre></td></tr></table></div></figure></p>

<p><figure class='code'><figcaption><span>simpleclass.h </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#ifndef SIMPLECLASS_H</span>
</span><span class='line'><span class="cp">#define SIMPLECLASS_H</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#include &lt;iostream&gt;</span>
</span><span class='line'><span class="cp">#include &lt;vector&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">SimpleClass</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>    <span class="n">SimpleClass</span><span class="p">(){};</span>
</span><span class='line'>    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">hello</span><span class="p">();</span>
</span><span class='line'>    <span class="kt">void</span> <span class="n">helloString</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="o"><em></span><span class="n">results</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">void</span> <span class="n">helloBytes</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span> <span class="o"></em></span><span class="n">results</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#endif</span>
</span><span class='line'>
</span><span class='line'><br/>
</span></code></pre></td></tr></table></div></figure></p>

<p><figure class='code'><figcaption><span>simpleclass.cpp </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="cp">#include &quot;simpleclass.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">SimpleClass</span><span class="o">::</span><span class="n">hello</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">return</span> <span class="s">&quot;world&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">SimpleClass</span><span class="o">::</span><span class="n">helloString</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="o"><em></span><span class="n">results</span><span class="p">){</span>
</span><span class='line'>  <span class="n">results</span><span class="o">-&gt;</span><span class="n">push_back</span><span class="p">(</span><span class="s">&quot;world&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">SimpleClass</span><span class="o">::</span><span class="n">helloBytes</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span> <span class="o"></em></span><span class="n">results</span><span class="p">){</span>
</span><span class='line'>  <span class="n">results</span><span class="o">-&gt;</span><span class="n">push_back</span><span class="p">(</span><span class="sc">&#39;w&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">results</span><span class="o">-&gt;</span><span class="n">push_back</span><span class="p">(</span><span class="sc">&#39;o&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">results</span><span class="o">-&gt;</span><span class="n">push_back</span><span class="p">(</span><span class="sc">&#39;r&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">results</span><span class="o">-&gt;</span><span class="n">push_back</span><span class="p">(</span><span class="sc">&#39;l&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">results</span><span class="o">-&gt;</span><span class="n">push_back</span><span class="p">(</span><span class="sc">&#39;d&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><br/>
</span></code></pre></td></tr></table></div></figure></p>

<p><p>
We will add a module file called <i>simplelib.swig</i>. Inside we include the simpleclass.h header, this will instruct the SWIG tool to generate wrapping code for this class allowing us to use it in GO.
</p></p>

<p><figure class='code'><figcaption><span>Minimum Swig Template</span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="o">%</span><span class="n">module</span> <span class="n">simplelib</span>  <span class="c1">//name of the resulting GO package</span>
</span><span class='line'>
</span><span class='line'><span class="o">%</span><span class="n">include</span> <span class="s">&quot;simpleclass.h&quot;</span>
</span></code></pre></td></tr></table></div></figure></p>

<p><p>
If your wrapped class(es) are simple and use primitive types the above swig file should suffice, SWIG will translate the following primitive types to the specified Go types
</p></p>

<p><table summary="Go primitive type mappings" class="table">
<tr>
<th>C/C++ type</th>
<th>Go type</th>
</tr></p>

<p><tr>
<td>bool</td>
<td>bool</td>
</tr></p>

<p><tr>
<td>char</td>
<td>byte</td>
</tr></p>

<p><tr>
<td>signed char</td>
<td>int8</td>
</tr></p>

<p><tr>
<td>unsigned char</td>
<td>byte</td>
</tr></p>

<p><tr>
<td>short</td>
<td>int16</td>
</tr></p>

<p><tr>
<td>unsigned short</td>
<td>uint16</td>
</tr></p>

<p><tr>
<td>int</td>
<td>int</td>
</tr></p>

<p><tr>
<td>unsigned int</td>
<td>uint</td>
</tr></p>

<p><tr>
<td>long</td>
<td>int32 or int64, depending on <tt>-long-type-size</tt></td>
</tr></p>

<p><tr>
<td>unsigned long</td>
<td>uint32 or uint64, depending on <tt>-long-type-size</tt></td>
</tr></p>

<p><tr>
<td>long long</td>
<td>int64</td>
</tr></p>

<p><tr>
<td>unsigned long long</td>
<td>uint64</td>
</tr></p>

<p><tr>
<td>float</td>
<td>float32</td>
</tr></p>

<p><tr>
<td>double</td>
<td>float64</td>
</tr></p>

<p><tr>
<td>char *<br>char []</td>
<td>string</td>
</tr></p>

<p></table></p>

<p><br/></p>

<p><p>
If your target code contains non-primitive types you have a bit more work to do. SWIG includes headers to help with common non primitive types like string and vector from the standard library. Vectors bring up another issue because they use templates, template types have to be explicitly defined in your SWIG mapping file. A class that uses std::string and std::vector might look like the following:
</p></p>

<p><figure class='code'><figcaption><span>simplelib.swig</span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c++'><span class='line'><span class="o">%</span><span class="n">module</span> <span class="n">simplelib</span>
</span><span class='line'>
</span><span class='line'><span class="o">%</span><span class="n">include</span> <span class="o">&lt;</span><span class="n">typemaps</span><span class="p">.</span><span class="n">i</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">%</span><span class="n">include</span> <span class="s">&quot;std_string.i&quot;</span>
</span><span class='line'><span class="o">%</span><span class="n">include</span> <span class="s">&quot;std_vector.i&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// This will create 2 wrapped types in Go called</span>
</span><span class='line'><span class="c1">// &quot;StringVector&quot; and &quot;ByteVector&quot; for their respective</span>
</span><span class='line'><span class="c1">// types.</span>
</span><span class='line'><span class="k">namespace</span> <span class="n">std</span> <span class="p">{</span>
</span><span class='line'>   <span class="o">%</span><span class="k">template</span><span class="p">(</span><span class="n">StringVector</span><span class="p">)</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span><span class="p">;</span>
</span><span class='line'>   <span class="o">%</span><span class="k">template</span><span class="p">(</span><span class="n">ByteVector</span><span class="p">)</span> <span class="n">vector</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">%</span><span class="n">include</span> <span class="s">&quot;simpleclass.h&quot;</span>
</span></code></pre></td></tr></table></div></figure></p>

<p><br/>
<br/></p>

<p><p>
The following definitions are included with the SWIG library, go <a href="http://www.swig.org/Doc1.3/Library.html#Library_stl_cpp_library">here for full reference</a>
</p></p>

<p><table BORDER summary="SWIG C++ library files" class="table">
<tr>
<th>C++ class</th>
<th>C++ Library file</th>
<th>SWIG Interface library file</th>
</tr></p>

<p><tr> <td>std::deque</td>           <td>deque</td>             <td>std_deque.i</td> </tr>
<tr> <td>std::list</td>           <td>list</td>             <td>std_list.i</td> </tr>
<tr> <td>std::map</td>           <td>map</td>             <td>std_map.i</td> </tr>
<tr> <td>std::pair</td>           <td>utility</td>             <td>std_pair.i</td> </tr>
<tr> <td>std::set</td>           <td>set</td>             <td>std_set.i</td> </tr>
<tr> <td>std::string</td>           <td>string</td>             <td>std_string.i</td> </tr>
<tr> <td>std::vector</td>           <td>vector</td>             <td>std_vector.i</td> </tr></p>

<p></table></p>

<p><br/>
<br/></p>

<p><p>
Next we need to generate the necessary C++ wrapper code to allow Go to bind to it.
</p></p>

<p><div class="alert alert-danger">
<p>
<strong>Update:</strong>
With the official release of Go 1.2, the go build tool now recognizes SWIG files. The following steps are not necessary but may still be useful for users with more complicated build systems.
</p>
<p>
If you are using Go 1.2 simply include the .swig module file in your package directory along with the relevant c++ code files and run &#8220;go build&#8221; or &#8220;go install&#8221;
</p>
</div></p>

<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> /project/src/
</span><span class='line'>SWIG -go -c++ simplelib.swig
</span><span class='line'><br/>
</span></code></pre></td></tr></table></div></figure></p>

<p><p>
Common optional parameters you may need to use:
<ul>
<li>
<strong>&#8220;-soname&#8221;</strong> for specifying the name of your compiled shared library which is dynamically linked at runtime. e.g. -soname libSimpleLib.so.1
</li>
<li>
<strong>&#8220;-intgosize&#8221;</strong> Depending on which version of go you are using 1/1.1 and which platform you are targeting you may need to explicitly set the Go int size (note the documentation for this is currently out of date). e.g. -intgosize 64
</li>
</ul>
</p></p>

<p><p>
The above SWIG command should generate 3 new files in your project directory. Your project directory should now look something like the following:
</p></p>

<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>simpleclass.h
</span><span class='line'>simpleclass.cpp
</span><span class='line'>simplelib.swig
</span><span class='line'>simplelib.go
</span><span class='line'>simplelib.cxx
</span><span class='line'>simplelib_gc.c
</span></code></pre></td></tr></table></div></figure></p>

<p><p>
Now we need to include these 3 new files in our projects. Simplelib.cxx contains the C++ wrapper code allowing your C++ project to interop with CGO. simplelib_gc.c contains the C code designed to be called from CGO. simplelib.go contains the GO code stubs for the resulting GO package, it uses cgo to call into the simplelib_gc.c interfaces.
</p>
<p>
Add the simplelib.cxx file to the C++ project and build with the projects C++ compiler (I have only tested this process with GCC). Simply add it to your makefile or build script.
</p></p>

<p><p>
simplelib_gc.c and simplelib.go need to be included in the go package using the following 5/6/8c and 5/6/8g commands.
</p></p>

<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>go tool 6c -I &lt;Go Installation Path here&gt;/pkg/linux_amd64/ -D _64BIT simplelib_gc.c
</span><span class='line'>go tool 6g simplelib.go
</span><span class='line'>go tool pack grc simplelib.a simplelib.6 simplelib_gc.6
</span></code></pre></td></tr></table></div></figure></p>

<p><p>
The last step is installation: first install your compiled C++ shared library, then run go install on the package created in the last step.
</p></p>

<p><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> /go/src/simplelib/
</span><span class='line'>go install
</span></code></pre></td></tr></table></div></figure></p>

<p><p>
If the installation was successful you should see <i>simplelib.a</i> file in /go/pkg/<linux distro>/
</p></p>

<p><p>
That&#8217;s it! you should now be able to import &#8220;simplelib&#8221; in your go projects and call the wrapped C++ code.
</p></p>

<p><h3>Setting up Build Scripts</h3></p>

<p><p>
 To recap the steps required are:
</p></p>

<p><ol>
<li>Run SWIG tool (generate wrapper code) </li>
<li>Compile C++ project (including new wrapper code)</li>
<li>Copy the built C++ library and files generated in step 1 to a directory in your go path</li>
<li>Link and package the generated files into a Go Package</li>
<li>Run Go install to make the new package available in your applications</li>
</ol></p>

<p><p>
And here is an example makefile:
</p></p>

<p><figure class='code'><figcaption><span>simplelib.make </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
</pre></td><td class='code'><pre><code class='make'><span class='line'><span class="nv">CC</span><span class="o">=</span>g++
</span><span class='line'>
</span><span class='line'><span class="cp">ifeq ($(DEBUG),yes)</span>
</span><span class='line'>  <span class="nv">CXXFLAGS</span><span class="o">=</span>-Wall -g
</span><span class='line'>  <span class="nv">LDFLAGS</span><span class="o">=</span>-Wall -g
</span><span class='line'><span class="cp">else</span>
</span><span class='line'>  <span class="nv">CXXFLAGS</span><span class="o">=</span>-Wall
</span><span class='line'>  <span class="nv">LDFLAGS</span><span class="o">=</span>-Wall
</span><span class='line'><span class="cp">endif</span>
</span><span class='line'>
</span><span class='line'><span class="nv">INCPATH</span><span class="o">=</span>inc
</span><span class='line'><span class="nv">SRCPATH</span><span class="o">=</span>src
</span><span class='line'><span class="nv">OBJPATH</span><span class="o">=</span>obj
</span><span class='line'><span class="nv">LIBPATH</span><span class="o">=</span>lib
</span><span class='line'><span class="nv">BINPATH</span><span class="o">=</span>bin
</span><span class='line'>
</span><span class='line'><span class="nv">OBJS</span><span class="o">=</span><span class="k">$(</span>OBJPATH<span class="k">)</span>/simpleclass.o <span class="k">$(</span>OBJPATH<span class="k">)</span>/simplelib_wrap.o
</span><span class='line'><span class="nv">OUT</span><span class="o">=</span><span class="k">$(</span>LIBPATH<span class="k">)</span>/libSimpleLib.so
</span><span class='line'>
</span><span class='line'><span class="nv">INCLUDES</span><span class="o">=</span>-I ./<span class="k">$(</span>INCPATH<span class="k">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#Set this to your go installation directory</span>
</span><span class='line'><span class="nv">EXE</span><span class="o">=</span><span class="nv">$$</span>HOME/dev/goinstallation/go/bin/
</span><span class='line'><span class="k">export </span><span class="nv">PATH</span> <span class="o">:=</span> bin:<span class="k">$(</span>PATH<span class="k">)</span>
</span><span class='line'>
</span><span class='line'><span class="nf">default</span><span class="o">:</span> <span class="m">$(OUT)</span>
</span><span class='line'>
</span><span class='line'><span class="k">$(</span>OUT<span class="k">)</span>: <span class="k">$(</span>OBJS<span class="k">)</span>
</span><span class='line'>  <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>LDFLAGS<span class="k">)</span> -shared -o <span class="nv">$@</span> <span class="nv">$^</span>
</span><span class='line'>
</span><span class='line'>obj/simplelib_wrap.o: simplelib_wrap.cxx inc/simpleclass.h
</span><span class='line'>  <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>CXXFLAGS<span class="k">)</span> <span class="k">$(</span>INCLUDES<span class="k">)</span> -fpic -c <span class="nv">$&lt;</span> -o <span class="nv">$@</span>
</span><span class='line'>
</span><span class='line'>obj/simpleclass.o: src/simpleclass.cpp inc/simpleclass.h
</span><span class='line'>  <span class="k">$(</span>CC<span class="k">)</span> <span class="k">$(</span>CXXFLAGS<span class="k">)</span> <span class="k">$(</span>INCLUDES<span class="k">)</span> -fpic -c <span class="nv">$&lt;</span> -o <span class="nv">$@</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>simplelib_wrap.cxx:
</span><span class='line'>  swig -go -c++ -intgosize 64 -soname libSimpleLib.so simplelib.swig
</span><span class='line'>
</span><span class='line'>.PHONY: clean cleanall
</span><span class='line'>
</span><span class='line'>clean:
</span><span class='line'>  rm -f <span class="k">$(</span>OBJPATH<span class="k">)</span>/<em>.o
</span><span class='line'>
</span><span class='line'>cleanall: clean
</span><span class='line'>  rm -f <span class="k">$(</span>OUT<span class="k">)</span>
</span><span class='line'>  rm -f </em>.6
</span><span class='line'>  rm -f <em>.a
</span><span class='line'>  rm -f </em>.so
</span><span class='line'>  rm -f <em>.cxx
</span><span class='line'>  rm -f </em>.c
</span><span class='line'>
</span><span class='line'>build:
</span><span class='line'>  @echo <span class="s2">&quot;Building bindings...&quot;</span>
</span><span class='line'>  <span class="k">$(</span>EXE<span class="k">)</span>go tool 6c -I <span class="nv">$$</span>HOME/dev/goinstallation/go/pkg/linux_amd64/ -D _64BIT simplelib_gc.c
</span><span class='line'>  <span class="k">$(</span>EXE<span class="k">)</span>go tool 6g simplelib.go
</span><span class='line'>  <span class="k">$(</span>EXE<span class="k">)</span>go tool pack grc simplelib.a simplelib.6 simplelib_gc.6
</span><span class='line'><br/>
</span><span class='line'><br/>
</span><span class='line'>install:
</span><span class='line'>  @echo <span class="s2">&quot;Installing go package...&quot;</span>
</span><span class='line'><span class="c">  #Rename swig file so go install command does not try to reprocess it</span>
</span><span class='line'>  mv simplelib.swig simplelib.notswig
</span><span class='line'>  <span class="nb">export </span><span class="nv">GOPATH</span><span class="o">=</span><span class="nv">$$</span>HOME/dev/go/; <span class="se">&lt;/span>
</span><span class='line'>  <span class="k">$(</span>EXE<span class="k">)</span>go install
</span><span class='line'>  mv simplelib.notswig simplelib.swig
</span><span class='line'>
</span><span class='line'>  @echo <span class="s2">&quot;Installing go shared lib...&quot;</span>
</span><span class='line'>  sudo cp -f lib/libSimpleLib.so /usr/local/lib/
</span><span class='line'>  sudo ldconfig
</span></code></pre></td></tr></table></div></figure></p>

<p><br/></p>

<p><div class="alert alert-info">
<p>
<strong>Get example project on github:</strong>
<a href="https://github.com/zacg/simplelib">https://github.com/zacg/simplelib</a>
</p></p>

<p></div></p>

<p><p>
 Feel free to leave your comments below.
</p></p>
]]></content>
  </entry>
  
</feed>
