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

	<title>Planet Clojure</title>
	<link rel="self" href="http://planet.clojure.in/atom.xml"/>
	<link href="http://planet.clojure.in/"/>
	<id>http://planet.clojure.in/atom.xml</id>
	<updated>2013-06-18T20:28:34+00:00</updated>
	<generator uri="http://www.planetplanet.org/">http://intertwingly.net/code/venus/</generator>

	<entry>
		<title type="html">Epitrochoids in ClojureScript</title>
		<link href="http://michaelalynmiller.com/blog/2013/06/18/epitrochoids-in-clojurescript/"/>
		<id>http://michaelalynmiller.com/blog/2013/06/18/epitrochoids-in-clojurescript</id>
		<updated>2013-06-18T07:00:00+00:00</updated>
		<content type="html">&lt;p&gt;I started reading a book called &lt;em&gt;&lt;a href=&quot;http://www.manning.com/pearson/&quot;&gt;Generative Art&lt;/a&gt;&lt;/em&gt; a few weeks ago and the first exercise, drawing a circle using trig functions, reminded me of my favorite &lt;a href=&quot;https://en.wikipedia.org/wiki/After_Dark_(software)&quot;&gt;After Dark&lt;/a&gt; screen saver, Rose.  I have always wanted to understand how Rose worked and could see that this exercise had started to send me down the right path.  A few weeks later — and with some help from Rose’s author! — and I now have a framework for building HTML5 Canvas-based generative artworks in &lt;a href=&quot;https://github.com/clojure/clojurescript&quot;&gt;ClojureScript&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Michael Alyn Miller</name>
			<uri>http://michaelalynmiller.com/</uri>
		</author>
		<source>
			<title type="html">Michael Alyn Miller</title>
			<link rel="self" href="http://michaelalynmiller.com/categories/clojure/atom.xml"/>
			<id>http://michaelalynmiller.com/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Introducing Cassaforte</title>
		<link href="http://blog.clojurewerkz.org/blog/2013/06/17/introducing-cassaforte/"/>
		<id>http://blog.clojurewerkz.org/blog/2013/06/17/introducing-cassaforte</id>
		<updated>2013-06-17T19:38:00+00:00</updated>
		<content type="html">&lt;h2&gt;TL;DR&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://clojurecassandra.info&quot;&gt;Cassaforte&lt;/a&gt; is a new Clojure client for
Apache Cassandra 1.2+.  It is built around CQL 3 and focuses on ease
of use. You will likely find that using Cassandra from Clojure has
never been so easy.&lt;/p&gt;

&lt;h2&gt;Another Brick in the Wall&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://clojurewerkz.org&quot;&gt;ClojureWerkz projects&lt;/a&gt; are mostly known for our data store clients. Data processing is a
sweet spot for Clojure and that’s what we primarily use it for.&lt;/p&gt;

&lt;p&gt;Over time we’ve developed and released a number of data store clients:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuremongodb.info&quot;&gt;Monger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojureneo4j.info&quot;&gt;Neocons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojureriak.info&quot;&gt;Welle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojureelasticsearch.info&quot;&gt;Elastisch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://titanium.clojurewerkz.org&quot;&gt;Titanium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;and a few others.&lt;/p&gt;

&lt;p&gt;Today we are adding another client to this family, &lt;a href=&quot;http://clojurecassandra.info&quot;&gt;Cassaforte&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Cassaforte Story&lt;/h2&gt;

&lt;p&gt;Cassaforte was started about 11 months ago as an experiment. Back then we needed a
database well suited for time series data, and Cassandra is a good choice. However,
dealing with existing clients, namely Hector and Astyanax, was quite a bit of a pain.&lt;/p&gt;

&lt;p&gt;In the end, using Cassandra’s low level Thrift client worked well and we have
been improving the codebase bit by bit, while working on an event collection and
analytics system.&lt;/p&gt;

&lt;p&gt;A few months ago, DataStax released a &lt;a href=&quot;https://github.com/datastax/java-driver&quot;&gt;new Java driver for Cassandra&lt;/a&gt; that was
&lt;em&gt;a lot&lt;/em&gt; better suited to what Cassaforte needed to power it than any other alternative.&lt;/p&gt;

&lt;p&gt;We were able to switch Cassaforte to it in a couple of weeks. About the same time,
a great fellow &lt;a href=&quot;https://twitter.com/mpenet&quot;&gt;Max Penet&lt;/a&gt; released a Clojure DSL for generating CQL, &lt;a href=&quot;https://github.com/mpenet/hayt&quot;&gt;Hayt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hayt makes working with CQL as nice as the new &lt;code&gt;clojure.java.jdbc&lt;/code&gt; DSL:&lt;/p&gt;

