<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
  <title>sourcematters.org</title>
  <link href="http://sourcematters.org/"/>
  <link type="application/atom+xml" rel="self" href="http://sourcematters.org/atom.xml"/>
  <updated>2026-02-01T16:02:34+00:00</updated>
  <id>http://sourcematters.org/</id>
  <author>
    <name>Greg Spurrier</name>
    <email>greg@sourcematters.org</email>
  </author>

  
  <entry>
    <id>http://sourcematters.org/2013/02/03/responsible-development</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2013/02/03/responsible-development.html"/>
    <title>Responsible Development a la Kent Beck</title>
    <updated>2013-02-03T21:50:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;Five years ago, I had the pleasure of attending Kent Beck’s &lt;a href=&quot;http://blip.tv/railsconf/kent-beck-three-rivers-institute-tri-saturday-keynote-1170018&quot;&gt;keynote address&lt;/a&gt; at RailsConf 2008. It was him, sitting on a stool, telling stories about his involvement in developing the ideas of developers writing tests, patterns, and Extreme Programming. Really good stuff.&lt;/p&gt;

&lt;p&gt;About two-thirds of the way through the talk he said “I think if you start with the principles of responsibility, accountability, and transparency, you end up with practices that look very much like XP’s but with a completely different set of motivations.” He called this Responsible Development. It resonated deeply with me.&lt;/p&gt;

&lt;p&gt;That idea and his essay &lt;a href=&quot;http://www.threeriversinstitute.org/Accountability%20in%20Software%20Development.htm&quot;&gt;“Accountability in Software Development”&lt;/a&gt; have shaped the way I approach software development ever since. They have become the bar by which I measure how I conduct myself as a software developer.&lt;/p&gt;

&lt;p&gt;If you have not read that essay–or have not read it recently–I highly encourage you to do so now. It is worthy of your time. You, too, as the essay explains, may find that you can sleep when the wind blows.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2013/01/17/shenruby-0-2-0-hello-ruby-interop</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2013/01/17/shenruby-0-2-0-hello-ruby-interop.html"/>
    <title>ShenRuby 0.2.0: Hello Ruby Interop</title>
    <updated>2013-01-17T04:40:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;I’m pleased to announce the release of ShenRuby 0.2.0. This release brings improved performance, bug fixes, and the beginnings of Ruby/Shen interoperablilty. Please see the &lt;a href=&quot;https://github.com/gregspurrier/shen-ruby/blob/master/HISTORY.md#020---january-16-2013&quot;&gt;release notes&lt;/a&gt; for the full details.&lt;/p&gt;

&lt;p&gt;The following contrived example illustrates the interop features introduced with ShenRuby 0.2.0.&lt;/p&gt;

&lt;h2 id=&quot;fizz-buzz-in-ruby-and-shen&quot;&gt;Fizz Buzz in Ruby and Shen&lt;/h2&gt;
&lt;p&gt;Imagine you are being interviewed for a job and the interviewer has just asked you to implement &lt;a href=&quot;http://en.wikipedia.org/wiki/Fizz_buzz&quot;&gt;Fizz Buzz&lt;/a&gt; in any language you like. You admit that Fizz Buzz was not covered in your undergraduate algorithms class and that you have no idea what it is. The interviewer smiles and explains: “it’s no big deal. You just need to make a function that takes an integer as input and returns ‘Fizz’ if the number is divisible by 3, ‘Buzz’ if it is divisible by 5, ‘Fizz Buzz’ if it is divisible by both 3 and 5, and the string representation of the number otherwise. Please implement it and show that it works on the numbers 1 through 20.”&lt;/p&gt;

&lt;p&gt;You’ve been reading up on Shen lately and the interviewer’s description of the Fizz Buzz translates easily to Shen’s pattern matching approach to function definition. But, the standard Shen system functions don’t include a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divides?&lt;/code&gt; function to tests whether one number evenly divides another. No problem: that’s trivial in Ruby. So, you choose a hybrid approach using ShenRuby.&lt;/p&gt;

&lt;p&gt;First, you create a new instance &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ShenRuby::Shen&lt;/code&gt; to be your Shen environment.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;require &apos;rubygems&apos;
require &apos;shen_ruby&apos;

