<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Eric Lavigne</title>
  <link>http://lispnyc.org:80/blog/ericlavigne/</link>
  <description>exploration of software development</description>
  <language>en</language>
  <copyright>Blog Owner</copyright>
  <lastBuildDate>Mon, 31 Jan 2011 03:00:00 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>A tour of the Clojure landscape</title>
    <link>http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape</link>
    
      
        <description>
          &lt;img src=&#034;http://lispnyc.org/blog/ericlavigne/files/images/clojure-landscape.jpg&#034; alt=&#034;Clojure landscape&#034; width=&#034;100%&#034; /&gt;

&lt;p&gt;I am working on an automatically-generated, &lt;a href=&#034;https://github.com/ericlavigne/browse-clojure&#034;&gt;browseable directory&lt;/a&gt; of Clojure libraries. If I am viewing a library in such a directory, the directory should be able to give me a list of other libraries that I should consider instead, as well as a list of libraries that work well with this one. The directory application could infer such information automatically based on how often various libraries are used together on Github.&lt;/p&gt;

&lt;p&gt;While I originally generated the map above as an intermediate step towards that goal, I also found the map itself interesting. There were a lot of projects that I hadn&#039;t heard about, and those that I did know about tended to be close to eachother. Did I actually have a position on this map, so that I would only hear about nearby projects? With that in mind, here is a quick tour of Clojure&#039;s landscape. Clojure&#039;s community is growing fast, and it can be hard to keep up with all the projects. Hopefully I can introduce you to some interesting projects that you haven&#039;t heard of before.&lt;/p&gt;

&lt;h2&gt;1 ) The capital city: Clojure and Clojure-contrib&lt;/h2&gt;
&lt;p&gt;This is where Rich Hickey and other &lt;a href=&#034;http://clojure.com&#034;&gt;Clojure/core&lt;/a&gt; members are hard at work on Clojure 1.3, including performance improvements such as primitive function arguments, primitive return values, and pods. Clojure/core also provides support, mentorship, training, and consulting services for companies that are adopting Clojure. You can learn more in Rich Hickey&#039;s recent &lt;a href=&#034;http://www.infoq.com/interviews/hickey-clojure-protocols&#034;&gt;InfoQ interview&lt;/a&gt;. I just sent in my &lt;a href=&#034;http://clojure.org/contributing&#034;&gt;contributor&#039;s agreement&lt;/a&gt; and am eager to join the effort.&lt;/p&gt;

&lt;h2&gt;2 ) Building Clojure projects: Leiningen&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;https://github.com/technomancy/leiningen&#034;&gt;Leiningen&lt;/a&gt; is an easy-to-use alternative to Java&#039;s Ant and Maven. It provides built-in commands for common tasks like downloading dependencies, compiling the project, creating a JAR file, and launching a REPL. Leiningen&#039;s creator, Phil Hagelberg, has been remarkably effective at soliciting contributions, and a wide variety of community plugins provide additional Leiningen commands.&lt;/p&gt;

&lt;h2&gt;3 ) Dev Ops: Pallet and JClouds&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;http://hugoduncan.github.com/pallet/&#034;&gt;Pallet&lt;/a&gt; is an alternative to shell scripts and manual server administration. It communicates with cloud providers tostart up new instances, configure those instances based on predefined recipes, and perform day-to-day tasks like deploying new versions of an application.&lt;/p&gt;

&lt;p&gt;Behind the scenes, &lt;a href=&#034;http://www.jclouds.org/&#034;&gt;JClouds&lt;/a&gt; allows the same commands to work for a variety of cloud providers.&lt;/p&gt;

&lt;p&gt;Some good introductions include Hugo Duncan&#039;s article on &lt;a href=&#034;http://hugoduncan.org/post/2010/shell_scripting_in_clojure_with_pallet.xhtml&#034;&gt;shell scripting&lt;/a&gt;, and Chas Emerick&#039;s article on &lt;a href=&#034;http://cemerick.com/2010/11/02/continuous-deployment-of-clojure-web-applications/&#034;&gt;continuous deployment of web applications&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;4 ) Cake: a Leiningen rival&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;https://github.com/ninjudd/cake&#034;&gt;Cake&lt;/a&gt; competes with Leiningen as a Clojure build tool. It is compatible with most Leiningen project.clj files, and comes with extra features such as fast start-up, a dependency based task model that allows you to extend existing tasks, and an enhanced REPL with paren matching and tab completion.&lt;/p&gt;

