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

  <title><![CDATA[Pig, satisfied]]></title>
  <link href="http://benbc.github.com/atom.xml" rel="self"/>
  <link href="http://benbc.github.com/"/>
  <updated>2013-03-24T21:49:02+00:00</updated>
  <id>http://benbc.github.com/</id>
  <author>
    <name><![CDATA[Ben Butler-Cole]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Visualizing CloudFormation templates]]></title>
    <link href="http://benbc.github.com/blog/2013/03/24/visualizing-cloudformation-templates/"/>
    <updated>2013-03-24T19:45:00+00:00</updated>
    <id>http://benbc.github.com/blog/2013/03/24/visualizing-cloudformation-templates</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been using <a href="http://aws.amazon.com/cloudformation/">CloudFormation</a> a lot recently to
manage AWS resources. I&#8217;m impressed with a lot of the functionality it
provides and it has allowed us to delete a lot of code on my current
project which was needed to handle edge cases in provisioning AWS
resources (eventual consistency issues, for example).</p>

<p>After a couple of months using it seriously, I only have four
complaints about CloudFormation:</p>

<ul>
<li>Stack lifecycle operations (create/update and delete) are not
idempotent.</li>
<li>Notification topics can only be set up at stack-creation time, so
if the topic gets accidentally deleted there is no way to get
notifications from the stack.</li>
<li>Creation and modification of resources in the stack is serialized,
which makes operations on large stacks very slow.</li>
<li>The template syntax is <em>horrible</em>: hard to write and even harder to
read.</li>
</ul>


<!--more-->


<p>I can&#8217;t claim to have a better solution to the syntax problem. Given
the constraints, the current syntax is probably reasonable; and the
language itself is extremely well thought-out. Perhaps the long-term
solution is to treat the JSON as an intermediary form and write
bindings for individual languages to generate it.</p>

<p>However, as things stand, once stacks have more than a couple of
resources in them, I find it hard to keep track of what is going on.
So I&#8217;ve written <a href="https://github.com/benbc/cloud-formation-viz">a tool</a> to vizualize templates. It reads
template JSON and spits out <a href="http://www.graphviz.org/">Graphviz</a> dot format which can
be used to generate an image.</p>

<p><img src="http://benbc.github.com/images/EC2_Untargeted_Launch_with_EBS_Volume.svg" width="400" title="'EC2 untargeted launch with EBS volume'" ></p>

<p>The examples in this post are from the <a href="http://aws.amazon.com/cloudformation/aws-cloudformation-templates/">sample templates</a> provided by AWS. You can find generated images for all
those samples <a href="https://github.com/benbc/cloud-formation-viz/tree/master/samples">here</a>.</p>

<p><img src="http://benbc.github.com/images/AutoScalingMultiAZWithNotifications.svg" width="700" title="'Auto-scaling multi-AZ with notifications'" ></p>

