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

  <title><![CDATA[Digital Magpie]]></title>
  <link href="http://ianp.org/atom.xml" rel="self"/>
  <link href="http://ianp.org/"/>
  <updated>2014-11-17T14:32:48+00:00</updated>
  <id>http://ianp.org/</id>
  <author>
    <name><![CDATA[Ian Phillips]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Quick Environment Setup]]></title>
    <link href="http://ianp.org/2014/11/17/quick-environment-setup"/>
    <updated>2014-11-17T14:32:00+00:00</updated>
    <id>http://ianp.org/2014/11/17/quick-environment-setup</id>
    <content type="html"><![CDATA[<p>I’ve recently had to set up and manage about a dozen Linux based virtual servers (not a huge number, but still) and it’s handly to have a separate user account on these machines that I can use to connect to for interactive use.  With that in mind here are a couple of quick tips for setting things up for a more pleasant experience with minimal fuss.</p>

<p>I like to use <a href="http://zsh.org">zsh</a> as my shell, but that’s easy enough to install via apt-get and so can be added to an automated build script. The fastest way to get a good configuration installed is via <a href="http://ohmyz.sh">Oh My Zsh!</a>, it uses the fairly horrible <code>curl | sh</code> installation style, so I don’t like to add it to an automated script, but it’s easy enough to check and run manually:</p>

<pre><code>$ curl -L http://install.ohmyz.sh | sh
</code></pre>

<p>The other thing is to get a decent <a href="http://vim.org">vim</a> setup, for this I use <a href="http://vim.spf13.com">SPF-13</a> which installs in a similar manner:</p>

<pre><code>$ curl http://j.mp/spf13-vim3 -L -o - | sh
</code></pre>

<p>Then I usually set up a couple of aliases based on what the machine will be used for, and I’m done.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Praxis: Winning at Bingo]]></title>
    <link href="http://ianp.org/2013/01/17/praxis-winning-at-bingo"/>
    <updated>2013-01-17T20:04:00+00:00</updated>
    <id>http://ianp.org/2013/01/17/praxis-winning-at-bingo</id>
    <content type="html"><![CDATA[<p>Following on from my <a href="http://ianp.org/2013/01/15/programming-praxis/">previous post</a> I’m attempting the next Programming Praxis <a href="http://programmingpraxis.com/2009/02/19/bingo/">excercise</a>: computing the probability of a winning board at Bingo tournaments of various sizes.</p>

<p>Probably the most common means of solving this kind of probability problem is the <a href="http://en.wikipedia.org/wiki/Monte_Carlo_method">Monte Carlo</a> method, which uses randomization and statistical sampling to estimate probabilities. Luckiy for me, the problem space for Bingo is small enough that it is possible completely analyze the game and present exact numbers.</p>

<p>The individual functions are all pretty short so I’ll walk through the maths and code at the same time.</p>

<h3 id="laying-the-foundations">Laying the Foundations</h3>

<p>Now, some of the numbers are going to get pretty big so primitive math won’t cut it. I’m going to define a few helper functions to make working with arbitrary-precision maths easier. I’m also gong to specify a limited precision context to use for division operations, as I’d rather lose a small amount of precision that get an <code>ArithmeticException</code> if we hit any irrational numbers.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">MathContext</span> <span class="n">DIVISION</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MathContext</span><span class="o">(</span><span class="mi">128</span><span class="o">);</span>
</span><span class="line">
</span><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">d</span><span class="o">(</span><span class="kt">long</span> <span class="n">l</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="k">new</span> <span class="nf">BigDecimal</span><span class="o">(</span><span class="n">l</span><span class="o">,</span> <span class="n">MathContext</span><span class="o">.</span><span class="na">UNLIMITED</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">add</span><span class="o">(</span><span class="n">BigDecimal</span> <span class="n">a</span><span class="o">,</span> <span class="n">BigDecimal</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">b</span><span class="o">,</span> <span class="n">MathContext</span><span class="o">.</span><span class="na">UNLIMITED</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">sub</span><span class="o">(</span><span class="n">BigDecimal</span> <span class="n">a</span><span class="o">,</span> <span class="n">BigDecimal</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="na">subtract</span><span class="o">(</span><span class="n">b</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">mul</span><span class="o">(</span><span class="n">BigDecimal</span> <span class="n">a</span><span class="o">,</span> <span class="n">BigDecimal</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="na">multiply</span><span class="o">(</span><span class="n">b</span><span class="o">,</span> <span class="n">MathContext</span><span class="o">.</span><span class="na">UNLIMITED</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">div</span><span class="o">(</span><span class="n">BigDecimal</span> <span class="n">a</span><span class="o">,</span> <span class="n">BigDecimal</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="na">divide</span><span class="o">(</span><span class="n">b</span><span class="o">,</span> <span class="n">DIVISION</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">pow</span><span class="o">(</span><span class="n">BigDecimal</span> <span class="n">a</span><span class="o">,</span> <span class="kt">int</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="na">pow</span><span class="o">(</span><span class="n">b</span><span class="o">,</span> <span class="n">MathContext</span><span class="o">.</span><span class="na">UNLIMITED</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To show how these work let’s define a factorial function, which is need in a moment anyway.</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">fact</span><span class="o">(</span><span class="n">BigDecimal</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">switch</span> <span class="o">(</span><span class="n">n</span><span class="o">.</span><span class="na">compareTo</span><span class="o">(</span><span class="n">ONE</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">        <span class="k">case</span> <span class="o">-</span><span class="mi">1</span><span class="o">:</span> <span class="k">return</span> <span class="n">ZERO</span><span class="o">;</span>
</span><span class="line">        <span class="k">case</span>  <span class="mi">0</span><span class="o">:</span> <span class="k">return</span> <span class="n">ONE</span><span class="o">;</span>
</span><span class="line">        <span class="k">default</span><span class="o">:</span> <span class="k">return</span> <span class="n">mul</span><span class="o">(</span><span class="n">n</span><span class="o">,</span> <span class="n">fact</span><span class="o">(</span><span class="n">sub</span><span class="o">(</span><span class="n">n</span><span class="o">,</span> <span class="n">ONE</span><span class="o">)));</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We’re also going to need a <a href="http://en.wikipedia.org/wiki/Combinations">combination</a> function, which will return the number of distinct combinations of <em>k</em> values drawn from a set <em>S</em>. Formally this is known as the binomial coefficient and is described by:</p>

<p>\begin{equation}
c(S,k) = {S! \over k!\space (S - k)!} 
\label{combine}
\end{equation}</p>

<p>The code that implements this is pretty much a literal translation of the equation, with a little data conversion and a shortcut for the case where we want to select no items or the entire set.</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">combinations</span><span class="o">(</span><span class="kt">int</span> <span class="n">S</span><span class="o">,</span> <span class="kt">int</span> <span class="n">k</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">k</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">k</span> <span class="o">&gt;</span> <span class="n">S</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">ZERO</span><span class="o">;</span> <span class="o">}</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">k</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">k</span> <span class="o">==</span> <span class="n">S</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">ONE</span><span class="o">;</span> <span class="o">}</span>
</span><span class="line">    <span class="n">BigDecimal</span> <span class="n">bS</span> <span class="o">=</span> <span class="n">d</span><span class="o">(</span><span class="n">S</span><span class="o">);</span>
</span><span class="line">    <span class="n">BigDecimal</span> <span class="n">bk</span> <span class="o">=</span> <span class="n">d</span><span class="o">(</span><span class="n">k</span><span class="o">);</span>
</span><span class="line">    <span class="k">return</span> <span class="nf">div</span><span class="o">(</span><span class="n">fact</span><span class="o">(</span><span class="n">bS</span><span class="o">),</span> <span class="n">mul</span><span class="o">(</span><span class="n">fact</span><span class="o">(</span><span class="n">bk</span><span class="o">),</span> <span class="n">fact</span><span class="o">(</span><span class="n">sub</span><span class="o">(</span><span class="n">bS</span><span class="o">,</span> <span class="n">bk</span><span class="o">))));</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>There are faster algorithms than this, but this is easy to understand and sufficient for our needs.</p>

<h3 id="describing-bingo-mathematically">Describing Bingo Mathematically</h3>

<p>A Bingo board is comprised of a set of squares <em>S</em>, each with a number <em>n</em> chosen at random from the set <em>N</em>. Typically <em>S</em> comprises a 5x5 grid and <em>N</em> is the set of integers from 1 to 75. As an added wrinkle the centre square in the grid is a <em>free space</em> which is always assumed to be hit, this means that a 5x5 grid is actually a 24 element set.</p>

<p>To keep things simple I’m going to assume that we are using a typical board and number set, so I’ll just use constants to hold the cardinalities (sizes) of the two sets.</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">NUMBERS</span> <span class="o">=</span> <span class="mi">75</span><span class="o">;</span>
</span><span class="line"><span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">SQUARES</span> <span class="o">=</span> <span class="mi">24</span><span class="o">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The first thing we need to figure out is the cumulative probabity of winning after <em>n</em> numbers have been called (i.e. the probability of winning when the 4th number is called, when the 5th number is called, and so on). This can be found by looking at the probability of there being 4 hits and those 4 forming a Bingo, plus the probability of there being 5 hits and those 5 forming a Bingo, and so on up to the number of calls made so far. Note that we start at 4 as this is the minimum number of calls needed for a Bingo.</p>

<p>Assuming that we have a function <em>p(n)</em> which returns the probability of there being a Bingo when there are <em>n</em> hits, the cumulative probability of winning after <em>n</em> calls is given by:</p>

<p>\begin{equation}
w(n) = \sum _ {i=4}^n {c(|S|, i)\space c(|N| - |S|, n - i) \over c(|N|, n)} p(i)
\label{cumulative}
\end{equation}</p>

<p>Substituting in the values for the sizes of the board and number set simplifies this to:</p>

<p>\begin{equation}
w(n) = \sum _ {i=4}^n {c(24, i)\space c(51, n - i) \over c(75, n)} p(i)
\label{cumulative-simple}
\end{equation}</p>

<p>But we still need to define <em>p(n)</em>, this is where the small problem space comes in handy…</p>

<h3 id="assemble-a-brute-squad">Assemble a Brute Squad</h3>

<p>The probability of a Bingo given <em>n</em> hits on the board is the number of possible Bingo positions divided by the total number of positions, so before we can work out the probability we need to get the number of Bingo positions for each hit count.</p>

<p>As I mentioned earlier will use a brute force method of calculating the probability of a Bingo given <em>n</em> hits on the board. To do this we first need to come up with a representation of a board, as it only takes a single bit to represent the state of each square and there are only 24 squares, we can just use an int for this.</p>

<p>Here’s how we do that: number the squares from 0–23 left-to-right and top-to-bottom like so (FS represents the free space in the centre):</p>

<table class="gridded">
  <thead>
    <tr>
      <th style="text-align: right">0</th>
      <th style="text-align: right">1</th>
      <th style="text-align: right">2</th>
      <th style="text-align: right">3</th>
      <th style="text-align: right">4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">5</td>
      <td style="text-align: right">6</td>
      <td style="text-align: right">7</td>
      <td style="text-align: right">8</td>
      <td style="text-align: right">9</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td style="text-align: right">10</td>
      <td style="text-align: right">11</td>
      <td style="text-align: right">FS</td>
      <td style="text-align: right">12</td>
      <td style="text-align: right">13</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td style="text-align: right">14</td>
      <td style="text-align: right">15</td>
      <td style="text-align: right">16</td>
      <td style="text-align: right">17</td>
      <td style="text-align: right">18</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td style="text-align: right">19</td>
      <td style="text-align: right">20</td>
      <td style="text-align: right">21</td>
      <td style="text-align: right">22</td>
      <td style="text-align: right">23</td>
    </tr>
  </tbody>
</table>

<p>Then starting from the least significant bit we can use a 1 to represent a hit square and a 0 to represent an empty square. So a Bingo across the top row, with all other squares being empty is represented by <code>0b111110000000000000000000</code>; this and the remaining 11 possible Bingo positions (5 rows, 5 columns, and the 2 diagonals) can be represented like so:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">static</span> <span class="kd">final</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">BINGOS</span> <span class="o">=</span> <span class="o">{</span>
</span><span class="line">    <span class="mi">0</span><span class="n">b111110000000000000000000</span><span class="o">,</span> <span class="mi">0</span><span class="n">b000001111100000000000000</span><span class="o">,</span>
</span><span class="line">    <span class="mi">0</span><span class="n">b000000000011110000000000</span><span class="o">,</span> <span class="mi">0</span><span class="n">b000000000000001111100000</span><span class="o">,</span>
</span><span class="line">    <span class="mi">0</span><span class="n">b000000000000000000011111</span><span class="o">,</span> <span class="mi">0</span><span class="n">b100001000010001000010000</span><span class="o">,</span>
</span><span class="line">    <span class="mi">0</span><span class="n">b010000100001000100001000</span><span class="o">,</span> <span class="mi">0</span><span class="n">b001000010000000010000100</span><span class="o">,</span>
</span><span class="line">    <span class="mi">0</span><span class="n">b000100001000010001000010</span><span class="o">,</span> <span class="mi">0</span><span class="n">b000010000100010000100001</span><span class="o">,</span>
</span><span class="line">    <span class="mi">0</span><span class="n">b100000100000000001000001</span><span class="o">,</span> <span class="mi">0</span><span class="n">b000010001000000100010000</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>To create the array of Bingo combinations (indexed by number of hits, so a 25 element array) we will just loop through every possible board layout (i.e. the integers 0 through <code>0b11111111111111111111111</code>) and check each of them against the list of Bingo positions, if there is a match we can use the <code>Integer.bitCount()</code> method to count the number of hits on the board and then increment the counter there. The full code for this is:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">final</span> <span class="kt">long</span><span class="o">[]</span> <span class="n">bingoCombinations</span> <span class="o">=</span> <span class="n">createBingoCombinations</span><span class="o">();</span>
</span><span class="line">
</span><span class="line"><span class="kt">long</span><span class="o">[]</span> <span class="nf">createBingoCombinations</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">    <span class="kt">long</span><span class="o">[]</span> <span class="n">combinations</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">long</span><span class="o">[</span><span class="n">SQUARES</span> <span class="o">+</span> <span class="mi">1</span><span class="o">];</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="n">b111111111111111111111111</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">bingo</span> <span class="o">:</span> <span class="n">BINGOS</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">            <span class="k">if</span> <span class="o">((</span><span class="n">i</span> <span class="o">&amp;</span> <span class="n">bingo</span><span class="o">)</span> <span class="o">==</span> <span class="n">bingo</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">                <span class="n">combinations</span><span class="o">[</span><span class="n">Integer</span><span class="o">.</span><span class="na">bitCount</span><span class="o">(</span><span class="n">i</span><span class="o">)]++;</span>
</span><span class="line">                <span class="k">break</span><span class="o">;</span>
</span><span class="line">            <span class="o">}</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">return</span> <span class="n">combinations</span><span class="o">;</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Given this we can now calculate the probability of a Bingo at each hit count as described above, the code for this is:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">final</span> <span class="n">BigDecimal</span><span class="o">[]</span> <span class="n">bingoProbabilities</span> <span class="o">=</span> <span class="n">createBingoProbabilities</span><span class="o">();</span>
</span><span class="line">
</span><span class="line"><span class="n">BigDecimal</span><span class="o">[]</span> <span class="nf">createBingoProbabilities</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">    <span class="n">BigDecimal</span><span class="o">[]</span> <span class="n">probabilities</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BigDecimal</span><span class="o">[</span><span class="n">SQUARES</span> <span class="o">+</span> <span class="mi">1</span><span class="o">];</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">probabilities</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">ZERO</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">SQUARES</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">probabilities</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">div</span><span class="o">(</span><span class="n">d</span><span class="o">(</span><span class="n">bingoCombinations</span><span class="o">[</span><span class="n">i</span><span class="o">]),</span> <span class="n">combinations</span><span class="o">(</span><span class="n">SQUARES</span><span class="o">,</span> <span class="n">i</span><span class="o">));</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">return</span> <span class="n">probabilities</span><span class="o">;</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The last thing we need before moving on to calculate the actual chances of winning is a function to determine the probability of there being <em>k</em> hits hits on the board after <em>n</em> numbers have been called (the bit in equation \eqref{cumulative} that is being multiplied by <em>p(n)</em> and then summed). It’s just a literal translation of the equation:</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="kd">static</span> <span class="n">BigDecimal</span> <span class="nf">getHitProbability</span><span class="o">(</span><span class="kt">int</span> <span class="n">numHits</span><span class="o">,</span> <span class="kt">int</span> <span class="n">numCalls</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">return</span> <span class="nf">div</span><span class="o">(</span><span class="n">mul</span><span class="o">(</span><span class="n">combinations</span><span class="o">(</span><span class="mi">24</span><span class="o">,</span> <span class="n">numHits</span><span class="o">),</span> <span class="n">combinations</span><span class="o">(</span><span class="mi">51</span><span class="o">,</span> <span class="n">numCalls</span> <span class="o">-</span> <span class="n">numHits</span><span class="o">)),</span>
</span><span class="line">            <span class="n">combinations</span><span class="o">(</span><span class="mi">75</span><span class="o">,</span> <span class="n">numCalls</span><span class="o">));</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h3 id="chances-of-winning">Chances of Winning?</h3>

<p>We’ve now got everything we need to write the code for equation \eqref{cumulative}, given the previous function and the pre-computed array of proabilities the code to do this is simple:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="n">BigDecimal</span><span class="o">[]</span> <span class="nf">createBoardProbabilities</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">    <span class="n">BigDecimal</span><span class="o">[]</span> <span class="n">probabilities</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BigDecimal</span><span class="o">[</span><span class="n">NUMBERS</span> <span class="o">+</span> <span class="mi">1</span><span class="o">];</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="o">;</span> <span class="o">++</span><span class="n">n</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">probabilities</span><span class="o">[</span><span class="n">n</span><span class="o">]</span> <span class="o">=</span> <span class="n">ZERO</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="n">NUMBERS</span><span class="o">;</span> <span class="o">++</span><span class="n">n</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">BigDecimal</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">ZERO</span><span class="o">;</span>
</span><span class="line">        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">4</span><span class="o">;</span> <span class="n">s</span> <span class="o">&lt;=</span> <span class="n">SQUARES</span><span class="o">;</span> <span class="o">++</span><span class="n">s</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">            <span class="n">sum</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">sum</span><span class="o">,</span> <span class="n">mul</span><span class="o">(</span><span class="n">getHitProbability</span><span class="o">(</span><span class="n">s</span><span class="o">,</span> <span class="n">n</span><span class="o">),</span> <span class="n">bingoProbabilities</span><span class="o">[</span><span class="n">s</span><span class="o">]));</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">        <span class="n">probabilities</span><span class="o">[</span><span class="n">n</span><span class="o">]</span> <span class="o">=</span> <span class="n">sum</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">return</span> <span class="n">probabilities</span><span class="o">;</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is fine for a single board, but what about the odds for a real game, with many players? The odds of finding a winner when there are <em>k</em> boards is given by:</p>

<p>\begin{equation}
m(n,k) = 1 - (1 - w(n))^k
\label{many}
\end{equation}</p>

<p>Armed with this we can implement a function to return the probability of a winning board for any number of boards and numbers called like so:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="n">BigDecimal</span> <span class="nf">getProbability</span><span class="o">(</span><span class="kt">int</span> <span class="n">numCalls</span><span class="o">,</span> <span class="kt">int</span> <span class="n">numBoards</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">numBoards</span> <span class="o">==</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="k">return</span> <span class="n">boardProbabilities</span><span class="o">[</span><span class="n">numCalls</span><span class="o">];</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">return</span> <span class="nf">sub</span><span class="o">(</span><span class="n">ONE</span><span class="o">,</span> <span class="n">pow</span><span class="o">(</span><span class="n">sub</span><span class="o">(</span><span class="n">ONE</span><span class="o">,</span> <span class="n">boardProbabilities</span><span class="o">[</span><span class="n">numCalls</span><span class="o">]),</span> <span class="n">numBoards</span><span class="o">));</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>And that’s everything! All that’s left to add is a main method to print out some stats and that’s it.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="n">BingoOdds</span> <span class="n">bingo</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BingoOdds</span><span class="o">();</span>
</span><span class="line">    <span class="n">bingo</span><span class="o">.</span><span class="na">printStatistics</span><span class="o">();</span>
</span><span class="line">    <span class="n">bingo</span><span class="o">.</span><span class="na">printProbabilities</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="mi">10</span><span class="o">,</span> <span class="mi">25</span><span class="o">,</span> <span class="mi">50</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>If you want to play with this some more, an interesting excercise would be to generalize this for any size of board and token (number) set. To do that you’ll need to get rid of the static <code>BINGOS</code> array and calculate id dynamically, based on the size of the square, other than that and a coupl of constants that need to be replaced by variables everything else should work as is.</p>

<p>The full code, including the implementations of the print methods can be found on <a href="https://github.com/ianp/praxis-java/blob/master/src/main/java/org/ianp/praxis/BingoOdds.java">GitHub</a>.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Programming Praxis]]></title>
    <link href="http://ianp.org/2013/01/15/programming-praxis"/>
    <updated>2013-01-15T14:03:00+00:00</updated>
    <id>http://ianp.org/2013/01/15/programming-praxis</id>
    <content type="html"><![CDATA[<p>Over the weekend I stumbled across the <a href="http://programmingpraxis.com">Programming Praxis</a> web site, a blog that aims to “publishes new programming exercises weekly, at least, so that savvy programmers can maintain their skills by working the exercises and thinking outside their normal skill set”. It’s been running for about three years now and at the time of writing there are almost 400 problems there. I thought that I’d like to have a go at solving a few of them, I’m going to try solving them in Java initially, and then maybe revisit them in other languages to compare the solutions.</p>

<p>I’ve got solutions to the first couple of problems ready to go, and all of my solutions can be found in <a href="http://github.com/ianp/praxis-java">this project</a> on GitHub.</p>

<h3 id="reverse-polish-notation-calculator">Reverse Polish Notation Calculator</h3>

<p>This is trivial to implement in Java using the built in <code>Console</code> class, the complete implementation (sans class boilerplace and imports) is:</p>

<div class="bogus-wrapper"><notextile><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>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Console</span> <span class="n">console</span> <span class="o">=</span> <span class="n">System</span><span class="o">.</span><span class="na">console</span><span class="o">();</span>
</span><span class="line"><span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Deque</span><span class="o">&lt;</span><span class="n">BigDecimal</span><span class="o">&gt;</span> <span class="n">stack</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayDeque</span><span class="o">&lt;&gt;();</span>
</span><span class="line">
</span><span class="line"><span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">processLine</span><span class="o">(</span><span class="n">String</span> <span class="n">line</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">s</span> <span class="o">:</span> <span class="n">line</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">&quot;\\s+&quot;</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">        <span class="k">if</span> <span class="o">(</span><span class="s">&quot;+&quot;</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">s</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">            <span class="n">stack</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">().</span><span class="na">add</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">()));</span>
</span><span class="line">        <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="s">&quot;-&quot;</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">s</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">            <span class="n">stack</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">().</span><span class="na">subtract</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">()));</span>
</span><span class="line">        <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="s">&quot;*&quot;</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">s</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">            <span class="n">stack</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">().</span><span class="na">multiply</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">()));</span>
</span><span class="line">        <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="s">&quot;/&quot;</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">s</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">            <span class="n">stack</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">().</span><span class="na">divide</span><span class="o">(</span><span class="n">stack</span><span class="o">.</span><span class="na">pop</span><span class="o">()));</span>
</span><span class="line">        <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="s">&quot;exit&quot;</span><span class="o">.</span><span class="na">equalsIgnoreCase</span><span class="o">(</span><span class="n">s</span><span class="o">)</span> <span class="o">||</span> <span class="s">&quot;quit&quot;</span><span class="o">.</span><span class="na">equalsIgnoreCase</span><span class="o">(</span><span class="n">s</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">            <span class="n">System</span><span class="o">.</span><span class="na">exit</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
</span><span class="line">        <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
</span><span class="line">            <span class="n">stack</span><span class="o">.</span><span class="na">push</span><span class="o">(</span><span class="k">new</span> <span class="n">BigDecimal</span><span class="o">(</span><span class="n">s</span><span class="o">));</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="n">console</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;%s%n&quot;</span><span class="o">,</span> <span class="n">stack</span><span class="o">.</span><span class="na">peek</span><span class="o">()).</span><span class="na">flush</span><span class="o">();</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">try</span> <span class="o">{</span>
</span><span class="line">        <span class="n">String</span> <span class="n">line</span><span class="o">;</span>
</span><span class="line">        <span class="k">while</span> <span class="o">((</span><span class="n">line</span> <span class="o">=</span> <span class="n">console</span><span class="o">.</span><span class="na">readLine</span><span class="o">(</span><span class="s">&quot;&gt; &quot;</span><span class="o">))</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">            <span class="n">processLine</span><span class="o">(</span><span class="n">line</span><span class="o">);</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">console</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;%s: %s%n&quot;</span><span class="o">,</span> <span class="n">e</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getSimpleName</span><span class="o">(),</span> <span class="n">e</span><span class="o">.</span><span class="na">getMessage</span><span class="o">());</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Compared with other solutions the only interesting things are the use of <code>BigDecimal</code> instead of primitive types, this means that the calculator supports a wider range of numbers and input formats, and the use of a <code>Deque</code> as the stack, this is a more modern class than the old Java 1.0 vintage <code>Stack</code> class.</p>

<p>The full class is <a href="https://github.com/ianp/praxis-java/blob/master/src/main/java/org/ianp/praxis/RPNCalculator.java">here</a>.</p>

<h3 id="sieve-of-eratosthenes">Sieve of Eratosthenes</h3>

<p>This classic algotrithm is a bit more interesting: my first thought was to lazily create the list of primes using modulo checks to filter out non-prime numbers. Technically this isn’t the Sieve of Eratosthenes, but it’s logically the same. Well, it performed terribly taking several seconds to compute the first million primes.</p>

<p>It turns out that one of the reasons the actual sieve is so fast is that it only uses addition rather than the more expensive modulo operations. This, plus the memory saving gained from using a <code>BitSet</code> instead of a list of <code>Integer</code>s gave me a nice, zippy, implementation. The relevant method is:</p>

<div class="bogus-wrapper"><notextile><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>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">public</span> <span class="kd">static</span> <span class="n">BitSet</span> <span class="nf">sieve</span><span class="o">(</span><span class="kt">int</span> <span class="n">target</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="n">BitSet</span> <span class="n">primes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BitSet</span><span class="o">(</span><span class="n">target</span><span class="o">);</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">target</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">primes</span><span class="o">;</span> <span class="o">}</span>
</span><span class="line">    <span class="n">primes</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="mi">2</span><span class="o">);</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="n">target</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="o">)</span> <span class="o">{</span> <span class="k">return</span> <span class="n">primes</span><span class="o">;</span> <span class="o">}</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">target</span><span class="o">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">primes</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">prime</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span> <span class="n">prime</span> <span class="o">*</span> <span class="n">prime</span> <span class="o">&lt;</span> <span class="n">target</span><span class="o">;</span> <span class="n">prime</span> <span class="o">=</span> <span class="n">primes</span><span class="o">.</span><span class="na">nextSetBit</span><span class="o">(</span><span class="n">prime</span> <span class="o">+</span> <span class="mi">1</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">prime</span> <span class="o">+</span> <span class="n">prime</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">target</span><span class="o">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">prime</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">            <span class="n">primes</span><span class="o">.</span><span class="na">clear</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
</span><span class="line">        <span class="o">}</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">return</span> <span class="n">primes</span><span class="o">;</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>And of course in a real implementation this would be a good candidate for memoization giving you <em>O(1)</em> performance in the common case.</p>

<p>The full class is <a href="https://github.com/ianp/praxis-java/blob/master/src/main/java/org/ianp/praxis/SieveOfEratosthenes.java">here</a>.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Builders and Factories]]></title>
    <link href="http://ianp.org/2013/01/09/builders-and-factories"/>
    <updated>2013-01-09T18:41:00+00:00</updated>
    <id>http://ianp.org/2013/01/09/builders-and-factories</id>
    <content type="html"><![CDATA[<p>I started to write a ‘quick’ response to <a href="http://toomuchcoding.blogspot.ie/2013/01/hamcrest-matchers-guava-predicate-and.html">this post about builders</a> and it kind of got out of hand, so I’m putting it up here instead.</p>

<p>The post isn’t bad, but I think that Marcin is getting the builder and factory patterns a little mixed up. To recap:</p>

<p>The intent of the <strong>Builder Pattern</strong> is to separate out the construction of an object from it’s final representation. Doing this makes it easier to enforce preconditions and invariants, and also makes the object construction easier to read in languages without keyword arguments.</p>

<p>The intent of the <strong>Factory Pattern</strong> on the other hand, is to delegate responsibility for creating an object to somebody else. It is commonly used in dependency injection frameworks.</p>

<p>A concrete example should serve to illustrate the differences.</p>

<h3 id="a-builder-example">A Builder Example</h3>

<p>Assume that we have an interface for a simple Pojo:</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Employee</span> <span class="o">{</span>
</span><span class="line">    <span class="kd">public</span> <span class="n">Date</span> <span class="nf">getHiredAt</span><span class="o">();</span>
</span><span class="line">    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getId</span><span class="o">();</span>
</span><span class="line">    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getName</span><span class="o">();</span>
</span><span class="line">    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">getSalary</span><span class="o">();</span>
</span><span class="line">    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getTitle</span><span class="o">();</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>and a default implementation (shown here as a separae class, but it could also be a static inner class in the interface):</p>

<div class="bogus-wrapper"><notextile><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>
<span class="line-number">36</span>
<span class="line-number">37</span>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">class</span> <span class="nc">EmployeeImpl</span> <span class="kd">implements</span> <span class="n">Employee</span> <span class="o">{</span>
</span><span class="line">
</span><span class="line">    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">_id</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">_name</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">_title</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">_salary</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="kd">final</span> <span class="n">Date</span> <span class="n">_hiredAt</span><span class="o">;</span>
</span><span class="line">
</span><span class="line">    <span class="n">EmployeeImpl</span><span class="o">(</span><span class="n">String</span> <span class="n">id</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">title</span><span class="o">,</span> <span class="kt">int</span> <span class="n">salary</span><span class="o">,</span> <span class="n">Date</span> <span class="n">hiredAt</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">_id</span> <span class="o">=</span> <span class="n">id</span><span class="o">;</span>
</span><span class="line">        <span class="n">_name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
</span><span class="line">        <span class="n">_title</span> <span class="o">=</span> <span class="n">title</span><span class="o">;</span>
</span><span class="line">        <span class="n">_salary</span> <span class="o">=</span> <span class="n">salary</span><span class="o">;</span>
</span><span class="line">        <span class="n">_hiredAt</span> <span class="o">=</span> <span class="n">hiredAt</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Date</span> <span class="nf">getHiredAt</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">        <span class="k">return</span> <span class="n">_hiredAt</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getId</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">        <span class="k">return</span> <span class="n">_id</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="c1">// ...</span>
</span><span class="line">
</span><span class="line">    <span class="nd">@Override</span>
</span><span class="line">    <span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">        <span class="k">return</span> <span class="n">Objects</span><span class="o">.</span><span class="na">toStringHelper</span><span class="o">(</span><span class="k">this</span><span class="o">).</span><span class="na">omitNullValues</span><span class="o">()</span>
</span><span class="line">            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;id&quot;</span><span class="o">,</span> <span class="n">_id</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;name&quot;</span><span class="o">,</span> <span class="n">_name</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;title&quot;</span><span class="o">,</span> <span class="n">_title</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;salary&quot;</span><span class="o">,</span> <span class="n">_salary</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;hiredAt&quot;</span><span class="o">,</span> <span class="n">_hiredAt</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">toString</span><span class="o">();</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Even with just a few fields like this invoking the constructor becomes somewhat ugly:</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="n">Employee</span> <span class="n">e</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EmployeeImpl</span><span class="o">(</span>
</span><span class="line">    <span class="s">&quot;1&quot;</span><span class="o">,</span> <span class="s">&quot;Fred Foobar&quot;</span><span class="o">,</span> <span class="s">&quot;Engineer&quot;</span><span class="o">,</span> <span class="mi">100000</span><span class="o">,</span> <span class="k">new</span> <span class="n">Date</span><span class="o">());</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Without referring to the docs or source code how do you know what all of those strings mean? How do you know that you have them in the correct order? And if it seems reasonable clear in this example imaging if your Pojo was mainly non-string data!</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="n">MyPojo</span> <span class="n">p</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyPojoImpl</span><span class="o">(</span><span class="mi">123</span><span class="o">,</span> <span class="kc">true</span> <span class="kc">false</span><span class="o">,</span> <span class="kc">false</span> <span class="mf">45.83</span><span class="o">,</span> <span class="s">&quot;wtf???&quot;</span><span class="o">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Clear as mud, right?</p>

<p>Other languages don’t have this problem, for example in Objective-C we would write something like:</p>

<div class="bogus-wrapper"><notextile><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="objc"><span class="line"><span class="kt">id</span> <span class="n">obj</span> <span class="o">=</span> <span class="p">[</span><span class="n">EGEmployee</span> <span class="nl">employeeWithId:</span><span class="s">@&quot;1&quot;</span> <span class="nl">name:</span><span class="s">@&quot;Fred Foobar&quot;</span>
</span><span class="line">        <span class="nl">title:</span><span class="s">@&quot;Apple Engineer&quot;</span> <span class="nl">salary:</span><span class="mi">200000</span> <span class="nl">hiredAt:</span><span class="s">@&quot;2001-03-24&quot;</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>which is much clearer. Ruby, Python, and other languages all have similar constructs. Adding a builder allows us to gain the same level of clarity in Java, and it provides a good place for us to perform any additional checks before creating the object. Here’s a typical implementation and an example of calling it:</p>

<div class="bogus-wrapper"><notextile><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>
<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>
</pre></td><td class="code"><pre><code class="java"><span class="line"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Builder</span> <span class="o">{</span>
</span><span class="line">
</span><span class="line">    <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">AtomicInteger</span> <span class="n">_ids</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AtomicInteger</span><span class="o">();</span>
</span><span class="line">
</span><span class="line">    <span class="kd">private</span> <span class="kd">static</span> <span class="n">String</span> <span class="nf">checkString</span><span class="o">(</span><span class="n">String</span> <span class="n">value</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">value</span> <span class="o">=</span> <span class="n">nullToEmpty</span><span class="o">(</span><span class="n">value</span><span class="o">).</span><span class="na">trim</span><span class="o">();</span>
</span><span class="line">        <span class="n">checkArgument</span><span class="o">(!</span><span class="n">value</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">(),</span> <span class="s">&quot;%s cannot be null or empty&quot;</span><span class="o">,</span> <span class="n">name</span><span class="o">);</span>
</span><span class="line">        <span class="k">return</span> <span class="n">value</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">private</span> <span class="n">String</span> <span class="n">_id</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="n">String</span> <span class="n">_name</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="n">String</span> <span class="n">_title</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="n">Integer</span> <span class="n">_salary</span><span class="o">;</span>
</span><span class="line">    <span class="kd">private</span> <span class="n">Date</span> <span class="n">_hiredAt</span><span class="o">;</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">hiredAt</span><span class="o">(</span><span class="n">Date</span> <span class="n">hiredAt</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">_hiredAt</span> <span class="o">=</span> <span class="n">hiredAt</span><span class="o">;</span>
</span><span class="line">        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">id</span><span class="o">(</span><span class="n">String</span> <span class="n">id</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">_id</span> <span class="o">=</span> <span class="n">id</span><span class="o">;</span>
</span><span class="line">        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">name</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">_name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
</span><span class="line">        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">salary</span><span class="o">(</span><span class="kt">int</span> <span class="n">salary</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">checkArgument</span><span class="o">(</span><span class="n">salary</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="o">,</span> <span class="s">&quot;salary cannot be negative&quot;</span><span class="o">);</span>
</span><span class="line">        <span class="n">_salary</span> <span class="o">=</span> <span class="n">salary</span><span class="o">;</span>
</span><span class="line">        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Builder</span> <span class="nf">title</span><span class="o">(</span><span class="n">String</span> <span class="n">title</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">        <span class="n">_title</span> <span class="o">=</span> <span class="n">title</span><span class="o">;</span>
</span><span class="line">        <span class="k">return</span> <span class="k">this</span><span class="o">;</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">
</span><span class="line">    <span class="kd">public</span> <span class="n">Employee</span> <span class="nf">build</span><span class="o">()</span> <span class="o">{</span>
</span><span class="line">        <span class="k">return</span> <span class="k">new</span> <span class="nf">Impl</span><span class="o">(</span>
</span><span class="line">                <span class="n">_id</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="n">_id</span> <span class="o">:</span> <span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">&quot;emp:%06d&quot;</span><span class="o">,</span> <span class="n">_ids</span><span class="o">.</span><span class="na">incrementAndGet</span><span class="o">()),</span>
</span><span class="line">                <span class="n">checkString</span><span class="o">(</span><span class="n">_name</span><span class="o">,</span> <span class="s">&quot;name&quot;</span><span class="o">),</span>
</span><span class="line">                <span class="n">checkString</span><span class="o">(</span><span class="n">_title</span><span class="o">,</span> <span class="s">&quot;title&quot;</span><span class="o">),</span>
</span><span class="line">                <span class="n">checkNotNull</span><span class="o">(</span><span class="n">_salary</span><span class="o">,</span> <span class="s">&quot;salary&quot;</span><span class="o">),</span>
</span><span class="line">                <span class="n">_hiredAt</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="n">_hiredAt</span> <span class="o">:</span> <span class="k">new</span> <span class="n">Date</span><span class="o">());</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line"><span class="o">}</span>
</span><span class="line">
</span><span class="line"><span class="c1">// elsewhere ...</span>
</span><span class="line"><span class="kd">public</span> <span class="n">Employee</span> <span class="nf">findEmployeeById</span><span class="o">(</span><span class="n">String</span> <span class="n">id</span><span class="o">)</span> <span class="o">{</span>
</span><span class="line">    <span class="k">if</span> <span class="o">(</span><span class="s">&quot;1&quot;</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">id</span><span class="o">))</span> <span class="o">{</span>
</span><span class="line">        <span class="k">return</span> <span class="k">new</span> <span class="nf">Builder</span><span class="o">().</span><span class="na">id</span><span class="o">(</span><span class="n">id</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">name</span><span class="o">(</span><span class="s">&quot;Fred Foobar&quot;</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">title</span><span class="o">(</span><span class="s">&quot;Engineer&quot;</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">salary</span><span class="o">(</span><span class="mi">100000</span><span class="o">)</span>
</span><span class="line">            <span class="o">.</span><span class="na">hiredAt</span><span class="o">(</span><span class="s">&quot;2001-03-24&quot;</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
</span><span class="line">    <span class="o">}</span>
</span><span class="line">    <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Again, all pretty clear now, and HotSpot will inline all of those method calls no there should be no additional overhead once the JVM is up and running. </p>

<h3 id="a-factory-example">A Factory Example</h3>

<p>Factories are different, but it would be common for a factory to <em>use</em> a builder to create the objects that it vends. For example, here is a factory for employee objects (it doesn’t need to have the word Factory in it’s name):</p>

<div class="bogus-wrapper"><notextile><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="java"><span class="line"><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Employees</span> <span class="o">{</span>
</span><span class="line">    <span class="n">Iterable</span><span class="o">&lt;</span><span class="n">Employee</span><span class="o">&gt;</span> <span class="n">all</span><span class="o">();</span>
</span><span class="line">    <span class="n">Employee</span> <span class="nf">findbyId</span><span class="o">(</span><span class="n">String</span> <span class="n">id</span><span class="o">);</span>
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We can then have different implementations of this, maybe one that loads data from a CSV or JSON file for testing purposes, and one that loads data via JDBC for production use.</p>

<p><strong>Aside:</strong> if you’re familiar with <em>domain-driven design</em> you’ll be forgiven for noticing a lot of overlap between the factory pattern and DDD’s concept of <em>repositories,</em> they’re very similar concepts. One difference being that factories are often able to create new objects <em>ex nihilo</em> while repositories usually retreive objects from external sources. Compare the <code>findById()</code> method with the <code>newInstance()</code> methods employed by many of the factory classes in the JDK.</p>

<p>Hopefully you can see from this post that the two patterns have different—if complementary—aims.</p>

<p>A complete example project with all of this code, as well as test cases and a CSV based implementation the the factory are available <a href="https://github.com/ianp/builder-example">on Github</a>.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[For Some Definition of Easily]]></title>
    <link href="http://ianp.org/2013/01/08/for-some-definition-of-easily"/>
    <updated>2013-01-08T14:00:00+00:00</updated>
    <id>http://ianp.org/2013/01/08/for-some-definition-of-easily</id>
    <content type="html"><![CDATA[<p><a href="http://www.mobileindustryreview.com/2013/01/lenovos-27-tablet-is-a-smart-idea-costs-1000-and-is-due-this-summer.html">This</a> is a joke, right?</p>

<p><img src="http://ianp.org/2013/01/08/easily.jpg" alt="Lenovo Horizon" /></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I Remain a Free Man]]></title>
    <link href="http://ianp.org/2012/12/17/i-remain-a-free-man"/>
    <updated>2012-12-17T17:19:00+00:00</updated>
    <id>http://ianp.org/2012/12/17/i-remain-a-free-man</id>
    <content type="html"><![CDATA[<p>After being <a href="http://www.guardian.co.uk/world/2012/dec/16/gerard-depardieu-french-passport-tax">described</a> as “pathetic and unpatriotic” by the prime minister Jean-Marc Ayrault, actor Gérard Depardieu responded:</p>

<blockquote>
  <p>Despite my excesses, my appetite and my love of life, I remain a free man</p>
</blockquote>

<p>Well said sir, well said indeed!</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Stroke Me Gently]]></title>
    <link href="http://ianp.org/2012/11/05/stroke-me-gently"/>
    <updated>2012-11-05T22:53:00+00:00</updated>
    <id>http://ianp.org/2012/11/05/stroke-me-gently</id>
    <content type="html"><![CDATA[<p>Excellent <a href="http://www.gizmodo.co.uk/2012/10/search-me/">article</a> over at <a href="http://www.gizmodo.co.uk/">Gizmodo</a> about the whole security theatre dance that we’re forced to do any time we want to fly these days. My favourite quote:</p>

<blockquote>
  <p>I don’t have a problem with being searched at all – in fact, if you guys think it’s necessary, I’d be the first to admit that I look a little bit suspicious before I’ve had my first cup of coffee in the morning – but if you’re going to stroke me gently in front of hundreds of people, you’d better buy me a fucking drink first, is all I am saying.</p>
</blockquote>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rearranging the Apples]]></title>
    <link href="http://ianp.org/2012/10/31/rearranging-the-apples"/>
    <updated>2012-10-31T19:18:00+00:00</updated>
    <id>http://ianp.org/2012/10/31/rearranging-the-apples</id>
    <content type="html"><![CDATA[<p>Some <a href="http://www.appleoutsider.com/2012/10/30/regimechange/">insightful analysis</a> about the recent Apple reorganisation (a.k.a. Scott Forstall getting shit-canned) from <a href="http://www.appleoutsider.com/">Matt Drance</a>:</p>

<blockquote>
  <p>Not only is this a profound increase in responsibility for all three of these top executives, it’s a profound change in Apple’s organization going as far back as I can remember. There’s a long-standing pattern of separating watershed products important to the company’s future. The Mac and Apple teams. Mac OS X and Classic. The iPod division. iOS and Mac OS X. Suddenly, Tim Cook has pulled the reins in. Federighi owns software. Ive owns design. Cue owns services. Period.</p>
</blockquote>

<p>While it looks like this is something that asn’t exactly planned in advance, it seems like some people at Apple have been hoping for it for a while now. According to <a href="http://gigaom.com/2012/10/29/from-inside-apple-the-scott-forstall-fallout/">Om Malik</a>:</p>

<blockquote>
  <p>Forstall’s firing was met with a sense of quiet jubilation, especially among people who worked in the engineering groups.</p>
</blockquote>

<p>For my part, I’m mainly interested in seeing what happens to the UI now that Jony Ive is in charge of it, hopefully the misguided move towards skeuomorphic interfaces will be taken out back and shot.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[VLC Versions]]></title>
    <link href="http://ianp.org/2012/10/30/vlc-versions"/>
    <updated>2012-10-30T18:49:00+00:00</updated>
    <id>http://ianp.org/2012/10/30/vlc-versions</id>
    <content type="html"><![CDATA[<p>So I started up <a href="http://www.videolan.org" title="VLC media player">VLC</a> just now and was greeted with this update notification:</p>

<blockquote>
  <p>VLC media player 2.0.4</p>

  <p>This is a <strong>major update</strong> that fixes a lot of regressions of the 2.0.x branch of VLC.</p>

  <p>We are introducing an important number of fixes and improvements for all playback, notably for Blu-Ray, DVD, HLS, Ogg and MKV files; but also for Youtube, Vimeo, Koreus and Soundcloud.</p>

  <p>New support for the OPUS audio codec, including multichannel and streams.
…</p>
</blockquote>

<p>How the fuck is going from 2.0.3 to 2.0.4 the correct version bump for a <em>major</em> upgrade?</p>

<p>Jeez…</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Category Counts in OctoPress Revisited]]></title>
    <link href="http://ianp.org/2012/10/30/category-counts-in-octopress-revisited"/>
    <updated>2012-10-30T18:41:00+00:00</updated>
    <id>http://ianp.org/2012/10/30/category-counts-in-octopress-revisited</id>
    <content type="html"><![CDATA[<p>As an improvement on an older shell script, here’s a rake task to list all of the categories in your blog, along with post counts for each of them:</p>

<div class="bogus-wrapper"><notextile><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>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">desc</span> <span class="s2">&quot;count the number of posts in each category&quot;</span>
</span><span class="line"><span class="n">task</span> <span class="ss">:count_categories</span> <span class="k">do</span>
</span><span class="line">  <span class="nb">require</span> <span class="s1">&#39;yaml&#39;</span>
</span><span class="line">
</span><span class="line">  <span class="n">counts</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class="line">
</span><span class="line">  <span class="no">Dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">&#39;source/_posts/*.markdown&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span>
</span><span class="line">    <span class="n">post</span> <span class="o">=</span> <span class="k">begin</span>
</span><span class="line">      <span class="no">YAML</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">f</span><span class="p">))</span>
</span><span class="line">    <span class="k">rescue</span> <span class="no">ArgumentError</span> <span class="o">=&gt;</span> <span class="n">e</span>
</span><span class="line">      <span class="nb">puts</span> <span class="s2">&quot;error: parsing </span><span class="si">#{</span><span class="n">f</span><span class="si">}</span><span class="s2"> - </span><span class="si">#{</span><span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="n">cats</span> <span class="o">=</span> <span class="n">post</span><span class="o">[</span><span class="s1">&#39;categories&#39;</span><span class="o">]</span>
</span><span class="line">    <span class="k">if</span> <span class="n">cats</span><span class="o">.</span><span class="n">respond_to?</span> <span class="s2">&quot;each&quot;</span>
</span><span class="line">      <span class="n">cats</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="n">c</span><span class="o">|</span> <span class="n">counts</span><span class="o">[</span><span class="n">c</span><span class="o">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">[</span><span class="n">c</span><span class="o">].</span><span class="n">to_i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">}</span>
</span><span class="line">    <span class="k">else</span>
</span><span class="line">      <span class="n">counts</span><span class="o">[</span><span class="n">cats</span><span class="o">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">[</span><span class="n">cats</span><span class="o">].</span><span class="n">to_i</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">  <span class="k">end</span>
</span><span class="line">
</span><span class="line">  <span class="n">counts</span><span class="o">.</span><span class="n">sort_by</span> <span class="p">{</span><span class="o">|</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="o">|</span> <span class="n">v</span><span class="p">}</span><span class="o">.</span><span class="n">reverse</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">v</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">k</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
</span><span class="line"><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Just add this to the end of your OctoPress Rakefile and you’re good to go.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[NetBeans Rich Client Platform]]></title>
    <link href="http://ianp.org/2012/10/03/netbeans-rich-client-platform"/>
    <updated>2012-10-03T18:32:00+01:00</updated>
    <id>http://ianp.org/2012/10/03/netbeans-rich-client-platform</id>
    <content type="html"><![CDATA[<p>I’m in the process of dusting off some old Swing based apps to use more modern code, and also add some useful new features to them. At the same time I’m going to move the apps to use a more structured framework, as this should allow me to share more common code between the apps.</p>

<h4 id="picking-a-platform">Picking a Platform</h4>

<p>There are a number of options out there, including:</p>

<ul>
  <li><a href="http://www.jcp.org/en/jsr/detail?id=296">JSR-296</a> Swing Application Framework;</li>
  <li><a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform">Eclipse RCP</a>;</li>
  <li><a href="http://netbeans.org/features/platform/">NetBeans RCP</a>; and</li>
  <li><a href="http://jidesoft.com/jdaf/">Jide</a> Desktop Application Framework.</li>
</ul>

<p>JSR-296 is basically dead in the water at this point, and while there are a <a href="https://en.wikipedia.org/wiki/Swing_Application_Framework">few forks</a> doing the rounds I’m not really confident enough in any of them to want to move a reasonably sized codebase to it.</p>

<p>Eclipse uses a different UI toolkit altogether so it’s really a nonpstarter for this excercise, although it would be a good option if starting a new project from scratch.</p>

<p>Jide is a swing component vendor and a relatively new entrant into the RCP space. JDAF has some things going for it: it has the best platform integration of any framework, with much better native fidelity (e.g. message dialogs look OK on Mac OS X and Gnome) than either Eclipse or NetBeans. It also has some handy built-in support for document-centric apps. The downsides are that unlike the other offerings here it’s a commercial product, and it’s much less ambitious in scope than either Eclipse or NetBeans, presumably as many of the other features that these offer are also Jide products (e.g. their docking framework). I also found myself fighting to work with it’s limited data model support.</p>

<p>NetBeans seems to e a good fit for the apps that I’m converting, and it plays well with standard Swing idioms so it should be quite easy to port the code over. Recent releases have extensive support for annotation based configuration as well, which should ease the learning curve.</p>

<p>One downside is that most of the tutorials and documentation assume that you will also be using NetBeans as an IDE, which I won’t be (I use <a href="http://www.jetbrains.com/idea/">IntelliJ</a>), still, NetBeans RCP has pretty good Maven support so it shouldn’t matter too much.</p>

<h4 id="setting-up-a-project-with-netbeans-rcp">Setting Up a Project with NetBeans RCP</h4>

<p>Here’s how to create a project and add a module to it:</p>

<script src="https://gist.github.com/3828460.js?file=nbproject.sh"></script>

<p>You can then open this up in IntelliJ as a Maven based project and start editing away.</p>

<p>Adding additional modules (e.g. myviews, &amp;c.) is as simple as rerunning the last command and re-importing the maven model (or enabling auto-import in IntelliJ).</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Convenient]]></title>
    <link href="http://ianp.org/2012/10/01/convenient"/>
    <updated>2012-10-01T18:35:00+01:00</updated>
    <id>http://ianp.org/2012/10/01/convenient</id>
    <content type="html"><![CDATA[<p><a href="http://www.lispcast.com/class-abstractsingletonproxyfactorybean">This</a> is what’s wrong with a lot of the Java code out there.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bacon]]></title>
    <link href="http://ianp.org/2012/10/01/bacon"/>
    <updated>2012-10-01T18:35:00+01:00</updated>
    <id>http://ianp.org/2012/10/01/bacon</id>
    <content type="html"><![CDATA[<p>Mmmm, <a href="http://baconmethod.com">bacon</a>…</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I Swallowed a Fly]]></title>
    <link href="http://ianp.org/2012/06/20/i-swallowed-a-fly"/>
    <updated>2012-06-20T17:54:00+01:00</updated>
    <id>http://ianp.org/2012/06/20/i-swallowed-a-fly</id>
    <content type="html"><![CDATA[<p><img src="http://www.onefoottsunami.com/wordpress/wp-content/uploads/20120620magsafeadapter/6-forthesakeofcompleteness.jpg" alt="MagSafe Adapter" /></p>

<p>Wow, <a href="http://www.onefoottsunami.com/2012/06/20/the-magsafe-to-magsafe-2-adapter/">that</a> really is a lot of packaging for probably the world’s smallest connector. Also, reading the post about it, was anybody else reminded of <a href="https://en.wikipedia.org/wiki/There_Was_an_Old_Lady_Who_Swallowed_a_Fly">this</a>?</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[That was Quick]]></title>
    <link href="http://ianp.org/2012/06/20/that-was-quick"/>
    <updated>2012-06-20T16:58:00+01:00</updated>
    <id>http://ianp.org/2012/06/20/that-was-quick</id>
    <content type="html"><![CDATA[<p>That was quick! The videos from WWDC are <a href="https://developer.apple.com/videos/wwdc/2012/">up already</a>, last year it took Apple about a month to get them posted. Great news for folks like me who didn’t get to attend.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Leap into the Future!]]></title>
    <link href="http://ianp.org/2012/05/29/leap-into-the-future"/>
    <updated>2012-05-29T14:59:00+01:00</updated>
    <id>http://ianp.org/2012/05/29/leap-into-the-future</id>
    <content type="html"><![CDATA[<p><img src="http://ianp.org/2012/05/29/leap-motion.jpg" alt="Leap Motion" /></p>

<p><a href="http://leapmotion.com/">This</a> looks like a fascinating piece of technology provided it works as advertised. Check out the video on their, it looks pretty slick.</p>

<p>The company behind it make some pretty <a href="http://live.leapmotion.com/about.html">bold claims</a> about the technology:</p>

<blockquote>
  <p>Just about the size of a flash drive, the Leap can distinguish your individual fingers and track your movements down to a 1/100th of a millimeter.
…
Setup is just as intuitive.  Plug the LEAP into a USB port.  Load the Leap Motion software. Do a quick wave to calibrate. That’s it.</p>
</blockquote>

<p>Of course if you were to use it as a main input device I expect that you’d get tired pretty quickly, but for short sprints of use in specialist applications it looks neat.</p>

<p>And I’d love to see it paired with one the <a href="http://www.vuzix.com/consumer/products_wrap_1200vr.html">new sets</a> of VR displays that are hitting the market right now.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Think about that]]></title>
    <link href="http://ianp.org/2012/05/07/think-about-that"/>
    <updated>2012-05-07T23:32:00+01:00</updated>
    <id>http://ianp.org/2012/05/07/think-about-that</id>
    <content type="html"><![CDATA[<blockquote>
  <p>Good design. From eBay. Think about that.</p>
</blockquote>

<p>Beautiful turn of phrase from John Gruber over at <a href="http://daringfireball.net/linked/2012/05/07/ebay-ipad-app">Daring Fireball</a>.</p>

<p>Posted as part of my new effort to improve my writing.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RubyMotion and Interface Builder…]]></title>
    <link href="http://ianp.org/2012/05/07/rubymotion-and-interface-builder"/>
    <updated>2012-05-07T19:24:00+01:00</updated>
    <id>http://ianp.org/2012/05/07/rubymotion-and-interface-builder</id>
    <content type="html"><![CDATA[<p>…sitting in a tree, K-I-S-S-I-N-G…</p>

<p>So, all of the cool kids have been talking about <a href="http://chopine.be/">Laurent Sansonetti</a>’s next project: <a href="http://www.rubymotion.com/">RubyMotion</a>, a port of MacRuby targeted at iOS. On the whole I’m pretty impressed with what you can already do with it. One of the issues that people having been mentioning though, is that you lose the ability to use Interface Builder with it, but this isn’t actually true!</p>

<p>Here I’m going to show you how to work with Interface Builder, I’ll base the project off the one used in the Pragmatic Studio <a href="http://pragmaticstudio.com/screencasts/rubymotion">screencast</a> (the icon and background images come from there as well, by the way).</p>

<p><strong>Update:</strong> the images don’t dome from there any more! The images used in the screencast are from iStockPhoto, so I’ve replaced the background image with a different one. Needless to say this doesn;t affect any of the code.</p>

<p>All of the code for this project can be found on <a href="https://github.com/ianp/MagicBallDemo">GitHub</a>. </p>

<h2 id="setting-up-a-project">Setting up a Project</h2>

<p>Start off as normal: <code>motion create MagicBallDemo</code>. In the project folder create a new subfolder called <em>interfaces</em>, this is where all of the <code>.xib</code> files will be saved.</p>

<p>Next create a model class called <code>MagicBall</code> and a view controller called <code>MagicViewController</code> which extends <code>UIViewController</code>, also create a file to store some small helper methods called <code>helpers.rb</code>. Don’t worry about the contents of these files for now, I’ll come back to them, but you should have the following:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="sh"><span class="line"><span class="nv">$ </span>ls app
</span><span class="line">app_delegate.rb          magic_ball.rb
</span><span class="line">helpers.rb               magic_view_controller.rb
</span><span class="line"><span class="nv">$ </span>cat app/magic_view_controller.rb
</span><span class="line">class MagicViewController &lt; UIViewController
</span><span class="line">end
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The next thing to do is create the UI using interface builder.</p>

<h2 id="creating-the-user-interface">Creating the User Interface</h2>

<p>Open Xcode and hit <em>⌘-N</em> to create a new file, select the <em>Empty</em> template and save the file into the folder you just created. Now add a <code>View Controller</code> from the object library and set the custom class to <code>MagicViewController</code>; you can’t edit this field directly but you <em>can</em> paste into it, so select the class name from <code>app/magic_view_controller.rb</code>. </p>

<p>The next step is to add the view to it’s controller, normally this would just mean dragging a <code>UIImageView</code> on top of the controller but that won’t work here. There is a problem with interface builder in that you can’t add subviews to <code>UIImageView</code>s, which is a pain in the ass. A simple workaround is described in <a href="http://stackoverflow.com/questions/2415561/apple-interface-builder-adding-subview-to-uiimageview">this</a> Stack Overflow question, and that’s what we’ll do here. So, add a <code>UIView</code> to the view controller and set it’s custom class to be <code>UIImageView</code> (which should be available in the pick-list). You can’t set the image here, that will need to be done in code.</p>

<p>Finally add the label and configure it as desired. Save your changes and close XCode.</p>

<p>You can compile this into a <code>.nib</code> using <code>ibtool</code>, this script will compile all of the interfaces in your project (just one in this case):</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="sh"><span class="line"><span class="k">for </span>i in interfaces/*.xib
</span><span class="line"><span class="k">do</span>
</span><span class="line"><span class="k">  </span><span class="nb">echo</span> <span class="s2">&quot;compiling `basename $i`...&quot;</span>
</span><span class="line">  ibtool --compile resources/<span class="sb">`</span>basename -s .xib <span class="nv">$i</span><span class="sb">`</span>.nib <span class="nv">$i</span>
</span><span class="line"><span class="k">done</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><strong>Update:</strong> as of RubyMotion 1.3 this happens automatically, no need to compile your nibs by hand and more!</p>

<h2 id="connecting-up-the-code">Connecting up the Code</h2>

<p>The first thing we need to do is make sure our app delegate loads the interface from the nib that we’ve created, and we set our <code>@window</code> ivar from the loaded nib.</p>

<div class="bogus-wrapper"><notextile><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="objc"><span class="line"><span class="n">def</span> <span class="n">application</span><span class="p">(</span><span class="n">application</span><span class="p">,</span> <span class="nl">didFinishLaunchingWithOptions:</span><span class="n">options</span><span class="p">)</span>
</span><span class="line">  <span class="err">@</span><span class="n">window</span> <span class="o">=</span> <span class="n">UIWindow</span><span class="p">.</span><span class="n">alloc</span><span class="p">.</span><span class="n">initWithFrame</span><span class="p">(</span><span class="n">UIScreen</span><span class="p">.</span><span class="n">mainScreen</span><span class="p">.</span><span class="n">bounds</span><span class="p">)</span>
</span><span class="line">  <span class="err">@</span><span class="n">window</span><span class="p">.</span><span class="n">rootViewController</span> <span class="o">=</span> <span class="n">NSBundle</span><span class="p">.</span><span class="n">mainBundle</span><span class="p">.</span><span class="n">loadNibNamed</span><span class="p">(</span><span class="err">&#39;</span><span class="n">MagicBallView</span><span class="err">&#39;</span><span class="p">,</span> <span class="nl">owner:</span><span class="n">self</span><span class="p">,</span> <span class="nl">options:</span><span class="nb">nil</span><span class="p">).</span><span class="n">first</span>
</span><span class="line">  <span class="err">@</span><span class="n">window</span><span class="p">.</span><span class="n">rootViewController</span><span class="p">.</span><span class="n">wantsFullScreenLayout</span> <span class="o">=</span> <span class="n">true</span>
</span><span class="line">  <span class="err">@</span><span class="n">window</span><span class="p">.</span><span class="n">makeKeyAndVisible</span>
</span><span class="line">  <span class="n">true</span>
</span><span class="line"><span class="n">end</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The nib loading process will create an instance of our view controllor for us, but we need to wire up a few connections add add some behaviour, here’s a simplified version of the code:</p>

<div class="bogus-wrapper"><notextile><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>
</pre></td><td class="code"><pre><code class="objc"><span class="line">  <span class="n">def</span> <span class="n">viewDidLoad</span>
</span><span class="line">    <span class="err">@</span><span class="n">magicBall</span> <span class="o">=</span> <span class="n">MagicBall</span><span class="p">.</span><span class="n">new</span>
</span><span class="line">    <span class="err">@</span><span class="n">label</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">view</span><span class="p">.</span><span class="n">subviews</span><span class="p">.</span><span class="n">first</span>
</span><span class="line">
</span><span class="line">    <span class="n">view</span><span class="p">.</span><span class="n">image</span> <span class="o">=</span> <span class="n">UIImage</span><span class="p">.</span><span class="n">imageNamed</span><span class="p">(</span><span class="err">&#39;</span><span class="n">background</span><span class="p">.</span><span class="n">png</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class="line">    <span class="n">view</span><span class="p">.</span><span class="n">whenTapped</span> <span class="k">do</span>
</span><span class="line">      <span class="n">UIView</span><span class="p">.</span><span class="n">animateWithDuration</span><span class="p">(</span><span class="mf">0.75</span><span class="p">,</span>
</span><span class="line">        <span class="nl">animations:</span><span class="n">lambda</span> <span class="p">{</span>
</span><span class="line">          <span class="err">@</span><span class="n">label</span><span class="p">.</span><span class="n">alpha</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class="line">          <span class="err">@</span><span class="n">label</span><span class="p">.</span><span class="n">transform</span> <span class="o">=</span> <span class="n">createTransform</span>
</span><span class="line">        <span class="p">},</span>
</span><span class="line">        <span class="nl">completion:</span><span class="n">lambda</span> <span class="p">{</span> <span class="o">|</span><span class="n">finished</span><span class="o">|</span>
</span><span class="line">          <span class="err">@</span><span class="n">label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="err">@</span><span class="n">magicBall</span><span class="p">.</span><span class="n">answer</span>
</span><span class="line">          <span class="err">@</span><span class="n">label</span><span class="p">.</span><span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformIdentity</span>
</span><span class="line">        <span class="p">})</span>
</span><span class="line">    <span class="n">end</span>
</span><span class="line">  <span class="n">end</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>I know that there is only 1 subview so it’s easy to grab a reference to the label and store it in an ivar, a more realisic example could <code>select</code> the label based on a tag.</p>

<p>As mentioned above, I need to explicitly set the image and this happens here as well.</p>

<p>Finally, set up the gesture recognizer. This is one place that Ruby shines, it’s trivial for us to add helper methods like this, have a look in <code>app/helpers.rb</code> for the code that enabled this.</p>

<h2 id="wrapping-up">Wrapping Up</h2>

<p>It’s a good idea to add <code>resources/*.nib</code> to the <code>.gitignore</code> file as compiled resources don;t need to be committed to Git. I also add <code>doc/app</code> then I can use <em>rocco</em> to generate some documentation.</p>

<p>Take a look at the full <a href="https://github.com/ianp/MagicBallDemo">project on GitHub</a> and let me know what you think!</p>

<p><strong>Update:</strong> clarified the wording around adding the <code>UIImageView</code>.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Apple Security Cock-Up]]></title>
    <link href="http://ianp.org/2012/05/07/apple-security-cock-up"/>
    <updated>2012-05-07T16:04:00+01:00</updated>
    <id>http://ianp.org/2012/05/07/apple-security-cock-up</id>
    <content type="html"><![CDATA[<p><a href="http://www.zdnet.com/blog/security/apple-security-blunder-exposes-lion-login-passwords-in-clear-text/11963">This</a> doesn’t look good.</p>

<p>Apple’s approach to security in general is a bit worrying: one the one hand they seem to have the right approach to securing the OS with App Store entitlements (although these aren’t without <a href="http://www.robpeck.com/2012/01/app-store-entitlements-and-the-crippling-of-an-app/">issues</a>) and <a href="http://www.apple.com/macosx/mountain-lion/security.html">Gatekeeper</a>, but their timeliness in shipping security fixes leaves a lot to be desired. Note from the article that this flaw was pointed out to them <em>3 months</em> ago!</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Category Counts in Octopress]]></title>
    <link href="http://ianp.org/2012/04/18/category-counts-in-octopress"/>
    <updated>2012-04-18T10:36:00+01:00</updated>
    <id>http://ianp.org/2012/04/18/category-counts-in-octopress</id>
    <content type="html"><![CDATA[<p>Here’s a quick shell script to get the number of posts in each category for an <a href="http://octopress.org/">Octopress</a> blog, just cat your <code>source/_posts</code> folder through the following one-liner:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="sh"><span class="line">sed -n <span class="s1">&#39;/^---/,/^---/p&#39;</span> |<span class="se">\</span>
</span><span class="line">grep <span class="s1">&#39;^- &#39;</span> |<span class="se">\</span>
</span><span class="line">sort |<span class="se">\</span>
</span><span class="line">uniq -s 2 -c - |<span class="se">\</span>
</span><span class="line">sort -n
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here’s what each line does:</p>

<ol>
  <li>extracts the Yaml front-matter from each file;</li>
  <li>extracts each top-level list entry, this assumes that the only top-level list is the category list, which is the default for Octopress posts;</li>
  <li>sort the lines;</li>
  <li>collapse identical lines, prepending a count of the number of lines collapsed; and finally</li>
  <li>sort numerically.</li>
</ol>

<p>Maybe this will be useful to somebody out there…</p>

<p><strong>Update:</strong> I’ve <a href="http://ianp.org/2012/10/30/category-counts-in-octopress-revisited/">written a version</a> that’s integrated with rake as well.</p>

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