<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
  <title>Cloudant Blog</title>
  <link href="http://blog.cloudant.com/" />
  
  <updated>2012-08-07T11:07:58-07:00</updated>
  <id>http://blog.cloudant.com/</id>
  <author>
    <name>Cloudant</name>
    <email>info@cloudant.com</email>
  </author>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/cloudant" /><feedburner:info uri="cloudant" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <id>http://blog.cloudant.com/search-2.0</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/jjg6ddlJkw8/search-2.0" />
    <title type="html">Search 2.0</title>
    <updated>2012-08-06T00:00:00-07:00</updated>
    <author>
      <name>Robert Newson</name>
    </author>
    <content type="html">&lt;h1 id='background'&gt;Background&lt;/h1&gt;

&lt;p&gt;Before I joined Cloudant, I worked in what we now simply call &amp;#8220;Enterprise&amp;#8221;. Not, you understand, the one where you go into space and meet aliens (and maybe learn a little about the human condition) but the other one, where you go into meetings and meet managers (and learn a lot about the human condition). It was there that I first encountered Lucene.&lt;/p&gt;

&lt;p&gt;This was before the days of Solr, and way before the days of Elastic Search, a time when a Lucene index was an island, entire of itself. I was involved in building a proprietary clustered search platform and saw up close just how difficult that can be. Later, I was searching for some foundational technology to build a distributed archival system, having failed to create one of my own (a few times). Happily, this was around the dawn of &amp;#8220;NoSQL&amp;#8221;, as we no longer call it, and I found CouchDB. This database made so many good decisions that I was able to overlook that it was written in some arcane language I&amp;#8217;d never heard of. I had already come to value the crash-only mentality that CouchDB enforces (tragically, by building a complicated system with elaborate and brittle shutdown code) as well as the append-only nature of disk writes and the all-in-one file format. The degree to which CouchDB&amp;#8217;s API anticipates clustering was considerable too (albeit incomplete).&lt;/p&gt;

&lt;p&gt;I could use this to build what I needed. To cut a long and winding story short, I didn&amp;#8217;t. I joined Cloudant instead, who already had.&lt;/p&gt;

&lt;p&gt;Before that, however, I had become an active CouchDB contributor and, a little later, a committer and community member. Further, I felt there was a gap that I was well-positioned to fill; the ability to index CouchDB databases with Lucene. This project, with the remarkably bland name, is, of course, &lt;a href='https://github.com/rnewson/couchdb-lucene'&gt;couchdb-lucene&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id='search_10'&gt;Search 1.0&lt;/h1&gt;

&lt;p&gt;The first question to answer about Search 2.0 is &amp;#8220;What was so wrong with Search 1.0?&amp;#8221;. I could write a lot about this but much of it would be pedantry (not yet an Olympic sport, so my trophy shelf remains empty) but two important points remain. Firstly, the code base was large (relative to the feature set) and the original author had left. Secondly, and much more importantly, was the choice of on-disk format for the indexes.&lt;/p&gt;

&lt;p&gt;For those familiar with Lucene, it suffices to say that Search 1.0 does not use the familiar index format you know. For those that don&amp;#8217;t, or wouldn&amp;#8217;t object to a reminder, Lucene&amp;#8217;s on disk format is something splendid. It&amp;#8217;s highly optimized for full-text search access patterns where you necessarily have to examine every document you have looking for the top-scoring matches. Specifically, it&amp;#8217;s an inverted index where the keys are words (&amp;#8220;cat&amp;#8221;, for example) followed by a contiguous, ordered list of document id&amp;#8217;s that contain that word (and where they contain it). A separate index enables you to efficiently find the index for a given word. There are many more things in there than I&amp;#8217;ve said, and more optimizations, but this is the core of it.&lt;/p&gt;

&lt;p&gt;Search 1.0 used the Lucene library for analysis but used clustered CouchDB views for the index. The idea, of course, being to reuse all of Cloudant&amp;#8217;s considerable infrastructure around managing secondary indexes. It was anticipated that the less optimized data structure of the view would be compensated by the parallelism introduced from sharding.&lt;/p&gt;

&lt;p&gt;This worked adequately but never spectacularly, and we wanted to do better.&lt;/p&gt;

&lt;h1 id='what_search_20_isnt'&gt;What Search 2.0 Isn&amp;#8217;t&lt;/h1&gt;

&lt;p&gt;Search 1.0 is written in Java and uses Jinterface to enable interprocess communication between the JVM and our Erlang nodes running everything else. Java is a verbose language in general, and profligately so from the Erlang perspective. Mindful that my coworkers have no Java history, I investigated other JVM languages for a better fit.&lt;/p&gt;

&lt;p&gt;I didn&amp;#8217;t choose Scala but I did choose &lt;a href='https://github.com/boundary/scalang'&gt;Scalang&lt;/a&gt; (which happens to be written in Scala). Scalang provides a natural interaction with Erlang, notably because it follows the actor model for concurrency. Of course it was necessary to learn Scala in order to develop against Scalang and, indeed, to make some substantial contributions to the Scalang project (process monitoring being the main one).&lt;/p&gt;

&lt;p&gt;Search 2.0 isn&amp;#8217;t based on Apache Solr or Elastic Search. Why not? Well, Cloudant already has production quality solutions to the clustering problems we face; sharding, fail-over, read repair, and the like. Search 1.0 was right to use that infrastructure.&lt;/p&gt;

&lt;h1 id='what_search_20_is'&gt;What Search 2.0 Is&lt;/h1&gt;

&lt;p&gt;This seems a good time to note that I don&amp;#8217;t call this &amp;#8220;Search 2.0&amp;#8221; at all. What we&amp;#8217;re branding as Search 2.0 is, internally, two components, Dreyfus and Clouseau. Dreyfus is about 800 lines of Erlang and deals with plugging into existing Cloudant technologies like &lt;a href='https://github.com/cloudant/chttpd'&gt;Chttpd&lt;/a&gt;, &lt;a href='https://github.com/cloudant/fabric'&gt;Fabric&lt;/a&gt; and &lt;a href='https://github.com/cloudant/mem3'&gt;Mem3&lt;/a&gt;. Clouseau is about 1000 lines of Scala which provides access to the Lucene library via Scalang. For (a not entirely fair) comparison, Search 1.0 was a little under 7000 lines of Java.&lt;/p&gt;

&lt;p&gt;Lucene is an excellent library and to use it well is to largely stay out of its way and not be stupid. Lucene 3.6, the latest at the time, is a much more refined release than when I started, back in the 1.4 days. Search 2.0 deliberately exposes only a part of the Lucene feature set so that we can make the core bullet-proof but there are quite a few exciting things I have my eye on, which will have to wait for a future blog post.&lt;/p&gt;

&lt;p&gt;Readers familiar with couchdb-lucene will know that it uses &lt;a href='https://www.mozilla.org/rhino/'&gt;Rhino&lt;/a&gt; for its javascript processing. Search 2.0 does not, it uses the same &lt;a href='https://developer.mozilla.org/en/SpiderMonkey'&gt;SpiderMonkey&lt;/a&gt; as the rest of Cloudant. This ensures we evaluate Javascript the same way in views, update handlers, and index functions and leverages our tools for managing and monitoring couchjs processes. Those readers will also notice that the Search 2.0 API is not the same as couchdb-lucene&amp;#8217;s. I took the opportunity to design a simpler API, I hope you like it (Some details &lt;a href='http://examples.cloudant.com/lobby-search/_design/lookup/index.html'&gt;here&lt;/a&gt;). There are some planned enhancements to that API that will be deployed when the features they enable are ready for production.&lt;/p&gt;

&lt;p&gt;Today, Search 2.0 provides a rich query language into your clustered indexes, including a minor tweak to the standard Lucene query syntax, namely that a range query where both ends look like numbers are transformed into a numerical range query. So queries for price ranges, or latitude/longitude ranges will work as you&amp;#8217;d expect. Simon Metson kindly produced a nice demo of this &lt;a href='http://examples.cloudant.com/simplegeo_places/_design/geo/search.html'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In addition to rich searching is a feature I&amp;#8217;ve called &amp;#8220;Bookmarks&amp;#8221; for reasons I hope become apparent. We&amp;#8217;re all familiar with the notion of &amp;#8220;pagination&amp;#8221; if only because of the Gooooooogle links we never click. In Search 2.0, every search result returns a &amp;#8220;bookmark&amp;#8221; value in addition to the number of matches we found and the first &amp;#8220;page&amp;#8221; of matches. Passing this value back in will return results on the next page. There&amp;#8217;s a caveat, though. It&amp;#8217;s quite possible that, between two searches, a new document (or an update to an existing document, or removal of a document) will alter the scoring such that you will see results from an earlier page.&lt;/p&gt;

&lt;p&gt;We will be posting a full description of the API and all the features in the &lt;a href='https://cloudant.com/for-developers/'&gt;For Developers&lt;/a&gt; of our website.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/jjg6ddlJkw8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/search-2.0</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/make-it-easy</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/3sqjw_b2Ekg/make-it-easy" />
    <title type="html">We're on a Mission to Make it Easy</title>
    <updated>2012-08-01T00:00:00-07:00</updated>
    <author>
      <name>Brad Noble</name>
    </author>
    <content type="html">&lt;p&gt;Cloudant isn&amp;#8217;t like other databases. So it goes that the content we present to developers in our newly minted &lt;a href='http://cloudant.com/for-developers/'&gt;For Developers&lt;/a&gt; section isn&amp;#8217;t like other tech documentation; i.e. it&amp;#8217;s not static. More on that in a minute.&lt;/p&gt;

&lt;p&gt;First, a bit about the world we live in&amp;#8230;&lt;/p&gt;

&lt;p&gt;Cloudant is a hosted, distributed database service. Apps write to and read from Cloudant using our RESTful API. The payload is lightweight JSON. For all of that, you may be thinking it&amp;#8217;d take a lot time to get Cloudant set up in order to play with it, and kick the tires. Nope. All it takes is the five or so seconds to fill out &lt;a href='http://cloudant.com/sign-up/'&gt;the sign up form&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And so&amp;#8230;&lt;/p&gt;

&lt;h2 id='so_long_static'&gt;So long, static&lt;/h2&gt;

&lt;p&gt;More than just docs, the For Developers section is a live demo of the data layer at work. Click a couple buttons to &lt;a href='http://cloudant.com/for-developers/crud/'&gt;CRUD&lt;/a&gt;, &lt;a href='http://cloudant.com/for-developers/views/'&gt;get JSON via secondary indexes&lt;/a&gt; and &lt;a href='http://cloudant.com/for-developers/search/'&gt;search the sample database&lt;/a&gt; that you replicated into your account. It&amp;#8217;s a breeze.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://cloudant.com/wp-content/uploads/blog-make-it-easy-screenshot.png' alt='secondary indexes screenshot' style='max-width:100%;' /&gt;&lt;/p&gt;
&lt;p&gt;Technical references (including handy &lt;code&gt;curl&lt;/code&gt; commands) run inline with each of the demos.&lt;/p&gt;

&lt;h2 id='so_long_friction'&gt;So long, friction&lt;/h2&gt;

&lt;p&gt;As a newb noob N00B who is developing his first application on Cloudant, it is no small comfort to me to play with live demonstrations alongside the reference material in here. Not only are the docs in-step with the product (whew), but also it&amp;#8217;s clear right away that &lt;em&gt;the thing just works&lt;/em&gt;. And fast.&lt;/p&gt;

&lt;p&gt;Last night, I had the Olympics on in the background as I worked on my first Cloudant-driven app. When I picked up my head to look around, prime-time coverage was long over. Kayaking was on. It was 2am.&lt;/p&gt;

&lt;p&gt;The hours that disappeared on me weren&amp;#8217;t spent banging my simple brain against complex SQL statements, and writing and rewriting blocks of server-side code. The time was spent playing around with the data coming from my Cloudant database, moving it around the interface I&amp;#8217;m working on. Which is a long way of saying that time flies when you&amp;#8217;re having fun.&lt;/p&gt;

&lt;h2 id='getting_started'&gt;Getting started&lt;/h2&gt;

&lt;p&gt;I went from setting up my database to playing with the interface in minutes. Here&amp;#8217;s how I got there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; I put my data (JSON) into Cloudant with a &lt;a href='http://cloudant.com/for-developers/crud/'&gt;bulk insert&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; I built my &lt;a href='http://cloudant.com/for-developers/search/'&gt;search index&lt;/a&gt; inside my Cloudant design doc (the same place I&amp;#8217;ll keep my &lt;a href='http://cloudant.com/for-developers/views/'&gt;secondary indexes&lt;/a&gt;).&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='s2'&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;_design/people&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='s2'&gt;&amp;quot;_rev&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;13-24d8a5edfd54d61dacb0bc4230eee28a&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='s2'&gt;&amp;quot;language&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;javascript&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
  &lt;span class='s2'&gt;&amp;quot;indexes&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='s2'&gt;&amp;quot;searchByName&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
      &lt;span class='s2'&gt;&amp;quot;index&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;function(doc) {&lt;/span&gt;
&lt;span class='s2'&gt;        if(doc.docType==&amp;#39;person&amp;#39;) {&lt;/span&gt;
&lt;span class='s2'&gt;          index(&amp;#39;default&amp;#39;, doc.last);index(&amp;#39;default&amp;#39;, doc.first);&lt;/span&gt;
&lt;span class='s2'&gt;        }&lt;/span&gt;
&lt;span class='s2'&gt;      }&amp;quot;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;(My search index, &lt;code&gt;searchByName&lt;/code&gt;, indexes the values of the first and last names of the people in my database so I can search for them by either of those or both in my application.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; A little JavaScript to deliver it to the interface.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='c1'&gt;// Dependencies: JQuery and sag.js (http://www.saggingcouch.com/)&lt;/span&gt;
&lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
  &lt;span class='c1'&gt;// since I want to work locally (but use Cloudant data), I&amp;#39;ve set up a reverse proxy&lt;/span&gt;
  &lt;span class='c1'&gt;// more on reverse proxy: http://wiki.apache.org/couchdb/Apache_As_a_Reverse_Proxy&lt;/span&gt;
  &lt;span class='c1'&gt;// use sag.js to connect&lt;/span&gt;
  &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;user_db&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;my-Cloudant-database-name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
  &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;couch&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;sag&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;server&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;my-server&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// localhost&lt;/span&gt;
  &lt;span class='nx'&gt;couch&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;setDatabase&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;user_db&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

  &lt;span class='c1'&gt;//  capture the search form submission&lt;/span&gt;
  &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;form.search&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;submit&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;){&lt;/span&gt;
    &lt;span class='c1'&gt;//  kill default action&lt;/span&gt;
    &lt;span class='nx'&gt;e&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;preventDefault&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='c1'&gt;// get the value of the search input&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;query&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#last&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;val&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='c1'&gt;//  get data via sag.js&lt;/span&gt;
    &lt;span class='nx'&gt;couch&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;get&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
      &lt;span class='c1'&gt;//  query my Cloudant search index (see above) and account for wildcards (partial string searches)&lt;/span&gt;
      &lt;span class='nx'&gt;url&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;/_design/people/_search/searchByName?include_docs=true&amp;amp;q=&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;query&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
      &lt;span class='nx'&gt;callback&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;resp&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;succ&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='c1'&gt;// vars for iterating over the results&lt;/span&gt;
        &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;rows&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='c1'&gt;//  create the rows for my table&lt;/span&gt;
        &lt;span class='k'&gt;for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='nx'&gt;resp&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;rows&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
          &lt;span class='nx'&gt;rows&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
          &lt;span class='nx'&gt;rows&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;view-detail data-cloudant-id=&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;resp&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;rows&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;].&lt;/span&gt;&lt;span class='nx'&gt;id&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;quot;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
          &lt;span class='nx'&gt;rows&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='nx'&gt;resp&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;rows&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;].&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;first&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;resp&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;body&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;rows&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nx'&gt;i&lt;/span&gt;&lt;span class='p'&gt;].&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;last&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
          &lt;span class='nx'&gt;rows&lt;/span&gt; &lt;span class='o'&gt;+=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='c1'&gt;//  drop the rows into a table and append it to the results container in my interface&lt;/span&gt;
        &lt;span class='nx'&gt;$&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;#results&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;html&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;&amp;lt;table id=&amp;quot;people&amp;quot; class=&amp;quot;table table-striped&amp;quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='nx'&gt;rows&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39; &amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
      &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;});&lt;/span&gt;
  &lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The launch of the &lt;a href='http://cloudant.com/for-developers/'&gt;For Developers&lt;/a&gt; section is a small but important step for us. A first step toward a full-featured library of useful content for people like me and, we hope, people like you. To that end, if you&amp;#8217;re a developer using Cloudant and have ideas about docs or demos you&amp;#8217;d like to see, &lt;a href='mailto:support@cloudant.com'&gt;please reach out&lt;/a&gt;. We&amp;#8217;d love to hear from you.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/3sqjw_b2Ekg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/make-it-easy</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/higgs</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/QM7LuXukzeo/higgs" />
    <title type="html">Big Science, Big Data</title>
    <updated>2012-07-23T00:00:00-07:00</updated>
    <author>
      <name>Simon Metson</name>
    </author>
    <content type="html">&lt;h1 id='big_science_big_data'&gt;Big Science, Big Data&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Simon Metson started working for Cloudant in March 2012 as an &amp;#8220;ecology engineer&amp;#8221; and became a full time employee in July. He is based in the UK.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before I joined Cloudant, I worked on the &lt;a href='cms.web.cern.ch'&gt;Compact Muon Solenoid (CMS)&lt;/a&gt;, one of the two Large Hadron Collider (LHC) detectors that &lt;a href='http://press.web.cern.ch/press/PressReleases/Releases2012/PR17.12E.html'&gt;announced&lt;/a&gt; their discovery of the Higgs Boson earlier this month. I was a member of this collaboration for 10 years, from the start of my PhD through a bunch of post doc positions (all based in the UK at Bristol Uni), so was really excited and pleased to see the result being announced. It is the result of an amazing endeavor, where everything (hardware, software, wetware) has been pushed beyond known limits and, more importantly, delivered.&lt;/p&gt;

&lt;p&gt;&lt;img src='https://cdsweb.cern.ch/record/1459463/files/Fig1-gammagamma_run194108_evt564224000_ispy_3d-annotated-2.gif?subformat=icon-640' alt='Candidate Higgs event - copyright CERN/CMS' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Candidate Higgs event - copyright CERN/CMS&lt;/em&gt; &lt;a href='https://cdsweb.cern.ch/record/1459463/files/Fig1-gammagamma_run194108_evt564224000_ispy_3d-annotated-2.png'&gt;See the original&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For most of my time with CMS, I was involved in one way or another with data and workflow management (DMWM); designing and delivering software that would be able to process, catalog and transfer the tens of petabytes of data that the detector would deliver each year, and for the last four and a half years I ran the DMWM project with a colleague from Fermi Lab.&lt;/p&gt;

