<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: couchdb</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/couchdb.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2010-12-01T12:54:00+00:00</updated><author><name>Simon Willison</name></author><entry><title>What are the advantages and disadvantages of using MongoDB vs CouchDB vs Cassandra vs Redis?</title><link href="https://simonwillison.net/2010/Dec/1/what-are-the-advantages/#atom-tag" rel="alternate"/><published>2010-12-01T12:54:00+00:00</published><updated>2010-12-01T12:54:00+00:00</updated><id>https://simonwillison.net/2010/Dec/1/what-are-the-advantages/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-are-the-advantages-and-disadvantages-of-using-MongoDB-vs-CouchDB-vs-Cassandra-vs-Redis/answer/Simon-Willison"&gt;What are the advantages and disadvantages of using MongoDB vs CouchDB vs Cassandra vs Redis?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I see Redis as a different category from the other three - kind of like you wouldn't say "what are the advantages of MySQL v.s. Memcached". Redis makes an excellent complement to pretty much any other persistent storage mechanism. I expanded on this here: &lt;span&gt;&lt;a href="http://simonwillison.net/2009/Oct/22/redis/"&gt;http://simonwillison.net/2009/Oc...&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/cassandra"&gt;cassandra&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mongodb"&gt;mongodb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nosql"&gt;nosql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="cassandra"/><category term="couchdb"/><category term="mongodb"/><category term="nosql"/><category term="redis"/><category term="quora"/></entry><entry><title>A Gentle Introduction to CouchDB for Relational Practitioners</title><link href="https://simonwillison.net/2010/Sep/22/couchdb/#atom-tag" rel="alternate"/><published>2010-09-22T21:51:00+00:00</published><updated>2010-09-22T21:51:00+00:00</updated><id>https://simonwillison.net/2010/Sep/22/couchdb/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.couchone.com/post/1167966323/a-gentle-introduction-to-couchdb-for-relational"&gt;A Gentle Introduction to CouchDB for Relational Practitioners&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
By “High Performance MySQL” author Baron Schwartz—a smart, concise overview that touches pretty much everything that’s interesting about CouchDB.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="databases"/><category term="recovered"/></entry><entry><title>What is the largest production deployment of CouchDB for online use?</title><link href="https://simonwillison.net/2010/Aug/25/what-is-the-largest/#atom-tag" rel="alternate"/><published>2010-08-25T09:23:00+00:00</published><updated>2010-08-25T09:23:00+00:00</updated><id>https://simonwillison.net/2010/Aug/25/what-is-the-largest/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-is-the-largest-production-deployment-of-CouchDB-for-online-use/answer/Simon-Willison"&gt;What is the largest production deployment of CouchDB for online use?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The BBC have a pretty big CouchDB cluster, which they use mostly as a replicated key-value store. It's used by their new identity platform which includes customisation features for iPlayer.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nosql"&gt;nosql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scaling"&gt;scaling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="couchdb"/><category term="databases"/><category term="nosql"/><category term="scaling"/><category term="quora"/></entry><entry><title>CouchDB View Cookbook for SQL Jockeys</title><link href="https://simonwillison.net/2009/Nov/26/couchdb/#atom-tag" rel="alternate"/><published>2009-11-26T13:20:25+00:00</published><updated>2009-11-26T13:20:25+00:00</updated><id>https://simonwillison.net/2009/Nov/26/couchdb/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://books.couchdb.org/relax/reference/views-for-sql-jockeys"&gt;CouchDB View Cookbook for SQL Jockeys&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This demystified CouchDB views for me. From “CouchDB: The Definitive Guide”, the free online manual.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/cookbook"&gt;cookbook&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqll"&gt;sqll&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/views"&gt;views&lt;/a&gt;&lt;/p&gt;



</summary><category term="cookbook"/><category term="couchdb"/><category term="sqll"/><category term="views"/></entry><entry><title>Node.js is genuinely exciting</title><link href="https://simonwillison.net/2009/Nov/23/node/#atom-tag" rel="alternate"/><published>2009-11-23T12:50:22+00:00</published><updated>2009-11-23T12:50:22+00:00</updated><id>https://simonwillison.net/2009/Nov/23/node/#atom-tag</id><summary type="html">
    &lt;p&gt;I gave a talk on Friday at &lt;a href="http://2009.full-frontal.org/"&gt;Full Frontal&lt;/a&gt;, a new one day JavaScript conference in my home town of Brighton. I ended up throwing away my intended topic (JSONP, APIs and cross-domain security) three days before the event in favour of a technology which first crossed my radar &lt;a href="http://simonwillison.net/2009/Nov/9/node/"&gt;less than two weeks ago&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That technology is Ryan Dahl's &lt;a href="http://nodejs.org/"&gt;Node&lt;/a&gt;. It's the most exciting new project I've come across in quite a while.&lt;/p&gt;

&lt;p&gt;At first glance, Node looks like yet another take on the idea of server-side JavaScript, but it's a lot more interesting than that. It builds on JavaScript's excellent support for event-based programming and uses it to create something that truly plays to the strengths of the language.&lt;/p&gt;