&lt;figure class=&quot;code&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;clojure&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojurewerkz.cassaforte.cql&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;cql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/prepared&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/insert&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;users&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Alex&quot;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:city&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Munich&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}))&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/prepared&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;   &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/insert&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;users&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Robert&quot;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:city&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Berlin&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}))&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/select&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;users&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Alex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; [{:name &quot;Alex&quot;, :city &quot;Munich&quot;}]&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/select&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;users&quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Alex&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Robert&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]))&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; [{:name &quot;Alex&quot;, :city &quot;Munich&quot;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;       &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Robert&quot;&lt;/span&gt;, &lt;span class=&quot;ss&quot;&gt;:city&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Berlin&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class=&quot;code&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;clojure&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojurewerkz.cassaforte.cql&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;cql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c1&quot;&gt;;; For clarity, we select :post_id column only&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/select&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;user_posts&quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:username&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Alex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;order-by&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:desc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; [{:post_id &quot;post3&quot;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;       &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;post2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;       &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;post1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class=&quot;code&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;clojure&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojurewerkz.cassaforte.cql&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;cql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cql/select&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;user_posts&quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:username&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Alex&quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                   &lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;post1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;                   &lt;span class=&quot;ss&quot;&gt;:post_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;lt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;post3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; [{:post_id &quot;post2&quot;}]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Integrating Hayt took a few weeks as well. From there, it took some time to
write initial &lt;a href=&quot;http://clojurecassandra.info&quot;&gt;documentation&lt;/a&gt; and add some polish.&lt;/p&gt;

&lt;p&gt;Major props to the DataStax team for releasing such a nice and focused Java driver
and Max for making querying Cassandra from Clojure such a good experience.&lt;/p&gt;

&lt;h2&gt;What’s In The Box&lt;/h2&gt;

&lt;p&gt;Cassaforte is young but already offers all the key features you’d expect from
such a client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema (keyspaces, tables/column families, indices) manipulation&lt;/li&gt;
&lt;li&gt;&lt;em&gt;All&lt;/em&gt; CQL operations&lt;/li&gt;
&lt;li&gt;Inserts that work with Clojure data structures&lt;/li&gt;
&lt;li&gt;CQL 3.0 queries, including queries with placeholders (?, a la JDBC)&lt;/li&gt;
&lt;li&gt;Prepared statements&lt;/li&gt;
&lt;li&gt;Counters&lt;/li&gt;
&lt;li&gt;Multi-node (cluster) connections&lt;/li&gt;
&lt;li&gt;Automatic deserialization of column names and values according to the schema&lt;/li&gt;
&lt;li&gt;Lazy sequence-based queries over large result sets&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt; Needless to say, as more features are added to Cassandra and the DataStax core Java driver,
 Cassaforte will soon to follow their lead.&lt;/p&gt;

&lt;h2&gt;Documentation&lt;/h2&gt;

&lt;p&gt;Cassaforte documentation is far from finished but it follows the “if it is not documented,
it is not part of ClojureWerkz” rule. To get started, take a look at the &lt;a href=&quot;http://clojurecassandra.info/articles/getting_started.html&quot;&gt;Getting Started guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rest of the &lt;a href=&quot;http://clojurecassandra.info&quot;&gt;guides&lt;/a&gt; are being worked on.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://reference.clojurecassandra.info&quot;&gt;API reference&lt;/a&gt; is also available.&lt;/p&gt;

&lt;h2&gt;Thank You, Contributors&lt;/h2&gt;

&lt;p&gt;Cassaforte was started by &lt;a href=&quot;http://twitter.com/michaelklishin&quot;&gt;Michael&lt;/a&gt; but ended up being a brain child of &lt;a href=&quot;http://twitter.com/ifesdjeen&quot;&gt;Alex&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We would like to thank Max Penet for providing a lot useful feedback, sharing Hayt with
us and helping us define what we want Cassaforte to be and feel like.&lt;/p&gt;

&lt;h2&gt;News and Updates&lt;/h2&gt;

&lt;p&gt;New releases and updates are announced &lt;a href=&quot;http://twitter.com/clojurewerkz&quot;&gt;on
Twitter&lt;/a&gt;. Cassaforte also has &lt;a href=&quot;https://groups.google.com/group/clojure-cassandra&quot;&gt;a
mailing list&lt;/a&gt;, feel
free to ask questions and report issues there.&lt;/p&gt;

&lt;h2&gt;Cassaforte is a ClojureWerkz Project&lt;/h2&gt;

&lt;p&gt;Cassaforte is part of the &lt;a href=&quot;http://clojurewerkz.org&quot;&gt;group of libraries known as ClojureWerkz&lt;/a&gt;, together with&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://clojurerabbitmq.info&quot;&gt;Langohr&lt;/a&gt;, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuremongodb.info&quot;&gt;Monger&lt;/a&gt;, a Clojure MongoDB client for a more civilized age&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojureelasticsearch.info&quot;&gt;Elastisch&lt;/a&gt;, a minimalistic Clojure client for ElasticSearch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojureriak.info&quot;&gt;Welle&lt;/a&gt;, a Riak client with batteries included&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojureneo4j.info&quot;&gt;Neocons&lt;/a&gt;, a Clojure client for the Neo4J REST API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojurequartz.info&quot;&gt;Quartzite&lt;/a&gt;, a powerful scheduling library&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;and several others. If you like Cassaforte, you may also like &lt;a href=&quot;http://clojurewerkz.org&quot;&gt;our other projects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let us know what you think &lt;a href=&quot;http://twitter.com/clojurewerkz&quot;&gt;on Twitter&lt;/a&gt; or on the &lt;a href=&quot;https://groups.google.com/group/clojure&quot;&gt;Clojure mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/michaelklishin&quot;&gt;Michael&lt;/a&gt; on behalf of the &lt;a href=&quot;http://twitter.com/clojurewerkz&quot;&gt;ClojureWerkz Team&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>The ClojureWerkz Team</name>
			<uri>http://blog.clojurewerkz.org/</uri>
		</author>
		<source>
			<title type="html">The ClojureWerkz Blog</title>
			<link rel="self" href="http://blog.clojurewerkz.org/atom.xml"/>
			<id>http://blog.clojurewerkz.org/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Clojure Gazette 1.42</title>
		<link href="http://us4.campaign-archive.com/?u=a33b5228d1b5bf2e0c68a83f4&amp;id=042f7cf182"/>
		<id>http://us4.campaign-archive.com/?u=a33b5228d1b5bf2e0c68a83f4&amp;id=042f7cf182</id>
		<updated>2013-06-16T23:18:26+00:00</updated>
		<content type="html">Clojure Gazette 1.42
        
        
    
    
        &lt;center&gt;
            &lt;table align=&quot;center&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; height=&quot;100%&quot; id=&quot;bodyTable&quot; style=&quot;border-collapse: collapse; margin: 0; padding: 0; background-color: #DEE0E2; height: 100% !important; width: 100% !important;&quot; width=&quot;100%&quot;&gt;
                &lt;tbody&gt;&lt;tr&gt;
                    &lt;td align=&quot;center&quot; id=&quot;bodyCell&quot; style=&quot;border-collapse: collapse; margin: 0; padding: 0; border-top: 0; height: 100% !important; width: 100% !important;&quot; valign=&quot;top&quot;&gt;
                        
                        &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
                            &lt;tbody&gt;&lt;tr&gt;
                                &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                    
                                    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; id=&quot;templatePreheader&quot; style=&quot;border-collapse: collapse; background-color: #F4F4F4; border-top: 0; border-bottom: 0;&quot; width=&quot;100%&quot;&gt;
                                        &lt;tbody&gt;&lt;tr&gt;
                                        	&lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                                &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;templateContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                                                    &lt;tbody&gt;&lt;tr&gt;
                                                        &lt;td class=&quot;preheaderContainer&quot; style=&quot;padding-top: 9px; border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;366&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-left: 18px; padding-bottom: 9px; padding-right: 0; border-collapse: collapse; color: #808080; font-family: Helvetica; font-size: 10px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            Clojure on the rise
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
                &lt;table align=&quot;right&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;197&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 0; border-collapse: collapse; color: #808080; font-family: Helvetica; font-size: 10px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/td&gt;                                            
                                                    &lt;/tr&gt;
                                                &lt;/tbody&gt;&lt;/table&gt;
                                            &lt;/td&gt;                                            
                                        &lt;/tr&gt;
                                    &lt;/tbody&gt;&lt;/table&gt;
                                    
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                    
                                    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; id=&quot;templateHeader&quot; style=&quot;border-collapse: collapse; background-color: #001c63; border-top: 0; border-bottom: 0;&quot; width=&quot;100%&quot;&gt;
                                        &lt;tbody&gt;&lt;tr&gt;
                                            &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                                &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;templateContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                                                    &lt;tbody&gt;&lt;tr&gt;
                                                        &lt;td class=&quot;headerContainer&quot; style=&quot;padding-top: 10px; padding-right: 18px; padding-bottom: 10px; padding-left: 18px; border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;366&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding: 9px 0px 9px 18px; color: #FFFFFF; border-collapse: collapse; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h1 class=&quot;null&quot; style=&quot;text-align: left; display: block; font-family: Helvetica; font-size: 26px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; color: #202020 !important;&quot;&gt;
	&lt;span style=&quot;color: #ffffff;&quot;&gt;Clojure Gazette&lt;/span&gt;&lt;/h1&gt;

                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
                &lt;table align=&quot;right&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;197&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding: 9px 18px 9px 0px; color: #FFFFFF; border-collapse: collapse; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h1 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 26px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #202020 !important;&quot;&gt;
	&lt;span style=&quot;color: #A52A2A;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;Issue 1.42 -- June 16, 2013&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;

                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/td&gt;
                                                    &lt;/tr&gt;
                                                &lt;/tbody&gt;&lt;/table&gt;
                                            &lt;/td&gt;
                                        &lt;/tr&gt;
                                    &lt;/tbody&gt;&lt;/table&gt;
                                    
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                    
                                    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; id=&quot;templateBody&quot; style=&quot;border-collapse: collapse; background-color: #ffffff; border-top: 0; border-bottom: 0;&quot; width=&quot;100%&quot;&gt;
                                        &lt;tbody&gt;&lt;tr&gt;
                                            &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                                &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;templateContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                                                    &lt;tbody&gt;&lt;tr&gt;
                                                        &lt;td class=&quot;bodyContainer&quot; style=&quot;padding-top: 10px; padding-right: 18px; padding-bottom: 10px; padding-left: 18px; border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h1 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 26px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #202020 !important;&quot;&gt;
	Clojure on the rise&lt;/h1&gt;
&lt;hr /&gt;
&lt;h3 class=&quot;null&quot; style=&quot;text-align: right; display: block; font-family: Helvetica; font-size: 16px; font-style: italic; font-weight: normal; line-height: 100%; letter-spacing: normal; margin: 0; color: #606060 !important;&quot;&gt;
	Editorial&lt;/h3&gt;
&lt;div title=&quot;Page 5&quot;&gt;
	&lt;blockquote&gt;
		Clojure manages risk better than any other technology.&lt;/blockquote&gt;
	&lt;div style=&quot;text-align: right;&quot;&gt;
		-- &lt;a href=&quot;https://github.com/strangeloop/clojurewest2012-slides/blob/master/deGrandis-ClojurePoweredStartups.pdf?raw=true&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;Paul deGrandis&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
Clojure is getting exciting. If you weren't already excited, now is the time. There are several great Clojure conferences, a couple of competitions this summer, and Clojure is in the Adopt Group on the &lt;a href=&quot;http://www.infoq.com/presentations/Clojure-Data-Reader&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;ThoughtWorks Technology Radar 2013&lt;/a&gt;. And last year Paul deGrandis compelled us to believe that Clojure has important advantages to other platforms. I believe that all of these are true and we'll see steady and strong growth in the next few years.
&lt;p style=&quot;text-align: right; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%;&quot;&gt;
	Sincerely,&lt;br /&gt;
	Eric Normand &lt;em&gt;&amp;lt;ericwnormand@gmail.com&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p style=&quot;color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot;&gt;
	&lt;br /&gt;
	&lt;strong&gt;P.S.&lt;/strong&gt; Feel free to email me any time. I love hearing from readers.&lt;/p&gt;

                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;hr /&gt;
&lt;h3 class=&quot;null&quot; style=&quot;text-align: right; display: block; font-family: Helvetica; font-size: 16px; font-style: italic; font-weight: normal; line-height: 100%; letter-spacing: normal; margin: 0; color: #606060 !important;&quot;&gt;
	Articles&lt;/h3&gt;

                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://www.booleanknot.com/blog/2013/05/25/clojure-serialization.html&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;Comparing Clojure Serialization Libraries&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
If performance is an issue for you, this article should give you a good idea of what to expect in terms of relative performance of various Clojure serialization libraries.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot;&gt;My Clojure Workflow, Reloaded&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
Through numerous client projects, Stuart Sierra has developed a workflow that allows him to recompile and restart entire servers from the REPL during development.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://sachachua.com/blog/2013/05/how-to-learn-emacs-a-hand-drawn-one-pager-for-beginners/&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; title=&quot;How to Learn Emacs: A Hand-drawn One-pager for Beginners&quot;&gt;How to Learn Emacs: A Hand-drawn One-pager for Beginners&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
A cute and useful introduction to Emacs for real beginners. It covers most of the important concepts that differ from other computing environments.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://undefined.re/tag-article/6&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;Clojurescript over Meteor&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
Meteor is a full-stack web server/client framework written in Javascript. It lets you write real-time web applications from the client down. Since it's written in Javascript, it's the perfect target for ClojureScript. This article tells you how to get set up.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://narkisr.com/2013-05/node-cljs.html&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;Nodifying your Clojure&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
Another article explaining how to set up a Node server running compiled ClojureScript.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;hr /&gt;
&lt;h3 class=&quot;null&quot; style=&quot;text-align: right; display: block; font-family: Helvetica; font-size: 16px; font-style: italic; font-weight: normal; line-height: 100%; letter-spacing: normal; margin: 0; color: #606060 !important;&quot;&gt;
	Libraries&lt;/h3&gt;

                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;https://github.com/ztellman/primitive-math&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;primitive-math&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
A library that redefines the arithmetic operators to use only primitive math (no boxing). In theory, this could give you a seamless way to improve mathematical code.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;https://github.com/wtetzner/exploding-fish&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;Exploding Fish&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
A highly usable URL library. Another example of Clojure making built-in types better.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;hr /&gt;
&lt;h3 class=&quot;null&quot; style=&quot;text-align: right; display: block; font-family: Helvetica; font-size: 16px; font-style: italic; font-weight: normal; line-height: 100%; letter-spacing: normal; margin: 0; color: #606060 !important;&quot;&gt;
	Video&lt;/h3&gt;

                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://www.youtube.com/watch?v=3ka4KY7TMTU&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;Self and Self: Whys and Wherefores&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
David Unger recounts many lessons he learned during his career in computer science research. David Unger developed the Self language, which pioneered the prototype object system. He's a very creative thinker and has quite a few good points of view.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://www.infoq.com/presentations/architecture-core-logic&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;The Architecture of core.logic&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
David Nolen has built a lot of flexibility into core.logic. In this talk, he discusses how the constraints system allows multiple solvers to work at the same time. This is a significant step in the efficient evaluation of logic programs -- it decomplects the strategy for constraining the problem from the declarative specification of the problem.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #505050; font-family: Helvetica; font-size: 14px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;h2 class=&quot;null&quot; style=&quot;display: block; font-family: Helvetica; font-size: 20px; font-style: normal; font-weight: bold; line-height: 100%; letter-spacing: normal; margin: 0; text-align: left; color: #404040 !important;&quot;&gt;
	&lt;a href=&quot;http://www.infoq.com/presentations/Clojure-Data-Reader&quot; style=&quot;color: #EB4102; font-weight: normal; text-decoration: underline;&quot; target=&quot;_self&quot;&gt;The Data-Reader's Guide to the Galaxy&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
Steve Miner discusses reading tagged data literals in Clojure -- new in Clojure 1.5 -- and how they make Edn a significant player in the universal data format space.
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/td&gt;
                                                    &lt;/tr&gt;
                                                &lt;/tbody&gt;&lt;/table&gt;
                                            &lt;/td&gt;
                                        &lt;/tr&gt;
                                    &lt;/tbody&gt;&lt;/table&gt;
                                    
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                    
                                    &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; id=&quot;templateFooter&quot; style=&quot;border-collapse: collapse; background-color: #DEE0E2; border-top: 0; border-bottom: 0;&quot; width=&quot;100%&quot;&gt;
                                        &lt;tbody&gt;&lt;tr&gt;
                                            &lt;td align=&quot;center&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                                                &lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;templateContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;600&quot;&gt;
                                                    &lt;tbody&gt;&lt;tr&gt;
                                                        &lt;td class=&quot;footerContainer&quot; style=&quot;padding-top: 10px; padding-right: 18px; padding-bottom: 10px; padding-left: 18px; border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextBlock&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;100%&quot;&gt;
    &lt;tbody class=&quot;mcnTextBlockOuter&quot;&gt;
        &lt;tr&gt;
            &lt;td class=&quot;mcnTextBlockInner&quot; style=&quot;border-collapse: collapse;&quot; valign=&quot;top&quot;&gt;
                
                &lt;table align=&quot;left&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;mcnTextContentContainer&quot; style=&quot;border-collapse: collapse;&quot; width=&quot;NaN&quot;&gt;
                    &lt;tbody&gt;&lt;tr&gt;
                        
                        &lt;td class=&quot;mcnTextContent&quot; style=&quot;padding-top: 9px; padding-right: 18px; padding-bottom: 9px; padding-left: 18px; border-collapse: collapse; color: #808080; font-family: Helvetica; font-size: 10px; line-height: 150%; text-align: left;&quot; valign=&quot;top&quot;&gt;
                        
                            &lt;em&gt;Copyright © 2013 LispCast, All rights reserved.&lt;/em&gt;
&lt;br /&gt;

    &lt;a class=&quot;utilityLink&quot; href=&quot;http://clojuregazette.us4.list-manage.com/unsubscribe?u=a33b5228d1b5bf2e0c68a83f4&amp;amp;id=4c2b86e9f4&amp;amp;e=[UNIQID]&amp;amp;c=042f7cf182&quot; style=&quot;color: #606060; font-weight: normal; text-decoration: underline;&quot;&gt;unsubscribe from this list&lt;/a&gt;   
    &lt;a class=&quot;utilityLink&quot; href=&quot;http://clojuregazette.us4.list-manage.com/profile?u=a33b5228d1b5bf2e0c68a83f4&amp;amp;id=4c2b86e9f4&amp;amp;e=[UNIQID]&quot; style=&quot;color: #606060; font-weight: normal; text-decoration: underline;&quot;&gt;update subscription preferences&lt;/a&gt; 
    &lt;br /&gt;&lt;br /&gt;
    
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;&lt;/table&gt;
                
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;&lt;/td&gt;
                                                    &lt;/tr&gt;
                                                &lt;/tbody&gt;&lt;/table&gt;
                                            &lt;/td&gt;
                                        &lt;/tr&gt;
                                    &lt;/tbody&gt;&lt;/table&gt;
                                    
                                &lt;/td&gt;
                            &lt;/tr&gt;
                        &lt;/tbody&gt;&lt;/table&gt;
                        
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/tbody&gt;&lt;/table&gt;
        &lt;/center&gt;</content>
		<author>
			<name>Clojure Gazette</name>
			<uri>http://us4.campaign-archive.com/feed?u=a33b5228d1b5bf2e0c68a83f4&amp;id=4c2b86e9f4</uri>
		</author>
		<source>
			<title type="html">Clojure Gazette Archive Feed</title>
			<link rel="self" href="http://us4.campaign-archive2.com/feed?u=a33b5228d1b5bf2e0c68a83f4&amp;id=4c2b86e9f4"/>
			<id>http://us4.campaign-archive.com/feed?u=a33b5228d1b5bf2e0c68a83f4&amp;id=4c2b86e9f4</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">Making Sense Out of Datomic, The Revolutionary Non-NoSQL Database</title>
		<link href="http://theholyjava.wordpress.com/2013/06/16/making-sense-out-of-datomic-the-revolutionary-non-nosql-database/"/>
		<id>http://theholyjava.wordpress.com/?p=3088</id>
		<updated>2013-06-16T21:39:43+00:00</updated>
		<content type="html">I have finally managed to understand one of the most unusual databases of today, Datomic, and would like to share it with you. Thanks to Stuart Halloway and his workshop! Why? Why?!? As we shall see shortly, Datomic is very different from the traditional RDBMS databases as well as the various NoSQL databases. It even […]&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=theholyjava.wordpress.com&amp;amp;blog=13274486&amp;amp;post=3088&amp;amp;subd=theholyjava&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Jakub Holý</name>
			<uri>http://theholyjava.wordpress.com</uri>
		</author>
		<source>
			<title type="html">The Holy Java » clojure</title>
			<subtitle type="html">Building the right thing, building it right, fast</subtitle>
			<link rel="self" href="http://theholyjava.wordpress.com/tag/clojure/feed/"/>
			<id>http://theholyjava.wordpress.com</id>
		</source>
	</entry>

	<entry>
		<title type="html">How We Document Our Projects with ClojureWerkz Docslate</title>
		<link href="http://blog.clojurewerkz.org/blog/2013/06/15/how-we-document-our-projects-with-clojurewerkz-docslate/"/>
		<id>http://blog.clojurewerkz.org/blog/2013/06/15/how-we-document-our-projects-with-clojurewerkz-docslate</id>
		<updated>2013-06-15T11:18:00+00:00</updated>
		<content type="html">&lt;p&gt;This post will explain how our team was able to greatly reduce the
friction in writing documentation guides by standardizing on
a toolchain that other projects can use.&lt;/p&gt;

&lt;h2&gt;A Bit of History&lt;/h2&gt;

&lt;p&gt;Before there was ClojureWerkz, &lt;a href=&quot;http://twitter.com/michaelklishin&quot;&gt;myself&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/ifesdjeen&quot;&gt;Alex&lt;/a&gt; were fairly active in the
open source community. I maintain several RabbitMQ clients and
needed a new documentation site for &lt;a href=&quot;http://rubyamqp.info&quot;&gt;one of them&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So I put together a doc site based on Jekyll and Alex helped me with styles.
This toolchain has evolved a bit and when we were looking at
writing documentation for &lt;a href=&quot;http://clojuremongodb.info&quot;&gt;Monger&lt;/a&gt; and &lt;a href=&quot;http://clojurerabbitmq.info&quot;&gt;Langohr&lt;/a&gt; in late 2011, we decided to just base them on what we already had and knew:
that Jekyll site amqp gem was using.&lt;/p&gt;

&lt;p&gt;ClojureWerkz grew and we kept reusing the same thing over and over again.
By June 2013, ClojureWerkz has accumulated about a dozen of projects that have
substantial documentation guides. Writing, editing and maintaining these docs
took time and in the process, we’ve found ourselves repeating a lot of things
between sites.&lt;/p&gt;

&lt;p&gt;It’s easy to notice a lot of similarities between, say, &lt;a href=&quot;http://clojureelasticsearch.info&quot;&gt;Elastisch docs&lt;/a&gt; and &lt;a href=&quot;http://clojurerabbitmq.info&quot;&gt;Langohr docs&lt;/a&gt;. We also try to take
good ideas from doc sites developed later and feed them back into older
sites.&lt;/p&gt;

&lt;p&gt;So we needed a standard toolchain that all these documentation
projects could use. In particular, we wanted it to give us a very fast
way of writing the first couple of guides before we would worry about
finer details and editing.&lt;/p&gt;

&lt;h2&gt;Enter ClojureWerkz Docslate&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/clojurewerkz/docslate&quot;&gt;Docslate&lt;/a&gt; is a relatively unknown project. We don’t write about it
on this blog. It does not get updates very often. It does, however,
play a major role in ClojureWerkz: powering
our documentation guides and making writing them a more pleasant
and straightforward process.&lt;/p&gt;

&lt;h2&gt;What Is Docslate&lt;/h2&gt;

&lt;p&gt;Docslate is a Jekyll site with predefined structure and integrated Twitter Bootstrap.
Once you have it going, with just a few edits you are ready for the work that
really matters: writing helpful documentation guides.&lt;/p&gt;

&lt;h2&gt;Why You Should Adopt Docslate For Your Project&lt;/h2&gt;

&lt;p&gt;Docslate lets you get to writing quickly without spending too much time on issues such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should I use Jekyll, Awestruct, hack my own thing with Pandoc or use a wiki?&lt;/li&gt;
&lt;li&gt;What library should I use for code highlighting?&lt;/li&gt;
&lt;li&gt;How do I make the docs look decent?&lt;/li&gt;
&lt;li&gt;What licenses should I use for the site and content?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;and so on.&lt;/p&gt;

&lt;p&gt;It’s dead easy to put together a pretty good documentation site with Docslate
and then work on copy and styling once your first version is ready to go live.&lt;/p&gt;

&lt;h2&gt;How To Get Started With Docslate&lt;/h2&gt;

&lt;p&gt;Since Docslate uses Jekyll, you’ll need Ruby (any version, although we typically
use 2.0 or 1.9.3 these days) and &lt;a href=&quot;http://rubygems.org&quot;&gt;RubyGems&lt;/a&gt; installed.&lt;/p&gt;

&lt;p&gt;Then install &lt;a href=&quot;http://gembundler.com/&quot;&gt;Bundler&lt;/a&gt; with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install bundler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Clone Doclsate Git repository with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone git://github.com/clojurewerkz/docslate.git my-project-guides
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Change to your local clone, remove &lt;code&gt;.git&lt;/code&gt; directory and re-init the repo
(Docslate is simply a starting point, your doc site should really be in a new
repo):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd my-project-guides
rm -rf ./.git
git init
git add .
git commit -m &quot;Initial commit: Docslate&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then install dependencies with Bundler:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bundle install --binstubs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and you are ready to run a development server with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./bin/jekyll serve --watch
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then navigate to &lt;a href=&quot;http://localhost:4000&quot;&gt;localhost:4000&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The site you’ll see is very similar in structure and styles to &lt;a href=&quot;http://clojureelasticsearch.info&quot;&gt;Elastisch docs&lt;/a&gt;, &lt;a href=&quot;http://clojuremongodb.info&quot;&gt;Monger docs&lt;/a&gt;,
and so on.&lt;/p&gt;

&lt;h2&gt;How To Add Content&lt;/h2&gt;

&lt;p&gt;Docslate assumes your documentation guides have an index page, a ToC page and one or more guides.
The index page is in HTML and can be found in &lt;code&gt;index.html&lt;/code&gt; in the repository root.&lt;/p&gt;

&lt;p&gt;The ToC page is in Markdown and can be found with individual guides under &lt;code&gt;articles&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Docslate contains 3 pages for you to start with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  guides.md
  getting_started.md
  community.md
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;guides.md&lt;/code&gt; is the ToC page. &lt;code&gt;getting_started.md&lt;/code&gt; contains the Getting Started guide.
Finally, &lt;code&gt;community.md&lt;/code&gt; gives you a page to list information about the project,
its mailing list, IRC channel, Twitter account, and other things you need to
&lt;a href=&quot;http://blog.clojurewerkz.org/blog/2013/04/20/how-to-make-your-open-source-project-really-awesome/&quot;&gt;make your open source project really awesome&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Adding new guides is as straightforward as adding a Markdown file to the &lt;code&gt;articles&lt;/code&gt; directory
with the header (title, etc) Jekyll expects and linking to it from the ToC page.&lt;/p&gt;

&lt;p&gt;For example, to add a guide on extending your library, create a new file at &lt;code&gt;articles/extensions.md&lt;/code&gt;,
add Jekyll header to it, make sure development server is started and navigate to
&lt;a href=&quot;http://localhost:4000/articles/extensions.html&quot;&gt;localhost:4000/articles/extensions.html&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;How To Customize Layout&lt;/h2&gt;

&lt;p&gt;Layout files can be found under &lt;code&gt;_layouts&lt;/code&gt;. There are two layouts available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default layout&lt;/li&gt;
&lt;li&gt;Article layout&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Article layout is used to display individual articles (guides), default layout is used for
everything else.&lt;/p&gt;

&lt;h2&gt;How To Customize Styles and Assets&lt;/h2&gt;

&lt;p&gt;Styleshsets and JavaScript files can be found under &lt;code&gt;assets/stylesheets&lt;/code&gt; and
&lt;code&gt;assets/javascripts&lt;/code&gt;, respectively.&lt;/p&gt;

&lt;h2&gt;How To Generate The Site&lt;/h2&gt;

&lt;p&gt;Use&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./bin/jekyll build
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;to generate the site for deployment. Site root then will be under &lt;code&gt;_site&lt;/code&gt;. This directory
is what you will deploy. It only contains static assets so deployment usually is
as straightforward as &lt;code&gt;rsync&lt;/code&gt;-ing files to your server and serving them with Nginx, Apache
or any other Web server of your choice.&lt;/p&gt;

&lt;h2&gt;Where To Go From Here&lt;/h2&gt;

&lt;p&gt;Docslate is a starting point. It is meant to be customized for your project’s needs,
styling and so on. Feel free to do it, add JavaScript libraries you need, upgrade
and customize Twitter Bootstrap, and so on.&lt;/p&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;Docslate was born out of a dozen documentation sites we have for ClojureWerkz projects.
It’s a battle tested, easy to use toolchain that provides you a good starting point
and is completely open sourced under a reasonable license.&lt;/p&gt;

&lt;p&gt;Now you don’t have an excuse to not document your open source project
well!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://twitter.com/michaelklishin&quot;&gt;Michael&lt;/a&gt; on behalf of the &lt;a href=&quot;http://clojurewerkz.org&quot;&gt;ClojureWerkz&lt;/a&gt; Team.&lt;/p&gt;</content>
		<author>
			<name>The ClojureWerkz Team</name>
			<uri>http://blog.clojurewerkz.org/</uri>
		</author>
		<source>
			<title type="html">The ClojureWerkz Blog</title>
			<link rel="self" href="http://blog.clojurewerkz.org/atom.xml"/>
			<id>http://blog.clojurewerkz.org/</id>
		</source>
	</entry>

	<entry>
		<title type="html">Constructing Algebraic Expressions</title>
		<link href="http://kimavcrp.blogspot.com/2013/06/constructing-algebraic-expressions.html"/>
		<id>tag:blogger.com,1999:blog-3908276794795362019.post-893683374555171056</id>
		<updated>2013-06-14T21:14:11+00:00</updated>
		<content type="html">Constructing Expressions   &lt;div id=&quot;preamble&quot;&gt; &lt;/div&gt; &lt;div id=&quot;content&quot;&gt;&lt;h1 class=&quot;title&quot;&gt;Constructing Expressions &lt;/h1&gt;  &lt;hr /&gt; &lt;p&gt;Gsoc finally starts monday. And for the start I want to have a good idea of how the user interface of expresso should look like, for this I want to discuss the best way of aktually constructing expresso expressions :). &lt;/p&gt; &lt;div id=&quot;table-of-contents&quot;&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;div id=&quot;text-table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://kimavcrp.blogspot.com/feeds/posts/default/-/clojure#sec-1&quot;&gt;1 Representation of expresso expressions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://kimavcrp.blogspot.com/feeds/posts/default/-/clojure#sec-2&quot;&gt;2 How should using expresso feel like&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://kimavcrp.blogspot.com/feeds/posts/default/-/clojure#sec-3&quot;&gt;3 expresso on core.matrix expressions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;outline-2&quot; id=&quot;outline-container-1&quot;&gt;&lt;h2 id=&quot;sec-1&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;1&lt;/span&gt; Representation of expresso expressions&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt; &lt;p&gt;  Because core.logic currently doesn't play nicely with custom types and algebraic   expressions fit nicely with normal clojure s-expressions I plan to represent   algebraic expressions just as that. However, that doesn't mean it is straightforward   to construct them - expresso has to know the full qualified function symbol to   differentiate between - for example - clojure.core/* and the core.matrix * which   behave differently. Also other mathematical properties should be stored about   the functions - I plan to use metadata for it. &lt;/p&gt;&lt;/div&gt; &lt;/div&gt; &lt;div class=&quot;outline-2&quot; id=&quot;outline-container-2&quot;&gt;&lt;h2 id=&quot;sec-2&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;2&lt;/span&gt; How should using expresso feel like&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt; &lt;p&gt;  Hopefully as seamless as possible. &lt;/p&gt;&lt;p&gt;  One approach would be a macro - create-expression. It would construct the enhanced   form of the s-expression from the s-expression it gets.   This, however has some drawbacks. First the user either needs to use ~ to aktually   get the data in the expressions. Or you have to have map as argument which would   map from symbols to values. Further than that, because it is a macro, it can't be   used in higher order functions. &lt;/p&gt;   &lt;pre class=&quot;example&quot;&gt;(let [matrix [[1 0 1]&lt;br /&gt;              [0 1 0]&lt;br /&gt;              [1 0 1]]]&lt;br /&gt;  (simplify (construct-expression (* 5 (determinant ~matrix))))&lt;br /&gt;  ;or &lt;br /&gt;  (simplify (construct-expression (* 5 (determinant x)) {'x matrix})))&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;     The other approach would be to have construction functions in an own namespace,   with concise names, just like core.matrix did with the operators namespace. &lt;/p&gt;  &lt;pre class=&quot;example&quot;&gt;(ns test&lt;br /&gt;  (:use [expresso.construction])&lt;br /&gt;  (:refer-clojure :exclude [* - + == /]))&lt;br /&gt;(let [matrix [[1 0 1]&lt;br /&gt;              [0 1 0]&lt;br /&gt;              [1 0 1]]]&lt;br /&gt; (simplify (* 5 (determinant matrix))))&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;     Mike Anderson also posted some interesting usage examples (with a possible syntax) on the clojure mailing list: &lt;/p&gt;  &lt;pre class=&quot;example&quot;&gt;; 1. Solving simultaneous equations expressed in arrays:&lt;br /&gt;&lt;br /&gt;(solve [x y] (== [x y] (* [[3 0] [0 10]] [y 1])))&lt;br /&gt;=&amp;gt; [30 10]&lt;br /&gt;&lt;br /&gt;;2a. Derivatives of array expressions:&lt;br /&gt;&lt;br /&gt;(derivative [x] (* [x 2] [3 (* x x)]))&lt;br /&gt;=&amp;gt; [3 (* 4 x)]&lt;br /&gt;&lt;br /&gt;;2b. Derivatives that are themselves vectors / arrays:&lt;br /&gt;&lt;br /&gt;(derivative [[x y]] (* [x 2] [3 (* x x)]))&lt;br /&gt;=&amp;gt; [[3 (* 4 x)] 0]&lt;br /&gt;&lt;br /&gt;;3. Simplification of computations on arrays:&lt;br /&gt;&lt;br /&gt;(simplify (trace [[x y] [z (- 5 x)]]))&lt;br /&gt;=&amp;gt; 5&lt;br /&gt;&lt;br /&gt;;4. Simplification of array-level expressions&lt;br /&gt;&lt;br /&gt;(simplify (* 10 A (some-identity-matrix) (inverse A) B))&lt;br /&gt;=&amp;gt; (* 10 B)&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;  What would be your favorite way of using expresso?  &lt;/p&gt;&lt;/div&gt; &lt;/div&gt; &lt;div class=&quot;outline-2&quot; id=&quot;outline-container-3&quot;&gt;&lt;h2 id=&quot;sec-3&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;3&lt;/span&gt; expresso on core.matrix expressions&lt;/h2&gt;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;  &lt;p&gt;  Considering the close relation between expresso and core.matrix it is very   likely that expresso (especially the optimizer) will be used on core.matrix   expressions. Mike's examples also point in this direction.   What about making expresso an implementation of core.matrix ?    It would not calculate the results of matrix operations, but create the expressions   under the hood. That way one could just switch the implementation of core.matrix   to make the matrix expression available to expresso. &lt;/p&gt;&lt;p&gt;  For the core.matrix folks:   Do you think that is possible? There are certainly a few caveats in it but it seems   to be the perfect way of using expresso in a core.matrix context. &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div id=&quot;postamble&quot;&gt;&lt;p class=&quot;date&quot;&gt;Date: 2013-06-14T23:09+0200&lt;/p&gt;&lt;p class=&quot;author&quot;&gt;Author: Maik Schünemann&lt;/p&gt;&lt;p class=&quot;creator&quot;&gt;Org version 7.8.09 with Emacs version 23&lt;/p&gt;&lt;a href=&quot;http://validator.w3.org/check?uri=referer&quot;&gt;Validate XHTML 1.0&lt;/a&gt; &lt;/div&gt;</content>
		<author>
			<name>Maik Schünemann</name>
			<email>noreply@blogger.com</email>
			<uri>http://kimavcrp.blogspot.com/search/label/clojure</uri>
		</author>
		<source>
			<title type="html">Exploring the programming world</title>
			<subtitle type="html">My personal blog</subtitle>
			<link rel="self" href="http://www.blogger.com/feeds/3908276794795362019/posts/default/-/clojure"/>
			<id>tag:blogger.com,1999:blog-3908276794795362019</id>
		</source>
	</entry>

	<entry>
		<title type="html">our-foc.us</title>
		<link href="http://blog.markwatson.com/2013/06/our-foc-us/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=our-foc-us"/>
		<id>http://blog.markwatson.com/?p=1246</id>
		<updated>2013-06-14T15:12:10+00:00</updated>
		<content type="html">&lt;p&gt;Early this year I wrote a simple to-do planning web app in Clojurescript mostly for use on my smartphone. As a learning experiment with client/server side Javascript and Meteor I rewrote it to support real time collaboration: &lt;a href=&quot;http://our-foc.us&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;our-foc.us&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This was an interesting learning experience, and I must say that Meteor if both easy to use and provides impressive functionality “out of the box.”&lt;/p&gt;</content>
		<author>
			<name>Mark Watson</name>
			<uri>http://pipes.yahoo.com/pipes/pipe.info?_id=a0161f6185ca965613735b6b06f2e3ef</uri>
		</author>
		<source>
			<title type="html">Mark Watson</title>
			<subtitle type="html">Pipes Output</subtitle>
			<link rel="self" href="http://pipes.yahoo.com/pipes/pipe.run?_id=a0161f6185ca965613735b6b06f2e3ef&amp;_render=rss"/>
			<id>http://pipes.yahoo.com/pipes/pipe.info?_id=a0161f6185ca965613735b6b06f2e3ef</id>
		</source>
	</entry>

	<entry>
		<title type="html">Memcache Support</title>
		<link href="http://blog.datomic.com/2012/07/memcache.html"/>
		<id>tag:blogger.com,1999:blog-4845864749156394488.post-5022756754142013225</id>
		<updated>2013-06-14T14:14:02+00:00</updated>
		<content type="html">&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;We're happy to announce today transparent integrated support for memcached in Datomic Pro Edition.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;One of the nice things about the Datomic architecture is that the index segments kept in storage are immutable. That enables them to be cached extensively. Currently that caching happens inside the peers, which keep segments they have needed thus far in the application process heap.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;While this is great for process-local working sets, there is only so much a single machine can cache. So, we've added support for an optional second tier of distributed, shared cache, leveraging a memcached cluster. This tier of cache can be as large as you wish, and is shared between all the peers.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;The entire use of memcached is automatic and integrated - just provide the endpoints of your memcached cluster in configuration. &lt;/span&gt;The peer protocols will automatically both look in it, and populate it on cache misses. Being based upon immutability, there are no cache coherence problems nor expiration policy woes.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The architecture incorporating memcached looks like this:&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-S0bY0WEgS6o/Ubsk5Ox1jcI/AAAAAAAAABM/nlLuC97jvB4/s1600/architecture-with-memcached.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;628&quot; src=&quot;http://4.bp.blogspot.com/-S0bY0WEgS6o/Ubsk5Ox1jcI/AAAAAAAAABM/nlLuC97jvB4/s1600/architecture-with-memcached.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The benefits of this are many:&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;You can get a shared cache of arbitrary size - many deployments will be able to fit their entire database in memcached if desired. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;If you are using a storage that is not otherwise distributed (e.g. unclustered PostgreSQL), the memcached tier can both almost entirely remove the read load on the single server and distribute it.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Even when using a distributed storage like DynamoDB, the memcached tier can reduce your read provisioning and increase speed.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Developers can set up a small memcached daemon locally so their DB will always feel 'hot' across process restarts.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;The memcached tier will enable hybrid strategies where the peers, transactors and memcached are all local but the storage is remote (e.g. DynamoDB).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;Datomic is a good citizen in its use of memcached - it doesn't need to 'own' the cluster, and all of the Datomic keys incorporate UUIDs so they won't conflict with other application-level use of the same memcached cluster.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;We hope you enjoy this feature, which is included in the Pro Edition at no extra charge.&lt;/span&gt;</content>
		<author>
			<name>Rich Hickey</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.datomic.com/</uri>
		</author>
		<source>
			<title type="html">Datomic</title>
			<subtitle type="html">the blog</subtitle>
			<link rel="self" href="http://www.blogger.com/feeds/4845864749156394488/posts/default"/>
			<id>tag:blogger.com,1999:blog-4845864749156394488</id>
		</source>
	</entry>

	<entry>
		<title type="html">The Database as a Value</title>
		<link href="http://www.infoq.com/news/2013/06/database-value"/>
		<id>http://www.infoq.com/news/2013/06/database-value</id>
		<updated>2013-06-14T13:00:00+00:00</updated>
		<content type="html">During QCon New York 2013, Rich Hickey gave a talk on functional databases. Hickey is well known for creating the Clojure programming language and is currently developing Datomic, which is a functional database. During his talk, Hickey argued that the useful properties of functional languages: data as values and pure functions, are just as useful in the context of databases. &lt;i&gt;By Zef Hemel&lt;/i&gt;</content>
		<author>
			<name>Clojure at InfoQ</name>
			<uri>http://pipes.yahoo.com/pipes/pipe.info?_id=be83c0b5b0d92b259682cb8021e14d2a</uri>
		</author>
		<source>
			<title type="html">InfoQ Clojure-related materials</title>
			<subtitle type="html">Pipes Output</subtitle>
			<link rel="self" href="http://pipes.yahoo.com/pipes/pipe.run?_id=be83c0b5b0d92b259682cb8021e14d2a&amp;_render=rss"/>
			<id>http://pipes.yahoo.com/pipes/pipe.info?_id=be83c0b5b0d92b259682cb8021e14d2a</id>
		</source>
	</entry>

	<entry>
		<title type="html">Presentation: Engines of Abstraction</title>
		<link href="http://www.infoq.com/presentations/clojure-abstraction"/>
		<id>http://www.infoq.com/presentations/clojure-abstraction</id>
		<updated>2013-06-14T02:00:00+00:00</updated>
		<content type="html">Jim Duey surveys several abstraction techniques that can help in writing reusable code in Clojure. &lt;i&gt;By Jim Duey&lt;/i&gt;</content>
		<author>
			<name>Clojure at InfoQ</name>
			<uri>http://pipes.yahoo.com/pipes/pipe.info?_id=be83c0b5b0d92b259682cb8021e14d2a</uri>
		</author>
		<source>
			<title type="html">InfoQ Clojure-related materials</title>
			<subtitle type="html">Pipes Output</subtitle>
			<link rel="self" href="http://pipes.yahoo.com/pipes/pipe.run?_id=be83c0b5b0d92b259682cb8021e14d2a&amp;_render=rss"/>
			<id>http://pipes.yahoo.com/pipes/pipe.info?_id=be83c0b5b0d92b259682cb8021e14d2a</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">June 2013 London Clojure Dojo at ThoughtWorks</title>
		<link href="http://london-clojure-dojo-tw-2013-06-tw-rss.eventbrite.com"/>
		<id>http://london-clojure-dojo-tw-2013-06-tw-rss.eventbrite.com</id>
		<updated>2013-06-13T23:34:25+00:00</updated>
		<content type="html" xml:lang="en-US">&lt;b&gt;When:&lt;/b&gt;&lt;br /&gt;
        Tuesday, June 25, 2013 from 7:00 PM to 9:30 PM (BST)&lt;br /&gt;&lt;br /&gt;
          &lt;b&gt;Where:&lt;/b&gt;&lt;br /&gt;
          &lt;b&gt;ThoughtWorks London Office&lt;/b&gt;&lt;br /&gt;173 High Holborn&lt;br /&gt;WC1V London&lt;br /&gt;United Kingdom&lt;br /&gt;
          &lt;br /&gt;&lt;b&gt;Hosted By:&lt;/b&gt;&lt;br /&gt;
          London Clojurians&lt;br /&gt;
          &lt;br /&gt;
        &lt;b&gt;Register for this event now at :&lt;/b&gt;&lt;br /&gt;
        &lt;a href=&quot;http://london-clojure-dojo-tw-2013-06-tw-rss.eventbrite.com&quot;&gt;http://london-clojure-dojo-tw-2013-06-tw-rss.eventbrite.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
          &lt;b&gt;Event Details:&lt;/b&gt;&lt;br /&gt;
          &lt;h1 style=&quot;font-size: 13px; padding: 0px; color: #333333; font-family: verdana, sans-serif; font-weight: normal; line-height: 19px;&quot;&gt;&lt;strong&gt;London Clojure Dojo at ThoughtWorks&lt;/strong&gt;&lt;/h1&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt;The goal of the session is to help people learn to start working with Clojure through practical exercises, but we hope that more experienced developers will also come along to help form a bit of a London Clojure community. The dojo is a great place for &lt;a href=&quot;http://otfrom.wordpress.com/2010/10/26/faq-how-much-do-i-need-to-know-before-i-come-to-the-dojo/&quot; style=&quot;color: #0066cc;&quot;&gt;new and experienced&lt;/a&gt; clojure coders to learn more. If you want to know how to run your own dojo or get an idea of what dojos are like you can read more &lt;a href=&quot;http://otfrom.wordpress.com/2012/07/04/how-to-run-a-london-clojure-dojo-in-20ish-easy-steps/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt;We hope to break up into groups for the dojo. So if you have a laptop with a working clojure environment please bring it along.&lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt;We’ll be discussing the meetup on the &lt;a href=&quot;http://groups.google.com/group/london-clojurians/&quot; style=&quot;color: #0066cc;&quot;&gt;london-clojurians mailing list&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt;Clojure is a &lt;span&gt;JVM&lt;/span&gt; language that has syntactically similarities to Lisp, full integration with Java and its libraries and focuses on providing a solution to the issue of single machine concurrency.&lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;padding: 0px; color: #333333; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt;Its small core makes it surprisingly easy for Java developers to pick up and it provides a powerful set of concurrency strategies and data structures designed to make immutable data easy to work with. If you went to Rich Hickey’s &lt;span&gt;LJC&lt;/span&gt; talk about creating Clojure you’ll already know this, if not it’s well worth watching the &lt;a href=&quot;http://skillsmatter.com/podcast/java-jee/clojure-for-java-programmers&quot; style=&quot;color: #0066cc;&quot;&gt;Rich Hickey “Clojure for Java Programmers” video&lt;/a&gt; or &lt;a href=&quot;http://skillsmatter.com/podcast/java-jee/radical-simplicity&quot; style=&quot;color: #0066cc;&quot;&gt;Stuart Halloway “Radical Simplicity” video&lt;/a&gt; .&lt;/p&gt;
        &lt;br /&gt;</content>
		<author>
			<name>London Clojurian Events</name>
			<uri>http://www.eventbrite.com/org/2086345901</uri>
		</author>
		<source>
			<title type="html">Events organized by London Clojurians</title>
			<link rel="self" href="http://www.eventbrite.com/rss/organizer_list_events/2086345901"/>
			<id>http://www.eventbrite.com/org/2086345901</id>
			<rights type="html">Copyright (c) 2010 Eventbrite, Inc.  All rights reserved.  Use subject to terms of use: http://www.eventbrite.com/tos</rights>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">Transitioning To Sequences</title>
		<link href="http://drknucklehead.wordpress.com/2013/06/13/transitioning-to-sequences/"/>
		<id>http://drknucklehead.wordpress.com/?p=976</id>
		<updated>2013-06-13T20:17:34+00:00</updated>
		<content type="html" xml:lang="en">&lt;p&gt;Problem &lt;a href=&quot;http://www.4clojure.com/problem/157&quot; target=&quot;_blank&quot; title=&quot;4Clojure Problem 157&quot;&gt;#157&lt;/a&gt; in 4Clojure.com is listed as a very simple problem. Despite having used Clojure’s map function a lot, I saw the solution to this problem recursively using loop and recur, by walking through each element of the function and determining its count. The following solution came from &lt;a href=&quot;http://blog.qinjian.me/2012/12/21/4clojure_solutions/&quot; target=&quot;_blank&quot; title=&quot;Clojure Solutions&quot;&gt;http://blog.qinjian.me/2012/12/21/4clojure_solutions/&lt;/a&gt; . Look for #157 in the midst of quite a few solutions.&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; title: ; notranslate&quot;&gt;(fn __[coll]
  (loop [x (- (count coll) 1)
      l []]
  (if (&amp;gt;= x 0)
    (recur (- x 1)
        (conj l (list (nth coll x) x)))
    (reverse l))))
&lt;/pre&gt;
&lt;p&gt;This solution makes more sense to me than this solution.&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; title: ; notranslate&quot;&gt;#(map list % (range))

&lt;/pre&gt;
&lt;p&gt;It just doesn’t look as obvious. But the prevailing wisdom is to use Clojure’s sequence functions to handle problems like this.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/drknucklehead.wordpress.com/976/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/drknucklehead.wordpress.com/976/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=drknucklehead.wordpress.com&amp;amp;blog=16221239&amp;amp;post=976&amp;amp;subd=drknucklehead&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Octopusgrabbus</name>
			<uri>http://drknucklehead.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Dr. Knucklehead's Blog » Clojure</title>
			<subtitle type="html">Discussions on Programming, Databases, and Information Technology In General</subtitle>
			<link rel="self" href="http://drknucklehead.wordpress.com/category/clojure/feed/"/>
			<id>http://drknucklehead.wordpress.com</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">Incanter 1.5.1: Bugfix release</title>
		<link href="http://data-sorcery.org/2013/06/13/incanter-1-5-1-bugfix-release/"/>
		<id>http://data-sorcery.org/?p=1838</id>
		<updated>2013-06-13T18:46:06+00:00</updated>
		<content type="html" xml:lang="en">&lt;p&gt;The &lt;a href=&quot;https://github.com/liebke/incanter/blob/master/Changes.md&quot;&gt;bugfix release&lt;/a&gt; of Incater was just pushed to Clojars.&lt;/p&gt;
&lt;p&gt;It fixes 2 bugs – one nasty bug when functions called from transform-with were working on underlying data, modifying them, and 2nd – when 2-argument version solve thrown an error.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/incanter.wordpress.com/1838/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/incanter.wordpress.com/1838/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=data-sorcery.org&amp;amp;blog=7974443&amp;amp;post=1838&amp;amp;subd=incanter&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>alexott</name>
			<uri>http://data-sorcery.org</uri>
		</author>
		<source>
			<title type="html">Data Sorcery with Clojure</title>
			<link rel="self" href="http://data-sorcery.org/feed/"/>
			<id>http://data-sorcery.org</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en">Clojure Cookbook</title>
		<link href="http://tm.durusau.net/?p=42818"/>
		<id>http://tm.durusau.net/?p=42818</id>
		<updated>2013-06-13T14:39:38+00:00</updated>
		<content type="html" xml:lang="en">&lt;p&gt;&lt;a href=&quot;http://clojure-cookbook.com/&quot;&gt;Clojure Cookbook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From the webpage:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Clojure Cookbook is coming&lt;/p&gt;
&lt;p&gt;And we need your help.&lt;/p&gt;
&lt;p&gt;We want this &lt;a href=&quot;http://shop.oreilly.com/category/series/cookbooks.do&quot;&gt;O’Reilly cookbook&lt;/a&gt; to be a comprehensive resource containing the collective wisdom of Clojurists from every domain. That’s why we want to write it &lt;strong&gt;together&lt;/strong&gt;, as a community.&lt;/p&gt;
&lt;p&gt;Share some code. Explain it. Be a part of Clojure history.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Clojure Cookbook&quot; src=&quot;http://clojure-cookbook.com/img/clojure_cookbook_comp.png&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cool!&lt;/p&gt;
&lt;p&gt;GitHub &lt;a href=&quot;https://github.com/clojure-cookbook/clojure-cookbook&quot;&gt;clojure-cookbook&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Patrick Durusau</name>
			<uri>http://tm.durusau.net</uri>
		</author>
		<source>
			<title type="html">Another Word For It » Clojure</title>
			<subtitle type="html">Patrick Durusau on Topic Maps and Semantic Diversity</subtitle>
			<link rel="self" href="http://tm.durusau.net/?cat=261&amp;feed=rss2"/>
			<id>http://tm.durusau.net</id>
		</source>
	</entry>

	<entry>
		<title type="html">Clojure.core: Batteries (almost) included</title>
		<link href="http://adambard.com/blog/clojure-batteries-included/"/>
		<id>http://pipes.yahoo.com/blog/clojure-batteries-included/</id>
		<updated>2013-06-13T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Today, I want to provide a guided tour through some of the &lt;a href=&quot;https://github.com/clojure/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;many libraries&lt;/a&gt;
available from the Clojure team that don't come distributed with Clojure. Consider
them Clojures standard library. Some came from old &lt;code&gt;clojure.contrib&lt;/code&gt; libs, others
are brand-new, but all are great.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Foreword&lt;/h2&gt;

&lt;p&gt;I spend a lot of time thinking about how to make Clojure more popular. After all,
if there's more code written in Clojure, there's more need for Clojure developers,
which means more opportunities to use my favorite language of late in production.
One potential barrier to adoption – if only a psychological one – is that
Clojure, as a Lisp-derived language, tends to eschew the
batteries-included philosophy of other, more mainstream languages. Java, PHP, Python
and Ruby come to mind as languages I've used that come with extensive standard libraries
by default, and I'm sure C# and Perl and all the other ones I've never really dealt with.&lt;/p&gt;

&lt;p&gt;Clojure's default installation takes a different tack from these. Besides &lt;code&gt;core&lt;/code&gt;, clojure includes
only the following menagerie of utilities and helpers. Some of these are very useful indeed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/clojure.data-api.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.data&lt;/a&gt; - Just one function, &lt;code&gt;diff&lt;/code&gt;, which might come in handy. Used as a namespace later though.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/clojure.edn-api.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.edn&lt;/a&gt; - Read &lt;a href=&quot;https://github.com/edn-format/edn&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;edn-formatted&lt;/a&gt; data.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/clojure.inspector-api.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.inspector&lt;/a&gt; - Graphical inspectors for Clojure data&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.java.io&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.java.io&lt;/a&gt; - Some very-useful clojurifications of java I/O libraries (streams, etc.)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/clojure.java.shell-api.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.java.shell&lt;/a&gt; - Exec commands from your environment&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/doc/clojure/pprint/PrettyPrinting.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.pprint&lt;/a&gt; - Pretty-printing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.set&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.set&lt;/a&gt; - Set operations (union, difference, intersection, and so on).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/clojure/clojure/blob/master/src/clj/clojure/string.clj&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.string&lt;/a&gt; - All the usual string operations (trim, upper/lower case, replace, split, join, etc.) live here&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/clojure/clojure/blob/master/src/clj/clojure/template.clj&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.template&lt;/a&gt; - A small utility for templated macroing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.test&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.test&lt;/a&gt; - Testing utils.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/clojure/clojure/blob/1.5.x/src/clj/clojure/walk.clj&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.walk&lt;/a&gt; - Some utilities for walking tree structures.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.zip/seq-zip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.zip&lt;/a&gt; - Zipping functions. &lt;code&gt;seq-zip&lt;/code&gt;, &lt;code&gt;xml-zip&lt;/code&gt; and &lt;code&gt;vector-zip&lt;/code&gt; seem to be the most useful bits at-a-glance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other libraries included with clojure may be mostly only useful to the &lt;code&gt;clojure.core&lt;/code&gt; team themselves,
or people writing tools for clojure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/clojure.instant-api.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.instant&lt;/a&gt; - Timestamp parsers of no obvious utility&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/clojure/clojure/blob/b9b1a094499b69a94bd47fc94c4f082d80239fa9/src/clj/clojure/java/browse.clj#L46&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.java.browse&lt;/a&gt; - Contains a single function, &lt;code&gt;browse-url&lt;/code&gt;, which accepts a url and opens a browser.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.java.javadoc&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.java.javadoc&lt;/a&gt; - Quick browser access to javadocs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.github.io/clojure/clojure.main-api.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.main&lt;/a&gt; - Functions for actually running Clojure itself&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.reflect&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.reflect&lt;/a&gt; - Some (apparently unstable) utilities for reflection)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.repl&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.repl&lt;/a&gt; - Useful functions for working with the repl.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.stacktrace&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.stacktrace&lt;/a&gt; - Mostly, print stacktraces.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/clojure/clojure/blob/1.5.x/src/clj/clojure/xml.clj&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure.xml&lt;/a&gt; - RH's xml utils. I'd recommend the XML library to be discussed in a bit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, beyond the libraries distributed with clojure, there is a whole world of
libraries maintained by the clojure team, mirroring many of the “batteries” from
other languages. And thanks to Leiningen, these almost-first-class-members of the
clojure experience are just an entry in &lt;code&gt;:dependencies&lt;/code&gt; away.&lt;/p&gt;

&lt;p&gt;First on our tour, we'll check out 3 libraries available in the &lt;code&gt;clojure.data&lt;/code&gt; namespace.
Most projects won't need all of these, but a good number will probably have occasion to use
at least one.&lt;/p&gt;

&lt;h2&gt;data.csv&lt;/h2&gt;

&lt;p&gt;If a library doesn't come with an easy way to deal with csv files, it probably
doesn't care about you and your petty problems. But Clojure loves you, baby,
and &lt;code&gt;clojure.data.csv&lt;/code&gt; is how you know it. (Actually, it's Jonas Enlund who loves you, and who wrote this lib)&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojure.data.csv&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
         &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojure.java.io&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;with-open &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;in-file&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;io/reader&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;in-file.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;doall&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;csv/read-csv&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;in-file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;with-open &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;out-file&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;io/writer&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;out-file.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;csv/write-csv&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;out-file&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;abc&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;def&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
                  &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ghi&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;jkl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;data.xml&lt;/h2&gt;

&lt;p&gt;I mentioned above Rich Hickey's effort, &lt;code&gt;clojure.xml&lt;/code&gt;, but here's it's big brother.
&lt;code&gt;clojure.data.xml&lt;/code&gt;, maintained and likely written by &lt;a href=&quot;http://objectcommando.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ryan Senior&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;data.xml&lt;/code&gt;'s parsing utilities return &lt;code&gt;records&lt;/code&gt; of the following description&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;    &lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojure.data.xml.Element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:tag&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:foo&lt;/span&gt;,
                              &lt;span class=&quot;ss&quot;&gt;:attrs&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;,
                              &lt;span class=&quot;ss&quot;&gt;:content&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can deal with these parsed records just like maps, as usual. Here's an
excerpt from some code I recently wrote to extract items from RSS feeds:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defmulti &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;get-items&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defmethod &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;get-items&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:rss&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;doc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;doc&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:content&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;first&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:content&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;filter-tag&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map &lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defmethod &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;get-items&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:feed&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;doc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;doc&lt;/span&gt;
    &lt;span class=&quot;ss&quot;&gt;:content&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;filter-tag&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map &lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defmethod &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;get-items&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:default&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can construct XML documents by creating &lt;code&gt;Elements&lt;/code&gt; yourself (using the
&lt;code&gt;(element [tag attrs content])&lt;/code&gt; record definition), or you can use
a Hiccup-esque syntax with &lt;code&gt;sexp-as-element&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;sexp-as-element&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:foo-attr&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;foo value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:bar&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:bar-attr&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;bar value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:baz&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;The baz value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]]))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Good stuff.&lt;/p&gt;