&lt;p&gt;CMS has a tiered, distributed computing system. Initial processing happens in the Tier 0 (at CERN). The resulting data is shipped to 7 national labs (Tier 1&amp;#8217;) located in US, EU and Asia for second pass processing and offsite tape backup. Once on tape the data is made available to the collaboration; any CMS collaborator can request the transfer of any dataset to their local Tier 2 cluster. Last time I check we&amp;#8217;d moved over 100PB of data around and had about 50PB of data active in the system.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://farm8.staticflickr.com/7004/6539684327_87fa9b11bc_z.jpg' alt='CMS 2011 transfer link map - copyright Paul Rossman' /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CMS 2011 transfer link map - copyright Paul Rossman&lt;/em&gt; &lt;a href='http://www.flickr.com/photos/paulrossman/6539684327/sizes/o/in/photostream/'&gt;See the original&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The DMWM project writes the software that manages these transfers, records and manages the metadata for all the datasets and submits and tracks all the processing jobs through the various batch and grid systems for both organized central processing and more ad hoc user analysis.&lt;/p&gt;

&lt;h2 id='getting_the_job_done'&gt;Getting the job done&lt;/h2&gt;

&lt;p&gt;Watching how the computing system of CMS evolved over the last ten years from something that required a lot of hand holding to something that could be relied upon to deliver, often well beyond specification, was a great experience; seeing the sites, organization, software and people mature has had a profound effect on how I think about the design, implementation and management of software projects.&lt;/p&gt;

&lt;p&gt;The nature of these experiments is such that any and all tools are available for use. We have a complex problem to solve, which results in a complex solution. While we rationalized a lot of things (making sensible decisions can save you thousands of lines of code) we still ended up with quite a range of supported technologies. Our stack used (from memory and in no particular order):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Languages: Python, Perl, C++ and a bit of Java&lt;/li&gt;

&lt;li&gt;Databases: Oracle, MySQL, CouchDB, MongoDB&lt;/li&gt;

&lt;li&gt;Messaging: ZeroMQ, &lt;a href='http://monalisa.caltech.edu/monalisa.htm'&gt;MonALISA&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Grid middleware stacks: EGEE, LCG, OSG, and ARC&lt;/li&gt;

&lt;li&gt;Batch schedulers: PBS, LSF, Torque, Maui, SGE, Condor&lt;/li&gt;

&lt;li&gt;Distributed file systems: DPM, HDFS, CASTOR, dCache, Lustre, GPFS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wrangling that stack sure was entertaining&amp;#8230;&lt;/p&gt;

&lt;p&gt;I think CMS was the first experiment to start using NoSQL tools in production; HDFS is used at some of the T2 sites for their storage system, MongoDB is used as a &lt;a href='http://www.10gen.com/presentations/MongoNYC-2012/MongoDB-at-the-Energy-Frontier'&gt;smart cache&lt;/a&gt; aggregating data from various data services and CouchDB is used for various state machine and monitoring tasks. CouchDB&amp;#8217;s replication feature was especially useful in CMS&amp;#8217;s distributed computing system. Being able to quickly build aggregated views of monitoring or state information was great, as was having everything served via a REST HTTP API. Having it all in one application was even better!&lt;/p&gt;

&lt;h2 id='from_higgs_to_cloudant'&gt;From Higgs to Cloudant&lt;/h2&gt;

&lt;p&gt;I met Mike Miller at CERN in 2007 (well, in a fondue restaurant, I think), had followed Cloudant from its inception and we&amp;#8217;d kept in touch after he left CMS to go look at neutrinos and dark matter at University of Washington, build a company and a &lt;a href='http://blog.cloudant.com/desks/'&gt;set of desks&lt;/a&gt;. He contacted me at the end of 2011 to see if I&amp;#8217;d be interested in joining Cloudant.&lt;/p&gt;

&lt;p&gt;Like a number of my former colleagues, I felt that it was time to move on. As Mike once said to me &amp;#8220;we&amp;#8217;re builders&amp;#8221;, and I wanted to be building new things again. I&amp;#8217;d experienced working in a large (CMS has about 4000 people involved, and is spread over nearly 120 institutions), collaborative environment with all the benefits and issues that they bring and decided that seeing what life is like in a startup would be interesting.&lt;/p&gt;

&lt;p&gt;Am I sad that I left CMS before the discovery announcement? Not really. The nature of these collaborations is that everyone who makes a contribution is recognized; the papers are signed by &amp;#8220;the CMS collaboration&amp;#8221; and I am a member for the next two years. While I wasn&amp;#8217;t directly involved in the analyses that were presented on the 4th, the software that I was responsible for enabled that research. That&amp;#8217;s something I&amp;#8217;m quietly proud of.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s great about joining Cloudant &lt;em&gt;now&lt;/em&gt; is that I get to see that whole evolution and scale up cycle again. Everyone in the team knows that we&amp;#8217;re just at the beginning of a very interesting journey and is really excited to see where the company goes over the coming years. I&amp;#8217;m really looking forward to helping the company scale up; the software, the organization and, importantly, the customers.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/QM7LuXukzeo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/higgs</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/Cloudant-Helps-Light-Up-the-London-Olympics</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/jqDJc_f-8cE/Cloudant-Helps-Light-Up-the-London-Olympics" />
    <title type="html">Cloudant Helps Light Up the 2012 London Olympics</title>
    <updated>2012-07-19T00:00:00-07:00</updated>
    <author>
      <name>Andy Ellicott</name>
    </author>
    <content type="html">&lt;p&gt;As much as we&amp;#8217;d like to say Cloudant athletes will be lighting up the 2012 London Olympic track, playing fields, or pool&amp;#8230;instead, Cloudant technology will be used to help light up&amp;#8230;the Ferris wheel.&lt;/p&gt;

&lt;p&gt;Tonight at 9PM local time in London, &lt;a href='http://www.edfenergy.com/brand/energy-of-the-nation/' title='Energy of the Nation light show'&gt;Energy of the Nation&lt;/a&gt;, the world&amp;#8217;s first social-media-driven light show will launch at the EDF Energy London Eye. The nightly light show, and accompanying &lt;a href='http://www.edfenergy.com/brand/energy-of-the-nation/infographic.shtml' title='Energy of the Nation live data'&gt;realtime Energy of the Nation infographic&lt;/a&gt; and &amp;#8220;Energy2012&amp;#8221; mobile app will measure the mood of the UK during the Olympics and Paralympics by performing sentiment analysis on Olympics-related tweets sourced from the UK&amp;#8217;s 10 million Twitter users.&lt;/p&gt;

&lt;p&gt;&lt;img src='http://sosolimited.com/blog/wp-content/uploads/2012/07/Eye_Smile.png' alt='London Eye Olympic Light show' /&gt; &lt;em&gt;(source: Sosolimited.com)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The campaign was conceived and developed by the creative geniuses down the street from us in Boston, &lt;a href='http://sosolimited.com/' title='Sosolimited multi-sensory design firm'&gt;Sosolimited&lt;/a&gt; in conjunction with UK-based brand experience consultancy, &lt;a href='http://ignite-london.com/'&gt;Ignite&lt;/a&gt;. The project was sponsored by &lt;a href='http://www.edfenergy.com/'&gt;EDF Energy&lt;/a&gt;, which is a sponsor of both the London Eye and the Olympics.&lt;/p&gt;

&lt;h2 id='how_energy_of_the_nation_works'&gt;How Energy of the Nation Works&lt;/h2&gt;

&lt;p&gt;Sosolimited has written software that captures Olympics- and Paralympics-related tweets in the UK. It has been capturing tweets since May 1st of this year. The tweets, and a vast library of emotional words, punctuation and emoticons, are stored using the &lt;a href='https://cloudant.com/the-data-layer/' title='Cloudant cloud database as a service'&gt;Cloudant Data Layer service&lt;/a&gt; (hosted on &lt;a href='http://softlayer.com'&gt;SoftLayer&lt;/a&gt; cloud infrastructure in Amsterdam).&lt;/p&gt;

&lt;p&gt;The Sosolimited software runs sentiment analysis algorithms on the Tweets in Cloudant to determine their emotional content. The analysis output reflects the rising and falling mood of the nation with respect to the games and is charted throughout the day on a large LED wall next to the London Eye. Every night at 9pm, that data is to be played back in a spectacular, 20-minute, low-carbon light show featuring full-color architectural lighting fixtures around the Eye and large, ground-based search beams, all powered by EDF Energy. There&amp;#8217;s more good info on how this all works located on the &lt;a href='http://www.edfenergy.com/brand/energy-of-the-nation/how-it-works.shtml'&gt;EDF Energy website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re psyched for the Olympic games to begin, and even more psyched that Sosolimited chose Cloudant to play a role in the event. If you haven&amp;#8217;t seen Sosolimited&amp;#8217;s catalog of interactive and multisensory design work, &lt;a href='http://sosolimited.com/archive/'&gt;check it out&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/jqDJc_f-8cE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/Cloudant-Helps-Light-Up-the-London-Olympics</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/app-management</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/6vx_JUs1NM0/app-management" />
    <title type="html">Managing applications on Cloudant</title>
    <updated>2012-07-17T00:00:00-07:00</updated>
    <author>
      <name>Simon Metson</name>
    </author>
    <content type="html">&lt;p&gt;A fairly common question we get asked is &amp;#8220;how do I manage my view code in &lt;code&gt;insert your favorite version control system here&lt;/code&gt;?&amp;#8221;. As people develop more complicated apps this question becomes increasingly important. Fortunately there are a set of tools that make transferring code from a version controlled directory into your database easy.&lt;/p&gt;

&lt;p&gt;At the heart of Cloudant is &lt;a href='http://couchdb.apache.org/' title='Apache CouchDB'&gt;Apache CouchDB&lt;/a&gt;. Applications that run out of CouchDB are known as &amp;#8220;CouchApps&amp;#8221;. At their most basic these applications are nothing more than a design document containing a view. There are a raft of tools that simplify the development of these applications that are served directly out of CouchDB. They each target slightly different use cases, from a minimal wrapper to upload code into the database to a fully featured development platform.&lt;/p&gt;

&lt;p&gt;At the most basic level these tools enable developers to version control their views and other code, and &amp;#8220;compile&amp;#8221; and push them into the server. More advanced use enables development of &amp;#8220;two-tier&amp;#8221; applications, pulling in various libraries to build complex, dynamic applications; even ones available &lt;a href='http://pouchdb.com/' title='PouchDB'&gt;offline&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='the_tools'&gt;The tools&lt;/h2&gt;

&lt;p&gt;Below is a quick summary of the various tools that let you build and push code from your local system into the database. It&amp;#8217;s by no means exhaustive, and I&amp;#8217;d love any &lt;a href='mailto://simon[at]cloudant.com' title='mail me!'&gt;corrections/clarifications/additions&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='https://github.com/couchapp/couchapp' title='CouchApp'&gt;CouchApp.py&lt;/a&gt; The original and reference implementation for CouchApp clients this python application is no longer under active development (Benoit has moved on to &lt;a href='https://github.com/benoitc/erica' title='Erica'&gt;Erica&lt;/a&gt;) but it is still widely used and recieves occasional updates. It turns the structure of a design document into a filesystem layout, mapping the various functions of your application to files in a defined location on your disk.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/benoitc/erica' title='Erica'&gt;Erica&lt;/a&gt; Erica is a CouchApp client built in erlang, effectively the next version of CouchApp.py. It has basically the same feature set as CouchApp.py.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/quirkey/soca' title='Soca'&gt;Soca&lt;/a&gt; Soca takes a different approach to CouchApp.py/Erica, allowing any directory structure for the app and compiles the application into a single json file following a layout defined in a file, rather than the filesystem itself. It builds applications around &lt;a href='http://sammyjs.org/' title='Sammy.js'&gt;Sammy.js&lt;/a&gt; by default.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/mikeal/node.couchapp.js' title='node.couchapp.js'&gt;node.couchapp.js&lt;/a&gt; node.couchapp.js is a node application for building CouchApps. It requires all the functions (views, lists etc) of the application be defined in a single json file, with attachments (images, html, external scripts) loaded from a defined location.&lt;/li&gt;

&lt;li&gt;&lt;a href='http://code.google.com/p/reupholster/' title='Reupholster'&gt;Reupholster&lt;/a&gt; Reupholster is a Java application that builds CouchApps in the same style as node.couchapp.js. It provides an end-to-end development tool, managing creation of the application, automated testing and pushing to the server.&lt;/li&gt;

&lt;li&gt;&lt;a href='http://kan.so/' title='Kanso'&gt;Kanso&lt;/a&gt; Kanso is another node application, described as &amp;#8220;the &lt;a href='http://npmjs.org/' title='Node Package Manager'&gt;NPM&lt;/a&gt; for CouchApps&amp;#8221;. It has a very comprehensive set of packages that enable easy management of various third party libraries and frameworks.&lt;/li&gt;

&lt;li&gt;&lt;a href='http://drsm79.github.com/situp/' title='Situp'&gt;Situp&lt;/a&gt; situp.py is modeled after the python setup.py install script. It is a single self contained file with no dependencies. It&amp;#8217;s the tool I use for my own applications that I develop on or for Cloudant, but it&amp;#8217;s also written by me so you&amp;#8217;d hope I would use it! It aims to support development of more complex CouchApps, and can pull in Kanso packages.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://github.com/jo/mouch' title='Mouch'&gt;Mouch&lt;/a&gt; Mouch takes the metaphor of a build file a step further, resulting in a minimal application &amp;#8220;for people who love purism. For people who keep complete control over their bytes. For people who love things speeding fast, keeping dependencies as minimal as possible.&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;CouchDB has supported running applications out of the database since 2009, and the associated tools are in a reasonable state of maturity. It&amp;#8217;s nice to see other databases getting &lt;a href='http://www.meteor.com/' title='Meteor'&gt;similar functionality&lt;/a&gt; now; it can only be a benefit to developers creating two-tier, dynamic applications.&lt;/p&gt;

&lt;p&gt;For very simple tasks (e.g. pushing a view into the database) there isn&amp;#8217;t much to differentiate between the various tools; it&amp;#8217;s a very subjective choice. As you go &amp;#8220;further down the rabbit hole&amp;#8221; you may find one tool fits your application or workflow better than another.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/6vx_JUs1NM0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/app-management</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/a-good-week-for-php-and-cloudant</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/qr2TAxGEQY4/a-good-week-for-php-and-cloudant" />
    <title type="html">A Good Week for PHP and Cloudant</title>
    <updated>2012-06-30T00:00:00-07:00</updated>
    <author>
      <name>Andy Ellicott</name>
    </author>
    <content type="html">&lt;p&gt;Little known fact: about 20% of &lt;a href='https://cloudant.com/the-data-layer/'&gt;Cloudant Data Layer&lt;/a&gt; users are PHP developers. So, last week we were excited to announce that Cloudant is now available as an add-on at cloudControl &lt;a href='https://www.cloudcontrol.com'&gt;PHP hosting platform&lt;/a&gt;, a cloud application platform for PHP developers (with Ruby and Python support coming soon).&lt;/p&gt;

&lt;p&gt;The announcement follows several weeks of integration work and testing on both sides of the partnership, and we hope PHP developers can develop faster and scale their apps and databases easier as a result of the effort.&lt;/p&gt;

&lt;p&gt;cloudControl account holders can add Cloudant to their service via the Cloudant Add-On page at cloudControl: &lt;a href='https://www.cloudcontrol.com/add-ons/cloudant'&gt;https://www.cloudcontrol.com/add-ons/cloudant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudant featured in a book on CouchDB &amp;amp; PHP Development&lt;/strong&gt; Coincidentally, we also got a note from author Tim Juravich (&lt;a href='https://twitter.com/#!/timjuravich'&gt;@timjuravich&lt;/a&gt;) last week letting us know he had just published a book on developing PHP web applications on CouchDB. In the book, he walks developers through the creation and deployment of a simple social networking app using tools like PHP, CouchDB, Sag, Bootstrap, jQuery, PHPFog, and &lt;strong&gt;Cloudant!&lt;/strong&gt; You can &lt;a href='http://www.packtpub.com/couchdb-and-php-web-development-beginners-guide/book'&gt;get the book here.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/qr2TAxGEQY4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/a-good-week-for-php-and-cloudant</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/desks</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/B4QrEvq9i1Y/desks" />
    <title type="html">Lean and Technical-- How we chose and furnished an office the YCombinator way.</title>
    <updated>2012-06-26T00:00:00-07:00</updated>
    <author>
      <name>Mike Miller</name>
    </author>
    <content type="html">&lt;div style='float:right; padding:15px'&gt;&lt;img src='/images/final.png' height='auto' width='300' /&gt;&lt;/div&gt;
&lt;p&gt;Cloudant’s growing, and we recently opened offices in Seattle and the UK (in addition to our headquarters in Boston, near Cloudant’s MIT birthplace). As a YCombinator company, Cloudant is conditioned to run lean, but we also have an exceptionally technical team with an appreciation for good design. This made finding and furnishing our new office particularly challenging. Here&amp;#8217;s the story of how we did it in Seattle, aka &amp;#8220;Cloudant West&amp;#8221;.&lt;/p&gt;
&lt;!--Cloudant is going through a rapid growth phase.  While we remain firmly head quartered in Boston close to our MIT birthplace, we have recently opened offices in Seattle and the UK.  We are a YCombinator company, and that means lean.  At the same time, we have an exceptionally technical team with an appreciation for good design.  This makes finding and furnishing a new office particularly challenging.  What kind of space do we want?  What neighborhood?  How will we organize it?  How will the workplace flow?  Where will spontaneous conversations happen, and where will we retreat to find solitude and flow?  How do we bring all of the above together in a fashion that is properly Cloudant branded?  Here's the story of how we did it in Seattle, aka "Cloudant West". --&gt;
&lt;h3 id='location'&gt;Location.&lt;/h3&gt;

&lt;p&gt;In his seminal 2005 article &lt;a href='http://www.paulgraham.com/start.html'&gt;&amp;#8220;How to Start a Startup&amp;#8221;&lt;/a&gt;, Paul Graham writes, &amp;#8220;for a startup location is very important.&amp;#8221; We couldn&amp;#8217;t agree more, and it&amp;#8217;s why we surveyed five different neighborhoods in Seattle: Downtown, Pioneer Square, Capital Hill, Fremont/Ballard, and South Lake Union. Our criteria were loosely based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment. The energy of the neighborhood, what other companies (large and small) are nearby, and where do we like to spend time?&lt;/li&gt;

&lt;li&gt;Food. Access to a diverse selection of good, cheap food is critical to a startup. Lunch is often where the best ideas are born, let&amp;#8217;s make sure we step away from our laptops long enough to think and talk.&lt;/li&gt;

&lt;li&gt;Space. Where can we find access to high ceilinged lofts with plenty of light and just enough partitioning into rooms?&lt;/li&gt;

&lt;li&gt;Cost. Real estate costs vary significantly.&lt;/li&gt;

&lt;li&gt;Connectivity. We wanted to be at most one switch from a fiber drop.&lt;/li&gt;

&lt;li&gt;Commute. Seattle doesn&amp;#8217;t have a subway and neighborhoods are separated primarily by water. A central location is key.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style='float:right; padding:15px'&gt;&lt;img src='/images/psquare.png' height='auto' width='250' /&gt;&lt;/div&gt;
&lt;p&gt;Environment concerns quickly narrowed down the list. Downtown is rather soulless during and after business hours. Fremont/Ballard and Capital Hill are amazing places to live and hang out, but they don&amp;#8217;t have the necessary concentration of other companies. I wanted to love South Lake Union, primarily because it&amp;#8217;s close to the lake and Amazon and biotech are absolutely transforming the neighborhood. Everything is shiny, new, and most intersections have their own cop to direct traffic (AMZ makes things happen). Unfortunately, aside from Techstars it doesn&amp;#8217;t have many companies in our space. The kicker was the small selection of food and the surprisingly high costs. That left us with Pioneer Square, which luckily maps well onto space, cost, connectivity and commute. There are a multitude of lofts with just enough brick, priced well, and close to the all-important fiber. To boot, we have several customers around the corner, Future Advisor (YC10) across the street, easy access from three directions, and are right next to Century Link and Safeco fields.&lt;/p&gt;

&lt;p&gt;Next step &amp;#8211; find a good space.&lt;/p&gt;

&lt;h3 id='space'&gt;Space.&lt;/h3&gt;

&lt;p&gt;Ben Anderson took the lead at scouting locations. I should say that commercial real estate is due for disruption. The fact that agents still control the listings and cost is absurd and creates an inefficient market. That said, we followed advice from several advisors and were introduced to a trusted agent that put plenty of good properties in front of us. We found it challenging to envision how we would lay out an office, so we called in the experts &amp;#8211; my fiancee LJ. I delivered a blueprint to LJ and before I knew it she gave us a Google Sketchup model for layout and a video to send back east for the final sign-off. Here&amp;#8217;s the video from the winning space; thanks LJ.&lt;/p&gt;
&lt;iframe class='youtube-player' src='https://www.youtube.com/embed/FAp9jgSvCwo?autoplay=0' allowfullscreen='allowfullscreen' frameborder='0' type='text/html' height='390' width='640'&gt; &lt;/iframe&gt;
&lt;p&gt;We decided that we could nicely lay this space out for 10 people without feeling crowded. We could get desks (more on that below) that would be easily re-arrangeable, and we could have space for sales and bizdev, meetings, open discussions, and door-closed, heads-down coding.&lt;/p&gt;

&lt;h3 id='furnishings'&gt;Furnishings.&lt;/h3&gt;
&lt;p&gt;&lt;div style='float:right; padding:15px'&gt;&lt;img src='/images/protodoor.png' height='auto' width='300' /&gt;&lt;/div&gt; 
This was hard.  Our office in Boston came furnished.  Since this time around we had a blank slate and some time to think, we decided to be creative.  Ikea desks are actually OK, I've had many in my time.  But, we wanted something just a little different, with superior function, fit/finish, and an imprint of the Cloudant brand: technical, well made, and aesthetically pleasing.  We decided to build instead of buy, and to improve on Amazon's &lt;a href='http://glinden.blogspot.com/2006/01/early-amazon-door-desks.html'&gt;famous door desk design&lt;/a&gt;.  Blueprints, specifications and instructions are available upon request.  I'd like to say that I had a big hand in this, but really LJ led the charge (startups are a family affair). For the first prototype she selected a beautiful recycled door that she bought for $20.  It required stripping and staining.  Here's a look at the prototype in our living room in March.  This door had recessed panels.  We investigated simply covering the door with a sheet of glass but found that it was expensive, prone to finger prints, and sharp on the edges.  Instead she filled the recessed portions with plywood.   The inserts are held from below by screws and then the entire surface (door + insert) sanded to a uniform height and finish.  Using multiple stains gave us a cool two-tone finish and then the entire door was coated with multiple layers of varnish.&lt;/p&gt;&lt;p&gt;
&lt;div style='float:left; padding:15px'&gt;&lt;img src='/images/drying.png' height='auto' width='300' /&gt;&lt;/div&gt;
This prototype turned out to be beautiful but labor intensive, so we instead chose to purchase solid core doors from Home Depot (~$40 each) and proceed to sand, stain, and varnish them all.  We (meaning LJ) used the lumber purchased for the desk frame and legs to ingeniously stack doors so that we could varnish them in our tiny garage. It's critical to varnish the doors in a level horizontal position and in a particulate free environment.  We recommend two coats of stain minimum and three coats of varnish for a uniform and smooth finish.
&lt;/p&gt;&lt;p&gt;
&lt;div style='float:right; padding:15px'&gt;&lt;img src='/images/assembly.png' height='auto' width='300' /&gt;&lt;/div&gt;
The support frame to turn the door into a desk was also a challenge.   Several configurations were tried and we settled on running a single 2x4 on edge underneath the door running the length for support.  That board is screwed into the underside of the door using small right angle metal tabs  and  provides a mount point for legs on each end of the door.  The legs are cut and assembled from 2x4 pieces as well.  The bonus is that all of the support structure can be cut, drilled, and assembled ahead of time.  Assembly consists of screwing the support 2x4 into the underside of the door, connecting the legs to the support, and securing the legs to the underside of the door with right angle brackets.  
&lt;/p&gt;&lt;p&gt;
We had quite a bit of fun making these desks.  We got help from a longtime friend and advisor of Cloudant Ross Rosen and YCombinator's own Tony Wright (seen pulling quite a face below left).  Tony, always the designer, augmented LJ's initial tapered leg design by rounding the corners (trying his best to make the table look like a big beveled "call to action" button).    We ended up with a stack of gorgeously rounded legs, but they were a bit tricky to hold together, drill, and screw together without someone holding them in place with inventive yoga moves.
&lt;/p&gt;&lt;div&gt;
&lt;div style='float:left; padding-right:15px'&gt;&lt;img src='/images/cutting.png' height='auto' width='250' /&gt; &lt;/div&gt;
&lt;div style='float:left; padding-right:15px'&gt;&lt;img src='/images/drilling.png' height='auto' width='250' /&gt; &lt;/div&gt;
&lt;div style='float:left'&gt;&lt;img src='/images/legs.png' height='auto' width='160' /&gt; &lt;/div&gt; 
&lt;/div&gt;&lt;div style='clear:both' /&gt;
&lt;p&gt;These desks are huge; you can comfortably fit 4 laptops if you use both sides, but we give one to each employee. It&amp;#8217;s highly conducive to teamwork, as it&amp;#8217;s easy to pull up a chair and work with somebody to solve a problem, review a design or test an interface. The rest of the office we furnished primarily from Costco business, and we&amp;#8217;ve been particularly happy with the ProGrid chairs (highly adjustable, robust, comfortable) for under a third of their list value.&lt;br /&gt;&lt;div&gt;
&lt;div style='float:left; padding-right:15px'&gt;&lt;img src='/images/mydesk.png' height='auto' width='400' /&gt; &lt;/div&gt;
&lt;div style='float:left; padding-right:15px'&gt;&lt;img src='/images/conference.png' height='auto' width='400' /&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div style='clear:both' /&gt; It took some work, but Cloudant West is a space that speaks to the ideals of YCombinator and Cloudant &amp;#8211; build great things that people really like. I love our new colony in Seattle, and I really love my homemade desk.&lt;/p&gt;
&lt;!--
![](/images/cutting.png)

![](/images/makindesks.png)

![](/images/legs.png)

![](/images/final.png)
--&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/B4QrEvq9i1Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/desks</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-on-azure</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/cfbXozJmovc/cloudant-on-azure" />
    <title type="html">Cloudant Data Layer Now Available on Windows Azure</title>
    <updated>2012-06-11T00:00:00-07:00</updated>
    <author>
      <name>Sam Bisbee</name>
    </author>
    <content type="html">&lt;p&gt;We are very excited to announce that the &lt;a href='https://cloudant.com/the-data-layer/'&gt;Cloudant Data Layer&lt;/a&gt; now runs on Azure. As a result, .NET, Node.js, PHP, Java, and Python developers can now enhance their fast-growing Azure apps with a scalable data layer that is co-located with their application servers in Azure data centers.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s great to see &lt;a href='http://blogs.msdn.com/b/windowsazure/archive/2012/06/06/announcing-new-windows-azure-services-to-deliver-hybrid-cloud.aspx'&gt;Windows Azure strengthen support for open source development technologies and hybrid clouds.&lt;/a&gt; The addition of Linux-based virtual machines made it possible for us to offer the Cloudant Data Layer service on Azure&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re psyched to be active members of the Azure community now&amp;#8230;the response to our &lt;a href='http://blogs.msdn.com/b/windowsazure/archive/2012/06/06/announcing-new-windows-azure-services-to-deliver-hybrid-cloud.aspx'&gt;announcement last week&lt;/a&gt; has been exciting. For those of you who are new to Cloudant, we offer a NOSQL database service (with an &lt;a href='http://couchdb.apache.org/'&gt;Apache CouchDB&lt;/a&gt;-compatible API.) A couple of things set Cloudant apart from other SQL and NOSQL database options available to Azure developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cloudant is a service: we provision your data layer and then keep it running non-stop and scale it as you grow. Unlike scale-it-yourself DBs that you have to install and manage in the cloud, Cloudant&amp;#8217;s back-end DB operations (provisioning, backup, scaling, re-partitioning, etc.) are taken care of for you by us, the experts.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Global data distribution: we push your data to the edge&amp;#8211;to Azure data centers around the world&amp;#8211;so it&amp;#8217;s closer to users for low-latency data access.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Data Replication &amp;amp; Sync: enable offline data access &amp;amp; collection (especially to mobile devices) or use it to replicate data from the cloud to on-premise data centers, so you are never locked into Cloudant or Azure.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloudant on Azure is still in &amp;#8220;preview&amp;#8221; mode as we continue to tune it for performance and expand it to additional Azure data centers in North America, Europe, and Asia. Please let us know how it is working for you and what we can do to improve it.&lt;/p&gt;

&lt;p&gt;To get a Cloudant Data Layer account running on Azure, &lt;a href='https://cloudant.com/sign-up/'&gt;please visit our signup page&lt;/a&gt; and choose &amp;#8220;Lagoon&amp;#8221; as your data layer location.&lt;/p&gt;

&lt;p&gt;If you already have a Cloudant account and you want to move it to Azure, just follow these directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log into Cloudant&lt;/li&gt;

&lt;li&gt;Choose the &amp;#8216;Account&amp;#8217; tab&lt;/li&gt;

&lt;li&gt;Change the placement of your cluster to &amp;#8216;LAGOON&amp;#8217;&lt;/li&gt;

&lt;li&gt;Cloudant will notify you after your account has been relocated to Azure&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/cfbXozJmovc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-on-azure</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-on-joyent</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Ac95icMf1_4/cloudant-on-joyent" />
    <title type="html">Cloudant Data Layer on Joyent Cloud</title>
    <updated>2012-04-11T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;We just added Joyent Cloud to the list of Cloudant Data Layer locations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Joyent Cloud is a high-performance environment for running apps and data layer services in the cloud. Backed by Joyent SmartOS - an operating system optimized for multi-tenant cloud environments - and the ZFS file system, Joyent Cloud enables Cloudant to take advantage of specific caching and data backup features in the ZFS file system and deliver outstanding data layer performance and reliability Aside from Cloudant, Joyent Cloud also powers a growing number of cloud platform and software services providers including Nodejitsu, StackMob, and GameSalad.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.joyentcloud.com/'&gt;Learn more about Joyent Cloud&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Free Cloudant Data Layer running on Joyent Cloud&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Getting started is easy. Just create a free Cloudant account, and select the Joyent Cloud option &amp;#8220;Paloma&amp;#8221; from the list of locations, as shown below.&lt;/p&gt;
&lt;img src='/images/paloma-screenie.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;&lt;strong&gt;Or Move Your Data Layer to Joyent Cloud&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you already have a Cloudant account and you want to move it to Joyent Cloud, follow these instructions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into Cloudant&lt;/li&gt;

&lt;li&gt;Choose the &amp;#8216;Account&amp;#8217; tab&lt;/li&gt;

&lt;li&gt;Change the placement of your cluster to &amp;#8216;Paloma - Joyent, US Southwest&amp;#8217;&lt;/li&gt;

&lt;li&gt;Cloudant will notify you after your account has been relocated to Joyent Cloud.&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Ac95icMf1_4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-on-joyent</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/couch-summit-drinkup</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/-ll-8tB6bEc/couch-summit-drinkup" />
    <title type="html">Cloudant CouchDB Summit Drinkup</title>
    <updated>2012-04-09T00:00:00-07:00</updated>
    <author>
      <name>Sam Bisbee</name>
    </author>
    <content type="html">&lt;p&gt;Cloudant is hosting the CouchDB Summit this week in Boston and we will be capping off the two-day affair with a public drinkup on Tuesday night. We invite everyone to come visit with the comitters and join us in wrapping up the summit. Just look for the folks in good lookin&amp;#8217; Cloudant swag. Details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tuesday April 10th&lt;/li&gt;

&lt;li&gt;6 - 9pm&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.luckyslounge.com'&gt;Lucky&amp;#8217;s Lounge&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;355 Congress Street, Boston, MA.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;All Beers on Cloudant&amp;#8217;s Tab&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe scrolling='no' marginheight='0' marginwidth='0' src='http://maps.google.com/maps?hl=en&amp;amp;q=355+Congress+Street+Boston+MA+02210&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=355+Congress+St,+Boston,+Massachusetts+02210&amp;amp;gl=us&amp;amp;ll=42.350185,-71.048404&amp;amp;spn=0.00241,0.004817&amp;amp;t=m&amp;amp;z=14&amp;amp;output=embed' frameborder='0' height='350' width='425' /&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/-ll-8tB6bEc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/couch-summit-drinkup</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/train-for-tuesdays</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/fFyF6oYxZ84/train-for-tuesdays" />
    <title type="html">The anti-sprint</title>
    <updated>2012-03-28T00:00:00-07:00</updated>
    <author>
      <name>Mike Miller</name>
    </author>
    <content type="html">&lt;p&gt;Every Monday morning the Cloudant engineering team jumps into a google hangout for our weekly &amp;#8220;train&amp;#8221; standup &lt;a href='While'&gt;1&lt;/a&gt; where we swap stories from the weekend, I defend my hometown teams (MSU and Detroit), and decide what code to include in the next release &amp;#8211; tomorrow. Yep, that&amp;#8217;s right, we push new code every Tuesday (at the slowest &lt;a href='It&amp;apos;s'&gt;2&lt;/a&gt;.) This may not seem astounding to some, but we power applications for nearly 10,000 users and have an impressive amount of transactional data under management, spread globally across 11 data centers.&lt;/p&gt;

&lt;p&gt;In my past life I once labored for literally more than a year to get a new release cut, tested and pushed. In that light, I find our weekly/daily release rhythm pretty amazing. More importantly, I think it&amp;#8217;s an example of &lt;a href='http://blog.empathybox.com/post/19574936361/getting-real-about-distributed-system-reliability'&gt;Jay Krep&amp;#8217;s compelling argument&lt;/a&gt; that, when it comes to distributed systems, the true value is not solely, or even primarly, in the underlying software, but in the service provided by those that run it. That ethos lies at the very heart of all things Cloudant. It drives our technology choices, product vision, roadmap, release schedule, operations, support, and (perhaps most importantly) business model. We write software to scale your data &lt;em&gt;and&lt;/em&gt; we run it. Below I briefly expand on the tools we use to constantly push new code, and why that is important to our customers.&lt;/p&gt;

&lt;h3 id='tools'&gt;Tools&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Erlang.&lt;/strong&gt; Building our core stack as a collection of Erlang OTP applications and using Chef for configuration management means that we upgrade our running database applications without ever taking them offline or even dropping active connections. If you haven&amp;#8217;t ever witnessed the magic of hot code upgrades in Erlang, you haven&amp;#8217;t lived. New and old code live side by side, processes are suspended, a new code path kicks in, state transformations are made on the fly, and voila, you&amp;#8217;re running new code without ever skipping a beat. Don&amp;#8217;t like it? Hit the roll-back button.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Github + CI + Tests.&lt;/strong&gt; Hot code upgrades would be worthless if we didn&amp;#8217;t have good code to push. Github&amp;#8217;s tools have really matured over the last few years and it empowers a very efficient workflow (pull requests, code review, etc) for a distributed team like ours. Coupled with Jenkins for builds and automated testing (etap, etc) we can efficiently go from idea to tested implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='value'&gt;Value&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloud.&lt;/strong&gt; This is the promise of Cloud &amp;#8211; Isolating non-core elements of your technical stack and finding the best software and people to deliver them faster, cheaper, and more reliably you can do yourself. Making a quantitative ROI argument has always been challenging because it misses a key point, &amp;#8220;it&amp;#8217;s not just the software, but who runs it.&amp;#8221;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Response.&lt;/strong&gt; On stage in 2009, one of our first customers (who was piping the twitter firehose into Cloudant) referred to our software as young and developing. Ouch. But he followed up by calling us some of the best problem solvers he had encountered. The distributed systems used to handle Big Data problems are relatively new. Our team has decades of experience in big science and enterprise IT, building and operating some of the world&amp;#8217;s biggest computing systems, and still we are able to find novel failure modes. Our ability to handle these failures gracefully stems from our deep working knowledge of the code and it&amp;#8217;s operational characteristics.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Priorities.&lt;/strong&gt; There&amp;#8217;s little worse than investing substantial time and money into a feature/product that is irrelevant in the market. Thus, while we have a clear product roadmap and development plan, we take the just-in-time ethos to heart. &amp;#8220;Somebody is trying to create 100 million databases (true story). We should probably re-write that LRU module.&amp;#8221;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='culture'&gt;Culture&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Team.&lt;/strong&gt; Perhaps most importantly, this perma-release / anti-sprint schedule suits us. We are lucky to have an expert team where developers push code, trouble shoot, and close tickets. Nobody on our team is above jumping into #cloudant on IRC and working through questions/issues with customers. If Kreps is right (hint: he is) and the only real meaningful metric is &amp;#8220;continuous hours of successful production operations,&amp;#8221; then any distributed data system is only as strong as the people that run it, that is, the people that ensure continuous operations. In Cloudant&amp;#8217;s case, the builders (kocolosk: rnewson: bitdiddle: davisp: banjiewen: and others) are also the operators. We&amp;#8217;ve been running these systems in production for our customers for more than three years.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since we began working on Cloudant we have seen some major public failures of distributed big data systems. In nearly all those cases, the failure was not one of software but of operations. This seems like a natural consequence of putting up a wall between those that build code and those that run it. At Cloudant, that wall doesn&amp;#8217;t exist, and this is what allows our customers to grow into their data layer, not out of it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/fFyF6oYxZ84" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/train-for-tuesdays</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/meteor-softlayer-webinar</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Cmib_9g3Et0/meteor-softlayer-webinar" />
    <title type="html">Slides and Presentation from Meteor Solutions and Softlayer</title>
    <updated>2012-03-16T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;On March 8th we hosted a webinar featuring presentations from Meteor Solutions and SoftLayer. Ben Straley, CEO of Meteor Solutions, gave a presentation on how his company developed their social audience marketing platform on the Cloudant data layer (powered by Softlayer). Afterward, Nathan Day, Chief Scientist at SoftLayer, elaborated on SoftLayer&amp;#8217;s inner workings and high-performance network, which allows it to provide a global platform for web applications. Kicking things off I described some of the pertinent technology behind and features of the Cloudant Data Layer, and how, together with SoftLayer, we helped Meteor Solutions keep up with their ever growing data volumes and customer demands.&lt;/p&gt;

&lt;p&gt;For those that missed it (or just want to view it again), we recorded the event, which you can view below. If you are interested in a copy of the slides, you will find those at the link below the video.&lt;/p&gt;
&lt;!-- Start of Brightcove Player --&gt;&lt;div style='display:none'&gt;

&lt;/div&gt;&lt;!--
By use of this code snippet, I agree to the Brightcove Publisher T and C 
found at https://accounts.brightcove.com/en/terms-and-conditions/. 
--&gt;&lt;script language='JavaScript' src='http://admin.brightcove.com/js/BrightcoveExperiences.js' type='text/javascript'&gt;
	var f=2;
&lt;/script&gt;&lt;object class='BrightcoveExperience' id='myExperience1500156809001'&gt;
  &lt;param name='bgcolor' value='#FFFFFF' /&gt;
  &lt;param name='width' value='480' /&gt;
  &lt;param name='height' value='270' /&gt;
  &lt;param name='playerID' value='609880943001' /&gt;
  &lt;param name='playerKey' value='AQ~~,AAAAjfF-RQk~,Buxt16gUyznNRYyI93t3SK_uoKszJGl2' /&gt;
  &lt;param name='isVid' value='true' /&gt;
  &lt;param name='isUI' value='true' /&gt;
  &lt;param name='dynamicStreaming' value='true' /&gt;
  
  &lt;param name='@videoPlayer' value='1500156809001' /&gt;
&lt;/object&gt;&lt;!-- 
This script tag will cause the Brightcove Players defined above it to be created as soon
as the line is read by the browser. If you wish to have the player instantiated only after
the rest of the HTML is processed and the page load is complete, remove the line.
--&gt;&lt;script type='text/javascript'&gt;brightcove.createExperiences();&lt;/script&gt;&lt;!-- End of Brightcove Player --&gt;
&lt;p&gt;Download the slides &lt;a href='../images/Meteor_Cloudant_Webinar.pdf'&gt;here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Cmib_9g3Et0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/meteor-softlayer-webinar</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/andy-palmer-joins-board</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/PUT40NcwjzU/andy-palmer-joins-board" />
    <title type="html">Andy Palmer Joins Cloudant Board of Directors</title>
    <updated>2012-02-27T00:00:00-08:00</updated>
    <author>
      <name>Derek Schoettle</name>
    </author>
    <content type="html">&lt;p&gt;We are happy to announce that Andy Palmer, serial entrepreneur and Boston startup luminary, is joining the Cloudant Board of Directors. Andy has a remarkable track record of starting and building amazing companies in Boston. His experience with and deep knowledge of Big Data systems (which he &lt;a href='http://gigaom.com/cloud/its-not-the-big-data-its-the-right-data/'&gt;recently wrote about for GigaOm&lt;/a&gt;) will be invaluable as we build out the Cloudant Data Layer. Having previous worked with Andy, I know first hand how committed he is to building great companies in New England. His energy and passion are second to none and we at Cloudant are privileged to have him join our board.&lt;/p&gt;

&lt;p&gt;For more information about Andy and Cloudant see &lt;a href='https://cloudant.com/#!/company/press/cloudant-names-andy-palmer-to-its-board-of-directors'&gt;our press page here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/PUT40NcwjzU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/andy-palmer-joins-board</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/announcing-couchdb-summit-boston</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Qqqjt-5qe7A/announcing-couchdb-summit-boston" />
    <title type="html">Announcing CouchDB Summit Boston</title>
    <updated>2012-02-20T00:00:00-08:00</updated>
    <author>
      <name>Sam Bisbee</name>
    </author>
    <content type="html">&lt;p&gt;We are happy to announce today that Cloudant is hosting CouchDB Summit: Boston on April 9th and 10th. It promises to be a great, productive time and we are excited to introduce everyone to The &lt;a href='http://twitter.com/cloudanator'&gt;@Cloudanator&lt;/a&gt; in person!&lt;/p&gt;

&lt;p&gt;Here is the announcement e-mail that was sent to the Apache CouchDB user and developer mailing lists today.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hello community,&lt;/p&gt;

&lt;p&gt;For a few months now we at Cloudant have been talking about hosting a CouchDB Summit in Boston for the Apache CouchDB committers and some community members. This got pushed to the front burner due to recent events in the community, chief among them the purchase of a kegerator.&lt;/p&gt;

&lt;p&gt;The goal is to give the CouchDB community the chance to be in the same room to discuss the direction of CouchDB over a two day period. Some admirable goals could include what CouchDB 2.0 should look like, how to get there, talking about auth, etc. Plus plenty of hacking time.&lt;/p&gt;

&lt;p&gt;The results of the discussions will be posted to the community for decision making. Think RFC.&lt;/p&gt;

&lt;p&gt;This is an invite only event with a max capacity of 20 to 30 people. We want to make sure that there is progress and flooding a room would inhibit that. The Apache CouchDB Committers are of course invited, plus some community members.&lt;/p&gt;

&lt;p&gt;Apache CouchDB Commiters, please let me know if you would need financial assistance to attend. Cloudant is open to providing financial assistance for flights.&lt;/p&gt;

&lt;p&gt;The particulars&amp;#8230;&lt;/p&gt;

&lt;p&gt;When: April 9 &amp;amp; 10&lt;/p&gt;

&lt;p&gt;Where: Boston, MA, USA (venue to be announced)&lt;/p&gt;

&lt;p&gt;$$$?: Cloudant is NOT charging for the event&lt;/p&gt;

&lt;p&gt;Party?: Yes, there will be a PUBLIC drinkup for the community. Details to be posted separately.&lt;/p&gt;

&lt;p&gt;RSVP: Invites are going out this and next week.&lt;/p&gt;

&lt;p&gt;Let me know if you have any questions or concerns. We hope to make this a fun, positive experience for the community.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Sam Bisbee&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Qqqjt-5qe7A" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/announcing-couchdb-summit-boston</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/davisp-on-the-pmc</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/1S8Yea3DjXQ/davisp-on-the-pmc" />
    <title type="html">Paul Davis Elected to the CouchDB PMC</title>
    <updated>2012-02-16T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Congratulations and a hearty round of applause are in order. Noah Slater, speaking on behalf of the Apache CouchDB Project Management Committee, recently announced that our very own Paul Davis has been appointed to that very PMC. According to Noah&amp;#8217;s email to the CouchDB user and dev lists:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Paul Joseph Davis, a long time contributor to the CouchDB project, has been appointed to the PMC. He’s an asset to this community, and we’re delighted to have him on board. Please take a moment to congratulate him and show your appreciation for all his hard work so far.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paul is an outstanding engineer and a pillar of the CouchDB community. We consider ourselves extremely lucky to have lured him to Cloudant last fall. He continues to be a staggering force within Cloudant, working on all aspects of our product, and still has the energy to contribute heavily to CouchDB. It&amp;#8217;s a pleasure to see him rewarded for his efforts.&lt;/p&gt;

&lt;p&gt;I have no doubt that he will make a fantastic member of the CouchDB PMC. With Paul helping to steer the project, and with version 2.0 coming up this year, I believe CouchDB has a very bright 2012 ahead.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/1S8Yea3DjXQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/davisp-on-the-pmc</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/announcing-jenever</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/mTDi-GHev3Q/announcing-jenever" />
    <title type="html">Multi-Tenant Cloudant in Europe</title>
    <updated>2012-02-13T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;I have a confession to make. We have been neglecting our friends in Europe. More than a year ago we launched our multi-tenant data layer with clusters on the east and west coasts of the US. Since then we have added shared clusters in Singapore and Japan and private clusters in numerous sites around the world. But, despite the requests from developers in Berlin, Amsterdam, Dublin, and more, we resisted opening up a shared cluster in Europe.&lt;/p&gt;

&lt;p&gt;This was folly and it ends today. We are happy to announce the immediate availability of our brand-spanking-new EU-based cluster, &amp;#8220;Jenever.&amp;#8221; Jenever lives in SoftLayer&amp;#8217;s new data center in Amsterdam just a few short milliseconds round trip from almost anywhere in the EU and UK. No longer will our European developer friends be forced to send requests or users across the Atlantic to hit the DB.&lt;/p&gt;

&lt;p&gt;BUT WAIT THERE&amp;#8217;S MORE! You can now choose the location of your data when you sign up or at any time. We maintain four shared clusters around the world, &amp;#8220;Julep&amp;#8221; in Northern Virginia, &amp;#8220;Meritage&amp;#8221; in San Jose, &amp;#8220;Sling&amp;#8221; in Singapore, and &amp;#8220;Jenever&amp;#8221; in in Amsterdam. When you sign up for a new account you will be asked where you want your data to live. If you ever want to change clusters, you can switch via your &amp;#8216;accounts&amp;#8217; page. Note that switching clusters happens seamlessly but asynchronously. It takes some time to move an account so don&amp;#8217;t expect this to happen instantly.&lt;/p&gt;

&lt;p&gt;We at Cloudant believe that your data should live where your application lives, and your application should live where your users live. Our goal is for the Cloudant data layer to cover the globe, providing developers all around the world low-latency access to their data. With Jenever in Amsterdam, we take one step closer to this goal.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/mTDi-GHev3Q" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/announcing-jenever</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/bigcouch-zero-point-four</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/AtCkVuJtHt4/bigcouch-zero-point-four" />
    <title type="html">Announcing BigCouch 0.4</title>
    <updated>2012-01-26T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;It is a big day here at Cloudant HQ; we are announcing the release of BigCouch 0.4! This release, which brings BigCouch into API equivalence with Apache CouchDB 1.1.1, has been baking for a while, and we are excited that it is now ready for public consumption. Instructions for installing and using BigCouch 0.4 can be found &lt;a href='http://bigcouch.cloudant.com/use'&gt;on the BigCouch page&lt;/a&gt;. Users running Debian Squeeze, Ubuntu (LTS or newer) or RedHat / CentOS / Amazon Linux are welcome and encouraged to use our prebuilt distributions based on Erlang/OTP R14B01 and SpiderMonkey 1.8.5.&lt;/p&gt;

&lt;p&gt;There are a whole slew of new features and performance improvements in this release. You can read the entire list &lt;a href='http://bigcouch.cloudant.com/changelog'&gt;here&lt;/a&gt;, but I wanted to highlight a few of our favorite features. These should convince you to upgrade if you haven&amp;#8217;t already.&lt;/p&gt;

&lt;p&gt;For my money, the killer addition to BigCouch 0.4 is support for &amp;#8216;zones,&amp;#8217; which allows you control over where you place the individual copies of your data. Cloudant&amp;#8217;s hosted service makes extensive use of this feature to protect against isolated failures in individual data centers. As an example, our west coast cluster &amp;#8220;Meritage&amp;#8221; is actually spread over two different data centers in two distinct geographic regions. We use zone-support to ensure that at least one copy of all of our customers&amp;#8217; data exists in both locations. That way, if one location falls into the ocean or is subject to nuclear attack, our customers&amp;#8217; data is still safe and available. With this feature now in BigCouch, you can extend clusters across multiple locations.&lt;/p&gt;

&lt;p&gt;Another important improvement we added, taken from Apache CouchDB 1.1, is support for the replicator DB to help manage multiple replications. The BigCouch replicator DB works the same as the Apache CouchDB version. A nice writeup of usage can be found &lt;a href='http://docs.couchbase.org/couchdb-release-1.1/couchdb-release-1.1-replicatordb-basics.html'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;d like to thank everyone in the CouchDB community that has contributed bug reports, patches, feature requests, etc. for BigCouch and to all the brave souls willing to try out the bleeding-edge releases. This release would not be nearly the upgrade it is without all of you. Special shout out goes to Benoit for his help with FreeBSD and native SSL support.&lt;/p&gt;

&lt;p&gt;Finally, for those following along with recent events in the land of CouchDB, we&amp;#8217;re dedicated to &lt;a href='http://blog.cloudant.com/the-future-of-couchdb/'&gt;donating and integrating BigCouch&lt;/a&gt; to Apache CouchDB. This sort of integration won&amp;#8217;t happen overnight, so we are still planning on making releases to BigCouch while we iron out the divergences in the two projects. We very much appreciate the support and enthusiasm we have recieved from the CouchDB community to date, and we look forward to working with that community to strengthen Apache CouchDB.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/AtCkVuJtHt4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/bigcouch-zero-point-four</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/sf-drinkup</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/ygCEn5_CCAU/sf-drinkup" />
    <title type="html">Cloudant SF Drinkup</title>
    <updated>2012-01-17T00:00:00-08:00</updated>
    <author>
      <name>Sam Bisbee</name>
    </author>
    <content type="html">&lt;p&gt;
  Cloudant is happy to be sponsoring &lt;a href='http://www.nodesummit.com'&gt;Node
  Summit&lt;/a&gt; next week in San Francisco. To keep the party going an extra day
  we will be hosting a CouchDB drinkup Thursday night to touch base with our
  west coast crew. This is instead of Benoit and Randall's meetup which they
  kindly merged with us - community powers unite!
&lt;/p&gt;&lt;p&gt;
  Just look for the folks in good lookin' Cloudant swag.
&lt;/p&gt;&lt;p&gt;
  &lt;ul&gt;
    &lt;li&gt;Thursday Jan 26th&lt;/li&gt;
    &lt;li&gt;5:30 - 8:30&lt;/li&gt;
    &lt;li&gt;&lt;a href='http://www.21st-amendment.com'&gt;21st Amendment Brewery&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;563 2nd St, San Francisco&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;All Beers on Cloudant's Tab&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;&lt;iframe scrolling='no' marginheight='0' marginwidth='0' src='http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=21st+Amendment+Brewery+Cafe,+563+2nd+St,+San+Francisco,+California,+United+States&amp;amp;aq=&amp;amp;sll=37.782514,-122.392565&amp;amp;sspn=0.033646,0.084543&amp;amp;vpsrc=6&amp;amp;t=m&amp;amp;ie=UTF8&amp;amp;hq=21st+Amendment+Brewery+Cafe,+563+2nd+St,+San+Francisco,+California,+United+States&amp;amp;ll=37.784079,-122.392759&amp;amp;spn=0.023742,0.036478&amp;amp;z=14&amp;amp;output=embed' frameborder='0' height='350' width='425' /&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/ygCEn5_CCAU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/sf-drinkup</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/the-future-of-couchdb</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/GKCNKNIzgo0/the-future-of-couchdb" />
    <title type="html">The Future of Apache CouchDB</title>
    <updated>2012-01-05T00:00:00-08:00</updated>
    <author>
      <name>Adam Kocoloski</name>
    </author>
    <content type="html">&lt;p&gt;The future of CouchDB is Apache CouchDB.&lt;/p&gt;

&lt;p&gt;Cloudant over the past 3 years has built and refined BigCouch, a fault-tolerant, horizontally scalable clustering framework purpose-built for CouchDB. Today we announce our intent to contribute this work back to the community. Working with the ASF and the CouchDB community, we hope to integrate the core capabilities of BigCouch into Apache CouchDB. Hopefully this will put to rest the tired (and false) &amp;#8220;CouchDB doesn&amp;#8217;t scale&amp;#8221; meme. BigCouch forms the bedrock of a globally distributed, sophisticated technology stack that we&amp;#8217;ve had in production operation for over two years at scale.&lt;/p&gt;

&lt;p&gt;Those of you building applications with CouchDB know that its performance has been improving by leaps and bounds. We&amp;#8217;ve achieved this through low-level implementations of performance-critical routines and smart refactoring of the Erlang codebase, but without sacrificing the rock-solid durability and stable REST API people have come to expect from CouchDB. The growing community of active committers includes passionate, stellar developers. More and more people are using CouchDB for projects, big and small, every day.&lt;/p&gt;

&lt;p&gt;We, along with a host of other companies, strongly support the open source community in building CouchDB and we do not plan on stopping. We have been fortunate in our ability to attract outstanding engineers, investors, and customers. We intend to continue devoting resources to Apache CouchDB and offer our help in any way the community desires. The future of CouchDB is CouchDB.&lt;/p&gt;

&lt;p&gt;Damien Katz has been an excellent founder and steward of CouchDB. It&amp;#8217;s been an honor to work with him, and we wish him well in his new location and mission.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/GKCNKNIzgo0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/the-future-of-couchdb</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/capping-the-year</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/t2SIF5Vs_r0/capping-the-year" />
    <title type="html">A Big Finish for 2011</title>
    <updated>2011-12-15T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;2011 has been quite an eventful year for Cloudant. In the spring we outgrew our tiny basement offices in Davis Square and moved Cloudant HQ into Boston proper. We added a number of fantastic engineers to the team and we said goodbye to some of our earliest hires.&lt;/p&gt;

&lt;p&gt;Going into the new year, we&amp;#8217;ve expanded our platform to 5 geographic zones in the US and 3 more around the globe. Most importantly we more than doubled the number of developers, applications, small businesses, and enterprises using our hosted service &amp;#8211; and found quite a few independent BigCouch users out there along the way. We continue to be surprised and delighted by the passion our users show for our products. It is that passion that drives us to continuously improve BigCouch and our hosted service.&lt;/p&gt;

&lt;p&gt;With all that has been going on here, the founders decided it was time to expand the team. So today we are happy to announce that Derek Schoettle has joined Cloudant as our new CEO. Yes, Derek has an MBA &amp;#8211; don&amp;#8217;t hold that against him. His passion is working within early-stage companies bringing great technology to market, most recently at Vertica, and numerous startups before that. Derek has been an advisor to Cloudant for most of 2011 and was a natural choice when the time came. We are very excited to have him on board helping Cloudant grow.&lt;/p&gt;

&lt;p&gt;With Derek on board, Adam, Mike and I will have more time to focus on the things we are passionate about . For me, that means working closely with our customers and users, focusing on building a great product that solves their data problems. Mike will continue to focus on customer success and outreach, and will hopefully have more time &amp;#8216;on the road,&amp;#8217; evangelizing BigCouch to a wider audience. Adam will continue to work deep in the guts of Apache CouchDB, BigCouch, and the Cloudant platform, making all of our crazy thought experiments into real features.&lt;/p&gt;

&lt;p&gt;2011 was a big year for Cloudant, but we have even bigger goals for 2012 (assuming the world doesn&amp;#8217;t end.) Stay tuned to this channel as we announce some of the big features and plans we have.&lt;/p&gt;

&lt;p&gt;Alan (for Adam and Mike)&lt;/p&gt;

&lt;p&gt;Co-Founder, Cloudant&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/t2SIF5Vs_r0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/capping-the-year</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/2600hz-webinar</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/hTk0ko8xivw/2600hz-webinar" />
    <title type="html">Slides and Presentation from 2600hz</title>
    <updated>2011-11-16T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;On December 14th we hosted a webinar with our friends at 2600hz, the open-source VOIP platform. Darren Schreiber, CEO of 2600hz, gave a presentation on how his company uses the BigCouch data platform to better serve its customers. Darren gave some great examples of how moving to a scalable document store has helped his company move faster, save money, and avoid operational headaches.&lt;/p&gt;

&lt;p&gt;In case you missed it, we recorded the webinar and you can view it below. If you just want the slides, follow the link below the video.&lt;/p&gt;
&lt;!-- Start of Brightcove Player --&gt;&lt;div style='display:none'&gt;

&lt;/div&gt;&lt;!--
By use of this code snippet, I agree to the Brightcove Publisher T and C 
found at https://accounts.brightcove.com/en/terms-and-conditions/. 
--&gt;&lt;script language='JavaScript' src='http://admin.brightcove.com/js/BrightcoveExperiences.js' type='text/javascript'&gt;
var f = 2;
&lt;/script&gt;&lt;object class='BrightcoveExperience' id='myExperience1328025971001'&gt;
  &lt;param name='bgcolor' value='#FFFFFF' /&gt;
  &lt;param name='width' value='480' /&gt;
  &lt;param name='height' value='270' /&gt;
  &lt;param name='playerID' value='609880943001' /&gt;
  &lt;param name='playerKey' value='AQ~~,AAAAjfF-RQk~,Buxt16gUyznNRYyI93t3SK_uoKszJGl2' /&gt;
  &lt;param name='isVid' value='true' /&gt;
  &lt;param name='isUI' value='true' /&gt;
  &lt;param name='dynamicStreaming' value='true' /&gt;
  
  &lt;param name='@videoPlayer' value='1328025971001' /&gt;
&lt;/object&gt;&lt;!-- 
This script tag will cause the Brightcove Players defined above it to be created as soon
as the line is read by the browser. If you wish to have the player instantiated only after
the rest of the HTML is processed and the page load is complete, remove the line.
--&gt;&lt;script type='text/javascript'&gt;brightcove.createExperiences();&lt;/script&gt;&lt;!-- End of Brightcove Player --&gt;
&lt;p&gt;Download the slides &lt;a href='../images/webinar.pdf'&gt;here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/hTk0ko8xivw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/2600hz-webinar</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/monsanto-chooses-cloudant</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/-PuOXOjV9aU/monsanto-chooses-cloudant" />
    <title type="html">Monsanto Chooses Cloudant</title>
    <updated>2011-10-12T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;Big day for Cloudant — and big news in the near future for all BigCouch users. We are happy to announce that biotech heavyweight and perennial Fortune 500 company &lt;strong&gt;Monsanto has chosen Cloudant to be the core of their new genome analysis platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’ve been working with them for a few weeks now and we couldn&amp;#8217;t be more thrilled with the partnership. We are no strangers to the analysis of the big bytes generated by the smallest of things. Our founders first devised our open-source platform &lt;a href='http://bigcou.ch'&gt;BigCouch&lt;/a&gt; while at MIT, working on &lt;a href='http://public.web.cern.ch/public/en/lhc/lhc-en.html'&gt;Large Hadron Collider&lt;/a&gt; experiments generating millions of data points per second from the collision of atomic particles. Turns out, Biotechnology &amp;amp; genome analysis is no different in this regard. As &lt;a href='http://gigaom.com/cloud/dnanexus-cloudant-biotech-deals/'&gt;GigaOM&lt;/a&gt; summarized it: “innovation is rampant, but data growth is outpacing the ability to analyze it, making faster, cheaper and more scalable data systems integral to leveling the playing field”.&lt;/p&gt;

&lt;p&gt;This is new ground for us — and for NOSQL as a whole. This Monsanto platform is not destined to toil away in one of their (many) R&amp;amp;D labs, only used by scientists with lab coats &amp;amp; beakers. We’re not powering the CMS of some administrative division or a minor part of their website. &lt;strong&gt;Cloudant’s BigCouch will be the core, for both storage &lt;em&gt;and&lt;/em&gt; analysis of a new, company-wide platform powering a fundamental aspect of a Fortune 500 business&lt;/strong&gt;: the analysis &amp;amp; identification of new traits &amp;amp; genomic combinations in agricultural crops. The data &amp;amp; reporting interfaces will be used across Monsanto and should be instrumental in the making of key business decisions.&lt;/p&gt;

&lt;p&gt;Now, this also means big news for our users. Monsanto has been very eager to let us open-source many of the core enhancements we make to BigCouch for them. So while this won’t quite make it into the impending BigCouch 0.4 release (which is days away now), or on our &lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;cloudant.com clusters&lt;/a&gt; for another few months, you can definitely expect to see many Monsanto-driven improvements folded back into our offerings, such as support for more languages on view servers, new tools to model data workflows, as well as a flurry of improvements to our storage &amp;amp; retrieval algorithms.&lt;/p&gt;

&lt;p&gt;At Cloudant, we’re all excited to see NOSQL platforms, including BigCouch, being used to power the next generation of business technology. So when announcements like this also translate to a more stable, performant &amp;amp; productive experience, for everybody else that uses a Cloudant product, we find it to be a big day indeed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can always &lt;a href='mailto:info@cloudant.com'&gt;contact us&lt;/a&gt; if you have any questions. There is also a &lt;a href='http://www.marketwire.com/press-release/monsanto-seeds-big-data-biotech-research-farm-with-cloudant-1572186.htm'&gt;press release&lt;/a&gt; available.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/-PuOXOjV9aU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/monsanto-chooses-cloudant</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/optimizing-couchdb-calls-by-99-percent</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/8hNaalEUF7Q/optimizing-couchdb-calls-by-99-percent" />
    <title type="html">Optimizing your CouchDB Calls by 99%</title>
    <updated>2011-09-27T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;Earlier this month, I gave a presentation at &lt;a href='http://gogaruco.com'&gt;GoGaRuCo&lt;/a&gt; about using CouchDB, and how many people do it in inappropriate or wasteful ways.&lt;/p&gt;

&lt;p&gt;The centerpiece of my talk was a step-by-step example of best-practices for CouchDB interaction, leading to an improvement of 99% in the median time it takes to do a simple insert to CouchDB (or Cloudant). Admittedly, I start from a worst-case scenario, but the scary part is that it is not a totally unrealistic one; in fact, I’ve seen it replicated many times over.&lt;/p&gt;

&lt;p&gt;After factoring my advice in, we have a performance improvement of 96% (if you stick to conversing with CouchDB through JSON, which is recommended for now), or 99% with my experimental patches to support &lt;a href='http://msgpack.org'&gt;MessagePack&lt;/a&gt; in &lt;a href='http://github.com/timanglade/couchdb'&gt;CouchDB&lt;/a&gt; &amp;amp; &lt;a href='http://github.com/timanglade/couchrest'&gt;CouchRest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What’s more, &lt;strong&gt;none of the advice I give leads to a relaxation in consistency or durability. It&amp;#8217;s plain optimization, no strings attached, just there for the taking&lt;/strong&gt;. Many of the points I touch on are also valid no matter what language or library you are using (or are easily translatable to other ecosystems), so I would strongly encourage anybody using CouchDB and interested in performance optimization to look at the video.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href='http://confreaks.net/videos/642-gogaruco2011-couchdb-ruby-you-re-doing-it-wrong'&gt;Head on over over to Confreaks to see the video&lt;/a&gt;&lt;/strong&gt; (the meat of the talk starts at the 5:10 mark).&lt;/p&gt;
&lt;br /&gt;&lt;a href='http://confreaks.net/videos/642-gogaruco2011-couchdb-ruby-you-re-doing-it-wrong'&gt;
&lt;img src='http://confreaks.net/system/videos/images/642/preview/642-gogaruco2011-couchdb-ruby-you-re-doing-it-wrong-thumb_0000.png' /&gt;
&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/8hNaalEUF7Q" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/optimizing-couchdb-calls-by-99-percent</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/using-cloudant-from-scala-cloudbees</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/wSR0ikNoqfY/using-cloudant-from-scala-cloudbees" />
    <title type="html">Using Cloudant from Scala on CloudBees</title>
    <updated>2011-07-15T00:00:00-07:00</updated>
    <author>
      <name>Michael Neale (CloudBees)</name>
    </author>
    <content type="html">&lt;p&gt;&lt;em&gt;This blogpost originally appeared as “NoSQL: CouchDB with CloudBees and Cloudant” on the &lt;a href='http://blog.cloudbees.com/'&gt;CloudBees Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial I will build a CouchDB based url shortener service (http://cloudbe.es) using CloudBees and the services/add-on platform with Cloudant. CouchDB is a popular NoSQL database - specifically you could called it a &amp;#8220;document database&amp;#8221; - i.e. it is all about storing documents which consist of sets of fields in a JSON document against a key. There is no schema - a document can consist of any JSON structure - there is no requirement that the same fields be present in each document unlike rows in a RDBMS. Of course CouchDB has a lot of the other benefits of NoSQL databases - high scalability and ease of use. Cloudant provides an excellent hosted CouchDB service. This takes care of &lt;em&gt;all&lt;/em&gt; the management of CouchDB you would normally need to do - compaction, backups, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a URL shortener&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A url shortener is just that - takes a long messy URL and generates a token/shorter URL you can pass around.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Get a &lt;a href='http://cloudbees.com/'&gt;cloudbees.com&lt;/a&gt; account, signup to a free RUN@cloud service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Go to &lt;a href='http://grandcentral.cloudbees.com/subscriptions'&gt;the subscription page&lt;/a&gt; — and choose Cloudant&lt;/strong&gt;&lt;/p&gt;
&lt;img src='/images/cloudbees1.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Create a new web app skeleton&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this I will use the Play! Framework - a simple framework for building RESTful web apps. I can use the command&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;play new urlshort --with scala
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This will create an empty project using scala. To deploy to CloudBees- a handy way is to add cloudbees 0.2.1 to the dependencies file (don&amp;#8217;t worry - source repo will be available to look at).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Create an empty database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From &lt;a href='http://grandcentral.cloudbees.com/services'&gt;grandcentral.cloudbees.com/services&lt;/a&gt; you can navigate to your Cloudant/CouchDB console. Any time you need to get back to the CouchDB console you can navigate from grandcentral.&lt;/p&gt;
&lt;img src='/images/cloudbees2.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;This shows the &amp;#8220;Futon&amp;#8221; web interface to browse your data, quite a handy tool. Here you can create a new database - I called mine &amp;#8220;urly&amp;#8221;. Once you have a database, at the top left corner you can see an icon which will take you to the Cloudant management screen - click through to the newly created database, and you will be able to set permissions, and generate an api key:&lt;/p&gt;
&lt;img src='/images/cloudbees3.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;The important bit is to note the api key details (a user name and password that you will use in your app). The user just generated should also get read/write access to your database (set it with the checkboxes).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Set up credentials in your application config&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this case, as I am using the Play! framework - the configuration is in application.conf. The keys I set up were:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;    &lt;span class='c'&gt;#CloudBees details&lt;/span&gt;
    bees.api.key&lt;span class='o'&gt;=&lt;/span&gt; key for deploying
    bees.api.secret&lt;span class='o'&gt;=&lt;/span&gt; secret for deploying
    bees.api.domain&lt;span class='o'&gt;=&lt;/span&gt;michaelvideo
    bees.api.name&lt;span class='o'&gt;=&lt;/span&gt;urly

    &lt;span class='c'&gt;#Cloudant details&lt;/span&gt;
    couch.user&lt;span class='o'&gt;=&lt;/span&gt;api key user
    couch.password&lt;span class='o'&gt;=&lt;/span&gt;api key password
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I put the CloudBees details in there for easy deployment but technically you don&amp;#8217;t have to (you can pass them to command line if you like).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Talking to CouchDB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the really nice things about CouchDB is that you don&amp;#8217;t need any drivers or dependencies to talk to it — https is a “native” api for it. So all that is needed is a simple http/REST/WS client.&lt;/p&gt;

&lt;p&gt;Urls are how you address content - you can store a document in a nominated key for example by PUT&amp;#8217;ing a JSON body to &lt;code&gt;https://michaelvideo.cloudbees.cloudant.com/urly/&lt;/code&gt; (urly is the name of the database). Updates to data require you to specify the current version tag of the data (field in the JSON body) as a form of optimistic locking.&lt;/p&gt;

&lt;p&gt;Getting the data back is a simple GET ! (obviously there is a lot more you can read about if you need). In this case the keys are the randomly generated “slugs” that form the short URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Wire up the application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Descending from the mountain top, a simple codebase which generates random url “slugs” and then does appropriate http redirects was carved in stone (also &lt;a href='https://github.com/michaelneale/URL-shortener'&gt;available on github&lt;/a&gt;):&lt;/p&gt;
&lt;img src='/images/cloudbees4.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;Authentication with CouchDB is using http basic over SSL (using the api keys mentioned earlier).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Deploy&lt;/strong&gt;&lt;/p&gt;
&lt;img src='/images/cloudbees5.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;(This will use the Play! CloudBees plugin - thanks Ivan !)&lt;/p&gt;

&lt;p&gt;I then set up a domain and a record pointing to the host for the app, running at http://cloudbe.es/&lt;/p&gt;

&lt;p&gt;Note that there was no need to migrate any data, or setup a schema (just create the database by name - which I could have also done programmatically).&lt;/p&gt;

&lt;p&gt;The data is safely stored in CouchDB (below is browsing it with Futon):&lt;/p&gt;
&lt;img src='/images/cloudbees6.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;&lt;strong&gt;MapReduce and Views&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A further enhancement is to create views. CouchDB uses a Map Reduce model to provide views and aggregate calculations.&lt;/p&gt;

&lt;p&gt;A view is similar to what relational databases offer and only requires a map function to be provided. Reducing is a more complicated topic and I won&amp;#8217;t show it, but it could be used, for example, to calculate aggregates (sum or average over some range of documents). The advantage of a Map Reduce model is that the calculation can be distributed and run in parallel with the data - good for very large sets of data.&lt;/p&gt;
&lt;img src='/images/cloudbees7.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;The Map function above simply takes a document and emits another document which is made up of the slug and the agent string (each browser provides an agent string). The key in this case is the url we stored - this means we can (if we want) lookup slugs based on URL (the reverse of what we were doing before). Note that as the fields in each document are optional - even if there is no agent field the above view will still work (just will have no agent field in the view output).&lt;/p&gt;

&lt;p&gt;The functions are written in javascript - and are themselves stored as documents (with a special naming convention). The results of these views are accessed the same as the normal documents you write data to.&lt;/p&gt;

&lt;p&gt;Hopefully from this you get a taste of the convenience and power of CouchDB and Cloudant.&lt;/p&gt;

&lt;p&gt;You can sign up for both CloudBees (if you don&amp;#8217;t have an account) and the Cloudant service on the &lt;a href='http://cloudbees.com/platform-service-cloudant.cb'&gt;CloudBees website&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/wSR0ikNoqfY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/using-cloudant-from-scala-cloudbees</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/technical-look-at-cloudant-search</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/3OjW7QH_xAU/technical-look-at-cloudant-search" />
    <title type="html">A Technical Look at Cloudant Search</title>
    <updated>2011-07-14T00:00:00-07:00</updated>
    <author>
      <name>David Hardtke</name>
    </author>
    <content type="html">&lt;p&gt;As we &lt;a href='/announcing-cloudant-search/'&gt;just announced&lt;/a&gt;, Cloudant has added fault-tolerant, federated full-text search to our document database offering.&lt;/p&gt;

&lt;p&gt;Cloudant Search builds upon our existing database to offer full-text indexing and search. It makes use of the Apache Lucene query syntax and large portions of the Lucene framework, but uses a new data storage model entirely within the CouchDB database framework. The inverted index (the map of terms to documents in which they appear) is calculated using our incremental map-reduce framework. This means the database is always available for document insertion and reading even if the indexing task backs up - other search solutions only allow documents to be added as quickly as they can be indexed. Newly indexed documents are immediately searchable &amp;#8211; there is no latency while the inverted indices are rebuilt.&lt;/p&gt;
&lt;img src='/images/federation.png' style='margin-left:auto; margin-right:auto; display:block' /&gt;
&lt;p&gt;Documents within Cloudant are distributed to multiple nodes using consistent hashing in a ring like structure. The inverted index data associated with each document is saved on the same node as the document itself. Searches are done at the shard level, and results are combined in a federation layer. If a particular node in the cluster is offline, other copies of the shard are used. Cloudant utilizes the same underlying distribution and federation technology from the open-source &lt;a href='https://github.com/cloudant/bigcouch'&gt;Bigcouch&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;Important features of Cloudant Search include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text analysis can utilize existing Java based Lucene analyzer. Java code can be loaded into the database and stored along with the search indices.&lt;/li&gt;

&lt;li&gt;Support for indexing in many languages (&lt;a href='http://blog.cloudant.com/java-language-map-reduce-views/'&gt;Java&lt;/a&gt;, &lt;a href='http://blog.cloudant.com/search-indexing-in-javascript/'&gt;Javascript&lt;/a&gt;, python, erlang, ruby, etc.) User indexing code is also stored in database.&lt;/li&gt;

&lt;li&gt;Ability to run ad-hoc queries against multiple independent map-reduce views of data.&lt;/li&gt;

&lt;li&gt;Full support for all JSON types during indexing (Strings, Numbers, JSONObjects). Pure Lucene search solutions only support String tokens.&lt;/li&gt;

&lt;li&gt;Support for following query types: Boolean, Range (text, numerical, date, and compound key ranges), Phrase, Sorted, Prefix, Dates&lt;/li&gt;

&lt;li&gt;Ability to query a “stale” snapshot of the database in case where indexing has not caught up to document insertion&lt;/li&gt;

&lt;li&gt;Horizontal scalability through addition of database nodes&lt;/li&gt;

&lt;li&gt;HTTP based search API consistent with CouchDB view API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We see several distinct use cases where Cloudant Search will be superior to existing products. Since Cloudant runs as both a low cost hosted service and as a dedicated deployment for the largest customers, developers can build products around Cloudant Search and know that they will scale to terabytes of indexed data and high IOPS rates. An ideal use case would be mobile applications that require real-time geographical bounding box search coupled with text queries. Cloudant Search&amp;#8217;s native support for numerical index types allows this. Cloudant Search&amp;#8217;s reliance on CouchDB views also opens up unique possibilities. Multiple algorithms can be used simultaneously to search, score and sort documents.&lt;/p&gt;

&lt;p&gt;To get started with Cloudant search, you first need to specify how your database is indexed by uploading a new CouchDB design document (&lt;a href='http://support.cloudant.com/kb/search/search-indexing'&gt;indexing instructions&lt;/a&gt;). Then you can use the &lt;a href='http://support.cloudant.com/kb/search/search-api'&gt;search API&lt;/a&gt;. There is also a full description of the &lt;a href='http://support.cloudant.com/kb/search/search-query-syntax'&gt;query syntax&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/3OjW7QH_xAU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/technical-look-at-cloudant-search</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/announcing-cloudant-search</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/sVgLuZdDdmc/announcing-cloudant-search" />
    <title type="html">Announcing Cloudant Search</title>
    <updated>2011-07-14T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;I’ve always strongly felt that using NOSQL wasn’t so much a choice as a necessity. That most successful NOSQL deployments start with the intimate knowledge that your set of requirements — from speed &amp;amp; availability to operational considerations and budget — cannot be met with a relational database, coupled with a deep understanding of the tradeoffs you are making. Among those, perhaps no tradeoff has been felt more deeply by NOSQL users worldwide, than the eponymous loss of a natural, instantaneous way of accessing your data through a structured query language. We all came up with our own remedies; more often than not, that substitute was based on &lt;a href='http://nosqlsummer.org/paper/google-mapreduce'&gt;MapReduce&lt;/a&gt;: Google’s novel, elegant way of explicitly parallelizing computation over distributed, unstructured data. But &lt;a href='http://browsertoolkit.com/fault-tolerance.png'&gt;as the joke goes&lt;/a&gt;, it’s always been a non-starter for the more novice users out there, and where suits &amp;amp; ties are involved.&lt;/p&gt;

&lt;p&gt;CouchDB Views (as our brand of MapReduce is called) come with additional concerns, as they are pre-computed and written to disk. While this is fine — and actually, extremely useful — for the use-cases and small scales a lot of Apache CouchDB deployments reside at (single instances working off a limited dataset), this behavior is somewhere North of nagging and South of suicidal for the data sizes &amp;amp; use-cases most Cloudant customers have to deal with. Part of the promise of our industry is — or should be, anyway — to make your life &amp;amp; business easier, no matter how much data you have. And so, while CouchDB Views have been, and will undoubtedly remain, an essential tool to index, filter &amp;amp; transform your data, once you know what to do with it; and while its various weaknesses (explicitly parallelized syntax, lengthy computation, heavy disk usage) are also the source of its most meaningful strengths (distributed processing, high performance on repeated queries, persistent transformations), we at Cloudant saw a clear opportunity to offer a novel, complementary way to interact with your data.&lt;/p&gt;

&lt;p&gt;A way that would allow you to interact with your data instantaneously; wouldn&amp;#8217;t force you to mess around with MapReduce jobs or complex languages; a way that would not require you to set up a third-party, financially or operationally expensive solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We call this way Cloudant Search. And today, we’re proud to announce its immediate availability, as a public beta.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Want to easily find all the documents that contain the word “bieber”? This is the Cloudant Search query you have to write:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bieber&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Want to find all the records that have “my world” in their title? Just write:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;title:&amp;quot;my world&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How about only finding all the artists who were born in Canada in February &amp;amp; March 1994?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;type:artist country:canada dob&amp;lt;date&amp;gt;:[1994-02-01 TO 1994-03-31]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How about people who are fan of either Justin Bieber or Justin Timberlake, that live in JBiebz’ hometown in Ontario — wait, what’s it called, Stratwood? Stratburg? Strat- something. Oh, I&amp;#8217;ll just search it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;type:person fan-of:(justin (bieber OR timberlake)) city:strat* state:ontario&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And that&amp;#8217;s just scratching the surface and you can &lt;a href='http://support.cloudant.com/customer/portal/articles/359305-search-query-syntax'&gt;see more query examples in our knowledge base&lt;/a&gt;. Of course, all those queries are also served instantly, and new records you put in your database will be indexed in real time.&lt;/p&gt;

&lt;p&gt;But Cloudant Search goes beyond ease of access for developers, analysts &amp;amp; end-users.&lt;/p&gt;

&lt;p&gt;For the IT &amp;amp; DevOps teams out there, and for our own sake (since, as maintainers of hosting service cloudant.com, we have the distinction of being the only NOSQL company tasked with operating its own product around the clock), we worked tirelessly to make it capable of tackling terabytes and easy to maintain under load. It is baked in directly into the Cloudant codebase and leverages existing, proven technology, such as the Lucene indexers, CouchDB’s view indexing logic and of course, Cloudant’s own &lt;a href='http://nosqlsummer.org/paper/amazon-dynamo'&gt;Dynamo&lt;/a&gt;-inspired distribution algorithms. Compared to external search &amp;amp; analytics solutions such as Hadoop, SAS, Solr, Sphinx or ElasticSearch, this integration &amp;amp; simplicity effectively translates to more flexibility to address ever-changing use-cases, a drastically reduced operational complexity and, at the end of the day, a much lower total cost of ownership for start-ups and established businesses alike.&lt;/p&gt;

&lt;p&gt;Finally, for the power-users out there, we’ve made Cloudant Search extremely extensible. As &lt;a href='http://support.cloudant.com/customer/portal/articles/359319-search-indexing'&gt;our documentation details&lt;/a&gt;, you can write your own indexing algorithms, leverage Lucene tokenizers or even, customize the Cloudant Search indexer itself, with a bit of Java code.&lt;/p&gt;

&lt;p&gt;Now, I&amp;#8217;d be engaging in doublespeak if I didn&amp;#8217;t make it clear that Search is still bound by some of the tradeoffs that epitomize our industry. Like some of our esteemed colleagues, we strive to make our users &amp;amp; customers aware of the adjustments that, yes, define our weaknesses but more importantly, are also the source of our strengths. Among those, I should mention that Cloudant Search will require an initial, one-time indexing and this single index itself will take up disk space. To limit resource consumption and self-induced podiatric harm, wildcard (&amp;#8220;som*thing&amp;#8221;) or suffix (&amp;#8220;*thing&amp;#8221;) searches are not allowed (only prefix searches like &amp;#8220;some*&amp;#8221;). And yes, some of its &lt;a href='http://support.cloudant.com/customer/portal/articles/359320-search-api'&gt;more advanced features&lt;/a&gt; like the dynamic sorting of results, are still memory-bound and as such, should be used carefully.&lt;/p&gt;

&lt;p&gt;There are &lt;a href='http://en.wikipedia.org/wiki/No_Silver_Bullet'&gt;no silver bullets&lt;/a&gt; in this industry. That is something that the Cloudant team has kept in mind through the months we spent developing Cloudant Search. But more than an admission of eventual defeat, we’ve always taken it as a challenge to innovate at the pain-points. To explore the areas beyond the boundaries of our existing trade-offs. To find tasteful solutions to gritty problems. Today, we’re happy to bring you the fruits of the labor, share our response to this problem, and in a way, pass the challenge on to you: we can’t wait to see what you will do with it. We’re confident that Cloudant Search will open new doors, from user-facing analytics dashboards, to efficient Object-Document Mappers, to killer apps we haven&amp;#8217;t even dared to think of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So go ahead and &lt;a href='http://blog.cloudant.com/technical-look-at-cloudant-search/'&gt;read more about the technology&lt;/a&gt;, &lt;a href='http://support.cloudant.com/customer/portal/articles/359316-introduction-to-cloudant-search'&gt;peruse the docs&lt;/a&gt;, &lt;a href='https://cloudant.com/#!/dashboard/'&gt;activate Search&lt;/a&gt; on a database through your cloudant.com dashboard or &lt;a href='mailto:info@cloudant.com'&gt;contact us&lt;/a&gt; to see how this technology can be deployed in your datacenter.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/sVgLuZdDdmc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/announcing-cloudant-search</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/dot-net-couchdb-cloudant-appharbor</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/nZ8BvlP3O5s/dot-net-couchdb-cloudant-appharbor" />
    <title type="html">.NET + CouchDB = ♥: Announcing the Cloudant Add-On for AppHarbor</title>
    <updated>2011-06-28T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;The NOSQL movement originally found its community roots in some the “edgier” platform &amp;amp; languages of this world; CouchDB in particular, has always felt strongly backed by a certain kinship with the Ruby and Rails communities, amongst others. But as one of the most mature NOSQL projects out there, CouchDB now also enjoys energetic support in the more established communities such as PHP, Java or even .NET.&lt;/p&gt;

&lt;p&gt;As it turns out NOSQL isn’t the only movement kindling a relationship with the .NET framework. The &amp;#8220;Cloud&amp;#8221; has also taken root in that community, and a service called &lt;a href='https://appharbor.com/'&gt;AppHarbor&lt;/a&gt; has arisen to meet the demand for reliable, elastic &amp;amp; pay-as-you-grow .NET hosting.&lt;/p&gt;

&lt;p&gt;I’d be beating around the bush if I introduced AppHarbor as anything else but “Heroku for .NET”. That description may sound catchy but in and of itself, does not a great service make. No, what really caught our eye about our fellow ex-YCombinator brethren Michael, Rune &amp;amp; Troels, is their flawless execution of the concept and their tactful tweaks to the Platform-as-a-Service model. By giving you access to the Common Language Runtime and the .NET framework, AppHarbor opens more doors for developers than just single-language execution. You instantly gain access to the years of loving care, performance tuning and functional extensions that Microsoft has poured into its platform, as well as support for a &lt;a href='http://en.wikipedia.org/wiki/List_of_CLI_languages'&gt;flurry of languages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So today, we’re happy to announce the &lt;a href='hhttps://appharbor.com/addon/cloudant'&gt;Cloudant add-on for AppHarbor&lt;/a&gt;. It will give you instant provisioning of our &lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;hosted CouchDB solutions&lt;/a&gt;, for all your hosted .NET apps. Your Cloudant databases will be co-located in the same datacenter as AppHarbor, so you can enjoy the same reliability &amp;amp; performance you’ve come to expect from Cloudant, with the absolute minimal latency possible. And on the business side, you’ll also get the accounting convenience of a single monthly bill for both your app &amp;amp; data hosting expenses. (Don’t forget to put a coversheet on that TPS report before running it by the boss, though!)&lt;/p&gt;

&lt;p&gt;So go on ahead and get started with one of the many CouchDB libraries available for the .NET framework, such as &lt;a href='https://github.com/foretagsplatsen/Divan'&gt;Divan&lt;/a&gt;, &lt;a href='https://github.com/arobson/Relax'&gt;Relax&lt;/a&gt;, &lt;a href='http://code.google.com/p/relax-net/'&gt;Hammock&lt;/a&gt; or &lt;a href='https://github.com/hhariri/EasyCouchDB'&gt;EasyCouchDB&lt;/a&gt;. Or peruse this &lt;a href='http://vimeo.com/23251936'&gt;recent introduction to CouchDB for .NET developers&lt;/a&gt;. (And please send us an email to show us what you’ve built with AppHarbor + Cloudant!)&lt;/p&gt;

&lt;p&gt;What are you still doing here? Go &lt;a href='https://appharbor.com/account/new'&gt;sign up for AppHarbor&lt;/a&gt;… You’re in good hands with Michael, Rune &amp;amp; Troels.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/nZ8BvlP3O5s" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/dot-net-couchdb-cloudant-appharbor</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/paul-davis-joining-cloudant</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/fcHJKYPRABU/paul-davis-joining-cloudant" />
    <title type="html">Paul Davis is Joining Cloudant!</title>
    <updated>2011-06-27T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;We are thrilled to announce that noted Apache CouchDB community member &amp;amp; committer Paul Davis will be joining Cloudant in July.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/paul.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Paul had been on our “must-hire” list for a while now, and he will be joining a technical team that now includes a third of the currently active committers to Apache CouchDB! We’ve always tried to be faithful stewards and dedicated supporters of the Open Source community behind CouchDB, and this commitment will only grow stronger with Paul’s inclusion in Team Cloudant.&lt;/p&gt;

&lt;p&gt;Paul’s background in large distributed systems &amp;amp; data analytics, combined with his expertise in Erlang and hardware optimization will undoubtedly come in handy as he helps us solidify our quality of service, add features to our platform and get &lt;a href='https://github.com/cloudant/bigcouch'&gt;BigCouch&lt;/a&gt; ever closer to 1.0.&lt;/p&gt;

&lt;p&gt;You can learn more about Paul through his &lt;a href='https://github.com/davisp'&gt;github&lt;/a&gt;, &lt;a href='http://twitter.com/#!/davisp'&gt;twitter&lt;/a&gt; or &lt;a href='http://davispj.com/'&gt;website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bottoms up, Paul. We couldn&amp;#8217;t be happier to have you working with us.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/fcHJKYPRABU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/paul-davis-joining-cloudant</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/structure-wrap</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/2rNq5nrJoY8/structure-wrap" />
    <title type="html">Mike Miller Talks Cloud Databases at GigaOM Structure</title>
    <updated>2011-06-24T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Yesterday, Cloudant Chief Scientist (and VP of powder-blue shirts) sat on a panel at &lt;a href='http://event.gigaom.com/structure/'&gt;GigaOm&amp;#8217;s Structure Conference.&lt;/a&gt; Along with representatives from Xeround, ParAccel, and NimbusDB, Mike discussed the ins and outs of running databases in a Cloud environment. As the other three panelists represented more traditional relational and data-warehousing tchnologies, they turned to Mike to represent NOSQL databases as uniquely suited for high performance, elasticity, and operational stability.&lt;/p&gt;

&lt;p&gt;We at Cloudant are delighted to have been chosen for this panel. This is the third year in a row we have sent delegates to Structure and we have always found the speakers, panels, and hallway conversations to be very enlightening.&lt;/p&gt;

&lt;p&gt;You can watch a &lt;a href='http://gigaom.com/cloud/cloud-databases-face-challenges-but-opportunities-beckon/'&gt;video of the panel&lt;/a&gt;, or read &lt;a href='http://www.pcworld.com/businesscenter/article/231059/four_companies_rethink_databases_for_the_cloud.html'&gt;PCWorld’s writeup&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/2rNq5nrJoY8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/structure-wrap</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudbees-ecosystem</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/X3OWfJxDreY/cloudbees-ecosystem" />
    <title type="html">CouchDB &amp; Java in the Cloud, Now Easier than Ever with CloudBees</title>
    <updated>2011-06-21T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;Today, Cloudant is proud to be a launch partner of the CloudBees Ecosystem. Effective immediately, our line of hosted CouchDB &lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;cloud solutions&lt;/a&gt; is available directly through CloudBees’ Java platform, with a simple API, unified billing and integrated account management.&lt;/p&gt;

&lt;p&gt;CloudBees started out in 2010, with the goal of giving Java developers &amp;amp; organizations a platform, that not only lets them run their applications online easily, but also gives them specific tools to develop, test &amp;amp; integrate them. This twist in the usual PaaS model means they’re the only platform out there that aims to cover the entire lifecycle of traditional Java application development. So today, we’re thrilled to be part of this vision, by helping them launch an add-on program that also features &lt;a href='http://bit.ly/jp83ai'&gt;New Relic, SauceLabs, Sonar &amp;amp; JFrog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Considering the recent increase in CouchDB adoption in the Java community (bolstered by the existence of several drivers &amp;amp; persistence layers, such as our own fork of &lt;a href='https://github.com/cloudant/couchdb4j'&gt;couchdb4j&lt;/a&gt;, &lt;a href='http://code.google.com/p/ektorp/'&gt;ektorp&lt;/a&gt;, &lt;a href='http://code.google.com/p/jcouchdb/'&gt;jcouchdb&lt;/a&gt; and &lt;a href='https://github.com/isterin/jrelax'&gt;jrelax&lt;/a&gt;), we’re more than happy we answered CloudBees call, integrated deeply into their platform, and we can’t wait to see what you will build with us!&lt;/p&gt;

&lt;p&gt;So go on ahead and check out the &lt;a href='http://blog.cloudbees.com/2011/06/cloudbees-ecosystem-launch-discover.html'&gt;details of their announcement&lt;/a&gt; or &lt;a href='http://bit.ly/lL7vsS'&gt;sign up for the CloudBees platform&lt;/a&gt; right away!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/X3OWfJxDreY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudbees-ecosystem</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/closer-cloudant-europe</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/GdWaqWkWomw/closer-cloudant-europe" />
    <title type="html">A Closer Cloudant? Now Accepting Reservations for a European Cluster!</title>
    <updated>2011-05-24T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;One of the hardest parts of running a global business like Cloudant isn’t necessarily on the technical side of things. While we certainly got better at developing &amp;amp; operating a fleet of clusters that now spans both US coasts &amp;amp; Asia, we’ll admit to still being somewhat under-skilled at tackling some of our marketing concerns, such as estimating latent demand in foreign markets.&lt;/p&gt;

&lt;p&gt;In recent months, our support team has been receiving more &amp;amp; more inquiries about provisioning Cloudant accounts in Europe. But instead of trying to guess who else is interested, run complex spreadsheet models or hire a team of consultants, we figured we’d just ask you. (Yes, you: Time magazine’s 2006 Person of the Year.) To limit the noise in this poll, we’ll ask you to put your money where your mouth is: we’ll only accept reservations from paying customers (i.e., users on an “Argon” plan or above).&lt;/p&gt;

&lt;p&gt;Having your data located a cluster close to your application layer (or other consumers of your CouchDB docs) has a big primary benefit: latency. With a cluster in Europe, your median read &amp;amp; write latencies to Europe should go down by approximately 200ms (or by ~500ms for SSL access), when compared to our existing East Coast cluster .&lt;/p&gt;

&lt;p&gt;So go on ahead to our &lt;a href='https://cloudant.com/#!/europe'&gt;reservation page&lt;/a&gt;. You’ll be asked to sign up for Cloudant if you don’t already have an account; or upgrade to a paid account if you’re currently on our “Oxygen” plan.&lt;/p&gt;

&lt;p&gt;We’ll let you know how the process is going with a handy reservation progress bar. We’ll set up our European cluster and load it with the accounts that reserved a spot, as soon as that bar hits 100%!&lt;/p&gt;

&lt;p&gt;&lt;a href='https://cloudant.com/#!/europe'&gt;Go ahead and tell us you’re interested!&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/GdWaqWkWomw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/closer-cloudant-europe</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/search-indexing-in-javascript</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/r35J1h5RNa4/search-indexing-in-javascript" />
    <title type="html">Search Indexing in Javascript</title>
    <updated>2011-05-19T00:00:00-07:00</updated>
    <author>
      <name>David Hardtke</name>
    </author>
    <content type="html">&lt;p&gt;In order to leverage existing Lucene analyzers, our Search feature (currently in beta) makes use of &lt;a href='http://www.infoq.com/news/2010/09/cloudant-couchdb-java-viewserver'&gt;Java views&lt;/a&gt;, rather than the traditional Javascript views you’re used to in CouchDB. Recently, we wanted to do some performance comparisons between the two; would the Java view server be significantly faster (or slower) than the Javascript view server on typical indexing tasks? To test this, we wrote a simple Javascript view (in the form of a CouchApp) that creates a Cloudant Search-compatible inverted index. The code is available on github &lt;a href='https://github.com/cloudant/jsindexer'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To use it, clone the git repository and use the couchapp tool to push it to your database:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;git clone git@github.com:cloudant/jsindexer.git
&lt;span class='nv'&gt;$ &lt;/span&gt;&lt;span class='nb'&gt;cd &lt;/span&gt;jsindexer
&lt;span class='nv'&gt;$ &lt;/span&gt;couchapp push http://&amp;lt;user&amp;gt;.cloudant.com:5984/&amp;lt;db_or_couchapp_you_want_to_search&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;With this simple push, you gain the ability to do a search against this inverted index. For example, if you want to search all the docs in that DB whose “comments” field contains “cloudant is awesome” and whose “rating” value is between 80 and 100:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl &lt;span class='s1'&gt;&amp;#39;http://&amp;lt;user&amp;gt;.cloudant.com:5984/&amp;lt;db_or_couchapp_you_want_to_search&amp;gt;/_search?q=comments:&amp;quot;cloudant is awesome&amp;quot; AND rating:[80 TO 100]&amp;amp;index=_design/jsindexer/_view/whitespace&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Obviously, that&amp;#8217;s just scratching the surface. Our knowledge base has several articles about Search. You can go there to read our &lt;a href='http://support.cloudant.com/customer/portal/articles/359316-introduction-to-cloudant-search'&gt;introduction to Search&lt;/a&gt;, learn more about &lt;a href='http://support.cloudant.com/customer/portal/articles/359320-search-api'&gt;the Search API&lt;/a&gt; or how to &lt;a href='http://support.cloudant.com/customer/portal/articles/359319-search-indexing'&gt;write your own Indexer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As for the results of the performance comparison, our full text indexing speed is limited by the writing of the data to the CouchDB B-Tree, so Javascript and Java perform the same. So there you have it: full-text search from Javascript, a guilt-free geeky pleasure. Go ahead and &lt;a href='https://github.com/cloudant/jsindexer'&gt;have at it&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/r35J1h5RNa4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/search-indexing-in-javascript</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/fukushima</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/VAwCBV7gfgQ/fukushima" />
    <title type="html">Fukushima from Afar</title>
    <updated>2011-04-02T00:00:00-07:00</updated>
    <author>
      <name>Mike Miller</name>
    </author>
    <content type="html">&lt;p&gt;In the past month I had the all too rare opportunity to do something that was both terrifically exciting and, I believe, deeply meaningful. On Friday, March 11, I awoke in Seattle to the news of the devastating earthquake and tsunami that struck Japan. As the day developed the sheer magnitude of the true devastation emerged and it was clear that sobering stories would continue to unfold for quite awhile.&lt;/p&gt;

&lt;p&gt;I was doubly surprised by the emerging media coverage of the Fukushima reactor complex. The Japanese are absolutely top-tier in both their science and engineering and the very fact that Tokyo had so little damage from a 9.0 earthquake (imagine if that happened here!) suggested that they were equally prepared for the aftermath. To a large extent, they were — just not for a series of events that were so powerful that within days it was clear that the Fukushima situation had changed dramatically.&lt;/p&gt;

&lt;p&gt;In this era of real-time data, it occurred to me just how hard it was for the educated public to gain access to the right data. What was the level of radiation being released by Fukushima? Was it enough to be dangerous to the people in Japan? Was it enough to impact our sensitive (and expensive!) physics experiments here in Seattle? Was it enough to be a public health concern in the US?&lt;/p&gt;

&lt;p&gt;These questions, plus a little prodding from senior faculty at UW, put the wheels in motion for me. If information was going to continue to be so hard to find, then maybe we could do something about it. We are physicists, after all. Emails were sent, grad students were diverted from thesis writing and qualifying exam preparation, and by Monday we had worked to convert my lab at UW from &lt;a href='http://en.wikipedia.org/wiki/Dark_matter'&gt;Dark Matter&lt;/a&gt; detector R&amp;amp;D to an &lt;a href='http://www.npl.washington.edu/monitoring/'&gt;air radioactivity monitoring lab&lt;/a&gt;, containing some very expensive, one-of-a-kind equipment, along with the requisite quantities of duct tape and zip-ties holding everything together. This was no small feat, and it never would&amp;#8217;ve happened without the work of a superb team and the right tools.&lt;/p&gt;

&lt;p&gt;We knew that any radiation that was released would be heavily diluted in transit to the west coast, so we had to (i) find a way to sample enormous quantities of air (nearly 150,000 cubic meters per day) and (ii) protect our radiation counter and air samples from the copious amounts of normal background activity. A little known (or appreciated) fact is that natural radiation is part of your daily life, from radon decay products to bananas, and natural radiation would likely drown out any faint signal from Fukushima. By Wednesday we started recording data, and then it suddenly hit me — we were going to be producing a lot of data, and it was already coming in. The data had to be catalogued, processed, condensed, distributed, data models modified, reprocessed, redistributed, and we were learning as we went along. Not only was the data was important to us and our experiments, but the public was hungry for realtime results (that had to be correct!), so we didn&amp;#8217;t have the luxury of writing a spec, reviewing it, building it, prototyping, or any of the typical processes. We already were running TV crews through the lab daily, time was short, and so I turned to the tool that I happened to know best: &lt;a href='https://cloudant.com/#!/solutions/bigcouch'&gt;open source BigCouch&lt;/a&gt;, and specifically the free hosted version on &lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;Cloudant&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We began putting together a real-time BigCouch workflow that ultimately enabled us to complete complex processing (data transformation and aggregation, signal processing, statistical analyses and the like), real-time data monitoring and visualization, collaborative analyses, and ultimately to serve the results directly to the public from the database. At the end of this post I will briefly review my BigCouch experiences, both good and bad.&lt;/p&gt;

&lt;p&gt;On Friday, March 18, I had just placed the overnight air filter sample into our monitoring station and was adding some additional signal processing to our workflow. After 20 minutes of counting I happened to look at the computer screen to check the realtime data acquisition histogram, and there it was, clear as day, the first arrival of 131-I in the Seattle air. I spent about 10 minutes double checking, looking for other characteristic fission products in the spectra, and then realized we had something very unique.&lt;/p&gt;

&lt;p&gt;Racing down the hall, I gathered a team and the next week is an absolute blur. That Friday night, around 10, we knew that we had unambiguously detected fission fragments from Fukushima, and we had a good handle on the total level of the radioactivity levels. While results were far below any local health concerns (roughly 1000 times below the &lt;a href='http://www.atsdr.cdc.gov/csem/iodine/standards_regulations.html'&gt;EPA limits&lt;/a&gt;), it was higher than I had personally expected, and we suddenly knew that the situation in Japan was indeed serious. Our thoughts go out to those that live near Fukushima, as well as the heroic workers at the plant as they fight to contain the incident.&lt;/p&gt;

&lt;p&gt;As the week progressed, we saw the radiation levels peak, slowly decline, and peak again as we detected events that occurred roughly 7 days after they happened in Japan. Within a day of our initial sighting we had posted the numbers and plots online, and they continued to update in real-time as the situation unfolded. By the middle of the week we posted the &lt;a href='http://arxiv.org/abs/1103.4853'&gt;first publication draft online&lt;/a&gt;, and are now witnessing the radiation levels drop below the limit of detectability in our experiment. If you are interested in the details, the pieces in the &lt;a href='http://www.washingtonpost.com/national/as-fukushima-fallout-circles-the-globe-nuclear-sleuths-sift-it-for-clues/2011/03/30/AFfnQBHC_story.html'&gt;Washington Post&lt;/a&gt;, &lt;a href='http://blogs.nature.com/news/thegreatbeyond/2011/03/fukushima_reactor_products_cou.html'&gt;Nature News&lt;/a&gt;, and &lt;a href='http://www.nytimes.com/external/gigaom/2011/03/31/31gigaom-how-nosql-is-helping-allay-seattles-radiation-fea-40912.html?partner=rss&amp;amp;emc=rss'&gt;NY Times&lt;/a&gt; were particularly well written, in my opinion.&lt;/p&gt;

&lt;p&gt;Before closing, I want to briefly review the pros and cons of using BigCouch/Cloudant for this critical application.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;. The ability to smoothly handle both structured and unstructured data was critical. The document philosophy allowed us to be agile with data types (metadata + binary data side-by-side) and date models (sometimes changing by 20x per day).&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloud&lt;/strong&gt;. Not having to install and maintain my own database server for this purpose was a huge win.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;. This application isn&amp;#8217;t the world&amp;#8217;s biggest data producer, but it&amp;#8217;s no slouch either. We were able to easily store and process Terabytes of data without breaking a sweat, and it was nice to know that we wouldn&amp;#8217;t be limited by scaling concerns in the future.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-time Analytics&lt;/strong&gt;. We were able to easily insert our domain specific libraries/application into an incremental MapReduce workflow to provide up-to-the-minute results.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collaborative&lt;/strong&gt;. The database is a web server, so we were immediately able to collaborate as a team. The fact that the db is also a web server that speaks JSON over HTTP enables simple integration with other standard tools for client-side visualization, etc.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thin client applications&lt;/strong&gt;. I was able to write ultra-lightweight client-side javascript applications for &lt;a href='http://mlm43.cloudant.com/japan/_design/ana/index.html'&gt;data monitoring&lt;/a&gt; and presentation. These applications were typically around 100 lines of code and served directly from the cloud to the browser, which means I didn&amp;#8217;t have to set up my own web-tier stack, nor learn Rails, Django, etc. This has been on my list of &amp;#8220;things to learn&amp;#8221; for a year, and this pushed me to finally do it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the things that can definitely be improved&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Analytics integration&lt;/strong&gt;. Like Hadoop, building a BigCouch analytics workflow is a bit raw and has a substantial learning curve. This experience makes me realize that there is tremendous low-hanging fruit for tools that bridge that gap for the average developer and/or analyst.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CouchApp&lt;/strong&gt;. The client-side JS model is a huge win here, and the couchapp tool was a big help in turning my JS and HTML files immediately into an application in the cloud. However, I had to strip out a significant amount of unused baggage to make sense of it all. Further, there is still some work to be done to allow for rich applications that securely allow not just data reads from the client(which currently works well), but also writes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In summary, BigCouch was a key enabling technology, and I will definitely use it for future large scale experiments. In this case, it helped maximize the value in a very time-sensitive big data problem.&lt;/p&gt;

&lt;p&gt;Our thoughts go to the people nearest Fukushima. We are fortunate that the radioactivity in the US is so low. I feel both proud and humbled to have been able to contribute in some way, by bringing scientific information to the public in a time of great uncertainty.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/VAwCBV7gfgQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/fukushima</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/rise-and-shine</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/khsk97ARjzE/rise-and-shine" />
    <title type="html">Rise &amp; Shine</title>
    <updated>2011-03-20T00:00:00-07:00</updated>
    <author>
      <name>Tim Anglade</name>
    </author>
    <content type="html">&lt;p&gt;You wouldn&amp;#8217;t know it from looking out your window here in Boston but spring is supposed to start tomorrow. And so the Cloudant team once again spends a lazy March Sunday, shut indoors, hoping for milder spells.&lt;/p&gt;

&lt;p&gt;But it’s already Monday in Japan and it seems like the tech community there has had a busy weekend.&lt;/p&gt;

&lt;p&gt;In an effort spearheaded by the local branches of Google, Amazon, Yahoo!, Microsoft &lt;a href='https://sites.google.com/site/hackforjapan/sandou-sha-ichiran'&gt;and many others&lt;/a&gt;, more than 200 developers have been sharing ideas, teaming up and designing apps that will help speed up Japan’s recovery after the disastrous earthquake, tsunami, nuclear scare and &lt;a href='http://en.wikipedia.org/wiki/File:Map_of_Sendai_Earthquake_2011.jpg'&gt;632+ aftershocks&lt;/a&gt; they have been experiencing since Friday, March 11.&lt;/p&gt;

&lt;p&gt;The endeavor is dubbed &lt;a href='https://sites.google.com/site/hackforjapan/'&gt;Hack For Japan&lt;/a&gt; and while the English language details are still sparse (see the &lt;a href='https://www.google.com/moderator/#15/e=6441b&amp;amp;t=6441b.40&amp;amp;f=6441b.1e8956'&gt;idea poll&lt;/a&gt; or the &lt;a href='http://search.twitter.com/search?q=%23hack4jp&amp;amp;lang=en'&gt;ongoing Twitter stream&lt;/a&gt;), we immediately knew we wanted to help out in whatever way we could.&lt;/p&gt;

&lt;p&gt;The Japanese CouchDB community is &lt;a href='https://groups.google.com/group/couchdb-jp?hl=en'&gt;150+ strong&lt;/a&gt;, has organized several &lt;a href='https://groups.google.com/group/couchdb-jp/web/couchdb-hackathon-relaxon?hl=en'&gt;“relaxons”&lt;/a&gt;, is writing an impressive &lt;a href='http://dl.dropbox.com/u/673631/couchguide_ja/_build/html/index.html'&gt;community translation of “CouchDB: the Definitive Guide”&lt;/a&gt; and has a &lt;a href='http://yssk22.blogspot.com/'&gt;very&lt;/a&gt; &lt;a href='https://github.com/yssk22'&gt;active&lt;/a&gt; &lt;a href='http://www.slideshare.net/yssk22'&gt;leader&lt;/a&gt; in &lt;a href='http://twitter.com/yssk22'&gt;Yohei Sasaki&lt;/a&gt;. Cloudant in particular, has enjoyed some traction in Japan for a while and we set up a cluster dedicated to serving that community last year.&lt;/p&gt;

&lt;p&gt;Today, we’re moved by the resilience, kindness and positive outlook of the Japanese tech community. So we’re announcing &lt;strong&gt;we’re donating our spare Asia-Pacific cluster capacity to any Hack For Japan project that may need it&lt;/strong&gt;. It should be enough for &lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;several hundred Argon or a few Krypton accounts&lt;/a&gt;. The details are &lt;a href='https://cloudant.com/hack4jp'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s just our way of saying thanks to the Japanese community, for always having our back, for keeping the lost, the injured &amp;amp; the stranded in their hearts, and for showing that you can always count on your fellow geeks to unite, build &amp;amp; help rebuild.&lt;/p&gt;

&lt;p&gt;After all, it&amp;#8217;s already the season of love, life &amp;amp; new hopes, over there.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/khsk97ARjzE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/rise-and-shine</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/using-incentive-prizes-to-crowdsource-brilliance</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/yEORgowKEw0/using-incentive-prizes-to-crowdsource-brilliance" />
    <title type="html">“Using Incentive Prizes to Crowdsource Brilliance”</title>
    <updated>2011-03-09T00:00:00-08:00</updated>
    <author>
      <name>Mike Miller</name>
    </author>
    <content type="html">&lt;p&gt;I can&amp;#8217;t take credit for the title, it&amp;#8217;s a direct quote from a fantastic talk that I just saw by &lt;a href='http://en.wikipedia.org/wiki/Peter_Diamandis' title='Peter Diamandis’ Bio on Wikipedia'&gt;Peter Diamandis&lt;/a&gt;, the force behind the &lt;a href='http://www.xprize.org/' title='The X Prize Foundation'&gt;X Prize Foundation&lt;/a&gt;. Peter is a superb speaker. The room was packed and he didn&amp;#8217;t disappoint. He is passionate, eloquent and flat-out inspiring. Now, I&amp;#8217;ve been incredibly lucky to be surrounded by inspiration at &lt;a href='http://mit.edu/' title='MIT'&gt;MIT&lt;/a&gt;, &lt;a href='https://cloudant.com/' title='Cloudant'&gt;Cloudant&lt;/a&gt; and &lt;a href='http://ycombinator.com/' title='Y Combinator'&gt;Y-Combinator&lt;/a&gt;, but… Something about this talk really struck home.&lt;/p&gt;

&lt;p&gt;From our time in YC and beyond, Paul Graham has always been pounding home a single message: &lt;a href='http://www.paulgraham.com/good.html' title='PG’s ‘Make Something People Want’ Article'&gt;make something people want&lt;/a&gt;. By now I&amp;#8217;m sure everyone has seen the &lt;a href='http://www.zazzle.com/make_something_people_want_tshirt-235395273105770540' title='Make Something People Want T-Shirts'&gt;t-shirts&lt;/a&gt; and knows the slogan. Something about this motto has always struck me as just a bit, well, incomplete. Yes, I want to make something people want. Yes, that&amp;#8217;s as good of a guiding principle as any on the path to success. However, following that mantra to its logical end can actually lead to sub-optimal outcomes on a whole. I&amp;#8217;d bet a decent chunk of entrepreneurs (PG clearly included) actually want to make the world a better place while following their passions. Most of us at Cloudant spent the better parts of our young careers trying (sometimes in vain) to understand what the universe is made of and how it behaves! And somehow I&amp;#8217;ve always felt this tension between those two poles: what the market wants and what actually makes the world a better place. And that&amp;#8217;s when Peter&amp;#8217;s message finally hit home.&lt;/p&gt;

&lt;p&gt;Peter recognizes that sometimes free market forces alone don&amp;#8217;t converge on the global minimum. Sometimes they need a nudge to escape a local minimum, and Peter has made it his life mission to use incentive prizes to nudge the market as needed.&lt;/p&gt;

&lt;p&gt;The X Prize Foundation is awesome. They identify hard problems with high stakes impact on society as a whole (water, medicine, energy, enviornment) and create an innovative/entrepreneurial environment to solve those problems. For profit. Yes the X Prize Foundation is strictly philanthropic, but the contestants are anything but. The foundation only gives prize money to the winning team, but that doesn&amp;#8217;t matter &amp;#8211; they&amp;#8217;ve just created a new market from scratch, and a big one to boot! In the case of the &lt;a href='http://en.wikipedia.org/wiki/Ansari_X_Prize' title='Ansari X Prize (for space flight'&gt;first X Prize, for space flight&lt;/a&gt; (actually 100 km elevation, to be precise), they&amp;#8217;ve created a billion dollar industry, nearly overnight&lt;sup id='fnref:1'&gt;&lt;a href='#fn:1' rel='footnote'&gt;1&lt;/a&gt;&lt;/sup&gt;. To an entrepreneur that is simply amazing: the prize and the ecosystem it spawned ameliorate the risk. You don&amp;#8217;t have to win the prize to be successful. Great team, great gumption, and clarity of vision: you&amp;#8217;ve got a fighting chance to do anything. Great team, great gumption, clarity, revolutionary space, &lt;em&gt;and&lt;/em&gt; guaranteed market‽ Now you&amp;#8217;re really talking!&lt;/p&gt;

&lt;p&gt;Finally, Peter opened and closed with a question: “What are you passionate about?” This is a big one. At &lt;a href='https://cloudant.com/#!/solutions/cloud' title='Sign Up for Cloudant Cloud'&gt;Cloudant&lt;/a&gt;, we are passionate about innovation and it&amp;#8217;s heartening to see the explosion of not just new companies and technology, but also forces such as YCombinator and the X Prize Foundation that are changing both the way innovation happens as well as what it targets. PG and Peter D. — keep it up!&lt;/p&gt;
&lt;div class='footnotes'&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id='fn:1'&gt;
&lt;p&gt;Ok, we can quibble about the market&amp;#8217;s existence prior to the 1st prize (hell, Boeing is in the news daily here in Seattle). But.. I walked away convinced that there was at least $1B of &lt;em&gt;new&lt;/em&gt; market created, in addition to anything pre-existing.&lt;/p&gt;
&lt;a href='#fnref:1' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/yEORgowKEw0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/using-incentive-prizes-to-crowdsource-brilliance</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/new-cloudant-hq</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Ej2Lx2WTMzo/new-cloudant-hq" />
    <title type="html">New Cloudant HQ (with pictures!)</title>
    <updated>2011-02-23T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;div style='width: 860px; overflow: auto'&gt;&lt;img src='/images/office-wide2.jpg' style='margin-bottom: -9px' /&gt;&lt;/div&gt;
&lt;p&gt;The number 402 is following me, you could call it my lucky number. And apparently I&amp;#8217;m sharing the luck with my cofounders. I should probably take our investors&amp;#8217; money to Vegas and bet on 402. Back when I first moved to the east coast my first apartment was at 402 Broadway in Cambridge. My office at MIT, where I first met and worked with my cofounders was in Building 26, office 402. When we started Cloudant we set up shop in a small basement office at 402 Highland Ave. in Somerville. Starting to get creepy right? Well, this week we finally moved into our new office space in the south end. We had outgrown the place in Davis Sq. and as much as we are going to miss its horror-movie ambiance (no really, when we moved in that office looked like the set of &amp;#8220;Saw&amp;#8221;) we couldn&amp;#8217;t be more excited about our new digs. Where are they? 580 Harrison Avenue, Suite 402. If I were a man that believed in such things, I would think the universe was trying to tell me something. My colleagues tell me that 402 is an obscure HTTP error code for &amp;#8220;Payment Required.&amp;#8221; Maybe the universe is calling in some IOUs, or maybe it&amp;#8217;s just suggesting that we need to charge more.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/office2.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Anyway, here are a few pictures of the team working in the new space. The new office has exposed brick wall, large windows without bars on them, and enough room for more than three desks. All of these amenities were lacking in the old office.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/office1.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s a big upgrade from our previous place. If you have the time and the inclination, please stop by to say hi. We&amp;#8217;re always happy to chat about CouchDB, startups, complex data problems, NOSQL, and our favorite Twilight Zone episodes. Oh yeah, and if all this sounds enticing (and how could it not?) we&amp;#8217;re looking for a crack devops engineer to join the team. If you are serious about keeping the servers well-oiled, building distributed systems, and providing a great cloud service, apply &lt;a href='http://cloudant.theresumator.com/apply/afm6Q3/SysAdminOperations-Engineer.html'&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/office3.jpg' alt='' /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Ej2Lx2WTMzo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/new-cloudant-hq</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/bigcouch-0.3</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/rtETzqe4vuA/bigcouch-0.3" />
    <title type="html">BigCouch 0.3</title>
    <updated>2011-02-11T00:00:00-08:00</updated>
    <author>
      <name>Bob Dionne</name>
    </author>
    <content type="html">&lt;p&gt;Time sure flies when you&amp;#8217;re having fun. It&amp;#8217;s been a little over three months since the first &lt;a href='https://github.com/cloudant/bigcouch'&gt;BigCouch&lt;/a&gt; release so we thought it might be a good time to package and release a new version. A lot of folks forked this first release and started using it, providing valuable feedback, logging issues and bug reports. We greatly appreciate the effort and hopefully have covered most of the issues. This release sports a major new feature in addition to lots of consolidation and bug fixes.&lt;/p&gt;

&lt;p&gt;BigCouch has several simply architected layers that provide the core functionality. These are now broken out into separate sub-projects that are managed as dependencies by &lt;a href='https://github.com/basho/rebar'&gt;rebar&lt;/a&gt;, along with ibrowse, mochiweb and the other dependencies. This allows these projects to evolve independently and enables BigCouch developers to switch between various branches as needed. We&amp;#8217;ve fixed several bugs and added specs and docs to &lt;a href='https://github.com/cloudant/fabric'&gt;fabric&lt;/a&gt;, which together with &lt;a href='https://github.com/cloudant/rexi'&gt;rexi&lt;/a&gt; provides our distributed CouchDB API. Rexi is actually a very nice RPC like layer that can be easily used standalone if needed.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ve done a lot to tighten up propagation of errors through the system, reducing the number of &lt;code&gt;dead_shards&lt;/code&gt; errors that occur. For the most part these errors are harmless, often the result of a bad Javascript function in view code. At the suggestion of our operations team we&amp;#8217;ve tagged each request with a unique id which is returned in the &lt;code&gt;HTTP&lt;/code&gt; headers but is also written in the logs. This helps us track errors better as we&amp;#8217;re able to map specific stack traces to API calls. We&amp;#8217;ve also created an in-memory buffer in the &lt;code&gt;rexi&lt;/code&gt; server that is accessible on the back end and maintains a configurable number of errors and stack traces.&lt;/p&gt;

&lt;p&gt;The major feature addition in this release is shard synchronization in the &lt;a href='https://github.com/cloudant/mem3'&gt;mem3&lt;/a&gt; layer. By proactively triggering replications between database shard copies we reduce the amount of time required to restore the proper replica level for all documents after a node outage. Towards this end we&amp;#8217;ve implemented a new lightweight replicator customized for use with shards, and integrated it into &lt;code&gt;mem3&lt;/code&gt;. We saw that this replicator could also be used to replicate the &lt;code&gt;nodes&lt;/code&gt; and &lt;code&gt;shard_db&lt;/code&gt; databases which are used to manage the cluster information, thereby allowing us to not need the heavier weight CouchDB replicator internally. It&amp;#8217;s still new and has some kinks to work out but we wanted to get it into developers hands as soon as we could. We encourage your feedback.&lt;/p&gt;

&lt;p&gt;Last, but surely not least, we&amp;#8217;ve added &lt;a href='http://blog.cloudant.com/bob-newson-and-tim-anglade-join-cloudant'&gt;Robert Newson&lt;/a&gt; to the BigCouch team. He&amp;#8217;s hit the ground running and has already fixed some of the trickier issues with which we&amp;#8217;ve been grappling.&lt;/p&gt;

&lt;p&gt;These are just a few of the items covered in this release; all specific changes are enumerated in the &lt;a href='https://github.com/cloudant/bigcouch/wiki/Release-Notes'&gt;release notes&lt;/a&gt;. You can always build BigCouch straight from the &lt;a href='https://github.com/cloudant/bigcouch'&gt;source&lt;/a&gt;, but for your convenience BigCouch 0.3 is now available via precompiled RPM and .deb packages on the &lt;a href='https://github.com/cloudant/bigcouch/downloads'&gt;downloads&lt;/a&gt; page at Github and as a &lt;a href='https://github.com/cloudant/cloudant_cookbooks/tree/master/bigcouch'&gt;cookbook&lt;/a&gt; for installation via the Opscode Chef platform.&lt;/p&gt;

&lt;p&gt;Thanks for using BigCouch!&lt;/p&gt;
&lt;!-- We get lots of question about the differences between CouchDB and
BigCouch. At the API level there basically aren't other than a few
arising from BigCouch being fully distributed. We've started a
[BigCouch][7] WIKI page where we'll be documenting this. --&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/rtETzqe4vuA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/bigcouch-0.3</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/some-thoughts-on-the-couchbase-announcement</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Hmcqf54T_a8/some-thoughts-on-the-couchbase-announcement" />
    <title type="html">Some Thoughts on the Couchbase Announcement</title>
    <updated>2011-02-08T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;That will teach me to go to sleep before midnight on a weekday.&lt;/p&gt;

&lt;p&gt;I woke up this morning to find a shakeup in the world of NOSQL. &lt;a href='http://www.membase.com/merger-press-release'&gt;CouchOne has merged with Membase&lt;/a&gt; to form &lt;a href='http://www.couchbase.com/'&gt;Couchbase&lt;/a&gt;, “the most comprehensive data management solution for scalable web and mobile applications.” I’ll add mine to the many voices wishing luck to the new company and the communities it supports. We’re excited to see more and more resources being poured into the NOSQL space. Congratulations to Damien, James, and everyone at both companies.&lt;/p&gt;

&lt;p&gt;We’ve been asked if this changes anything at Cloudant. The answer is no. We’ll continue to offer Cloudant’s hosted, managed, scalable data platform. &lt;a href='http://couchdb.apache.org/'&gt;Apache CouchDB&lt;/a&gt; remains an important part of our technology offering; it forms the core data store around which we’ve built our wider platform. We have always been advocates, contributors, and leaders in the CouchDB community and we see no reason to change that. We’ll continue our support for both CouchDB and &lt;a href='https://cloudant.com/#!/solutions/bigcouch'&gt;BigCouch&lt;/a&gt;. We’ll continue to provide our customers and partners with a robust database, search, and analytics platform to power their mission-critical business applications – as we’ve done for the last two years.&lt;/p&gt;

&lt;p&gt;I do want to take issue with one thing said in the &lt;a href='http://www.membase.com/merger-press-release'&gt;press release&lt;/a&gt; for Couchbase. They say,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Couchbase becomes the only document database capable of safely storing your data&lt;br /&gt;whether stored on a single server, or spread across hundreds.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some of our customers have billions of documents stored safely on dozens of nodes in datacenters around the world. It’s too soon to say what Couchbase will become, but if you need a safe, scalable, and easy-to-use document storage platform, our technology already provides that today: &lt;a href='https://cloudant.com/#!/solutions'&gt;cloudant.com/solutions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Alan Hoffman &lt;div class='dim'&gt;Co-founder and CEO, &lt;a href='https://cloudant.com/'&gt;Cloudant&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Hmcqf54T_a8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/some-thoughts-on-the-couchbase-announcement</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/searchapp-add-a-searchbox-to-your-couchapps-and-couchdb-databases-in-10-minutes</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/VEUPkeOb5LY/searchapp-add-a-searchbox-to-your-couchapps-and-couchdb-databases-in-10-minutes" />
    <title type="html">SearchApp – Add a Searchbox to your CouchApps and CouchDB Databases in 10 Minutes</title>
    <updated>2011-02-03T00:00:00-08:00</updated>
    <author>
      <name>David Hardtke</name>
    </author>
    <content type="html">&lt;p&gt;Recently we released the developer preview of our &lt;a href='http://blog.cloudant.com/developer-preview-cloudant-search-for-couchdb'&gt;full-text indexing and search for Cloudant&amp;#8217;s hosted CouchDB&lt;/a&gt;. Here we will explain how to use a simple CouchApp to add search to your existing CouchApps and CouchDB databases. The goal is to make your data searchable in 10 minutes are less. Start your timers.&lt;/p&gt;

&lt;p&gt;To get this running, you&amp;#8217;ll need 4 things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://git-scm.com/'&gt;Git&lt;/a&gt; version control system&lt;/li&gt;

&lt;li&gt;The &lt;a href='http://couchapp.org/page/installing'&gt;couchapp&lt;/a&gt; command line tool is used to generate code templates in your application and to push your changes to an instance of CouchDB. This has been tested on couchapp version 0.6.1 and higher.&lt;/li&gt;

&lt;li&gt;&lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;Free Cloudant account&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;An existing CouchDB database, CouchApp, or a data importer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Note: CouchApps are JavaScript and HTML5 applications served directly from CouchDB. &lt;code&gt;couchapp&lt;/code&gt; is a command line tool used to create and manage CouchApps.)&lt;/p&gt;

&lt;p&gt;If your CouchDB database is not already hosted at Cloudant, you&amp;#8217;ll need to replicate it to Cloudant. I&amp;#8217;m assuming your CouchDB database or CouchApp (named &lt;code&gt;mydb&lt;/code&gt;) is on your local CouchDB instance (&lt;a href='http://localhost:5984/mydb'&gt;http://localhost:5984/mydb&lt;/a&gt;), and that your Cloudant username/password is &amp;#60;user&amp;#62;/&amp;#60;password&amp;#62;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl http://localhost:5984/_replicate -H &lt;span class='s1'&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; -d &lt;span class='s1'&gt;&amp;#39;{ &amp;quot;source&amp;quot;: &amp;quot;mydb&amp;quot;, &amp;quot;target&amp;quot;: &amp;quot;https://&amp;lt;user&amp;gt;:&amp;lt;pass&amp;gt;@&amp;lt;user&amp;gt;.cloudant.com/mydb&amp;quot;, &amp;quot;create_target&amp;quot;:true}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, you&amp;#8217;ll need to clone the &lt;a href='https://cloudant.com/#!/solutions/cloud'&gt;SearchApp&lt;/a&gt;. To do this, use the &lt;code&gt;git clone&lt;/code&gt; command:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;git clone git@github.com:cloudant/SearchApp.git
&lt;span class='nv'&gt;$ &lt;/span&gt;&lt;span class='nb'&gt;cd &lt;/span&gt;SearchApp
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;For convenience, you can make your database the default target for your SearchApp. Modify the file &lt;code&gt;.couchapprc&lt;/code&gt; as follows:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;env&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;default&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;db&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;http://&amp;lt;user&amp;gt;:&amp;lt;pass&amp;gt;@&amp;lt;user&amp;gt;.cloudant.com:5984/mydb&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now for the last step. Push your SearchApp on top of your database:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;couchapp push
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you want to push to a different location that specified in the &lt;code&gt;.couchapprc&lt;/code&gt; file, do:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;couchapp push http://&amp;lt;user&amp;gt;:&amp;lt;pass&amp;gt;@&amp;lt;user&amp;gt;.cloudant.com:5984/mydb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You should see the following message:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;2011-02-01 11:49:36 &lt;span class='o'&gt;[&lt;/span&gt;INFO&lt;span class='o'&gt;]&lt;/span&gt; Visit your CouchApp here:
http://&amp;lt;user&amp;gt;.cloudant.com:5984/mydb/_design/searchapp/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Visit that page and you&amp;#8217;ll have a working search box. Now check your watch &amp;#8211; has it been more that 10 minutes? Your searches might come up blank at first if you have a large database. Your database needs to be indexed before it can be searched. The indexing is a distributed Map-Reduce view. You can check the status of indexing using the Cloudant dashboard at:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;https://cloudant.com/#!/dashboard/&amp;lt;user&amp;gt;/mydb/stats
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;(be sure to insert your username in the url).&lt;/p&gt;

&lt;p&gt;For a more details on configuring SearchApp, please look at the &lt;a href='https://github.com/cloudant/SearchApp'&gt;README&lt;/a&gt; file. To configure the indexing strategy, check out the &lt;a href='http://support.cloudant.com/customer/portal/articles/359319-search-indexing'&gt;search indexing page&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/VEUPkeOb5LY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/searchapp-add-a-searchbox-to-your-couchapps-and-couchdb-databases-in-10-minutes</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/mapreduce-from-the-basics-to-the-actually-useful</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/c33CXvDZvNQ/mapreduce-from-the-basics-to-the-actually-useful" />
    <title type="html">MapReduce from the basics to the actually useful (in under 30 minutes)</title>
    <updated>2011-01-13T00:00:00-08:00</updated>
    <author>
      <name>Mike Miller</name>
    </author>
    <content type="html">&lt;p&gt;Recently, Tim Anglade culminated his NOSQL World Tour with the release of &lt;a href='http://nosqltapes.com'&gt;the NOSQL Tapes&lt;/a&gt;, a collection of live interviews collected globally. Not only do I find that site aesthetically pleasing (courtesy of our own &lt;a href='http://twitter.com/steadicat'&gt;Steadicat&lt;/a&gt;), but there is a tremendous amount of solid content, from technical discussions to opinions and conjectures from many of the young leaders in the field. I was fortunate to get a bit of Tim’s time when he stopped in Seattle and we recorded a &lt;a href='http://nosqltap.es/8'&gt;longish video&lt;/a&gt; on MapReduce in my lab at UW. While I love the old school feel of a chalk-talk, I must admit I’m pretty embarrassed at how rambling and fragmented my explanations are, not to mention my shoddy use of available board space. Therefore the Physics Professor in me feels obligated to try again, albeit offline this time.&lt;/p&gt;

&lt;h3 id='brief_nosql_taxonomy'&gt;Brief NOSQL Taxonomy&lt;/h3&gt;

&lt;p&gt;To set the MapReduce stage, I’m going to offer a very naive taxonomy of NoSQL data stores (apologies to the experts). I have yet to meet a database that isn’t a key/value store, so let’s focus on some higher level distinction. In particular, let’s focus on the difference between &lt;em&gt;big tables&lt;/em&gt; (BigTable, HBase, Cassandra, etc.) and &lt;em&gt;document store&lt;/em&gt;s (CouchDB, MongoDB). All of these solutions are finding solid acceptance in the wild, so what – if any – difference is there? My one-word answer is &lt;em&gt;flexibility&lt;/em&gt;. Huh, isn’t all NoSQL flexible? Well… yes and no. In my eyes, BigTable and its derivatives excel at one thing in particular: structuring your data for the efficient I/O access that is necessary to get blazing read speeds for large data sets. Somewhat orthogonal, document stores, especially CouchDB, prioritize flexibility. In particular, there is no requirement to define columns, column families, or super columns up front. You simply encapsulate your data as documents and push them into the store. How then, you may ask, can you get efficient queries? MongoDB treats the problem with blazingly fast in-memory table scans and document introspection for index builds, whereas CouchDB takes a different approach with something called incremental MapReduce. I’m going to briefly explain the latter and then show you how it works in action.&lt;/p&gt;

&lt;h3 id='mapreduce_primer'&gt;MapReduce Primer&lt;/h3&gt;

&lt;p&gt;MapReduce is an old design pattern that was recently made famous by Google. There are many different implementations, and I won’t even try to address them all. It suffices to say that MapReduce is all about giving programmers an efficient way to consume data without needing to know how or where it is actually stored. Further, MapReduce excels at traversing datasets that live on more than one machine. It is simple, a bit restrictive, but extremely powerful. I’m going to show you how it works in CouchDB (well, actually in BigCouch hosted on Cloudant.com).&lt;/p&gt;

&lt;p&gt;Broadly speaking, CouchDB (and Cloudant’s BigCouch) use MapReduce as a tool to let you introspect your data and build persistent ‘views’ (indices) for fast query responses. And, oh yeah, it does it incrementally. Let’s examine the pieces in detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;View builds.&lt;/strong&gt; The process of scanning over your data to create indices that make queries fast. This step also often performs data normalization.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;MapReduce.&lt;/strong&gt; The framework by which user code gets executed for index builds.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;View queries&lt;/strong&gt;. How you get the information out of your indices&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Incremental.&lt;/strong&gt; When new documents are added or existing documents are modified/removed, you don’t need to rescan your entire dataset. Instead the view engine only rescans the new/modified documents, and deletes the contributions from the deleted/modified documents. It’s a complex implementation, but one that really separates the Couch MapReduce model from, e.g., Hadoop’s or Riak’s implementations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For full details on Cloudant’s implementation of MapReduce, take a look at &lt;a href='http://blog.cloudant.com/dynamo-and-couchdb-clusters'&gt;Dynamo and CouchDB Clusters&lt;/a&gt; and &lt;a href='http://oreillynet.com/pub/e/1760'&gt;Adam’s O’Reilly Webcast&lt;/a&gt;. So what do you actually have to do? Well, you simply need to write one or two functions. The ‘map’ function is required, and the ‘reduce’ is optional. For simple sorting problems (e.g. building a SEO reverse index) map alone suffices. For data aggregation, reduce comes into the picture. CouchDB allows you to write these functions in any language you choose, although JavaScript is the most common. Let’s put some meat on the bones with examples. Below I’m going to show you how to do three of the most common things people do with CouchDB’s MapReduce:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;sort documents based on arbitrary information&lt;/li&gt;

&lt;li&gt;calculate aggregate statistics&lt;/li&gt;

&lt;li&gt;perform a time-series analysis&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id='our_example_problem'&gt;Our Example Problem&lt;/h3&gt;

&lt;p&gt;We are going to load and analyze FAA plane crash data from &lt;a href='http://data.gov/'&gt;data.gov&lt;/a&gt; using Cloudant. If you want to follow along at home, you have two choices.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use CouchDB replication to copy my db into yours via: &lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl &lt;span class='s1'&gt;&amp;#39;http://&amp;lt;usr&amp;gt;:&amp;lt;pwd&amp;gt;@&amp;lt;usr&amp;gt;.cloudant.com/_replicate&amp;#39;&lt;/span&gt; -Hcontent-type:application/json -d &lt;span class='s1'&gt;&amp;#39;{&amp;quot;source&amp;quot;:&amp;quot;http://mlmiller.cloudant.com/planes&amp;quot;,&amp;quot;target&amp;quot;:&amp;quot;http://&amp;lt;usr&amp;gt;:&amp;lt;pwd&amp;gt;@&amp;lt;usr&amp;gt;.cloudant.com/planes&amp;quot;,&amp;quot;create_target&amp;quot;:true}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Repeat from scratch by &lt;a href='http://github.com/mlmiller/examples/tree/master/aviation'&gt;getting the code&lt;/a&gt; from Github.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(1) is simpler and &lt;em&gt;doesn’t require any special software installed on your machine&lt;/em&gt;. All you need is to have a free account on &lt;a href='http://cloudant.com'&gt;Cloudant&lt;/a&gt;. (2) is a bit more effort but should work with any CouchDB server. If you go with (1), the best way to check the progress is to &lt;a href='http://cloudant.com'&gt;login to your account&lt;/a&gt;, click on your user dashboard (top right) and then click on the newly created ‘planes’ database. If you examine the Stats tab and refresh periodically, you will see the db size increasing, as well as some MapReduce ‘views’ running as the data imports:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/planes-indexing.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;That bar that registers 31.7% is telling you that MapReduce is being used to index your documents in real time without you having to write any code at all. The ‘2839 of 8952’ on the right represents the fraction of freshly added/updated documents that is processed in this current pass, and if you click on ‘show details’ you can see the results of the MapReduce processes on each of the cluster nodes that contain any chunk of your data. That&amp;#8217;s just how easy it is to get your code running, in parallel, in realtime!&lt;/p&gt;

&lt;h3 id='data_import'&gt;Data Import&lt;/h3&gt;

&lt;p&gt;I’ve chosen to import the FAA crash data using my favorite tools: Python and Benoit’s wonderful &lt;a href='http://couchdbkit.org/'&gt;Couchdbkit&lt;/a&gt; library. If you use the Python &lt;a href='https://code.google.com/p/boto/'&gt;Boto&lt;/a&gt; module for AWS, you will feel right at home. In &lt;a href='https://github.com/mlmiller/examples/blob/master/aviation/upload.py'&gt;upload.py&lt;/a&gt;, I use the very handy &lt;code&gt;DictReader&lt;/code&gt; class from Python’s &lt;code&gt;csv&lt;/code&gt; module to parse the &lt;code&gt;AviationData.txt.gz&lt;/code&gt;. &lt;code&gt;DictReader&lt;/code&gt; slurps a line of a CSV (or similarly structured text file) with column headings and gives you back a dictionary. It’s a one-liner to serialize that Python dictionary and push it into Cloudant. If you want to try this yourself the &lt;code&gt;README&lt;/code&gt; file has instructions on installing the Couchdbkit module and executing the &lt;code&gt;upload.py&lt;/code&gt; script, but it just boils down to:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;python upload.py AviationData.txt.gz &lt;span class='s1'&gt;&amp;#39;http://&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;username&amp;gt;.cloudant.com&amp;#39;&lt;/span&gt; planes
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;My inported data lives at &lt;a href='http://mlmiller.cloudant.com/planes'&gt;http://mlmiller.cloudant.com/planes&lt;/a&gt;. One thing to note: you can see that I don’t take any steps to discover the type of the data on import. Instead, we just throw it all into Cloudant and we can sort it out later using MapReduce (_flexible_). Once the data is fully imported, I can login into &lt;a href='https://cloudant.com/'&gt;cloudant.com&lt;/a&gt; and view the ‘planes’ database in the dashboard:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/planes-stats.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;I’ve also gone into the Permissions tab and granted read access to the data:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/planes-permissions.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Each document contains quite a bit of data, too much to fit onto a single screen shot, in fact:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/planes-documents.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;But the important thing to note is that we have data for nearly 70,000 domestic accidents, spanning the range 1988–2010. If you want to look at a single document from your command line, you can via:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://&amp;lt;usr&amp;gt;:&amp;lt;pwd&amp;gt;@&amp;lt;usr&amp;gt;.cloudant.com/planes/_all_docs?limit=1&amp;amp;include_docs=true&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and if you want it pretty printed, my favorite is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://&amp;lt;usr&amp;gt;:&amp;lt;pwd&amp;gt;@&amp;lt;usr&amp;gt;.cloudant.com/planes/_all_docs?limit=1&amp;amp;include_docs=true&amp;#39;&lt;/span&gt; | python -m json.tool
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Since I&amp;#8217;ve granted read permissions on mlmiller/planes, you can execute this yourself via:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_all_docs?limit=1&amp;amp;include_docs=true&amp;#39;&lt;/span&gt; | python -m json.tool
&lt;span class='o'&gt;{&lt;/span&gt;
    &lt;span class='s2'&gt;&amp;quot;offset&amp;quot;&lt;/span&gt;: 0,
    &lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;: &lt;span class='o'&gt;[&lt;/span&gt;
        &lt;span class='o'&gt;{&lt;/span&gt;
            &lt;span class='s2'&gt;&amp;quot;doc&amp;quot;&lt;/span&gt;: &lt;span class='o'&gt;{&lt;/span&gt;
                &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Accident Number&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;LAX08CA100&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Air Carrier&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Aircraft Category&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Aircraft Damage&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Substantial&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Airport Code&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;U42&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Airport Name&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Salt Lake City Muni 2&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Amateur Built&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Yes&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Broad Phase of Flight&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Country&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;United States&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Engine Type&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Reciprocating&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Event Date&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;04/12/2008&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Event Id&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;20080513X00662&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;FAR Description&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Injury Severity&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Non-Fatal&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Investigation Type&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Accident&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Latitude&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;40.619445&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Location&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Salt Lake City, UT&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Longitude&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;-111.992777&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Make&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Questair, Inc.&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Model&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Venture&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Number of Engines&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Publication Date&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;05/28/2008&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Purpose of Flight&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Personal&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Registration Number&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;N36V&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Report Status&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;Probable Cause&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Schedule&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Total Fatal Injuries&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Total Minor Injuries&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;2&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Total Serious Injuries&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Total Uninjured&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;Weather Condition&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;VMC&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f83000947&amp;quot;&lt;/span&gt;,
                &lt;span class='s2'&gt;&amp;quot;_rev&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;1-3e9637bb5214c82fc7b29bb4a75e765b&amp;quot;&lt;/span&gt;
            &lt;span class='o'&gt;}&lt;/span&gt;,
            &lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f83000947&amp;quot;&lt;/span&gt;,
            &lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f83000947&amp;quot;&lt;/span&gt;,
            &lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;: &lt;span class='o'&gt;{&lt;/span&gt;
                &lt;span class='s2'&gt;&amp;quot;rev&amp;quot;&lt;/span&gt;: &lt;span class='s2'&gt;&amp;quot;1-3e9637bb5214c82fc7b29bb4a75e765b&amp;quot;&lt;/span&gt;
            &lt;span class='o'&gt;}&lt;/span&gt;
        &lt;span class='o'&gt;}&lt;/span&gt;
    &lt;span class='o'&gt;]&lt;/span&gt;,
    &lt;span class='s2'&gt;&amp;quot;total_rows&amp;quot;&lt;/span&gt;: 68388
&lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id='example_1_sort'&gt;Example 1: Sort&lt;/h3&gt;

&lt;p&gt;Now that we have the data, let’s get down to business. Key/Value is great, but I want to be able get find all the documents for a given brand of plane, say Cessna. This is really an inverted index, and is in the absolute sweet spot for MapReduce. We can accomplish this with a ‘map-only’ view that looks like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;emit&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Make&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;null&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The MapReduce code is actually stored in the database as part of a view in a design document (see the &lt;a href='http://guide.couchdb.org/editions/1/en/views.html'&gt;CouchDB Book&lt;/a&gt; for more details). My favorite method is to use a client-side tool such as &lt;code&gt;couchapp&lt;/code&gt; or &lt;code&gt;couchdbkit&lt;/code&gt; that allows me to organize &lt;code&gt;map.js&lt;/code&gt; and &lt;code&gt;reduce.js&lt;/code&gt; files according to a filesystem hierarchy and then automatically upload them to the database as a design document. I actually snuck that two-liner into &lt;a href='https://github.com/mlmiller/examples/blob/master/aviation/upload.py#L20'&gt;&lt;code&gt;upload.py&lt;/code&gt;&lt;/a&gt;, where I have:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='py'&gt;&lt;span class='n'&gt;loader&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;FileSystemDocsLoader&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;#39;_design/&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='n'&gt;loader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;sync&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;db&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;verbose&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='bp'&gt;True&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Those two lines unpack the contents of the &lt;code&gt;_design&lt;/code&gt; directory and build a design document. That directory looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/folders.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;This gives me a design document with the name &lt;code&gt;example&lt;/code&gt;; that contains two views, one called &lt;code&gt;date&lt;/code&gt; and one called &lt;code&gt;make&lt;/code&gt;. You can see the entire design document from the command line via:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET http://mlmiller.cloudant.com/planes/_design/example
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;or you can just browse the ‘_design’ code in the file &lt;a href='https://github.com/mlmiller/examples/blob/master/aviation/_design/example/views/make/map.js'&gt;&lt;code&gt;_design/example/views/make/map.js&lt;/code&gt;&lt;/a&gt;. The code looks like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;emit&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Make&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;emit()&lt;/code&gt; function generates a key/value pair that gets sorted according to CouchDB&amp;#8217;s deterministic &lt;a href='http://wiki.apache.org/couchdb/View_collation#Collation_Specification'&gt;collation order&lt;/a&gt;. These key/value pairs are either stored directly in the view index, or passed through the reducer first (see below). Don’t worry about the second argument to the emit method, that’s for the the reduce phase and we don’t need that for a basic sort. The moment that we upload that design document to Cloudant, the index is kept up to date automatically. That’s quite different than the default CouchDB behavior, but it’s a nice optimization to make sure that the query response is snappy.&lt;/p&gt;

&lt;p&gt;Query (finally!). Let’s find all of the documents (‘rows’) that have &lt;code&gt;doc.Make==&amp;quot;Cessna&amp;quot;&lt;/code&gt;. Since we emitted &lt;code&gt;doc.Make&lt;/code&gt; in our map code, &lt;code&gt;doc.Make&lt;/code&gt; is therefore the ‘key’ for this index, and that means we get snappy responses to queries like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make?reduce=false&amp;amp;key=&amp;quot;Cessna&amp;quot;&amp;amp;limit=10&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;total_rows&amp;quot;&lt;/span&gt;:68387,&lt;span class='s2'&gt;&amp;quot;offset&amp;quot;&lt;/span&gt;:13905,&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f8300324c&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f83003a2f&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f830060ec&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f83006bfb&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f8300a5ae&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f8300e15d&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f830162b7&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f8301a3a4&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f8301a54e&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;0fedbabcd21f15785750457f83058740&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;Cessna&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;
&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The full list of query options is &lt;a href='http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options'&gt;given here&lt;/a&gt;, but really there are only a handful of options I typically use. For this query, if you remove the &lt;code&gt;limit&lt;/code&gt; argument you will get the entire list of crashes with a Cessna involved. If you want to do some fun statistics, you can try:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make?reduce=false&amp;amp;key=&amp;quot;Airbus&amp;quot;&amp;#39;&lt;/span&gt; | wc -l 15
&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make?reduce=false&amp;amp;key=&amp;quot;Boeing&amp;quot;&amp;#39;&lt;/span&gt; | wc -l 773
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Well that’s interesting! But wait, isn’t there a more efficient way to calculate statistics than slurping the entire set of Boeing lines to the client and doing a client-side count? You bet, and that’s where reduce comes in.&lt;/p&gt;

&lt;h3 id='example_2_data_aggregation'&gt;Example 2: Data Aggregation&lt;/h3&gt;

&lt;p&gt;Now we want to go beyond simple sorts and aggregate to find the total number of crashes for different types of planes. Reduce is perfect for this, and that’s why we did &lt;code&gt;emit(doc.Make,1)&lt;/code&gt; in &lt;code&gt;map.js&lt;/code&gt;. If you look at the corresponding &lt;a href='https://github.com/mlmiller/examples/blob/master/aviation/_design/example/views/make/reduce.js'&gt;&lt;code&gt;reduce.js&lt;/code&gt;&lt;/a&gt; file for that view you’ll see nothing more than: &lt;code&gt;_sum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What the heck is that? Well there are certain aggregation tasks that are simply so common (count, sum, average, min, max, etc.) that we have coded them up in erlang and pushed them into the database. Cloudant has an ever growing number of built-in reduces (_builtins_), and using a builtin is always faster and less error prone than writing it yourself. As an avid user, I can admit that I haven’t used a non-builtin reduce in at least 9 months. So the &lt;code&gt;_sum&lt;/code&gt; that we use here is simply going to add up the numbers that we emitted as the 2nd argument to &lt;code&gt;emit()&lt;/code&gt; in the &lt;code&gt;map.js&lt;/code&gt; function. Now we can answer the Boeing vs. Airbus question without any client side work via:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make?key=&amp;quot;Boeing&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:null,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:771&lt;span class='o'&gt;}&lt;/span&gt;
&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make?key=&amp;quot;Airbus&amp;quot;&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:null,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:13&lt;span class='o'&gt;}&lt;/span&gt;
&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Check that out! Hmm, now suppose I want to find the total number of accidents, I can then just do:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:null,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:68387&lt;span class='o'&gt;}&lt;/span&gt;
&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Very cool, and if I want to make a graph of how they plot out vs manufacture I can add the &lt;code&gt;group=true&lt;/code&gt; option:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/make?group=true&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:53&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;107.5 Flying Corporation&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;1200&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;1977 COLFER-CHAN&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;1ST FTR GP&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;2000 McCoy&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;2001 MCGIRL&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;2003 Nash&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;2007 Savage Air LLC&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;67 FLYING DUTCHMAN&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;85 MANISTA&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;A Pair of Jacks&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;A. H. GETTINGS&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;A. LE FRANCOIS&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:1&lt;span class='o'&gt;}&lt;/span&gt;,
…
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;(truncated because it’s a looong list!)&lt;/p&gt;

&lt;p&gt;Ok, so aggregation seems pretty straightforward. Now let’s go the last step to time-series.&lt;/p&gt;

&lt;h3 id='example_3_time_series_analysis'&gt;Example 3: Time Series Analysis&lt;/h3&gt;

&lt;p&gt;Let’s get a bit more numerical and ask, what’s the distribution of crashes and fatalities vs time. That’s what the &lt;code&gt;date&lt;/code&gt; view is for. If you inspect any of our crash documents you will see that they have a two other important fields: &lt;code&gt;Event Date&lt;/code&gt; and &lt;code&gt;Total Fatal Injuries&lt;/code&gt;. Let’s create an index that allows us to answer time-based queries about both the number of accidents and the number of fatalities. While a bit morbid, it’s good to know what the odds are! This example is a bit more complex because we are going to use an array for both arguments of &lt;code&gt;emit()&lt;/code&gt;. Take a look at the code in the &lt;a href='https://github.com/mlmiller/examples/blob/master/aviation/_design/example/views/date/map.js'&gt;&lt;code&gt;map.js&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='js'&gt;&lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;then&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nb'&gt;Date&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;Date&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;parse&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Event Date&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]));&lt;/span&gt;
    &lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;fatalities&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Total Fatal Injuries&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;&lt;span class='o'&gt;!=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;fatalities&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;parseInt&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Total Fatal Injuries&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='nx'&gt;emit&lt;/span&gt;&lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='nx'&gt;then&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;getFullYear&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt; &lt;span class='nx'&gt;then&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;getMonth&lt;/span&gt;&lt;span class='p'&gt;()],&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;fatalities&lt;/span&gt;&lt;span class='p'&gt;]);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is a bit more complex because we do some processing of the data. In line #2 we unpack the &lt;code&gt;Event Date&lt;/code&gt; variable into a JavaScript Date object, very handy. I find myself using &lt;code&gt;new Date(Date.parse(some_weird_timestamp))&lt;/code&gt; all the time. Line #6 simply casts our fatalities info into an integer. The magic is in &lt;code&gt;emit&lt;/code&gt;, where we use JavaScript arrays &lt;code&gt;[]&lt;/code&gt; for both the key and the value. Then, for reduce we use good ol’ &lt;code&gt;_sum&lt;/code&gt;. One of Cloudant’s additional builtins is a &lt;code&gt;_sum&lt;/code&gt; that works on arrays, very handy. Now to query this index we get rows that are sorted by year, then month. The index looks like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/date?group_level=2&amp;#39;&lt;/span&gt; | more
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,0&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;207,185&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,1&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;232,96&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,2&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;280,95&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,3&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;303,113&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;387,133&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,5&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;349,106&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,6&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;433,283&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,7&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;399,96&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,8&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;332,119&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,9&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;239,129&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,10&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;224,134&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982,11&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;208,96&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1983,0&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;199,102&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1983,1&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;210,72&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1983,2&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;264,91&lt;span class='o'&gt;]}&lt;/span&gt;,
…
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;So, e.g., 1982 month 0 (January) had 207 crashes and 185 fatalities. What was that &lt;code&gt;group_level&lt;/code&gt; command? Let’s try changing it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/date?group_level=1&amp;#39;&lt;/span&gt; | more
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1982&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;3593,1585&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1983&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;3556,1273&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1984&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;3457,1229&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1985&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;3096,1648&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1986&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;2880,1180&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1987&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;2828,1237&lt;span class='o'&gt;]}&lt;/span&gt;,
…
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Well that’s interesting! &lt;code&gt;group_level=1&lt;/code&gt; vs &lt;code&gt;2&lt;/code&gt; has a big effect: with &lt;code&gt;group_level=2&lt;/code&gt; we get the full granularity/dimensionality of the array we used for the key (first argument to &lt;code&gt;emit&lt;/code&gt;). But we can, at query time, reduce even further by integrating over month! Very cool, and the gory details are few: &lt;code&gt;group_level&lt;/code&gt; runs between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;length(key)&lt;/code&gt;, so in this case valid values are 0, 1, 2. If we specify &lt;code&gt;group_level=0&lt;/code&gt;, we’ll get sum statistics over the entire date range:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/date?group_level=0&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:null,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;68387,38652&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Awesome. And therein lies the power of using MapReduce for an efficient index build. With Cloudant you don’t need to install any software, you simply use the cloud hosted cluster to run your code. If you think about it, all we really had to do was write 9 lines of javascript for the map method, and no original code for the reduce method. We can use this same exact index to query for a given date range, say 1994:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/date?group_level=2&amp;amp;startkey=\[1994\]&amp;amp;endkey=\[1995\]&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,0&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;116,60&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,1&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;142,42&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,2&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;191,67&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,3&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;179,72&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;224,74&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,5&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;223,98&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,6&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;267,131&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,7&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;260,101&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,8&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;212,200&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,9&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;169,129&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,10&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;131,79&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,11&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;143,130&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;span class='o'&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;or if we want to do can turn off the reduce in the query and get all of the crashes from a given year/month combo:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X GET &lt;span class='s1'&gt;&amp;#39;http://mlmiller.cloudant.com/planes/_design/example/_view/date?key=\[1994,4\]&amp;amp;reduce=false&amp;#39;&lt;/span&gt; | more
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;total_rows&amp;quot;&lt;/span&gt;:68387,&lt;span class='s2'&gt;&amp;quot;offset&amp;quot;&lt;/span&gt;:34959,&lt;span class='s2'&gt;&amp;quot;rows&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c7c60&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,1&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c87b7&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,0&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c951a&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,2&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c9b0a&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,0&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c9bbb&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,0&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c9c15&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,1&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510c9d6d&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,0&lt;span class='o'&gt;]}&lt;/span&gt;,
&lt;span class='o'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;id&amp;quot;&lt;/span&gt;:&lt;span class='s2'&gt;&amp;quot;88601d815897032516f87f0c510ca925&amp;quot;&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;key&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1994,4&lt;span class='o'&gt;]&lt;/span&gt;,&lt;span class='s2'&gt;&amp;quot;value&amp;quot;&lt;/span&gt;:&lt;span class='o'&gt;[&lt;/span&gt;1,0&lt;span class='o'&gt;]}&lt;/span&gt;,
…
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Wow, handy! And if you want to really blow your mind, add the query-string parameter &lt;code&gt;?include_docs=true&lt;/code&gt; to get the full documents themselves.&lt;/p&gt;