<p>I&#8217;d love to hear from you if you think this is useful.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A thin layer over Enlive]]></title>
    <link href="http://benbc.github.com/blog/2013/02/09/a-thin-layer-over-enlive/"/>
    <updated>2013-02-09T19:10:00+00:00</updated>
    <id>http://benbc.github.com/blog/2013/02/09/a-thin-layer-over-enlive</id>
    <content type="html"><![CDATA[<p>In my <a href="http://benbc.github.com/blog/2013/01/27/a-simple-enlive-example/">last post</a> I showed a simple use of Enlive to
create a web application with a common layout for all pages. I
resisted the temptation to introduce any abstractions because I wanted
to make it absolutely clear how to use the building blocks that Enlive
provides.</p>

<p>But my fingers were itching the whole time to abstract away some of
the wrinkles and I couldn&#8217;t let it rest until I&#8217;d had a play to see
what it looks like. So here is a very thin layer over Enlive that
manifests some of the structure that I saw.</p>

<!--more-->


<p>Here&#8217;s the code we ended up with last time. There is a <code>layout</code>
template that is used to wrap the two pages (<code>index</code> and <code>show</code>).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="k">def </span><span class="nv">things</span> <span class="p">[</span><span class="s">&quot;one&quot;</span> <span class="s">&quot;two&quot;</span> <span class="s">&quot;three&quot;</span> <span class="s">&quot;four&quot;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">extract-body</span> <span class="p">[</span><span class="nv">html</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">at</span> <span class="nv">html</span> <span class="p">[</span><span class="o">#</span><span class="p">{</span><span class="ss">:html</span> <span class="ss">:body</span><span class="p">}]</span> <span class="nv">unwrap</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">deftemplate</span> <span class="nv">layout</span> <span class="s">&quot;layout.html&quot;</span> <span class="p">[</span><span class="nv">title</span> <span class="nv">content</span><span class="p">]</span>
</span><span class='line'>  <span class="p">[</span><span class="o">#</span><span class="p">{</span><span class="ss">:title</span> <span class="ss">:h1</span><span class="p">}]</span> <span class="p">(</span><span class="nf">content</span> <span class="nv">title</span><span class="p">)</span>
</span><span class='line'>  <span class="p">[</span><span class="ss">:div.content</span><span class="p">]</span> <span class="p">(</span><span class="nf">substitute</span> <span class="p">(</span><span class="nf">extract-body</span> <span class="nv">content</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">show</span> <span class="p">[</span><span class="nv">things</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">at</span> <span class="p">(</span><span class="nf">html-resource</span> <span class="s">&quot;show.html&quot;</span><span class="p">)</span>
</span><span class='line'>             <span class="p">[</span><span class="ss">:li</span><span class="p">]</span> <span class="p">(</span><span class="nf">clone-for</span> <span class="p">[</span><span class="nv">thing</span> <span class="nv">things</span><span class="p">]</span> <span class="p">(</span><span class="nf">content</span> <span class="nv">thing</span><span class="p">))))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="k">def </span><span class="nb">index </span><span class="p">(</span><span class="nf">html-resource</span> <span class="s">&quot;index.html&quot;</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Front page&quot;</span> <span class="nv">index</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Show things&quot;</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;d like to find a way to clarify the <em>page</em> and <em>layout</em> concepts in
the code. I&#8217;ll use macros to define them, so that I get the
define-and-assign style effect which I think is appropriate for
important entities like this.</p>

<p>Layouts first. There is some slightly tricky stuff here, stripping off
unwanted <code>&lt;html&gt;</code> and <code>&lt;body&gt;</code> tags, which we can hide. Let&#8217;s assume
that every layout will have one main piece of content, which we can
define by convention will go into <code>div.content</code>; but we&#8217;ll allow each
template to define other slots and substitutions for them.</p>

<p>So we want the layout definition for our example above to look 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>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">deflayout</span> <span class="nv">layout</span> <span class="s">&quot;layout.html&quot;</span> <span class="p">[</span><span class="nv">title</span><span class="p">]</span>
</span><span class='line'>  <span class="p">[</span><span class="o">#</span><span class="p">{</span><span class="ss">:title</span> <span class="ss">:h1</span><span class="p">}]</span> <span class="p">(</span><span class="nf">enlive/content</span> <span class="nv">title</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This defines a function (<code>layout</code>) which takes a single argument
(<code>title</code>) and returns an Enlive <em>template</em>&mdash;another function that
takes the page&#8217;s content and returns the rendered HTML. We&#8217;re
effectively currying the <code>layout</code> function defined in the raw example
because we want to specify <code>title</code> and <code>content</code> at different points.</p>

<p>Here is how we would use it, without changing anything else.</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='clojure'><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">((</span><span class="nf">layout</span> <span class="s">&quot;Front page&quot;</span><span class="p">)</span> <span class="nv">index</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">((</span><span class="nf">layout</span> <span class="s">&quot;Show things&quot;</span><span class="p">)</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&#8217;s what <code>deflayout</code> looks like.</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>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="kd">defmacro </span><span class="nv">deflayout</span> <span class="p">[</span><span class="nb">name </span><span class="nv">source</span> <span class="nv">args</span> <span class="o">&amp;</span> <span class="nv">forms</span><span class="p">]</span>
</span><span class='line'>  <span class="o">`</span><span class="p">(</span><span class="kd">defn </span><span class="o">~</span><span class="nb">name </span><span class="o">~</span><span class="nv">args</span>
</span><span class='line'>     <span class="p">(</span><span class="nf">enlive/template</span> <span class="o">~</span><span class="nv">source</span> <span class="p">[</span><span class="nv">content#</span><span class="p">]</span>
</span><span class='line'>                      <span class="p">[</span><span class="ss">:div.content</span><span class="p">]</span> <span class="p">(</span><span class="nf">enlive/substitute</span> <span class="p">(</span><span class="nf">extract-body</span> <span class="nv">content#</span><span class="p">))</span>
</span><span class='line'>                      <span class="o">~@</span><span class="nv">forms</span><span class="p">)))</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now pages. There are two different kinds of page: dynamic ones,
like <code>show</code>, which take one or more parameters and transform their
HTML and static ones, like <code>index</code>, with neither parameters nor
transformations. We&#8217;d like to make defining and calling both types
simple. We&#8217;d also like to specify the layout when defining the page
and hide its application. Here&#8217;s what we&#8217;re aiming for.</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='clojure'><span class='line'><span class="p">(</span><span class="nf">defpage</span> <span class="nv">show</span> <span class="s">&quot;show.html&quot;</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Show things&quot;</span><span class="p">)</span> <span class="p">[</span><span class="nv">things</span><span class="p">]</span>
</span><span class='line'>  <span class="p">[</span><span class="ss">:li</span><span class="p">]</span> <span class="p">(</span><span class="nf">enlive/clone-for</span> <span class="p">[</span><span class="nv">thing</span> <span class="nv">things</span><span class="p">]</span> <span class="p">(</span><span class="nf">enlive/content</span> <span class="nv">thing</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">defpage</span> <span class="nb">index </span><span class="s">&quot;index.html&quot;</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Front page&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&#8217;s the definition of <code>defpage</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<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='clojure'><span class='line'><span class="p">(</span><span class="kd">defmacro </span><span class="nv">defpage</span>
</span><span class='line'>  <span class="p">([</span><span class="nb">name </span><span class="nv">source</span> <span class="nv">layout</span><span class="p">]</span>
</span><span class='line'>     <span class="o">`</span><span class="p">(</span><span class="k">def </span><span class="o">~</span><span class="nv">name</span>
</span><span class='line'>        <span class="p">(</span><span class="o">~</span><span class="nv">layout</span> <span class="p">(</span><span class="nf">enlive/html-resource</span> <span class="o">~</span><span class="nv">source</span><span class="p">))))</span>
</span><span class='line'>  <span class="p">([</span><span class="nb">name </span><span class="nv">source</span> <span class="nv">layout</span> <span class="nv">args</span> <span class="o">&amp;</span> <span class="nv">forms</span><span class="p">]</span>
</span><span class='line'>     <span class="o">`</span><span class="p">(</span><span class="kd">defn </span><span class="o">~</span><span class="nb">name </span><span class="o">~</span><span class="nv">args</span>
</span><span class='line'>        <span class="p">(</span><span class="o">~</span><span class="nv">layout</span> <span class="p">(</span><span class="nf">enlive/at</span> <span class="p">(</span><span class="nf">enlive/html-resource</span> <span class="o">~</span><span class="nv">source</span><span class="p">)</span>
</span><span class='line'>                            <span class="o">~@</span><span class="nv">forms</span><span class="p">)))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This creates functions for parameterized pages and simple values for
static ones to simplify calling them.</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='clojure'><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="nv">index</span><span class="p">)</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">not-found</span> <span class="s">&quot;Not Found&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can see the complete code, in a working project, <a href="https://github.com/benbc/simple-enlive-example/blob/abstractions/src/simple_enlive_example/main.clj">here</a>.</p>

<p>This refactoring is obviously overkill for a tiny example like this,
but something like it could be useful on a real project. It meets the
two objectives, anyway: clarifying the important concepts and hiding
some of the fiddly details.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A simple Enlive example]]></title>
    <link href="http://benbc.github.com/blog/2013/01/27/a-simple-enlive-example/"/>
    <updated>2013-01-27T22:17:00+00:00</updated>
    <id>http://benbc.github.com/blog/2013/01/27/a-simple-enlive-example</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/cgrand/enlive">Enlive</a> is a Clojure library for generating HTML that uses
<strong>transformations</strong> instead of <strong>templates</strong>. Rather than starting with
templates containing code which are then executed to produce the final
output, it starts with plain HTML which is subjected to a series of
transformations; the transformations are ordinary functions, targeted
to the right part of the DOM by standard CSS selectors.</p>

<p>This approach allows a clean separation between template and code; it
avoids creating a novel hybrid language&mdash;often crippled and always
nasty&mdash;for the templates.</p>

<p>As you can tell, I am pretty sold on the benefits of selector-based
templating, so I was excited to come across Enlive when I started
playing with Clojure. Enlive is powerful and somewhat complex; there
are two <a href="https://github.com/cgrand/enlive/wiki/Table-and-Layout-Tutorial,-Part-1:-The-Goal" title="Brian Marick's tutorial">good</a> <a href="https://github.com/swannodette/enlive-tutorial/" title="David Nolen's tutorial">tutorials</a> but I found it hard to get
straight in my head which bits were really necessary to do something
simple.</p>

<p>So, having wrestled with this for a while (and having surface after a
longish dive in the Enlive source code), I&#8217;ve put together a <a href="https://github.com/benbc/simple-enlive-example">basic example</a>, which I think takes a reasonable, minimal approach
to using Enlive for a simple web application. This post walks through
it, explaining how it fits together. It is not intended to be a
complete introduction to what Enlive can do; for that, read the
tutorials and <a href="https://github.com/cgrand/enlive">documentation</a>.</p>

<!--more-->


<p>When using Enlive, it&#8217;s helpful to know that the library generally
uses an internal data structure representation of HTML (called <em>nodes</em>
in the documentation). Most functions and macros operate on and return
<em>nodes</em>, or collections of them; a few return strings, which you need
in order to render the HTML to the outside world (in my case when
defining Compojure routes).</p>

<p>The simplest thing we can do is read in an HTML file from disk with
<code>html-resource</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>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="k">def </span><span class="nb">index </span><span class="p">(</span><span class="nf">html-resource</span> <span class="s">&quot;index.html&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This returns <em>nodes</em>, which can be rendered into strings with <code>emit*</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='clojure'><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">emit*</span> <span class="nv">index</span><span class="p">)))</span>
</span></code></pre></td></tr></table></div></figure>


<p>We would also like to be able to show dynamic content. With a
transformation-based approach, we start with static HTML and apply
transformations to it. We&#8217;re going to create a <code>&lt;ul&gt;</code>, with one <code>&lt;li&gt;</code>
for each item in a list. The initial HTML shows the structure we want,
with dummy content in the <code>&lt;li&gt;</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;li&gt;</span><span class="c">&lt;!-- item --&gt;</span><span class="nt">&lt;/li&gt;</span>
</span><span class='line'><span class="nt">&lt;/ul&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again we read in the HTML using <code>html-resource</code>, but this time we use
<code>at</code> to apply a transformation.</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='clojure'><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">show</span> <span class="p">[</span><span class="nv">things</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">at</span> <span class="p">(</span><span class="nf">html-resource</span> <span class="s">&quot;show.html&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="p">[</span><span class="ss">:li</span><span class="p">]</span> <span class="p">(</span><span class="nf">clone-for</span> <span class="p">[</span><span class="nv">thing</span> <span class="nv">things</span><span class="p">]</span> <span class="p">(</span><span class="nf">content</span> <span class="nv">thing</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This targets the <code>&lt;li&gt;</code> element and applies a transformation which,
for every element in the argument list <code>things</code>, clones the <code>&lt;li&gt;</code> and
fills in its content.</p>

<p>Like <code>html-resource</code>, <code>at</code> returns <em>nodes</em>, so we can render the
result with <code>emit*</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="k">def </span><span class="nv">things</span> <span class="p">[</span><span class="s">&quot;one&quot;</span> <span class="s">&quot;two&quot;</span> <span class="s">&quot;three&quot;</span> <span class="s">&quot;four&quot;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">emit*</span> <span class="nv">index</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">emit*</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>(Enlive has a <code>defsnippet</code> macro which we could use here, but it
doesn&#8217;t work in quite the way that we need.)</p>

<p>For a real web application, we need a way of applying common layout
and styling to the pages. With Enlive we can use a further
transformation to insert the pages that we have so far into a common piece of wrapper HTML.</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>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">&quot;text/css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">body</span> <span class="p">{</span> <span class="k">font-family</span><span class="o">:</span> <span class="k">sans-serif</span> <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      Content goes here.
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Enlive provides a macro <code>deftemplate</code> that we can use here. It wraps a
couple of the things we&#8217;ve seen already (<code>at</code> and <code>html-resource</code>) as
well as doing the function definition for us.</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='clojure'><span class='line'><span class="p">(</span><span class="nf">deftemplate</span> <span class="nv">layout</span> <span class="s">&quot;layout.html&quot;</span> <span class="p">[</span><span class="nv">content</span><span class="p">]</span>
</span><span class='line'>  <span class="p">[</span><span class="ss">:div.content</span><span class="p">]</span> <span class="p">(</span><span class="nf">substitute</span> <span class="nv">content</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>This replaces the contents of <code>div.content</code> with the HTML that we pass
it. <code>deftemplate</code> also handles the call to <code>emit*</code> for us, so replace
it with <code>layout</code> when defining our routes.</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='clojure'><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="nv">index</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can improve <code>layout</code> to apply consistent titles to each page, by
adding an argument and setting the content of <code>&lt;title&gt;</code> and <code>&lt;h1&gt;</code>
tags.</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='clojure'><span class='line'><span class="p">(</span><span class="nf">deftemplate</span> <span class="nv">layout</span> <span class="s">&quot;layout.html&quot;</span> <span class="p">[</span><span class="nv">title</span> <span class="nv">content</span><span class="p">]</span>
</span><span class='line'>  <span class="p">[</span><span class="o">#</span><span class="p">{</span><span class="ss">:title</span> <span class="ss">:h1</span><span class="p">}]</span> <span class="p">(</span><span class="nf">content</span> <span class="nv">title</span><span class="p">)</span>
</span><span class='line'>  <span class="p">[</span><span class="ss">:div.content</span><span class="p">]</span> <span class="p">(</span><span class="nf">substitute</span> <span class="nv">content</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Front page&quot;</span> <span class="nv">index</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Show things&quot;</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>And we add those elements, with placeholders, to the layout HTML.</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='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Title goes here<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">&quot;text/css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">body</span> <span class="p">{</span> <span class="k">font-family</span><span class="o">:</span> <span class="k">sans-serif</span> <span class="p">}</span>
</span><span class='line'>    <span class="nt">&lt;/style&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;h1&gt;</span>Title goes here<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      Content goes here.
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is one wrinkle that I&#8217;ve glossed over up to this point. Enlive
uses the wonderful <a href="http://ccil.org/~cowan/XML/tagsoup/">TagSoup</a> to parse HTML (so that you can
use the same transformations on &#8220;wild&#8221; HTML that you&#8217;ve scraped from
the web and which may not be well-formed). Because TagSoup assumes
that it&#8217;s dealing with something potentially toxic, and tries to
detoxify it, it adds <code>&lt;head&gt;</code> and <code>&lt;body&gt;</code> tags around any HTML that
you give it. So the DOM returned by <code>html-resource</code> has these extra
tags which end up wrapping the content in the middle of our webpage.
We need to modify <code>layout</code> to strip these out.</p>

<p>Here is the complete code, which you can see in a working project
<a href="https://github.com/benbc/simple-enlive-example">here</a>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="k">def </span><span class="nv">things</span> <span class="p">[</span><span class="s">&quot;one&quot;</span> <span class="s">&quot;two&quot;</span> <span class="s">&quot;three&quot;</span> <span class="s">&quot;four&quot;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">extract-body</span> <span class="p">[</span><span class="nv">html</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">at</span> <span class="nv">html</span> <span class="p">[</span><span class="o">#</span><span class="p">{</span><span class="ss">:html</span> <span class="ss">:body</span><span class="p">}]</span> <span class="nv">unwrap</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">deftemplate</span> <span class="nv">layout</span> <span class="s">&quot;layout.html&quot;</span> <span class="p">[</span><span class="nv">title</span> <span class="nv">content</span><span class="p">]</span>
</span><span class='line'>  <span class="p">[</span><span class="o">#</span><span class="p">{</span><span class="ss">:title</span> <span class="ss">:h1</span><span class="p">}]</span> <span class="p">(</span><span class="nf">content</span> <span class="nv">title</span><span class="p">)</span>
</span><span class='line'>  <span class="p">[</span><span class="ss">:div.content</span><span class="p">]</span> <span class="p">(</span><span class="nf">substitute</span> <span class="p">(</span><span class="nf">extract-body</span> <span class="nv">content</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">show</span> <span class="p">[</span><span class="nv">things</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">at</span> <span class="p">(</span><span class="nf">html-resource</span> <span class="s">&quot;show.html&quot;</span><span class="p">)</span>
</span><span class='line'>             <span class="p">[</span><span class="ss">:li</span><span class="p">]</span> <span class="p">(</span><span class="nf">clone-for</span> <span class="p">[</span><span class="nv">thing</span> <span class="nv">things</span><span class="p">]</span> <span class="p">(</span><span class="nf">content</span> <span class="nv">thing</span><span class="p">))))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="k">def </span><span class="nb">index </span><span class="p">(</span><span class="nf">html-resource</span> <span class="s">&quot;index.html&quot;</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">defroutes</span> <span class="nv">app</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Front page&quot;</span> <span class="nv">index</span><span class="p">))</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">GET</span> <span class="s">&quot;/show&quot;</span> <span class="p">[]</span> <span class="p">(</span><span class="nf">layout</span> <span class="s">&quot;Show things&quot;</span> <span class="p">(</span><span class="nf">show</span> <span class="nv">things</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why software development methodologies rock]]></title>
    <link href="http://benbc.github.com/blog/2012/08/01/why-software-development-methodologies-rock/"/>
    <updated>2012-08-01T20:24:00+01:00</updated>
    <id>http://benbc.github.com/blog/2012/08/01/why-software-development-methodologies-rock</id>
    <content type="html"><![CDATA[<p>(This post was insprired by a sneak preview of <a href="http://continuousdelivery.com/2012/08/why-software-development-methodologies-suck/" title="Why software development methodologies suck">a blog post</a> by Jez Humble.)</p>

<p>Methodologies or other defined practices can have value in so far as
they cause people to reflect on and criticise what they are
doing. Often it&#8217;s the <em>adoption</em> of a new approach that brings
benefits, rather than the approach itself.</p>

<p>This is why consultants are all convinced that their approach is the
one-true-way. They tend to meet teams that have stopped reflecting and
so are in trouble. They introduce change and see that everything
magically starts to improve. A spot of attributional bias and they&#8217;re
convinced.</p>

<p>The subjects of their advice, however, see that things get worse again
after a while (because they&#8217;ve stopped reflecting). So they conclude
that methodology X is all very well, but in practice it doesn&#8217;t work
in the long term.</p>

<p>It takes a special kind of person and team to keep reflecting even
when there is no change agent. People who can do this without any
prompting are gold dust and don&#8217;t need a methodology. People who can
<em>nearly</em> do it benefit from <em>any</em> methodology that they can be
convinced by, because the existence of an ideal keeps them thinking
about how they are deviating from it (and it&#8217;s the thinking that
matters, not the extent of the deviation).</p>

<p>My experience has informed my opinion. My first job was for a small
software shop that followed a rigorous waterfall approach: strong
hierarchy, lots of documentation, estimation-by-loc-guessing, separate
development phases. They were extremely successful and repeatedly
delivered on-time and within-budget; I was miserable. My second job
was as a consultant (with <a href="http://www.thoughtworks.com">ThoughtWorks</a>).</p>
]]></content>
  </entry>
  
</feed>