&lt;h2&gt;data.json&lt;/h2&gt;

&lt;p&gt;Like other JSON libraries for languages with literal hash maps,
Stuart Sierra's &lt;a href=&quot;https://github.com/clojure/data.json&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;clojure.data.json&lt;/code&gt;&lt;/a&gt; 
 is best thought of as a conversion layer between hash maps and
JSON strings, although this library also provides stream-based i/o.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;json/read-str&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;{\&quot;a\&quot;:1,\&quot;b\&quot;:2}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;;=&amp;gt; {&quot;a&quot; 1, &quot;b&quot; 2}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;json/write-str&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:a&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:b&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;;=&amp;gt; &quot;{\&quot;a\&quot;:1,\&quot;b\&quot;:2}&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What more do you need to know? If you need to deal with json in clojure,
you want &lt;code&gt;clojure.data.json&lt;/code&gt;. There's lots more functionality, so be sure
to &lt;a href=&quot;https://github.com/clojure/data.json&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;read the docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;tools.macro&lt;/h2&gt;

&lt;p&gt;Adds a few syntactic sugars to macro definitions in clojure:
&lt;code&gt;macrolets&lt;/code&gt;, which are locally-scoped macros, and “symbol macros”.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;defsymbolmacro&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sym&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+ &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;with-symbol-macros&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+ &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;sym&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;; expands to (+ 1 (+ a b))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Some nice little utils. If your projects don't already have
half-baked implementations of these, you should include &lt;code&gt;clojure.tools.macro&lt;/code&gt; before
you do.&lt;/p&gt;