&lt;h3 id='summary'&gt;Summary&lt;/h3&gt;

&lt;p&gt;There’s a lot of power in MapReduce, and I hope I’ve given you enough to get your hands dirty running it an an extremely simple way using a hosted service. If you have more questions, there are lots of examples on the &lt;a href='http://wiki.apache.org/couchdb/'&gt;CouchDB wiki&lt;/a&gt; or on the (&lt;a href='https://cloudant.tenderapp.com'&gt;Cloudant support center&lt;/a&gt;). But the rule of thumb is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sort:&lt;/strong&gt; map only&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;aggregate:&lt;/strong&gt; use a &lt;code&gt;_sum&lt;/code&gt; reduce + &lt;code&gt;group_level&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;time-series:&lt;/strong&gt; use an array of &lt;code&gt;[year, month, day, …]&lt;/code&gt; + &lt;code&gt;group_level&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next post, we’ll show you how to link Cloudant MapReduce views with builtin full-text/numerical search for killer data visualizations.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/c33CXvDZvNQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/mapreduce-from-the-basics-to-the-actually-useful</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/developer-preview-cloudant-search-for-couchdb</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/dMSNLbqW-ik/developer-preview-cloudant-search-for-couchdb" />
    <title type="html">Developer Preview: Cloudant Search for CouchDB</title>
    <updated>2011-01-11T00:00:00-08:00</updated>
    <author>
      <name>David Hardtke</name>
    </author>
    <content type="html">&lt;p&gt;CouchDB is a compelling choice for database-backed web apps and analytics applications. Cloudant’s hosted CouchDB service adds scaling, redundancy, and fault-tolerance to CouchDB. Today we are releasing a new feature for developers to try out: full text indexing and search.&lt;/p&gt;