shen = ShenRuby::Shen.new
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You read in ShenRuby’s &lt;a href=&quot;https://github.com/gregspurrier/shen-ruby/blob/master/README.md&quot;&gt;README&lt;/a&gt; that any Ruby instance method added to the Shen environment is available for use within Shen. So, you add a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divides?&lt;/code&gt; method:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;class &amp;lt;&amp;lt; shen
  # Returns true if b is evenly divisible by b.
  def divides?(a, b)
    b % a == 0
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You also read that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eval_string&lt;/code&gt; method may be used to evaluate arbitrary Shen code and is typically used for defining new functions. Now that you have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divides?&lt;/code&gt;, implementing Fizz Buzz in Shen is trivial:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Implement the fizz-buzz function in Shen
shen.eval_string &amp;lt;&amp;lt;-EOS
  (define fizz-buzz
    X -&amp;gt; &quot;Fizz Buzz&quot; where (and (divides? 3 X)
                               (divides? 5 X))
    X -&amp;gt; &quot;Fizz&quot; where (divides? 3 X)
    X -&amp;gt; &quot;Buzz&quot; where (divides? 5 X)
    X -&amp;gt; (str X))
EOS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, you write a bit of Ruby to print out the first twenty results, taking advantage of the fact that Shen functions are invokable as methods on the Shen object:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(1..20).each do |i|
  puts shen.fizz_buzz(i)
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Intrigued, the interviewer spends the rest of the time asking questions about Shen. You get the job.&lt;/p&gt;

&lt;h2 id=&quot;learning-more-about-ruby-shen-interop&quot;&gt;Learning More about Ruby&amp;lt;-&amp;gt;Shen Interop&lt;/h2&gt;
&lt;p&gt;The above example shows most of the capabilities of the Ruby/Shen interoperablilty as it exists in ShenRuby 0.2.0. I’ve left out a few details about automatic coercsions that take place between the Ruby and Shen worlds and some limitations with the current implementation. Those are both covered in the &lt;a href=&quot;https://github.com/gregspurrier/shen-ruby/blob/master/README.md#ruby-shen-interop&quot;&gt;README&lt;/a&gt; section of the ShenRuby README.&lt;/p&gt;

&lt;p&gt;The next interoperablilty feature that I plan to work on is the ability for Shen code to instantiate and interaction with native Ruby objects. The syntax for this will be inspired by Clojure’s Java interoperablilty syntax.&lt;/p&gt;

&lt;p&gt;These are still the early days of the interoperablilty story in ShenRuby. I expect the APIs to evolve as they get more mileage. Feedback, suggestions, and bug reports are appreciated.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2012/12/31/announcing-shenruby-0-1-0</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2012/12/31/announcing-shenruby-0-1-0.html"/>
    <title>Announcing ShenRuby 0.1.0</title>
    <updated>2012-12-31T04:15:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;I discovered &lt;a href=&quot;http://shenlanguage.org&quot;&gt;Shen&lt;/a&gt;–a functional programming language created by Mark Tarver–a few months ago while reading a 2011 &lt;a href=&quot;http://blog.fogus.me/2011/10/18/programming-language-development-the-past-5-years/&quot;&gt;blog post&lt;/a&gt; by Michael Fogus, author of &lt;em&gt;The Joy of Clojure&lt;/em&gt;. As I read more about it, I was smitten. A modern, functional Lisp with pattern matching, currying, and an optional, very powerful static type system? Sign me up!&lt;/p&gt;

&lt;p&gt;Something I found intriguing about Shen was that it was specifically designed for portability. It is implemented in a language called K Lambda, which is a tiny Lisp consisting of only 46 functions. Port K Lambda and you have ported Shen.&lt;/p&gt;

&lt;p&gt;A few weeks ago, while playing with ideas for implementing K Lambda, I got to thinking: wouldn’t it be nice to have Shen ported to Ruby in a way that enabled the construction of hybrid applications? Tasks well suited to Shen’s pattern matching approach to functional programming could be implemented in Shen. Tasks well suited to OOP or imperative programming could be written in Ruby. The two parts could then run together on a Ruby VM.&lt;/p&gt;

&lt;p&gt;Inspired, and with a copy of &lt;a href=&quot;http://www.shenlanguage.org/tbos.html&quot;&gt;&lt;em&gt;The Book of Shen&lt;/em&gt;&lt;/a&gt; in hand, I got to work.&lt;/p&gt;

&lt;h2 id=&quot;shenruby&quot;&gt;ShenRuby&lt;/h2&gt;

&lt;p&gt;Today I am pleased to announce ShenRuby 0.1.0, the first release of my Ruby port of Shen. The goal of the 0.1.0 release is to provide a Shen 7.1 REPL that can be easily installed and used by Rubyists to explore Shen.&lt;/p&gt;