&lt;h2&gt;tools.logging&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;clojure.tools.logging&lt;/code&gt;, by &lt;a rel=&quot;nofollow&quot;&gt;Alex Taggart&lt;/a&gt;, “wraps”, i.e. implements, all of the big Java logging libraries at once.
Write your code once, and pick your implementation later.&lt;/p&gt;

&lt;p&gt;The logging functions are exactly what you'd expect:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;divide&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;try&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;dividing&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;by&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;/ &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ex&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ex&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;There was an error in calculation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you're not using &lt;a href=&quot;https://github.com/ptaoussanis/timbre&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Timbre&lt;/a&gt;, you should
be using &lt;a href=&quot;https://github.com/clojure/tools.logging&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;clojure.tools.logging&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;core.cache&lt;/h2&gt;

&lt;p&gt;I must admit, when I tried to use &lt;a href=&quot;https://github.com/clojure/core.cache&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;clojure.core.cache&lt;/code&gt;&lt;/a&gt;
(written and maintained by &lt;a href=&quot;http://blog.fogus.me&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Michael Fogus&lt;/a&gt;),
I got a bit confused for a while before I realized that I had to be storing the output
of the cache. Really, I don't mind if the caching library I use is a bit stateful!&lt;/p&gt;

&lt;p&gt;But, I'm still happy about core.cache, because it paves the way for…&lt;/p&gt;

&lt;h2&gt;core.memoize&lt;/h2&gt;

&lt;p&gt;This library (also Fogus) is great. You use it to wrap a function, and it pops an atom
right in the metadata of the function. Your function calls are instantly
memoized.&lt;/p&gt;

&lt;p&gt;You can pick and choose your caching strategy as per core.cache, too:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojure.core.memoize&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:refer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;memo-lu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;memo-lu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Thread/sleep&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;identity &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;; ... waits 5 seconds&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;;=&amp;gt; 42&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;; instantly&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;;=&amp;gt; 42&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/core.memoize&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Go read all about it.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;core.match&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://swannodette.github.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;David Nolen&lt;/a&gt;'s &lt;a rel=&quot;nofollow&quot;&gt;&lt;code&gt;core.match&lt;/code&gt;&lt;/a&gt; is an
&lt;strong&gt;alpha-quality&lt;/strong&gt; attempt to bring pattern-matching
to clojure. I prefer writing code to words, so let me explain it to you
in the language of my people: Fizzbuzz!&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojure.core.match&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:only&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;fizzbuzz&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;  Print each number from 1 to 100, but for multiples of 3 print 'Fizz'&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;  instead, and for multiples of 5 print 'Buzz'. For multiples of both&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;  print 'FizzBuzz'&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;  &quot;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;doseq &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;101&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;FizzBuzz&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Fizz&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Buzz&quot;&lt;/span&gt;
        &lt;span class=&quot;ss&quot;&gt;:else&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This library has a &lt;a href=&quot;https://github.com/clojure/core.match/wiki/Overview&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;nice little writeup&lt;/a&gt; available for
it, so I won't belabour it.&lt;/p&gt;

&lt;p&gt;I personally can't wait for this to get out of alpha, and hopefully get absorbed into &lt;code&gt;clojure.core&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;core.unify&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;core.unify&lt;/code&gt; library, another Michael Fogus joint, is
a library that brings &lt;a href=&quot;https://en.wikipedia.org/wiki/Unification_(computer_science&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;unification&lt;/a&gt;)
to clojure.&lt;/p&gt;

&lt;p&gt;It's not a concept I was particularly familiar with before I started writing this,
but I actually found the best examples in the &lt;a href=&quot;https://github.com/clojure/core.unify/blob/master/src/main/clojure/clojure/core/unify.clj#L250&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;comments section of the
main library file&lt;/a&gt;
from which the following examples are alternately inspired and outright stolen.&lt;/p&gt;

&lt;p&gt;There are three primary functions exposed by &lt;code&gt;core.unify&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(unify [expr1 expr2])&lt;/code&gt; attempts to define what symbols (denoted by ?) it can given an expression.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:first&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'?first&lt;/span&gt;
          &lt;span class=&quot;ss&quot;&gt;:last&lt;/span&gt;  &lt;span class=&quot;ss&quot;&gt;'?last&lt;/span&gt;
          &lt;span class=&quot;ss&quot;&gt;:genre&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:giallo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

         &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:first&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Dario&quot;&lt;/span&gt;
          &lt;span class=&quot;ss&quot;&gt;:last&lt;/span&gt;  &lt;span class=&quot;s&quot;&gt;&quot;Argento&quot;&lt;/span&gt;
          &lt;span class=&quot;ss&quot;&gt;:genre&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:giallo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?first &quot;Dario&quot; ?last &quot;Argento&quot;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here's most of the table from that wikipedia article, translated into core.unify&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'a&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                     &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'a&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                     &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'?x&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'a&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                    &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?x a}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'?x&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                    &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?x y}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?x b}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;             &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;           &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?x ?y}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;           &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;       &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?y (g ?x)}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; {?y (g ?x) ?x a}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'?x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;               &lt;span class=&quot;c1&quot;&gt;;; (throws an exception)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;(subst [expr bindings])&lt;/code&gt; is the inverse of &lt;code&gt;unify&lt;/code&gt;, in a way. Given an expression and
