<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bradley Holt &#187; CouchDB</title>
	<atom:link href="http://bradley-holt.com/tag/couchdb/feed/" rel="self" type="application/rss+xml" />
	<link>http://bradley-holt.com</link>
	<description></description>
	<lastBuildDate>Fri, 06 Jan 2012 18:57:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>The Future of CouchDB and Couchbase Server</title>
		<link>http://bradley-holt.com/2012/01/the-future-of-couchdb-and-couchbase-server/</link>
		<comments>http://bradley-holt.com/2012/01/the-future-of-couchdb-and-couchbase-server/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 19:42:03 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1491</guid>
		<description><![CDATA[&#8220;What&#8217;s the future of CouchDB? It&#8217;s Couchbase.&#8221; —Damien Katz &#8220;The future of CouchDB is CouchDB.&#8221; —Noah Slater First of all, don&#8217;t panic. The Apache CouchDB project is thriving. There are plenty of core contributors who are dedicated to the project. If you&#8217;re using CouchDB, you&#8217;re fine. If you&#8217;re considering using CouchDB, you&#8217;ll be fine. CouchDB [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;<a href="http://damienkatz.net/2012/01/the_future_of_couchdb.html">What&#8217;s the future of CouchDB? It&#8217;s Couchbase.</a>&#8221; —Damien Katz</p></blockquote>
<blockquote><p>&#8220;<a href="https://twitter.com/nslater/status/154938284647260160">The future of CouchDB is CouchDB.</a>&#8221; —Noah Slater</p></blockquote>
<p>First of all, don&#8217;t panic. The Apache CouchDB project is thriving. There are plenty of core contributors who are dedicated to the project. If you&#8217;re using CouchDB, you&#8217;re fine. If you&#8217;re considering using CouchDB, you&#8217;ll be fine. CouchDB has a bright future ahead of it. Couchbase has repeatedly said that they&#8217;re not the CouchDB company, so this shouldn&#8217;t be a surprise to anyone.</p>
<p>My interpretation of this announcement is that CouchDB is forking. Going forward, you&#8217;ll have two choices, either Apache CouchDB or Couchbase Server. The <a href="https://issues.apache.org/jira/browse/COUCHDB?report=com.atlassian.jira.plugin.system.project:roadmap-panel">road map for Apache CouchDB</a> will continue to be determined by community consensus. The road map for Couchbase Server will be determined by Couchbase, the company.</p>
<p>CouchDB has two futures: CouchDB and Couchbase Server. Traditionally, forking a project in this manner has been considered a Bad Thing. From The Jargon File entry for <a href="http://catb.org/jargon/html/F/forked.html">forked</a>:</p>
<blockquote><p>An open-source software project is said to have forked or be forked when the project group fissions into two or more parts pursuing separate lines of development (or, less commonly, when a third party unconnected to the project group begins its own line of development).  Forking is considered a <a href="http://catb.org/jargon/html/B/Bad-Thing.html"><em>Bad Thing</em></a> — not merely because it implies a lot of wasted effort in the future, but because forks tend to be accompanied by a great deal of strife and acrimony between the successor groups over issues of legitimacy, succession, and design direction.  There is serious social pressure against forking.  As a result, major forks (such as the Gnu-Emacs/XEmacs split, the fissionings of the 386BSD group into three daughter projects, and the short-lived GCC/EGCS split) are rare enough that they are remembered individually in hacker folklore.</p></blockquote>
<p>In my humble opinion, forking should no longer be considered a Bad Thing. Distributed revision control systems, such as Git, have made it much easier to merge changes back-and-forth between forked projects. If an individual or organization wants to take a project in a different direction, great! It sounds like Couchbase Server will be designed to meet a set of needs that are not being met by CouchDB. If so, a fork is perfectly appropriate as now both sets of needs can be met.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2012/01/the-future-of-couchdb-and-couchbase-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top Five Posts of 2011</title>
		<link>http://bradley-holt.com/2011/12/top-five-posts-of-2011/</link>
		<comments>http://bradley-holt.com/2011/12/top-five-posts-of-2011/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 17:15:32 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AMQP]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[Domain-Driven Design]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Open Standards]]></category>
		<category><![CDATA[OSCON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP-QAT]]></category>
		<category><![CDATA[Quality Assurance]]></category>
		<category><![CDATA[RabbitMQ]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1480</guid>
		<description><![CDATA[Continuing a trend started by Cal Evans and then followed by Chris Cornutt, Matthew Turland, and Joe Devon; here are the top five most viewed posts from my blog in 2011. 5. CouchDB and Domain-Driven Design This post covered two topics that are of great interest to me. Document databases like CouchDB have much potential [...]]]></description>
			<content:encoded><![CDATA[<p>Continuing a trend started by <a href="http://blog.calevans.com/2011/12/29/top-three-posts-of-2011/">Cal Evans</a> and then followed by <a href="http://blog.phpdeveloper.org/?p=425">Chris Cornutt</a>, <a href="http://matthewturland.com/2011/12/29/top-10-posts-of-2011/">Matthew Turland</a>, and <a href="http://mysqltalk.wordpress.com/2011/12/30/top-posts-of-2011/">Joe Devon</a>; here are the top five most viewed posts from my blog in 2011.</p>
<h3>5. <a href="http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/">CouchDB and Domain-Driven Design</a></h3>
<p>This post covered two topics that are of great interest to me. Document databases like CouchDB have much potential when it comes to domain-driven design. The post outlined some techniques for serializing domain objects into CouchDB documents.</p>
<h3>4. <a href="http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/">Addressing the NoSQL Criticism</a></h3>
<p>I heard a lot of NoSQL bashing this year at OSCON. As a result, I decided to write a rebuttal to many of the criticisms that I heard. This post inspired a lively <a href="http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/#comments">comment thread</a>.</p>
<h3>3. <a href="http://bradley-holt.com/2011/07/testing-php-5-4/">Testing PHP 5.4</a></h3>
<p>This was a short post on how to help the <a href="http://qa.php.net/">PHP Quality Assurance Team</a> by running the tests for the latest development version of PHP 5.4. It covered downloading, compiling, and running the tests. Most importantly, it also covered reporting your test results.</p>
<h3>2. <a href="http://bradley-holt.com/2011/07/exploring-rabbitmq-and-php/">Exploring RabbitMQ and PHP</a></h3>
<p>I was exploring the possibility of using RabbitMQ for an upcoming project. I decided to post some notes on my experience getting started with RabbitMQ and integrating it with PHP. I haven&#8217;t ended up using RabbitMQ in production yet, but I&#8217;m confident that I&#8217;ll end up using it at some point.</p>
<h3>1. <a href="http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/">CouchDB jQuery Plugin Reference</a></h3>
<p>I had been frustrated by the lack of documentation for the CouchDB jQuery plugin—so decided to write my own. After I wrote the blog post, <a href="http://www.maxogden.com/">Max Ogden</a> pointed me to <a href="http://arandomurl.com/">Dale Harvey</a>‘s <a href="https://github.com/daleharvey/jquery.couch.js-docs">documentation generator for jquery.couch.js</a> and a copy of the generated <a href="http://daleharvey.github.com/jquery.couch.js-docs/symbols/index.html">jQuery CouchDB documentation</a>. Max and Dale are also working on a more flexible jquery.couch2.js.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/12/top-five-posts-of-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchApps at CouchConf NYC</title>
		<link>http://bradley-holt.com/2011/10/couchapps-at-couchconf-nyc/</link>
		<comments>http://bradley-holt.com/2011/10/couchapps-at-couchconf-nyc/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 20:05:52 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1413</guid>
		<description><![CDATA[Here are the slides from Monday&#8217;s CouchConf NYC session on CouchApps with CouchDB, JavaScript and HTML5: CouchConf NYC CouchApps View more presentations from Bradley Holt]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from Monday&#8217;s CouchConf NYC session on CouchApps with CouchDB, JavaScript and HTML5:</p>
<div style="width:425px" id="__ss_9862348"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/bradley.holt/couchconf-nyc-couchapps-9862348" title="CouchConf NYC CouchApps" target="_blank">CouchConf NYC CouchApps</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9862348" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/10/couchapps-at-couchconf-nyc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learning CouchDB at ZendCon 2011</title>
		<link>http://bradley-holt.com/2011/10/learning-couchdb-at-zendcon-2011/</link>
		<comments>http://bradley-holt.com/2011/10/learning-couchdb-at-zendcon-2011/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:10:03 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[ZendCon]]></category>
		<category><![CDATA[ZendCon11]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1378</guid>
		<description><![CDATA[Here are the slides from today’s ZendCon tutorial on Learning CouchDB: ZendCon 2011 Learning CouchDB View more presentations from Bradley Holt You can instead download the PDF version, if you&#8217;d prefer. If you were in this session, please give me feedback on Joind.in.]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from today’s ZendCon tutorial on Learning CouchDB:</p>
<div style="width:425px" id="__ss_9726170"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/bradley.holt/zendcon-2011-learning-couchdb" title="ZendCon 2011 Learning CouchDB" target="_blank">ZendCon 2011 Learning CouchDB</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9726170" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a> </div>
</p></div>
<p>You can instead <a href="http://bradley-holt.com/wp-content/uploads/2011/10/zendcon-2011-learning-couchdb.pdf">download the PDF version</a>, if you&#8217;d prefer.</p>
<p>If you were in this session, please <a href="http://joind.in/talk/view/3763">give me feedback on Joind.in</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/10/learning-couchdb-at-zendcon-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchApps at jQuery Conference Boston 2011</title>
		<link>http://bradley-holt.com/2011/10/couchapps-at-jquery-conference-boston-2011/</link>
		<comments>http://bradley-holt.com/2011/10/couchapps-at-jquery-conference-boston-2011/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 17:15:51 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQCon]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1359</guid>
		<description><![CDATA[Here are the slides from today’s jQuery Conference presentation on CouchApps with CouchDB &#38; jQuery: jQuery Conference Boston 2011 CouchApps View more presentations from Bradley Holt If you were in this talk, please give me feedback on SpeakerRate. Related links: Offline Apps HTML5 Web Storage Local Storage &#8220;Native&#8221; Mobile Web Apps jQuery Mobile PhoneGap Building [...]]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from today’s jQuery Conference presentation on CouchApps with CouchDB &amp; jQuery:</p>
<div style="width:425px" id="__ss_9504563"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/bradley.holt/jquery-conference-boston-2011-couchapps" title="jQuery Conference Boston 2011 CouchApps" target="_blank">jQuery Conference Boston 2011 CouchApps</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9504563" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a> </div>
</p></div>
<p>If you were in this talk, please give me <a href="http://speakerrate.com/talks/8512-couchapps-with-couchdb-jquery">feedback on SpeakerRate</a>.</p>
<p>Related links:</p>
<ul>
<li> Offline Apps
<ul>
<li> <a href="http://diveintohtml5.org/offline.html">HTML5 Web Storage</a></li>
<li> <a href="http://diveintohtml5.org/storage.html">Local Storage</a></li>
</ul>
</li>
<li> &#8220;Native&#8221; Mobile Web Apps
<ul>
<li> <a href="http://jquerymobile.com/">jQuery Mobile</a></li>
<li> <a href="http://www.phonegap.com/">PhoneGap</a></li>
<li> <a href="http://shop.oreilly.com/product/9780596805791.do">Building iPhone Apps with HTML, CSS, and JavaScript</a></li>
<li> <a href="http://shop.oreilly.com/product/0636920010067.do">Building Android Apps with HTML, CSS, and JavaScript</a></li>
</ul>
</li>
<li> CouchDB and Couchbase
<ul>
<li> <a href="http://couchdb.apache.org/">CouchDB</a></li>
<li> <a href="http://www.couchbase.com/products-and-services/overview">Couchbase</a></li>
<li> <a href="http://googlecode.blogspot.com/2009/09/chris-anderson-couchdb-relaxing-offline.html">&#8220;Ground Computing&#8221;</a></li>
</ul>
</li>
<li> CouchApp Examples
<ul>
<li> Grocery Sync
<ul>
<li> <a href="https://github.com/couchbaselabs/GrocerySync-CouchApp">Couchapp code</a></li>
<li> <a href="https://github.com/couchbaselabs/iOS-Couchbase-Demo">iOS code</a></li>
<li> <a href="https://github.com/couchbaselabs/AndroidGrocerySync">Android code</a></li>
<li> <a href="http://blog.couchbase.com/couchbase-mobile-see-the-video">Presentation about Couchbase Mobile</a></li>
</ul>
</li>
<li> Monocles
<ul>
<li> <a href="http://monocl.es/">Demo</a></li>
<li> <a href="https://github.com/maxogden/monocles">Code</a></li>
<li> ReadWriteHack Interview with Max Ogden: <a href="http://www.readwriteweb.com/hack/2011/02/hacker-chat-max-ogden.php">Part 1</a>, <a href="http://www.readwriteweb.com/hack/2011/02/max-pt-2.php">Part 2</a></li>
</ul>
</li>
<li> CatMapper
<ul>
<li> <a href="http://catmapper.com/">Demo</a></li>
<li> <a href="https://github.com/maxogden/catmapper">Code</a></li>
</ul>
</li>
</ul>
</li>
<li> CouchDB jQuery Plugin
<ul>
<li> <a href="http://www.w3.org/Security/wiki/Same_Origin_Policy">Same-Origin Policy</a></li>
<li> <a href="http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/">CouchDB jQuery Plugin Reference</a></li>
<li> <a href="http://daleharvey.github.com/jquery.couch.js-docs/symbols/index.html">jQuery CouchDB jsDoc Reference</a></li>
</ul>
</li>
<li> <a href="http://couchapp.org/page/couchapp-python">couchapp command line tool</a></li>
<li> CouchApp Building Blocks
<ul>
<li> <a href="http://couchapp.org/page/evently">Evently</a></li>
<li> <a href="http://mustache.github.com/">Mustache</a></li>
<li> <a href="http://couchapp.couchone.com/docs/_design/docs/index.html#/topic/pathbinder">Pathbinder</a></li>
</ul>
</li>
<li> Alternative CouchApp Tools
<ul>
<li> <a href="https://github.com/mikeal/node.couchapp.js">node.couchapp.js</a></li>
<li> <a href="http://kansojs.org/">Kanso Framework</a></li>
<li> <a href="https://github.com/quirkey/soca">soca</a></li>
<li> <a href="http://reupholster.iriscouch.com/reupholster/_design/app/index.html">Reupholster</a></li>
</ul>
</li>
<li> Hosting
<ul>
<li> <a href="http://www.iriscouch.com/">Iris Couch</a></li>
<li> <a href="https://cloudant.com/">Cloudant</a></li>
</ul>
</li>
<li> CouchDB &amp; CouchApp Resources
<ul>
<li> <a href="http://couchapp.org/">CouchApp Wiki</a></li>
<li> <a href="http://wiki.apache.org/couchdb/">CouchDB Wiki</a></li>
<li> <a href="http://oreilly.com/catalog/9780596155896/">CouchDB: The Definitive Guide</a></li>
<li> <a href="http://oreilly.com/catalog/9781449303129/">Writing and Querying MapReduce Views in CouchDB</a></li>
<li> <a href="http://oreilly.com/catalog/9781449303433/">Scaling CouchDB</a></li>
<li> <a href="http://www.apress.com/9781430272373">Beginning CouchDB</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/10/couchapps-at-jquery-conference-boston-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speaking at CouchConf NYC</title>
		<link>http://bradley-holt.com/2011/09/speaking-at-couchconf-nyc/</link>
		<comments>http://bradley-holt.com/2011/09/speaking-at-couchconf-nyc/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 16:33:58 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[Couchbase]]></category>
		<category><![CDATA[CouchConf]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NYC]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1352</guid>
		<description><![CDATA[I&#8217;m pleased to announce that I&#8217;ll be speaking at CouchConf New York City on October 24, 2011. This event is part of the CouchConf World Tour presented by Couchbase. My talk will be on CouchApps with CouchDB, JavaScript and HTML5. From the talk description: In this talk we&#8217;ll see how to build CouchApps using CouchDB, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to announce that I&#8217;ll be speaking at <a href="http://www.couchbase.com/couchconf-nyc">CouchConf New York City</a> on October 24, 2011. This event is part of the <a href="http://www.couchbase.com/couchconf-world-tour">CouchConf World Tour</a> presented by Couchbase. My talk will be on CouchApps with CouchDB, JavaScript and HTML5. From the talk description:</p>
<blockquote><p>In this talk we&#8217;ll see how to build CouchApps using CouchDB, Javascript, and HTML5. We&#8217;ll look at related tools such as the couchapp command ine tool, the Evently jQuery plugin, the CouchDB API jQuery plugin, the CouchApp Loader, Pathbinder, and the Mustache templating framework.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/09/speaking-at-couchconf-nyc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchDB and Domain-Driven Design</title>
		<link>http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/</link>
		<comments>http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 15:30:27 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Domain-Driven Design]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1251</guid>
		<description><![CDATA[I&#8217;ve found CouchDB to be a great fit for domain-driven design (DDD). Specifically, CouchDB fits very well with the building block patterns and practices found within DDD. Two of these building blocks include Entities and Value Objects. Entities are objects defined by a thread of continuity and identity. A Value Object &#8220;is an object that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve found CouchDB to be a great fit for <a href="http://en.wikipedia.org/wiki/Domain-driven_design">domain-driven design</a> (DDD). Specifically, CouchDB fits very well with the building block patterns and practices found within DDD. Two of these building blocks include <em><a href="http://domaindrivendesign.org/node/109">Entities</a></em> and <em><a href="http://domaindrivendesign.org/node/135">Value Objects</a></em>. Entities are objects defined by a thread of continuity and identity. A Value Object &#8220;is an object that describes some characteristic or attribute but carries no concept of identity.&#8221; Value objects should be treated as immutable.</p>
<p><em><a href="http://domaindrivendesign.org/node/88">Aggregates</a></em> are groupings of associated Entities and Value Objects. Within an Aggregate, one member is designated as the <em>Aggregate Root</em>. External references are limited to only the Aggregate Root. Aggregates should follow transaction, distribution, and concurrency boundaries. Guess what else is defined by transaction, distribution, and concurrency boundaries? That&#8217;s right, JSON documents in CouchDB.</p>
<p>Let&#8217;s take a look at an example Aggregate, that representing a blog entry and related metadata. Note that the following UML diagrams are for classes in PHP, but it should be easy enough to translate these examples to any object-oriented programming language. We&#8217;ll start with the <code>Entry</code> Entity, which will serve as our Aggregate Root:</p>
<pre>-----------------------------------------
|                 Entry                 |
-----------------------------------------
|+ id : string                          |
|+ rev : string                         |
|+ title : Text                         |
|+ updated : Date                       |
|+ authors : Person[*]                  |
|+ content : Text                       |
-----------------------------------------
|+ __construct(entry : array) : void    |
|+ toArray() : array                    |
-----------------------------------------</pre>
<p>The <code>Text</code> Value Object:</p>
<pre>----------------------------------------------
|                    Text                    |
----------------------------------------------
|- type : string                             |
|- text : string                             |
----------------------------------------------
|+ __construct(type : string, text : string) |
|+ toArray() : array                         |
----------------------------------------------</pre>
<p>The <code>Date</code> Value Object:</p>
<pre>--------------------------------------
|                Date                |
--------------------------------------
|- timestamp : integer               |
--------------------------------------
|+ __construct(timestamp : integer)  |
|+ __toString() : string             |
--------------------------------------</pre>
<p>The <code>Person</code> Value Object:</p>
<pre>-------------------------------------------------------------
|                           Person                          |
-------------------------------------------------------------
|- name : string                                            |
|- uri : string                                             |
|- email : string                                           |
-------------------------------------------------------------
|+ __construct(name : string, uri : string, email : string) |
|+ toArray() : array                                        |
-------------------------------------------------------------</pre>
<p>I recommend serializing each Aggregate, starting with the Aggregate  Root, into a JSON document. Control access to Aggregate Roots  through a <em><a href="http://domaindrivendesign.org/node/123">Repository</a></em>. The <code>toArray()</code> methods above return an associative array representation of each object. The Repository can then transform the array into JSON for storage in CouchDB. Let&#8217;s take a look at the <code>EntryRepository</code>:</p>
<pre>---------------------------------
|        EntryRepository        |
---------------------------------
|                               |
---------------------------------
|+ get(id : string) : Entry     |
|+ post(entry : Entry) : void   |
|+ put(entry : Entry) : void    |
|+ delete(entry : Entry) : void |
---------------------------------</pre>
<p>Here&#8217;s an example of what the Aggregate&#8217;s object graph might look like, serialized as a JSON document:</p>
<pre><code class="javascript">{
    "_id": "http://bradley-holt.com/?p=1251",
    "title": {
        "type": "text",
        "text": "CouchDB and Domain-Driven Design"
    },
    "updated": "2011-08-02T15:30:00+00:00",
    "authors": [
        {
             "name": "Bradley Holt",
             "uri": "http://bradley-holt.com/",
             "email": "bradley.holt@foundline.com"
        }
    ],
    "content": {
        "type": "html",
        "text": "&lt;p&gt;I've found CouchDB to be a great fit for…&lt;/p&gt;"
    }
}</code></pre>
<p>You can also provide access to CouchDB views through Repositories. In the above example, this could be through the addition of an <code>index(skip : integer, limit : integer) : Entry[*]</code> method to the the <code>EntryRepository</code> (note that this is a naive pagination implementation, especially on large data sets—but that&#8217;s beyond the scope of this blog post). For more complex views, you may want to create a separate Repository for each CouchDB view.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/08/couchdb-and-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Addressing the NoSQL Criticism</title>
		<link>http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/</link>
		<comments>http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 16:59:10 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[OSCON]]></category>
		<category><![CDATA[Scaling]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1216</guid>
		<description><![CDATA[There were quite a few NoSQL critics at OSCON this year. I imagine this was true of past years as well, but I don&#8217;t know that first hand. I think there are several reasons behind the general disdain for NoSQL databases. First, NoSQL is horrible name. It implies that there&#8217;s something wrong with SQL and [...]]]></description>
			<content:encoded><![CDATA[<p>There were quite a few NoSQL critics at OSCON this year. I imagine this was true of past years as well, but I don&#8217;t know that first hand. I think there are several reasons behind the general disdain for NoSQL databases.</p>
<p>First, NoSQL is horrible name. It implies that there&#8217;s something wrong with SQL and it needs to be replaced with a newer and better technology. If you have structured data that needs to be queried, you should probably use a database that enforces a schema and implements Structured Query Language. I&#8217;ve heard people start redefining NoSQL as &#8220;not only SQL&#8221;. This is a <em>much</em> better definition and doesn&#8217;t antagonize those who use existing SQL databases. An SQL database isn&#8217;t always the right tool for the job and NoSQL databases give us some other options.</p>
<p>Second, there are <em>way</em> too many different types of databases that are categorized as NoSQL. There are document-oriented databases, key/value stores, graph databases, column-oriented databases, in-memory databases, and other database types. There are also databases that combine two or more of these properties. It&#8217;s easy to criticize something that is vague and loosely defined. As the NoSQL space matures, we&#8217;ll start to get some more specific definitions, which will be much more helpful.</p>
<p>Third, at least one very popular vendor in the NoSQL space has a history of making irresponsible claims about their database&#8217;s capabilities. Antony Falco of Basho (makers of Riak) has a great blog post on the topic: <a href="http://blog.basho.com/2011/05/11/Lies-Damn-Lies-And-NoSQL/">See It&#8217;s Time to Drop the &#8220;F&#8221; Bomb &#8211; or &#8220;Lies, Damn Lies, and NoSQL.&#8221;</a> If you care about your data, please read Tony&#8217;s blog post. It&#8217;s unfortunate that the specious claims of a few end up making everyone in the NoSQL space look bad.</p>
<p>I also want to address some of the specific criticisms that I&#8217;ve heard of NoSQL, as they apply (or don&#8217;t apply) to CouchDB (I&#8217;m not familiar enough with other NoSQL databases to talk about those).</p>
<h3>SQL Databases Are More Mature</h3>
<p>This is absolutely true. If you pick a NoSQL database, you should do your homework and make sure that your database of choice truly respects the fact that writing a reliable database is a very difficult task. Most of the NoSQL databases take the problem very seriously, and try to learn from those that have come before them. But why create a new type of database in the first place? Because an SQL database is not the right solution to every problem. When all you have is a schema, everything looks like a join. The data model in CouchDB (JSON documents) is a great fit for many web applications.</p>
<h3><a href="http://oreilly.com/catalog/9781449303433/"><img class="alignright" title="Scaling CouchDB published by O’Reilly Media" src="http://covers.oreilly.com/images/0636920018407/cat.gif" alt="Scaling CouchDB" width="180" height="236" /></a>SQL Scales Just Fine</h3>
<p>This is also true. If you&#8217;re picking a NoSQL database because it &#8220;scales&#8221;, you&#8217;re likely doing it wrong. Scaling is typically more aspiration than reality. There are many other factors to consider and questions to ask when choosing a database technology other than, &#8220;does it scale?&#8221; <a href="http://www.youtube.com/watch?v=b2F-DItXtZs">If you do actually have to scale, then your database isn&#8217;t going to magically do it for you.</a> You can&#8217;t abstract scaling problems to your database layer. However, I will say that many NoSQL databases have properties (such as eventually consistency) that will make scaling easier and more intuitive. For example, it&#8217;s dead simple to replicate data between CouchDB databases.</p>
<h3 id="acid">Atomicity, Consistency, Isolation, and Durability (ACID)</h3>
<p>CouchDB is ACID compliant. Within a CouchDB server, for a single document update, CouchDB has the properties of atomicity, consistency, isolation, and durability (ACID). No, you can&#8217;t have transactions across document boundaries. No, you can&#8217;t have transactions across multiple servers (although <a href="https://github.com/cloudant/bigcouch">BigCouch</a> does have quorum reads and writes). <a href="http://www.paperplanes.de/2011/1/10/mongodb_and_data_durability.html">Not all NoSQL databases are durable</a> (at least with default settings).</p>
<p>If you want the best possible guarantee of durability, you can change CouchDB&#8217;s <code>delayed_commits</code> configuration option from <code>true</code> (the default) to <code>false</code>. Basically, this will cause CouchDB to do an explicit <code>fsync</code> after each operation (which is very expensive and slow). Note that operating systems, virtual machines, and hard drives often lie about <code>fsync</code>, so you really need to research more about how your particular system works if you&#8217;re concerned about durability. If you think your write speeds are too good to be true, they probably are.</p>
<p>If you leave delayed commits on, CouchDB has the option of setting a <code>batch=ok</code> parameter when creating or updating a document. This will queue up batches of documents in memory and write them to disk when a predetermined threshold has been reached (or when triggered by the user). In this case, CouchDB will respond with an HTTP response code of <code>202 Accepted</code>, rather than the normal <code>201 Created</code>, so that the client is informed about the reduced integrity guarantee.</p>
<h3>Consistency Checks</h3>
<p>At least one NoSQL database requires a consistency check after a crash (guess which one). This can be a very slow process, causing additional downtime. CouchDB&#8217;s crash-only design and append-only files means that there is no need for consistency checks. There&#8217;s no shut down process in CouchDB—shutting it down is the same as killing the process.</p>
<h3>Compaction</h3>
<p>CouchDB&#8217;s append-only files do come at a cost. That cost is disk space and the need for compaction. If you don&#8217;t compact your database, it will eventually fill up your hard drive. There is no automatic compaction in CouchDB. Compaction is triggered manually (it can easily be automated through a cron job) and should be done when the database&#8217;s write load is not at full capacity.</p>
<h3><a href="http://oreilly.com/catalog/9781449303129/"><img class="alignright" title="Writing and Querying MapReduce Views in CouchDB published by O’Reilly Media" src="http://covers.oreilly.com/images/0636920018247/cat.gif" alt="Writing and Querying MapReduce Views in CouchDB" width="180" height="236" /></a>MapReduce is Limiting and Hard to Understand</h3>
<p>It can take some time to get up to speed with MapReduce views in CouchDB. However, it&#8217;s not a very difficult concept to understand and most developers are already proficient with JavaScript (the default language for Map and Reduce functions in CouchDB). There&#8217;s a lot you can do with MapReduce, but there are some limitations. Views are one dimensional so full text indexing and geospatial data are difficult (if not impossible) to index. However, there are plugins for integrating with <a href="https://github.com/rnewson/couchdb-lucene">Lucene</a> and <a href="http://www.elasticsearch.org/tutorials/2010/08/01/couchb-integration.html">ElasticSearch</a>. For geospatial data, you can use <a href="https://github.com/couchbase/geocouch">GeoCouch</a>.</p>
<h3>No Ad Hoc Queries</h3>
<p>This is a feature, not a bug. CouchDB <em>only</em> lets you query against indexes. This means that queries in CouchDB will be extremely fast, even on huge data sets. Most web applications have predefined usage patterns and don&#8217;t need ad hoc queries. If you need ad hoc queries, say for business intelligence reporting, you can replicate your data (using CouchDB&#8217;s changes feed) to an SQL database.</p>
<h3>Building Indexes is Slow</h3>
<p>If you have a large number of documents in CouchDB, the first build of an index will be very slow. However, each query after that will be very fast. CouchDB&#8217;s MapReduce is incremental, meaning new or updated documents can be processed without needing to rebuild the entire index. In most scenarios, this means that there will be a small performance hit to process documents that are new or updated since the last time the view was queried. You can optionally include the <code>stale=ok</code> parameter with your query. This will instruct CouchDB to not bother processing new or updated documents and just give you a stale result set (which will be faster than processing new or updated documents). As of CouchDB 1.1, you can include a <code>stale=update_after</code> parameter with your query. This will return a stale result set, but will trigger an update of the index (if necessary) after your query results are returned, bringing the index up-to-date for future queries by you or other clients.</p>
<h3>No Schema</h3>
<p>Some say that not having a schema is a problem. Sure—if you have structured data, you probably want to enforce a schema. However, not all applications have highly structured data. Many web applications work with unstructured data. If you&#8217;ve encountered any of the following, you may want to consider a schema-free database:</p>
<ul>
<li>You&#8217;ve found yourself denormalizing your database to optimize read performance.</li>
<li>You have rows with lots of <code>NULL</code> values because many columns only apply to a subset of your rows.</li>
<li>You find yourself using <a href="http://pragprog.com/book/bksqla/sql-antipatterns">SQL antipatterns</a> such as entity-attribute-value (EAV), but can&#8217;t find any good alternatives that fit with both your domain and SQL.</li>
<li>You&#8217;re experiencing problems related to the <a href="http://c2.com/cgi/wiki?ObjectRelationalImpedanceMismatch">object-relational impedance mismatch</a>. This is typically associated with use of an object-relational mapper (ORM), but can happen when using other data access patterns as well.</li>
</ul>
<p>I&#8217;ll add that you can enforce schemas in CouchDB through the use of <a href="http://wiki.apache.org/couchdb/Document_Update_Validation">document update validation functions</a>.</p>
<h3>Anything Else?</h3>
<p>Did I miss anything? What other criticisms exist of NoSQL databases? Please comment and I&#8217;ll do my best to address each.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/07/addressing-the-nosql-criticism/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>CouchApps at OSCON 2011</title>
		<link>http://bradley-holt.com/2011/07/couchapps-at-oscon-2011/</link>
		<comments>http://bradley-holt.com/2011/07/couchapps-at-oscon-2011/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 23:30:23 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchApp]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[OSCON]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1202</guid>
		<description><![CDATA[Here are the slides from today&#8217;s OSCON presentation on CouchApps with CouchDB, JavaScript &#38; HTML5: OSCON 2011 CouchApps View more presentations from Bradley Holt Related links: CouchDB jQuery Plugin Reference Same-Origin Policy &#8220;Ground Computing&#8221; HTML5 Web Storage Mustache Evently Evented Programming With jQuery couchapp command line tool (Python) Pathbinder node.couchapp.js Quick Intro to node.couchapp.js Interactive [...]]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from today&#8217;s OSCON presentation on <a href="http://www.oscon.com/oscon2011/public/schedule/detail/18958">CouchApps with CouchDB, JavaScript &amp; HTML5</a>:</p>
<div id="__ss_8668164" style="width: 510px;"><strong style="display: block; margin: 12px 0 4px;"><a title="OSCON 2011 CouchApps" href="http://www.slideshare.net/bradley.holt/oscon-2011-couchapps" target="_blank">OSCON 2011 CouchApps</a></strong> <object id="__sse8668164" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="510" height="426" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=oscon-2011-couchapps-110722224335-phpapp01&amp;stripped_title=oscon-2011-couchapps&amp;userName=bradley.holt" /><param name="name" value="__sse8668164" /><param name="allowfullscreen" value="true" /><embed id="__sse8668164" type="application/x-shockwave-flash" width="510" height="426" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=oscon-2011-couchapps-110722224335-phpapp01&amp;stripped_title=oscon-2011-couchapps&amp;userName=bradley.holt" name="__sse8668164" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a></div>
</div>
<p>Related links:</p>
<ul>
<li><a href="../2011/07/couchdb-jquery-plugin-reference/">CouchDB jQuery Plugin Reference</a></li>
<li><a href="http://www.w3.org/Security/wiki/Same_Origin_Policy">Same-Origin Policy</a></li>
<li><a href="http://googlecode.blogspot.com/2009/09/chris-anderson-couchdb-relaxing-offline.html">&#8220;Ground Computing&#8221;</a></li>
<li><a href="http://dev.w3.org/html5/webstorage/">HTML5 Web Storage</a></li>
<li><a href="http://mustache.github.com/">Mustache</a></li>
<li><a href="http://couchapp.org/page/evently">Evently</a></li>
<li><a href="http://yehudakatz.com/2009/04/20/evented-programming-with-jquery/">Evented Programming With jQuery</a></li>
<li><a href="http://couchapp.org/page/couchapp-python">couchapp command line tool (Python)</a></li>
<li><a href="http://couchapp.couchone.com/docs/_design/docs/index.html#/topic/pathbinder">Pathbinder</a></li>
<li><a href="https://github.com/mikeal/node.couchapp.js">node.couchapp.js</a>
<ul>
<li><a href="http://japhr.blogspot.com/2010/04/quick-intro-to-nodecouchappjs.html">Quick Intro to node.couchapp.js </a></li>
<li><a href="http://vimeo.com/26147136">Interactive HTML5 CouchApps using node.couchapp.js</a></li>
</ul>
</li>
<li><a href="http://kansojs.org/">Kanso Framework</a></li>
<li><a href="https://github.com/quirkey/soca">Sammy On Couch App</a></li>
<li><a href="http://reupholster.iriscouch.com/reupholster/_design/app/index.html">Reupholster</a></li>
<li><a href="http://couchapp.org/page/list-of-couchapps">List of CouchApps</a></li>
<li><a href="http://www.iriscouch.com/">Iris Couch</a> (hosting)</li>
<li><a href="https://cloudant.com/">Cloudant</a> (hosting)</li>
<li>CouchDB &amp; CouchApp Resources
<ul>
<li><a href="http://couchapp.org/">CouchApp Wiki</a></li>
</ul>
<ul>
<li><a href="http://wiki.apache.org/couchdb/">CouchDB Wiki</a></li>
<li><a href="http://oreilly.com/catalog/9780596155896/">CouchDB: The Definitive Guide</a></li>
<li><a href="http://oreilly.com/catalog/9781449303129/">Writing and Querying MapReduce Views in CouchDB</a></li>
<li><a href="http://oreilly.com/catalog/9781449303433/">Scaling CouchDB</a></li>
<li><a href="http://www.apress.com/9781430272373">Beginning CouchDB</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/07/couchapps-at-oscon-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learning CouchDB at OSCON 2011</title>
		<link>http://bradley-holt.com/2011/07/learning-couchdb-at-oscon-2011/</link>
		<comments>http://bradley-holt.com/2011/07/learning-couchdb-at-oscon-2011/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 17:25:08 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[OSCON]]></category>
		<category><![CDATA[OSCON Data]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1189</guid>
		<description><![CDATA[Here are the slides from today&#8217;s OSCON Data workshop on Learning CouchDB: OSCON 2011 Learning CouchDB View more presentations from Bradley Holt Related links: Installing CouchDB Download Couchbase Windows binary installer Other Alternatives to SQL MongoDB Redis Cassandra Riak HBase Libraries JavaScript CouchDB jQuery Plugin Reference jqCouch Perl CouchDB-Client POE-Component-Client-CouchDB CouchDB-View CouchDB-Deploy PHP Sag PHPCouch [...]]]></description>
			<content:encoded><![CDATA[<p>Here are the slides from today&#8217;s OSCON Data workshop on <a href="http://www.oscon.com/oscon2011/public/schedule/detail/18964">Learning CouchDB</a>:</p>
<div id="__ss_8668156" style="width: 510px;"><strong style="display: block; margin: 12px 0 4px;"><a title="OSCON 2011 Learning CouchDB" href="http://www.slideshare.net/bradley.holt/oscon-2011-learning-couchdb" target="_blank">OSCON 2011 Learning CouchDB</a></strong> <object id="__sse8668156" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="510" height="426" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=oscon-2011-couchdb-110722223945-phpapp02&amp;stripped_title=oscon-2011-learning-couchdb&amp;userName=bradley.holt" /><param name="name" value="__sse8668156" /><param name="allowfullscreen" value="true" /><embed id="__sse8668156" type="application/x-shockwave-flash" width="510" height="426" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=oscon-2011-couchdb-110722223945-phpapp02&amp;stripped_title=oscon-2011-learning-couchdb&amp;userName=bradley.holt" name="__sse8668156" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/bradley.holt" target="_blank">Bradley Holt</a></div>
</div>
<p>Related links:</p>
<ul>
<li>Installing CouchDB
<ul>
<li><a href="http://info.couchbase.com/couchbaseEEdownload.html">Download Couchbase</a></li>
<li><a href="http://wiki.apache.org/couchdb/Windows_binary_installer">Windows binary installer</a></li>
</ul>
</li>
<li>Other Alternatives to SQL
<ul>
<li><a href="http://www.mongodb.org/">MongoDB</a></li>
<li><a href="http://redis.io/">Redis</a></li>
<li><a href="http://cassandra.apache.org/">Cassandra</a></li>
<li><a href="http://www.basho.com/">Riak</a></li>
<li><a href="http://hbase.apache.org/">HBase</a></li>
</ul>
</li>
<li>Libraries
<ul>
<li>JavaScript
<ul>
<li><a href="http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/">CouchDB jQuery Plugin Reference</a></li>
<li><a href="http://plugins.jquery.com/project/jqcouch">jqCouch</a></li>
</ul>
</li>
<li>Perl
<ul>
<li><a href="http://search.cpan.org/dist/CouchDB-Client/">CouchDB-Client</a></li>
<li><a href="http://search.cpan.org/dist/POE-Component-Client-CouchDB/">POE-Component-Client-CouchDB</a></li>
<li><a href="http://search.cpan.org/dist/CouchDB-View/">CouchDB-View</a></li>
<li><a href="http://search.cpan.org/dist/CouchDB-Deploy/">CouchDB-Deploy</a></li>
</ul>
</li>
<li>PHP
<ul>
<li><a href="http://www.saggingcouch.com/">Sag</a></li>
<li><a href="http://www.phpcouch.org/">PHPCouch</a></li>
<li><a href="http://arbitracker.org/phpillow.html">PHPillow</a></li>
<li><a href="http://www.topdog.za.net/php_couchdb_extension">PHP CouchDB Extension (PECL)</a></li>
</ul>
</li>
<li>Python
<ul>
<li><a href="http://code.google.com/p/couchdb-python/">CouchDB Python Library</a></li>
<li><a href="http://couchdbkit.org/">CouchDBKit</a></li>
<li><a href="https://launchpad.net/paisley/">Paisley: CouchDB client for Twisted</a></li>
</ul>
</li>
<li>Ruby
<ul>
<li><a href="https://github.com/couchrest/couchrest">CouchREST</a></li>
<li><a href="https://github.com/couchrest/couchrest_model">CouchREST Model</a></li>
<li><a href="https://github.com/langalex/couch_potato">Couch Potato</a></li>
<li><a href="https://github.com/georgepalmer/couch_foo">CouchFoo</a></li>
<li><a href="http://couchobject.rubyforge.org/">CouchObject</a></li>
</ul>
</li>
<li>Java
<ul>
<li><a href="http://code.google.com/p/ektorp/">Ektorp</a></li>
<li><a href="https://github.com/mbreese/couchdb4j ">CouchDB4J</a></li>
</ul>
</li>
<li>.NET
<ul>
<li><a href="https://github.com/hhariri/EasyCouchDB">EasyCouchDB</a></li>
<li><a href="https://github.com/arobson/Relax/">Relax</a></li>
<li><a href="https://github.com/foretagsplatsen/Divan">Divan (C#)</a></li>
<li><a href="https://github.com/kolosy/FunctionalDivan">FunctionalDivan (F#)</a></li>
<li><a href="https://github.com/sinesignal/ottoman">Ottoman</a></li>
<li><a href="http://code.google.com/p/couchbrowse/">SharpCouch</a></li>
</ul>
</li>
<li>Erlang
<ul>
<li><a href="https://github.com/benoitc/couchbeam">Couchbeam—Erlang CouchDB Kit</a></li>
<li><a href="https://github.com/ngerakines/erlang_couchdb/">erlang_couchdb</a></li>
<li><a href="http://code.google.com/p/ecouch/">eCouch</a></li>
</ul>
</li>
<li>Scala
<ul>
<li><a href="https://github.com/debasishg/scouchdb">SCouchDB</a></li>
</ul>
</li>
<li>Lisp
<ul>
<li><a href="https://github.com/sykopomp/chillax">Chillax</a></li>
<li><a href="http://common-lisp.net/project/clouchdb/">ClouchDB</a></li>
</ul>
</li>
</ul>
</li>
<li>Replication Party!
<ul>
<li><a href="https://oscon-tutorial.iriscouch.com/cards">https://oscon-tutorial.iriscouch.com/cards</a></li>
</ul>
</li>
<li>MapReduce Views
<ul>
<li><a href="https://oscon-tutorial.iriscouch.com/books">https://oscon-tutorial.iriscouch.com/books</a></li>
<li><a href="https://github.com/rnewson/couchdb-lucene">couchdb-lucene</a></li>
<li><a href="https://github.com/elasticsearch/elasticsearch/wiki/Couchdb-integrationGeospatial">ElasticSearch and CouchDB</a></li>
<li><a href="https://github.com/couchbase/geocouch">GeoCouch</a></li>
<li><a href="http://geohash.org/">Geohash</a></li>
</ul>
</li>
<li>Scaling
<ul>
<li><a href="https://github.com/cloudant/bigcouch">BigCouch</a></li>
<li><a href="http://tilgovi.github.com/couchdb-lounge/">Lounge</a></li>
<li><a href="https://github.com/khellan/Pillow">Pillow</a></li>
</ul>
</li>
<li><a href="http://www.couchbase.com/products-and-services/mobile-couchbase">Mobile Couchbase for Android &amp; iOS</a></li>
<li>Hosting
<ul>
<li><a href="http://www.iriscouch.com/">Iris Couch</a></li>
<li><a href="https://cloudant.com/">Cloudant</a></li>
</ul>
</li>
<li>CouchDB Resources
<ul>
<li><a href="http://oreilly.com/catalog/9780596155896/">CouchDB: The Definitive Guide</a></li>
<li><a href="http://oreilly.com/catalog/9781449303129/">Writing and Querying MapReduce Views in CouchDB</a></li>
<li><a href="http://oreilly.com/catalog/9781449303433/">Scaling CouchDB</a></li>
<li><a href="http://wiki.apache.org/couchdb/">CouchDB Wiki</a></li>
<li><a href="http://www.apress.com/9781430272373">Beginning CouchDB</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/07/learning-couchdb-at-oscon-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