&lt;p&gt;Node describes itself as "evented I/O for V8 javascript". It's a toolkit for writing extremely high performance non-blocking event driven network servers in JavaScript. Think similar to &lt;a href="http://twistedmatrix.com/"&gt;Twisted&lt;/a&gt; or &lt;a href="http://rubyeventmachine.com/"&gt;EventMachine&lt;/a&gt; but for JavaScript instead of Python or Ruby.&lt;/p&gt;

&lt;h4&gt;Evented I/O?&lt;/h4&gt;

&lt;p&gt;As I discussed in my talk, event driven servers are a powerful alternative to the threading / blocking mechanism used by most popular server-side programming frameworks. Typical frameworks can only handle a small number of requests simultaneously, dictated by the number of server threads or processes available. Long-running operations can tie up one of those threads - enough long running operations at once and the server runs out of available threads and becomes unresponsive. For large amounts of traffic, each request must be handled as quickly as possible to free the thread up to deal with the next in line.&lt;/p&gt;

&lt;p&gt;This makes certain functionality extremely difficult to support. Examples include handling large file uploads, combining resources from multiple backend web APIs (which themselves can take an unpredictable amount of time to respond) or providing comet functionality by holding open the connection until a new event becomes available.&lt;/p&gt;

&lt;p&gt;Event driven programming takes advantage of the fact that network servers spend most of their time waiting for I/O operations to complete. Operations against in-memory data are incredibly fast, but anything that involves talking to the filesystem or over a network inevitably involves waiting around for a response.&lt;/p&gt;

&lt;p&gt;With Twisted, EventMachine and Node, the solution lies in specifying I/O operations in conjunction with callbacks. A single event loop rapidly switches between a list of tasks, firing off I/O operations and then moving on to service the next request. When the I/O returns, execution of that particular request is picked up again.&lt;/p&gt;

&lt;p&gt;(In the talk, I attempted to illustrate this with a questionable metaphor involving &lt;a href="http://www.slideshare.net/simon/evented-io-based-web-servers-explained-using-bunnies"&gt;hamsters, bunnies and a hyperactive squid&lt;/a&gt;).&lt;/p&gt;

&lt;iframe src="https://www.slideshare.net/slideshow/embed_code/key/B8ICSKJbZ2cBHw?startSlide=1" width="597" height="486" frameborder="0"   marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px;   margin-bottom:5px;max-width: 100%;" allowfullscreen="allowfullscreen"&gt;
&lt;/iframe&gt;

&lt;h4&gt;What makes Node exciting?&lt;/h4&gt;