&lt;p&gt;There are several products that implement search for CouchDB as external services (&lt;a href='http://github.com/rnewson/couchdb-lucene'&gt;couchdb-lucene&lt;/a&gt; and &lt;a href='http://www.elasticsearch.com/'&gt;ElasticSearch&lt;/a&gt;). Like these, our full text search uses Lucene query syntax and is based on Lucene. For Cloudant search, however, the search application is directly integrated into the Cloudant CouchDB database. This has several distinct advantages over other Lucene based search products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time Search.&lt;/strong&gt; Search results reflect state of database at moment it is searched. Little to no latency on document additions, changes, or deletions.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Indexing and Search using all valid JSON types.&lt;/strong&gt; In Lucene, the search terns are required to be strings. This is especially problematic for date range and numerical range searches. With Cloudant search, the tokens can be any valid JSON type (string, number, object, array, boolean, null).&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Fault-tolerance and redundancy.&lt;/strong&gt; The search indices are stored on the same nodes as their parent documents.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Little to no setup and configuration.&lt;/strong&gt; For basic search, the procedure is upload documents, enable search, search documents using REST interface.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Scalability.&lt;/strong&gt; Cloudant Core is designed to be horizontally scalable document store. Cloudant Search is a horizontally scalable search product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under the hood, our search consists of two parts. The first step is the creation of a &lt;em&gt;reverse index&lt;/em&gt;, or &lt;em&gt;posting list&lt;/em&gt;, for your documents. This reverse index maps terms to the documents in which they appear. We have implemented document indexing as a MapReduce view using &lt;a href='https://github.com/cloudant/couchjava'&gt;couchjava&lt;/a&gt;, our &lt;a href='http://blog.cloudant.com/java-language-map-reduce-views'&gt;Java language view server for CouchDB&lt;/a&gt;. This allows for usage of custom application-specific Lucene analyzers written in Java. In fact, your existing Lucene analyzers can be imported directly into Cloudant. If you prefer, you can write your document indexer in Javascript as long as you write a MapReduce view using the correct format (in a later blog post, we’ll show how our search application can be used for ad-hoc queries of your CouchDB database).&lt;/p&gt;