&lt;h2&gt;5 ) Web development: Ring, Compojure, Enlive, Hiccup, and Sandbar&lt;/h2&gt;
&lt;p&gt;So far, Clojure&#039;s web development options are based on small, easily-composable libraries. In other words, more like Sinatra than Rails. &lt;a href=&#034;https://github.com/mmcgrana/ring&#034;&gt;Ring&lt;/a&gt; provides an abstraction over web servers, as well as support for defining middleware. &lt;a href=&#034;https://github.com/weavejester/compojure&#034;&gt;Compojure&lt;/a&gt; takes care of routing. You can generate HTML with &lt;a href=&#034;https://github.com/swannodette/enlive-tutorial/&#034;&gt;Enlive&lt;/a&gt; if you prefer pure HTML templates, or with &lt;a href=&#034;https://github.com/weavejester/hiccup&#034;&gt;Hiccup&lt;/a&gt; if you prefer to write views directly in Clojure. &lt;a href=&#034;https://github.com/brentonashworth/sandbar&#034;&gt;Sandbar&lt;/a&gt; takes care of some of the remaining issues, like authentication/authorization and form validation.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#034;https://github.com/macourtney/Conjure&#034;&gt;Conjure&lt;/a&gt; is another option, which is closer to the Rails style.&lt;/p&gt;

&lt;h2&gt;6 ) Beginner&#039;s projects: TryClojure, Clojure 101, Clojure Koans, and LabREPL&lt;/h2&gt;
Each of these projects helps new Clojure programmers to learn the language. Try &lt;a href=&#034;http://www.try-clojure.org/&#034;&gt;Clojure&lt;/a&gt; allows you to try out Clojure in your web browser, no download required, and even includes a small tutorial. &lt;a href=&#034;https://github.com/ghoseb/clojure101&#034;&gt;Clojure 101&lt;/a&gt; and &lt;a href=&#034;http://clojure-notes.rubylearning.org/&#034;&gt;these notes&lt;/a&gt; are training materials for an online course offered by &lt;a href=&#034;http://www.rubylearning.org/class/&#034;&gt;RubyLearning&lt;/a&gt;. &lt;a href=&#034;https://github.com/functional-koans/clojure-koans&#034;&gt;Clojure Koans&lt;/a&gt; is a test-driven approach to learning, in which you fix small code examples to make tests pass (based on a &lt;a href=&#034;http://rubykoans.com/&#034;&gt;similar project&lt;/a&gt; for Ruby). &lt;a href=&#034;https://github.com/relevance/labrepl&#034;&gt;LabREPL&lt;/a&gt; is part of the training materials for &lt;a href=&#034;http://clojure.com/&#034;&gt;Clojure/core&lt;/a&gt;&#039;s Clojure training program.&lt;/p&gt;

&lt;h2&gt;7 ) Testing: Midje and Lazytest&lt;/h2&gt;
&lt;p&gt;Both Midje and Lazytest are alternatives to the clojure.test framework that is built in to Clojure. &lt;a href=&#034;https://github.com/marick/Midje&#034;&gt;Midje&lt;/a&gt; encourages a separation between the actual tests and &#034;checkers&#034; that determine whether a test passed. &lt;a href=&#034;https://github.com/stuartsierra/lazytest&#034;&gt;Lazytest&lt;/a&gt; can be set up to watch your project&#039;s files, and rerun the tests automatically whenever your source code changes.&lt;/p&gt;

&lt;h2&gt;8 ) Musical Clojure: Overtone&lt;/h2&gt;
&lt;p&gt;I was surprised and delighted to discover Clojure&#039;s musical island, at the bottom of the map. Jeff Rose created &lt;a href=&#034;http://project-overtone.org&#034;&gt;Overtone&lt;/a&gt; as a replacement for a Serge Modular synthesizer that he enjoyed playing with, but that didn&#039;t have a save button or other nice abstractions. He presented Overtone at a Rails conference (&lt;a href=&#034;http://vimeo.com/16143967&#034;&gt;video&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;9 ) Further into the frontier&lt;/h2&gt;
&lt;p&gt;Brian Carper&#039;s &lt;a href=&#034;https://github.com/briancarper/cow-blog&#034;&gt;Cow-Blog&lt;/a&gt; is so far out on the frontier that it doesn&#039;t even show up on my map. This blog engine seems to be rather rough around the edges, but I&#039;m considering migrating my own blog from Wordpress to Cow-Blog. I like the idea of taking a peek under the hood and tinkering with the Clojure code. Plus, it looks like it comes with support for syntax highlighting of code examples.&lt;/p&gt;