&lt;p&gt;Here is zero to factorial in the ShenRuby REPL:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;% gem install shen-ruby
Fetching: shen-ruby-0.1.0.gem (100%)
Successfully installed shen-ruby-0.1.0
1 gem installed
Installing ri documentation for shen-ruby-0.1.0...
Installing RDoc documentation for shen-ruby-0.1.0...
% srrepl
Loading.... Completed in 18.59 seconds.

Shen 2010, copyright (C) 2010 Mark Tarver
www.shenlanguage.org, version 7.1
running under Ruby, implementation: ruby 1.9.3
port 0.1.0 ported by Greg Spurrier


(0-) (define factorial
       0 -&amp;gt; 1
       X -&amp;gt; (* X (factorial (- X 1))))
factorial

(1-) (factorial 5)
120

(2-) (quit)
% 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In case it is not obvious, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(0-)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(1-)&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(2-)&lt;/code&gt; seen above are the Shen REPL’s prompts. The number shown increase with each expression evaluated.&lt;/p&gt;

&lt;p&gt;At this point, ShenRuby only provides a REPL, launched via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;srrepl&lt;/code&gt; command. As ShenRuby matures towards its 1.0.0 release, my focus will be on enabling bi-directional interaction between Ruby and Shen and on improving performance to the point that hybrid applications are viable.&lt;/p&gt;

&lt;p&gt;Porting Shen to Ruby has been tremendous fun so far and I’m excited to start work on the features that will support easy interaction between Ruby and Shen.&lt;/p&gt;

&lt;h2 id=&quot;learning-more&quot;&gt;Learning More&lt;/h2&gt;
&lt;p&gt;If you are interested in learning more about Shen, try using the ShenRuby REPL to work through the &lt;a href=&quot;http://shenlanguage.org/learn-shen/tutorials/shen_in_15mins.html#shen-in-15mins&quot;&gt;Shen in 15 minutes&lt;/a&gt; tutorial on the Shen website. Afterwards, explore the other resources found on the &lt;a href=&quot;http://shenlanguage.org/learn-shen/index.html&quot;&gt;Learn Shen&lt;/a&gt; section of Shen’s website.&lt;/p&gt;

&lt;p&gt;For more information on ShenRuby, please see the &lt;a href=&quot;https://github.com/gregspurrier/shen-ruby&quot;&gt;ShenRuby Repository&lt;/a&gt; on GitHub.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2012/12/02/to-be-continued</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2012/12/02/to-be-continued.html"/>
    <title>To Be Continued: Async Simplified</title>
    <updated>2012-12-02T19:30:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;Asynchronous programming can greatly boost the performance of I/O-bound applications. This wins it many proponents and is a major contributor to the popularity of Node.js.&lt;/p&gt;

&lt;p&gt;Unfortunately, asynchronous programs can be challenging to write, read, and maintain. Left unchecked, they can devolve into piles of callback spaghetti and deeply nested anonymous callback function definitions. The latter are aptly called “Pyramids of Doom” by Trevor Burnham in his book &lt;a href=&quot;http://pragprog.com/book/tbajs/async-javascript&quot;&gt;Async JavaScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flow control libraries like &lt;a href=&quot;https://github.com/caolan/async&quot;&gt;Async&lt;/a&gt; and &lt;a href=&quot;https://github.com/creationix/step&quot;&gt;Step&lt;/a&gt; improve the situation in JavaScript by managing the flow of the program from one asynchronous function to the next. But, even with these libraries, the interplay between synchronous and asynchronous code is still too awkward for my taste.&lt;/p&gt;

&lt;p&gt;In Clojure, where we can bring macros into play, we can do better. The remainder of this post introduces an asynchronous Clojure/ClojureScript library that I have been working on called To Be Continued. Its goal is to make it easier to write, read, and maintain asynchronous Clojure and ClojureScript programs.&lt;/p&gt;

&lt;h2 id=&quot;callback-placeholders&quot;&gt;Callback Placeholders&lt;/h2&gt;

&lt;p&gt;Callback placeholders, indicated by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...&lt;/code&gt; at the end of a form, are the central feature of To Be Continued. When one is encountered during the expansion of TBC’s macros, it is replaced with a generated callback function that arranges for the flow of execution to continue where it left off once the result is available.&lt;/p&gt;

&lt;p&gt;In addition to telling the TBC macros that a given form requires a callback, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;...&lt;/code&gt; serves as a hint to readers that an asynchronous call is taking place behind the scenes even though TBC is allowing the flow of the code to be expressed uninterrupted.&lt;/p&gt;