&lt;p&gt;The second part of Cloudant search is a RESTful API that takes your search query and performs the necessary boolean logic to return the most relevant documents.&lt;/p&gt;

&lt;p&gt;What is Cloudant search good for? Here are some applications that are easy (and cheap) to build using Cloudant full text indexing and search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Searchable Real Time Catalog.&lt;/strong&gt; If you are starting the next Ebay, build it using Cloudant. We combine full text search and numerical range queries.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Document Discovery by the Hour.&lt;/strong&gt; If you have a collection of documents that you wish to search through but don’t need to archive, you can upload them to Cloudant, enable search, run your queries, and delete the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently, the beta version of Cloudant search is available to all hosted customers with paid accounts (including users of the &lt;a href='http://addons.heroku.com/cloudant'&gt;Cloudant Heroku Addon&lt;/a&gt;). The version of the search product we are rolling out today is designed for smaller databases (less that a few gigabytes). An enhanced version that uses distributed search for larger databases will be available soon. The feature is free, but the search index counts against your data storage quota and the search queries count against your query quotas.&lt;/p&gt;

&lt;p&gt;A technical description of the search API can be found on the &lt;a href='http://support.cloudant.com/customer/portal/articles/359320-search-api'&gt;Search API page&lt;/a&gt;. Instructions for making your databases searchable can be found on the &lt;a href='http://support.cloudant.com/customer/portal/articles/359319-search-indexing'&gt;Search Indexing page&lt;/a&gt;. Please submit your questions and suggestions to our &lt;a href='http://support.cloudant.com/customer/portal/questions/new'&gt;discussion forum&lt;/a&gt;. If your application requires advanced indexing or search capabilities, please contact us for a quote on a custom solution. Please &lt;a href='http://support.cloudant.com/customer/portal/emails/new'&gt;contact us&lt;/a&gt; for further information.&lt;/p&gt;