&lt;p&gt;If systems like this already exist, what's so exciting about Node? Quite a few things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;JavaScript is extremely well suited to programming with callbacks&lt;/strong&gt;. Its anonymous function syntax and closure support is perfect for defining inline callbacks, and client-side development in general uses event-based programming as a matter of course: run this function when the user clicks here / when the Ajax response returns / when the page loads. JavaScript programmers already understand how to build software in this way.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Node represents a clean slate&lt;/strong&gt;. Twisted and EventMachine are hampered by the existence of a large number of blocking libraries for their respective languages. Part of the difficulty in learning those technologies is understanding which Python or Ruby libraries you can use and which ones you have to avoid. Node creator Ryan Dahl has a stated aim for Node to never provide a blocking API - even filesystem access and DNS lookups are catered for with non-blocking callback based APIs. This makes it much, much harder to screw things up.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Node is small&lt;/strong&gt;. I read through the &lt;a href="http://nodejs.org/api.html"&gt;API documentation&lt;/a&gt; in around half an hour and felt like I had a pretty comprehensive idea of what Node does and how I would achieve things with it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Node is fast&lt;/strong&gt;. V8 is the fast and keeps getting faster. Node's event loop uses Marc Lehmann's highly regarded &lt;a href="http://software.schmorp.de/pkg/libev.html"&gt;libev&lt;/a&gt; and &lt;a href="http://software.schmorp.de/pkg/libeio.html"&gt;libeio&lt;/a&gt; libraries. Ryan Dahl is himself something of a speed demon - he just replaced Node's HTTP parser implementation (already pretty speedy due to it's Ragel / Mongrel heritage) with a &lt;a href="http://four.livejournal.com/1033160.html"&gt;hand-tuned C implementation&lt;/a&gt; with some impressive characteristics.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Easy to get started&lt;/strong&gt;. Node ships with all of its dependencies, and compiles cleanly on Snow Leopard out of the box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With both my JavaScript and server-side hats on, Node just feels right. The APIs make sense, it fits a clear niche and despite its youth (the project started in February) everything feels solid and well constructed. The rapidly growing community is further indication that Ryan is on to something great here.&lt;/p&gt;

&lt;h4&gt;What does Node look like?&lt;/h4&gt;

&lt;p&gt;Here's how to get Hello World running in Node in 7 easy steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;samp&gt;git clone git://github.com/ry/node.git&lt;/samp&gt; (or download and extract &lt;a href="http://github.com/ry/node/archives/master" title="Download ry/node from GitHub"&gt;a tarball&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;samp&gt;./configure&lt;/samp&gt;&lt;/li&gt;
  &lt;li&gt;&lt;samp&gt;make&lt;/samp&gt; (takes a while, it needs to compile V8 as well)&lt;/li&gt;
  &lt;li&gt;&lt;samp&gt;sudo make install&lt;/samp&gt;&lt;/li&gt;
  &lt;li&gt;Save the below code as &lt;samp&gt;helloworld.js&lt;/samp&gt;&lt;/li&gt;
  &lt;li&gt;&lt;samp&gt;node helloworld.js&lt;/samp&gt;&lt;/li&gt;
  &lt;li&gt;Visit &lt;samp&gt;http://localhost:8080/&lt;/samp&gt; in your browser&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's helloworld.js:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;var sys = require('sys'), 
  http = require('http');

http.createServer(function(req, res) {
  res.sendHeader(200, {'Content-Type': 'text/html'});
  res.sendBody('&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;');
  res.finish();
}).listen(8080);

sys.puts('Server running at http://127.0.0.1:8080/');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you have Apache Bench installed, try running &lt;samp&gt;ab -n 1000 -c 100 'http://127.0.0.1:8080/'&lt;/samp&gt; to test it with 1000 requests using 100 concurrent connections. On my MacBook Pro I get 3374 requests a second.&lt;/p&gt;

&lt;p&gt;So Node is fast - but where it really shines is concurrency with long running requests. Alter the helloworld.js server definition to look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;http.createServer(function(req, res) {
  setTimeout(function() {
    res.sendHeader(200, {'Content-Type': 'text/html'});
    res.sendBody('&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;');
    res.finish();
  }, 2000);
}).listen(8080);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We're using &lt;samp&gt;setTimeout&lt;/samp&gt; to introduce an artificial two second delay to each request. Run the benchmark again - I get 49.68 requests a second, with every single request taking between 2012 and 2022 ms. With a two second delay, the best possible performance for 1000 requests 100 at a time is  &lt;em&gt;1000 requests / (1000 / 100) * 2 seconds = 50 requests a second&lt;/em&gt;. Node hits it pretty much bang on the nose.&lt;/p&gt;

&lt;p&gt;The most important line in the above examples is &lt;code&gt;res.finish()&lt;/code&gt;. This is the mechanism Node provides for explicitly signalling that a request has been fully processed and should be returned to the browser. By making it explicit, Node makes it easy to implement comet patterns like long polling and streaming responses - stuff that is decidedly non trivial in most server-side frameworks.&lt;/p&gt;

&lt;h4&gt;djangode&lt;/h4&gt;

&lt;p&gt;Node's core APIs are pretty low level - it has HTTP client and server libraries, DNS handling, asynchronous file I/O etc, but it doesn't give you much in the way of high level web framework APIs. Unsurprisingly, this has lead to a cambrian explosion of lightweight web frameworks based on top of Node - the &lt;a href="http://wiki.github.com/ry/node"&gt;projects using node page&lt;/a&gt; lists a bunch of them. Rolling a framework is a great way of learning a low-level API, so I've thrown together my own - &lt;a href="http://github.com/simonw/djangode"&gt;djangode&lt;/a&gt; - which brings Django's regex-based URL handling to Node along with a few handy utility functions. Here's a simple djangode application:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;var dj = require('./djangode');

var app = dj.makeApp([
  ['^/$', function(req, res) {
    dj.respond(res, 'Homepage');
  }],
  ['^/other$', function(req, res) {
    dj.respond(res, 'Other page');
  }],
  ['^/page/(\\d+)$', function(req, res, page) {
    dj.respond(res, 'Page ' + page);
  }]
]);
dj.serve(app, 8008);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;djangode is currently a throwaway prototype, but I'll probably be extending it with extra functionality as I explore more Node related ideas.&lt;/p&gt;

&lt;h4&gt;nodecast&lt;/h4&gt;

&lt;p&gt;My main demo in the Full Frontal talk was nodecast, an extremely simple broadcast-oriented comet application. Broadcast is my favourite "hello world" example for comet because it's both simpler than chat and more realistic - I've been involved in plenty of projects that could benefit from being able to broadcast events to their audience, but few that needed an interactive chat room.&lt;/p&gt;

&lt;p&gt;The source code for the version I demoed can be found on GitHub in &lt;a href="http://github.com/simonw/nodecast/tree/no-redis"&gt;the no-redis branch&lt;/a&gt;. It's a very simple application - the client-side JavaScript simply uses jQuery's getJSON method to perform long-polling against a simple URL endpoint:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;function fetchLatest() {
  $.getJSON('/wait?id=' + last_seen, function(d) {
    $.each(d, function() {
      last_seen = parseInt(this.id, 10) + 1;
      ul.prepend($('&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;').text(this.text));
    });
    fetchLatest();
  });
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Doing this recursively is probably a bad idea since it will eventually blow the browser's JavaScript stack, but it works OK for the demo.&lt;/p&gt;

&lt;p&gt;The more interesting part is the server-side &lt;samp&gt;/wait&lt;/samp&gt; URL which is being polled. Here's the relevant Node/djangode code:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;var message_queue = new process.EventEmitter();

var app = dj.makeApp([
  // ...
  ['^/wait$', function(req, res) {
    var id = req.uri.params.id || 0;
    var messages = getMessagesSince(id);
    if (messages.length) {
      dj.respond(res, JSON.stringify(messages), 'text/plain');
    } else {
      // Wait for the next message
      var listener = message_queue.addListener('message', function() {
        dj.respond(res, 
          JSON.stringify(getMessagesSince(id)), 'text/plain'
        );
        message_queue.removeListener('message', listener);
        clearTimeout(timeout);
      });
      var timeout = setTimeout(function() {
        message_queue.removeListener('message', listener);
        dj.respond(res, JSON.stringify([]), 'text/plain');
      }, 10000);
    }
  }]
  // ...
]);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The wait endpoint checks for new messages and, if any exist, returns immediately. If there are no new messages it does two things: it hooks up a listener on the &lt;samp&gt;message_queue&lt;/samp&gt; EventEmitter (Node's equivalent of jQuery/YUI/Prototype's custom events) which will respond and end the request when a new message becomes available, and also sets a timeout that will cancel the listener and end the request after 10 seconds. This ensures that long polls don't go on too long and potentially cause problems - as far as the browser is concerned it's just talking to a JSON resource which takes up to ten seconds to load.&lt;/p&gt;

&lt;p&gt;When a message does become available, calling &lt;samp&gt;message_queue.emit('message')&lt;/samp&gt; will cause all waiting requests to respond with the latest set of messages.&lt;/p&gt;

&lt;h4&gt;Talking to databases&lt;/h4&gt;

&lt;p&gt;nodecast keeps track of messages using an in-memory JavaScript array, which works fine until you restart the server and lose everything. How do you implement persistent storage?&lt;/p&gt;

&lt;p&gt;For the moment, the easiest answer lies with the NoSQL ecosystem. Node's focus on non-blocking I/O makes it hard (but not impossible) to hook it up to regular database client libraries. Instead, it strongly favours databases that speak simple protocols over a TCP/IP socket - or even better, databases that communicate over HTTP. So far I've tried using CouchDB (with &lt;a href="http://github.com/sixtus/node-couch"&gt;node-couch&lt;/a&gt;) and redis (with &lt;a href="http://github.com/fictorial/redis-node-client"&gt;redis-node-client&lt;/a&gt;), and both worked extremely well. nodecast &lt;a href="http://github.com/simonw/nodecast"&gt;trunk&lt;/a&gt; now uses redis to store the message queue, and provides a nice example of working with a callback-based non-blocking database interface:&lt;/p&gt;

&lt;pre&gt;&lt;code class="javascript"&gt;var db = redis.create_client();
var REDIS_KEY = 'nodecast-queue';

function addMessage(msg, callback) {
  db.llen(REDIS_KEY, function(i) {
    msg.id = i; // ID is set to the queue length
    db.rpush(REDIS_KEY, JSON.stringify(msg), function() {
      message_queue.emit('message', msg);
      callback(msg);
    });
  });
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Relational databases are coming to Node. Ryan has a &lt;a href="http://github.com/ry/node_postgres"&gt;PostgreSQL adapter&lt;/a&gt; in the works, thanks to that database already featuring a mature non-blocking client library. MySQL will be a bit tougher - Node will need to grow a separate thread pool to integrate with the official client libs - but you can talk to MySQL right now by dropping in &lt;a href="https://open.nytimes.com/introducing-dbslayer-64d7168a143f"&gt;DBSlayer&lt;/a&gt; from the NY Times which provides an HTTP interface to a pool of MySQL servers.&lt;/p&gt;

&lt;h4&gt;Mixed environments&lt;/h4&gt;

&lt;p&gt;I don't see myself switching all of my server-side development over to JavaScript, but Node has definitely earned a place in my toolbox. It shouldn't be at all hard to mix Node in to an existing server-side environment - either by running both behind a single HTTP proxy (being event-based itself, &lt;a href="http://nginx.net/"&gt;nginx&lt;/a&gt; would be an obvious fit) or by putting Node applications on a separate subdomain. Node is a tempting option for anything involving comet, file uploads or even just mashing together potentially slow loading web APIs. Expect to hear a lot more about it in the future.&lt;/p&gt;

&lt;h4&gt;Further reading&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf"&gt;Ryan's JSConf.eu presentation&lt;/a&gt; is the best discussion I've seen anywhere of the design philosophy behind Node.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://nodejs.org/api.html"&gt;Node's API documentation&lt;/a&gt; is essential reading.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb"&gt;Streaming file uploads with node.js&lt;/a&gt; illustrates how well suited Node is to accepting large file uploads.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://groups.google.com/group/nodejs"&gt;The nodejs Google Group&lt;/a&gt; is the hub of the Node community.&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/async"&gt;async&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/eventio"&gt;eventio&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nodejs"&gt;nodejs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nosql"&gt;nosql&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/redis"&gt;redis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ryan-dahl"&gt;ryan-dahl&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tornado"&gt;tornado&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twisted"&gt;twisted&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/v8"&gt;v8&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/highlights"&gt;highlights&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/annotated-talks"&gt;annotated-talks&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="async"/><category term="comet"/><category term="couchdb"/><category term="eventio"/><category term="http"/><category term="javascript"/><category term="nodejs"/><category term="nosql"/><category term="redis"/><category term="ryan-dahl"/><category term="my-talks"/><category term="tornado"/><category term="twisted"/><category term="v8"/><category term="highlights"/><category term="annotated-talks"/></entry><entry><title>Simple CouchDB multi-master clustering via Nginx</title><link href="https://simonwillison.net/2009/Nov/19/cluster/#atom-tag" rel="alternate"/><published>2009-11-19T16:37:36+00:00</published><updated>2009-11-19T16:37:36+00:00</updated><id>https://simonwillison.net/2009/Nov/19/cluster/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://ephemera.karmi.cz/post/247255194/simple-couchdb-multi-master-clustering-via-nginx"&gt;Simple CouchDB multi-master clustering via Nginx&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
An impressive combination. CouchDB can be easily set up in a multi-master configuration, where writes to one master are replicated to the other and vice versa. This makes setting up a reliable CouchDB cluster is as simple as putting two such servers behind a single nginx proxy.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/cluster"&gt;cluster&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/load-balancing"&gt;load-balancing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/multimaster"&gt;multimaster&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nginx"&gt;nginx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/replication"&gt;replication&lt;/a&gt;&lt;/p&gt;



</summary><category term="cluster"/><category term="couchdb"/><category term="load-balancing"/><category term="multimaster"/><category term="nginx"/><category term="replication"/></entry><entry><title>Desktop Couch initial code</title><link href="https://simonwillison.net/2009/Jul/9/desktop/#atom-tag" rel="alternate"/><published>2009-07-09T11:34:19+00:00</published><updated>2009-07-09T11:34:19+00:00</updated><id>https://simonwillison.net/2009/Jul/9/desktop/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.kryogenix.org/days/2009/07/09/desktop-couch-initial-code"&gt;Desktop Couch initial code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
More from Stuart Langridge on the project to make CouchDB available as a desktop service, providing free synchronisation between machines and a way for different applications to interrogate each other’s structured data.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/desktop"&gt;desktop&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/stuart-langridge"&gt;stuart-langridge&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/synchronisation"&gt;synchronisation&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="desktop"/><category term="stuart-langridge"/><category term="synchronisation"/></entry><entry><title>MongoDB</title><link href="https://simonwillison.net/2009/Jun/30/mongodb/#atom-tag" rel="alternate"/><published>2009-06-30T19:13:04+00:00</published><updated>2009-06-30T19:13:04+00:00</updated><id>https://simonwillison.net/2009/Jun/30/mongodb/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Lots of discussions about this at EuroPython today—it’s a document database, very similar to CouchDB but significantly faster and suggested for production use. Best of all, trying it out on OS X is as easy as extracting the tarball and running “bin/mongod --dbpath /tmp/test-mongo-db run”.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/documentstore"&gt;documentstore&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/europython"&gt;europython&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/keyvaluestore"&gt;keyvaluestore&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mongodb"&gt;mongodb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nonrelationaldatabase"&gt;nonrelationaldatabase&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="documentstore"/><category term="europython"/><category term="json"/><category term="keyvaluestore"/><category term="macos"/><category term="mongodb"/><category term="nonrelationaldatabase"/></entry><entry><title>whine flu, railsmalefail 2009</title><link href="https://simonwillison.net/2009/Apr/29/danny/#atom-tag" rel="alternate"/><published>2009-04-29T11:39:38+00:00</published><updated>2009-04-29T11:39:38+00:00</updated><id>https://simonwillison.net/2009/Apr/29/danny/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.oblomovka.com/wp/2009/04/28/how-to-be-edgy/"&gt;whine flu, railsmalefail 2009&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Danny quotes the smartest take on the CouchDB/pr0n controversy: “It’s about presenting women as ’the other,’ not ’us.’ It would have been just as offensive if all the women shown were domineering mothers in aprons, shaking their fingers and threatening with rolling pins.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/danny-obrien"&gt;danny-obrien&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sexism"&gt;sexism&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="danny-obrien"/><category term="rails"/><category term="sexism"/></entry><entry><title>Installing CouchDB from source on OS X</title><link href="https://simonwillison.net/2009/Apr/17/hublog/#atom-tag" rel="alternate"/><published>2009-04-17T16:22:41+00:00</published><updated>2009-04-17T16:22:41+00:00</updated><id>https://simonwillison.net/2009/Apr/17/hublog/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://hublog.hubmed.org/archives/001845.html"&gt;Installing CouchDB from source on OS X&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
So far I’ve just been playing with it in an Ubuntu virtual machine.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/building"&gt;building&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ubuntu"&gt;ubuntu&lt;/a&gt;&lt;/p&gt;



</summary><category term="building"/><category term="couchdb"/><category term="macos"/><category term="ubuntu"/></entry><entry><title>New PylonsHQ Site Launches</title><link href="https://simonwillison.net/2009/Jan/22/pylonshq/#atom-tag" rel="alternate"/><published>2009-01-22T18:33:17+00:00</published><updated>2009-01-22T18:33:17+00:00</updated><id>https://simonwillison.net/2009/Jan/22/pylonshq/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://pylonshq.com/articles/archives/2009/1/new_pylonshq_site_launches"&gt;New PylonsHQ Site Launches&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The new site uses CouchDB instead of a relational database, and the code for the site is open source so you can see how it all works.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ben-bangert"&gt;ben-bangert&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nonrelational"&gt;nonrelational&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pylons"&gt;pylons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="ben-bangert"/><category term="couchdb"/><category term="nonrelational"/><category term="pylons"/><category term="python"/></entry><entry><title>Rules of Database App Aging</title><link href="https://simonwillison.net/2009/Jan/18/aging/#atom-tag" rel="alternate"/><published>2009-01-18T09:09:43+00:00</published><updated>2009-01-18T09:09:43+00:00</updated><id>https://simonwillison.net/2009/Jan/18/aging/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://push.cx/2009/rules-of-database-app-aging"&gt;Rules of Database App Aging&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Peter Harkins: All fields become optional, all relationships become many-to-many, chatter always expands. This is why document oriented databases such as CouchDB are looking more and more attractive.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/peter-harkins"&gt;peter-harkins&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="databases"/><category term="peter-harkins"/></entry><entry><title>GeoCouch: Geospatial queries with CouchDB</title><link href="https://simonwillison.net/2008/Oct/27/geocouch/#atom-tag" rel="alternate"/><published>2008-10-27T23:48:46+00:00</published><updated>2008-10-27T23:48:46+00:00</updated><id>https://simonwillison.net/2008/Oct/27/geocouch/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-geospatial-queries-with-couchdb:2008-10-26:en,CouchDB,Python,geo"&gt;GeoCouch: Geospatial queries with CouchDB&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Interesting approach: uses “external2”, a branch that allows external services to be called from CouchDB. SQLite’s SpatiaLite extension is then used as an external spacial index.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/external2"&gt;external2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/geocouch"&gt;geocouch&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/spatialite"&gt;spatialite&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="erlang"/><category term="external2"/><category term="geocouch"/><category term="spatialite"/><category term="sqlite"/></entry><entry><title>Persevere adds Comet Support</title><link href="https://simonwillison.net/2008/May/13/persevere/#atom-tag" rel="alternate"/><published>2008-05-13T08:09:29+00:00</published><updated>2008-05-13T08:09:29+00:00</updated><id>https://simonwillison.net/2008/May/13/persevere/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://cometdaily.com/2008/05/12/persevere-adds-comet-support/"&gt;Persevere adds Comet Support&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Persevere sounds neat: a RESTful HTTP/JSON data store (the interface reminds me of CouchDB) which recently gained the ability to “subscribe” to a resource and receive notifications of updates via comet.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/persevere"&gt;persevere&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rest"&gt;rest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/restful"&gt;restful&lt;/a&gt;&lt;/p&gt;



</summary><category term="comet"/><category term="couchdb"/><category term="javascript"/><category term="json"/><category term="persevere"/><category term="rest"/><category term="restful"/></entry><entry><title>Multi-Inflection-Point Alert</title><link href="https://simonwillison.net/2008/Apr/26/ongoing/#atom-tag" rel="alternate"/><published>2008-04-26T18:48:57+00:00</published><updated>2008-04-26T18:48:57+00:00</updated><id>https://simonwillison.net/2008/Apr/26/ongoing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.tbray.org/ongoing/When/200x/2008/04/24/Inflection"&gt;Multi-Inflection-Point Alert&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dammit, Tim, stop giving away our competitive advantages!


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bigtable"&gt;bigtable&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/java"&gt;java&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rest"&gt;rest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/simpledb"&gt;simpledb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/soap"&gt;soap&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/tim-bray"&gt;tim-bray&lt;/a&gt;&lt;/p&gt;



</summary><category term="bigtable"/><category term="couchdb"/><category term="java"/><category term="python"/><category term="rails"/><category term="rest"/><category term="simpledb"/><category term="soap"/><category term="tim-bray"/></entry><entry><title>What Sucks About Erlang</title><link href="https://simonwillison.net/2008/Mar/11/damien/#atom-tag" rel="alternate"/><published>2008-03-11T05:45:16+00:00</published><updated>2008-03-11T05:45:16+00:00</updated><id>https://simonwillison.net/2008/Mar/11/damien/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://damienkatz.net/2008/03/what_sucks_abou.html"&gt;What Sucks About Erlang&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Damien Katz shares his greatest frustrations from working with Erlang on CouchDB.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/damien-katz"&gt;damien-katz&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="damien-katz"/><category term="erlang"/></entry><entry><title>CouchDB, XML, and E4X</title><link href="https://simonwillison.net/2008/Mar/5/aboutcmlenz/#atom-tag" rel="alternate"/><published>2008-03-05T00:31:34+00:00</published><updated>2008-03-05T00:31:34+00:00</updated><id>https://simonwillison.net/2008/Mar/5/aboutcmlenz/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cmlenz.net/archives/2008/03/couchdb-xml-and-e4x"&gt;CouchDB, XML, and E4X&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Brilliant—CouchDB now enables SpiderMonkey’s E4X support, meaning CouchDB views can easily query XML documents stored inside JSON objects using E4X syntax.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/christopher-lenz"&gt;christopher-lenz&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/e4x"&gt;e4x&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/spidermonkey"&gt;spidermonkey&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;&lt;/p&gt;



</summary><category term="christopher-lenz"/><category term="couchdb"/><category term="e4x"/><category term="javascript"/><category term="json"/><category term="spidermonkey"/><category term="xml"/></entry><entry><title>Damien Katz: New Gig</title><link href="https://simonwillison.net/2008/Jan/2/damien/#atom-tag" rel="alternate"/><published>2008-01-02T20:35:24+00:00</published><updated>2008-01-02T20:35:24+00:00</updated><id>https://simonwillison.net/2008/Jan/2/damien/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://damienkatz.net/2008/01/new_gig.html"&gt;Damien Katz: New Gig&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
IBM have employed Damien Katz to work full time on CouchDB. The work will be under the Apache license with the ASF owning the copyright.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apache"&gt;apache&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/asf"&gt;asf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/damien-katz"&gt;damien-katz&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ibm"&gt;ibm&lt;/a&gt;&lt;/p&gt;



</summary><category term="apache"/><category term="asf"/><category term="couchdb"/><category term="damien-katz"/><category term="ibm"/></entry><entry><title>CouchDB Roundup</title><link href="https://simonwillison.net/2007/Dec/6/damien/#atom-tag" rel="alternate"/><published>2007-12-06T15:48:47+00:00</published><updated>2007-12-06T15:48:47+00:00</updated><id>https://simonwillison.net/2007/Dec/6/damien/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://damienkatz.net/2007/12/couchdb_roundup.html"&gt;CouchDB Roundup&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The CouchDB project is interested in contributions from people who can write a large file driver for Erlang, help figure out the CouchDB security model and build scripts to help benchmark performance, scalability and reliability.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/helpwanted"&gt;helpwanted&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="erlang"/><category term="helpwanted"/></entry><entry><title>Call for Participation for XTech 2008</title><link href="https://simonwillison.net/2007/Dec/5/xtech/#atom-tag" rel="alternate"/><published>2007-12-05T15:28:22+00:00</published><updated>2007-12-05T15:28:22+00:00</updated><id>https://simonwillison.net/2007/Dec/5/xtech/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://2008.xtech.org/public/content/2007/12/05-cfp"&gt;Call for Participation for XTech 2008&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
XTech 2008 will be in Dublin, Ireland from the 6th to the 9th of May. Lots of really interesting topics in the CfP (OpenID, OAuth, Comet, CouchDB...)—deadline for submissions is the 25th of January.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/call-for-proposals"&gt;call-for-proposals&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/comet"&gt;comet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/conferences"&gt;conferences&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/oauth"&gt;oauth&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xtech"&gt;xtech&lt;/a&gt;&lt;/p&gt;



</summary><category term="call-for-proposals"/><category term="comet"/><category term="conferences"/><category term="couchdb"/><category term="oauth"/><category term="openid"/><category term="xtech"/></entry><entry><title>[Release] CouchDB 0.7.0</title><link href="https://simonwillison.net/2007/Nov/17/couchdb/#atom-tag" rel="alternate"/><published>2007-11-17T00:25:10+00:00</published><updated>2007-11-17T00:25:10+00:00</updated><id>https://simonwillison.net/2007/Nov/17/couchdb/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://jan.prima.de/~jan/plok/archives/106-Release-CouchDB-0.7.0.html"&gt;[Release] CouchDB 0.7.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This is a huge milestone for the project—it’s the first official release to include the JSON REST API instead of XML, and it’s also the first release that is “intended for widespread use”.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jan-lehnardt"&gt;jan-lehnardt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/releases"&gt;releases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rest"&gt;rest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="jan-lehnardt"/><category term="json"/><category term="releases"/><category term="rest"/><category term="xml"/></entry><entry><title>CouchDB "Joins"</title><link href="https://simonwillison.net/2007/Oct/25/couchdb/#atom-tag" rel="alternate"/><published>2007-10-25T08:27:27+00:00</published><updated>2007-10-25T08:27:27+00:00</updated><id>https://simonwillison.net/2007/Oct/25/couchdb/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cmlenz.net/blog/2007/10/couchdb-joins.html"&gt;CouchDB &amp;quot;Joins&amp;quot;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Different approaches to indexing a blog post and its associated comments in the non-relational CouchDB.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/christopher-lenz"&gt;christopher-lenz&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/joins"&gt;joins&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/relational"&gt;relational&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/views"&gt;views&lt;/a&gt;&lt;/p&gt;



</summary><category term="christopher-lenz"/><category term="couchdb"/><category term="databases"/><category term="erlang"/><category term="joins"/><category term="relational"/><category term="views"/></entry><entry><title>Quoting Jacob Kaplan-Moss</title><link href="https://simonwillison.net/2007/Oct/20/jacobian/#atom-tag" rel="alternate"/><published>2007-10-20T13:46:56+00:00</published><updated>2007-10-20T13:46:56+00:00</updated><id>https://simonwillison.net/2007/Oct/20/jacobian/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://www.jacobian.org/writing/2007/oct/19/of-the-web/"&gt;&lt;p&gt;Django may be built for the Web, but CouchDB is built of the Web. I've never seen software that so completely embraces the philosophies behind HTTP. CouchDB makes Django look old-school in the same way that Django makes ASP look outdated.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://www.jacobian.org/writing/2007/oct/19/of-the-web/"&gt;Jacob Kaplan-Moss&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/asp"&gt;asp&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="asp"/><category term="couchdb"/><category term="django"/><category term="http"/><category term="jacob-kaplan-moss"/><category term="python"/></entry><entry><title>CouchDB first impressions</title><link href="https://simonwillison.net/2007/Oct/19/couchdb/#atom-tag" rel="alternate"/><published>2007-10-19T11:43:11+00:00</published><updated>2007-10-19T11:43:11+00:00</updated><id>https://simonwillison.net/2007/Oct/19/couchdb/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.jacobian.org/writing/2007/oct/18/couchdb/"&gt;CouchDB first impressions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jacob’s been poking at CouchDB. Inserting data is slow, but everything else looks pretty slick considering how recently the JSON / JavaScript views functionality was added.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jacob-kaplan-moss"&gt;jacob-kaplan-moss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="erlang"/><category term="jacob-kaplan-moss"/><category term="javascript"/><category term="json"/></entry><entry><title>A CouchDB GUI front end</title><link href="https://simonwillison.net/2007/Sep/12/ciaranus/#atom-tag" rel="alternate"/><published>2007-09-12T23:59:48+00:00</published><updated>2007-09-12T23:59:48+00:00</updated><id>https://simonwillison.net/2007/Sep/12/ciaranus/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.ciarang.com/index.php/archives/109"&gt;A CouchDB GUI front end&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Written in C# and .NET. It looks like writing frontends for CouchDB could make an excellent project for learning a new GUI environment.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ciarangultnieks"&gt;ciarangultnieks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csharp"&gt;csharp&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dotnet"&gt;dotnet&lt;/a&gt;&lt;/p&gt;



</summary><category term="ciarangultnieks"/><category term="couchdb"/><category term="csharp"/><category term="dotnet"/></entry><entry><title>CouchDb: Some Context</title><link href="https://simonwillison.net/2007/Sep/4/some/#atom-tag" rel="alternate"/><published>2007-09-04T02:31:10+00:00</published><updated>2007-09-04T02:31:10+00:00</updated><id>https://simonwillison.net/2007/Sep/4/some/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://jan.prima.de/~jan/plok/archives/72-Some-Context.html"&gt;CouchDb: Some Context&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
CouchDb developer Jan Lehnardt wrote up detailed notes on slides from a presentation he gave back in June, explaining most of what’s interesting about CouchDb (although without the new JavaScript function query language).


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jan-lehnardt"&gt;jan-lehnardt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nonrelational"&gt;nonrelational&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/slides"&gt;slides&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="jan-lehnardt"/><category term="javascript"/><category term="nonrelational"/><category term="slides"/></entry><entry><title>CouchDB: Thinking beyond the RDBMS</title><link href="https://simonwillison.net/2007/Sep/3/labnotes/#atom-tag" rel="alternate"/><published>2007-09-03T09:48:43+00:00</published><updated>2007-09-03T09:48:43+00:00</updated><id>https://simonwillison.net/2007/Sep/3/labnotes/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.labnotes.org/2007/09/02/couchdb-thinking-beyond-the-rdbms/"&gt;CouchDB: Thinking beyond the RDBMS&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
CouchDB is a fascinating project—an Erlang powered non-relational database with a JSON API that lets you define “views” (really computed tables) based on JavaScript functions that execute using map/reduce. Damien Katz, the main developer currently works for MySQL and used to work on Lotus Notes.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/couchdb"&gt;couchdb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/damien-katz"&gt;damien-katz&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/erlang"&gt;erlang&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/lotusnotes"&gt;lotusnotes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mapreduce"&gt;mapreduce&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mysql"&gt;mysql&lt;/a&gt;&lt;/p&gt;



</summary><category term="couchdb"/><category term="damien-katz"/><category term="databases"/><category term="erlang"/><category term="javascript"/><category term="json"/><category term="lotusnotes"/><category term="mapreduce"/><category term="mysql"/></entry></feed>