&lt;p&gt;Callback placeholders are used with TBC’s threading macros and parallel binding form, described below.&lt;/p&gt;

&lt;h2 id=&quot;threading-macros&quot;&gt;Threading Macros&lt;/h2&gt;

&lt;p&gt;To Be Continued provides two asynchronous-aware threading macros, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-+-&amp;gt;&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-+-&amp;gt;&amp;gt;&lt;/code&gt;, analogous to clojure.core’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&amp;gt;&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&amp;gt;&amp;gt;&lt;/code&gt; macros, respectively. They expect a value or an expression returning a value as their first argument, a callback form to invoke with the final result as their last argument, and any number of intermediate forms in between.&lt;/p&gt;

&lt;p&gt;The intermediate forms may be synchronous function invocations, asynchronous function invocations having a callback placeholder as their final argument, or a combination of the two.&lt;/p&gt;

&lt;p&gt;The return value of TBC threading macros is always nil. It is expected that the final form will be a callback that will do something useful with the result passed to it.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(use &apos;to-be-continued.core)

(defn async-square
  &quot;Invoke the callback with the square of x after 1 second&quot;
  [x callback]
  (.start (Thread. (fn []
                     (Thread/sleep 1000)
                     (callback (* x x))))))

(-+-&amp;gt; 7
      (async-square ...)
      (str &quot; monkeys&quot;)
      println)

;; =&amp;gt; nil
;; 49 monkeys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the asynchronous result of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;async-square&lt;/code&gt; has been supplied to its automatically-generated callback, processing resumes with a synchronous call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;str&lt;/code&gt; and then to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;println&lt;/code&gt; which serves as the final callback and displays the result.&lt;/p&gt;

&lt;h2 id=&quot;parallel-binding&quot;&gt;Parallel Binding&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let-par&lt;/code&gt; macro is the asynchronous equivalent of Clojure’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let&lt;/code&gt; macro. It allows the results of multiple asynchronous functions, executed in parallel, to be bound to variables that can be referenced the body expression.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(defn async-sum-of-squares
  [x y callback]
  (let-par [x-sq (async-square x ...)
            y-sq (async-square y ...)]
    (-+-&amp;gt;&amp;gt; (+ x-sq y-sq)
           (str &quot;The answer is: &quot;)
           callback)))

(async-sum-of-squares 2 5 println)
;; =&amp;gt; nil
;; The answer is 29
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that the use of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-+-&amp;gt;&amp;gt;&lt;/code&gt; macro above is not strictly necessary because there are no asynchronous forms before the final callback. Its use is encouraged, however, for error handling purposes. Once error handling support has been incorporated into TBC (see Status and Next Steps, below) any errors that occur in the chain will be properly handled and propagated.&lt;/p&gt;

&lt;p&gt;Like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-+-&amp;gt;&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-+-&amp;gt;&amp;gt;&lt;/code&gt;, the value of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let-par&lt;/code&gt; expression is always nil. It is expected to invoke a callback with its result.&lt;/p&gt;

&lt;h2 id=&quot;example-clojurescript--nodejs&quot;&gt;Example: ClojureScript + Node.js&lt;/h2&gt;
&lt;p&gt;To see To Be Continued in action, please check out &lt;a href=&quot;https://github.com/gregspurrier/tbc-node-example&quot;&gt;tbc-node-example&lt;/a&gt;. It is an example project using TBC with ClojureScript and Node.js to asynchronously fetch data from GitHub’s API.&lt;/p&gt;

&lt;p&gt;It has example usages of the macros described above as well &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map-par&lt;/code&gt;, a parallel, asynchronous equivalent of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clojure.core/map&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;status-and-next-steps&quot;&gt;Status and Next Steps&lt;/h2&gt;
&lt;p&gt;To Be Continued 0.1.0 supports both Clojure and ClojureScript. The &lt;a href=&quot;https://github.com/gregspurrier/to-be-continued&quot;&gt;source code&lt;/a&gt; is available on GitHub and a &lt;a href=&quot;https://clojars.org/to-be-continued&quot;&gt;distribution package&lt;/a&gt; is posted on Clojars.&lt;/p&gt;

&lt;p&gt;TBC currently lacks support for handling errors that occur during asynchronous computation. Therefore, it is not yet suitable for production use. Error handling is my next focus and will be available in the 0.2.0 release.&lt;/p&gt;