&lt;p&gt;Over the next weeks, we’ll be posting tutorials on various ways the search can be used for web applications and ad-hoc analytics. Please stay tuned.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/dMSNLbqW-ik" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/developer-preview-cloudant-search-for-couchdb</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/bob-newson-and-tim-anglade-join-cloudant</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Cc0pAX51LlE/bob-newson-and-tim-anglade-join-cloudant" />
    <title type="html">Bob Newson and Tim Anglade Join Cloudant!</title>
    <updated>2011-01-05T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;It&amp;#8217;s a huge day here Cloudant HQ; we are very excited to announce the two newest additions to our team: Bob Newson and Tim Anglade.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tim.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Tim Anglade certainly needs no introduction, at least in the world of NOSQL. I first met Tim here in Boston back in early 2009 when he gave the keynote at the &amp;#8220;NOSQL Live&amp;#8221; conference we cosponsored with 10Gen. Since that time, Tim has been a tireless promoter, interlocutor, and sometimes skeptic of all things NOSQL. This past year, he organized the &lt;a href='http://nosqlsummer.org/'&gt;NOSQL Summer&lt;/a&gt; reading group that had participation from more than 35 cities in 20 countries around the world. Since then he has been globetrotting on his &amp;#8220;NOSQL World Tour,&amp;#8221; organizing and promoting events large and small, and working on the NoSQL Tapes, a series of conversations with domain experts, thought-leaders, trailblazers, and Cloudant founders. Tim will be moving from his home country of France to join us here at Cloudant HQ in Boston (in January! buy a thick parka Tim.) Tim will be taking on various challenges at Cloudant including developer advocacy, community development, customer outreach and support, technical writing, and directing our social media efforts. We&amp;#8217;re basically piling onto Tim all the stuff that we have never been able to do well. This means that the blog you&amp;#8217;re reading is about to become much more exciting and useful. Please join us in welcoming Tim by directing all your questions and complaints to &lt;a href='mailto:tim@cloudant.com'&gt;tim@cloudant.com&lt;/a&gt;. You should also follow him on Twitter: &lt;a href='http://twitter.com/timanglade'&gt;@timanglade&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/robert.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Many of you already know Bob Newson from his prolific work with CouchDB. Bob has been a contributor on the project since 2008. Among his countless contributions to that project is the CouchDB-lucene extension, which provides full-text indexing capabilities. Bob is an expert in distributed systems, big data processing, and erlang. His official title at Cloudant will be &amp;#8216;Senior Database Engineer,&amp;#8217; but unofficially we&amp;#8217;re already referring to him as the resident &amp;#8216;super-hard-problem solver&amp;#8217;. He&amp;#8217;ll be putting his software expertise to good use building new features for Cloudant and BigCouch, and streamlining our systems to make them faster, stronger, and more reliable. For now, Bob will continue to live and work from Windsor in his native land of England (God Save The Queen!) which is nice, because he&amp;#8217;ll be able to provide early morning support while those of us in The States are still sleeping soundly. In his free time, Bob enjoys reading about Paxos and drinks with sparklers in them. Welcome to the team Bob! We couldn&amp;#8217;t be more excited to have you on board.&lt;/p&gt;