a map of bindings, it returns the expression with the bindings substituted. Symbols
can be nested:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/subst&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; [1 2 [3 4 1 6] 1]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;(unifier [expr1 expr2])&lt;/code&gt; performs a unification and then a substitution, resulting
in the most complete version of the provided expressions that can be formed.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;my-unifier&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;expr1&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;expr2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/subst&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;expr1&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unify&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;expr1&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;expr2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;my-unifier&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; (f (g ?x))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;u/unifier&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;?x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; (f (g ?x))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The primary motivation for writing unifiers seems to be the creation
of type inference systems, but I'm sure there's other cool stuff you
can find to do with your newfound learning.&lt;/p&gt;

&lt;h2&gt;core.logic&lt;/h2&gt;

&lt;p&gt;This library, also written/maintained by David Nolen, &lt;a href=&quot;https://github.com/clojure/core.logic/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;clojure.core.logic&lt;/code&gt;&lt;/a&gt;
is an implementation of both
&lt;a href=&quot;http://pqdtopen.proquest.com/#abstract?dispub=3380156&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;miniKanren&lt;/a&gt;
and &lt;a href=&quot;http://www.schemeworkshop.org/2011/papers/Alvis2011.pdf&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;cKanren&lt;/a&gt; (pdf)
in Clojure. You could think of it like &lt;code&gt;core.unify&lt;/code&gt;, but fuller-featured.&lt;/p&gt;

&lt;p&gt;It lets you write declarative statements, then run them against the logic engine
to get a list of results satisfying the provided conditions.&lt;/p&gt;

&lt;p&gt;Here's a sample from &lt;a href=&quot;https://github.com/clojure/core.logic/wiki/A-Core.logic-Primer&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;the primer&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;run*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;membero&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;membero&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;;; =&amp;gt; (3)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Of course there are better ways to expression set intersection, but there are tons
of applications that &lt;code&gt;clojure.core.logic&lt;/code&gt; can help express more concisely.&lt;/p&gt;

&lt;p&gt;There is pretty &lt;a href=&quot;https://github.com/clojure/core.logic/wiki&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;good documentation&lt;/a&gt;
available on the project's wiki, but I prefer
&lt;a href=&quot;http://objectcommando.com/blog/2011/11/04/the-magical-island-of-kanren-core-logic-intro-part-1/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;The Magical Island of Kanren&lt;/a&gt;
as an intro (even if the syntax is mildly outdated).&lt;/p&gt;

&lt;p&gt;Also, &lt;a href=&quot;http://swannodette.github.io/2013/03/09/logic-programming-is-underrated/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;here's a very recent blog post by the author that I found really helpful&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;core.typed&lt;/h2&gt;

&lt;p&gt;Statically-typed functional programs have a nice habit of &lt;em&gt;just working&lt;/em&gt;, once
you get your types all sorted out. &lt;a href=&quot;https://github.com/clojure/core.typed/wiki&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;clojure.core.typed&lt;/code&gt;&lt;/a&gt;,
written by Ambrose Bonnaire-Sergeant,
lets you do the next best thing in Clojure, by adding type annotations to
your functions.&lt;/p&gt;

&lt;p&gt;Here's how it works. First, write a function:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;ns &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;example.typed&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:require&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;clojure.core.typed&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;t/ann&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;defn &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+ &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, call &lt;code&gt;check-ns&lt;/code&gt; from somewhere within that namespace (I keep mine in a comment at the bottom of the file
and run it with fireplace.vim):&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;t/check-ns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And, since I annotated that wrong, we'll see some errors:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;example.typed&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:7:3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;static&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;method&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;clojure.lang.Numbers/add&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;java.lang.Number&lt;/span&gt;, &lt;span class=&quot;nv&quot;&gt;expected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;java.lang.String.&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clojure.lang.Numbers/add&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;nv&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;example.typed&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Expected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;String&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;Actual&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clojure.lang.Numbers/add&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;nv&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;example.typed&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:6:1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Expected&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Fn&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;Actual&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Fn&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;-&amp;gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fn*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You probably won't annotate everything, but it's nice to have &lt;code&gt;core.typed&lt;/code&gt; around when
you forsee there might be a typing problem, and it's good to have your code checked
anyhow.&lt;/p&gt;

&lt;h2&gt;core.contracts&lt;/h2&gt;

&lt;p&gt;I slacked off and left this out last night, but somebody called me out so now I'm back.&lt;/p&gt;

&lt;p&gt;Fogus's &lt;a href=&quot;https://github.com/clojure/core.contracts&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;clojure.core.contracts&lt;/code&gt;&lt;/a&gt; is for people
who want their functions to be even more uptight than can be had with static typing. It's basically
a replacement for starting your function with a bunch of &lt;code&gt;assert&lt;/code&gt; calls. Here's the example from
the home page:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;'clojure.core.contracts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;secure-doubler&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;with-constraints&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;* &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;contract&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;doubler&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;&quot;ensures doubling&quot;&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;number?&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;* &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;every? &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;number?&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
                   &lt;span class=&quot;nv&quot;&gt;=&amp;gt;&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;* &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;+ &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])))&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;secure-doubler&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;;=&amp;gt; 20&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, you can specify pre- and post- conditions, and even extend the function itself.