&lt;p&gt;In the mean time, the existing functionality should be sufficient to get a feel for the library. Feedback is very welcome, whether as comments here or as issues filed on its GitHub project.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2012/06/28/xmonad-on-os-x-lion</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2012/06/28/xmonad-on-os-x-lion.html"/>
    <title>xmonad on OS X Lion</title>
    <updated>2012-06-28T02:30:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;I’ve been experimenting with distraction-free development environments on OS X Lion. I had high hopes for &lt;a href=&quot;/2012/04/10/full-screen-emacs-24-for-os-x-lion.html&quot;&gt;full-screen Emacs&lt;/a&gt;. Unfortunately, neither Eshell nor terminal-mode felt quite right for command line work. And, even with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;windmove-default-bindings&lt;/code&gt;, navigating around the three or four windows I was using to take advantage of the full-screen space was awkward.&lt;/p&gt;

&lt;p&gt;About the time I was abandoning full-screen Emacs, I discovered &lt;a href=&quot;http://xmonad.org/&quot;&gt;xmonad&lt;/a&gt; through some tweets from &lt;a href=&quot;https://twitter.com/Baranosky&quot;&gt;@Baranoksy&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/SeanTAllen&quot;&gt;@SeanTAllen&lt;/a&gt;. It is a tiling window manager for X Windows that can be controlled completely through the keyboard. xmonad is to X what tmux is to a terminal. Trying it on an Arch Linux VM gave me exactly what I was looking for: Emacs on the left and a variable number of XTerms stacked on the right.&lt;/p&gt;

&lt;p&gt;Intrigued and excited to incorporate it into my daily work, I set out to get xmonad working full-screen on OS X Lion. It takes some work, and the experience is not seamless–see issues to be aware of, below–but it is good enough to for serious work. I’ve been using it as my primary development setup for the past week weeks and have been very happy with it.&lt;/p&gt;

&lt;p&gt;The following sections describe the steps I went through to get xmonad up and running in a full-screen X11 environment on OS X Lion. I assume that you already have &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt; installed.&lt;/p&gt;

&lt;h2 id=&quot;installing-xquartz&quot;&gt;Installing XQuartz&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X11.app&lt;/code&gt;, the implementation of the X Window System that ships with OS X Lion does not support full-screen usage. To get that functionality, you must install the latest version of &lt;a href=&quot;http://xquartz.macosforge.org/&quot;&gt;XQuartz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Installation is simple: download the &lt;a href=&quot;http://xquartz.macosforge.org/downloads/SL/XQuartz-2.7.2.dmg&quot;&gt;XQuartz-2.7.2 disk image&lt;/a&gt;, open it, and run the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XQuartz.pkg&lt;/code&gt; installer. After installation, log out and log in again. This ensures that XQuartz will be recognized as the default implementation of X.&lt;/p&gt;

&lt;h2 id=&quot;building-xmonad&quot;&gt;Building xmonad&lt;/h2&gt;
&lt;p&gt;xmonad is implemented in Haskell, so the first step is installing the Haskell compiler and platform:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew update
brew install ghc haskell-platform
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These packages take a while to build. Now is a good time to take a break, stretch your legs, and come back in a few minutes. If they are still building, peruse the &lt;a href=&quot;http://xmonad.org/tour.html&quot;&gt;xmonad Guided Tour&lt;/a&gt; to get a taste for the functionality that you will soon be enjoying.&lt;/p&gt;

&lt;p&gt;Next, install xmonad’s dependencies using cabal, which is Haskell’s package manager:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cabal update
cabal install &quot;X11 &amp;gt;=1.5.0.0 &amp;amp;&amp;amp; &amp;lt;1.6&quot;
cabal install &quot;utf8-string ==0.3.*&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, download, build, and install xmonad as an application for use by the current user:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mkdir ~/build-xmonad
cd ~/build-xmonad
curl -O http://hackage.haskell.org/packages/archive/xmonad/0.10/xmonad-0.10.tar.gz
tar xzf xmonad-0.10.tar.gz
cd xmonad-0.10
runhaskell Setup.lhs configure --user --prefix=$HOME
runhaskell Setup.lhs build
runhaskell Setup.lhs install --user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;configuring-xquartz-for-xmonad&quot;&gt;Configuring XQuartz for xmonad&lt;/h2&gt;

