<?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; jQuery</title>
	<atom:link href="http://bradley-holt.com/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://bradley-holt.com</link>
	<description></description>
	<lastBuildDate>Thu, 17 May 2012 01:04:35 +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>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 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>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>CouchDB jQuery Plugin Reference</title>
		<link>http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/</link>
		<comments>http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 22:18:46 +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[HTTP]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/?p=1143</guid>
		<description><![CDATA[I&#8217;ve had a difficult time finding documentation on the CouchDB jQuery plugin that ships with CouchDB. So, I&#8217;ve decided to create my own reference and share it with you. This should cover almost the entire CouchDB API that is available through the version of the plugin that ships with CouchDB 1.1.0. Setup The same-origin policy [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a difficult time finding documentation on the <a href="https://github.com/apache/couchdb/blob/trunk/share/www/script/jquery.couch.js">CouchDB jQuery plugin</a> that ships with CouchDB. So, I&#8217;ve decided to create my own reference and share it with you. This should cover almost the entire CouchDB API that is available through the version of the plugin that ships with CouchDB 1.1.0.</p>
<h3>Setup</h3>
<p>The <a href="http://www.w3.org/Security/wiki/Same_Origin_Policy">same-origin policy</a> effectively requires that the HTML from which the JavaScript is loaded must be served up from CouchDB (you could instead use a reverse proxy server). This can be done by attaching an HTML document to a CouchDB document. You can do this manually, or through the use of <a href="http://couchapp.org/">CouchApps</a>.</p>
<p>CouchDB ships with several useful JavaScript libraries, including jQuery. Here is an example of an HTML document that takes advantage of CouchDB&#8217;s included JavaScript libraries:</p>
<pre><code class="html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;CouchDB jQuery Examples&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
    &lt;script src="/_utils/script/json2.js"&gt;&lt;/script&gt;
    &lt;script src="/_utils/script/sha1.js"&gt;&lt;/script&gt;
    &lt;script src="/_utils/script/jquery.js?1.4.2"&gt;&lt;/script&gt;
    &lt;script src="/_utils/script/jquery.couch.js?0.11.0"&gt;&lt;/script&gt;
    &lt;script src="/_utils/script/jquery.dialog.js?0.11.0"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>By default, CouchDB will use an empty string as its URL prefix. However, you can configure this before your first API call. For example:</p>
<pre><code class="javascript">$.couch.urlPrefix = "http://localhost:5984";</code></pre>
<p>You will typically not want to change this value since the same-origin policy prevents you from accessing CouchDB databases hosted at a different origin.</p>
<h3>Server API</h3>
<h4>Server Information</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.info({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/ <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "couchdb"="Welcome",
    "version"="1.1.0"
}</code></pre>
<h4>All DBs</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.allDbs({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/_all_dbs <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">[
    "_replicator",
    "_users"
]</code></pre>
<h4>User Signup</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var userDoc = {
    _id: "org.couchdb.user:bob",
    name: "bob"
};
$.couch.signup(userDoc, "supersecurepassword", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>PUT</strong> http://localhost:5984/_users/org.couchdb.user%3Abob <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok"=true,
    "id"="org.couchdb.user:bob",
    "rev"="1-230dc0625bd3c4aac735846cc152c296"
}</code></pre>
<h4>Login</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.login({
    name: "bob",
    password: "supersecurepassword",
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST</strong> http://localhost:5984/_session <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true,
    "name":"bob",
    "roles":[]
}</code></pre>
<p>This will result in an <code>AuthSession</code> cookie being set and then sent back to the server on subsequent requests, authenticating the user on each request. The session length is 10 minutes by default, but can be set in CouchDB&#8217;s <code>couch_httpd_auth.timeout</code> configuration option.</p>
<h4>Session</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.session({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/_session <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true,
    "userCtx":{
        "name":"bob",
         "roles":[]
    },
    "info":{
        "authentication_db":"_users",
        "authentication_handlers":[
            "oauth",
            "cookie",
            "default"
        ],
        "authenticated":"cookie"
    }
}</code></pre>
<h4>Logout</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.logout({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>DELETE</strong> http://_:_@localhost:5984/_session <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true
}</code></pre>
<p>This will set the <code>AuthSession</code> cookie to an empty string, effectively logging the client out.</p>
<h4>Active Tasks</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.activeTasks({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/_active_tasks <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">[]</code></pre>
<h4>Server Configuration</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.config({
    success: function(data) {
        console.log(data);
    }
}, "uuids", "algorithm");</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/_config/uuids/algorithm <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">"sequential"</code></pre>
<p>The second and third parameters are the <code>section</code> and <code>option</code> parameters, respectively. Omit the <code>option</code> parameter if you&#8217;d like to retrieve the entire section. Omit both the <code>section</code> and <code>option</code> parameters if you&#8217;d like to see the entire server configuration. Add an optional fourth parameter to set the configuration option&#8217;s value, which will result in a <code>PUT</code> request with the value.</p>
<h4>User DB</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.userDb(function(data) {
    console.log(data);
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/_session <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "name"="_users",
    "uri"="../_users/"
}</code></pre>
<p>The URI will be relative to the HTML executing the script.</p>
<h4>New UUID</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var uuid = $.couch.newUUID();
console.log(uuid);</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/_uuids?count=1 <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">d12ee5ea1df6baa2b06451f44a0156fa</code></pre>
<p>This function takes a <code>count</code> parameter as an optional first parameter. If the <code>count</code> parameter is greater than one, then it will keep a cache of UUIDs that will be returned on subsequent calls, rather than making another request to the server.</p>
<h4>Replicate</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.replicate("mydb", "otherdb", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
}, {
    create_target: true
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST</strong> http://localhost:5984/_replicate <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true,
    "session_id":"705797bae87456c52f5b76f44fe5f245",
    "source_last_seq":27,
    "replication_id_version":2,
    "history":[
        {
            "session_id":"705797bae87456c52f5b76f44fe5f245",
            "start_time":"Wed, 13 Jul 2011 22:40:09 GMT",
            "end_time":"Wed, 13 Jul 2011 22:40:09 GMT",
            "start_last_seq":0,
            "end_last_seq":27,
            "recorded_seq":27,
            "missing_checked":0,
            "missing_found":14,
            "docs_read":14,
            "docs_written":14,
            "doc_write_failures":0
        }
    ]
}</code></pre>
<h3>Database API</h3>
<h4>Create Database</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").create({
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>PUT</strong> http://localhost:5984/mydb/ <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true
}</code></pre>
<h4>Database Info</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").info({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/mydb/ <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "db_name":"mydb",
    "doc_count":0,
    "doc_del_count":0,
    "update_seq":0,
    "purge_seq":0,
    "compact_running":false,
    "disk_size":79,
    "instance_start_time":"1310597000825187",
    "disk_format_version":5,
    "committed_update_seq":0
}</code></pre>
<h4>Save New Document</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var doc = {};
$.couch.db("mydb").saveDoc(doc, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST</strong> http://localhost:5984/mydb/ <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true,
    "id":"d12ee5ea1df6baa2b06451f44a019ab9",
    "rev":"1-967a00dff5e02add41819138abb3284d"
}</code></pre>
<h4>Open Document</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").openDoc("d12ee5ea1df6baa2b06451f44a019ab9", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET</strong> http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a019ab9 <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "_id":"d12ee5ea1df6baa2b06451f44a019ab9",
    "_rev":"1-967a00dff5e02add41819138abb3284d"
}</code></pre>
<p>Note that the HTTP response includes an <code>Etag</code> HTTP header. If you do a subsequent request for the same document, and your client supports caching and conditional HTTP requests, then an <code>If-None-Match</code> header should be sent using the value from the previous response&#8217;s <code>Etag</code> header. If the document has not been modified, then CouchDB will send a <code>304 Not Modified</code> response and no response body, saving bandwidth and speeding up the response.</p>
<h4>Save Updated Document</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var doc = {
    _id: "d12ee5ea1df6baa2b06451f44a019ab9",
    _rev: "1-967a00dff5e02add41819138abb3284d",
    foo: "bar"
};
$.couch.db("mydb").saveDoc(doc, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>PUT </strong>http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a019ab9 <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true,
    "id":"d12ee5ea1df6baa2b06451f44a019ab9",
    "rev":"2-13839535feb250d3d8290998b8af17c3"
}</code></pre>
<h4>Remove Document</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var doc = {
    _id: "d12ee5ea1df6baa2b06451f44a019ab9",
    _rev: "2-13839535feb250d3d8290998b8af17c3"
};
$.couch.db("mydb").removeDoc(doc, {
     success: function(data) {
         console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>DELETE </strong>http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a019ab9?rev=2-13839535… <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "id":d12ee5ea1df6baa2b06451f44a019ab9
    "ok":true,
    "rev":"3-1f04f977685e1108b4664f70b09c6f65"
}</code></pre>
<h4>Bulk Save</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").bulkSave({"docs": [{}, {}]}, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST </strong>http://localhost:5984/mydb/_bulk_docs?successStatus=201 <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">[
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a0d8",
        "rev":"1-967a00dff5e02add41819138abb3284d"
    },
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a75a",
        "rev":"1-967a00dff5e02add41819138abb3284d"
    }
]</code></pre>
<h4>Bulk Remove</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var docs = [
    {
        _id: "d12ee5ea1df6baa2b06451f44a01a0d8",
        _rev: "1-967a00dff5e02add41819138abb3284d"
    },
    {
        _id: "d12ee5ea1df6baa2b06451f44a01a75a",
        _rev: "1-967a00dff5e02add41819138abb3284d"
    }
];
$.couch.db("mydb").bulkRemove({"docs": docs}, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST </strong>http://localhost:5984/mydb/_bulk_docs?successStatus=201 <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">[
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a0d8",
        "rev":"2-eec205a9d413992850a6e32678485900"
    },
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a75a",
        "rev":"2-eec205a9d413992850a6e32678485900"
    }
]</code></pre>
<p>This operates almost exactly like the bulk save, but instead sets the <code>deleted</code> flag to <code>true</code> on the documents.</p>
<h4>All Documents</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").allDocs({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/mydb/_all_docs <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "total_rows":11,
    "offset":0,
    "rows":[
        {
            "id":"_design/default",
            "key":"_design/default",
            "value":{
                "rev":"9-5212dde9da06f1933dbe29811fc380d4"
            }
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a002cef",
            "key":"d12ee5ea1df6baa2b06451f44a002cef",
            "value":{
                "rev":"1-967a00dff5e02add41819138abb3284d"
            }
        },
        …
    ]
}</code></pre>
<h4>All Design Documents</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").allDesignDocs({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET </strong>
http://localhost:5984/mydb/_all_docs?startkey=%22_design%22&amp;endkey=%22_design0%22 <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "total_rows":11,
    "offset":0,
    "rows":[
        {
            "id":"_design/default",
            "key":"_design/default",
            "value":{
                "rev":"9-5212dde9da06f1933dbe29811fc380d4"
            }
        }
    ]
}</code></pre>
<h4>All Apps</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("tutorial").allApps({
    success: function(data) {
        console.log(data);
    },
    eachApp: function(appName, appPath, ddoc) {
        console.log(appName);
        console.log(appPath);
        console.log(ddoc);
    }
});</code></pre>
<p>Resulting HTTP requests:</p>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/tutorial/_all_docs?startkey=%22_design%22&amp;endkey=%22_design0%22 <strong>200 OK</strong></code></pre>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/tutorial/_design/tutorial <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">tutorial</code></pre>
<pre><code class="javascript">/tutorial/_design/tutorial/index.html</code></pre>
<pre><code class="javascript">{
    "_id":"_design/tutorial",
    "_rev":"5-276897ecff6dc272c0b9143aa23e8a2e",
    …
}</code></pre>
<p>This is intended as a convenience to find metadata about CouchApps.</p>
<h4>Query</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">var mapFunction = function(doc) {
    emit();
};
$.couch.db("mydb").query(mapFunction, "_count", "javascript", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    },
    reduce: false
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST </strong>http://localhost:5984/mydb/_temp_view?reduce=false <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "total_rows":10,
    "offset":0,
    "rows":[
        {
            "id":"d12ee5ea1df6baa2b06451f44a002cef",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a0037b5",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a003b06",
            "key":null,
            "value":null
        },
        …
    ]
}</code></pre>
<p>This creates a temporary view as defined by your map and reduce functions. Temporary views are useful in development, but should be replaced with views permanently saved to design documents for production. Temporary views are slow, especially with a large number of documents.</p>
<h4>View</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").view("default/all", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    },
    reduce: false
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/mydb/_design/default/_view/all?reduce=false <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "total_rows":10,
    "offset":0,
    "rows":[
        {
            "id":"d12ee5ea1df6baa2b06451f44a002cef",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a0037b5",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a003b06",
            "key":null,
            "value":null
        },
        …
    ]
}</code></pre>
<h4>List</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").list("default/all", "all", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    },
    reduce: false
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/mydb/_design/default/_list/all/all?reduce=false <strong>200 OK</strong></code></pre>
<p>The console output will depend on your list&#8217;s behavior.</p>
<h4>Compact</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").compact({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST </strong>http://localhost:5984/mydb/_compact <strong>202 Accepted</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true
}</code></pre>
<h4>View Cleanup</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").viewCleanup({
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST </strong>http://localhost:5984/mydb/_view_cleanup <strong>202 Accepted</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true
}</code></pre>
<h4>Compact View</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").compactView("default", {
    success: function(data) {
        console.log(data);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>POST </strong>http://localhost:5984/mydb/_compact/default <strong>202 Accepted</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true
}</code></pre>
<h4>Changes</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").changes().onChange(function(data) {
    console.log(data);
});</code></pre>
<p>Resulting HTTP requests:</p>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/mydb/ <strong>200 OK</strong></code></pre>
<pre><code class="no-highlight"><strong>GET </strong>http://localhost:5984/mydb/_changes?heartbeat=10000&amp;feed=longpoll&amp;since=34 <strong>200 OK</strong></code></pre>
<p>This will keep a connection open until changes are detected, and then open up another connection to listen for subsequent changes starting from the next sequence.</p>
<p>Console output when a new document is created:</p>
<pre><code class="javascript">{
    "results":[
        {
            "seq":35,
            "id":"d12ee5ea1df6baa2b06451f44a01b7b5",
            "changes":[
                {
                    "rev":"1-967a00dff5e02add41819138abb3284d"
                }
            ]
        }
    ],
    "last_seq":35
}</code></pre>
<p>This is very powerful feature. It allows you to listen for any changes to documents in the database and immediately respond to those changes.</p>
<h4>Copy Document</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").copyDoc("d12ee5ea1df6baa2b06451f44a01b7b5", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
}, {
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Destination", "aNewDocId");
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>COPY </strong>http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a01b7b5 <strong>201 Created</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "id":"aNewDocId",
    "rev":"1-967a00dff5e02add41819138abb3284d"
}</code></pre>
<h4>Drop Database</h4>
<p>JavaScript example:</p>
<pre><code class="javascript">$.couch.db("mydb").drop({
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});</code></pre>
<p>Resulting HTTP request:</p>
<pre><code class="no-highlight"><strong>DELETE </strong>http://localhost:5984/mydb/ <strong>200 OK</strong></code></pre>
<p>Console output:</p>
<pre><code class="javascript">{
    "ok":true
}</code></pre>
<p><a href="https://en.oreilly.com/oscon2011/public/regwith/os11rad"><img class="alignleft" style="border: 0pt none;" title="O'Reilly OSCON" src="http://radar.oreilly.com/oscon-code-os11rad.png" border="0" alt="O'Reilly OSCON" width="148" height="160" /></a>I&#8217;ll be <a href="http://www.oscon.com/oscon2011/public/schedule/detail/18958">giving a presentation on CouchApps at OSCON</a> if you want to learn more about building CouchApps. This presentation will be a part of the <a href="http://www.oscon.com/oscon2011/public/schedule/topic/Javascript+&amp;+HTML5">JavaScript and HTML5 track</a>. You can <a href="https://en.oreilly.com/oscon2011/public/regwith/os11rad">save 20% on registration with the code OS11RAD</a>. I&#8217;ll also be presenting a <a href="http://www.oscon.com/oscon2011/public/schedule/detail/18964">tutorial on Learning CouchDB at OSCON Data</a>.</p>
<p>You can also check out my books <a href="http://oreilly.com/catalog/9781449303129/">Writing and Querying MapReduce Views in CouchDB</a> and <a href="http://oreilly.com/catalog/9781449303433/">Scaling CouchDB</a> if you&#8217;re interested in learning more about CouchDB in general.</p>
<p><em>Update (7/15/2011)</em>: <a href="http://www.maxogden.com/">Max Ogden</a> has pointed me to <a href="http://arandomurl.com/">Dale Harvey</a>&#8216;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 <a href="https://github.com/maxogden/removalist/blob/master/attachments/script/jquery.couch2.js">jquery.couch2.js</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Tagnabit Launched!</title>
		<link>http://bradley-holt.com/2009/06/tagnabit-launched/</link>
		<comments>http://bradley-holt.com/2009/06/tagnabit-launched/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 16:37:00 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[acmne09]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Folksonomy]]></category>
		<category><![CDATA[Found Line]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[tagnabit]]></category>
		<category><![CDATA[tmdvt09]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/2009/06/tagnabit-launched/</guid>
		<description><![CDATA[Last night we announced the launch of tagnabit, a social media aggregator. It&#8217;s &#8220;a service that aggregates tags from popular social media websites. It is useful for conferences or other events. Participants can use a shared tag across Twitter, Flickr, Technorati, YouTube and Delicious. Tagnabit then aggregates this content in one place.&#8221; The idea originally [...]]]></description>
			<content:encoded><![CDATA[<p>Last night we <a href="http://twitter.com/BradleyHolt/status/1986607969">announced</a> the launch of <a href="http://tagnabit.net/">tagnabit, a social media aggregator</a>. It&#8217;s &#8220;a service that aggregates tags from popular social media websites. It is useful for conferences or other events. Participants can use a shared tag across Twitter, Flickr, Technorati, YouTube and Delicious. Tagnabit then aggregates this content in one place.&#8221; The idea originally started with <a href="http://bradley-holt.com/2009/03/tmd-vt-social-media-recap/">Town Meeting Day Vermont </a>and then was used for the <a href="http://bradley-holt.com/2009/05/acm-ne-conference/">Alliance for Community Media Northeast regional conference</a>. People found it useful, so we decided to make a &#8220;generic&#8221; version that basically has the same functionality as these sites, but for any arbitrary tag. Bill Simmon has a few ideas on <a href="http://candleboy.com/2009/06/tagnabit/">how tagnabit can be used</a>.</p>
<p>The functionality behind tagnabit was built using <a href="http://framework.zend.com/">Zend Framework</a> (MVC components, Zend_Feed, Zend_Service_Flickr, and Zend_Cache). The client side is all semantic XHTML (with a few Microformats), CSS, and a few JavaScript enhancements (using jQuery). We&#8217;ve got plans for some new features &#8211; but we&#8217;re curious to see how people use the site first.  If you&#8217;ve got feedback, please send it our way via <a href="http://twitter.com/home?status=%23tagnabit+">Twitter</a>, Flickr, Technorati, YouTube or Delicious by tagging your content with <a href="http://tagnabit.net/tagnabit">tagnabit</a> (#tagnabit on Twitter).</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2009/06/tagnabit-launched/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Browser Correction</title>
		<link>http://bradley-holt.com/2009/02/browser-correction/</link>
		<comments>http://bradley-holt.com/2009/02/browser-correction/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 18:31:00 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[btvphpug]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Open Standards]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Vermont]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/2009/02/browser-correction/</guid>
		<description><![CDATA[On last week&#8217;s The Browser interview (audio) with Jason Pelletier (jason_pelletier) and me, Jonathan Butler (jonathanpb) asked me for an example of a proprietary framework and I used Adobe Flex as an example. It turns out that the Flex SDK is actually not a proprietary framework and is, in fact, open source. I should have [...]]]></description>
			<content:encoded><![CDATA[<p>On last week&#8217;s <a href="http://thebrowser1059.wordpress.com/">The Browser</a> interview (<a href="http://thebrowser1059.podbean.com/2009/02/14/the-browser-episode-2-found-line/">audio</a>)  with Jason Pelletier (<a href="http://twitter.com/jason_pelletier">jason_pelletier</a>) and me, Jonathan Butler (<a href="http://twitter.com/jonathanpb">jonathanpb</a>) asked me for an example of a proprietary framework and I used Adobe Flex as an example. It turns out that the <a href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK">Flex SDK</a> is actually not a proprietary framework and is, in fact, open source. I should have known this since Adobe Flex was the <a href="http://groups.google.com/group/Burlington-VT-PHP/web/meeting-2008-08-28">topic of a whole PHP users group meeting</a> awhile back. <a href="http://johnboone.net/blog/">John Boone</a> (<a href="http://twitter.com/jbgoode12">jbgoode12</a>) pointed this out to me in an interesting conversation he and I (<a href="http://twitter.com/BradleyHolt">BradleyHolt</a>) had on Twitter:</p>
<blockquote><p><a href="http://twitter.com/jbgoode12">jbgoode12</a>: <a href="http://twitter.com/jonathanpb">@jonathanpb</a> <a href="http://twitter.com/BradleyHolt">@BradleyHolt</a> <a href="http://twitter.com/jason_pelletier">@jason_pelletier</a> listening to ep 2 of The Browser &#8211; also very interesting! One correction: the Flex SDK is open src (<a href="http://twitter.com/jbgoode12/statuses/1224208785">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/jbgoode12">jbgoode12</a>: <a href="http://twitter.com/jason_pelletier">@jason_pelletier</a> <a href="http://twitter.com/BradleyHolt">@BradleyHolt</a> <a href="http://twitter.com/jonathanpb">@jonathanpb</a> It&#8217;s true that the Flex IDE costs $$$ but you can create Flash w/open src: <a href="http://opensource.adobe.com/wiki/display/site/Home">http://opensource.adobe.com/wiki/display/site/Home</a> (<a href="http://twitter.com/jbgoode12/statuses/1224217944">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/BradleyHolt">BradleyHolt</a>: <a href="http://twitter.com/jbgoode12">@jbgoode12</a> Good point! I guess I was thinking about Adobe Flex Builder. Didn&#8217;t meant to pick on Adobe, just one example of proprietary SW. (<a href="http://twitter.com/BradleyHolt/statuses/1224228011">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/BradleyHolt">BradleyHolt</a>: <a href="http://twitter.com/jbgoode12">@jbgoode12</a> Oh, and thanks for listening to the show, glad you&#8217;re finding it interesting! (<a href="http://twitter.com/BradleyHolt/statuses/1224234856">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/jbgoode12">jbgoode12</a>: <a href="http://twitter.com/BradleyHolt">@BradleyHolt</a> <a href="http://twitter.com/jason_pelletier">@jason_pelletier</a> It&#8217;s like how Micro$oft does it : they have open SDKs but the IDEs are $. FB is based on Eclipse, tho (<a href="http://twitter.com/jbgoode12/statuses/1224241734">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/BradleyHolt">BradleyHolt</a>: <a href="http://twitter.com/jbgoode12">@jbgoode12</a> Yeah &#8211; technically open source but to do anything practical takes lots of work or spending money to make it easier. (<a href="http://twitter.com/BradleyHolt/statuses/1224250259">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/BradleyHolt">BradleyHolt</a>: <a href="http://twitter.com/jbgoode12">@jbgoode12</a> But you&#8217;re right, the framework itself (Flex SDK) certainly appears to be open source. I stand corrected <img src='http://bradley-holt.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  (<a href="http://twitter.com/BradleyHolt/statuses/1224253814">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/jbgoode12">jbgoode12</a>: <a href="http://twitter.com/BradleyHolt">@BradleyHolt</a> It&#8217;ll be interesting to see if an ecosystem grows around the Flex SDK, like maybe the relationship between .NET and Mono&#8230; (<a href="http://twitter.com/jbgoode12/statuses/1224259843">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/BradleyHolt">BradleyHolt</a>: <a href="http://twitter.com/jbgoode12">@jbgoode12</a> That will be interesting to watch. The Flash Player is still proprietary (although there are some alts) which could be a problem. (<a href="http://twitter.com/BradleyHolt/statuses/1224271760">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/jbgoode12">jbgoode12</a>: <a href="http://twitter.com/BradleyHolt">@BradleyHolt</a> right. and the flash player being proprietary kinda makes the rest moot&#8230; plus you can do a lot with frameworks like jquery. (<a href="http://twitter.com/jbgoode12/statuses/1224282585">view tweet</a>)</p></blockquote>
<blockquote><p><a href="http://twitter.com/BradleyHolt">BradleyHolt</a>: <a href="http://twitter.com/jbgoode12">@jbgoode12</a> I love jQuery! Would be cool (but unlikely) if Adobe truly opened up everything Flash related as open source and open standards. (<a href="http://twitter.com/BradleyHolt/statuses/1224300920">view tweet</a>)</p></blockquote>
<p>I appreciate John&#8217;s correction and love having conversations like the one above. I hope The Browser inspires many more conversations!</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2009/02/browser-correction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VPR Reports Campaign 2008</title>
		<link>http://bradley-holt.com/2008/11/vpr-reports-campaign-2008/</link>
		<comments>http://bradley-holt.com/2008/11/vpr-reports-campaign-2008/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 21:31:00 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Open Standards]]></category>
		<category><![CDATA[Vermont]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/2008/11/vpr-reports-campaign-2008/</guid>
		<description><![CDATA[For coverage of local Vermont and national election news, check out the VPR Reports Campaign 2008 page that we (well, Jason really) put together. The 2008 Election Map is a Flash widget provided by NPR but other than that the page is all XHTML, CSS, and JavaScript (via jQuery and jQuery UI). Check back throughout [...]]]></description>
			<content:encoded><![CDATA[<p>For coverage of local Vermont and national election news, check out the <a href="http://www.vpr.net/news/campaign_2008/index.php">VPR Reports Campaign 2008</a> page that we (well, Jason really) put together. The 2008 Election Map is a Flash widget provided by NPR but other than that the page is all XHTML, CSS, and JavaScript (via jQuery and <a href="http://ui.jquery.com/">jQuery UI</a>). Check back throughout the evening for updated information and listen to live coverage on VPR starting at 7pm tonight!</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2008/11/vpr-reports-campaign-2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VSA Arts of Vermont Website</title>
		<link>http://bradley-holt.com/2008/10/vsa-arts-of-vermont-website/</link>
		<comments>http://bradley-holt.com/2008/10/vsa-arts-of-vermont-website/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 12:02:00 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/2008/10/vsa-arts-of-vermont-website/</guid>
		<description><![CDATA[We recently launched the updated VSA Arts of Vermont website. Since VSA Arts of Vermont&#8217;s mission is to make &#8220;the world of the arts accessible to Vermonters of all abilities&#8221; it was critical that their new website be accessible. This was a challenge we readily accepted as web accessibility is something we take very seriously. [...]]]></description>
			<content:encoded><![CDATA[<p>We recently launched the updated <a href="http://www.vsavt.org/">VSA Arts of Vermont</a> website. Since VSA Arts of Vermont&#8217;s mission is to make &#8220;the world of the arts accessible to Vermonters of all abilities&#8221; it was critical that their new website be accessible. This was a challenge we readily accepted as web accessibility is something we take very seriously.</p>
<p>Web accessibility is fairly straightforward if you take a content-first approach and focus on web standards. The real challenge is doing this <em>and</em> making a great looking website that doesn&#8217;t have to compromise on functionality. We accomplished this by using semantic XHTML that contains enough structure to stand on its own without any visual representation. Then, this content was stylized using CSS. Finally, some behavior was added using unobtrusive JavaScript (using jQuery). This concept is called <a href="http://www.alistapart.com/articles/understandingprogressiveenhancement">progressive enhancement</a>. The final result is a great looking and very functional website that is accessible to all users.</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2008/10/vsa-arts-of-vermont-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Northeast Pools &amp; Spas Website Launch</title>
		<link>http://bradley-holt.com/2008/08/northeast-pools-spas-website-launch/</link>
		<comments>http://bradley-holt.com/2008/08/northeast-pools-spas-website-launch/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 16:27:00 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Found Line]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/2008/08/northeast-pools-spas-website-launch/</guid>
		<description><![CDATA[We just launched the new Northeast Pools &#38; Spas website. I think Dave and Jason did a great job on the visual design and Liz did a fabulous job on organizing and helping to write the content! I worked primarily on the functionality for the construction and portfolio pages. The site is implemented using semantic [...]]]></description>
			<content:encoded><![CDATA[<p>We just launched the new <a href="http://www.northeastpools.net/">Northeast Pools &amp; Spas</a> website. I think Dave and Jason did a great job on the visual design and Liz did a fabulous job on organizing and helping to write the content! I worked primarily on the functionality for the <a href="http://www.northeastpools.net/what-we-do/construction/">construction</a> and <a href="http://www.northeastpools.net/portfolio/">portfolio</a> pages. The site is implemented using semantic XHTML, CSS, <a href="http://jquery.com/">jQuery</a>, and <a href="http://framework.zend.com/">Zend Framework</a>.</p>
<p>The cool thing about the construction and portfolio pages is that they use <a href="http://en.wikipedia.org/wiki/Progressive_enhancement">progressive enhancement</a>. What this means is that users without JavaScript (i.e. search engine robots &amp; screen readers) can navigate the content by fully reloading the page on each click. You can try this out yourself by disabling JavaScript in your browser. For users with JavaScript, each click on &#8220;next&#8221; or &#8220;previous&#8221; (on the construction page) or each portfolio feature (on the portfolio page) will cause their browsers to load the appropriate content dynamically into the right spot on the page without needing a full page reload.</p>
<p>One of the common problems with this type of JavaScript navigation is that you often break the browser&#8217;s back and forward navigation capabilities. Another common problem is that you can&#8217;t bookmark the page or send the link to a friend and have the same content loaded. Because these pages update the browser&#8217;s &#8220;hash&#8221; we get the browser&#8217;s back and forward capabilities as well as bookmarkability. The &#8220;hash&#8221; is the part of the URL that starts with the &#8220;#&#8221; character. For example, assuming you have JavaScript enabled you should be able to navigate right to the waterfall photo using the following link:
</p>
<p><a href="http://www.northeastpools.net/portfolio/#feature/waterfall/">http://www.northeastpools.net/portfolio/#feature/waterfall/</a></p>
<p>Critiques are welcome!</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2008/08/northeast-pools-spas-website-launch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Found Line Website Launched</title>
		<link>http://bradley-holt.com/2008/04/new-found-line-website-launched/</link>
		<comments>http://bradley-holt.com/2008/04/new-found-line-website-launched/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 23:51:00 +0000</pubDate>
		<dc:creator>Bradley Holt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Found Line]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://bradley-holt.com/2008/04/new-found-line-website-launched/</guid>
		<description><![CDATA[I am happy to report that the new Found Line website has launched! This new version includes some much needed content and visual updates and is now running in Zend Framework (although there is very little functionality beyond static content). All of the visual effects use jQuery, there is no Flash to be found on [...]]]></description>
			<content:encoded><![CDATA[<p>I am happy to report that the new <a href="http://www.foundline.com/">Found Line</a> website has launched! This new version includes some much needed content and visual updates and is now running in Zend Framework (although there is very little functionality beyond static content). All of the visual effects use jQuery, there is no Flash to be found on the site, and all behavior should degrade gracefully if JavaScript is not enabled. The site is almost entirely valid XHTML and CSS &#8211; the only exceptions are a couple of visual effects that required a bit of hacking (but we&#8217;re hoping to find a valid XHTML alternative). The site has been checked for cross-browser compatibility in 25+ browser/OS combinations. It has also been tested in a text only browser and should be accessible to screen readers. Please take a look and let me know your thoughts &#8211; good, bad, or indifferent!</p>
]]></content:encoded>
			<wfw:commentRss>http://bradley-holt.com/2008/04/new-found-line-website-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

