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

  <title><![CDATA[The ClojureWerkz Blog]]></title>
  <link href="http://blog.clojurewerkz.org/atom.xml" rel="self"/>
  <link href="http://blog.clojurewerkz.org/"/>
  <updated>2013-05-22T00:01:25+04:00</updated>
  <id>http://blog.clojurewerkz.org/</id>
  <author>
    <name><![CDATA[The ClojureWerkz Team]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Elastisch 1.1.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/05/21/elastisch-1-dot-1-0-is-released/"/>
    <updated>2013-05-21T23:58:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/05/21/elastisch-1-dot-1-0-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Elastisch is a battle tested, small but feature rich and well documented <a href="http://clojureelasticsearch.info">Clojure client for ElasticSearch</a>.
It supports virtually every Elastic Search feature and has <a href="http://clojureelasticsearch.info">solid documentation</a>.</p>

<p><a href="https://clojars.org/clojurewerkz/elastisch/versions/1.1.0">1.1.0</a>
includes several new features, most notably a native client with the
same API as the REST one Elastisch already has.</p>

<h2>Supported ElasticSearch Versions</h2>

<p>Elastisch 1.1&#8217;s native client requires <a href="http://www.elasticsearch.org/2013/04/29/0-90-0-released/">ElasticSearch
0.90.0</a>. ElasticSearch
still evolves rapidly and binary protocol changes quite often, so the
version match between the client and the server is currently a
requirement for binary clients.</p>

<p>This restriction does not apply to REST API clients.</p>

<h2>Changes in 1.1.0</h2>

<h3>Native Client</h3>

<p>Elastisch <code>1.1.0</code> includes a major new feature: native ElasticSearch client.
The client uses ElasticSearch&#8217;s Java API, and can be used with
both transport and node clients.</p>

<h4>Rationale</h4>

<p>Native client is more bandwidth efficient. It also can use SMILE (binary JSON format) to be more
efficient on the wire.</p>

<h4>Namespace Layout</h4>

<p>Native client API in Elastisch is nearly identical to that of the REST API client
and resides in <code>clojurewerkz.elastisch.native</code> and <code>clojurewerkz.elastisch.native.*</code>
namespaces (similarly to how <code>clojurewerkz.elastisch.rest</code> <code>clojurewerkz.elastisch.rest.*</code>
namespaces are organized).</p>

<h4>Connections</h4>

<p>Transport client (used for TCP/remote connections) connections are set up using
<code>clojurewerkz.elastisch.native/connect!</code>. Note that you need to provide node
configuration that at least has cluster name in it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native</span> <span class="ss">:as</span> <span class="nv">es</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; note that transport client uses port 9300 by default.</span>
</span><span class='line'><span class="c1">;; it also can connect to multiple cluster nodes</span>
</span><span class='line'><span class="p">(</span><span class="nf">es/connect!</span> <span class="p">[[</span><span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">9300</span><span class="p">]]</span>
</span><span class='line'>             <span class="p">{</span><span class="s">&quot;cluster.name&quot;</span> <span class="s">&quot;elasticsearch_antares&quot;</span> <span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Cluster name and transport node addresses can be retrieved via HTTP API, for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="nv">curl</span> <span class="nv">http</span><span class="ss">://localhost:9200/_cluster/nodes</span>
</span><span class='line'><span class="p">{</span><span class="s">&quot;ok&quot;</span><span class="ss">:true</span>,<span class="s">&quot;cluster_name&quot;</span><span class="err">:</span><span class="s">&quot;elasticsearch_antares&quot;</span>,<span class="s">&quot;nodes&quot;</span><span class="ss">:...</span><span class="p">}}</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Performing Operations</h4>

<p>The Native client tries to be as close as possible to the existing REST client API.
For example, document operation functions in <code>clojurewerkz.elastisch.native.document</code>,
such as <code>clojurewerkz.elastisch.native.document/create</code>,
follow <code>clojurewerkz.elastisch.rest.document</code> function signatures as closely as
possible:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="c1">;; in the REPL</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native</span> <span class="ss">:as</span> <span class="nv">es</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">es/connect!</span> <span class="p">[[</span><span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">9300</span><span class="p">]]</span>
</span><span class='line'>             <span class="p">{</span><span class="s">&quot;cluster.name&quot;</span> <span class="s">&quot;elasticsearch_antares&quot;</span> <span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">doc/put</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span> <span class="nv">document</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/get</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same with returned results. Note, however, that ES transport client
does have (very) minor differences with the REST API and it is not always possible
for Elastisch to completely cover such differences.</p>

<h4>Async Operations</h4>

<p>Native client offers a choice of synchronous (blocking calling thread until a response
is received) and asynchronous (returns a future) versions of multiple API operations:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="c1">;; in the REPL</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native</span> <span class="ss">:as</span> <span class="nv">es</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">es/connect!</span> <span class="p">[[</span><span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">9300</span><span class="p">]]</span>
</span><span class='line'>             <span class="p">{</span><span class="s">&quot;cluster.name&quot;</span> <span class="s">&quot;elasticsearch_antares&quot;</span> <span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">doc/put</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span> <span class="nv">document</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; returns a response</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/get</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span><span class="p">)</span>
</span><span class='line'><span class="c1">;; returns a future that will eventually</span>
</span><span class='line'><span class="c1">;; contain a response</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/async-get</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>One notable exception to this is administrative operations (such as opening or closing
an index). The rationale for this is that they are rarely executed on the hot
code path (e.g. in tight loops), so convenience and better error visibility is more
important for them.</p>

<p>GH issues: #17, #18, #20.</p>

<h3>Clojure 1.5 By Default</h3>

<p>Elastisch now depends on <code>org.clojure/clojure</code> version <code>1.5.0</code>. It is still compatible with Clojure 1.3+ and if your <code>project.clj</code> depends
on 1.3 or 1.4, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement for the majority of projects out there.</p>

<h3>Bulk Request Support</h3>

<p>Bulk requests are now supported. All the relevant code is in the <code>clojurewerkz.elastisch.rest.bulk</code>
namespace. Here is a small example of bulk document indexing using this new API:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.bulk</span> <span class="ss">:as</span> <span class="nv">eb</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">eb/bulk</span> <span class="p">(</span><span class="nf">eb/bulk-index</span> <span class="nv">doc1</span> <span class="nv">doc2</span> <span class="nv">doc3</span><span class="p">)</span> <span class="ss">:refresh</span> <span class="nv">true</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Davie Moston.</p>

<h3>Scroll Queries Support</h3>

<p>Scroll queries are now easier to perform thanks to the new <code>clojurewerkz.elastisch.rest.document/scroll</code>
function that takes a scroll id and amount of time retrieved documents and related information
will be kept in memory for future retrieval. They are analogous to database cursors.</p>

<p>A short code example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.query</span> <span class="ss">:as</span> <span class="nv">q</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.response</span> <span class="ss">:refer</span> <span class="p">[</span><span class="nv">hits-from</span><span class="p">]])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">index-name</span>   <span class="s">&quot;articles&quot;</span>
</span><span class='line'>      <span class="nv">mapping-type</span> <span class="s">&quot;article&quot;</span>
</span><span class='line'>      <span class="nv">response</span>     <span class="p">(</span><span class="nf">doc/search</span> <span class="nv">index-name</span> <span class="nv">mapping-type</span>
</span><span class='line'>                               <span class="ss">:query</span> <span class="p">(</span><span class="nf">q/query-string</span> <span class="ss">:query</span> <span class="s">&quot;*&quot;</span><span class="p">)</span>
</span><span class='line'>                               <span class="ss">:search_type</span> <span class="s">&quot;scan&quot;</span>
</span><span class='line'>                               <span class="ss">:scroll</span> <span class="s">&quot;1m&quot;</span>
</span><span class='line'>                               <span class="ss">:size</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">scroll-id</span>     <span class="p">(</span><span class="ss">:_scroll_id</span> <span class="nv">response</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">scan-response</span> <span class="p">(</span><span class="nf">doc/scroll</span> <span class="nv">scroll-id</span> <span class="ss">:scroll</span> <span class="s">&quot;1m&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">scan-hits</span>     <span class="p">(</span><span class="nf">hits-from</span> <span class="nv">scan-response</span><span class="p">)]</span>
</span><span class='line'>  <span class="p">(</span><span class="nb">println </span><span class="nv">scan-hits</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Davie Moston.</p>

<h3>Cheshire Update</h3>

<p><a href="https://github.com/dakrone/cheshire/">Cheshire</a> dependency has been upgraded to version <code>5.1.1</code>.</p>

<h3>clj-http Update</h3>

<p><a href="https://github.com/dakrone/clj-http/">clj-http</a> dependency has been upgraded to version <code>0.7.2</code>.</p>

<h3>Count API No Longer Ignores Mapping Types</h3>

<p><code>clojurewerkz.elastisch.rest.document/count</code> no longer ignores mapping types.</p>

<p>GH issue: #6.</p>

<h3>Count API now uses GET requests</h3>

<p><code>clojurewerkz.elastisch.rest.document/count</code> now correctly uses <code>GET</code> for requests without
the query part and<code>POST</code> for request that have it.</p>

<p>GH issue: #5.</p>

<h3>Updates With Scripts</h3>

<p><code>clojurewerkz.elastisch.rest.document/update-with-script</code> is a new function
that updates a document with a provided script:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; initializes a counter at 1</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/update-with-script</span> <span class="nv">index-name</span> <span class="nv">mapping-type</span> <span class="s">&quot;1&quot;</span>
</span><span class='line'>      <span class="s">&quot;ctx._source.counter = 1&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; increments the counter by 4</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/update-with-script</span> <span class="nv">index-name</span> <span class="nv">mapping-type</span> <span class="s">&quot;1&quot;</span>
</span><span class='line'>      <span class="s">&quot;ctx._source.counter += inc&quot;</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;inc&quot;</span> <span class="mi">4</span><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>clojurewerkz.elastisch.native.document/update-with-script</code> is the native
client counterpart that takes the same arguments.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/clojurewerkz/elastisch/blob/master/ChangeLog.md">Elastisch change log</a> is available on GitHub.</p>

<h2>Thank You, Contributors</h2>

<p>Kudos to Davie Moston, Andrew Jones, Jon Pither and Antonio Terreno who contributed to this release.</p>

<h2>Elastisch is a ClojureWerkz Project</h2>

<p><a href="http://clojureelasticsearch.info">Elastisch</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Elastisch, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Langohr 1.0.0-beta14 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/05/18/langohr-1-dot-0-0-beta14-is-released/"/>
    <updated>2013-05-18T16:20:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/05/18/langohr-1-dot-0-0-beta14-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Langohr is a <a href="http://clojurerabbitmq.info">Clojure RabbitMQ client</a> that embraces <a href="http://www.rabbitmq.com/tutorials/amqp-concepts.html">AMQP 0.9.1 Model</a>.</p>

<p><code>1.0.0-beta14</code> is a development milestone release that includes a few minor features,
mostly around error handling and recovery.</p>

<h2>Changes between Langohr 1.0.0-beta13 and 1.0.0-beta14</h2>

<h3>Queueing Consumers</h3>

<p>In its early days, Langohr has been using <code>QueueingConsumer</code> for <code>langohr.queue/subscribe</code>.
It was later replaced by a <code>DefaultConsumer</code> implementation.</p>

<p>The key difference between the two is that</p>

<ul>
<li><code>QueueingConsumer</code> blocks the caller</li>
<li>with <code>QueueingConsumer</code>, deliveries are typically processed in the same thread</li>
</ul>


<p>This implementation has pros and cons. As such, an implementation on top of
<code>QueueingConsumer</code> is back with <code>langohr.consumers/blocking-subscribe</code> which is
identical to <code>langohr.consumers/subscribe</code> in the signature but blocks the caller.</p>

<p>In addition, <code>langohr.consumers/ack-unless-exception</code> is a new convenience function
that takes a delivery handler fn and will return a new function
that explicitly acks deliveries unless an exception was raised by the original handler:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">langohr.consumers</span> <span class="ss">:as</span> <span class="nv">lc</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">langohr.basic</span>     <span class="ss">:as</span> <span class="nv">lb</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">f</span>  <span class="p">(</span><span class="k">fn </span><span class="p">[</span><span class="nv">metadata</span> <span class="nv">payload</span><span class="p">]</span>
</span><span class='line'>           <span class="p">(</span><span class="nb">comment </span><span class="s">&quot;Message delivery handler&quot;</span><span class="p">))</span>
</span><span class='line'>      <span class="nv">f</span><span class="o">&#39;</span> <span class="p">(</span><span class="nf">lc/ack-unless-exception</span> <span class="nv">f</span><span class="p">)]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">lb/consume</span> <span class="nv">ch</span> <span class="nv">q</span> <span class="p">(</span><span class="nf">lc/create-default</span> <span class="ss">:handle-delivery-fn</span> <span class="nv">f</span><span class="o">&#39;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Ian Eure.</p>

<h3>Shutdown Signal Functions</h3>

<p>Several new functions in <code>langohr.shutdown</code> aid with shutdown signals:</p>

<ul>
<li><code>langohr.shutdown/initiated-by-application?</code></li>
<li><code>langohr.shutdown/initiated-by-broker?</code></li>
<li><code>langohr.shutdown/reason-of</code></li>
<li><code>langohr.shutdown/channel-of</code></li>
<li><code>langohr.shutdown/connection-of</code></li>
</ul>


<h3>Clojure 1.5 By Default</h3>

<p>Langohr now depends on <code>org.clojure/clojure</code> version <code>1.5.1</code>. It is
still compatible with Clojure 1.3 and if your <code>project.clj</code> depends on
a different version, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement
for the majority of projects out there.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/michaelklishin/langohr/blob/master/ChangeLog.md">Langohr change log</a> is available on GitHub.</p>

<h2>Langohr is a ClojureWerkz Project</h2>

<p><a href="http://clojurerabbitmq.info">Langohr</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic well documented Clojure client for ElasticSearch</li>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Langohr, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Elastisch 1.1.0-rc2 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/05/05/elastisch-1-dot-1-0-rc2-is-released/"/>
    <updated>2013-05-05T14:02:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/05/05/elastisch-1-dot-1-0-rc2-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Elastisch is a battle tested, small but feature rich and well documented <a href="http://clojureelasticsearch.info">Clojure client for ElasticSearch</a>.
It supports virtually every Elastic Search feature, provides both HTTP and native clients
(as of <code>1.1</code>) and has <a href="http://clojureelasticsearch.info">solid documentation</a>.</p>

<p><code>1.1.0-rc2</code> is a preview release that improves native client performance.</p>

<h2>Changes in 1.1.0-rc2</h2>

<h3>Native Client Performance Improvements</h3>

<p>Native client is now over 50% faster on most commonly used operations
thanks to much lower conversion overhead from ElasticSearch native client
data structures to Clojure maps.</p>

<p><a href="https://github.com/clojurewerkz/elastisch/blob/master/ChangeLog.md">Elastisch change log</a> is available on GitHub.</p>

<h2>Thank You, Contributors</h2>

<p>Kudos to Jon Pither and Antonio Terreno for doing the benchmarking,
profiling and optimizations that made this substantial performance
increase a reality.</p>

<h2>Elastisch is a ClojureWerkz Project</h2>

<p><a href="http://clojureelasticsearch.info">Elastisch</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://titanium.clojurewerkz.org">Titanium</a>, a powerful Clojure graph library</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Elastisch, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Titanium 1.0.0-beta1 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/05/02/titanium-1-dot-0-0-beta1-is-released/"/>
    <updated>2013-05-02T22:00:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/05/02/titanium-1-dot-0-0-beta1-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p><a href="http://titanium.clojurewerkz.org">Titanium</a> is a powerful Clojure graph library that is built on top of <a href="http://thinkaurelius.github.com/titan/">Aurelius Titan</a>.
It combines a Clojure-friendly API and graph processing DSL with the power of Titan.</p>

<p><code>beta1</code> is a major development milestone that has <strong>major public API changes</strong>,
upgrades Titanium to Titan <code>0.3</code>, provides a separate Clojure library for
working with any Blueprints-compatible graph database and introduces
a new powerful way of querying graphs: <a href="http://ogre.clojurewerkz.org">Ogre, a dialect of Gremlin</a>.</p>

<h2>Towards Making Clojure A Great Ecosystem For Graph Analysis</h2>

<p>When we first introduced Titanium a few months ago, the response was very positive. People
liked Titan features, swappable storage and straightforward transaction support.</p>

<p>Back then, Titanium wasn&#8217;t the only Titan-related Clojure project on
the block. <a href="http://twitter.com/zackmaril">Zack Maril</a> has been working
on another project called Hermes for a while. Then Zack <a href="https://groups.google.com/forum/?fromgroups#!searchin/gremlin-users/Ogre/gremlin-users/Del9DasqBcE/5uQEYXdLPc0J">released
Ogre</a>,
a Clojure library for querying <a href="http://tinkerpop.com">Blueprints
graphs</a>.</p>

<p>Titanium and Hermes were largely solving the same problem and after
discussing it for some time, we decided to join forces with Zack and
continue working together on
Titanium. <a href="http://ogre.clojurewerkz.org">Ogre</a> and
<a href="https://github.com/clojurewerkz/archimedes">Archimedes</a> are now
ClojureWerkz projects and Titanium <code>1.0.0-beta1</code> is based on them.</p>

<p>We would like to thank Zack for considering joining the team and all
the work he has been doing on Titanium and related Clojure graph libraries.</p>

<p>You should follow him <a href="http://twitter.com/zackmaril">on Twitter</a> and
<a href="http://github.com/zmaril">GitHub</a>.</p>

<h2>Moving to Titan 0.3</h2>

<p>Titan is still a young project and is actively being worked on. In <a href="https://groups.google.com/forum/#!topic/aureliusgraphs/vlRg0ey735g">version 0.3</a>,
Titan introduces several breaking API changes and new features such as</p>

<ul>
<li>Full text search (indexing)</li>
<li>Better caching layer</li>
<li>Lots of optimizations</li>
<li>Properties on vertices can have properties on them which is very useful for version, timestamping, etc</li>
</ul>


<p>Titanium closely follows these developments and <code>1.0.0-beta1</code> is based on Titan <code>0.3</code>. Not all
new Titan features are available in Titanium <code>1.0.0-beta1</code> but it won&#8217;t take long.</p>

<h2>Improved Documentation</h2>

<p>Titanium <code>1.0.0-beta1</code> includes a major <a href="http://titanium.clojurewerkz.org">documentation</a> overhaul
to adapt to the Titan 0.3 changes and separation into multiple libraries.
In addition, <a href="http://ogre.clojurewerkz.org">Ogre documentation site</a> is now also live
and uses our <a href="https://github.com/clojurewerkz/docslate">standard documentation toolchain</a>.</p>

<p>It&#8217;s not a ClojureWerkz project if it is not documented well!</p>

<h2>Changes between Titanium 1.0.0-alpha2 and 1.0.0-beta1</h2>

<h3>Archimedes For Working With Blueprints Graphs</h3>

<p>Titanium now relies a separate library called <a href="https://github.com/clojurewerkz/archimedes">Archimedes</a>
for graph operations on any Blueprints-compatible graph database.</p>

<h3>Ogre For Graph Querying</h3>

<p>Titanium depends on <a href="http://ogre.clojurewerkz.org">Ogre</a>, a powerful Clojure library for querying
Blueprints-compatible graphs (a dialect of the Gremlin query language).</p>

<p>Ogre supercedes <code>clojurewerkz.titanium.gpipe</code> query DSL.</p>

<h3>Titan Types Support</h3>

<p>In Titan, edge and vertex properties can have custom types. Titanium now
<a href="http://titanium.clojurewerkz.org/articles/types.html">supports said custom types</a>.</p>

<p>The documentation guide above provides more information.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/clojurewerkz/titanium/blob/master/ChangeLog.md">Titanium change
log</a>
is available on GitHub.</p>

<h2>News and Updates</h2>

<p>New releases and updates are announced <a href="http://twitter.com/clojurewerkz">on
Twitter</a>. Titanium also has <a href="https://groups.google.com/group/clojure-titanium">a
mailing list</a>, feel
free to ask questions and report issues there.</p>

<h2>How To Follow The Development</h2>

<p><a href="https://github.com/clojurewerkz/titanium">Titanium</a>, <a href="https://github.com/clojurewerkz/ogre">Ogre</a> and <a href="https://github.com/clojurewerkz/archimedes">Archimedes</a> are all available on GitHub.</p>

<p>If you have questions about these libraries, feel free to ask on the <a href="https://groups.google.com/group/aureliusgraphs">Titan mailing list</a> or <a href="https://groups.google.com/group/clojure-titanium">Titanium&#8217;s own mailing list</a>.</p>

<h2>Titanium is a ClojureWerkz Project</h2>

<p>Titanium is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

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


<p>and several others. If you like Titanium, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://twitter.com/clojurewerkz">ClojureWerkz Team</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Scrypt 1.0.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/05/02/scrypt-1-dot-0-0-is-released/"/>
    <updated>2013-05-02T09:00:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/05/02/scrypt-1-dot-0-0-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p><a href="https://github.com/clojurewerkz/scrypt">ClojureWerkz Scrypt</a> is a tiny Clojure library for working with <a href="http://www.tarsnap.com/scrypt/scrypt.pdf">scrypt</a>,
a key derivation function. Scrypt can be used to hash passwords and generate cryptographic
keys. It is an alternative to Bcrypt and PBKDF2.</p>

<h2>Why Use Scrypt</h2>

<p>Values (e.g. passwords) encrypted with Scrypt are much more computationally hard to crack than with most other
available key derivation functions:</p>

<p><img src="http://blog.clojurewerkz.org/images/posts/kdf-comparison.png" alt="Key Derivation Function Comparison" /></p>

<p>More can be found in the <a href="http://www.tarsnap.com/scrypt/scrypt.pdf">scrypt paper</a>.</p>

<h2>What&#8217;s In The Box</h2>

<p>Scrypt is literally a couple of functions:</p>

<ul>
<li>Encrypt a value (e.g. a password)</li>
<li>Verify a candidate against a hash (e.g. against a password used to authenticate)</li>
</ul>


<h2>Documentation</h2>

<p>Scrypt is a small library and all of its <a href="https://github.com/clojurewerkz/scrypt#documentation">documentation guide fits in the README</a>.</p>

<h2>Supported Clojure Versions</h2>

<p>Scrypt supports Clojure 1.3+.</p>

<h2>News and Updates</h2>

<p>New releases and updates are announced <a href="http://twitter.com/clojurewerkz">on Twitter</a>.</p>

<h2>Scrypt is a ClojureWerkz Project</h2>

<p>Scrypt is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://titanium.clojurewerkz.org">Titanium</a>, a powerful graph library built on top of <a href="http://thinkaurelius.github.io/titan/">Titan</a></li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a Clojure client for the Neo4J REST API</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Scrypt, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://twitter.com/clojurewerkz">ClojureWerkz Team</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Elastisch 1.1.0-rc1 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/29/elastisch-1-dot-1-0-rc1-is-released/"/>
    <updated>2013-04-29T23:15:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/29/elastisch-1-dot-1-0-rc1-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Elastisch is a battle tested, small but feature rich and well documented <a href="http://clojureelasticsearch.info">Clojure client for ElasticSearch</a>.
It supports virtually every Elastic Search feature and has <a href="http://clojureelasticsearch.info">solid documentation</a>.</p>

<p><a href="https://clojars.org/clojurewerkz/elastisch/versions/1.1.0-rc1">1.1.0-rc1</a> is
a candidate release that has several new features, most notably a native client with the
same API as the REST one Elastisch already has.</p>

<h2>Supported ElasticSearch Versions</h2>

<p>Elastisch 1.1&#8217;s native client requires <a href="http://www.elasticsearch.org/2013/04/29/0-90-0-released/">ElasticSearch
0.90.0</a>. ElasticSearch
still evolves rapidly and binary protocol changes quite often, so the
version match between the client and the server is currently a
requirement for binary clients.</p>

<p>This restriction does not apply to REST API clients.</p>

<h2>Changes in 1.1.0</h2>

<h3>Native Client</h3>

<p>Elastisch <code>1.1.0</code> includes a major new feature: native ElasticSearch client.
The client uses ElasticSearch&#8217;s Java API, and can be used with
both transport and node clients.</p>

<h4>Rationale</h4>

<p>Native client is more bandwidth efficient. It also can use SMILE (binary JSON format) to be more
efficient on the wire.</p>

<h4>Namespace Layout</h4>

<p>Native client API in Elastisch is nearly identical to that of the REST API client
and resides in <code>clojurewerkz.elastisch.native</code> and <code>clojurewerkz.elastisch.native.*</code>
namespaces (similarly to how <code>clojurewerkz.elastisch.rest</code> <code>clojurewerkz.elastisch.rest.*</code>
namespaces are organized).</p>

<h4>Connections</h4>

<p>Transport client (used for TCP/remote connections) connections are set up using
<code>clojurewerkz.elastisch.native/connect!</code>. Note that you need to provide node
configuration that at least has cluster name in it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native</span> <span class="ss">:as</span> <span class="nv">es</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; note that transport client uses port 9300 by default.</span>
</span><span class='line'><span class="c1">;; it also can connect to multiple cluster nodes</span>
</span><span class='line'><span class="p">(</span><span class="nf">es/connect!</span> <span class="p">[[</span><span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">9300</span><span class="p">]]</span>
</span><span class='line'>             <span class="p">{</span><span class="s">&quot;cluster.name&quot;</span> <span class="s">&quot;elasticsearch_antares&quot;</span> <span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Cluster name and transport node addresses can be retrieved via HTTP API, for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="nv">curl</span> <span class="nv">http</span><span class="ss">://localhost:9200/_cluster/nodes</span>
</span><span class='line'><span class="p">{</span><span class="s">&quot;ok&quot;</span><span class="ss">:true</span>,<span class="s">&quot;cluster_name&quot;</span><span class="err">:</span><span class="s">&quot;elasticsearch_antares&quot;</span>,<span class="s">&quot;nodes&quot;</span><span class="ss">:...</span><span class="p">}}</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Performing Operations</h4>

<p>The Native client tries to be as close as possible to the existing REST client API.
For example, document operation functions in <code>clojurewerkz.elastisch.native.document</code>,
such as <code>clojurewerkz.elastisch.native.document/create</code>,
follow <code>clojurewerkz.elastisch.rest.document</code> function signatures as closely as
possible:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="c1">;; in the REPL</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native</span> <span class="ss">:as</span> <span class="nv">es</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">es/connect!</span> <span class="p">[[</span><span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">9300</span><span class="p">]]</span>
</span><span class='line'>             <span class="p">{</span><span class="s">&quot;cluster.name&quot;</span> <span class="s">&quot;elasticsearch_antares&quot;</span> <span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">doc/put</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span> <span class="nv">document</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/get</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same with returned results. Note, however, that ES transport client
does have (very) minor differences with the REST API and it is not always possible
for Elastisch to completely cover such differences.</p>

<h4>Async Operations</h4>

<p>Native client offers a choice of synchronous (blocking calling thread until a response
is received) and asynchronous (returns a future) versions of multiple API operations:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="c1">;; in the REPL</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native</span> <span class="ss">:as</span> <span class="nv">es</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.native.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">es/connect!</span> <span class="p">[[</span><span class="s">&quot;127.0.0.1&quot;</span> <span class="mi">9300</span><span class="p">]]</span>
</span><span class='line'>             <span class="p">{</span><span class="s">&quot;cluster.name&quot;</span> <span class="s">&quot;elasticsearch_antares&quot;</span> <span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">doc/put</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span> <span class="nv">document</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; returns a response</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/get</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span><span class="p">)</span>
</span><span class='line'><span class="c1">;; returns a future that will eventually</span>
</span><span class='line'><span class="c1">;; contain a response</span>
</span><span class='line'><span class="p">(</span><span class="nf">doc/async-get</span> <span class="nv">index-name</span> <span class="nv">index-type</span> <span class="nv">id</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>One notable exception to this is administrative operations (such as opening or closing
an index). The rationale for this is that they are rarely executed on the hot
code path (e.g. in tight loops), so convenience and better error visibility is more
important for them.</p>

<p>GH issues: #17, #18, #20.</p>

<p>Note that native ElasticSearch client currently relies on <a href="http://www.elasticsearch.org/blog/2013/02/26/0.90.0.Beta1-released.html">ElasticSearch 0.90.0.Beta1</a>
client libraries and some operations will only work with that version.</p>

<h3>Clojure 1.5 By Default</h3>

<p>Elastisch now depends on <code>org.clojure/clojure</code> version <code>1.5.0</code>. It is still compatible with Clojure 1.3+ and if your <code>project.clj</code> depends
on 1.3 or 1.4, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement for the majority of projects out there.</p>

<h3>Bulk Request Support</h3>

<p>Bulk requests are now supported. All the relevant code is in the <code>clojurewerkz.elastisch.rest.bulk</code>
namespace. Here is a small example of bulk document indexing using this new API:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.bulk</span> <span class="ss">:as</span> <span class="nv">eb</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">eb/bulk</span> <span class="p">(</span><span class="nf">eb/bulk-index</span> <span class="nv">doc1</span> <span class="nv">doc2</span> <span class="nv">doc3</span><span class="p">)</span> <span class="ss">:refresh</span> <span class="nv">true</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Davie Moston.</p>

<h3>Scroll Queries Support</h3>

<p>Scroll queries are now easier to perform thanks to the new <code>clojurewerkz.elastisch.rest.document/scroll</code>
function that takes a scroll id and amount of time retrieved documents and related information
will be kept in memory for future retrieval. They are analogous to database cursors.</p>

<p>A short code example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.document</span> <span class="ss">:as</span> <span class="nv">doc</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.query</span> <span class="ss">:as</span> <span class="nv">q</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.elastisch.rest.response</span> <span class="ss">:refer</span> <span class="p">[</span><span class="nv">hits-from</span><span class="p">]])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">index-name</span>   <span class="s">&quot;articles&quot;</span>
</span><span class='line'>      <span class="nv">mapping-type</span> <span class="s">&quot;article&quot;</span>
</span><span class='line'>      <span class="nv">response</span>     <span class="p">(</span><span class="nf">doc/search</span> <span class="nv">index-name</span> <span class="nv">mapping-type</span>
</span><span class='line'>                               <span class="ss">:query</span> <span class="p">(</span><span class="nf">q/query-string</span> <span class="ss">:query</span> <span class="s">&quot;*&quot;</span><span class="p">)</span>
</span><span class='line'>                               <span class="ss">:search_type</span> <span class="s">&quot;scan&quot;</span>
</span><span class='line'>                               <span class="ss">:scroll</span> <span class="s">&quot;1m&quot;</span>
</span><span class='line'>                               <span class="ss">:size</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">scroll-id</span>     <span class="p">(</span><span class="ss">:_scroll_id</span> <span class="nv">response</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">scan-response</span> <span class="p">(</span><span class="nf">doc/scroll</span> <span class="nv">scroll-id</span> <span class="ss">:scroll</span> <span class="s">&quot;1m&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">scan-hits</span>     <span class="p">(</span><span class="nf">hits-from</span> <span class="nv">scan-response</span><span class="p">)]</span>
</span><span class='line'>  <span class="p">(</span><span class="nb">println </span><span class="nv">scan-hits</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Davie Moston.</p>

<h3>Cheshire Update</h3>

<p><a href="https://github.com/dakrone/cheshire/">Cheshire</a> dependency has been upgraded to version <code>5.1.1</code>.</p>

<h3>clj-http Update</h3>

<p><a href="https://github.com/dakrone/clj-http/">clj-http</a> dependency has been upgraded to version <code>0.7.2</code>.</p>

<h3>Count API No Longer Ignores Mapping Types</h3>

<p><code>clojurewerkz.elastisch.rest.document/count</code> no longer ignores mapping types.</p>

<p>GH issue: #6.</p>

<h3>Count API now uses GET requests</h3>

<p><code>clojurewerkz.elastisch.rest.document/count</code> now correctly uses <code>GET</code> for requests without
the query part and<code>POST</code> for request that have it.</p>

<p>GH issue: #5.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/clojurewerkz/elastisch/blob/master/ChangeLog.md">Elastisch change log</a> is available on GitHub.</p>

<p>We recommend all users to give <a href="https://clojars.org/clojurewerkz/elastisch/versions/1.1.0-rc1">1.1.0-rc1</a>
a try.</p>

<h2>Thank You, Contributors</h2>

<p>Kudos to Davie Moston and Andrew Jones who contributed to this release.</p>

<h2>Road To 1.1</h2>

<p>Elastisch 1.1 will be released once we update <a href="http://clojureelasticsearch.info">Elastisch documentation</a> to cover all the
new features.</p>

<h2>Elastisch is a ClojureWerkz Project</h2>

<p><a href="http://clojureelasticsearch.info">Elastisch</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Elastisch, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Money 1.3.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/24/money-1-dot-3-0-is-released/"/>
    <updated>2013-04-24T20:37:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/24/money-1-dot-3-0-is-released</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/clojurewerkz/money">Money</a> is a Clojure library that deals with monetary amounts
and currencies, built on top of <a href="http://joda-money.sourceforge.net/">Joda Money</a>.</p>

<p><code>1.3.0</code> is a minor release that has no breaking API changes and several minor features.</p>

<h2>Changes between Money 1.2.0 and 1.3.0</h2>

<h3>Hiccup Integration</h3>

<p><code>clojurewerkz.money.hiccup</code>, when compiled, will extend Hiccup&#8217;s HTML
rendering protocol for monetary amounts and currency units. Internally
it uses default formatter used by <code>clojurewerkz.money.format</code>:
<code>clojurewerkz.money.format/*default-formatter*</code>, which can be rebound.</p>

<h3>Formatting of Monetary Amounts</h3>

<p><code>clojurewerkz.money.format/format</code> is a new function that formats
monetary amounts using default or provided locale:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.money.currencies</span> <span class="ss">:as</span> <span class="nv">cu</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.money.amounts</span> <span class="ss">:refer</span> <span class="p">[</span><span class="nv">amount-of</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.money.format</span> <span class="ss">:refer</span> <span class="ss">:all</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nb">import </span><span class="nv">java.util.Locale</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">;; format using default system locale</span>
</span><span class='line'><span class="p">(</span><span class="nf">format</span> <span class="p">(</span><span class="nf">amount-of</span> <span class="nv">cu/GBP</span> <span class="mf">20.0</span><span class="p">)</span> <span class="nv">Locale/UK</span><span class="p">)</span> <span class="c1">;= GBP20,00</span>
</span><span class='line'><span class="c1">;; format using UK locale</span>
</span><span class='line'><span class="p">(</span><span class="nf">format</span> <span class="p">(</span><span class="nf">amount-of</span> <span class="nv">cu/GBP</span> <span class="mf">20.0</span><span class="p">)</span> <span class="nv">Locale/UK</span><span class="p">)</span> <span class="c1">;= £10.00</span>
</span></code></pre></td></tr></table></div></figure>


<p>Custom Joda Money formatters are also supported.</p>

<h3>Addition and Subtraction of Monetary Amounts</h3>

<p><code>clojurewerkz.money.amounts/plus</code> and <code>clojurewerkz.money.amounts/minus</code> now accept
monetary amounts as well as doubles as 2nd argument.</p>

<p>Contributed by Ryan Neufeld.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/clojurewerkz/money/blob/master/ChangeLog.md">Money change log</a> is available on GitHub.</p>

<h2>Money is a ClojureWerkz Project</h2>

<p><a href="https://github.com/clojurewerkz/money">Money</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

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


<p>and several others. If you like Money, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[IRC channel for ClojureWerkz project]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/23/irc-channel-for-clojurewerkz-project/"/>
    <updated>2013-04-23T21:35:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/23/irc-channel-for-clojurewerkz-project</id>
    <content type="html"><![CDATA[<h2>ClojureWerkz IRC Channel on Freenode</h2>

<p>Every once in a while we get a request to start an IRC channel for our projects where
people can suggest ideas and ask questions.</p>

<p>We are happy to announce that we now have a channel: <code>#clojurewerkz</code> on <code>irc.freenode.net</code>.
There are no strict &#8220;office hours&#8221; but it is much more likely that we will be around
in European evening hours. Feel free to join and let us know how we can make ClojureWerkz
projects better.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How To Make Your Open Source Project Really Awesome]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/20/how-to-make-your-open-source-project-really-awesome/"/>
    <updated>2013-04-20T01:00:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/20/how-to-make-your-open-source-project-really-awesome</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>If you plan on releasing a library as open source, please make sure it has</p>

<ul>
<li>Clear dependency/installation instructions</li>
<li>At least one brief documentation guide</li>
<li>A change log and tags in the repo</li>
<li>Some information about supported language/runtime/tool versions and project maturity</li>
<li>A mailing list where users can ask questions and help each other</li>
</ul>


<p>Doing anything less than this will cause some of your users grief and anger.
And likely some wasted time.</p>

<h2>How To Make Your Open Source Library Really Awesome</h2>

<p>Year after year, more and more people release libraries they&#8217;ve
developed and would like to open source. Today we&#8217;d like to share a little bit
of our experience about how to make sure users of your library are content
with it.</p>

<p>There is one Rule of Thumb to this:</p>

<blockquote><p>Don&#8217;t make your users mad</p></blockquote>

<p>also known as</p>

<blockquote><p>Don&#8217;t make your users want to break the computer</p></blockquote>

<p>now lets see how specifically we can achieve that goal with a reasonable
amount of effort.</p>

<h2>Give It a Really Useful README</h2>

<p>Even if your project has a nice site, it is likely that the first point of contact
of potential users with it will be by reading the README file. We need to make
sure it is awesome and contains useful information.</p>

<h3>Provide Dependency Information</h3>

<p>So you release open source software. This probably means you are kinda smart. Good
for you. Unfortunately, not everybody is and some people are completely new to the
language/ecosystem your project is in. This means that what is obvious to you is not at all obvious
to many other people.</p>

<p>One such thing is missing dependency/installation information.</p>

<blockquote><p>How do I even install this, was it so hard to make this clear?</p></blockquote>

<p>is something that quickly leads to anger. Digging in the source to find
our your artifact/gem/package name is annoying and some projects use really
creative (read: stupid) names for artifacts that do not match code repository
name, etc.</p>

<p>Relieve your users from having to deal with this crap. Make it dead obvious
how to add a dependency on your project, ideally by copy-pasting a snippet.</p>

<p>See <a href="https://github.com/michaelklishin/welle#maven-artifacts">Welle</a> if you need an example.</p>

<h3>State Project Maturity Clearly</h3>

<p>Have you been using it in production for months? Is it something you still believe
is incomplete? Do you expect the API change drastically in the next version? Is this
project mature and safe to use even for the most demanding and conservative projects?</p>

<p>State all that clearly. And next time you won&#8217;t waste a week of your time because
you&#8217;ve made the wrong call on a library that did not provide any maturity information,
you will realize how much difference a few sentences can make to real people.</p>

<h3>Document Supported Runtime/Language/Tool Versions</h3>

<p>Clojure has a very good track record when it comes to backwards compatibility. It is almost
too good to be true. Besides the <code>1.2</code> to <code>1.3</code> migration, subsequent releases are pretty
much a drop-in replacement for the vast majority of projects out there. As such, projects
that have moved beyond <code>1.2</code> are generally on the most recent stable release</p>

<p>However, this won&#8217;t always be the case. At some point, a future Clojure release
will have to break compatibility. How do we not make our users furious? By clearly
stating what versions are supported in the README.</p>

<p>All it takes is writing one line of text. One less tweet on the week of your release
and you save beginners potentially a lot of head scratching.</p>

<p>If you need an example, <a href="https://github.com/michaelklishin/welle#supported-clojure-versions">here&#8217;s one from Welle</a>.</p>

<h3>State What License You Use</h3>

<p>You may not care about licenses much, but people who want to use your library at a BigBucks Inc do.
They must know. And it may be a deal breaker for them when they want to adopt Clojure/Node.js/Scala/Go/whatever.</p>

<p>So state your license clearly. And please, use something business-friendly unless you have good reasons.
<a href="http://www.tldrlegal.com/license/apache-license-2.0-(apache-2.0">Apache Public License 2.0</a>) and <a href="http://www.tldrlegal.com/license/eclipse-public-license-1.0-(epl-1.0">Eclipse Public License</a>) are good, friendly choices. Note that some licenses
(e.g. <a href="http://www.tldrlegal.com/license/mit-license">MIT</a>) are friendly and popular but do not offer any patent protection, which should not be ignored
in the current legal climate.</p>

<p>Finally, remember that you can double-license, e.g. APL2/GPLv2 if you really want to be license-neutral.
Then your users will pick what suits them.</p>

<p>When in doubt, refer to <a href="http://www.tldrlegal.com/">TL;DR Legal, open source licenses summarized &amp; explained in plain English</a> (but don&#8217;t consider it to be legal advice).</p>

<h3>How To Fuck It Up</h3>

<p>If you want to completely screw your users, do this:</p>

<ul>
<li>Put a nearly blank README to your project&#8217;s root</li>
<li>Make it say &#8220;patches welcome&#8221; at the end</li>
<li>Invent your own license or use a completely unfamiliar one, such as <a href="http://en.wikipedia.org/wiki/WTFPL">WTFPL</a></li>
</ul>


<p>Then your project will never have any users. Guaranteed.</p>

<h2>Document Your Project</h2>

<p>Documenting things is not easy and can be time consuming. However, documentation is the single
best thing you can do to your users. Not only it saves them <em>a lot</em> of time, it makes them
confident that your library is not abandonware.</p>

<p>Documentation helps your users accomplish things they decided to use your library in the first
place. In the words of Rob Pike, it &#8220;empowers them&#8221;. It shows them that you care. It shows
them that you are a real person, not a robot spitting code.</p>

<p>After about 2 years of working on <a href="http://clojurewerkz.org">ClojureWerkz</a>, I can confidently
say that there is nothing our users are more thankful for than documentation for our projects:</p>

<ul>
<li><a href="http://clojureelasticsearch.info">Elastisch documentation</a></li>
<li><a href="http://clojureriak.info">Welle documentation</a></li>
<li><a href="http://clojureneo4j.info">Neocons documentation</a></li>
<li><a href="http://clojuremongodb.info">Monger documentation</a></li>
<li><a href="http://clojurerabbitmq.info">Langohr documentation</a></li>
</ul>


<p><a href="http://jacobian.org/writing/great-documentation/">Writing great documentation</a> takes time.
Fortunately, modern tooling also helps you quite a bit and reduces the annoyances you have
to deal with by a lot.</p>

<p>For ClojureWerkz projects, we&#8217;ve open sourced our <a href="https://github.com/clojurewerkz/docslate">Jekyll-based documentation site template</a>.
We are not great at CSS and the visual aspect of design, so we use Twitter Bootstrap. While
our doc sites could look better, it is certainly pretty good compared to most open source
projects out there. And you can use our template or create a similar one for your projects.</p>

<p>Better yet, if you open source your documentation site (and there is no reason to not do so),
you will likely see people contributing minor improvements and corrections earlier than they will
contribute code changes.</p>

<p>If you are still not sure whether documenting your project is worth it, watch this talk
by Jacob Kaplan-Moss:</p>

<iframe src="http://blip.tv/play/g4VigquCRgI.x?p=1" width="720" height="433" frameborder="0" allowfullscreen></iframe>


<p><embed type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#g4VigquCRgI" style="display:none"></embed></p>

<h3>How To Fuck It Up</h3>

<p>If you want to completely screw your users, do this:</p>

<ul>
<li>Don&#8217;t write a single documentation guide, not even one example</li>
<li>Make sure your API reference is outdated by at least 3 months</li>
<li>Claim that people who are not willing to read the code to figure out even the most basic things are stupid and should flip burgers instead</li>
</ul>


<h2>Make It Easy to Upgrade</h2>

<p>At some point, you are going to make another release of your project. This is another opportunity
to either make your users happy that they&#8217;ve gone with your library or make them furious and
waste their time.</p>

<h3>Give a Fuck About Backwards Compatibility</h3>

<p>One of the most infuriating things about software development is that moment when you upgrade a library
and hundreds of tests fail. The only thing that angers me more is when I also have to rewrite half
of my codebase because someone somewhere decided that breaking the public API without warning
is fine.</p>

<p>So, commit to maintaining backwards compatibility. Of course, you don&#8217;t have to support projects
from 15 years ago like OpenJDK does. But deprecate things before removing them and make it easy
to discover what has changed.</p>

<p>How do you do that? By keeping a change log.</p>

<h3>Have a Change Log</h3>

<p>Every once in a while, your users will upgrade (more on this later in this post). The main
questions they are going to ask themselves is</p>

<blockquote><p>What has changed in this release?</p></blockquote>

<p>and then</p>

<blockquote><p>Will my code break? Will I have to rewrite it?</p></blockquote>

<p>and finally,</p>

<blockquote><p>Will Joe the ops guy hate me for upgrading?</p></blockquote>

<p>All of these can be answered by having a <em>change log</em>. It&#8217;s like Twitter except it&#8217;s actually
useful. Here&#8217;s how it works:</p>

<ul>
<li>Every time you fix a bug, you write a brief entry to the change log</li>
<li>Every time you add a feature, you briefly mentoin it in the change log with a few code examples</li>
<li>Every time you make a breaking API change, you clearly state that <strong>in bold</strong> in the change log</li>
</ul>


<p>That&#8217;s it. There is no step 3.</p>

<p>Change logs typically use reverse chronological order. Changes are grouped by versions. If you have
multiple branches (e.g. <code>master</code> and <code>1.0.x</code>), each one has a separate change log.</p>

<p>That is all. For example, here&#8217;s <a href="https://github.com/michaelklishin/welle/blob/master/ChangeLog.md">Welle&#8217;s change log</a>.</p>

<h3>Tag Releases</h3>

<p>It&#8217;s that time again. You&#8217;ve bumped the version and about to publish artifacts. Stop and make
another thing first: tag the commit that changes the version. Without tags it will be
a royal pain to come up with a diff betwee nversions.</p>

<p>Some dependency (e.g. Bundler, Rebar) and configuration management tools can use tags
and developers will expect tags to be available.</p>

<p>Use a consistent version scheme, e.g. <code>v1.0.0-alpha1</code>, <code>v1.0.0</code>, <code>v1.1.2</code>, etc. Having
inconsistent tag names will guaratee ops people will hate your project till the end
of days.</p>

<h3>Announce Releases</h3>

<p>Next thing to do after you push a release out is to write a blog post or simply a
post to the mailing list of your project or a larger relevant mailing list
(e.g. <a href="https://groups.google.com/group/clojure">Clojure mailing list</a> or <a href="https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss">RabbitMQ Discuss</a>).</p>

<p>Make sure the subject starts with <code>ANN</code> or <code>[ANN]</code> to indicate that it is an announcement,
e.g.</p>

<blockquote><p>ANN Welle 1.5.0 is released</p></blockquote>

<p>In your announcement make it clear what the project does
and if the release is backwards-compatible or not, and link to the change log
where users can find more details. That&#8217;s it.</p>

<h3>Use Preview/Snapshot Versions For Development</h3>

<p>Ever saw a project that has the same version, e.g. <code>0.2.1</code>, for half a year? How do you
know which version is actually <code>0.2.1</code>? Is it a version in development? Did someone forget
to bump it after a release? What&#8217;s going on?</p>

<p>This is driving all developers crazy. Don&#8217;t be that person. Use preview/snapshot
versions for development and only &#8220;seal&#8221; versions when you are about to tag and cut
a release. Then <strong>immediately</strong> bump the version to development.</p>

<p>Examples of development versions:</p>

<ul>
<li><code>1.1.0.pre1</code></li>
<li><code>1.1.0-alpha1</code></li>
<li><code>1.1.0-SNAPSHOT</code> (for JVM languages)</li>
</ul>


<p>Any other development version naming scheme is confusing and will guarantee your users a bad time.</p>

<h3>How To Fuck It Up</h3>

<p>If you want to completely screw your users, do this:</p>

<ul>
<li>Break your public API randomly, ideally in subtle ways that your test suite won&#8217;t even reveal</li>
<li>Forget to bump development version</li>
<li>Never tag releases</li>
<li>Never announce releases</li>
</ul>


<h2>Use GitHub</h2>

<p>I have no affiliation with GitHub and don&#8217;t assume Git is &#8220;the best&#8221; version
control system out there. But it&#8217;s pretty good. And nearly everybody is
on GitHub these days.</p>

<p>GitHub makes several things easy:</p>

<ul>
<li>Discover your project</li>
<li>Browse and search code</li>
<li>Bring your attention to issues by filing issues or @mentioning you</li>
<li>Contribute trivial changes</li>
</ul>


<p>Maybe the most importantly, <strong>GitHub is pretty friendly to less technical people</strong>. Yes, it is,
and they are working hard on making it even better.</p>

<p>Using GitHub means you&#8217;ll have an extremely easy to use CI service: <a href="http://travis-ci.org">Travis CI</a>.</p>

<p>You will get a lot more admiration from your users if you won&#8217;t make their life
harder by asking them to deal with patches, look for your email across the
Web to report issues and clone your 300 MB repository over poor 3G just to edit
one typo.</p>

<blockquote class="twitter-tweet" lang="es"><p>@<a href="https://twitter.com/old_sound">old_sound</a> @<a href="https://twitter.com/g3rtm">g3rtm</a> bitbucket is a good service, no doubt. But people who choose it for public code are just being difficult (according to me)</p>&mdash; Michael Klishin (@michaelklishin) <a href="https://twitter.com/michaelklishin/status/293485697262833664">21 de enero de 2013</a></blockquote>


<script async src="http://blog.clojurewerkz.org//platform.twitter.com/widgets.js" charset="utf-8"></script>


<p>Don&#8217;t be difficult.</p>

<h2>Have a Place Where Users Can Get Support</h2>

<p>If your project reaches any reasonable kind of popularity, you will have to answer questions
about it. For that, set up a mailing list (a Google group will do) and if you frequent
on IRC, start a channel.</p>

<p>Think you don&#8217;t have any time? The best part about having a mailing list is that users will
quickly start helping themselves if you give them a way. So clearly indicate ways to get
support in your project&#8217;s README.</p>

<p>Search Twitter for the name of your project every so often. You will discover all kinds
of questions, criticism and praises. If you use Twitter actively, start a separate
account for your project, like we have done with <a href="http://twitter.com/clojurewerkz">@ClojureWerkz</a>.</p>

<p>It will help you build a community, learn about how people use your project and what can
be improved. Finally, it will help you find people who will be able to help maintain
your project. Not only it will save you time, it will encourage those people to spread
the word about it.</p>

<p>If you need an example, <a href="https://github.com/michaelklishin/welle#community">Welle README has a section about community and support</a>.</p>

<h3>How To Fuck It Up</h3>

<p>If you want to completely screw your users, do this:</p>

<ul>
<li>Be hip and disable issues on your GitHub repository</li>
<li>Use a contributor agreement users have to mail in paper to Tanzania</li>
<li>Insist on using patches even for one line changes to the README</li>
<li>Put your repo into Darcs even if it&#8217;s a Ruby or JavaScript or Clojure project</li>
<li>Make it hard to find where the repository is</li>
</ul>


<p>This will prevents others from contributing to your project and stealing some of the credit
from you.</p>

<h2>Pass It Over</h2>

<p>At some point you may become disinterested in maintaining your project. Maybe you&#8217;ve moved
on to a new job or no longer use your own project. Announce it on the mailing list,
ask someone to take over your project. Sooner or later, someone will help.
Being on GitHub helps with this, especially after they&#8217;ve introducted a feature
that lets you transfer repository ownership.</p>

<p>No matter what you do, don&#8217;t turn your project into abandonware. This is the most
sure way to want your current and future users to go on a kitten killing spree.</p>

<p>It&#8217;s always better to pass the project on than to make excuses later.</p>

<h3>How To Fuck It Up</h3>

<p>If you want to completely screw your users, do this:</p>

<ul>
<li>Simply stop contributing to your project and answering mailing list questions without any explanation</li>
<li>Ignore pull requests, claim they should be called something else and are not really useful</li>
<li>Claim you simply are a Get Shit Done guy who loses interest once the problem is done</li>
</ul>


<p>This will make sure your project will eventually be forked at least 300 times and an alternative
will be created because figuring out which fork has what bugs fixed will be too annoying.</p>

<h2>Final Thoughts</h2>

<p>As you can see, it is not that hard to make your project approachable. Besides documentation guides, it does not
take much to make sure your users are not mad and ops people don&#8217;t hate you.</p>

<p>Maintaining open source projects takes time and effort. But it pays off. I&#8217;ve been
<a href="https://github.com/michaelklishin">on GitHub</a> since beta and can say that few other things have brought me more professional
opportunities I&#8217;m blessed to have today than being active in the open source
community.</p>

<p>And if you are not going to make something awesome, maybe better don&#8217;t release it
in the first place.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Welle 1.5.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/19/welle-1-dot-5-0-is-released/"/>
    <updated>2013-04-19T23:23:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/19/welle-1-dot-5-0-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Welle is an expressive <a href="http://clojureriak.info">Clojure client for Riak</a> with batteries included.</p>

<p><a href="https://clojars.org/com.novemberain/welle/versions/1.5.0">1.5.0</a> is a minor release
that is <em>100% backwards-compatible</em> with <code>1.5.x</code> and introduces several nice features:</p>

<ul>
<li>Retriers for failing operations</li>
<li>Conflict resolvers</li>
<li>Easier to use update functions</li>
</ul>


<p>This version has been tested against
Riak <code>1.2.x</code> and <code>1.3.x</code>.</p>

<h2>Changes between Welle 1.4.0 and 1.5.0</h2>

<h3>clojurewerkz.welle.kv/modify</h3>

<p><code>clojurewerkz.welle.kv/modify</code> is a new function that combines <code>clojurewerkz.welle.kv/fetch</code> and
<code>clojurewerkz.welle.kv/store</code> with a user-provided mutation functions. The mutation function
should take a single Riak object as an immutable map and return a modified one.</p>

<p>In case of siblings, a resolver should be used.</p>

<p><code>clojurewerkz.welle.kv/modify</code> will update modification timestamp of the object.</p>

<p><code>clojurewerkz.welle.kv/modify</code> takes the same options as <code>clojurewerkz.welle.kv/fetch</code> and
<code>clojurewerkz.welle.kv/store</code></p>

<h3>Conflcit Resolvers</h3>

<p><code>clojurewerkz.welle.kv/fetch</code>, and <code>clojurewerkz.welle.kv/store</code> now accept a new
option: <code>:resolver</code>. Resolvers are basically pure functions that take a collection of
siblings and return a collection of Riak object maps.</p>

<p>Resolvers can be created using
<code>clojurewerkz.welle.conversion/resolver-from</code> which takes a function that accepts a collection
of deserialized (unless <code>fetch</code> was told otherwise) values and applies any conflict resolution
logic necessary.</p>

<p><code>clojurewerkz.welle.kv/fetch-one</code> now also supports resolvers via the <code>:resolver</code> option.
It will raise an exception if siblings are detected and no resolver is provided.</p>

<h3>Retriers</h3>

<p><code>clojurewerkz.welle.kv/fetch</code>, <code>clojurewerkz.welle.kv/fetch-one</code>, <code>clojurewerkz.welle.kv/store</code>,
<code>clojurewerkz.welle.kv/delete</code>, and <code>clojurewerkz.welle.kv/index-query</code> now retry operations
that fail due to a network issue or any other exception.</p>

<p>By default, the operations will be retrier 3 times. It is possible to provide a custom
retrier using the <code>:retrier</code> option. Retriers can be created using
<code>clojurewerkz.welle.conversion/retrier-from</code> which takes a function that accepts a callable
(an operation that may need to be retried) and needs to invoke it, handling exceptions
and applying any retrying logic needed.</p>

<p><code>clojurewerkz.welle.conversion/counting-retrier</code> produces a retrier that will retry an operation
given number of times. This is the kind of retrier Welle uses by default.</p>

<h3>Skipping Deserialization for clojurewerkz.welle.kv/fetch</h3>

<p><code>clojurewerkz.welle.kv/fetch</code> supports a new boolean option <code>:skip-deserialize</code> that allows
automatic deserialization to be skipped.</p>

<p>Contributed by Jonas Tehler.</p>

<h3>Clojure 1.5 By Default</h3>

<p>Welle now depends on <code>org.clojure/clojure</code> version <code>1.5.1</code>. It is
still compatible with Clojure 1.3+ and if your <code>project.clj</code> depends
on a different version, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement
for the majority of projects out there.</p>

<h2>Change Log</h2>

<p>We recommend all users to upgrade to <a href="https://clojars.org/com.novemberain/welle/versions/1.5.0">1.5.0</a> a try.</p>

<p><a href="https://github.com/michaelklishin/welle/blob/master/ChangeLog.md">Welle change log</a> is available on GitHub.</p>

<h2>Welle is a ClojureWerkz Project</h2>

<p><a href="http://clojureriak.info">Welle</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a feature rich idiomatic Clojure client for the Neo4J REST API</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Welle, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<h2>Donations</h2>

<p>ClojureWerkz <a href="http://clojurewerkz.org/articles/donate.html">accepts donations</a>. If you feel like our projects save you time, consider donating. Thanks.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[What's Going on With Titanium]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/17/whats-going-on-with-titanium/"/>
    <updated>2013-04-17T21:17:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/17/whats-going-on-with-titanium</id>
    <content type="html"><![CDATA[<p>After we <a href="http://blog.clojurewerkz.org/blog/2013/02/11/introducing-titanium/">announced Titanium</a>, our Clojure library on top of <a href="http://titan.thinkaurelius.com">Titan</a>, back in mid-February, there hasn&#8217;t been
much activity related to it. Let us explain what&#8217;s going on with it and where the project is headed.</p>

<h2>Joining Forces With Zack Maril</h2>

<p>Titanium wasn&#8217;t the only Titan-related Clojure project on the block. <a href="http://twitter.com/zackmaril">Zack Maril</a> has been working on another project called
Hermes for a while. Then Zack <a href="https://groups.google.com/forum/?fromgroups#!searchin/gremlin-users/Ogre/gremlin-users/Del9DasqBcE/5uQEYXdLPc0J">released Ogre</a>, a Clojure library for querying <a href="http://tinkerpop.com">Blueprints graphs</a>.</p>

<p>Titanium and Hermes were largely solving the same problem and after
discussing it for some time, we decided to join forces with Zack and
continue working together on
Titanium. <a href="http://ogre.clojurewerkz.org">Ogre</a> and
<a href="https://github.com/clojurewerkz/archimedes">Archimedes</a> are now
ClojureWerkz projects and Titanium <code>1.0.0-beta1</code>, which will be
shipped after the docs are finalized, will be based on them.</p>

<p>We would like to thank Zack for considering joining the team and all the work he has been doing on Titanium, Ogre and
Archimedes in the last few weeks. You should follow him <a href="http://twitter.com/zackmaril">on Twitter</a> and <a href="http://github.com/zmaril">GitHub</a>.</p>

<h2>Upgrading to Titan 0.3</h2>

<p>Titan is actively being worked on. In <a href="https://groups.google.com/forum/#!topic/aureliusgraphs/vlRg0ey735g">version 0.3</a>, Titan introduces several breaking API changes and new features
such as</p>

<ul>
<li>Full text search (indexing)</li>
<li>Better caching layer</li>
<li>Lots of optimizations</li>
<li>Properties on vertices can have properties on them which is very useful for version, timestamping, etc</li>
</ul>


<p>Titanium closely follows these developments. This also means that
<code>beta1</code> will introduce quite a few breaking API changes over <code>alpha2</code>. Fortunately, the earlier in project
history we do these changes, the easier it will be for Titanium users.</p>

<h2>Improving Documentation</h2>

<p>Taking Titanium <code>1.0.0-beta1</code> included a major documentation overhaul to adapt to the Titan 0.3 changes. In addition,
we are porting Ogre documentation to our <a href="https://github.com/clojurewerkz/docslate">standard documentation site template</a> and keep expanding the docs.</p>

<p>It&#8217;s not a ClojureWerkz project if it is not documented well!</p>

<h2>How To Follow The Development</h2>

<p><a href="https://github.com/clojurewerkz/titanium">Titanium</a>, <a href="https://github.com/clojurewerkz/ogre">Ogre</a> and <a href="https://github.com/clojurewerkz/archimedes">Archimedes</a> are all available on GitHub.</p>

<p>If you have questions about these libraries, feel free to ask on the <a href="https://groups.google.com/group/aureliusgraphs">Titan mailing list</a> or <a href="https://groups.google.com/group/clojure-titanium">Titanium&#8217;s own mailing list</a>.</p>

<h2>Titanium is a ClojureWerkz Project</h2>

<p>Titanium is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

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


<p>and several others. If you like Titanium, you may also like <a href="http://clojurewerkz.org">our other projects</a>. We also <a href="http://clojurewerkz.org/articles/donate.html">accept donations</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ClojureWerkz now accepts donations]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/17/clojurewerkz-now-accepts-donations/"/>
    <updated>2013-04-17T20:53:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/17/clojurewerkz-now-accepts-donations</id>
    <content type="html"><![CDATA[<h2>Accepting Donations</h2>

<p>ClojureWerkz was started in mid-2011 because we were frustrated with a
couple of database and messaging libraries that were very popular in
the Clojure community at the time. We were also frustrated with the
&#8220;culture&#8221; of not documenting projects. So developed <a href="http://clojurerabbitmq.info">a
library</a> the way we wanted. Then <a href="http://clojuremongodb.info">another
one</a>. And <a href="http://clojureriak.info">another
one</a>.  Today, we find ourselves with dozens
of projects that keep moving and have enough users to require us do
some support. All of this is both exciting and time consuming. In
2011, the core team that did most of the development was 2 people. In
2013, it is 3 people: <a href="http://twitter.com/michaelklishin">Michael</a>,
<a href="http://twitter.com/ifesdjeen">Alex</a>, <a href="http://twitter.com/zackmaril">Zack
Maril</a>.</p>

<p>From time to time, we get the question: is it possible to donate to
the project?  Today we are happy to report that we have first two
donation options ready to be announced. That&#8217;s right: now you can
donate to ClojureWerkz.</p>

<h2>How to Donate</h2>

<h3>PayPal</h3>

<p>The easiest way to donate is with PayPal: <code>donate@clojurewerkz.org</code>.</p>

<h3>Bitcoin</h3>

<p>Our Bitcoin wallet is <code>1PpoesdZ4XfP9AacFFFvseWEN8jfiChBmH</code>.</p>

<h2>Why Donate</h2>

<p>Over years, we&#8217;ve developed and open sourced <a href="http://clojurewerkz.org">dozens of Clojure
libraries</a>. It took time to develop and
document them (as a benchmark: <a href="http://clojureelasticsearch.info">Elastisch
documentation</a> took solidly more
than 100 hours alone).  Some of them are known to be best in their
class in the Clojure community.</p>

<p>In addition, we continue to maintain and improve them. This also takes
time. By donating you help the core team justify spending all this
time on open source software and help make the Clojure community a
better place, both in terms of solid libraries available and spreading
the culture of documenting and maintaining libraries well.</p>

<h2>Get In Touch</h2>

<p>If you have any questions about donations, please contact us as <code>donate@clojurewerkz.org</code>.</p>

<h2>FAQ</h2>

<h3>Why Only These Limited Options?</h3>

<p>Services such as GitTip do not work with banks in most countries. PayPal does not let residents
of some countries accept payments. Stripe requires you to set up a company or foundation before
you can accept card payments: this is something we are not yet ready to do.</p>

<p>In the end, the combination of popularity of PayPal and ease of accepting donations in Bitcoin
strike the right balance for us for now.</p>

<h3>What Will The Money Go To?</h3>

<p>Maintaining our existing libraries and their docs, developing new ones.</p>

<h3>How Much Should I Donate?</h3>

<p>It&#8217;s up to you. We can give you a rule of thumb: if you use one or more of our libraries,
chances are, it&#8217;s saved you at least one hour of time. So consider donating the amount you charge
for 1 hour.</p>

<h3>Can I Fund Development of a New Clojure Library?</h3>

<p>Please contact us as <code>donate@clojurewerkz.org</code> and we will try to work something out. We have only
<strong>one requirement</strong>: we are not based in North America and will not travel in order to develop the project.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or <a href="mailto:donate@clojurewerkz.org">via email</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Money 1.2.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/11/money-1-dot-2-0-is-released/"/>
    <updated>2013-04-11T18:38:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/11/money-1-dot-2-0-is-released</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/clojurewerkz/money">Money</a> is a Clojure library that deals with monetary amounts
and currencies, built on top of <a href="http://joda-money.sourceforge.net/">Joda Money</a>.</p>

<p><code>1.2.0</code> is a minor release that has no breaking API changes and contains
support for additional currencies.</p>

<h2>Changes between Money 1.1.0 and 1.2.0</h2>

<p>ClojureWerkz Money now provides a list of additional currencies
on top of the default Joda Money currency provider. Right now
the only additional currency is BTC (Bitcoin).</p>

<h2>Change Log</h2>

<p><a href="https://github.com/clojurewerkz/money/blob/master/ChangeLog.md">Money change log</a> is available on GitHub.</p>

<h2>Money is a ClojureWerkz Project</h2>

<p><a href="https://github.com/clojurewerkz/money">Money</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

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


<p>and several others. If you like Money, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Money 1.1.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/08/money-1-dot-1-0-is-released/"/>
    <updated>2013-04-08T22:06:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/08/money-1-dot-1-0-is-released</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/clojurewerkz/money">Money</a> is a Clojure library that deals with monetary amounts
and currencies, built on top of <a href="http://joda-money.sourceforge.net/">Joda Money</a>.</p>

<p><code>1.1.0</code> is a minor release that contains <strong>one breaking API change</strong>, contains
minor improvements and upgrades dependencies.</p>

<h2>Changes between Money 1.0.0 and 1.1.0</h2>

<h3>Comparison Functions</h3>

<p>It is possible to compare monetary amounts using >, >=, &lt; and &lt;=.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.money.amounts</span>    <span class="ss">:as</span> <span class="nv">ma</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.money.currencies</span> <span class="ss">:as</span> <span class="nv">mc</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">ma/&lt;</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">)</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">))</span>
</span><span class='line'><span class="c1">;= false</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">ma/&lt;=</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">)</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">)</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">120</span><span class="p">))</span>
</span><span class='line'><span class="c1">;= true</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">ma/&gt;=</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">)</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">)</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">120</span><span class="p">))</span>
</span><span class='line'><span class="c1">;= false</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">ma/&gt;</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">200</span><span class="p">)</span> <span class="p">(</span><span class="nf">ma/amount-of</span> <span class="nv">mc/USD</span> <span class="mi">100</span><span class="p">))</span>
</span><span class='line'><span class="c1">;= true</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Ben Poweski.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/clojurewerkz/money/blob/master/ChangeLog.md">Money change log</a> is available on GitHub.</p>

<h2>Money is a ClojureWerkz Project</h2>

<p><a href="https://github.com/clojurewerkz/money">Money</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

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


<p>and several others. If you like Money, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing ClojureWerkz Money]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/04/02/introducing-clojurewerkz-money/"/>
    <updated>2013-04-02T01:27:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/04/02/introducing-clojurewerkz-money</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p><a href="https://github.com/clojurewerkz/money">ClojureWerkz Money</a> is a tiny Clojure library for working with money and currencies.
It is built on top of <a href="http://joda-money.sourceforge.net/">Joda Money</a>. Money is small, easy to use,
integrates with <a href="http://clojuremongodb.info">Monger</a> and Cheshire.</p>

<h2>Money, Money, Money</h2>

<p>Many ClojureWerkz projects take advantage of existing mature JVM libraries. Today we introduce another
library to this club: <a href="https://github.com/clojurewerkz/money">Money</a>. Money is a very thin layer on top of <a href="http://joda-money.sourceforge.net">Joda Money</a>, an excellent
money library from the creator of Joda Time.</p>

<h2>What&#8217;s In The Box</h2>

<ul>
<li>Operations on monetary amounts (add, substract, multiply, divide, negate, etc)</li>
<li>Conversion between currencies</li>
<li>Support for multiple rounding modes</li>
<li>Parsing of strings (e.g. <code>USD 20</code>)</li>
<li>Currency unit looks by ISO-4217 code and country</li>
<li><a href="https://github.com/dakrone/cheshire">Cheshire</a> integration</li>
<li><a href="http://clojuremongodb.info">Monger</a> integration</li>
</ul>


<h2>Documentation</h2>

<p>Money is a small library and all of its <a href="https://github.com/clojurewerkz/money#documentation">documentation guide fits in the README</a>.</p>

<h2>Supported Clojure Versions</h2>

<p>Money supports Clojure 1.4+.</p>

<h2>News and Updates</h2>

<p>New releases and updates are announced <a href="http://twitter.com/clojurewerkz">on Twitter</a>.</p>

<h2>Money is a ClojureWerkz Project</h2>

<p>Money is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

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


<p>and several others. If you like Money, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://twitter.com/clojurewerkz">ClojureWerkz Team</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quartzite 1.1.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/03/30/quartzite-1-dot-1-0-is-released/"/>
    <updated>2013-03-30T00:49:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/03/30/quartzite-1-dot-1-0-is-released</id>
    <content type="html"><![CDATA[<p><a href="http://clojurequartz.info">Quartzite</a> is a Clojure DSL on top of the Quartz scheduler.</p>

<p><code>1.1.0</code> is a minor release that contains <strong>one breaking API change</strong>, contains
minor improvements and upgrades dependencies.</p>

<h2>Changes between Quartzite 1.0.0 and 1.1.0</h2>

<p><code>1.1.x</code> has one <strong>breaking API change</strong> in how it converts job context
maps to <code>JobDetailContext</code> in Quartz.</p>

<h3>clj-time upgraded to 0.5.0</h3>

<p><a href="https://github.com/seancorfield/clj-time">clj-time</a> dependency has been upgraded to version 0.5.0, uses
<a href="https://github.com/JodaOrg/joda-time/blob/master/RELEASE-NOTES.txt">Joda Time 2.2</a>.</p>

<p><code>clojurewerkz.quartzite.date-time</code> functions were pushed upstream to <code>clj-time</code>, find them in
<code>clj-time.core</code> and <code>clj-time.periodic</code>.</p>

<p><code>clojurewerkz.quartzite.date-time</code> will be <strong>removed</strong> from Quartzite in the release following
<code>1.1.0</code>.</p>

<h3>Stringified Keys in JobDetailContext</h3>

<p>Quartzite will now stringify all keys in Clojure maps converted to job detail context
instances. This is due to the fact that some Quartz internals implicitly assume JobDetailContext
keys are always strings.</p>

<h3>Clojure 1.5 By Default</h3>

<p>Quartzite now depends on <code>org.clojure/clojure</code> version <code>1.5.1</code>. It is
still compatible with Clojure 1.3+ and if your <code>project.clj</code> depends on
a different version, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement
for the majority of projects out there.</p>

<h2>Change Log</h2>

<p><a href="https://github.com/michaelklishin/quartzite/blob/master/ChangeLog.md">Quartzite change log</a> is available on GitHub.</p>

<h2>Quartzite is a ClojureWerkz Project</h2>

<p><a href="http://clojurequartz.info">Quartzite</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB driver for a more civilized age</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
</ul>


<p>and several others. If you like Quartzite, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Monger 1.5.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/03/30/monger-1-dot-5-0-is-released/"/>
    <updated>2013-03-30T00:34:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/03/30/monger-1-dot-5-0-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Monger is an idiomatic <a href="http://clojuremongodb.info">Clojure MongoDB driver</a> for a more civilized age.
It has batteries included, offers powerful expressive query DSL, strives to support every MongoDB 2.0+ feature and has sane defaults.
It also has <a href="http://clojuremongodb.info">solid documentation</a>.</p>

<p><code>1.5.0</code> is a minor <em>completely backwards-compatible</em> release that includes updated
dependencies, MongoDB 2.4&#8217;s full text search support and various minor improvements.</p>

<h3>Full Text Search Support</h3>

<p>Full text search in MongoDB 2.4 can be used via commands but Monger 1.5 also provides
convenience functions in the <code>monger.search</code> namespace:</p>

<ul>
<li><code>monger.search/search</code> for performing queries</li>
<li><code>monger.search/results-from</code> for obtaining hit documents sorted by score</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">monger.collection</span> <span class="ss">:as</span> <span class="nv">mc</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">monger.search</span>     <span class="ss">:as</span> <span class="nv">ms</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">mc/ensure-index</span> <span class="nv">coll</span> <span class="p">{</span><span class="ss">:subject</span> <span class="s">&quot;text&quot;</span> <span class="ss">:content</span> <span class="s">&quot;text&quot;</span><span class="p">})</span>
</span><span class='line'><span class="p">(</span><span class="nf">mc/insert</span> <span class="nv">coll</span> <span class="p">{</span><span class="ss">:subject</span> <span class="s">&quot;hello there&quot;</span> <span class="ss">:content</span> <span class="s">&quot;this should be searchable&quot;</span><span class="p">})</span>
</span><span class='line'><span class="p">(</span><span class="nf">mc/insert</span> <span class="nv">coll</span> <span class="p">{</span><span class="ss">:subject</span> <span class="s">&quot;untitled&quot;</span> <span class="ss">:content</span> <span class="s">&quot;this is just noize&quot;</span><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nb">println </span><span class="p">(</span><span class="nf">ms/results-from</span> <span class="p">(</span><span class="nf">ms/search</span> <span class="nv">coll</span> <span class="s">&quot;hello&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<h3>MongoDB Java Driver Update</h3>

<p>MongoDB Java driver dependency has been <a href="https://github.com/mongodb/mongo-java-driver/wiki/Release-Notes">updated to 2.11.0</a>.</p>

<h3>New Geospatial Operators</h3>

<p><code>monger.operators</code> now defines a few more operators for convenience:</p>

<ul>
<li><code>$getWithin</code></li>
<li><code>$getIntersects</code></li>
<li><code>$near</code></li>
</ul>


<p>Of course, these and any other new operators can be passed as strings (e.g. <code>"$near"</code>)
as well.</p>

<h3>monger.core/admin-db</h3>

<p><code>monger.core/admin-db</code> is a new convenience function that returns the <code>admin</code> database
reference.</p>

<h3>monger.command/admin-command</h3>

<p><code>monger.command/admin-command</code> is a new convenience function for running commands
on the <code>admin</code> database.</p>

<h3>monger.core/mongo-options Updates</h3>

<p><code>monger.core/mongo-options</code> options are now up-to-date with the most recent
MongoDB Java driver.</p>

<h3>Factory DSL Is Gone</h3>

<p>Monger&#8217;s factory DSL (an undocumented experimental feature) has been removed from <code>monger.testkit</code>. It did
not work as well as we expected and there are better alternatives available now.</p>

<h3>Clojure 1.5 By Default</h3>

<p>Monger now depends on <code>org.clojure/clojure</code> version <code>1.5.1</code>. It is still compatible with Clojure 1.3+ and if your <code>project.clj</code> depends
on a different version, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement for the majority of projects out there.</p>

<h3>Authentication On Default Database</h3>

<p><code>monger.core/authenticate</code> now has a 2-arity version that will authenticate
on the default database:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">username</span> <span class="s">&quot;myservice&quot;</span>
</span><span class='line'>      <span class="nv">pwd</span>      <span class="s">&quot;LGo5h#B`cTRQ&gt;28tba6u&quot;</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">monger.core/use-db!</span> <span class="s">&quot;mydb&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="c1">;; authenticates requests for mydb</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">monger.core/authenticate</span> <span class="nv">username</span> <span class="p">(</span><span class="nf">.toCharArray</span> <span class="nv">pwd</span><span class="p">)))</span>
</span></code></pre></td></tr></table></div></figure>


<h3>ClojureWerkz Support Upgrade</h3>

<p>ClojureWerkz Support dependency has been updated to version <code>0.15.0</code>.
This means Monger now will use Cheshire <code>5.0.x</code>.</p>

<h3>Explicit DBCursor Closure by monger.collection/find-maps and the like</h3>

<p><code>monger.collection/find-maps</code> and the like will now explicitly close DB cursors.</p>

<p>GH issue: 47</p>

<h2>Change Log</h2>

<p><a href="https://github.com/michaelklishin/monger/blob/master/ChangeLog.md">Monger change log</a> is available on GitHub.</p>

<h2>Monger is a ClojureWerkz Project</h2>

<p><a href="http://clojuremongodb.info">Monger</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Monger, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Monger 1.5.0-rc1 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/03/21/monger-1-dot-5-0-rc1-is-released/"/>
    <updated>2013-03-21T02:02:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/03/21/monger-1-dot-5-0-rc1-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Monger is an idiomatic <a href="http://clojuremongodb.info">Clojure MongoDB driver</a> for a more civilized age.
It has batteries included, offers powerful expressive query DSL, strives to support every MongoDB 2.0+ feature and has sane defaults.
It also has <a href="http://clojuremongodb.info">solid documentation</a>.</p>

<p><code>1.5.0</code> is a minor <em>completely backwards-compatible</em> release that includes updated
dependencies, MongoDB 2.4&#8217;s full text search support and various minor improvements.</p>

<h3>Full Text Search Support</h3>

<p>Full text search in MongoDB 2.4 can be used via commands but Monger 1.5 also provides
convenience functions in the <code>monger.search</code> namespace:</p>

<ul>
<li><code>monger.search/search</code> for performing queries</li>
<li><code>monger.search/results-from</code> for obtaining hit documents sorted by score</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">monger.collection</span> <span class="ss">:as</span> <span class="nv">mc</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">monger.search</span>     <span class="ss">:as</span> <span class="nv">ms</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">mc/ensure-index</span> <span class="nv">coll</span> <span class="p">{</span><span class="ss">:subject</span> <span class="s">&quot;text&quot;</span> <span class="ss">:content</span> <span class="s">&quot;text&quot;</span><span class="p">})</span>
</span><span class='line'><span class="p">(</span><span class="nf">mc/insert</span> <span class="nv">coll</span> <span class="p">{</span><span class="ss">:subject</span> <span class="s">&quot;hello there&quot;</span> <span class="ss">:content</span> <span class="s">&quot;this should be searchable&quot;</span><span class="p">})</span>
</span><span class='line'><span class="p">(</span><span class="nf">mc/insert</span> <span class="nv">coll</span> <span class="p">{</span><span class="ss">:subject</span> <span class="s">&quot;untitled&quot;</span> <span class="ss">:content</span> <span class="s">&quot;this is just noize&quot;</span><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nb">println </span><span class="p">(</span><span class="nf">ms/results-from</span> <span class="p">(</span><span class="nf">ms/search</span> <span class="nv">coll</span> <span class="s">&quot;hello&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<h3>MongoDB Java Driver Update</h3>

<p>MongoDB Java driver dependency has been <a href="https://github.com/mongodb/mongo-java-driver/wiki/Release-Notes">updated to 2.11.0</a>.</p>

<h3>New Geospatial Operators</h3>

<p><code>monger.operators</code> now defines a few more operators for convenience:</p>

<ul>
<li><code>$getWithin</code></li>
<li><code>$getIntersects</code></li>
<li><code>$near</code></li>
</ul>


<p>Of course, these and any other new operators can be passed as strings (e.g. <code>"$near"</code>)
as well.</p>

<h3>monger.core/admin-db</h3>

<p><code>monger.core/admin-db</code> is a new convenience function that returns the <code>admin</code> database
reference.</p>

<h3>monger.command/admin-command</h3>

<p><code>monger.command/admin-command</code> is a new convenience function for running commands
on the <code>admin</code> database.</p>

<h3>monger.core/mongo-options Updates</h3>

<p><code>monger.core/mongo-options</code> options are now up-to-date with the most recent
MongoDB Java driver.</p>

<h3>Factory DSL Is Gone</h3>

<p>Monger&#8217;s factory DSL (an undocumented experimental feature) has been removed from <code>monger.testkit</code>. It did
not work as well as we expected and there are better alternatives available now.</p>

<h3>Clojure 1.5 By Default</h3>

<p>Monger now depends on <code>org.clojure/clojure</code> version <code>1.5.1</code>. It is still compatible with Clojure 1.3+ and if your <code>project.clj</code> depends
on a different version, it will be used, but 1.5 is the default now.</p>

<p>We encourage all users to upgrade to 1.5, it is a drop-in replacement for the majority of projects out there.</p>

<h3>Authentication On Default Database</h3>

<p><code>monger.core/authenticate</code> now has a 2-arity version that will authenticate
on the default database:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">username</span> <span class="s">&quot;myservice&quot;</span>
</span><span class='line'>      <span class="nv">pwd</span>      <span class="s">&quot;LGo5h#B`cTRQ&gt;28tba6u&quot;</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">monger.core/use-db!</span> <span class="s">&quot;mydb&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="c1">;; authenticates requests for mydb</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">monger.core/authenticate</span> <span class="nv">username</span> <span class="p">(</span><span class="nf">.toCharArray</span> <span class="nv">pwd</span><span class="p">)))</span>
</span></code></pre></td></tr></table></div></figure>


<h3>ClojureWerkz Support Upgrade</h3>

<p>ClojureWerkz Support dependency has been updated to version <code>0.15.0</code>.
This means Monger now will use Cheshire <code>5.0.x</code>.</p>

<h3>Explicit DBCursor Closure by monger.collection/find-maps and the like</h3>

<p><code>monger.collection/find-maps</code> and the like will now explicitly close DB cursors.</p>

<p>GH issue: 47</p>

<h2>Change Log</h2>

<p><a href="https://github.com/michaelklishin/monger/blob/master/ChangeLog.md">Monger change log</a> is available on GitHub.</p>

<h2>Monger is a ClojureWerkz Project</h2>

<p><a href="http://clojuremongodb.info">Monger</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://clojureneo4j.info">Neocons</a>, a client for the Neo4J REST API</li>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Monger, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">@michaelklishin</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Future of Neocons]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/03/16/the-future-of-neocons/"/>
    <updated>2013-03-16T22:32:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/03/16/the-future-of-neocons</id>
    <content type="html"><![CDATA[<h2>A Bit of History</h2>

<p><a href="http://clojureneo4j.info">Neocons</a> was started in late 2011 because there was no
Clojure client for Neo4J Server that we were happy with.</p>

<p>Neocons reached <code>1.0</code> in July 2012. Thanks to <a href="http://clojureneo4j.info">solid documentation</a>,
it quickly gathered several users besides its original developers and was generally
well received.</p>

<p>Ever since then people contributed ideas, bug fixes and features. Neocons moved in small
steps and we tried hard to keep things backwards-compatible. <code>1.1</code> was released in March 2013
and (as far as we know) is a drop-in replacement for <code>1.0.x</code>.</p>

<p>This incremental releases philosophy is appreciated by the Clojure community. Clojure
itself does not try to pack features as fast as possible. Many things are introduced
into the language literally years after they were first discussed. This is a good thing
and that&#8217;s why so many codebases can go from <code>1.3</code> to <code>1.4</code> and then to <code>1.5</code> without
any changes.</p>

<p>However, every once in a while you need to have some freedom to make sweeping changes.</p>

<h2>Looking To The Future</h2>

<p>Not so long ago a little birdie told us about what&#8217;s coming in Neo4J Server 2.0. We cannot
share it in this post but it is nice and may require breaking API changes in client
libraries. That&#8217;s why the next non-bugfix release of Neocons will be <code>2.0</code>.</p>

<p>It will target Neo4J Server <code>2.0</code>. For <code>1.1</code>, we wanted to move most of the code
to use the <a href="http://docs.neo4j.org/chunked/stable/cypher-query-lang.html">Cypher language</a>. Unfortunately, Cypher still has several limitations
(<a href="https://github.com/neo4j/neo4j/issues/340">one example</a>) that do not let us do that. But it is still a good idea and we will
try to get there with <code>2.0</code>.</p>

<h2>What Does It Mean For You?</h2>

<p>We will try to keep Neocons <code>2.0</code> backwards compatible if we can. ClojureWerkz
maintainers care about backwards compatibility and hate changes app code for no
good reason as much as you do.</p>

<p>However, there&#8217;s always a possibility that the awesome Neo4J team will pack <code>2.0</code>
with features so sweet, we will have to re-focus the library around them.</p>

<p>Time will tell!</p>

<h2>Neocons is a ClojureWerkz Project</h2>

<p><a href="http://clojureneo4j.info">Neocons</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Neocons, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Neocons 1.1.0 is released]]></title>
    <link href="http://blog.clojurewerkz.org/blog/2013/03/16/neocons-1-dot-1-0-is-released/"/>
    <updated>2013-03-16T22:26:00+04:00</updated>
    <id>http://blog.clojurewerkz.org/blog/2013/03/16/neocons-1-dot-1-0-is-released</id>
    <content type="html"><![CDATA[<h2>TL;DR</h2>

<p>Neocons is a feature rich idiomatic <a href="http://clojureneo4j.info">Clojure client for the Neo4J REST API</a>.</p>

<p><code>1.1.0</code> is a minor release that includes several minor improvements and
bug fixes and is <em>100% backwards-compatible</em> with <code>1.0.x</code>.</p>

<p>Next release of Neocons will be <code>2.0</code>. It will target development of Neo4J
2.0 closely and may include breaking API changes.</p>

<h2>Changes between Neocons 1.0.x and 1.1.0</h2>

<h3>ClojureWerkz Support Upgrade</h3>

<p>Neocons now uses ClojureWerkz Support 0.15.0.</p>

<h3>Correct URI Path Encoding</h3>

<p>Neocons now correctly encodes all parts of URIs, which means
index keys and values can contain whitespace and Unicode
characters, for example.</p>

<p>Keys with colons are now handled correctly (as of Urly <code>2.0.0-alpha5</code>).</p>

<p>GH issue: #20</p>

<h3>clj-http Upgrade</h3>

<p>Neocons now uses clj-http 0.6.4.</p>

<h3>clojurewerkz.neocons.rest.relationship/maybe-create Now Fully Supports Ids</h3>

<p><code>clojurewerkz.neocons.rest.relationship/maybe-create</code> now correctly works with node ids
as well as <code>Node</code> records.</p>

<p>GH issue: #19.</p>

<h3>More Informative Exceptions</h3>

<p>HTTP exceptions bubbling up now will carry more information (namely the response <code>:body</code>).</p>

<p>Contributed by Adrian Gruntkowski.</p>

<h3>clojurewerkz.neocons.rest.relationships/get-many</h3>

<p><code>clojurewerkz.neocons.rest.relationships/get-many</code> is a new function that fetches multiple relationships
by id in a single request:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='clojure'><span class='line'><span class="p">(</span><span class="nf">require</span> <span class="o">&#39;</span><span class="p">[</span><span class="nv">clojurewerkz.neocons.rest.relationships</span> <span class="ss">:as</span> <span class="nv">rel</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">rel/get-many</span> <span class="p">[</span><span class="nv">id1</span> <span class="nv">id2</span> <span class="nv">id3</span><span class="p">])</span>
</span></code></pre></td></tr></table></div></figure>


<p>Contributed by Adrian Gruntkowski.</p>

<h3>Initial Spatial Plugin Support</h3>

<p>Neocons now has initial support for the Neo4J Spatial plugin in the <code>clojurewerkz.neocons.spatial</code>
namespace.</p>

<p>Contributed by Kyle Goodwin.</p>

<h3>Cheshire For JSON Serliazation</h3>

<p>Neocons now uses (and depends on) <a href="https://github.com/dakrone/cheshire">Cheshire</a> for JSON serialization.
<a href="https://github.com/clojure/data.json">clojure.data.json</a> is no longer a dependency.</p>

<h3>Pass Configuration When Creating Node Indexes</h3>

<p><code>clojurewerkz.neocons.rest.nodes/create-index</code> now correctly passes index configuration
to Neo4J Server. Reported in #6.</p>

<h2>Change Log</h2>

<p>We recommend all users to upgrade to <a href="https://clojars.org/clojurewerkz/neocons/versions/1.1.0">1.1.0</a> a try.</p>

<p><a href="https://github.com/michaelklishin/neocons/blob/master/ChangeLog.md">Neocons change log</a> is available on GitHub.</p>

<h2>Neocons is a ClojureWerkz Project</h2>

<p><a href="http://clojureneo4j.info">Neocons</a> is part of the <a href="http://clojurewerkz.org">group of libraries known as ClojureWerkz</a>, together with</p>

<ul>
<li><a href="http://clojurerabbitmq.info">Langohr</a>, a Clojure client for RabbitMQ that embraces the AMQP 0.9.1 model</li>
<li><a href="http://clojureelasticsearch.info">Elastisch</a>, a minimalistic Clojure client for ElasticSearch</li>
<li><a href="http://clojuremongodb.info">Monger</a>, a Clojure MongoDB client for a more civilized age</li>
<li><a href="http://clojureriak.info">Welle</a>, a Riak client with batteries included</li>
<li><a href="http://clojurequartz.info">Quartzite</a>, a powerful scheduling library</li>
</ul>


<p>and several others. If you like Neocons, you may also like <a href="http://clojurewerkz.org">our other projects</a>.</p>

<p>Let us know what you think <a href="http://twitter.com/clojurewerkz">on Twitter</a> or on the <a href="https://groups.google.com/group/clojure">Clojure mailing list</a>.</p>

<p><a href="http://twitter.com/michaelklishin">Michael</a> on behalf of the <a href="http://clojurewerkz.org">ClojureWerkz</a> Team</p>
]]></content>
  </entry>
  
</feed>