&lt;p&gt;Create an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.xinitrc&lt;/code&gt; file containing:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[[ -f ~/.Xresources ]] &amp;amp;&amp;amp; xrdb -load ~/.Xresources
xterm &amp;amp;
$HOME/bin/xmonad
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now start XQuartz (it is installed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Applications/Utilities&lt;/code&gt;). You will not see anything yet. Open the XQuartz Preferences with Command-, and update the following settings:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Output&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Enable “Full-screen mode”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Input&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Enable “Emulate three button mouse”&lt;/li&gt;
      &lt;li&gt;Disable “Follow system keyboard layout”&lt;/li&gt;
      &lt;li&gt;Disable “Enable key equivalents under X11”&lt;/li&gt;
      &lt;li&gt;Enable “Option keys sent Alt_L and Alt_R”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Pasteboard&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Enable all of the options&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are now ready to toggle full-screen mode with Command-Option-A. After doing so, you should be greeted by a full-screen XTerm. Hitting Option-Shift-Return should open another Xterm. Now hit Option-Shift-Q to quit xmonad (and XQuartz): we’ve got a little more work to do.&lt;/p&gt;

&lt;h2 id=&quot;improving-the-full-screen-experience&quot;&gt;Improving the Full-screen Experience&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Three-finger swipe up to enter mission control&lt;/li&gt;
  &lt;li&gt;Hold down the Option key and click the + button in the top left. This will create another desktop.&lt;/li&gt;
  &lt;li&gt;Select the new desktop and launch XQuartz. Right click on its icon in the dock and choose “This Desktop” under Options. Now XQuartz will always launch into this desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;issues-to-be-aware-of&quot;&gt;Issues To Be Aware Of&lt;/h2&gt;

&lt;p&gt;If you use a three-finger left or right swipe to move from the desktop running XQuartz to another desktop or full-screen app and then return, your xmonad windows will likely be missing. Simply click on the XQuartz icon in the dock to bring them back.&lt;/p&gt;

&lt;p&gt;I have had a few instances in which the Command-Return key sequence to launch a new terminal stops responding. If you have a terminal open, it’s not the end of the world because you can still launch them manually from the command line. But, it is annoying and I typically restart xmonad as soon as I am at a stoping point. Unfortunately, I have not found a reliable way to reporduce this in order to file a bug report. Fortunately, it is pretty rare.&lt;/p&gt;

&lt;h2 id=&quot;optional-building-emacs-24-with-x-support&quot;&gt;Optional: Building Emacs 24 with X Support&lt;/h2&gt;

&lt;p&gt;If you’re an Emacs user, you’ll likely want a version of Emacs 24 that has been built with support for X. To avoid conflicting with the packages in /usr/local managed by Homebrew, we’ll put this build in /opt/local:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install fontconfig libjpeg libtiff ungif 
cd ~/build-xmonad
curl -O http://ftp.gnu.org/pub/gnu/emacs/emacs-24.1.tar.gz
tar xzf emacs-24.1.tar.gz
cd emacs-24.1
./configure --prefix=/opt/local
sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;These instructions were inspired by the instructions found on the &lt;a href=&quot;http://www.haskell.org/haskellwiki/Xmonad/Using_xmonad_on_Apple_OSX&quot;&gt;Using xmonad on Apple OSX&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;The hint about dedicating a separate desktop space to X11 came from &lt;a href=&quot;http://www.itworld.com/software/243789/run-x11-applications-full-screen-mac-os-x-lion&quot;&gt;Run X11 applications full screen in Mac OS X Lion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://twitter.com/Baranosky&quot;&gt;Alex Baranosky&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/joshvf&quot;&gt;Josh Fleming&lt;/a&gt; for test driving earlier versions of these instructions.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2012/04/20/pharo-by-example-on-os-x</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2012/04/20/pharo-by-example-on-os-x.html"/>
    <title>Running the Pharo by Example Image</title>
    <updated>2012-04-20T05:00:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;This week brought Version 1.4 announcements for both &lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/1f87f69db07a8162&quot;&gt;Clojure&lt;/a&gt; and &lt;a href=&quot;http://www.pharo-project.org/news?dialog=pharo-1-4-released&quot;&gt;Pharo&lt;/a&gt;. The alignment of their version numbers was a coincidence, but I took it as a subtle hint from the computer language universe that I should renew my dabbling in Smalltalk.&lt;/p&gt;

&lt;p&gt;The first time that I took Pharo for a spin, I got through the Professor Stef tutorial and was intrigued. I was beginning to see why people find Smalltalk to be so appealing. There is a real beauty in the simplicity and consistency of its object model. I got busy and sidetracked, though, and didn’t make it much further than that.&lt;/p&gt;