&lt;p&gt;P.S. – The pop-culture nerd in me would be remiss if I didn&amp;#8217;t point out that both Bob Dionne and Bob Newson are now working with Cloudant. This means that I now have the chance to make endless &lt;em&gt;Office Space&lt;/em&gt; allusions (&amp;#8220;I have a meeting with The Bobs,&amp;#8221; &amp;#8220;Hey Bob! Bob!&amp;#8221; etc.) which brings me no end of joy. It also gives me an excuse to put this picture up and have a good laugh.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/the-bobs.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8220;What would you say, you do here?&amp;#8221;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Cc0pAX51LlE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/bob-newson-and-tim-anglade-join-cloudant</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/scaling-couchdb-with-bigcouch</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/5wNER6NU5g4/scaling-couchdb-with-bigcouch" />
    <title type="html">Scaling CouchDB with BigCouch</title>
    <updated>2010-10-25T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;object height='355' width='425'&gt;&lt;param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bigcouch-oreilly-101025095147-phpapp02&amp;stripped_title=scaling-couchdb-with-bigcouch-5555464&amp;userName=Cloudant' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;embed name='__sse5555464' allowfullscreen='true' src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bigcouch-oreilly-101025095147-phpapp02&amp;stripped_title=scaling-couchdb-with-bigcouch-5555464&amp;userName=Cloudant' allowscriptaccess='always' type='application/x-shockwave-flash' height='355' width='425' /&gt;&lt;/object&gt;
&lt;p&gt;On Friday Adam gave an free webcast on BigCouch. I, in my completely biased opinion, think that he killed it. The discussion in the chat room and the questions were fantastic. I hope the community got a lot of this. I&amp;#8217;m posting the slides above. The good people at O&amp;#8217;Reilly have told us that they will put up a full video of the talk (thanks Kathryn!) When that goes up, I encourage everyone to see it, you&amp;#8217;ll definitely get more out of that than just reading the slides. Thanks to all those who attended and made it such a great presentation. Hopefully we&amp;#8217;ll get to do another one soon.&lt;/p&gt;

&lt;p&gt;P.S. &amp;#8211; We&amp;#8217;d love your feedback on BigCouch and Cloudant. Help us out by picking one of the choices on our survey page &lt;a href='https://cloudant.com/feedback/'&gt;cloudant.com/feedback&lt;/a&gt;. You could win a free upgrade to an Argon or Helium plan for a year.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/5wNER6NU5g4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/scaling-couchdb-with-bigcouch</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/welcome-bob-dionne-to-team-cloudant</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/5p5YlPFpR1I/welcome-bob-dionne-to-team-cloudant" />
    <title type="html">Welcome Bob Dionne to Team Cloudant!</title>
    <updated>2010-10-07T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;&lt;img src='/images/bob.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;The Cloudant team just got a little bit bigger. We&amp;#8217;re super excited to welcome Bob Dionne (@bitdiddle) as our new Senior Software Engineer. Bob has been developing software for more than 25 years, and spent a significant chunk of that time at IBM. Since leaving he has built his own software company and, more recently, founded the consulting firm Dionne Associates. Needless to say, the man has serious chops when it comes to writing code, which is good because we&amp;#8217;re going to be throwing a lot of hard problems at him. Bob is a true New Englander (with a wicked awesome accent to boot) and though he&amp;#8217;ll be mostly working remotely, we&amp;#8217;re looking forward to him joining us at the Boston office a couple times a month.&lt;/p&gt;

&lt;p&gt;We (or I should say, I) first met Bob at the NoSQL Live Boston event. I was aware of his stellar work with CouchDB, where he focused some of his efforts on the etap testing framework. I was struck by his quiet thoughtfulness, and his readily-apparent passion for the project and the community. I feel privileged to have him join our team. So far, he&amp;#8217;s been digging into BigCouch learning the codebase and helping us build up our testing framework. Over the coming months I&amp;#8217;m sure he&amp;#8217;ll be building and testing features for BigCouch and Cloudant and working very closely with Adam (our CTO) to make sure our hosted offering is a solid as possible.&lt;/p&gt;

&lt;p&gt;Please join me in welcoming Bob to the team!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/5p5YlPFpR1I" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/welcome-bob-dionne-to-team-cloudant</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/java-language-map-reduce-views</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/vlewALbqpeg/java-language-map-reduce-views" />
    <title type="html">Java Language MapReduce Views</title>
    <updated>2010-09-08T00:00:00-07:00</updated>
    <author>
      <name>David Hardtke</name>
    </author>
    <content type="html">&lt;p&gt;One of the core principles at Cloudant is &lt;strong&gt;push code to data&lt;/strong&gt;. In the era of big data and open source software, it&amp;#8217;s much easier to move your code around than to move the data. Code is not tied to machine by software licenses, and the code is generally smaller than the data one wishes to analyze. When I first heard the concept &lt;em&gt;push code to data&lt;/em&gt;, the retained marketing synapse in my brain immediate fired with &lt;strong&gt;&lt;em&gt;write once run anywhere&lt;/em&gt;&lt;/strong&gt;, the Sun corporation marketing slogan for Java.&lt;/p&gt;

&lt;p&gt;The Cloudant Hosted CouchDB service uses MapReduce views to analyze data. Code is contained in a design document. The design document is passed to a view server along with each document in the corresponding database. CouchDB view servers have been written for many interpreted languages (see &lt;a href='http://wiki.apache.org/couchdb/View_server' title='View server'&gt;the CouchDB wiki&lt;/a&gt; for a list), but until now there has not been a Java Language View Server for CouchDB.&lt;/p&gt;

&lt;p&gt;Today we are releasing the &lt;a href='http://github.com/cloudant/couchjava' title='cloudant/couchjava on Github'&gt;Java Language MapReduce View Interface&lt;/a&gt; for Cloudant&amp;#8217;s Hosted CouchDB service. This interface defines the protocol for writing MapReduce views in Java that can be run on our hosted CouchDB platform. The Java language has several features that make it extremely useful for large scale analytics within CouchDB:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compile-Time Type Checking.&lt;/strong&gt; CouchDB views are generally written in weakly typed interpreted languages (javascript, python). Anyone who has worked extensively with CouchDB, however, knows that debugging complicated views can be very challenging. Sometimes it is easier to let the compiler find the syntax errors.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Libraries, Libraries, and More Libraries.&lt;/strong&gt; Java is the most widely used computer language at the moment. As such, there is a library for almost everything. &lt;a href='http://github.com/cloudant/couchjava' title='cloudant/couchjava on Github'&gt;CouchJava&lt;/a&gt; allows for the re-use of existing Java langauge libraries within the CouchDB framework. Libraries can be packaged in jar files and uploaded directly to the view server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When might you use this? Let&amp;#8217;s assume you want to use a neural network to analyze financial options data in real time. You can directly import your favorite neural network library(there are many written for Java)directly into CouchDB along with the weights that you have calculated during training (the weights will be configuration parameters in the design document). Each new piece of data will be automatically analyzed in real-time. You can update the weights by modifying the design document. In fact, one could build the unsupervised learning cycle directly into CouchDB.&lt;/p&gt;

&lt;p&gt;The Java view server works differently than a standard CouchDB view server. The design document does not contain code. Instead, the design document specifies which class should be called for the Map and Reduce steps. The code (a jar) is attached to the design document in the form of a binary attachment. This jar contains both user defined classes and external libraries that are needed. This paradigm (libraries as binary attachments) is a non-standard extension of the CouchDB view server API.&lt;/p&gt;

&lt;p&gt;The interface and instructions for writing Java Language MapReduce views are now available on &lt;a href='http://github.com/cloudant/couchjava' title='cloudant/couchjava'&gt;Github&lt;/a&gt;. Let us know what you think.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/vlewALbqpeg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/java-language-map-reduce-views</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-bigcouch-is-open-source</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/d-RAxbDQ24Y/cloudant-bigcouch-is-open-source" />
    <title type="html">Cloudant’s BigCouch is open-source</title>
    <updated>2010-08-30T00:00:00-07:00</updated>
    <author>
      <name>Brad Anderson</name>
    </author>
    <content type="html">&lt;p&gt;&lt;img src='/images/bigcouch.png' alt='BigCouch box' /&gt;&lt;/p&gt;

&lt;p&gt;The Cloudant team is pleased to make available its &lt;a href='http://github.com/cloudant/bigcouch' title='cloudant/bigcouch on Github'&gt;&amp;#8216;BigCouch&amp;#8217; software project&lt;/a&gt; as open source software under the Apache 2.0 license. We have been the beneficiary of countless open source projects while constructing this system, so it is only fitting that we share our efforts in hopes that people will not only find utility, but also assist us in making it better.&lt;/p&gt;

&lt;p&gt;It has taken us a while to get to this point. The version we are opening has benefitted from Cloudant operating our systems in production for our customers for almost a year. The recent (and heavy) refactoring effort has encompassed our learning over this time, and we believe it is now time to share this system with the world. We will now be focusing our efforts on documenting and ease of use, as is the case with most newly opened projects.&lt;/p&gt;

&lt;p&gt;What does it do? Think of BigCouch as a set of Erlang/OTP applications that allow you to create a cluster of CouchDBs that is distributed across many nodes/servers. Instead of one big honking CouchDB, the result is an elastic data store which is fully CouchDB API-compliant. The top is a picture of the standalone CouchDB setup that is common today. When you download BigCouch and build with &lt;code&gt;make dev&lt;/code&gt; (see the &lt;a href='http://github.com/cloudant/bigcouch/blob/trunk/README.md' title='cloudant/bigcouch/blob/trunk/README.md on Github'&gt;README.md&lt;/a&gt; file), the result is the bottom picture, a three-node development cluster.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/dev-cluster.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;The clustering layer is most closely modeled after &lt;a href='http://blog.cloudant.com/dynamo-and-couchdb-clusters' title='Amazon Dynamo'&gt;Amazon's Dynamo&lt;/a&gt;, with consistent hashing, replication, and quorum for read/write operations. CouchDB view indexing occurs in parallel on each partition, and can achieve impressive speedups as compared to standalone serial indexing.&lt;/p&gt;

&lt;p&gt;Also contained within BigCouch is a tailor-made RPC server application called &lt;em&gt;Rexi&lt;/em&gt;. Rexi better fits the needs of this distributed data store by dropping some unneeded overhead in rex, the RPC server that ships with Erlang/OTP. Rexi is optimized for the case when you need to spawn a bunch of remote processes. Cast messages are sent from the origin to the remote rexi server, and local processes are spawned from there, which is vastly more efficient than spawning remote processes from the origin.&lt;/p&gt;

&lt;p&gt;So, let us know what you think. We will be hanging around Freenode IRC in the &lt;a href='irc://irc.freenode.net/cloudant'&gt;#cloudant&lt;/a&gt; channel. Pull the code, build it, install, and begin playing. Document, enhance, give back, benchmark, blog, tweet, &amp;#8230;and enjoy.&lt;/p&gt;

&lt;h3 id='see_also'&gt;See Also&lt;/h3&gt;

&lt;h5 id='github_project_page'&gt;&lt;a href='http://github.com/cloudant/bigcouch'&gt;Github Project Page&lt;/a&gt;&lt;/h5&gt;

&lt;h5 id='cloudant_developer_resources'&gt;&lt;a href='https://cloudant.com/#!/solutions/bigcouch'&gt;Cloudant Developer Resources&lt;/a&gt;&lt;/h5&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/d-RAxbDQ24Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-bigcouch-is-open-source</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/dynamo-and-couchdb-clusters</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/F2ruqMixccA/dynamo-and-couchdb-clusters" />
    <title type="html">Dynamo and CouchDB Clusters</title>
    <updated>2010-08-13T00:00:00-07:00</updated>
    <author>
      <name>Brad Anderson</name>
    </author>
    <content type="html">&lt;p&gt;For a while, CouchDB was described as a &amp;#8220;distributed, fault-tolerant and schema-free document-oriented database accessible via a RESTful HTTP/JSON API.&amp;#8221; The story about CouchDB&amp;#8217;s &amp;#8216;distributed&amp;#8217; description has always involved its multi-master replication. In this sense, it is not truly a horizontally scalable database, as noted &lt;a href='http://spyced.blogspot.com/2008/12/couchdb-not-drinking-kool-aid.html'&gt;here&lt;/a&gt;. With the availability of Cloudant&amp;#8217;s new &lt;a href='https://cloudant.com/#!/solutions'&gt;hosted service&lt;/a&gt;, a new option has entered the scene. Our clustering is similar to &lt;a href='http://project-voldemort.com'&gt;Voldemort&lt;/a&gt;, &lt;a href='http://cassandra.apache.org'&gt;Cassandra&lt;/a&gt;, or Riak](http://github.com/basho/riak), as it implements a version of &lt;a href='http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html'&gt;Amazon&amp;#8217;s Dynamo&lt;/a&gt;. We&amp;#8217;d like to tell you a bit about how it works.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/hashing.png' alt='' /&gt;&lt;/p&gt;

&lt;h3 id='clustering_in_a_ring'&gt;Clustering in a Ring&lt;/h3&gt;

&lt;p&gt;Cloudant makes use of partitions for sharding data. Picture a ring of partitions that each are responsible for a range of the data. The partitions, sometimes referred to as virtual nodes or vnodes, are placed on separate physical nodes as the primary means of distribution. Partitioning databases is nothing new, and with Dynamo systems, a keyspace is usually employed. We use CRC32, so from 0 to 2^32. We&amp;#8217;ve seen MD5, fnv, and SHA-1 used, and previous versions of our software used SHA-1. When creating a database, users may provide Q, a constant that determines how many partitions the database will be spread across. Let&amp;#8217;s check out an example:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X PUT http://username.cloudant.com/dbname?q&lt;span class='o'&gt;=&lt;/span&gt;10
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;For a Q of 10, there will be 10 partitions put across all the nodes in the cluster. Each partition will be responsible for a range of 2^32/Q keys.&lt;/p&gt;

&lt;h3 id='any_node_can_handle_a_request'&gt;Any Node can Handle a Request&lt;/h3&gt;

&lt;p&gt;Each request to the cluster will most likely go through a round-robin load balancer, because each of the nodes knows how to find the data in O(1) lookup time. To do this, the document id is hashed, and the resulting hash is compared against the database&amp;#8217;s partition map, as we discussed above. If you&amp;#8217;re referring to the shiny picture on this page, you will see that our example hashes &amp;#8216;doc_id&amp;#8217; to the E partition. In reality, this could be something like hashing a value to c34b and that falls between c000 and cfff hex values, so we call that range the E partition. The partition map for that database knows which node or nodes have copies of the document, and requests are routed via distributed Erlang messages to those nodes.&lt;/p&gt;

&lt;h3 id='quorum_system_n_r_w'&gt;Quorum system (N, R, W)&lt;/h3&gt;

&lt;p&gt;The durability and consistency settings of Dynamo systems are governed by quorum constants. As you can see from the diagram, N=3. This means that three replica copies of &amp;#8216;doc_id&amp;#8217; document will be stored in the cluster. When the &amp;#8216;write&amp;#8217; arrives at Node 1 and the consistent hashing algorithm tells us the doc will live on the E partition, the system attempts three asynchronous writes, one to each of the nodes that house the E partition replicas. You can be reasonably certain of the writes succeeding, because the request will wait for W (in this case, W=2) responses. When two successful responses return to Node 1, the response of 201 Created is returned to the client. The same thing occurs on &amp;#8216;reads.&amp;#8217; When a GET request arrives at a node, N &amp;#8216;read&amp;#8217; requests go out to the nodes which house that document&amp;#8217;s partition. If R=2, then the system waits for two agreed-upon values to be returned, and then replies to the client with a 200 OK and the document&amp;#8217;s contents.&lt;/p&gt;

&lt;p&gt;You can set the defaults of N, R, and W for your cluster, but you may also override them at request time. N may be overridden at database creation time, just like Q above. R and W may be overridden for each request individually. A higher W value means more durable writes, where lower W value means more write throughput. High R values mean consistent values returned, while low R values mean first read wins, and higher read throughput.&lt;/p&gt;

&lt;h3 id='masterless_no_spof'&gt;Masterless (no SPOF)&lt;/h3&gt;

&lt;p&gt;Server failure is handled transparently. The load balancer will not route requests to a downed node. With consistent hashing, the other nodes are capable of serving requests. Also, when a node is down, other partitions will provide the data that is located on the downed node. If N=3, W=2, R=2 as in our example, a node may be down but read and write quorums are still satisfied. When the node returns, operations return to normal. The node is placed back into service by the load balancer, and a &amp;#8216;hinted-handoff-like&amp;#8217; system is used to replicate the writes that the downed node may have missed. The other nodes holding data for the partitions of the downed node replicate the updates continuously after the node returns.&lt;/p&gt;

&lt;h3 id='horizontally_scalable'&gt;Horizontally Scalable&lt;/h3&gt;

&lt;p&gt;When the cluster gets closer to capacity, or could use more nodes to crunch data in a more parallel fashion, extra nodes may be added to the cluster. When this happens, partitions are moved from existing nodes to the new nodes. The system has the flexibility to move partitions on a database level, and can split large partitions if required. This is an evolving portion of the code base, and we are attempting to do partition merging and splitting all while the database remains online, i.e. other partitions serve data while the work is being done.&lt;/p&gt;

&lt;p&gt;Above, there was mention of partition merging. This may be required as the cluster shrinks. Or, it is also possible to re-partition an over-partitioned database into fewer shards. The flexibility exists to shrink a cluster by removing nodes, just as it may be grown, providing a truly elastic data store.&lt;/p&gt;

&lt;h3 id='transparent_to_the_application'&gt;Transparent to the application&lt;/h3&gt;

&lt;p&gt;All of these features &amp;#8211; distributed, horizontally scalable, durable, consistent &amp;#8211; happen with little or no change required in applications that have been written for CouchDB. A cluster looks just like a stand-alone CouchDB, and API compliance has been our goal from the beginning. Granted, there are a few extra options like overriding quorum constant defaults and there are a few vagaries, like views always performing rereduce due to the views being distributed. But on the whole, the extras in Cloudant are transparent to the application.&lt;/p&gt;

&lt;p&gt;Feel free to comment away, &lt;a href='https://cloudant.com/#!/support'&gt;email us&lt;/a&gt;, or join us on Freenode IRC in the &lt;a href='irc://irc.freenode.net/cloudant'&gt;#cloudant&lt;/a&gt; room. We&amp;#8217;d love to hear from you.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/F2ruqMixccA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/dynamo-and-couchdb-clusters</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/using-cloudants-heroku-add-on</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/F62hFI_IZdI/using-cloudants-heroku-add-on" />
    <title type="html">Using Cloudant’s Heroku Add-on</title>
    <updated>2010-08-05T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Heroku has recently jumped with both feet into the NoSQL world, providing add-ons for many different NoSQL data stores to complement it&amp;#8217;s easy ruby platform. We&amp;#8217;re very excited to be able to offer CouchDB 1.0 to Heroku users via the Cloudant add-on. Cloudant is a distributed CouchDB service, with the added benifits of data redundancy, clustering, and automatic maintenance (view builds and compaciton). You can use it just like you would standalone CouchDB but you have the advantage of your data being distributed over multiple machines. The following is a (very short) guide to help you get started with Cloudant and Heroku. It is by no means comprehensive. If you have quesitons, feel free to &lt;a href='https://cloudant.com/#!/support'&gt;get in touch&lt;/a&gt;. You can read more about the add-on at the &lt;a href='http://blog.heroku.com/archives/2010/7/20/nosql/'&gt;Heroku Blog&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='local_setup'&gt;Local setup&lt;/h3&gt;

&lt;p&gt;Since CouchDB and Cloudant have the same REST API you can use them the same way. You just need a http client to interface with the database and a JSON parser.&lt;/p&gt;

&lt;p&gt;In the simplest case you can just use the &lt;code&gt;rest-client&lt;/code&gt; and &lt;code&gt;json&lt;/code&gt; gems:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;sudo gem install rest-client json
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you don&amp;#8217;t already have CouchDB on your local machine:&lt;/p&gt;

&lt;p&gt;OSX:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;brew install couchdb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Ubuntu:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;sudo apt-get install couchdb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Further reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://books.couchdb.org/relax/'&gt;CouchDB book&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://wiki.apache.org/couchdb/'&gt;CouchDB wiki&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://cloudant.com/'&gt;cloudant.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='using_from_sinatra'&gt;Using from Sinatra&lt;/h3&gt;

&lt;p&gt;Installing the Cloudant add-on gives you an environmental variable &lt;code&gt;CLOUDANT_URL&lt;/code&gt;. This contains your API URL and credentials and is how you access your database(s) at Cloudant:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;heroku config --long CLOUDANT_URL
https://USER:PASSWORD@APP.heroku.cloudant.com
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;When you first install the add-on you need to create a database:&lt;/p&gt;

&lt;p&gt;Using cURL:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;curl -X PUT https://USER:PASSWORD@APP.heroku.cloudant.com/DATABASENAME
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Using rest-client:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;RestClient.put&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;https://USER:PASSWORD@APP.heroku.cloudant.com/DATABASENAME&amp;quot;&lt;/span&gt;, &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You could also do this in your code by doing something like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;begin&lt;/span&gt;
  &lt;span class='no'&gt;RestClient&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;put&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;ENV&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;CLOUDANT_URL&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;/SOMEDATABASE&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='k'&gt;rescue&lt;/span&gt;
  &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;database already created&amp;quot;&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The following code will allow you to GET a document from the &lt;code&gt;music&lt;/code&gt; database and then print it to the page:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='no'&gt;DB&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;ENV&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;CLOUDANT_URL&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;/music&amp;quot;&lt;/span&gt;
&lt;span class='n'&gt;get&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;/doc/:doc&amp;quot;&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
  &lt;span class='n'&gt;doc&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;RestClient&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;get&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;DB&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;/&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:doc&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='vi'&gt;@result&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;JSON&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;parse&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;doc&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='n'&gt;haml&lt;/span&gt; &lt;span class='ss'&gt;:doc_id&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The view would look something like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haml'&gt;&lt;span class='nt'&gt;%h1&lt;/span&gt; A Doc from CouchDB!
&lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='vi'&gt;@result&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;k&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='n'&gt;v&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
  &lt;span class='nt'&gt;%b&lt;/span&gt;&lt;span class='p'&gt;=&lt;/span&gt;&lt;span class='n'&gt;k&lt;/span&gt;
  &lt;span class='nt'&gt;%em&lt;/span&gt;&lt;span class='p'&gt;=&lt;/span&gt;&lt;span class='n'&gt;v&lt;/span&gt;
  &lt;span class='nt'&gt;%br&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To request this page by pointing your browser to:&lt;/p&gt;

&lt;p&gt;&lt;a href='http://SOMEAPP.heroku.com/doc/YOURDOCUMENT'&gt;http://SOMEAPP.heroku.com/doc/YOURDOCUMENT&lt;/a&gt;&lt;/p&gt;

&lt;h3 id='deploying_to_heroku'&gt;Deploying to Heroku&lt;/h3&gt;

&lt;p&gt;To use Cloudant on Heroku, install the Cloudant add-on:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;heroku addons:add cloudant:basic
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/F62hFI_IZdI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/using-cloudants-heroku-add-on</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudants-own-to-speak-at-surgecon</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/uZ8wa5ldgmQ/cloudants-own-to-speak-at-surgecon" />
    <title type="html">Cloudant’s Own to Speak at SurgeCon</title>
    <updated>2010-07-27T00:00:00-07:00</updated>
    <author>
      <name>Joe Williams</name>
    </author>
    <content type="html">&lt;p&gt;&lt;img src='/images/surge.png' alt='Surge' /&gt;&lt;/p&gt;

