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

  <title><![CDATA[code.eklund.io]]></title>
  <link href="http://code.eklund.io/atom.xml" rel="self"/>
  <link href="http://code.eklund.io/"/>
  <updated>2018-12-12T14:55:52-06:00</updated>
  <id>http://code.eklund.io/</id>
  <author>
    <name><![CDATA[Lukas Eklund]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Implementing a Summed-Area Table in Ruby]]></title>
    <link href="http://code.eklund.io/blog/2018/12/12/summed-area-table-in-ruby/"/>
    <updated>2018-12-12T12:32:47-06:00</updated>
    <id>http://code.eklund.io/blog/2018/12/12/summed-area-table-in-ruby</id>
    <content type="html"><![CDATA[<p>Day 11 of the <a href="https://adventofcode.com/2018/day/11">2018 Advent of Code</a> required you to generate a 300 x 300 matrix and then find
the 3 x 3 sub-matrix that had the largest value. Then part 2 required you to find the largest sub-matrix
of any size that had the maximum value. My first solution used a hash to map every entry in the
matrix. The keys were an <code>[x,y]</code> array and the value was the value at that coordinate. Then by iterating over all rows
and columns I could check every 3 x 3 area and find the maximum value. This worked but wasn&rsquo;t particularly fast (I believe the
complexity was <code>O(N³)</code>).</p>

<p>But then I got to part 2 and I had to check more than just 3 x 3 areas and my implementation was too slow. So I implemented a new
solution using the <code>Matrix</code> class and the <code>minor</code> method so get the sub-matrix. You can see this implementation <a href="https://github.com/leklund/aoc/blob/master/2018/11.rb">here</a>.
In hindsight this wasn&rsquo;t much faster then my first version I just guessed that the maximum area would be less than 20 x 20. One
thing I should have done was to track the maximum value for each square size and exit if it ever went down.</p>

<p>After solving it with a <code>Matrix</code> I wanted to speed up mu implementation so I read some of the tips on reddit which led to
to the wikipedia article for
the <a href="https://en.wikipedia.org/wiki/Summed-area_table">summed-area table</a>.
This is exactly what I needed!</p>

<blockquote><p>A summed-area table is a data structure and algorithm for quickly and efficiently generating the sum of values in a rectangular subset of a grid.</p></blockquote>

<p>I didn&rsquo;t find a Ruby implementation so I decided to implement one for myself. First, here&rsquo;s a visualization of what the summed-area table (SAT) looks like:</p>

<pre>
4x4 matrix          SAT

1  0  6  5       1  1  7 12
4  8  6  7  -->  5 13 25 37
5  3  0  9      10 21 33 54
8  3  4  1      18 32 48 70
</pre>


<p>The formula for find the sum of the sub-matrix from (1, 1) to (2, 2) is then
<code>sat[2, 2] + sat[0, 0] - sat[2, 0] - sat[0, 2]</code> which is
<code>33 + 1 - 7 - 10 == 17</code>.</p>

<p>Since we are starting from the top left in this example, the value for any cell in the SAT
is the sum of all the cells above and the left of the cell.</p>

<p>Since I&rsquo;m working with matrices I opted to extend (monkey-patch) <code>Matrix</code> with two methods: one for generating the summed-area table, the other to calculate an area.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<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='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;matrix&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Matrix</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">summed_area_table</span>
</span><span class='line'>    <span class="k">return</span> <span class="vi">@sat</span> <span class="k">if</span> <span class="vi">@sat</span>
</span><span class='line'>    <span class="n">rows</span> <span class="o">=</span> <span class="n">row_count</span>
</span><span class='line'>    <span class="n">cols</span> <span class="o">=</span> <span class="n">column_count</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">sat</span> <span class="o">=</span> <span class="no">Matrix</span><span class="o">.</span><span class="n">zero</span><span class="p">(</span><span class="n">rows</span><span class="p">,</span> <span class="n">cols</span><span class="p">)</span><span class="o">.</span><span class="n">to_a</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">rows</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'>      <span class="n">cols</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">y</span><span class="o">|</span>
</span><span class='line'>        <span class="n">a</span> <span class="o">=</span> <span class="nb">self</span><span class="o">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">b</span> <span class="o">=</span> <span class="n">sat</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="o">[]</span><span class="p">)</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>        <span class="n">c</span> <span class="o">=</span> <span class="n">sat</span><span class="o">[</span><span class="n">x</span><span class="o">].</span><span class="n">fetch</span><span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">d</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">zero?</span> <span class="o">||</span> <span class="n">y</span><span class="o">.</span><span class="n">zero?</span> <span class="p">?</span> <span class="mi">0</span> <span class="p">:</span> <span class="n">sat</span><span class="o">[</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="o">][</span><span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">sat</span><span class="o">[</span><span class="n">x</span><span class="o">][</span><span class="n">y</span><span class="o">]</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="n">c</span> <span class="o">-</span> <span class="n">d</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@sat</span> <span class="o">=</span> <span class="no">Matrix</span><span class="o">[*</span><span class="n">sat</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">summed_area</span><span class="p">(</span><span class="n">x0</span><span class="p">,</span> <span class="n">y0</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">)</span>
</span><span class='line'>    <span class="n">x0</span> <span class="o">=</span> <span class="n">x0</span><span class="o">.</span><span class="n">zero?</span> <span class="p">?</span> <span class="mi">0</span> <span class="p">:</span> <span class="n">x0</span> <span class="o">-</span> <span class="mi">1</span>
</span><span class='line'>    <span class="n">y0</span> <span class="o">=</span> <span class="n">y0</span><span class="o">.</span><span class="n">zero?</span> <span class="p">?</span> <span class="mi">0</span> <span class="p">:</span> <span class="n">y0</span> <span class="o">-</span> <span class="mi">1</span>
</span><span class='line'>    <span class="n">summed_area_table</span><span class="o">[</span><span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="o">]</span> <span class="o">+</span>
</span><span class='line'>      <span class="n">summed_area_table</span><span class="o">[</span><span class="n">x0</span><span class="p">,</span> <span class="n">y0</span><span class="o">]</span> <span class="o">-</span>
</span><span class='line'>      <span class="n">summed_area_table</span><span class="o">[</span><span class="n">x1</span><span class="p">,</span> <span class="n">y0</span><span class="o">]</span> <span class="o">-</span>
</span><span class='line'>      <span class="n">summed_area_table</span><span class="o">[</span><span class="n">x0</span><span class="p">,</span> <span class="n">y1</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this new class I was able to <a href="https://github.com/leklund/aoc/blob/master/2018/11_opt.rb">optimize my AOC solution</a> and even though I knew that the size of the square in the answer for my input
was 16 I still searched every possible size and it still performed faster than my original implementation. The code above for the summed-area calculation is also on <a href="https://github.com/leklund/aoc/blob/master/2018/summed_area.rb">github</a> (with some optimizations that shave some time off SAT generation).</p>

<p>Usage example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">&gt;</span> <span class="nb">require</span> <span class="s1">&#39;./summed_area&#39;</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">m</span> <span class="o">=</span> <span class="no">Matrix</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="mi">10000</span><span class="p">)</span> <span class="p">{</span> <span class="nb">rand</span> <span class="p">};</span>    <span class="c1"># It takes a several seconds to seed the 10,000 x 10,000 matrix</span>
</span><span class='line'>
</span><span class='line'><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">m</span><span class="o">.</span><span class="n">summed_area</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">5555</span><span class="p">,</span> <span class="mi">4444</span><span class="p">)</span>  <span class="c1"># The first time this takes some time as the SAT is built</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="mi">11852796</span><span class="o">.</span><span class="mi">933710525</span>
</span><span class='line'>
</span><span class='line'><span class="o">[</span><span class="mi">4</span><span class="o">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">m</span><span class="o">.</span><span class="n">summed_area</span><span class="p">(</span><span class="mi">1020</span><span class="p">,</span> <span class="mi">666</span><span class="p">,</span> <span class="mi">8341</span><span class="p">,</span> <span class="mi">9900</span><span class="p">)</span> <span class="c1"># And now the calculation is instant!</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="mi">33806690</span><span class="o">.</span><span class="mo">016706355</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bauditor Gem - Bundle-audit Multiple Repos]]></title>
    <link href="http://code.eklund.io/blog/2017/01/25/bauditor-gem-bundle-audit-multiple-repos/"/>
    <updated>2017-01-25T17:18:03-06:00</updated>
    <id>http://code.eklund.io/blog/2017/01/25/bauditor-gem-bundle-audit-multiple-repos</id>
    <content type="html"><![CDATA[<p>I was adding <a href="https://github.com/rubysec/bundler-audit">bundler-audit</a> to a ruby application recently and I had this idea that it would be really nice to be able to run it on multiple repositories at once. It&rsquo;s great when you get the status as part of a CI run or a rake task, but if you have some applications that are seldom updated it&rsquo;s important to audit them as well. So I made a thing.</p>

<p>Introducing <a href="https://github.com/leklund/bauditor">bauditor</a>, a simple gem to help you run bundle-audit on multiple repositories in one pass. It will take a config file with a list of git repositories or you can pass them in on the command line:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ bauditor help audit
</span><span class='line'>Usage:
</span><span class='line'>  bauditor audit
</span><span class='line'>
</span><span class='line'>Options:
</span><span class='line'>  r, [--repos=one two three]
</span><span class='line'>  c, [--config=CONFIG]
</span><span class='line'>
</span><span class='line'>run bundle-audit on multiple repositories</span></code></pre></td></tr></table></div></figure>


<p>It will clone each repo into a tempdir and then run <code>bundle-audit</code>. It prints a handy summary at the end. It cleans up after each run so it&rsquo;s not super fast yet. One of the features I want to add is the ability to persist the repositories as well as specify the repository path.</p>

<p>Check it out on rubygems: <a href="https://rubygems.org/gems/bauditor">bauditor 0.2.2</a>. Or get the source on <a href="https://github.com/leklund/bauditor">GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Making Capistrano Rake Tasks Work With Envdir]]></title>
    <link href="http://code.eklund.io/blog/2016/09/23/making-capitstrano-rake-tasks-work-with-envdir/"/>
    <updated>2016-09-23T13:10:48-05:00</updated>
    <id>http://code.eklund.io/blog/2016/09/23/making-capitstrano-rake-tasks-work-with-envdir</id>
    <content type="html"><![CDATA[<p>Using envdir to manage environment variables for a Ruby app means that rake tasks run via
Capistrano can fail or have unexpected output because the ENV hash won&rsquo;t be populated with
what is located in the envdir.</p>

<p><strong>What is <code>envdir</code>?</strong></p>

<p><a href="https://cr.yp.to/daemontools/envdir.html">https://cr.yp.to/daemontools/envdir.html</a></p>

<blockquote><p><code>envdir</code> runs another program with environment modified according to files in a specified directory.</p></blockquote>

<p><strong>Why not use <code>dotenv</code>?</strong></p>

<p><code>dotenv</code> isn&rsquo;t meant for production and <code>envdir</code> integrates nicely with <code>runit</code>. And if that&rsquo;s how your
SRE team wants to manage apps then that&rsquo;s what you use.</p>

<p><strong>So how can I fix it?</strong></p>

<p>Add to the rake command prefix in SSHKit.</p>

<p>Create a new Capistrano task</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># lib/capistrano/tasks/envdir.rake
</span><span class='line'>
</span><span class='line'>desc 'Prefix rake tasks with envidr'
</span><span class='line'>namespace :envdir do
</span><span class='line'>  task :prefix_rake do
</span><span class='line'>      SSHKit.config.command_map.prefix[:rake].unshift 'envdir /path/to/env/directory'
</span><span class='line'>    end
</span><span class='line'>  end
</span><span class='line'>end</span></code></pre></td></tr></table></div></figure>


<p>This will create a new Capistrano task: <code>envdir:prefix_rake</code>. By using <code>unshift</code>
we ensure that if the prefix has already been set (for example by <code>capistrano/bundler</code>)
that we don&rsquo;t overwrite what is already there.</p>

<p>Wire it up.</p>

<p>Load the rake task</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=''><span class='line'># Capfile
</span><span class='line'>
</span><span class='line'>Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }</span></code></pre></td></tr></table></div></figure>


<p>Inject the new task</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=''><span class='line'># config/deploy.rb
</span><span class='line'>
</span><span class='line'>before 'deploy:starting', 'envdir:prefix_rake'</span></code></pre></td></tr></table></div></figure>


<p>Capistrano will now run rake tasks prefixed. For example,
here is how the asset precompilation task will run (assumes <code>capistrano/bundler</code>
has been required as part of <code>capitrano/rails</code>)</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>envdir /path/to/env/directory bundle exec rake assets:precompile</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Modeling Adjacency Lists in Ruby]]></title>
    <link href="http://code.eklund.io/blog/2015/04/29/modeling-adjacency-lists-in-ruby/"/>
    <updated>2015-04-29T10:07:35-05:00</updated>
    <id>http://code.eklund.io/blog/2015/04/29/modeling-adjacency-lists-in-ruby</id>
    <content type="html"><![CDATA[<p>Normally, this would be a task I would try to keep in my data layer
since PostgreSQL is so great at doing this with recursive queries. However,
sometimes you just need to operate in Ruby and Ruby alone. Let&rsquo;s say I want to model
what I always call an adjacency list but what is more technically a a directed graph.
We have a set of nodes where any given node can have a parent node:</p>

<pre>
    1
   / \
  2   3
     / \
    4   5
</pre>


<p>We will define two classes: Tree and Node. A Node object is a very simple:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Node</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:parent</span><span class="p">,</span> <span class="ss">:children</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">opts</span> <span class="o">=</span> <span class="p">{})</span>
</span><span class='line'>    <span class="vi">@id</span> <span class="o">=</span> <span class="n">opts</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span>
</span><span class='line'>    <span class="vi">@name</span> <span class="o">=</span> <span class="n">opts</span><span class="o">[</span><span class="ss">:name</span><span class="o">]</span>
</span><span class='line'>    <span class="vi">@parent</span> <span class="o">=</span> <span class="n">opts</span><span class="o">[</span><span class="ss">:parent</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># add children if passed an array or initialize as an empty array</span>
</span><span class='line'>    <span class="vi">@children</span> <span class="o">=</span> <span class="n">opts</span><span class="o">[</span><span class="ss">:children</span><span class="o">].</span><span class="n">is_a?</span><span class="p">(</span><span class="nb">Array</span><span class="p">)</span> <span class="p">?</span> <span class="n">opts</span><span class="o">[</span><span class="ss">:children</span><span class="o">]</span> <span class="p">:</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We have accessors for the id which will be a unique identifier and will give us the ability to easily retrieve
nodes from the tree. The name is just an arbitrary string. Parent is just another Node object. Children is an array of
Node objects that all have the current node as a parent. The nodes above would could be modeled as:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">n1</span> <span class="o">=</span> <span class="no">Node</span><span class="o">.</span><span class="n">new</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;one&#39;</span>
</span><span class='line'><span class="n">n2</span> <span class="o">=</span> <span class="no">Node</span><span class="o">.</span><span class="n">new</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">parent</span><span class="p">:</span> <span class="n">n1</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;two&#39;</span>
</span><span class='line'><span class="n">n3</span> <span class="o">=</span> <span class="no">Node</span><span class="o">.</span><span class="n">new</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="ss">parent</span><span class="p">:</span> <span class="n">n1</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;three&#39;</span>
</span><span class='line'><span class="n">n4</span> <span class="o">=</span> <span class="no">Node</span><span class="o">.</span><span class="n">new</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="ss">parent</span><span class="p">:</span> <span class="n">n3</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;four&#39;</span>
</span><span class='line'><span class="n">n5</span> <span class="o">=</span> <span class="no">Node</span><span class="o">.</span><span class="n">new</span> <span class="nb">id</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="ss">parent</span><span class="p">:</span> <span class="n">n3</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;five&#39;</span>
</span><span class='line'><span class="n">n1</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="o">[</span><span class="n">n2</span><span class="p">,</span> <span class="n">n3</span><span class="o">]</span>
</span><span class='line'><span class="n">n3</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="o">[</span><span class="n">n4</span><span class="p">,</span> <span class="n">n5</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Adding children like this is tedious and we also don&rsquo;t have good way to traverse the tree. So let&rsquo;s introduce a tree class.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Tree</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:nodes</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@nodes</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@nodes</span><span class="o">[</span><span class="nb">id</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># helper for hash-like access</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">[]</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>    <span class="n">node</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">add_node</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span class='line'>    <span class="k">raise</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">node</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2"> != Node&quot;</span> <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">class</span> <span class="o">!=</span> <span class="no">Node</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">!</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>      <span class="c1"># check if the parent is part of the tree</span>
</span><span class='line'>      <span class="n">existing_parent</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">node</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">existing_parent</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>        <span class="k">raise</span> <span class="s2">&quot;Unable to add node </span><span class="si">#{</span><span class="n">node</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> to the tree. It specifies a parent </span><span class="si">#{</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2"> That has not been added to the tree&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="n">node</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">existing_parent</span>
</span><span class='line'>      <span class="n">existing_parent</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">id</span><span class="p">)</span><span class="o">.</span><span class="n">uniq</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="vi">@nodes</span><span class="o">[</span><span class="n">node</span><span class="o">.</span><span class="n">id</span><span class="o">]</span> <span class="o">=</span> <span class="n">node</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This class gives us a single accessor for nodes which is just a hash of Node objects. We can retrieve
a node via a method or with hash-like syntax. The <code>add_node</code> method will add a node to the tree and it will also
update the children on a parent node. Now we can do fun stuff like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">nodes</span> <span class="o">=</span> <span class="o">[</span><span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">,</span> <span class="n">n3</span><span class="p">,</span> <span class="n">n4</span><span class="p">,</span> <span class="n">n5</span><span class="o">]</span>
</span><span class='line'><span class="n">tree</span> <span class="o">=</span> <span class="no">Tree</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="n">nodes</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="n">tree</span><span class="o">.</span><span class="n">add_node</span> <span class="n">n</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">tree</span><span class="o">.</span><span class="n">node</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="o">.</span><span class="n">name</span>         <span class="c1">#=&gt; &#39;four&#39;</span>
</span><span class='line'><span class="n">tree</span><span class="o">.</span><span class="n">node</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">name</span>  <span class="c1">#=&gt; &#39;three&#39;</span>
</span><span class='line'><span class="n">tree</span><span class="o">.</span><span class="n">node</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:id</span><span class="p">)</span>     <span class="c1">#=&gt; [2,3]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now lets add some functionality to traverse the tree to get ancestors as well as the path of a node. These
methods are part of the Tree class.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">ancestors</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">ancestor_list</span> <span class="o">=</span> <span class="o">[]</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># traverse up the tree to get all parents</span>
</span><span class='line'>  <span class="c1"># return the list if the parent of the current node is already in the list</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">parent</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">ancestor_list</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ancestor_list</span><span class="o">.</span><span class="n">push</span> <span class="n">node</span><span class="o">.</span><span class="n">parent</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">ancestor_list</span><span class="p">)</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">ancestor_list</span><span class="o">.</span><span class="n">empty?</span> <span class="p">?</span> <span class="kp">nil</span> <span class="p">:</span> <span class="n">ancestor_list</span><span class="o">.</span><span class="n">reverse</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">path</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>    <span class="n">path</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">path</span> <span class="o">=</span> <span class="nb">ancestors</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="o">.</span><span class="n">map</span><span class="p">{</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="n">n</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="p">}</span><span class="o">.</span><span class="n">join</span> <span class="s1">&#39;:&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ancestors will return an array of node objects ordered from the top of the graph down to the parent
of the given node. The path method uses the ancestor array to generate a human readable path to the node.
Given the same tree above:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">tree</span><span class="o">.</span><span class="n">ancestors</span><span class="p">(</span><span class="n">n4</span><span class="p">)</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:name</span><span class="p">)</span> <span class="c1">#=&gt; [&quot;one&quot;, &quot;three&quot;]</span>
</span><span class='line'><span class="n">tree</span><span class="o">.</span><span class="n">path</span><span class="p">(</span><span class="n">n4</span><span class="p">)</span> <span class="c1">#=&gt; &#39;1:3:4&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The path method could be used, for example, to generate URL paths from an XML taxonomy tree
or other data structure.</p>

<p><a href="https://gist.github.com/leklund/f1fb60ea820720463938">Complete code gist.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Managing Rewrites for a Rails App on Heroku With Nginx + Phusion Passenger]]></title>
    <link href="http://code.eklund.io/blog/2015/03/17/managing-rewrites-for-a-rails-app-on-heroku-with-nginx-plus-phusion-passenger/"/>
    <updated>2015-03-17T22:26:06-05:00</updated>
    <id>http://code.eklund.io/blog/2015/03/17/managing-rewrites-for-a-rails-app-on-heroku-with-nginx-plus-phusion-passenger</id>
    <content type="html"><![CDATA[<p>The custom CMS that we built for kaboom.org has to manage a lot of rewrite rules because the
information architecture keeps getting rejiggered. We were managing them with Rack::Rewrite
but I always hated having a huge stack of rewrites in the application.rb configuration. Since the app
is hosted Heroku there weren&rsquo;t really any other options until I realized that Phusion Passenger
will now run in standalone mode on Heroku.</p>

<p>It&rsquo;s quite easy to get Passenger running on Heroku: <a href="https://github.com/phusion/passenger-ruby-heroku-demo">https://github.com/phusion/passenger-ruby-heroku-demo</a></p>

<p>replace the app server in your Gemfile (unicorn, thin, puma, etc) with</p>

<pre><code>gem 'passenger'
</code></pre>

<p>Update your Procfile</p>

<pre><code>web: bundle exec passenger start -p $PORT --max-pool-size 3
</code></pre>

<p>This works great but doesn&rsquo;t come with an obvious was to edit the nginx.conf to add rewrite rules or an include directive.
According to the <a href="https://www.phusionpassenger.com/documentation/Users%20guide%20Standalone.html#advanced_configuration">advanced configuration</a> section
of the Passenger standalone manual, we see that there is an option to pass a configuration template.</p>

<p>After adding Passenger to your Gemfile and running a <code>bundle install</code> tun this from you application root directory
to create a configuration template.</p>

<pre><code>cp $(passenger-config about resourcesdir)/templates/standalone/config.erb config/nginx.conf.erb
</code></pre>

<p>You could just add rewrites to this file but because the default configuration template may change from time to time
I would recommend adding any custom configuration to another file. Just after the <code>server {</code> line add</p>

<pre><code>include '&lt;%= app[:root] %&gt;/config/nginx_custom_config.conf';
</code></pre>

<p>Create this file in the config directory of your app and add all of your rewrite rules and custom directives to this file.</p>

<p>If you are using this to perform rewrites and you are running on Heroku, this needs to be included</p>

<pre><code>&lt;% if app[:environment] != 'development' %&gt;
  port_in_redirect off;
&lt;% end %&gt;
</code></pre>

<p>Because Nginx is listening on the random port assigned by the Heroku routing layer Nginx will, by default, include this port
number in the rewrite rules that do HTTP redirects. The conditional makes sure that when running on localhost:5000 redirects still work as intended in your development environment.</p>

<p>Other use cases include enforcing SSL on your app, adding HTTP basic auth to an app, and easier generation of CORS headers.
So far I&rsquo;m loving Phusion Passenger standalone on Heroku. In a future post I plan to examine the performance and memory usage
versus the existing Unicorn setup.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Autoscaling Resque Workers on Heroku With the Platform-api Gem]]></title>
    <link href="http://code.eklund.io/blog/2015/01/29/autoscaling-resque-workers-on-heroku-with-platform-api/"/>
    <updated>2015-01-29T09:25:03-06:00</updated>
    <id>http://code.eklund.io/blog/2015/01/29/autoscaling-resque-workers-on-heroku-with-platform-api</id>
    <content type="html"><![CDATA[<p>Heroku is a great service and is extremely powerful. It&rsquo;s also not cheap so leaving workers idling can cost you a lot of money.
If you have background workers that do variable amounts of work it makes sense to scale up the number of workers as new jobs
are queued and then scale back down as the queue clears.</p>

<p>Here is how one might scale workers using <a href="https://github.com/resque/resque/blob/master/docs/HOOKS.md">resque hooks</a> and the <a href="https://github.com/heroku/platform-api">Heroku platform-api</a> gem.
This example scales up a worker for every three pending jobs. It will scale down once the queue is empty and
all the workers are finished. It will also scale down when the number of idling dynos is greater than 5.
Because it is not possible to control which dynos are killed off, this assumes that your resque workers are handling TERM
signals (and hopefully the jobs are idempotent). It is likely that the downscale could kill off working dynos so the jobs so be sure
to handle the Resque::TermException for jobs.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># config/initializers/heroku-platform-api.rb
</span><span class='line'>
</span><span class='line'>$heroku = PlatformAPI.connect_oauth(ENV['HEROKU_OAUTH_TOKEN'])
</span><span class='line'>
</span><span class='line'>
</span><span class='line'># lib/scaled_job.rb
</span><span class='line'>
</span><span class='line'>require 'platform-api'
</span><span class='line'>
</span><span class='line'>module ScaledJob
</span><span class='line'>  def after_enqueue_upscale(*args)
</span><span class='line'>    worker_count = $heroku.formation.info('app-name','worker')["quantity"]
</span><span class='line'>    job_count = Resque.info[:pending].to_i
</span><span class='line'>    # one worker for every 3 jobs (minimum of 1)
</span><span class='line'>    new_worker_count = ((job_count / 3) + 1).to_i
</span><span class='line'>    if new_worker_count &gt; worker_count
</span><span class='line'>      $heroku.formation.update('app-name', 'worker', {"quantity" =&gt; new_worker_count})
</span><span class='line'>    end
</span><span class='line'>  end
</span><span class='line'>
</span><span class='line'>  def after_perform_downscale
</span><span class='line'>    worker_count = $heroku.formation.info('app-name','worker')["quantity"]
</span><span class='line'>    working = Resque.info[:working].to_i
</span><span class='line'>    if Resque.info[:pending].to_i == 0 && working &lt;= 1
</span><span class='line'>        $heroku.formation.update('app-name', 'worker', {"quantity" =&gt; 1})
</span><span class='line'>    elsif Resque.info[:pending].to_i &lt;= 1 && ((working + 5) &lt; worker_count)
</span><span class='line'>        new_worker_count = working + 5
</span><span class='line'>        $heroku.formation.update('app-name', 'worker', {"quantity" =&gt; new_worker_count})
</span><span class='line'>    end
</span><span class='line'>  end
</span><span class='line'>end
</span><span class='line'>
</span><span class='line'>
</span><span class='line'># model class
</span><span class='line'>class Foo
</span><span class='line'>  extend ScaledJob
</span><span class='line'>
</span><span class='line'>  def self.perform(*args)
</span><span class='line'>    # work it!
</span><span class='line'>  end
</span><span class='line'>end</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Careful With Those Inflectors: A Tale of Performance Tuning Rails]]></title>
    <link href="http://code.eklund.io/blog/2014/08/12/careful-with-those-infelectors/"/>
    <updated>2014-08-12T15:48:19-05:00</updated>
    <id>http://code.eklund.io/blog/2014/08/12/careful-with-those-infelectors</id>
    <content type="html"><![CDATA[<p>We run our website at kaboom.org on a custom-built Rails 4-based CMS and for a long
time I was unhappy with performance of the site. Not that it wasn&rsquo;t responsive and
a huge (and I mean HUGE) improvement over the previous drupal mess, but requests
were spending more time than seemed necessary just in the ruby layer. Most requests were spending
almost 500ms there according to NewRelic traces.</p>

<p>I installed some tools locally to help track down where and why it was spending
so much time each request. The gem <a href="https://github.com/MiniProfiler/rack-mini-profiler">rack-mini-profiler</a> got me started and it is
a great way to get data on each and every request.
This helped me track down some code that was dynamically creating <code>store_accessors</code> for every request. There is an easy way to check if a
given <code>stored_attribute</code> exists on a class:</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=''><span class='line'>Post.stored_attributes[:options].include?("some_attribute")</span></code></pre></td></tr></table></div></figure>


<p>Implementing this check and only adding the store_accessors when needed
provided a small performance increase but each request was still spending way
too much time in ruby. I spent some time trying to get usable data from
flamegraphs and also experimented with adding &lsquo;step&rsquo; blocks in my code to help
track down where things were slow. The problem I found with rack-mini-profiler
was that the rails stack is so deep it makes it very hard to see exacty where
the problems are. I still have it installed on a local branch that and I find
it very useful in some cases. But for this issue, it left me digging through a
convoluted flame graph and I decided to move on.</p>

<p>It was at this point I took a few weeks off from profiling and also took a
vacation. Several weeks later I was preparing for a bug day and was getting
error traces from New Relic to add to Trello that I revisited the performance
issues.  We are on Heroku so I decided to switch our free New Relic plan to the
plan the provides the paid-level features for a limited number of dynos. What
this gave me was access to my new favorite profiling tool: the New Relic thread
profiler. I ran the tool for a 5 minute trace and this was the result:</p>

<p><img class="center" src="http://code.eklund.io/images/blog/newrelicprof.png"></p>

<p>I had to uncollapse a few parts of the tree but it&rsquo;s pretty clear that the
request was spending over 56% of the time in the name method on the
ContentField model. Which, as it turns out, was a method that was no longer
even needed.
The offending, extraneous code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">name</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">super</span> <span class="k">if</span> <span class="k">super</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span> <span class="k">super</span><span class="o">.</span><span class="n">blank?</span>
</span><span class='line'>  <span class="k">super</span><span class="o">.</span><span class="n">downcase</span><span class="o">.</span><span class="n">parameterize</span><span class="o">.</span><span class="n">underscore</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I think this was added in the initial phases of building our CMS to ensure
conformity with seeded names alongside imported field names from Drupal. The
drupal importer I wrote handled all the transformations and there are
validations so enure that field names are created properly. This method does
nothing at all except run downcase, parameterize, and underscore on strings
that already conform to that format. And, as it turns out, <em>inflectors don&rsquo;t
come cheap</em>. I removed the method, ran my tests, and deployed a new version of
the CMS. The performance increase was noticable immediately:</p>

<p><img class="center" src="http://code.eklund.io/images/blog/transaction_performance.png"></p>

<p>It&rsquo;s not everyday that removing 4 lines of code (well, it was really just one) can give you such a boost in performance. Lessons learned:</p>

<ol>
<li>Careful with those inflectors! They can end up being performance bottlenecks.</li>
<li>Just because it was cached in memcache doesn&rsquo;t mean the object initialization doesn&rsquo;t incur the same cost.</li>
<li>NewRelic thread profiling is pretty awesome</li>
<li>rack-mini-profiler combined with flame graphs is an incredible tool that I need to spend more time learning how to use properly.</li>
<li>Careful with adding dynamic stored attributes with an after_initialize. They get added as class methods so only need to be added once.</li>
</ol>


<p>Helpful links:</p>

<ul>
<li><a href="http://samsaffron.com/archive/2012/07/12/miniprofiler-ruby-edition">miniprofiler ruby edition</a></li>
<li><a href="http://samsaffron.com/archive/2013/03/19/flame-graphs-in-ruby-miniprofiler">Flame graphs in Ruby MiniProfiler</a></li>
<li><a href="https://docs.newrelic.com/docs/apm/applications-menu/events/thread-profiler-dashboard">New Relic Thread Profiler docs</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Safely Ignoring Heroku Errors on Rake Db:migrate]]></title>
    <link href="http://code.eklund.io/blog/2014/05/27/ignoring-heroku-errors-on-rake-db-migrate/"/>
    <updated>2014-05-27T16:37:30-05:00</updated>
    <id>http://code.eklund.io/blog/2014/05/27/ignoring-heroku-errors-on-rake-db-migrate</id>
    <content type="html"><![CDATA[<p>(Repurposing my answer to this <a href="http://stackoverflow.com/questions/17300341/migrate-not-working-on-heroku/17306077">stackoverflow question</a> as a blog post)</p>

<p>If you are using Rails 4.x on Heroku and you have your schema format set to sql (which you probably should), you will see this error when running <code>heroku run rake db:migrate</code></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Aborted!
</span><span class='line'>Error dumping database
</span><span class='line'>.../activerecord-4.0.4/lib/active_record/tasks/postgresql_database_tasks.rb:55:in `structure_dump'
</span><span class='line'>.../activerecord-4.0.4/lib/active_record/tasks/database_tasks.rb:143:in `structure_dump'</span></code></pre></td></tr></table></div></figure>


<p>This is an interesting bug that, as it turns out, can be ignored.</p>

<p>ActiveRecord will only run the task <code>db:structure:dump</code> if you are using &lsquo;sql&rsquo; as
your <code>active_record.schema_format</code>.  And that rake task (<code>db:structure:dump</code>) will
fail on Heroku because the executable <code>pg_dump</code> is (unsurprisingly) not in the
binary path.  Interestingly enough, Heroku states that <code>db:schema:dump</code> is not
supported but if you set the schema format to ruby, it works fine. Of course,
you would end up with a <code>schema.rb</code> file on one-off dyno that will not exist
shortly after the rake task finished running.</p>

<p>In Rails 3, the dump task would only raise an error is the exit code of the
command was 1. On unix based systems if a command is not found, the exit code
is 127.  So even if the <code>pg_dump</code> command fails on Rails 3 (which it does), it
won&rsquo;t raise an error and it won&rsquo;t halt the rake task. So anyone using a sql
schema format with Rails 3 wouldn&rsquo;t have this issue because it would fail
silently. The code was refactored in Rails 4 to properly raise an error if the dump failed.
This means that <code>db:migrate</code> will raise an error on Heroku.</p>

<p><strong>However, even though it errors with rake aborted the DDL from the migration is actually executed and committed.</strong></p>

<p>Here are some possible solutions (if the error really bothers you):</p>

<ul>
<li>Ignore the error as the migrations are actually running.</li>
<li>Since you don&rsquo;t care about the structure dump on production, set the schema_format to ruby. In config/environments/production.rb:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">active_record</span><span class="o">.</span><span class="n">schema_format</span> <span class="o">=</span> <span class="ss">:ruby</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>If for some reason you don&rsquo;t want to change the config file: add a rake task with the following to suppress the error:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="no">Rails</span><span class="o">.</span><span class="n">env</span> <span class="o">==</span> <span class="s1">&#39;production&#39;</span>
</span><span class='line'>    <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:structure:dump&quot;</span><span class="o">].</span><span class="n">clear</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First Post]]></title>
    <link href="http://code.eklund.io/blog/2014/05/21/first-post/"/>
    <updated>2014-05-21T10:08:52-05:00</updated>
    <id>http://code.eklund.io/blog/2014/05/21/first-post</id>
    <content type="html"><![CDATA[<p><strong>Hello? Is this thing on?</strong></p>

<p>I was testing out Octopress and decided it was time to finally start a blog. No,
this won&rsquo;t be the realization of my imaginary blog about the art of the movie trailer.
This will be about my experiences with Ruby, Rails, PostgreSQL, Redis, etc.
I hope that by documenting what I have learned that I can help others along they way. Plus, as I age and
my memory fails me I can just google for my old posts.</p>
]]></content>
  </entry>
  
</feed>