&lt;p&gt;This time around, I am planning to work my way through &lt;a href=&quot;http://pharobyexample.org/&quot;&gt;Pharo By Example&lt;/a&gt;. Unfortunately, the &lt;a href=&quot;https://gforge.inria.fr/frs/download.php/27023/PBE-1.0.zip&quot;&gt;image used by the examples in the
book&lt;/a&gt; does not run on the VM that comes with Pharo 1.4: it crashes on
startup. &lt;a href=&quot;http://lists.gforge.inria.fr/pipermail/pharo-users/2011-December/003278.html&quot;&gt;This
post&lt;/a&gt;
on the Pharo Users mailing list pointed me in the right direction. It
turns out that the image does not run on the Squeak/Cog-based VM
distributed with Pharo 1.4.&lt;/p&gt;

&lt;p&gt;I don’t know about other platforms, but for OS X, the answer is to use the non-Cog Squeak 5.7.x Cocoa VM available at &lt;a href=&quot;http://www.squeakvm.org/mac/&quot;&gt;squeakvm.org&lt;/a&gt;. Download it, unzip it, and drag the Pharo by Example image onto it. That will launch the image and then you can start working through the book.&lt;/p&gt;

&lt;p&gt;Happy Smalltalking!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2012/04/11/full-screen-emacs-24-for-os-x-lion</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2012/04/11/full-screen-emacs-24-for-os-x-lion.html"/>
    <title>Full-screen Emacs 24 for OS X Lion</title>
    <updated>2012-04-11T04:00:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;I have been experimenting with Emacs in full-screen mode as a way to reduce distractions. The Homebrew Emacs formula includes a patch providing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x ns-toggle-fullscreen&lt;/code&gt; command for switching between normal and full-screen modes. It works well, but does not provide the typical OS X Lion full-screen app experience. In particular, it remains on the desktop, obscuring non-full-screen applications, rather than moving to its own space.&lt;/p&gt;

&lt;p&gt;Searching on the web yielded a &lt;a href=&quot;https://gist.github.com/1355895&quot;&gt;patch&lt;/a&gt; by Konstantinos Efstathiou and &lt;a href=&quot;http://efstathiou.gr/unlinked/fullscreen&quot;&gt;his instructions&lt;/a&gt; for compiling Emacs as a proper full-screen application for OS X Lion. It looked promising, but I was reluctant to install updated versions of autoconf and automake, especially given his warnings. Searching further, I found an &lt;a href=&quot;http://emacswiki.org/emacs/FullScreen#toc23&quot;&gt;EmacsWiki entry&lt;/a&gt; referencing a Homebrew formula using the same patch, but it failed to build for me. In fact, all Homebrew builds for Emacs 24 were failing for me, so perhaps the HEAD of the git Emacs mirror it uses was broken.&lt;/p&gt;

&lt;p&gt;Frustrated, I took inspiration from David Caldwell’s &lt;a href=&quot;https://github.com/caldwell/build-emacs&quot;&gt;build-emacs&lt;/a&gt; script and used the following commands to build a Lion-only, full-screen capable version of Emacs 24.0.95:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl -O ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-24.0.95.tar.gz
tar xzf emacs-24.0.95.tar.gz 
cd emacs-24.0.95/
curl https://raw.github.com/gist/1355895/860fb678838e3cceccf896f4116b13ee5815f526/lion-fullscreen.patch | patch -p1
sed -ie &quot;s/colorWithCalibratedRed/colorWithDeviceRed/&quot; src/nsterm.m
./configure --host=x86_64-apple-darwin --build=i686-apple-darwin --with-ns
make clean install 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For good measure, I also included the equivalent of the Homebrew Emacs formula’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--srgb&lt;/code&gt; flag to fix the Emacs &lt;a href=&quot;http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8402&quot;&gt;color rendering bug&lt;/a&gt; on OS X.&lt;/p&gt;

&lt;p&gt;Once the build is complete, you can test it with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;open nextstep/Emacs.app&lt;/code&gt;. Both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x ns-toggle-fullscreen&lt;/code&gt; and the standard full-screen button in the top-right corner of the window work for switching modes. If everything is OK, you can then move it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Applications&lt;/code&gt; or wherever else you normally keep your Emacs installation.&lt;/p&gt;

&lt;p&gt;The jury is still out on my distraction-free-Emacsing experiment, but at least now it seamlessly integrates with the OS X Lion full-screen experience.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://sourcematters.org/2012/03/12/in-my-toolkit-midje</id>
    <link type="text/html" rel="alternate" href="http://sourcematters.org/2012/03/12/in-my-toolkit-midje.html"/>
    <title>In My Toolkit: Midje</title>
    <updated>2012-03-12T00:00:00+00:00</updated>
    <author>
      <name>Greg Spurrier</name>
      <uri>http://sourcematters.org/</uri>
    </author>
    <content type="html">&lt;p&gt;When I switched to Clojure as my primary programming language, the top item on my shopping list was a testing library. Clojure comes with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clojure.test&lt;/code&gt;, but after 5 years of using RSpec, I wanted something more in its style. I stopped searching when I found Midje. It was exactly what I was looking for. It even had something I didn’t realize I’d been yearning for: metaconstants–more on those later.&lt;/p&gt;