&lt;p&gt;As Cloudant&amp;#8217;s ops guy and &lt;em&gt;utility infielder&lt;/em&gt;, I (&lt;a href='http://twitter.com/williamsjoe'&gt;@williamsjoe&lt;/a&gt;) will be speaking at the &lt;a href='http://omniti.com/surge/2010'&gt;Surge&lt;/a&gt; conference in September. Surge is a conference presented by &lt;a href='http://omniti.com/'&gt;OmitTI&lt;/a&gt; that focuses on infrastructure and web operations. As such &lt;a href='http://omniti.com/surge/2010/speakers/joe-williams'&gt;I will be discussing&lt;/a&gt; how we have built Cloudant&amp;#8217;s database platform on top of Amazon&amp;#8217;s EC2. The conference will include keynotes from the always excellent John Allspaw (of Flickr and Etsy fame) and Theo Schlossnagle (OmniTI).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/uZ8wa5ldgmQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudants-own-to-speak-at-surgecon</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-and-seti-crowdsourcing-the-search-for-e-t</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/xgo9mH5jk1Q/cloudant-and-seti-crowdsourcing-the-search-for-e-t" />
    <title type="html">Cloudant and SETI: Crowdsourcing the search for E.T.</title>
    <updated>2010-07-21T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Going to OSCON? SETI needs your help!&lt;/p&gt;

&lt;p&gt;Cloudant is teaming up with the SETI Institute to help engage citizen-scientists in the search for intelligent life elswhere in the universe. With some help from Amazon, we&amp;#8217;ve built a &amp;#8216;croudsourced data analytics platform&amp;#8217; where ordinary citizens can search and analyze data from the Allen telescope array. Are you a citizen-scientist? Do you know about signal processing? Are you interested in helping in the search? Come find out how!&lt;/p&gt;

&lt;p&gt;Thursday, July 22nd at OSCON, our own Dr. Dave Hardtke will be demonstrating SETICloud. He&amp;#8217;ll be describing the Cloudant platform and how we&amp;#8217;re bringing the wisdom of the crowds to SETI&amp;#8217;s search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time:&lt;/strong&gt; 12:20&amp;#8211;1:20 pm&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Place:&lt;/strong&gt; Room E143/144&lt;/p&gt;

&lt;p&gt;SETI is hacking on CouchDB!  Come find out how you can help.&lt;/p&gt;

&lt;p&gt;And don&amp;#8217;t miss &lt;a href='http://www.oscon.com/oscon2010/public/schedule/detail/13425'&gt;Dr. Jill Tarter&amp;#8217;s keynote talk on &amp;#8220;Open SEITQuest&amp;#8221;&lt;/a&gt; Thursday morning at OSCON.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/xgo9mH5jk1Q" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-and-seti-crowdsourcing-the-search-for-e-t</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/learning-to-relax</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/X-t1D_moLoM/learning-to-relax" />
    <title type="html">Learning to Relax</title>
    <updated>2010-06-28T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;object height='355' width='425'&gt;&lt;param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windycityhoffman-100628112536-phpapp02&amp;stripped_title=learning-to-relax' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;embed name='__sse4635719' allowfullscreen='true' src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windycityhoffman-100628112536-phpapp02&amp;stripped_title=learning-to-relax' allowscriptaccess='always' type='application/x-shockwave-flash' height='355' width='425' /&gt;&lt;/object&gt;
&lt;p&gt;Over the weekend I traveled to Chicago to give a talk on &amp;#8216;CouchDB for Beginners&amp;#8217; at the WindyCityDB conference. You can read the slides above. The conference exceeded my expectations and many of the talks, both long and short, were stellar. Big thanks to Ray Hightower and all the people who helped put WindyCityDB together. I very much appreciate the opportunity to give this talk and I hope everyone enjoyed it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/X-t1D_moLoM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/learning-to-relax</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-nationwide-tour</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/kxrp5HNh_9k/cloudant-nationwide-tour" />
    <title type="html">Cloudant Nationwide Tour</title>
    <updated>2010-06-16T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;It turns out that next week (the week of June 21st) is a big week for tech conferences. A bunch of the Cloudant people will be hitting up various conferences and giving a couple talks. If anyone is interested in meeting up over beers to talk Cloudant, CouchDB, NoSQL, Startups, etc. get in touch (info at cloudant dot com is a good place to start.) Here are the tour dates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Structure Conference.&lt;/strong&gt; June 23&amp;#8211;24. San Francisco, CA: Both Adam Kocoloski (CTO) and David Hardtke (Search) will be milling about this conference, whose tagline is &amp;#8220;Put Cloud Computing To Work.&amp;#8221; On the 23rd in the afternoon, Cloudant will be taking part in the &lt;em&gt;Launchpad!&lt;/em&gt; event. Adam will be working the crowd, drumming up some love for Cloudant, giving a short pitch about our service. Check it out.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Velocity Conference.&lt;/strong&gt; June 22&amp;#8211;24. Santa Clara, CA: No Cloudant talk at this conference but Joe Williams (Operations and Utility Infeilding) will be in attendence. No one I know gets more pumped up about server uptime, configuration management, and monitoring than Joe. If you&amp;#8217;re the same way, say hi.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Momentum Summit.&lt;/strong&gt; June 23. Cambridge, MA: This one day conference focuses on how to turn a startup into big business. CEO Alan Hoffman (that&amp;#8217;s me) will be in attendence. Looking forward to hearing from Boston startup gurus like Steve Kaufer and Scott Griffith. I&amp;#8217;m always eager to talk with other local startup types so come find me.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windy City DB.&lt;/strong&gt; June 26. Chicago, IL: I&amp;#8217;m lucky enough to be heading back to my hometown to attend and speak at this one day event on the south side of Chicago. My talk is entitiled &amp;#8220;Learning to Relax: CouchDB for Beginners&amp;#8221; and it is about, uh, CouchDB for beginners. It&amp;#8217;s my first long-format NoSQL talk so if you&amp;#8217;re in attendance, please no heckling. I&amp;#8217;m happy to meet up after the conference; if you&amp;#8217;re looking for me on Friday afternoon, I&amp;#8217;ll be at U.S. Cellular Field watching the White Sox.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/kxrp5HNh_9k" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-nationwide-tour</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/just-opensourced-gaff-and-deckard</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/yoey7WjRF7A/just-opensourced-gaff-and-deckard" />
    <title type="html">Just Opensourced: Gaff and Deckard</title>
    <updated>2010-06-04T00:00:00-07:00</updated>
    <author>
      <name>Joe Williams</name>
    </author>
    <content type="html">&lt;p&gt;&lt;img src='/images/deckard.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Today we released two open source projects that have been in use internally at Cloudant for some time now, &lt;a href='http://github.com/joewilliams/gaff' title='joewilliams/gaff on Github'&gt;Gaff&lt;/a&gt; and &lt;a href='http://github.com/joewilliams/deckard' title='joewilliams/deckard on Github'&gt;Deckard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All of our infrastructure is in the cloud and as such we need a way for disperate systems to all request resources, this is where Gaff comes in. Gaff is a pubsub daemon for asynchronously talking to cloud APIs using AMQP. Currently it supports a subset of the Dynect (DNS), Slicehost and EC2 APIs and uses &lt;a href='http://twitter.com/geemus'&gt;@geemus&lt;/a&gt;&amp;#8217;s awesome &lt;a href='http://github.com/geemus/fog' title='geemus/fog on Github'&gt;fog&lt;/a&gt; Ruby library. The basic workflow for Gaff is to send &lt;a href='http://json-rpc.org/'&gt;JSON-RPC&lt;/a&gt; formated messages to an AMQP exchange with a routing key corresponding to the API you are talking to, you could be sending these messages from a web application or another service. Each message gets routed to an API specific queue and is picked up by Gaff and turned into the appropriate API call, starting, stopping, modifying your servers on EC2 or elsewhere.&lt;/p&gt;

&lt;p&gt;We have a lot of CouchDB instances to keep tabs on to do this we wrote Deckard. Deckard is a HTTP check monitoring system based on CouchDB. Yo dawg! What better than to monitor CouchDB with CouchDB (and some Ruby)? Deckard supports basic HTTP content checks, email alerts, SMS alerts (via email) for on-call rotations, basic maintenance scheduling, replication latency alerts (between two Couches) and even has EC2 Elastic IP support for failover between two EC2 instances. Best of all since it&amp;#8217;s based on Couch you get an API for free, just PUT a doc in the HTTP checks database and you get a new HTTP check the next time Deckard runs.&lt;/p&gt;

&lt;p&gt;Checkout these and my other projects on &lt;a href='http://github.com/joewilliams'&gt;Github&lt;/a&gt; and follow &lt;a href='http://twitter.com/cloudant'&gt;@cloudant&lt;/a&gt; and &lt;a href='http://twitter.com/williamsjoe'&gt;myself&lt;/a&gt; on Twitter.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/yoey7WjRF7A" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/just-opensourced-gaff-and-deckard</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/ode-to-a-utility-infielder</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/MmL3eMyLOQ0/ode-to-a-utility-infielder" />
    <title type="html">Ode to a Utility Infielder</title>
    <updated>2010-02-17T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Today marks the one year anniversary of Joe Williams (&lt;a href='http://twitter.com/#!/williamsjoe'&gt;@williamsjoe&lt;/a&gt;) becoming a member of Team Cloudant. Those of us who are married will recall that one year is the paper anniversary so it&amp;#8217;s fitting that Joe will be receiving paper (in the form of vested stock options) from Cloudant today. I thought I would take a moment on this occasion to thank Joe for his work over the past year.&lt;/p&gt;

&lt;p&gt;We first hired Joe on a contract basis to help us build an internal infrastructure tool we call The Deployer. This is the tool that allows us to quickly provision and configure resources from a number of different cloud providers. We can, with the push of one button, &amp;#8216;inflate&amp;#8217; an X-node Cloudant database cluster, and have it configured and available in a matter of minutes, all because of Joe&amp;#8217;s ongoing efforts.&lt;/p&gt;

&lt;p&gt;Since joining full-time, Joe has acted as our &amp;#8216;utility infielder.&amp;#8217; All the problems in the operations and infrastructure realm fell to Joe. He built and mantains our monitoring system, our logging system, and our build system. That alarm system we have where we get a text message in the middle of the night when something goes wrong, Joe did that (thanks Joe!). Joe, margarita in hand, has pushed hot code updates to live systems from a Mexican karaoke bar.&lt;/p&gt;

&lt;p&gt;Needless to say Joe has been and continues to be a staggering presence at Cloudant. We feel privileged to work with him on a daily basis. I only hope I&amp;#8217;m able to write a similar post on his 5 year anniversary. Plus, the man has excellent mutton chops.&lt;/p&gt;

&lt;p&gt;&lt;img src='../images/joe.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Thanks Joe! Here&amp;#8217;s to the big things (and fewer alarms) coming in the next year.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/MmL3eMyLOQ0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/ode-to-a-utility-infielder</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/nosql-live-from-boston</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/QaGLwgYQQe4/nosql-live-from-boston" />
    <title type="html">NoSQL Live From Boston</title>
    <updated>2010-01-27T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;We&amp;#8217;re very excited to be joinin up with our friends at 10gen to sponsor the NoSQL Live conference right here in Boston, our backyard. The official press release can be found &lt;a href='http://www.marketwire.com/press-release/10gen-Announces-NoSQL-Live-1107116.htm'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The event will take place on March 11th at the John Hancock hotel. A number of us from Cloudant will be at the conference in both official (panel discussions, lightning talks) and unofficial (milling about, drinking) capacities. If you are in the New England area or plan on coming to the New England area, you should register and attend the conference. You can register &lt;a href='http://www.10gen.com/events'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From the 10gen events site:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;About:&lt;/p&gt;

&lt;p&gt;A one-size-fits-all approach to databases no longer applies. Relational databases have worked well - and will continue to - for highly transactional systems. But today&amp;#8217;s web applications require enormous scalability and performance. This has spurred the growth of a new class of databases that trade off some of the features of relational databases to offer high performance, ease of programming, high availability &amp;#38; the ability to scale in cloud environments. They are collectively called NoSQL or non-relational databases.&lt;/p&gt;

&lt;p&gt;NoSQL Live from Boston is a full-day interactive conference that brings together the thinking in this space. Picking up where other NoSQL events have left off, NoSQL Live goes beyond understanding the basics of these databases to how they are used in production systems. It features panel discussions on use cases, lightning talks, networking session, and a NoSQL Lab where attendees can get a practical view of programming with NoSQL databases.&lt;/p&gt;

&lt;p&gt;Interested in presenting or sponsorship opportunities? Contact &lt;a href='mailto:meghan@10gen.com'&gt;meghan@10gen.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/QaGLwgYQQe4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/nosql-live-from-boston</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/welcome-dr-dave-hardtke</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/XOS2W7T-LGc/welcome-dr-dave-hardtke" />
    <title type="html">Welcome Dr. Dave Hardtke</title>
    <updated>2010-01-06T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;The Cloudant team is growing!&lt;/p&gt;

&lt;p&gt;&lt;img src='../images/david.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re excited to welcome Dr. Dave Hardtke who has joined Cloudant as Director of Search. Like many of us here at Cloudant, Dave began his career as an experimental particle physicist. In over a decade of experience Dave illuminated the secrets of the universe at various experiments such as STAR (Brookhaven National Lab), ICECUBE (Antarctica), and NA44 (CERN). Dave&amp;#8217;s seminal work lead to the discovery of the Quark Gluon Plasma, the 2005 physics story of the year. More recently Dave has turned his talents in algorithms and analyses to search, where he has built his own startup stinkyteddy.com, a general purpose search engine combining multiple keyword-driven search feeds and intelligent semantic analysis to deliver the most timely search results regardless of source and content types. Prior to that Dave served as Chief Scientist at Surf Canyon, a startup focusing on personalization of real-time search.&lt;/p&gt;

&lt;p&gt;Dave is accelerating Cloudant Search. As we add customers it has become clear that they are hungry not just for a flexible way to store thier data, but a powerful way to &amp;#8220;discover&amp;#8221; their data. Search is a critical component in nearly all data driven applications. We are therefore expanding our efforts to integrate a robust search platform into our CouchDB-based, cloud database service. Dave brings his expertise in internet and enterpise search technology to the project.&lt;/p&gt;

&lt;p&gt;Please join me in welcoming Dave to the team.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/XOS2W7T-LGc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/welcome-dr-dave-hardtke</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-com-refresh-couchdb-in-the-cloud</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/dpq4cDR630A/cloudant-com-refresh-couchdb-in-the-cloud" />
    <title type="html">Cloudant.com Refresh: CouchDB in the Cloud</title>
    <updated>2009-12-08T00:00:00-08:00</updated>
    <author>
      <name>Stefano J. Attardi</name>
    </author>
    <content type="html">&lt;p&gt;Our new front page just went live on &lt;a href='http://cloudant.com/'&gt;Cloudant.com&lt;/a&gt;. The main goal of this redesign is to give more information about the service we are currently rolling out. While we are still in private beta, we are starting to accept more people onto our platform and therefore we are ready to tell you more about what we are doing. We are currently aiming at existing &lt;a href='http://couchdb.apache.org/'&gt;CouchDB&lt;/a&gt; users, and to them we are offering professional hosting of CouchDB in the cloud.&lt;/p&gt;

&lt;p&gt;The new design follows the &lt;a href='http://www.smashingmagazine.com/2008/04/24/5-more-principles-of-effective-web-design/'&gt;AIDA principle&lt;/a&gt;, according to which a succesful marketing flow involves four main phases: attention (A), interest (I), desire (D), and action (A).&lt;/p&gt;

&lt;p&gt;The &amp;#8220;CouchDB in the Cloud&amp;#8221; headline is designed to attract the &lt;em&gt;attention&lt;/em&gt; of CouchDB users. The screenshot behind it is meant to evoke &lt;em&gt;interest&lt;/em&gt; by giving a peak to the features available in our dashboard. Underneath it, the three &amp;#8220;features&amp;#8221; listed aim to create &lt;em&gt;desire&lt;/em&gt;. They link our offering to CouchDB, by stating that we provide all the benefits of the database that our potential customers already love, but also highlight what we have to offer on top of that: a scalable and managed infrastructure and the chance to use it for free. Finally, the two buttons, placed in what the &lt;a href='http://www.smashingmagazine.com/2009/04/06/design-to-sell-12-tips-to-help-your-website-convert/'&gt;Gutenberg Rule&lt;/a&gt; calls the &amp;#8220;terminal area&amp;#8221;, provide options for &lt;em&gt;action&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let us know what you think about this new design.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/dpq4cDR630A" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-com-refresh-couchdb-in-the-cloud</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/changing-the-world-one-password-at-a-time</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/S6QSR2Qo-Pg/changing-the-world-one-password-at-a-time" />
    <title type="html">Changing the World, One Password at a Time</title>
    <updated>2009-12-01T00:00:00-08:00</updated>
    <author>
      <name>Stefano J. Attardi</name>
    </author>
    <content type="html">&lt;p&gt;Since launching the beta we&amp;#8217;ve received a bunch of feedback along the lines of &amp;#8220;Uh&amp;#8230; I can&amp;#8217;t change my password, wtf?&amp;#8221; Yes, wtf indeed. We knew we would be building this feature eventually but we didn&amp;#8217;t want to hold up the release for it. Well, now we have it on our new Account Options page.&lt;/p&gt;

&lt;p&gt;&lt;img src='../images/password.png' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;You can access it by selecting &amp;#8216;account options&amp;#8217; from the user account pulldown on the top right of the page. Thanks for all the feedback and keep it coming.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/S6QSR2Qo-Pg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/changing-the-world-one-password-at-a-time</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/api-keys-no-really-we-re-listening</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/Iymst1n40fc/api-keys-no-really-we-re-listening" />
    <title type="html">API Keys: No Really, We’re Listening</title>
    <updated>2009-11-05T00:00:00-08:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Since Monday we’ve been sending out invites to the private beta (if you haven’t gotten yours yet, be patient, it’s coming). And we’ve gotten a lot of great feedback on how to make the service better. One suggestion that came from a few users was to allow database access to non-Cloudant users through API keys that can be shared with anyone. Well, your requests did not fall on deaf ears. For any of your databases you can now navigate to the permissions tab and create a database-specific API key and password. You can then set permissions for that key as if it were a Cloudant user. The screenshot below shows what that should look like. Thanks to everyone for the great suggestion. You keep the feature requests coming and we’ll get to them as fast as we can.&lt;/p&gt;

&lt;p&gt;&lt;img src='../images/api-keys.jpg' alt='' /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/Iymst1n40fc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/api-keys-no-really-we-re-listening</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/benchmarking-couchdb-with-baracus</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/SvGgm7ZC9oM/benchmarking-couchdb-with-baracus" />
    <title type="html">Benchmarking CouchDB with Baracus</title>
    <updated>2009-11-04T00:00:00-08:00</updated>
    <author>
      <name>Joe Williams</name>
    </author>
    <content type="html">&lt;p&gt;&lt;a href='http://github.com/joewilliams/baracus'&gt;Baracus&lt;/a&gt; is a new project built specifically for benchmarking &lt;a href='http://couchdb.apache.org/'&gt;CouchDB&lt;/a&gt;. Using trusty httperf, Baracus makes it easy to create and perform a battery of tests based on simple configuration files. In this post I&amp;#8217;ll go into the details of a Baracus run and show you how to run your own benchmarks.&lt;/p&gt;

&lt;p&gt;First, let&amp;#8217;s install Baracus. It depends on &lt;a href='http://www.hpl.hp.com/research/linux/httperf/'&gt;httperf&lt;/a&gt; so install it first either from source (check the README for compile options for httperf) or from your distribution. Note that Baracus uses gemcutter for gem hosting.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;gem sources -a &lt;span class='o'&gt;[&lt;/span&gt;http://gemcutter.org&lt;span class='o'&gt;](&lt;/span&gt;http://gemcutter.org&lt;span class='o'&gt;)&lt;/span&gt;
gem install baracus
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Next, let&amp;#8217;s examine a simple Baracus config file.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='yaml'&gt;&lt;span class='l-Scalar-Plain'&gt;httperf&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;/usr/bin/httperf&amp;quot;&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;host&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;port&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;5984&amp;quot;&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;user&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;password&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;db&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;testdb&amp;quot;&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;report_url&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;http://localhost:5984/bench&amp;quot;&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;name&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;test123&amp;quot;&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;config&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;timeout&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;30&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;sessions&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;100&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;rate&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;100&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;doc_size&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;100&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;writes&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;10&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;reads&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;10&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;batchok&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='l-Scalar-Plain'&gt;false&lt;/span&gt;
&lt;span class='l-Scalar-Plain'&gt;info&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;storage&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;raid10,&lt;/span&gt;&lt;span class='nv'&gt; &lt;/span&gt;&lt;span class='s'&gt;4&lt;/span&gt;&lt;span class='nv'&gt; &lt;/span&gt;&lt;span class='s'&gt;disks,&lt;/span&gt;&lt;span class='nv'&gt; &lt;/span&gt;&lt;span class='s'&gt;ebs&amp;quot;&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;anything&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;stuff&amp;quot;&lt;/span&gt;
  &lt;span class='l-Scalar-Plain'&gt;more&lt;/span&gt;&lt;span class='p-Indicator'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This configuration file specifies where the httperf executable lives, the host, port, user, password, and database to use for the test. Baracus puts all of the results and wsesslog files back into CouchDB for later consumption, the report_url is where you define this database.&lt;/p&gt;

&lt;p&gt;As I mentioned, Baracus uses httperf to perform benchmarks. Specifically it uses httperf&amp;#8217;s wsesslog feature. wsesslog is a simple file format that describes what httperf should do each session. Here&amp;#8217;s an example of an entry generated with Baracus that does an HTTP GET:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='yaml'&gt;&lt;span class='l-Scalar-Plain'&gt;/testdb/a12bf8572f788824dfd5169e2eb496ab method=GET&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Baracus creates two wsesslogs for each run, one for writes (POST) and one for reads (GET). Baracus generates these files based on a few items in your configuration. Specifically, the number of sessions, document size and how many reads or writes to do per session. Additionally in the configuration you can specify at what rate httperf should perform the operations within each wsesslog file. Baracus creates the wsesslog for writing with random data and creates the read file with random docs from &lt;em&gt;all&lt;/em&gt;docs. Since Baracus uses &lt;em&gt;all&lt;/em&gt;docs, it performs all the writes first. The above config will create 100 sessions with 10 writes and reads each at a rate of 100 per second. Each document will be roughly 100 bytes.&lt;/p&gt;

&lt;p&gt;The info section at the end of the config contains any additional information you may want to have tag along with your results. You can put anything you want in there; I generally use this to describe the system I just ran the tests on.&lt;/p&gt;

&lt;p&gt;Once you have a configuration you are happy with it&amp;#8217;s very simple to run your tests.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='tcsh'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;baracus baracus.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This will print the standard httperf output as well as a tab delimited version. If you want to checkout the wsesslog files they will be written to the directory you ran Baracus in as well as to the results document in the reporting database. Here&amp;#8217;s what the results look like in Couch.&lt;/p&gt;

&lt;p&gt;&lt;img src='../images/baracus.jpg' alt='' /&gt;&lt;/p&gt;

&lt;p&gt;Baracus is meant to make repeatable benchmarking easy. If you have any questions, bugs or would like to contribute check out Baracus on &lt;a href='http://github.com/joewilliams/baracus'&gt;Github&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/SvGgm7ZC9oM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/benchmarking-couchdb-with-baracus</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/cloudant-at-nosql-east</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/JvBSa9-p7ds/cloudant-at-nosql-east" />
    <title type="html">Cloudant at No:SQL (east)</title>
    <updated>2009-08-31T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Cloudant&amp;#8217;s own Brad Anderson is helping to organize No:SQL (east), a conference centered around the latest nonrelational database systems. The conference will be held at the Georgia Tech Research Institute in Atlanta on October 28&amp;#8211;30. The description from the website reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NoSQL East, a conference of non-relational data stores, aims to present the experiences of different companies using so-called &amp;#8216;NoSQL&amp;#8217; solutions in production.&lt;/p&gt;

&lt;p&gt;The reasons for using these new systems are varied, but often involve scale that relational solutions cannot achieve. We have a new tool in our toolbelts, and as you will see, some people are using them quite effectively.&lt;/p&gt;

&lt;p&gt;Join us in Atlanta as we discuss &amp;#8216;Big Data&amp;#8217; and the systems that are completely transforming how people look at data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The organizers have a great venue picked out (courtesy of Georgia Tech) and an exciting group of speakers. A number of nonrelational systems will be covered, and Cloudant co-founder Mike Miller will be giving a talk on CouchDB. Anyone interested in the NoSQL space should really try to make it down to Atlanta to attend.&lt;/p&gt;

&lt;p&gt;Cloudant is one of two primary sponsors of the event, the other being &lt;span class='caps'&gt;GTRI&lt;/span&gt;. Many, if not all, of us will be attending the conference. We&amp;#8217;re always happy to talk about NoSQL, CouchDB, JQuery, The Bears winning the Superbowl, etc. You should come say hi.&lt;/p&gt;

&lt;p&gt;More information about No:SQL (east) can be found at &lt;a href='https://nosqleast.com/2009/'&gt;nosqleast.com&lt;/a&gt;. Check it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (10/22/09):&lt;/strong&gt; Since posting the above, a couple other great companies, including Basho and Rackspace Cloud, have also joined on as sponsors for the event.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/JvBSa9-p7ds" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/cloudant-at-nosql-east</feedburner:origLink></entry>
  
  <entry>
    <id>http://blog.cloudant.com/well-how-did-i-get-here-talking-heads</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/cloudant/~3/dazmBoits_g/well-how-did-i-get-here-talking-heads" />
    <title type="html">Well, how did I get here? – Talking Heads</title>
    <updated>2009-07-08T00:00:00-07:00</updated>
    <author>
      <name>Alan Hoffman</name>
    </author>
    <content type="html">&lt;p&gt;Dharmesh &lt;a href='http://onstartups.com/home/tabid/3339/bid/9008/Startup-Marketing-Tactical-Tips-From-The-Trenches.aspx'&gt;tells me&lt;/a&gt; that I&amp;#8217;m supposed to write a blog post explaining how we got to where we are. I&amp;#8217;ll try my best, but sometimes I feel like the guy in that Talking Heads song, looking around saying, &amp;#8220;This is not my beautiful house. This is not my beautiful wife.&amp;#8221; This company formed sometime between 2004 and 2008, but definitely around one of the rather large lunch tables on the first floor of the Stata Center at MIT. Adam, Mike, and I all worked in the same group in the physics department and every day we ate lunch around one of those oddly shaped tables. By January of 2008 came to the conclusion that we couldn&amp;#8217;t leave MIT without starting a company. We didn&amp;#8217;t really know what we wanted to do, but we did know 1) We were all fairly bright and industrious guys, 2) we enjoyed working together, and 3) we didn&amp;#8217;t want to go look for &amp;#8220;real&amp;#8221; jobs.&lt;/p&gt;

&lt;p&gt;Mike&amp;#8217;s original idea was for an automatic tamale maker. I&amp;#8217;m not kidding. That one got nixed when we found out we wereway behindalready.&lt;/p&gt;

&lt;p&gt;Eventually we decided to play to our strengths, which were in large-scale data processing and analysis. Our high-energy physics experiments generated some of the largest data sets in the world. It was our job to sift through the terabytes and petabytes to find rare particles and strange interactions. This is what we did for fun. Turns out that we&amp;#8217;re living in a data-centric world (more so every day) and many of the problems we had faced were popping up in the business world. What we wanted was a way to bring physics-style data analysis tools to the masses. All we had to do was build it.&lt;/p&gt;

&lt;p&gt;Toward the end of March someone sent me Paul Graham&amp;#8217;s essay &amp;#8220;A Student&amp;#8217;s Guide to Startups.&amp;#8221; I had never heard of PG before, but his essay resonated with me, especially the part about getting to stop treading water. I stumbled upon YCombinator literally by clicking random links on Graham&amp;#8217;s website. As it turned out, this YCombinator Company was pretty well known and respected, and they were asking for applications for startups that needed funding. Hey! We were a startup that needed funding and we were already in Boston. So we applied, almost on a whim. And to be honest, we were a little bit floored when we got accepted.&lt;/p&gt;

&lt;p&gt;After a number of back-and-forths with PG and other YC companies, we decided to focus on building a database designed for the specific needs of the web (hence our tagline &amp;#8220;A database for the web,&amp;#8221; clever huh?) One that would scale horizontally, could run on commodity hardware in a fault tolerant fashion, with a simple interface, and a powerful built-in analysis engine. We stumbled on Apache CouchDB, which at the time was in its relative infancy, and were very impressed with what they had built, especially the natural JSON-over-HTTP interface. We decided to take Couch and build it into a true &amp;#8216;cloud-ready&amp;#8217; database.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s been more than a year since we started working on Cloudant. Since then a huge community has sprung up around CouchDB. Our own Adam Kocoloski was tapped to be an official committer on the project. We were able to raise significant additional funding late last year, just as the economy was collapsing &amp;#8211; a true testament to the vision of our &lt;a href='http://www.avalonvi.com/'&gt;amazing VC&lt;/a&gt;. The Cloudant Team has grown from 3 to 6 as we were able to convince a few top-notch hackers to help us build our vision.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll soon be releasing a beta version of Cloudant: CouchDB-in-the-cloud. It seems as though we were on to something when we began tossing ideas around in the Stata Center 18 months ago. The NoSQL movement, which is gaining steam, indicates the need for a new type of database, one built for the specific needs of web applications. At Cloudant we hope to fill that need. If you want to learn more or sign-up to be notified of our impending release, &lt;a href='https://cloudant.com/'&gt;click here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/cloudant/~4/dazmBoits_g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.cloudant.com/well-how-did-i-get-here-talking-heads</feedburner:origLink></entry>
  

</feed>
