<?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>2011-11-05T11:59:10+01: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[Installing to the Local Maven Repo With Gradle]]></title>
    <link href="http://ianp.org/2011/11/04/installing-to-the-local-maven-repo-with-gradle"/>
    <updated>2011-11-04T11:34:00+01:00</updated>
    <id>http://ianp.org/2011/11/04/installing-to-the-local-maven-repo-with-gradle</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been playing around with different build tools for my Java projects recently, having never been very happy with <a href="http://maven.apache.org/" title="Apache Maven">Maven</a>. Probably the best that I&#8217;ve found is <a href="http://www.gradle.org/" title="Gradle">Gradle</a>: it has an easy to use build file format, and seems pretty flexible if you need to do something a little differently.</p>

<p>Unfortunately the documentation isn&#8217;t as comprehensive as it could be, and one of the areas where it&#8217;s not too great is in it&#8217;s interaction with the Maven repository system. So, here&#8217;s the magic incantation that you have to add to your build file in order to have <em>gradle install</em> install things correctly to your local repository:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">apply</span> <span class="n">plugin</span> <span class="s1">&#39;maven&#39;</span>
</span><span class='line'><span class="n">configure</span><span class="o">(</span><span class="n">install</span><span class="o">.</span><span class="na">repositories</span><span class="o">.</span><span class="na">mavenInstaller</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">pom</span><span class="o">.</span><span class="na">project</span> <span class="o">{</span>
</span><span class='line'>        <span class="n">groupId</span> <span class="s1">&#39;com.example&#39;</span>
</span><span class='line'>        <span class="n">artifactId</span> <span class="s1">&#39;project-name&#39;</span>
</span><span class='line'>        <span class="n">inceptionYear</span> <span class="s1">&#39;2011&#39;</span>
</span><span class='line'>        <span class="n">packaging</span> <span class="s1">&#39;jar&#39;</span>
</span><span class='line'>        <span class="n">licenses</span> <span class="o">{</span>
</span><span class='line'>            <span class="n">license</span> <span class="o">{</span>
</span><span class='line'>                <span class="n">name</span> <span class="s1">&#39;Eclipse Public License (Version 1.0)&#39;</span>
</span><span class='line'>                <span class="n">url</span> <span class="s1">&#39;http://www.eclipse.org/legal/epl-v10.html&#39;</span>
</span><span class='line'>                <span class="n">distribution</span> <span class="s1">&#39;repo&#39;</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="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>this will install the project binaries, to also install source and JavaDocs (which <em>every</em> project should really do) then you&#8217;ll also need to add:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='groovy'><span class='line'><span class="n">task</span> <span class="nf">sourcesJar</span><span class="o">(</span><span class="nl">type:</span> <span class="n">Jar</span><span class="o">,</span> <span class="nl">dependsOn:</span><span class="n">classes</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>     <span class="n">classifier</span> <span class="o">=</span> <span class="s1">&#39;sources&#39;</span>
</span><span class='line'>     <span class="n">from</span> <span class="n">sourceSets</span><span class="o">.</span><span class="na">main</span><span class="o">.</span><span class="na">allSource</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">task</span> <span class="nf">javadocJar</span><span class="o">(</span><span class="nl">type:</span> <span class="n">Jar</span><span class="o">,</span> <span class="nl">dependsOn:</span><span class="n">javadoc</span><span class="o">)</span> <span class="o">{</span>
</span><span class='line'>     <span class="n">classifier</span> <span class="o">=</span> <span class="s1">&#39;javadoc&#39;</span>
</span><span class='line'>     <span class="n">from</span> <span class="n">javadoc</span><span class="o">.</span><span class="na">destinationDir</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">artifacts</span> <span class="o">{</span>
</span><span class='line'>     <span class="n">archives</span> <span class="n">sourcesJar</span>
</span><span class='line'>     <span class="n">archives</span> <span class="n">javadocJar</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to Enter Straight Quotes in Word]]></title>
    <link href="http://ianp.org/2011/07/28/how-to-enter-straight-quotes-in-word"/>
    <updated>2011-07-28T15:35:43+02:00</updated>
    <id>http://ianp.org/2011/07/28/how-to-enter-straight-quotes-in-word</id>
    <content type="html"><![CDATA[<p>When I&#8217;m writing technical docs in MS Word (an unfortunate day-job-related requirement) one of the things that can be annoying it the fact that it &#8216;helpfully&#8217; converts straight quotes into curly quotes, even in code samples and other places that it shouldn&#8217;t. The easy way to get rid of this is to hit undo (⌘-z) immediately after typing the quote, this will undo the auto-correction but leave the actual quote character in place.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to End the Deficit]]></title>
    <link href="http://ianp.org/2011/07/08/how-to-end-the-deficit"/>
    <updated>2011-07-08T17:52:17+02:00</updated>
    <id>http://ianp.org/2011/07/08/how-to-end-the-deficit</id>
    <content type="html"><![CDATA[<blockquote><p>> I could end the deficit in 5 minutes. You just pass a law that says<br/>that anytime there is a deficit of more than 3% of GDP all sitting<br/>members of congress are ineligible for reelection.</p><footer><strong>Warren Buffet, CNBC</strong><cite><a href='http://www.ritholtz.com/blog/2011/07/warren-buffett-i-could-end-the-deficit-in-5-minutes/'>www.ritholtz.com/blog/2011/07/&hellip;</a></cite></footer></blockquote>


<p>He&#8217;s talking about the US Congress, but it would work here as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Power of Words]]></title>
    <link href="http://ianp.org/2011/07/03/the-power-of-words"/>
    <updated>2011-07-03T15:19:15+02:00</updated>
    <id>http://ianp.org/2011/07/03/the-power-of-words</id>
    <content type="html"><![CDATA[<p>Excellent… <a href="http://quietube.com/v.php/http://www.youtube.com/watch?v=Hzgzim5m7oU">The Power of Words</a>.</p>

<p>Hat tip: <a href="http://twitter.com/#!/fuadm/statuses/87273373872308225">fuadm</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quote of the Day - Great Things]]></title>
    <link href="http://ianp.org/2011/06/29/quote-of-the-day-great-things"/>
    <updated>2011-06-29T09:22:12+02:00</updated>
    <id>http://ianp.org/2011/06/29/quote-of-the-day-great-things</id>
    <content type="html"><![CDATA[<blockquote><p>To achieve great things, two things are needed, a plan and not quite<br/>enough time.</p></blockquote>


<p>Hat tip: <a href="http://cityunslicker.blogspot.com/2011/06/germany-10-uk-1.html">Capitalists @ Work</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Handling Flag Arguments]]></title>
    <link href="http://ianp.org/2011/06/23/handling-flag-arguments"/>
    <updated>2011-06-23T14:42:28+02:00</updated>
    <id>http://ianp.org/2011/06/23/handling-flag-arguments</id>
    <content type="html"><![CDATA[<p><a href="http://martinfowler.com/">Martin Fowler</a> has a <a href="http://martinfowler.com/bliki/FlagArgument.html">new bliki entry talking about flag arguments</a>, defined as:</p>

<blockquote><p>A flag argument is a kind of function argument that tells the
function to carry out a different operation depending on its value.</p></blockquote>

<p>And, as an example of this API style:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Class</span> <span class="n">Concert</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="n">Booking</span> <span class="nf">book</span><span class="o">(</span><span class="n">Customer</span> <span class="n">aCustomer</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">isPremium</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And his preferred API design:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Class</span> <span class="n">Concert</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">public</span> <span class="n">Booking</span> <span class="nf">bookRegular</span><span class="o">(</span><span class="n">Customer</span> <span class="n">aCustomer</span><span class="o">);</span>
</span><span class='line'>  <span class="kd">public</span> <span class="n">Booking</span> <span class="nf">bookPremium</span><span class="o">(</span><span class="n">Customer</span> <span class="n">aCustomer</span><span class="o">);</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The problem with this, as Mr. Fowler points out, is that it can lead to problems with the implementation. His preferred solution is to have a private implementation method exactly like the original problematic API:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kd">private</span> <span class="n">Booking</span> <span class="nf">bookImpl</span><span class="o">(</span><span class="n">Customer</span> <span class="n">aCustomer</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">isPremium</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>But if we think about the problem for a little longer we can see that there is a better option available to us. The real problem with flag arguments is that they lose information at the call site, so the original example method would be called like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="o">.</span> <span class="o">.</span> <span class="o">.</span>
</span><span class='line'><span class="n">myConcert</span><span class="o">.</span><span class="na">book</span><span class="o">(</span><span class="n">poorCustomer</span><span class="o">,</span> <span class="kc">false</span><span class="o">);</span>
</span><span class='line'><span class="n">myConcert</span><span class="o">.</span><span class="na">book</span><span class="o">(</span><span class="n">richCustomer</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span>
</span><span class='line'><span class="o">.</span> <span class="o">.</span> <span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>There&#8217;s nothing to say what those true and false arguments actually mean. We can just define a type-safe enum to use instead of the boolean, that way the information is still present at the call site. This was our API becomes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="n">Class</span> <span class="n">Concert</span> <span class="kd">public</span> <span class="o">{</span>
</span><span class='line'>  <span class="kd">enum</span> <span class="n">TicketType</span> <span class="o">{</span> <span class="n">REGULAR</span><span class="o">,</span> <span class="n">PREMIUM</span> <span class="o">}</span>
</span><span class='line'>  <span class="kd">public</span> <span class="n">Booking</span> <span class="nf">book</span><span class="o">(</span><span class="n">Customer</span> <span class="n">aCustomer</span><span class="o">,</span> <span class="n">TicketType</span> <span class="n">ticketType</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And at the call site:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="o">.</span> <span class="o">.</span> <span class="o">.</span>
</span><span class='line'><span class="n">myConcert</span><span class="o">.</span><span class="na">book</span><span class="o">(</span><span class="n">poorCustomer</span><span class="o">,</span> <span class="n">TicketType</span><span class="o">.</span><span class="na">REGULAR</span><span class="o">);</span>
</span><span class='line'><span class="n">myConcert</span><span class="o">.</span><span class="na">book</span><span class="o">(</span><span class="n">richCustomer</span><span class="o">,</span> <span class="n">TicketType</span><span class="o">.</span><span class="na">PREMIUM</span><span class="o">);</span>
</span><span class='line'><span class="o">.</span> <span class="o">.</span> <span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is easier to implement, and works for multi valued (e.g. integer) flags as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New York Post Blocks iPad Users]]></title>
    <link href="http://ianp.org/2011/06/20/new-york-post-blocks-ipad-users"/>
    <updated>2011-06-20T18:39:56+02:00</updated>
    <id>http://ianp.org/2011/06/20/new-york-post-blocks-ipad-users</id>
    <content type="html"><![CDATA[<p>It seems that the New York Post have decided to block all access to their site from iPads, telling users to download their (subscription only) app instead. As <a href="http://scripting.com/stories/2011/06/18/theNyPostTheIpadAndTheWeb.html">Scripting News</a> said…</p>

<blockquote><p>I wonder how Apple feels about this? I can&#8217;t imagine they like it. I can see the ads now. ‘Get an Android tablet to read the web.’ Hmmm… I wonder how long said app will remain in the store after pulling a trick like this?</p></blockquote>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Writing Smart Code]]></title>
    <link href="http://ianp.org/2011/04/24/writing-smart-code"/>
    <updated>2011-04-24T12:37:37+02:00</updated>
    <id>http://ianp.org/2011/04/24/writing-smart-code</id>
    <content type="html"><![CDATA[<p>This quote has been doing the rounds lately, at least I&#8217;ve seen it on two or three different blogs, most recently <a href="http://shapeof.com/archives/2011/04/regarding_simplicity.html">here</a>…</p>

<blockquote><p>> Debugging is twice as hard as writing the code in the first place.<br/>> Therefore, if you write the code as cleverly as possible, you are, by<br/>> definition, not smart enough to debug it.</p></blockquote>


<p>I rather like that.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to Convert PDFs to Postscript]]></title>
    <link href="http://ianp.org/2011/04/19/how-to-convert-pdfs-to-postscript"/>
    <updated>2011-04-19T09:43:14+02:00</updated>
    <id>http://ianp.org/2011/04/19/how-to-convert-pdfs-to-postscript</id>
    <content type="html"><![CDATA[<p>It&#8217;s easy using <em>pdftops</em>, part of the <a href="http://poppler.freedesktop.org/">Poppler</a> suite of programs. First make sure it&#8217;s installed, or install it (using <a href="http://mxcl.github.com/homebrew/">Homebrew</a> on OS X):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="gp">$</span> brew update
</span><span class='line'><span class="gp">$</span> brew install poppler
</span></code></pre></td></tr></table></div></figure>


<p>Then the command <code>pdftops infile.pdf outfile.ps</code> can be scripted as per
usual, something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">for page in pages/*.pdf</span>
</span><span class='line'><span class="go">do</span>
</span><span class='line'><span class="go">  pdftops $page postscript/`basename -s .pdf $page`.ps</span>
</span><span class='line'><span class="go">done</span>
</span></code></pre></td></tr></table></div></figure>


<p>Recorded in the interest of helping Google organise my brain.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quote of the Day]]></title>
    <link href="http://ianp.org/2010/03/25/quote-of-the-day-2"/>
    <updated>2010-03-25T09:41:48+01:00</updated>
    <id>http://ianp.org/2010/03/25/quote-of-the-day-2</id>
    <content type="html"><![CDATA[<blockquote><p>Q: What’s the difference between Ant and Maven? <br /><br/>A: The creator of Ant has apologised.</p><footer><strong>James Duncan Davidson</strong><cite><a href='http://journal.duncandavidson.com/post/470882637/q-whats-the-difference-between-ant-and-maven-a'>journal.duncandavidson.com/post/&hellip;</a></cite></footer></blockquote>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building Clojure with Maven]]></title>
    <link href="http://ianp.org/2010/03/15/building-clojure-with-maven"/>
    <updated>2010-03-15T18:48:51+01:00</updated>
    <id>http://ianp.org/2010/03/15/building-clojure-with-maven</id>
    <content type="html"><![CDATA[<p>Just a quick reminder on the steps I needed to take to build <a href="http://clojure.org/">Clojure</a> and install it in my local repository:</p>

<ol>
<li>download the <a href="http://maven.apache.org/ant-tasks/download.html">Maven Ant tasks</a>, version 2.1.0 at the time of writing;</li>
<li>move them to <code>$ANT_HOME/lib</code> (this is <code>/usr/share/ant/lib</code> on Mac OS X);</li>
<li><code>cd</code> to my Clojure download folder, run <code>git pull</code> if needed;</li>
<li>run <code>ant -Dsnapshot.repo.dir=~/.m2/repository clean nightly-build</code>, this will perform a clean build and install it into the supplied repo; this can be anywhere, the default though is <code>/var/www/maven-snapshot-repository</code> which is probably no good;</li>
<li>to also install <code>clojure-contrib</code> just change to it&#8217;s download directory and run <code>mvn install</code>.</li>
</ol>


<p>Is simples!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Vote Now!]]></title>
    <link href="http://ianp.org/2010/01/12/vote-now"/>
    <updated>2010-01-12T19:00:22+01:00</updated>
    <id>http://ianp.org/2010/01/12/vote-now</id>
    <content type="html"><![CDATA[<p>Fed up with all of the pre-election coverage in the (UK) media right now? Instead of listening to call-me-Dave drone on and on, or hearing how the one-eyed Gobblin’ King has once again saved the world, go cast your <a href="http://www.barbie.com/vote/">vote</a> for Computer Engineer Barbie!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SQL: Just Say No!]]></title>
    <link href="http://ianp.org/2010/01/08/sql-just-say-no"/>
    <updated>2010-01-08T16:29:30+01:00</updated>
    <id>http://ianp.org/2010/01/08/sql-just-say-no</id>
    <content type="html"><![CDATA[<p>Just in time for the weekend, the SF <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a> community have put up a <a href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html">collection of talks and slides</a> from their recent get together. I’ll have more to say after I’ve had a chance to look these over…</p>

<p><em>Update:</em> not actually a new set of talks, these have been online for about 6 months now, but it’s the first time that I’ve seen them…</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Prevalent Synchronicity]]></title>
    <link href="http://ianp.org/2010/01/07/prevalent-synchronicity"/>
    <updated>2010-01-07T13:23:33+01:00</updated>
    <id>http://ianp.org/2010/01/07/prevalent-synchronicity</id>
    <content type="html"><![CDATA[<p>Maybe it’s just an idea whose time has come, but in the past few days there’ve been 2 prevalent database systems announced for <a href="http://clojure.org/">Clojure</a>: <a href="http://fleetdb.org/">FleetDB</a> and <a href="http://github.com/SergeyDidenko/Simple-Persistence-for-Clojure">Persister</a>.</p>

<h4>Prevalent Databases</h4>

<p>The idea behind prevalent databases has been around for a while being, if not ‘popularised’ exactly, at least pushed by the guys behind <a href="http://www.prevayler.org/">Prevayler</a>. Here’s how they describe them:</p>

<blockquote><p>Prevayler is an open source object persistence library for Java. It is an implementation of the Prevalent System design pattern, in which business objects are kept live in memory and transactions are journaled for system recovery.</p></blockquote>

<h4>Fleet DB</h4>

<p>While <a href="http://twitter.com/mmcgrana">Mark McGranaghan</a>’s Fleet DB doesn’t use the term prevalent database, but right now that’s basically what it is. The core of Fleet DB is a Clojure based append-only log based database; it provides a native clojure query language (with built in query optimiser), schema-less records, indexes, and a server with a JSON based network protocol.</p>

<p>For a new new project Fleet DB also has a good set of documentation and it sounds like Mark has some big plans for it in the future. As an added benefit there are also clients for the network protocol in languages other than Clojure (Ruby officially, and a set of Python bindings in development).</p>

<h4>Persister</h4>

<p>Sergey Didenko’s <a href="http://github.com/SergeyDidenko/Simple-Persistence-for-Clojure">Simple Persistence for Clojure</a> project is a much less ambitious offering, but with the really cool feature of being a single (255 line, ~11KB) file that you could just drop into your project and start using - that’s pretty lightweight! From the read me file:</p>

<blockquote><p>Simple Persistence for Clojure is a journal-based persistence library for Clojure programs. It follows “Prevalent system” design pattern.</p></blockquote>

<p>The intended usage is assist you in making a prevalent system. Thus you work with your in-memory data and wrap every writing call into one of <code>(apply-transaction*)</code> macros. A nice feature is that the log files are just Clojure code: transactions are logged as a valid Clojure code, so they are easy to read and run separately.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Squeeze!]]></title>
    <link href="http://ianp.org/2010/01/06/squeeze"/>
    <updated>2010-01-06T18:38:16+01:00</updated>
    <id>http://ianp.org/2010/01/06/squeeze</id>
    <content type="html"><![CDATA[<p>One of the neat features of <a href="http://clojure.org/">Clojure</a> is the <a href="http://clojure.org/sequences">sequence</a> abstraction — it makes solving a whole host of data processing tasks much easier, simply get you data into a sequence and you&#8217;ve got a huge toolbox available to work on it. Of course being a guy I’m firmly of the belief that more tools are better, with that in mind let’s add another one to our toolbox. Given a sequence the squeeze function returns another sequence with any adjacent items which match a supplied predicate merged together using a supplied function. It’s probably easier to illustrate by example, suppose I have a sequence of strings and I want to merge them together when the trailing string starts with whitespace, I can squeeze them like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="nf">squeeze</span> <span class="o">#</span><span class="p">(</span><span class="nv">and</span> <span class="nv">%2</span> <span class="p">(</span><span class="nb">re-matches </span><span class="o">#</span><span class="s">&quot;\A\s.*&quot;</span> <span class="nv">%2</span><span class="p">))</span>
</span><span class='line'>         <span class="o">#</span><span class="p">(</span><span class="nv">apply</span> <span class="nv">str</span> <span class="p">(</span><span class="nb">apply </span><span class="nv">concat</span> <span class="nv">%&amp;</span><span class="p">))</span>
</span><span class='line'>         <span class="p">[</span><span class="s">&quot;hello&quot;</span> <span class="s">&quot; world.&quot;</span> <span class="s">&quot;foo&quot;</span> <span class="s">&quot; bar&quot;</span><span class="p">])</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another example, given a sequence of characters (read from an <code>InputStream</code> for example), I could group them into words by squeezing then thusly (the first line is just to remind you that calling <code>seq</code> on a string produces a sequence of characters):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">seq </span><span class="s">&quot;Cheers, chars!&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="sc">\C</span> <span class="sc">\h</span> <span class="sc">\e</span> <span class="sc">\e</span> <span class="sc">\r</span> <span class="sc">\s</span> <span class="err">\</span><span class="o">,</span> <span class="sc">\space</span> <span class="sc">\c</span> <span class="sc">\h</span> <span class="sc">\a</span> <span class="sc">\r</span> <span class="sc">\s</span> <span class="sc">\!</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">map </span><span class="nv">str/trim</span>
</span><span class='line'>         <span class="p">(</span><span class="nf">squeeze</span> <span class="o">#</span><span class="p">(</span><span class="nv">and</span> <span class="nv">%2</span> <span class="p">(</span><span class="nb">not= </span><span class="sc">\space</span> <span class="nv">%2</span><span class="p">))</span>
</span><span class='line'>                  <span class="o">#</span><span class="p">(</span><span class="nv">apply</span> <span class="nv">str</span> <span class="p">(</span><span class="nb">apply </span><span class="nv">concat</span> <span class="nv">%&amp;</span><span class="p">))</span>
</span><span class='line'>                   <span class="p">(</span><span class="nb">seq </span><span class="s">&quot;I&#39;m sorry Dave, I can&#39;t let you do that.&quot;</span><span class="p">)))</span>
</span><span class='line'><span class="p">(</span><span class="s">&quot;I&#39;m&quot;</span> <span class="s">&quot;sorry&quot;</span> <span class="s">&quot;Dave,&quot;</span> <span class="s">&quot;I&quot;</span> <span class="s">&quot;can&#39;t&quot;</span> <span class="s">&quot;let&quot;</span> <span class="s">&quot;you&quot;</span> <span class="s">&quot;do&quot;</span> <span class="s">&quot;that.&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So how does it work? Well, here&#8217;s the interface:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="k">defn </span><span class="nv">squeeze</span>
</span><span class='line'>  <span class="p">[</span><span class="nv">pred</span> <span class="nv">merge-fn</span> <span class="nv">coll</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">squeeze-</span> <span class="nv">pred</span> <span class="nv">merge-fn</span> <span class="nv">coll</span> <span class="nv">nil</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&#8217;s the actual function that does the work, it&#8217;s declared private
because I don’t want to expose the matched parameter to the outside
world.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="k">defn- </span><span class="nv">squeeze-</span>
</span><span class='line'>  <span class="p">([</span><span class="nv">pred</span> <span class="nv">merge-fn</span> <span class="nv">coll</span> <span class="nv">matched</span><span class="p">]</span>
</span><span class='line'>    <span class="p">(</span><span class="nf">lazy-seq</span>
</span><span class='line'>      <span class="p">(</span><span class="nb">when-let </span><span class="p">[</span><span class="nv">s</span> <span class="p">(</span><span class="nb">seq </span><span class="nv">coll</span><span class="p">)]</span>
</span><span class='line'>        <span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">f</span> <span class="p">(</span><span class="nb">first </span><span class="nv">s</span><span class="p">)</span>
</span><span class='line'>              <span class="nv">s</span> <span class="p">(</span><span class="nb">second </span><span class="nv">s</span><span class="p">)</span>
</span><span class='line'>              <span class="nv">rest</span> <span class="p">(</span><span class="nb">rest </span><span class="nv">coll</span><span class="p">)]</span>
</span><span class='line'>          <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nf">pred</span> <span class="nv">f</span> <span class="nv">s</span><span class="p">)</span>
</span><span class='line'>            <span class="p">(</span><span class="nf">squeeze-</span> <span class="nv">pred</span> <span class="nv">merge-fn</span> <span class="nv">rest</span> <span class="p">(</span><span class="nb">cons </span><span class="nv">f</span> <span class="nv">matched</span><span class="p">))</span>
</span><span class='line'>            <span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">next</span> <span class="p">(</span><span class="k">if </span><span class="nv">matched</span> <span class="p">(</span><span class="nf">merge-fn</span> <span class="p">(</span><span class="nb">cons </span><span class="nv">f</span> <span class="p">(</span><span class="nb">reverse </span><span class="nv">matched</span><span class="p">)))</span> <span class="nv">f</span><span class="p">)]</span>
</span><span class='line'>              <span class="p">(</span><span class="nb">cons </span><span class="nv">next</span> <span class="p">(</span><span class="nf">squeeze-</span> <span class="nv">pred</span> <span class="nv">merge-fn</span> <span class="nv">rest</span> <span class="nv">nil</span><span class="p">)))))))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>I should probably point out that all of this playing around with
sequences was inspired by <a href="http://fulldisclojure.blogspot.com/">Sean Devlin</a>’s <a href="http://fulldisclojure.blogspot.com/2010/01/12-fn-proposal-same-multisame.html">excellent proposal</a>
for some new sequence functions for Clojure 1.2. The full code for this
is available <a href="http://ianp.org/code/2010/01/squeeze.clj">here</a> (it’s just the above, but with an added doc
comment on the <code>squeeze</code> function definition).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Working with Java Arrays]]></title>
    <link href="http://ianp.org/2010/01/02/working-with-java-arrays"/>
    <updated>2010-01-02T14:23:44+01:00</updated>
    <id>http://ianp.org/2010/01/02/working-with-java-arrays</id>
    <content type="html"><![CDATA[<p>One improvement that I&#8217;d like to see in Clojure is more examples in the doc strings (or maybe in a separate :example` metadata item). Still, nothing to stop me building up a set of my own. So, here are some simple examples of working with Java arrays in Clojure… Given some sample data:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="k">def </span><span class="nv">my-list</span> <span class="o">&#39;</span><span class="p">(</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">))</span>
</span><span class='line'><span class="p">(</span><span class="k">def </span><span class="nv">my-vector</span> <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="k">def </span><span class="nv">my-map</span> <span class="p">{</span><span class="nv">:a</span> <span class="s">&quot;apple&quot;</span> <span class="nv">:b</span> <span class="s">&quot;banana&quot;</span> <span class="nv">:c</span> <span class="s">&quot;chopped liver&quot;</span><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>To convert to Java arrays:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="nb">to-array </span><span class="nv">my-list</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="p">(</span><span class="nb">to-array </span><span class="nv">my-vector</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="p">(</span><span class="nb">to-array </span><span class="nv">my-map</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note that this always returns <code>Object[]</code> regardless of the contents of the collection. Note also that the map isn&#8217;t flattened (the <code>pp</code> function used here is in <code>clojure.contrib.pprint</code>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">pp</span><span class="p">)</span>
</span><span class='line'><span class="p">[[</span><span class="nv">:a</span> <span class="s">&quot;apple&quot;</span><span class="p">]</span><span class="o">,</span> <span class="p">[</span><span class="nv">:b</span> <span class="s">&quot;banana&quot;</span><span class="p">]</span><span class="o">,</span> <span class="p">[</span><span class="nv">:c</span> <span class="s">&quot;chopped liver&quot;</span><span class="p">]]</span>
</span></code></pre></td></tr></table></div></figure>


<p>If the array is 2-dimensional there is a corresponding function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="k">def </span><span class="nv">my-vec-2d</span> <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span> <span class="mi">8</span> <span class="mi">9</span><span class="p">]])</span>
</span><span class='line'><span class="o">#</span><span class="ss">&#39;user/my-vec-2d</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">to-array-2d </span><span class="nv">my-vec-2d</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">pp</span><span class="p">)</span>
</span><span class='line'><span class="p">[[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="p">]</span><span class="o">,</span> <span class="p">[</span><span class="mi">4</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">6</span><span class="p">]</span><span class="o">,</span> <span class="p">[</span><span class="mi">7</span><span class="o">,</span> <span class="mi">8</span><span class="o">,</span> <span class="mi">9</span><span class="p">]]</span>
</span><span class='line'><span class="nv">nil</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you need to use a specific type of array (e.g. to pass a <code>String[]</code> into a Java method) or need to use an array with more than 3 dimensions it&#8217;s a little trickier:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">into-array </span><span class="nv">my-list</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">pp</span><span class="p">)</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">5</span><span class="p">]</span>
</span><span class='line'><span class="nv">nil</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">into-array </span><span class="nv">my-vector</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">pp</span><span class="p">)</span>
</span><span class='line'><span class="p">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">5</span><span class="p">]</span>
</span><span class='line'><span class="nv">nil</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">into-array </span><span class="nv">my-map</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">into-array </span><span class="p">(</span><span class="nb">vals </span><span class="nv">my-map</span><span class="p">))</span>
</span><span class='line'><span class="o">#</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">pp</span><span class="p">)</span>
</span><span class='line'><span class="p">[</span><span class="s">&quot;apple&quot;</span><span class="o">,</span> <span class="s">&quot;banana&quot;</span><span class="o">,</span> <span class="s">&quot;chopped liver&quot;</span><span class="p">]</span>
</span><span class='line'><span class="nv">nil</span>
</span></code></pre></td></tr></table></div></figure>


<p>There, that should serve as a handy reference for myself for when I’m feeling forgetful…</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Nexus One Launch Even on Jan 5?]]></title>
    <link href="http://ianp.org/2009/12/29/nexus-one-launch-even-on-jan-5"/>
    <updated>2009-12-29T19:13:26+01:00</updated>
    <id>http://ianp.org/2009/12/29/nexus-one-launch-even-on-jan-5</id>
    <content type="html"><![CDATA[<p>> This just in: [Google][01] will host an [Android][02] press gathering
at its global HQ on Jan. 5 …. Presumably, the event will have something
to do with the company’s Nexus One, an Android phone that Google plans
to sell on its own Web site and perhaps through T-Mobile as well. via
[Digital Daily][03] [01]: http://www.google.com/ [02]:
http://www.android.com/ [03]:
http://digitaldaily.allthingsd.com/20091229/google-announces-jan-5-android-event/</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why Everything is a File]]></title>
    <link href="http://ianp.org/2009/12/28/why-everything-is-a-file"/>
    <updated>2009-12-28T17:54:29+01:00</updated>
    <id>http://ianp.org/2009/12/28/why-everything-is-a-file</id>
    <content type="html"><![CDATA[<p>One of the [distinguishing characteristics of Unix][01] is the
philosophy that “everything is a file” (taken even further in
<a href="http://en.wikipedia.org/wiki/Linux">Linux</a> and [Plan 9][03]). Reading the interview with [Ken
Thompson][04] in [Coders at Work][05] (page 465) sheds some light on why
this is the case: > *Seibel:* So you basically wrote an OS so you’d
have a better environment to test your file system. > *Thompson:*
Yes. Halfway through there that I realized it was a real time-sharing
system. I was writing the shell to drive the file system. And then I was
writing a couple other programs that drove the file system. And right
about there I said, “All I need is an editor and I’ve got an operating
system.” So Unix started life as a glorified test harness for Ken’s file
system! Amusing… [01]: http://en.wikipedia.org/wiki/Unix_architecture
http://plan9.bell-labs.com/plan9/ [04]:
http://en.wikipedia.org/wiki/Ken_Thompson [05]:
http://www.codersatwork.com/</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The C Programming Language]]></title>
    <link href="http://ianp.org/2009/12/26/the-c-programming-language"/>
    <updated>2009-12-26T19:07:09+01:00</updated>
    <id>http://ianp.org/2009/12/26/the-c-programming-language</id>
    <content type="html"><![CDATA[<p>> C functions may be used recursively; that is, a function may call
itself either directly or indirectly. Uninquiring souls may take this as
just another peculiarity of those C folk, of whose ways their neighbours
speak little to outsiders but much among themselves. By [Kernighan,
Ritchie, and Lovecraft][01] [01]:
http://www.bobhobbs.com/files/kr_lovecraft.html</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Paredit.el Comes to IntelliJ]]></title>
    <link href="http://ianp.org/2009/12/25/paredit-el-comes-to-intellij"/>
    <updated>2009-12-25T20:21:47+01:00</updated>
    <id>http://ianp.org/2009/12/25/paredit-el-comes-to-intellij</id>
    <content type="html"><![CDATA[<p>I’ve been working on adding [paredit.el][01] like structural editing to
the next version of the [La Clojure][02] plugin for [Intellij IDEA][03].
IDEA already does most of the paren matching stuff (automatically
inserting a closing paren when you type an opening paren and so on). So
far I’ve got the basic barf and slurp commands working, and splicing, as
you can see in the screenshot below: <img src="http://ianp.org/images/2009/12/idea-slurp-and-barf.png" alt="Slurping and
Barfing" /> The next step is
probably to make IDEA’s expand selection code be a little smarter in the
face of s-expressions. In related news: I found a good [introduction to
paredit.el][04] on [SlideShare][05] which may be of interest. I’ll try
to get the guys at IntelliJ to push out a new version of the plugin
after the 9.0.1 release is out (it’s in beta now). [01]:
http://mumble.net/\~campbell/emacs/paredit.el [02]:
http://plugins.intellij.net/plugin/?id=4050 [03]:
http://www.jetbrains.com/idea/index.html [04]:
http://www.slideshare.net/mudphone/paredit-preso [05]:
http://www.slideshare.net/</p>
]]></content>
  </entry>
  
</feed>