&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;/h2&gt;
&lt;p&gt;Below are some of the highlights of Midje that are intended to give
you a taste of its style and capabilities. For the details and
additional features, please see its
&lt;a href=&quot;https://github.com/marick/Midje/wiki&quot;&gt;user guide&lt;/a&gt; and annotated
&lt;a href=&quot;https://github.com/marick/Midje/blob/master/examples/basic/test/basic/core_test.clj&quot;&gt;example&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;facts&quot;&gt;Facts&lt;/h3&gt;
&lt;p&gt;The fact macro is the basic Midje building block. With it you declare the expected result of an expression. It is striking in its simplicity:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(fact (+ 1 1) =&amp;gt; 2)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The expression before the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;=&amp;gt;&lt;/code&gt; is the expression being tested and the one after it is the expected result. In this case the result is a specific value, but a rich set of &lt;a href=&quot;https://github.com/marick/Midje/wiki/Checkers&quot;&gt;checkers&lt;/a&gt; allow for more generality.&lt;/p&gt;

&lt;p&gt;Optional document strings allow you to elaborate on your tests:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(fact &quot;basic addition&quot;
  (+ 1 1) =&amp;gt; 2)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Multiple related facts may be combined into a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fact&lt;/code&gt;–or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;facts&lt;/code&gt;, if you prefer–expression:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(facts &quot;about basic addition&quot;
  &quot;one and one are two&quot;
  (+ 1 1) =&amp;gt; 2
  &quot;two and two are four&quot;
  (+ 2 2) =&amp;gt; 4)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;RSpec has mocks and stubs. Midje has prerequisites. They are specified with the provided clause within a fact:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(fact (sum-of-squares 2 3) =&amp;gt; 13
  (provided 
    (square 2) =&amp;gt; 4
    (square 3) =&amp;gt; 9))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Prerequisites both provide return values for a (possibly not-yet-implemented) function and ensure that it is being called as expected.&lt;/p&gt;

&lt;h3 id=&quot;metaconstants&quot;&gt;Metaconstants&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/marick/Midje/wiki/Metaconstants&quot;&gt;Metaconstants&lt;/a&gt; are my favorite feature of Midje. They are an elegant solution to what would require extensive use of mock objects in RSpec. For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(fact
  (sum-scores [..game1.. ..game2..]) =&amp;gt; 10
  (provided
    (score ..game1..) =&amp;gt; 3
    (score ..game2..) =&amp;gt; 7))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This states that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum-scores&lt;/code&gt; will be passing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;..game1..&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;..game2..&lt;/code&gt; through to the score function and then summing the results
to get its result. The beauty is that the implementation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum-scores&lt;/code&gt;
does not care what sort of values &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;..game1..&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;..game2..&lt;/code&gt; are and, thanks to metaconstants, neither does the test.&lt;/p&gt;

&lt;h3 id=&quot;midje-mode-for-emacs&quot;&gt;Midje Mode for Emacs&lt;/h3&gt;
&lt;p&gt;If you are an Emacs user, it is worth installing &lt;a href=&quot;https://github.com/marick/Midje/wiki/Midje-mode&quot;&gt;Midje mode&lt;/a&gt;. It gives you the ability to send individual facts to the browser and see the results as comments added to the buffer above the fact. This is a big time saver compared to running the tests through, e.g., the Leiningen Midje plugin and makes the red/green/refactor cycle very quick.&lt;/p&gt;

&lt;p&gt;As an added bonus, it also updates the Clojure mode indentation rules so that facts format as shown in the above examples.&lt;/p&gt;

&lt;h2 id=&quot;getting-midje&quot;&gt;Getting Midje&lt;/h2&gt;
&lt;p&gt;Ready to give Midje a try? The &lt;a href=&quot;https://github.com/marick/Midje&quot;&gt;source code&lt;/a&gt; is available on GitHub and the &lt;a href=&quot;http://clojars.org/midje&quot;&gt;library&lt;/a&gt; is available on Clojars.&lt;/p&gt;
</content>
  </entry>
  
 
</feed>