Pretty cool.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;That's just a quick tour of some of the interesting libraries I found, but it's far from exhaustive. There
are a ton more, though, so be sure to check out the &lt;a href=&quot;https://github.com/clojure/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clojure github repo&lt;/a&gt;
to see what else exists.&lt;/p&gt;</content>
		<author>
			<name>Adam Bard</name>
			<uri>http://pipes.yahoo.com/pipes/pipe.info?_id=6e116a29211d240fc7cfd9b882e05f1f</uri>
		</author>
		<source>
			<title type="html">Adam Bard</title>
			<subtitle type="html">Pipes Output</subtitle>
			<link rel="self" href="http://pipes.yahoo.com/pipes/pipe.run?_id=6e116a29211d240fc7cfd9b882e05f1f&amp;_render=rss"/>
			<id>http://pipes.yahoo.com/pipes/pipe.info?_id=6e116a29211d240fc7cfd9b882e05f1f</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">lein-immutant Plugin 1.0.0.beta1 Released</title>
		<link href="http://immutant.org/news/2013/05/29/lein-immutant-1-0-0-beta1/"/>
		<id>http://immutant.org/news/2013/05/29/lein-immutant-1-0-0-beta1/</id>
		<updated>2013-06-12T22:45:56+00:00</updated>
		<content type="html" xml:lang="en-US">&lt;p&gt;As we &lt;a href=&quot;http://immutant.org/../announcing-1-0-0-beta1/&quot;&gt;approach a 1.0.0 of Immutant&lt;/a&gt;, we've also been focusing on
      getting our
      &lt;a href=&quot;https://github.com/immutant/lein-immutant/&quot;&gt;Leiningen plugin&lt;/a&gt; ready
      for a 1.0.0 release as well.&lt;/p&gt;
      
      &lt;p&gt;Today, we're as pleased as a
      &lt;a href=&quot;http://en.wikipedia.org/wiki/Punch_buggy&quot;&gt;punch bug player&lt;/a&gt; to
      announce the first 1.0.0 beta release of the plugin: &lt;strong&gt;1.0.0.beta1&lt;/strong&gt;. &lt;/p&gt;
      
      &lt;p&gt;For 1.0.0.beta1, we've made quite a few changes to the plugin, some of
      which are not backwards compatible. We'll talk about all of the
      changes, starting with the breaking ones.&lt;/p&gt;
      
      &lt;h2&gt;The base install dir location and structure&lt;/h2&gt;
      
      &lt;p&gt;When we wrote the initial version of the plugin, we used
      &lt;code&gt;.lein/immutant&lt;/code&gt; as base directory for storing Immutant installs and
      other files. But as the plugin has grown, we've realized that's not
      the best place for storing those files, since they aren't Leiningen
      specific. Therefore, we've moved the base directory to &lt;code&gt;~/.immutant&lt;/code&gt;.&lt;/p&gt;
      
      &lt;p&gt;In addition, we've reorganized the layout of &lt;code&gt;~/.immutant/releases&lt;/code&gt; to
      be a bit cleaner.&lt;/p&gt;
      
      &lt;p&gt;Since the new plugin will be looking in &lt;code&gt;~/.immutant&lt;/code&gt;, it won't see
      the prior installs in &lt;code&gt;~/.lein/immutant&lt;/code&gt;. You'll need to re-install
      the Immutant versions you need, and can safely delete
      &lt;code&gt;~/.lein/immutant&lt;/code&gt;.&lt;/p&gt;
      
      &lt;h2&gt;The plugin now installs the latest release by default&lt;/h2&gt;
      
      &lt;p&gt;Pre-1.0.0.beta1, the plugin installed the latest incremental build
      when you executed &lt;code&gt;lein immutant install&lt;/code&gt;. As we approach 1.0.0 of
      Immutant, we've changed the plugin to install the latest stable
      release instead.&lt;/p&gt;
      
      &lt;p&gt;So, to install the latest stable release:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;lein immutant install
      &lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;If you want to install the latest incremental build:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;lein immutant install LATEST
      &lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;You can still specify any stable release version or incremental build
      number to get an exact version.&lt;/p&gt;
      
      &lt;h2&gt;Listing installed versions&lt;/h2&gt;
      
      &lt;p&gt;A couple of releases ago, we added the &lt;code&gt;lein immutant list&lt;/code&gt; command
      that lists currently deployed applications. In 1.0.0.beta1, this
      command has been extended with a &lt;code&gt;--installs&lt;/code&gt; flag (or &lt;code&gt;-i&lt;/code&gt;) to list
      all of the installed Immutant versions instead of deployments:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;$ lein immutant list --installs
      The following versions of Immutant are installed to /home/tobias/.immutant
      (* is currently active via /home/tobias/.immutant/current):
      
         0.10.0                         (type: full)
         0.10.0                         (type: slim)
         0.6.0                          (type: full)
         0.9.0                          (type: slim)
         0.9.0                          (type: full)
       * 1.0.0.beta1                    (type: slim)
         1.x.incremental.879            (type: slim)
         1.x.incremental.882            (type: slim)
      &lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;You'll also now see this list after every &lt;code&gt;lein immutant install&lt;/code&gt; invocation.&lt;/p&gt;
      
      &lt;h2&gt;Overriding the base directory&lt;/h2&gt;
      
      &lt;p&gt;In addition to moving the base directory to &lt;code&gt;~/.immutant&lt;/code&gt;, we've added
      the option to override its location, either per-project or globally.&lt;/p&gt;
      
      &lt;p&gt;You can override it on a per-project basis by setting &lt;code&gt;:lein-immutant
      {:base-dir &quot;/path&quot;}&lt;/code&gt; in your &lt;code&gt;project.clj&lt;/code&gt;&lt;/p&gt;
      
      &lt;p&gt;You can override it globally two ways:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;by setting &lt;code&gt;:lein-immutant {:base-dir &quot;/path&quot;}&lt;/code&gt; in your user profile
      in &lt;code&gt;.lein/profiles.clj&lt;/code&gt;
      &lt;/li&gt;
      &lt;li&gt;by setting an environment variable: &lt;code&gt;$LEIN_IMMUTANT_BASE_DIR&lt;/code&gt;
      &lt;/li&gt;
      &lt;/ul&gt;&lt;p&gt;Setting the base directory in &lt;code&gt;project.clj&lt;/code&gt; will override the setting
      in &lt;code&gt;.lein/profiles.clj&lt;/code&gt;. Using the environment variable will override
      both.&lt;/p&gt;
      
      &lt;h2&gt;Get it&lt;/h2&gt;
      
      &lt;p&gt;If you're already using &lt;code&gt;lein-immutant&lt;/code&gt; you probably already know how
      to do this, but just in case - to install it, add it to the &lt;code&gt;:plugins&lt;/code&gt;
      list in your &lt;code&gt;:user&lt;/code&gt; profile in &lt;code&gt;~/.lein/profiles.clj&lt;/code&gt;:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;{:user {:plugins [[lein-immutant &quot;1.0.0.beta1&quot;]]}}
      &lt;/code&gt;&lt;/pre&gt;
      
      &lt;h2&gt;Get in touch&lt;/h2&gt;
      
      &lt;p&gt;We realize this release has quite a few changes, and we may not have
      all of the kinks worked out. If you have any questions, issues, or
      other feedback, you can always find us on
      &lt;a href=&quot;http://immutant.org/community/&quot;&gt;#immutant on freenode&lt;/a&gt; or you can file an issue on
      &lt;a href=&quot;https://github.com/immutant/lein-immutant/issues&quot;&gt;lein-immutant&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>The Immutant Team</name>
			<uri>http://immutant.org/</uri>
		</author>
		<source>
			<title type="html">Immutant</title>
			<link rel="self" href="http://immutant.org/news.atom"/>
			<id>http://immutant.org/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Immutant 1.0.0.beta1 Released</title>
		<link href="http://immutant.org/news/2013/05/29/announcing-1-0-0-beta1/"/>
		<id>http://immutant.org/news/2013/05/29/announcing-1-0-0-beta1/</id>
		<updated>2013-06-12T22:45:56+00:00</updated>
		<content type="html" xml:lang="en-US">&lt;p&gt;We are almost as excited to announce our very first beta release of
      Immutant as
      &lt;a href=&quot;http://www.youtube.com/watch?v=6lutNECOZFw#t=7s&quot;&gt;this guy is to see a train&lt;/a&gt;.
      And like that train, we expect our beta cycle to be short; our plan is
      to have 1.0.0 out by the end of the summer, after which we'll begin to
      incorporate new features from JBoss &lt;a href=&quot;http://www.wildfly.org&quot;&gt;Wildfly&lt;/a&gt;
      for the next release. As always, view our road map
      &lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
      
      &lt;h2&gt;What is Immutant?&lt;/h2&gt;
      
      &lt;p&gt;Immutant is an application server for &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt;.
      It's an integrated platform built on
      &lt;a href=&quot;http://www.jboss.org/as7&quot;&gt;JBoss AS7&lt;/a&gt; that aims to reduce the inherent
      &lt;a href=&quot;http://en.wikipedia.org/wiki/Accidental_complexity&quot;&gt;incidental complexity&lt;/a&gt;
      in real world applications.&lt;/p&gt;
      
      &lt;h2&gt;What's in this release?&lt;/h2&gt;
      
      &lt;p&gt;We haven't changed a whole lot since 0.10.0. We wanted to spruce up
      our docs and make sure we didn't have any glaring stability issues. We
      made a couple of minor enhancements to the jobs and caching
      namespaces, but nothing that isn't backwards compatible.&lt;/p&gt;
      
      &lt;p&gt;Cluster configuration should be simpler since we're now taking
      advantage of HornetQ's ability to use JGroups. We added a
      &lt;a href=&quot;http://staging.immutant.org/builds/LATEST/html-docs/production.html&quot;&gt;Production Setup&lt;/a&gt;
      chapter to our manual which we hope to evolve as more Immutants are
      put in production. Speaking of that, check out Damion's excellent
      writeup of his experiences
      &lt;a href=&quot;http://damionjunk.com/2013/05/20/awsimmutantclustering/&quot;&gt;clustering Immutant and TorqueBox on Amazon's EC2&lt;/a&gt;.&lt;/p&gt;
      
      &lt;p&gt;See the complete list of changes below.&lt;/p&gt;
      
      &lt;h2&gt;Get It&lt;/h2&gt;
      
      &lt;p&gt;The simplest way to install or upgrade to 1.0.0.beta1 is via our
      &lt;a href=&quot;https://clojars.org/lein-immutant&quot;&gt;Leiningen plugin&lt;/a&gt; (though we
      recommend you
      &lt;a href=&quot;http://immutant.org/../lein-immutant-1-0-0-beta1/&quot;&gt;update your plugin version&lt;/a&gt; first):&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;$ lein immutant install 1.0.0.beta1
      &lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;See our &lt;a href=&quot;http://immutant.org/install/&quot;&gt;install page&lt;/a&gt; for more details. Once you have it
      installed, take a look at our &lt;a href=&quot;http://immutant.org/tutorials/&quot;&gt;tutorials&lt;/a&gt;.&lt;/p&gt;
      
      &lt;h2&gt;Get In Touch&lt;/h2&gt;
      
      &lt;p&gt;If you have any questions, issues, or other feedback about Immutant,
      you can always find us on &lt;a href=&quot;http://immutant.org/community/&quot;&gt;#immutant on freenode&lt;/a&gt; or
      &lt;a href=&quot;http://immutant.org/community/mailing_lists&quot;&gt;our mailing lists&lt;/a&gt;. &lt;/p&gt;
      
      &lt;h2&gt;Issues resolved in 1.0.0.beta1&lt;/h2&gt;
      
      &lt;ul&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-82&quot;&gt;IMMUTANT-82&lt;/a&gt;] -         Add clustering chapter to docs&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-175&quot;&gt;IMMUTANT-175&lt;/a&gt;] -         implement dynapath's add-classpath-url&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-271&quot;&gt;IMMUTANT-271&lt;/a&gt;] -         Evaluate and possibly eliminate reflection in web.session/session-cookie-attributes&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-274&quot;&gt;IMMUTANT-274&lt;/a&gt;] -         sign clojars artifacts before releasing&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-276&quot;&gt;IMMUTANT-276&lt;/a&gt;] -         publish dists with the type in the dir name (slim/full)&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-277&quot;&gt;IMMUTANT-277&lt;/a&gt;] -         Get immutant.xa working with clojure.java.jdbc 0.3.x&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-278&quot;&gt;IMMUTANT-278&lt;/a&gt;] -         Add a util function to return the effective classpath of an app&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-279&quot;&gt;IMMUTANT-279&lt;/a&gt;] -         Add get-queue function to immutant.messaging&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-281&quot;&gt;IMMUTANT-281&lt;/a&gt;] -         Update to nrepl 0.2.3&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-282&quot;&gt;IMMUTANT-282&lt;/a&gt;] -         Remove util/if-in-immutant&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-283&quot;&gt;IMMUTANT-283&lt;/a&gt;] -         Add convenient keyword aliases and military time assumptions to job/schedule&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-284&quot;&gt;IMMUTANT-284&lt;/a&gt;] -         Configure messaging (HornetQ) to cluster via JGroups&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-286&quot;&gt;IMMUTANT-286&lt;/a&gt;] -         Add a note about how dynamic jobs behave in a cluster&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-287&quot;&gt;IMMUTANT-287&lt;/a&gt;] -         proofread and update the docs&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://issues.jboss.org/browse/IMMUTANT-288&quot;&gt;IMMUTANT-288&lt;/a&gt;] -         Modify cache/create to support :ttl [1 :second] as well as :ttl 1 :units :seconds&lt;/li&gt;
      &lt;/ul&gt;</content>
		<author>
			<name>The Immutant Team</name>
			<uri>http://immutant.org/</uri>
		</author>
		<source>
			<title type="html">Immutant</title>
			<link rel="self" href="http://immutant.org/news.atom"/>
			<id>http://immutant.org/</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Messaging Using Clojure and ZeroMQ</title>
		<link href="http://patternhatch.com/2013/06/12/messaging-using-clojure-and-zeromq/"/>
		<id>http://patternhatch.com/?p=165</id>
		<updated>2013-06-12T21:14:49+00:00</updated>
		<content type="html" xml:lang="en-US">&lt;p&gt;Messaging has multiple uses in system design. It can aid communication between application components, enable asynchronous processing, and form the basis for a distributed architecture.&lt;/p&gt;