&lt;p&gt;I created the map above by tying projects together that share at least two contributors. Naturally, any single-contributor projects wouldn&#039;t show up on such a map, and projects with only a few contributors also have low odds of showing up. Several startups have used Clojure for distributed computing, but projects like &lt;a href=&#034;http://tech.backtype.com/introducing-cascalog-a-clojure-based-query-la-0&#034;&gt;Cascalog&lt;/a&gt;(&lt;a href=&#034;http://tech.backtype.com/videos-from-the-may-hadoop-meet-up&#034;&gt;video&lt;/a&gt;), &lt;a href=&#034;http://github.com/amitrathore/swarmiji&#034;&gt;swarmiji&lt;/a&gt;, and &lt;a href=&#034;https://github.com/stuartsierra/clojure-hadoop&#034;&gt;clojure-hadoop&lt;/a&gt; aren&#039;t on the map.&lt;/p&gt;

&lt;p&gt;What other projects should be included in a tour of Clojure? Share your ideas by commenting below or on &lt;a href=&#034;http://news.ycombinator.com/item?id=2160071&#034;&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;&lt;div class=&#034;tags&#034;&gt;&lt;span&gt;Social Bookmarks : &lt;/span&gt;&amp;nbsp;&lt;a href=&#034;http://slashdot.org/bookmark.pl?url=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Slash Dot&#034;&gt;&lt;img src=&#034;common/images/slashdot.png&#034; alt=&#034;Add this post to Slashdot&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://digg.com/submit?url=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Digg this post&#034;&gt;&lt;img src=&#034;common/images/digg.png&#034; alt=&#034;Add this post to Digg&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://reddit.com/submit?url=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Reddit&#034;&gt;&lt;img src=&#034;common/images/reddit.png&#034; alt=&#034;Add this post to Reddit&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://del.icio.us/post?url=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Save this post to Del.icio.us&#034;&gt;&lt;img src=&#034;common/images/delicious.png&#034; alt=&#034;Add this post to Delicious&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://www.stumbleupon.com/submit?url=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Stumble this post&#034;&gt;&lt;img src=&#034;common/images/stumbleupon.png&#034; alt=&#034;Add this post to Stumble it&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://www.google.com/bookmarks/mark?op=edit&amp;amp;bkmk=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Google&#034;&gt;&lt;img src=&#034;common/images/google.png&#034; alt=&#034;Add this post to Google&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://technorati.com/faves?add=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Technorati&#034;&gt;&lt;img src=&#034;common/images/technorati.png&#034; alt=&#034;Add this post to Technorati&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://www.bloglines.com/sub/http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Bloglines&#034;&gt;&lt;img src=&#034;common/images/bloglines.png&#034; alt=&#034;Add this post to Bloglines&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://www.facebook.com/share.php?u=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Facebook&#034;&gt;&lt;img src=&#034;common/images/facebook.png&#034; alt=&#034;Add this post to Facebook&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://www.furl.net/storeIt.jsp?u=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;t=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Furl&#034;&gt;&lt;img src=&#034;common/images/furl.png&#034; alt=&#034;Add this post to Furl&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;https://favorites.live.com/quickadd.aspx?mkt=en-us&amp;amp;url=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;title=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Windows Live&#034;&gt;&lt;img src=&#034;common/images/windowslive.png&#034; alt=&#034;Add this post to Windows Live&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&#034;http://bookmarks.yahoo.com/toolbar/savebm?opener=tb&amp;amp;u=http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape&amp;amp;t=A+tour+of+the+Clojure+landscape&#034; target=&#034;_blank&#034; title=&#034;Add this post to Yahoo!&#034;&gt;&lt;img src=&#034;common/images/yahoo.png&#034; alt=&#034;Add this post to Yahoo!&#034; border=&#034;0&#034; /&gt;&lt;/a&gt;&lt;/div&gt;
        </description>
      
      
    
    
    
    <comments>http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape#comments</comments>
    <guid isPermaLink="true">http://lispnyc.org:80/blog/ericlavigne/a-tour-of-the-clojure-landscape</guid>
    <pubDate>Mon, 31 Jan 2011 03:00:00 GMT</pubDate>
  </item>
  
  </channel>
</rss>