&lt;p&gt;My last project involved receiving financial data in multiple formats, transforming it into a single canonical form, analyzing it for patterns, and forwarding findings to a web app. This mapped naturally to a pipeline design.&lt;/p&gt;
&lt;p&gt;By implementing each step as its own subsystem and having them all communicate through a messaging layer, a number of benefits were achieved. New formats were easy to support. Scaling was a matter of adding more processes and machines. Any application which needed transformed data, such as a dashboard, could get it simply by subscribing to the right component.&lt;/p&gt;
&lt;p&gt;This messaging was implemented using &lt;a href=&quot;http://www.zeromq.org/&quot;&gt;ZeroMQ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this post, I’ll give you a quick introduction to ZeroMQ through Clojure and help you get up and running with it. By the end, I hope to show you how simple it can be to add basic messaging capabilities to your own projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tutorial Overview&lt;/strong&gt;&lt;br /&gt;
What we’ll cover&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#zeromq_overview&quot;&gt;ZeroMQ Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#zeromq_vs_tcp&quot;&gt;ZeroMQ Sockets vs TCP Sockets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#zeromq_vs_other&quot;&gt;ZeroMQ vs Other Messaging Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#setup&quot;&gt;Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#contexts&quot;&gt;Contexts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#sockets&quot;&gt;Sockets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#req_rep_pattern&quot;&gt;The Request-Reply Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#pub_sub_pattern&quot;&gt;The Publish-Subscribe Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#pipeline_pattern&quot;&gt;The Pipeline Pattern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What we &lt;em&gt;won’t&lt;/em&gt; cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High-level patterns. These patterns address reliability, persistence, slow joiners, and load-balancing among others. Please see &lt;a href=&quot;http://patternhatch.com/tag/clojure/feed/#further_reading&quot;&gt;further reading&lt;/a&gt; for more information.&lt;/li&gt;
&lt;li&gt;Advanced features: the High Water Mark, message envelopes, etc.&lt;/li&gt;
&lt;li&gt;The different varieties of transport outside of TCP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong id=&quot;zeromq_overview&quot;&gt;ZeroMQ Overview&lt;/strong&gt;&lt;br /&gt;
ZeroMQ is an embeddable networking library. It gives you an enhanced socket which encapsulates and handles much of the complexity that typically comes with connecting programs. Specifically, these sockets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handle I/O asynchronously.&lt;/li&gt;
&lt;li&gt;Queue messages automatically.&lt;/li&gt;
&lt;li&gt;Enable components to come and go dynamically. ZeroMQ handles automatically reconnecting.&lt;/li&gt;
&lt;li&gt;Don’t impose a message format.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of ZeroMQ’s goal is to make building distributed software akin to Lego. In that vein, connecting two application components is simply a matter of instantiating sockets on both ends with a configuration of your choice, and letting ZeroMQ handle the rest. Much like Clojure, creating a ZeroMQ-based topology means starting with basic communication patterns, and then composing them into higher-level systems suited to your goal.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;zeromq_vs_tcp&quot;&gt;ZeroMQ Sockets vs TCP Sockets&lt;/strong&gt;&lt;br /&gt;
ZeroMQ sockets exhibit a few differences from typical TCP sockets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ZeroMQ sockets carry messages rather than a stream of bytes. A ZeroMQ message is length-specified binary data.&lt;/li&gt;
&lt;li&gt;ZeroMQ I/O is automatically handled in a background thread, where output is enqueued and input is dequeued from local queues as your application goes about its business.&lt;/li&gt;
&lt;li&gt;ZeroMQ sockets come in a variety of types, a few of which have 1-N routing built-in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, ZeroMQ messages can go across multiple transports (inproc, ipc, tcp, pgm, epgm), bound endpoints accept connections automatically, and rather than working directly with connections (which are encapsulated under the socket), you work with the socket instead.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;zeromq_vs_other&quot;&gt;ZeroMQ vs Other Messaging Tools&lt;/strong&gt;&lt;br /&gt;
From a user’s perspective, the biggest difference between ZeroMQ and other popular messaging solutions (such as &lt;a href=&quot;http://www.rabbitmq.com/&quot;&gt;RabbitMQ&lt;/a&gt;) is the lack of an external component to provide easy routing, persistence, and load-balancing; features which RabbitMQ’s broker architecture lets you get quite easily.&lt;/p&gt;
&lt;p&gt;In contrast, ZeroMQ is designed for high-throughput/low-latency applications. It works at a lower-level as a socket library and is designed to be embedded in your application. Its brokerless nature is also the origin of ‘Zero’ in the library’s name. Advanced messaging schemes are then built by combining pieces of the framework.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;setup&quot;&gt;Setup&lt;/strong&gt;&lt;br /&gt;
ZeroMQ is written in C++ and offers bindings for a number of languages, including Java through JNI. In the past, I used the Java bindings (&lt;a href=&quot;https://github.com/zeromq/jzmq&quot;&gt;JZMQ&lt;/a&gt;) but there is now a native Java implementation called &lt;a href=&quot;https://github.com/zeromq/jeromq&quot;&gt;JeroMQ&lt;/a&gt;. For simplicity, that’s what we’ll use here today. The examples we’ll cover are simple enough that we’ll use Java interop rather than wrap the calls in Clojure functions.&lt;/p&gt;
&lt;p&gt;Start by creating a new Clojure project called clj-zmq. I use &lt;a href=&quot;http://leiningen.org/&quot;&gt;Leiningen&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false; margin-top:0px&quot;&gt;lein new clj-zmq&lt;/pre&gt;
&lt;p&gt;Next, open project.clj in your project’s root folder and add these to your dependencies:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: false&quot;&gt;[com.rmoquin.bundle/jeromq &quot;0.2.0&quot;]
[cheshire &quot;5.2.0&quot;]&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dakrone/cheshire&quot;&gt;Cheshire&lt;/a&gt; is a JSON encoding library which we’ll use in our examples.&lt;/p&gt;
&lt;p&gt;Set main to clj-zmq.core:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: false&quot;&gt;:main clj-zmq.core&lt;/pre&gt;
&lt;p&gt;This is what my project.clj file looks like:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defproject dist &quot;0.1.0-SNAPSHOT&quot;
  :description &quot;Messaging With Clojure and ZeroMQ&quot;
  :url &quot;http://patternhatch.com&quot;
  :license {:name &quot;Eclipse Public License&quot;
            :url &quot;http://www.eclipse.org/legal/epl-v10.html&quot;}
  :dependencies [[org.clojure/clojure &quot;1.5.1&quot;]
                 [com.rmoquin.bundle/jeromq &quot;0.2.0&quot;]
                 [cheshire &quot;5.2.0&quot;]]
  :main clj-zmq.core)&lt;/pre&gt;
&lt;p&gt;Save the file, switch to your project’s root directory, and run:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false&quot;&gt;lein deps&lt;/pre&gt;
&lt;p&gt;That should set your dependencies.&lt;/p&gt;
&lt;p&gt;Open core.clj and set up the namespace:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(ns clj-zmq.core
  (:import [org.jeromq ZMQ])
  (:require (cheshire [core :as c])))&lt;/pre&gt;
&lt;p&gt;&lt;strong id=&quot;contexts&quot;&gt;Contexts&lt;/strong&gt;&lt;br /&gt;
The first thing we need to do is create a context, which is what we’ll use to create our sockets. A context is a container for all our sockets. In general, you should create one context per process. Creating multiple contexts in a single process is akin to creating separate ZeroMQ instances.&lt;/p&gt;
&lt;p&gt;Continuing in core.clj, let’s create a context:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(def ctx (ZMQ/context 1))&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;The argument in the context creation call above is the number of threads to use. The ZeroMQ &lt;a href=&quot;http://www.zeromq.org/area:faq&quot;&gt;FAQ&lt;/a&gt; recommends one thread per gigabyte of data in or out per second. Now that we have our context, we can go over sockets before moving on to our examples.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;sockets&quot;&gt;Sockets&lt;/strong&gt;&lt;br /&gt;
When using ZeroMQ, your application communicates by dealing with the socket, rather than the connection the socket handles. The socket, depending on its type, encapsulates policies for inward and outward routing, queuing, and what other types of sockets it can connect to. These relationships form messaging patterns, which give rise to ZeroMQ’s power and ability to layer additional patterns. The three basic socket pairings are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;REQ/REP [Request-Reply]&lt;/li&gt;
&lt;li&gt;PUB/SUB [Publish-Subscribe]&lt;/li&gt;
&lt;li&gt;PUSH/PULL [Pipeline]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To connect two sockets, you perform a &lt;i&gt;bind&lt;/i&gt; on one and a &lt;i&gt;connect&lt;/i&gt; on the other. In general, the socket with the known network address (such as the server) should bind, and the client(s) with unknown addresses should connect. Let’s see this in action with our first core ZeroMQ pattern.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;req_rep_pattern&quot;&gt;The Request-Reply Pattern&lt;/strong&gt;&lt;br /&gt;
For the request-reply pattern, we’ll create a simple echo server for our client to connect to. Let’s take a look at the code and go over the salient lines:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn echo-server
  []
  (let [s (.socket ctx ZMQ/REP)]
    (.bind s &quot;tcp://127.0.01:5555&quot;)
    (loop [msg (.recv s)]
      (.send s msg)
      (recur (.recv s)))))&lt;/pre&gt;
&lt;p&gt;Here’s what’s happening:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;line-height: 13px;&quot;&gt;On line 3, we use our context to create a REP socket.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;On line 4, we bind our socket describing the transport mechanism (tcp), the IP, and the port number&lt;/li&gt;
&lt;li&gt;On line 5, we wait for input using our socket’s recv command.&lt;/li&gt;
&lt;li&gt;On line 6, upon receiving a message from the client, we send it right back using our socket’s send command&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, pretty straightforward.&lt;/p&gt;
&lt;p&gt;One thing to note: ZeroMQ doesn’t know anything about the data we send except its size in bytes. That means we’re responsible for formatting it safely.&lt;/p&gt;
&lt;p&gt;In our examples, we’ll be sending strings back and forth. &lt;strong&gt;JeroMQ&lt;/strong&gt; has an overloaded &lt;em&gt;send&lt;/em&gt; command which, when called only with a single argument, assumes the data is a string and formats it accordingly for us. For other types of data, we would need to take additional care and perhaps use specialized libraries such as &lt;a href=&quot;https://code.google.com/p/protobuf/&quot;&gt;protocol buffers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let’s move on to our client:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn echo
  [msg]
  (let [s (.socket ctx ZMQ/REQ)]
    (.connect s &quot;tcp://127.0.01:5555&quot;)
    (.send s msg)
    (println &quot;Server replied:&quot; (String. (.recv s)))
    (.close s)))&lt;/pre&gt;
&lt;p&gt;This code looks similar to our server with three differences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;line-height: 13px;&quot;&gt;On line 3, we create a REQ socket.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;On line 4, we use connect rather than bind.&lt;/li&gt;
&lt;li&gt;On line 7, we close our socket once the server replies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s give it a try. Start your REPL (you should be in the clj-zmq.core namespace). In our examples, rather than starting multiple REPLs, we’ll run certain servers in separate threads. Start the echo server with the following command:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(future-call echo-server)&lt;/pre&gt;
&lt;p&gt;And now send a message to it using the client:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(echo &quot;Hello!&quot;)&lt;/pre&gt;
&lt;p&gt;You should get back the following response:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false; margin-top:0px&quot;&gt;Server replied: Hello!&lt;/pre&gt;
&lt;p&gt;This is the request-reply pattern, probably the simplest way to use ZeroMQ. The client issues a send command and then a receive command. Any other action such as sending multiple messages in a row will result in a -1 return code.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;pub_sub_pattern&quot;&gt;The Publish-Subscribe Pattern&lt;/strong&gt;&lt;br /&gt;
The second pattern we’ll look at is used for one-way data distribution. For our example, we’ll create a server which publishes random stock trades and a client which subscribes to it. Here’s the server:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn market-data-publisher
  []
  (let [s (.socket ctx ZMQ/PUB)
        market-data-event (fn []
                            {:symbol (rand-nth [&quot;CAT&quot; &quot;UTX&quot;])
                             :size (rand-int 1000)
                             :price (format &quot;%.2f&quot; (rand 50.0))})]
    (.bind s &quot;tcp://127.0.01:6666&quot;)
    (while :true
      (.send s (c/generate-string (market-data-event))))))&lt;/pre&gt;
&lt;p&gt;By now, the code probably looks familiar to you. Once again, we use the context to create our PUB socket. We then bind it to port 6666 and begin generating market data events. &lt;em&gt;c/generate-string&lt;/em&gt; is a Cheshire command to turn a Clojure map into a JSON string. When no clients are connected, the server silently drops its messages.&lt;/p&gt;
&lt;p&gt;Here’s the client:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn get-market-data
  [num-events]
  (let [s (.socket ctx ZMQ/SUB)]
    (.subscribe s &quot;&quot;)
    (.connect s &quot;tcp://127.0.01:6666&quot;)
    (dotimes [_ num-events]
      (println (c/parse-string (String. (.recv s)))))
    (.close s)))&lt;/pre&gt;
&lt;p&gt;Our client connects to the publisher, processes a certain number of market events, and ends. Notice that in addition to creating the SUB socket and connecting it, we issue a subscribe command on Line 4. In this case, issuing a subscribe command with an empty string means we wish to receive everything from the publisher (your client can specify filters on what to receive). Not issuing this command is a common oversight. If you use this pattern and find yourself not receiving anything, check for this.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;c/parse-string&lt;/em&gt; command on line 7 converts a JSON string into a Clojure map.&lt;/p&gt;
&lt;p&gt;Reload your REPL and give it a try. Start the publisher in a separate thread:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;  (future-call market-data-publisher)&lt;/pre&gt;
&lt;p&gt;Now listen to 100 market data events:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;  (get-market-data 100)&lt;/pre&gt;
&lt;p&gt;You should get output similar to the following:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false; margin-top:0px&quot;&gt;{symbol UTX, size 303, price 18.42}
{symbol CAT, size 492, price 41.02}
{symbol CAT, size 971, price 47.48}
.
.
.&lt;/pre&gt;
&lt;p&gt;Pub-Sub is a one-way, asynchronous line from the server to the client. An error results if either the server tries to receive or the client tries to send.&lt;/p&gt;
&lt;p&gt;One issue this example doesn’t address is slow joiner syndrome. When your client initiates a connection, it takes time to step through the connection routine. This may take milliseconds, but during that time, the publisher may have already sent a few hundred or thousand messages which will be missed by the client. This may not matter if the publisher sends data endlessly and the client doesn’t care what transpired before. But if you want to ensure the client is well and ready before the publisher begins sending, then there’s an advanced pattern in the documentation for &lt;a href=&quot;http://zguide.zeromq.org/php:chapter5&quot;&gt;reliable pub-sub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong id=&quot;pipeline_pattern&quot;&gt;The Pipeline Pattern&lt;/strong&gt;&lt;br /&gt;
Our final example covers the most involved of the three core patterns. The pipeline pattern is suited for task distribution and collection. For our example, we’ll set up a dispatcher which generates tasks and sends them to workers in a round-robin fashion. These workers will be connected upstream to the dispatcher and downstream to a collector. The collector will receive output from each worker as they complete.&lt;/p&gt;
&lt;p&gt;Here’s the code for the dispatcher:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn dispatcher
  [jobs]
  (let [s (.socket ctx ZMQ/PUSH)]
    (.bind s &quot;tcp://127.0.01:7777&quot;)
    (Thread/sleep 1000)
    (dotimes [n jobs]
      (.send s (str n)))
    (.close s)))&lt;/pre&gt;
&lt;p&gt;Similar to the previous examples, we create a PUSH socket and bind it to port 7777. But we add an additional step where we wait for one second before dispatching. Why?&lt;/p&gt;
&lt;p&gt;Originally, I had the dispatcher prompt the user to hit &lt;em&gt;enter&lt;/em&gt; when ready.The reason for this is because we want to ensure all the workers are connected before beginning. This way, the first worker to connect won’t be inundated with an outsized set of tasks. Nevertheless, workers are still free to come and go as they please and the dispatcher will automatically adjust the routing accordingly.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;But because certain versions of &lt;a href=&quot;https://github.com/clojure/tools.nrepl&quot;&gt;nREPL&lt;/a&gt; have a &lt;a href=&quot;http://dev.clojure.org/jira/browse/NREPL-39&quot;&gt;bug&lt;/a&gt; where the &lt;em&gt;read-line&lt;/em&gt; command causes an I/O exception in the REPL, I chose to go with this arbitrary timer instead for this example to avoid confusion. For a production scenario, the ZeroMQ guide covers more sophisticated means to signal when dispatch is ready.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here’s the worker:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn worker
  []
  (let [rcv (.socket ctx ZMQ/PULL)
        snd (.socket ctx ZMQ/PUSH)
        id (str (gensym &quot;w&quot;))]
    (.connect rcv &quot;tcp://127.0.01:7777&quot;)
    (.connect snd &quot;tcp://127.0.01:8888&quot;)
    (while :true
      (let [job-id (String. (.recv rcv))
            proc-time (rand-int 100)]
        (Thread/sleep proc-time)
        (.send snd (c/generate-string {:worker-id id
                                       :job-id job-id
                                       :processing-time proc-time}))))))&lt;/pre&gt;
&lt;p&gt;The worker has two sockets, one pulling from the dispatcher and another pushing to the collector (on a different port). Each worker has a unique ID and simulates performing a task for a random duration. It then forwards information about itself, the job, and how long it took to the collector.&lt;/p&gt;
&lt;p&gt;Here’s the code for the collector:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(defn collector
  []
  (let [s (.socket ctx ZMQ/PULL)]
    (.bind s &quot;tcp://127.0.01:8888&quot;)
    (while :true
      (-&amp;gt;&amp;gt; (.recv s)
           (String.)
           (c/parse-string)
           (println &quot;Job completed:&quot;)))))&lt;/pre&gt;
&lt;p&gt;The collector offers an endpoint where it pulls completed tasks from all the workers in a fair-queuing fashion. Let’s give it a try. Reload your REPL, and start your collector:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(future-call collector)&lt;/pre&gt;
&lt;p&gt;Then start three workers:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(future-call worker)
(future-call worker)
(future-call worker)&lt;/pre&gt;
&lt;p&gt;Finally, dispatch 100 jobs:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(dispatcher 100)&lt;/pre&gt;
&lt;p&gt;You should see output similar to the following:&lt;/p&gt;
&lt;pre class=&quot;brush: bash; gutter: false; margin-top:0px&quot;&gt;Job completed: {worker-id w2706, job-id 69, processing-time 53}
Job completed: {worker-id w2712, job-id 79, processing-time 71}
Job completed: {worker-id w2709, job-id 71, processing-time 96}
.
.
.&lt;/pre&gt;
&lt;p&gt;As you can see, all three workers are processing tasks in parallel and completing them in variable time.&lt;/p&gt;
&lt;p&gt;Here’s a complete listing for core.clj:&lt;/p&gt;
&lt;pre class=&quot;brush: clojure; gutter: true&quot;&gt;(ns clj-zmq.core
  (:import [org.jeromq ZMQ])
  (:require (cheshire [core :as c])))

(def ctx (ZMQ/context 1))

;
; The Request-Reply Pattern
;
; Server
(defn echo-server
  []
  (let [s (.socket ctx ZMQ/REP)]
    (.bind s &quot;tcp://127.0.01:5555&quot;)
    (loop [msg (.recv s)]
      (.send s msg)
      (recur (.recv s)))))

; Client
(defn echo
  [msg]
  (let [s (.socket ctx ZMQ/REQ)]
    (.connect s &quot;tcp://127.0.01:5555&quot;)
    (.send s msg)
    (println &quot;Server replied:&quot; (String. (.recv s)))
    (.close s)))

;
; The Publish-Subscribe Pattern
;
; Server
(defn market-data-publisher
  []
  (let [s (.socket ctx ZMQ/PUB)
        market-data-event (fn []
                            {:symbol (rand-nth [&quot;CAT&quot; &quot;UTX&quot;])
                             :size (rand-int 1000)
                             :price (format &quot;%.2f&quot; (rand 50.0))})]
    (.bind s &quot;tcp://127.0.01:6666&quot;)
    (while :true
      (.send s (c/generate-string (market-data-event))))))

; Client
(defn get-market-data
  [num-events]
  (let [s (.socket ctx ZMQ/SUB)]
    (.subscribe s &quot;&quot;)
    (.connect s &quot;tcp://127.0.01:6666&quot;)
    (dotimes [_ num-events]
      (println (c/parse-string (String. (.recv s)))))
    (.close s)))

;
; The Pipeline Pattern
;
; Dispatcher
(defn dispatcher
  [jobs]
  (let [s (.socket ctx ZMQ/PUSH)]
    (.bind s &quot;tcp://127.0.01:7777&quot;)
    (Thread/sleep 1000)    
    (dotimes [n jobs]
      (.send s (str n)))
    (.close s)))

; Worker
(defn worker
  []
  (let [rcv (.socket ctx ZMQ/PULL)
        snd (.socket ctx ZMQ/PUSH)
        id (str (gensym &quot;w&quot;))]
    (.connect rcv &quot;tcp://127.0.01:7777&quot;)
    (.connect snd &quot;tcp://127.0.01:8888&quot;)
    (while :true
      (let [job-id (String. (.recv rcv))
            proc-time (rand-int 100)]
        (Thread/sleep proc-time)
        (.send snd (c/generate-string {:worker-id id
                                       :job-id job-id
                                       :processing-time proc-time}))))))

; Collector
(defn collector
  []
  (let [s (.socket ctx ZMQ/PULL)]
    (.bind s &quot;tcp://127.0.01:8888&quot;)
    (while :true
      (-&amp;gt;&amp;gt; (.recv s)
           (String.)
           (c/parse-string)
           (println &quot;Job completed:&quot;)))))&lt;/pre&gt;
&lt;p&gt;&lt;strong id=&quot;further_reading&quot;&gt;Further Reading&lt;/strong&gt;&lt;br /&gt;
ZeroMQ removes a lot of complexity from creating high-performance, scalable, distributed architectures, and I hope I’ve shown you a glimmer of it in this tutorial. If you want to learn more about advanced patterns, implementing persistence, and other ways to work with ZeroMQ, the first stop would be the excellent &lt;a href=&quot;http://zguide.zeromq.org/page:all&quot;&gt;ZeroMQ Guide&lt;/a&gt;. Much of it is also reflected in a recent (2013) O’Reilly &lt;a href=&quot;http://www.amazon.com/ZeroMQ-Messaging-Applications-Pieter-Hintjens/dp/1449334067/ref=cm_cr_pr_product_top&quot;&gt;book&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;JeroMQ is a fairly new project, so if you prefer using the C++ version with Java bindings, &lt;a href=&quot;http://augustl.com/blog/2013/using_zeromq_from_clojure/&quot;&gt;this&lt;/a&gt; is a good installation guide.&lt;/p&gt;
&lt;p&gt;The code for this tutorial is available on &lt;a href=&quot;https://github.com/nitinpunjabi/messaging_using_clojure_and_zeromq&quot;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you have any questions, thoughts, suggestions, or corrections, please leave a comment or email me at nitin (at) patternhatch (dot) com.&lt;/p&gt;
&lt;p&gt;I’m always trying to share more, so if you enjoyed this post, then follow me on &lt;a href=&quot;https://twitter.com/n_punjabi&quot;&gt;Twitter&lt;/a&gt;. Thanks for reading.&lt;/p&gt;
&lt;p&gt;Nitin [&lt;a href=&quot;http://patternhatch.com/about/&quot;&gt;About me&lt;/a&gt;]&lt;/p&gt;</content>
		<author>
			<name>Nitin Punjabi</name>
			<uri>http://patternhatch.com</uri>
		</author>
		<source>
			<title type="html">Pattern Hatch » Clojure</title>
			<subtitle type="html">Functional Programming | Product Development | Business</subtitle>
			<link rel="self" href="http://patternhatch.com/tag/clojure/feed/"/>
			<id>http://patternhatch.com</id>
		</source>
	</entry>

	<entry>
		<title type="html">Kurt Zimmer of Room Key - Podcast Episode 033</title>
		<link href="http://feedproxy.google.com/~r/relevance-blog/~3/8sWVpdT4DjY/kurt-zimmer-of-room-key-podcast-episode-033"/>
		<id>http://thinkrelevance.com/blog/2013/06/12/kurt-zimmer-of-room-key-podcast-episode-033</id>
		<updated>2013-06-12T19:37:00+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img alt=&quot;cover art&quot; src=&quot;http://s3.amazonaws.com/thinkrelevance-podcast/033-kurt-zimmer.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-033-kurt-zimmer.mp3&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Download this podcast episode.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've said it before: one of the few downsides to working at Relevance is getting to hear all sorts of cool customer success stories that we can't talk about. Which is why &lt;a href=&quot;http://thinkrelevance.com/team/members/justin-gehtland&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Justin&lt;/a&gt; and I were thrilled to record an &lt;a href=&quot;http://s3.amazonaws.com/thinkrelevance-podcast/ThinkRelevance-033-kurt-zimmer.mp3&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;episode&lt;/a&gt; with &lt;a href=&quot;http://www.roomkey.com/about.html#our-team&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Kurt Zimmer&lt;/a&gt; from &lt;a href=&quot;http://roomkey.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Room Key&lt;/a&gt;, one of our clients and an enthusiastic user of both Clojure and &lt;a href=&quot;http://datomic.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Datomic&lt;/a&gt;. We talked about Relevance's relationship with Room Key, and about Kurt's experience successfully selling cutting-edge technologies into extremely large, conservative organizations.&lt;/p&gt;

&lt;p&gt;Kurt is a sharp guy, and it was a pleasure to have him as a guest.&lt;/p&gt;

&lt;p&gt;While I've got your attention, I'd also like to mention a few things: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure-conj.org&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clojure/conj&lt;/a&gt; registration is open! Head on over to &lt;a href=&quot;http://clojure-conj.org&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;clojure-conj.org&lt;/a&gt; to get ticket information. &lt;/li&gt;
&lt;li&gt;We will be offering 3 days of Clojure-related training just prior to the conference, with one day each of &lt;a href=&quot;https://github.com/clojure/clojurescript&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ClojureScript&lt;/a&gt;, &lt;a href=&quot;http://pedestal.io&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Pedestal&lt;/a&gt;, and &lt;a href=&quot;http://datomic.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Datomic&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We are pleased to announce that the &lt;a href=&quot;http://www.schemeworkshop.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Scheme and Functional Programming Conference&lt;/a&gt; will be co-located with the &lt;a href=&quot;http://clojure-conj.org&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Conj&lt;/a&gt; this year on Wednesday, November 13.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lambdajam.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Lambda Jam Chicago&lt;/a&gt; is happening July 8-10, 2013. &lt;a rel=&quot;nofollow&quot;&gt;Stuart Sierra&lt;/a&gt; will be there speaking about &lt;a href=&quot;http://lambdajam.com/sessions/#sierra&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Data, Visibility &amp;amp; Abstraction&lt;/a&gt;. The conference is being put on by our good friend &lt;a href=&quot;http://tech.puredanger.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Alex Miller&lt;/a&gt;, who has been kind enough to give us the offer code RELPOD, good for a $50 discount off your ticket. Go to &lt;a href=&quot;http://regonline.com/lambdajam2013&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://regonline.com/lambdajam2013&lt;/a&gt; to redeem it! &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The show is &lt;a href=&quot;http://itunes.apple.com/us/podcast/thinkrelevance-the-podcast/id498067022&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;available on iTunes&lt;/a&gt;! You can also subscribe to the podcast using our &lt;a href=&quot;http://feeds.feedburner.com/thinkrelevance/podcast&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;podcast feed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can send feedback about the show to &lt;a href=&quot;mailto:podcast@thinkrelevance.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;podcast@thinkrelevance.com&lt;/a&gt;, or leave a comment here on the blog. Thanks for listening!&lt;/p&gt;

&lt;h1&gt;Our Guests, Kurt Zimmer and Justin Gehtland&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Kurt Zimmer

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.roomkey.com/about.html#our-team&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;on the Room Key website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.linkedin.com/in/jkzimmer&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;on LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Justin Gehtland

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jgehtland&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;on Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/jgehtland&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;on Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Music&lt;/h1&gt;

&lt;p&gt;Kurt chose &lt;a href=&quot;http://www.youtube.com/watch?v=4QY08MoM97k&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&quot;Reboot the Mission&quot; by The Wallflowers&lt;/a&gt; as the intro, and Justin chose &lt;a href=&quot;http://www.youtube.com/watch?v=pTMR_jRWG_Y&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&quot;Havana Burning&quot; by Dan Reeder&lt;/a&gt; to end the show.&lt;/p&gt;

&lt;h1&gt;Links&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.roomkey.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Room Key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.colinsteele.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Colin Steele&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure-conj.org&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clojure/conj Conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bukuraleigh.com/buku/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Buku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.crunchbase.com/company/hotelicopter&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Hotelicopter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.org/state&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clojure and State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.colinsteele.org/post/23103789647/against-the-grain-aws-clojure-startup&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Colin Steele's Blog Post: Against the Grain: How We Built the Next Generation Online Travel Agency Using Amazon, Clojure and a Comically Small Team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.datomic.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Datomic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/author/Rich-Hickey&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Rich Hickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clojure.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clojure/core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/stuart-sierra&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Stuart Sierra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Agile_software_development&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Agile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/marc-phillips&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Marc Phillips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Event-driven_programming&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Event-Based Environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.datomic.com/query.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Datomic Query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.datomic.com/overview.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Peer Capability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.datomic.com/faq.html#scale&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Datomic and Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thestrangeloop.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Strangeloop Conference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Credits&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Episode Cover Art:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/michael-parenteau&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Michael Parenteau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production Assistance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/lynn-grogan&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Lynn Grogan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/michael-nygard&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Michael Nygard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/marc-phillips&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Marc Phillips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thinkrelevance.com/team/members/daemian-mack&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Daemian Mack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/relevance-blog/~4/8sWVpdT4DjY&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Craig Andera</name>
			<uri>http://pipes.yahoo.com/pipes/pipe.info?_id=4ae2c2d9a04d626263b3cb7c7a002970</uri>
		</author>
		<source>
			<title type="html">Relevance Inc.'s blog</title>
			<subtitle type="html">Pipes Output</subtitle>
			<link rel="self" href="http://pipes.yahoo.com/pipes/pipe.run?_id=4ae2c2d9a04d626263b3cb7c7a002970&amp;_render=rss"/>
			<id>http://pipes.yahoo.com/pipes/pipe.info?_id=4ae2c2d9a04d626263b3cb7c7a002970</id>
		</source>
	</entry>

	<entry>
		<title type="html" xml:lang="en-US">Java.next: Extension without inheritance, Part 1</title>
		<link href="http://www.ibm.com/developerworks/library/j-jn5/"/>
		<id>tag:dogear.ibm.com,2005:link:94b60aab-4d91-4ac3-b6ae-ec78ca9cba07</id>
		<updated>2013-06-12T18:00:10+00:00</updated>
		<content type="html" xml:lang="en-US">&lt;div&gt;&lt;p&gt;
Extension without inheritance, Part 1

&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>developerWorks</name>
			<uri>https://www.ibm.com/developerworks/community/bookmarks/html?base=%25%25http%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Flibrary%2F%25%25&amp;sortBy=created&amp;sortOrder=desc&amp;tag=clojure&amp;lang=en</uri>
		</author>
		<source>
			<title type="html">Bookmarks - Bookmarks with Tags: clojure within %http://www.ibm.com/developerworks/library/%</title>
			<link rel="self" href="https://www.ibm.com/developerworks/community/bookmarks/atom?base=%25%25http%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Flibrary%2F%25%25&amp;sortBy=created&amp;sortOrder=desc&amp;tag=clojure&amp;lang=en"/>
			<id>tag:dogear.ibm.com,2005:feed:/?base=%25%25http%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Flibrary%2F%25%25&amp;sortBy=created&amp;sortOrder=desc&amp;tag=clojure&amp;lang=en</id>
		</source>
	</entry>

</feed>
