SlideShare a Scribd company logo
1 of 112
+

=        CouchApps
       Blog: http://bradley-holt.com
@BradleyHolt (http://twitter.com/BradleyHolt)
        bradley.holt@foundline.com
About Me
(Bradley Holt)
Co-Founder and
Technical Director
from Vermont




     Battery Park - Burlington, Vermont by Marty Desilets, on Flickr
Organizer   BTV
(Minor) Contributor
Author




         http://oreilly.com/catalog/9781449303129/   http://oreilly.com/catalog/9781449303433/
Why CouchDB?
CouchDB is a database,
web server & application server
Bene ts
Schema-less “self-contained” JSON documents—no tables, just documents

RESTful HTTP API is simple to integrate with

Custom-written MapReduce “views” index your data for fast retrieval

Multi-master replication can happen continuously, in any direction, and/or
whenever nodes can connect

Can run on anything from a server to a mobile device (CouchDB can be embedded
in Android and iOS apps)
Trade-Offs
No ad-hoc queries (you can use temporary views, but they’re slow on
large data sets)

Thinking in terms of MapReduce views can take some time to get used to

No transactions across document boundaries

Your data will be “eventually consistent” and con icts can occur (but
can be resolved)
MapReduce Views
Mapping Document Titles
function(doc) { // JSON object representing a doc to be mapped
  if (doc.title) { // make sure this doc has a title
     emit(doc.title); // emit the doc’s title as the key
  }
}
Mapped Document Titles
           key                       id            value

"Building iPhone Apps with
                             "978-0-596-80579-1"   null
HTML, CSS, and JavaScript"

"CouchDB: The Definitive
                             "978-0-596-15589-6"   null
       Guide"

"DocBook: The Definitive
                             "978-1-565-92580-9"   null
       Guide"

 "RESTful Web Services"      "978-0-596-52926-0"   null
Mapping Document Authors
function(doc) { // JSON object representing a doc to be mapped
  if (doc.authors) { // make sure this doc has an authors eld
     for (var i in doc.authors) {
       emit(doc.authors[i]); // emit each author as the key
     }
  }
}
Mapped Authors
        key                    id            value
 "J. Chris Anderson"   "978-0-596-15589-6"   null
   "Jan Lehnardt"      "978-0-596-15589-6"   null
  "Jonathan Stark"     "978-0-596-80579-1"   null
 "Leonard Muellner"    "978-1-565-92580-9"   null
"Leonard Richardson"   "978-0-596-52926-0"   null
   "Noah Slater"       "978-0-596-15589-6"   null
  "Norman Walsh"       "978-1-565-92580-9"   null
    "Sam Ruby"         "978-0-596-52926-0"   null
HTTP API
via the CouchDB jQuery Plugin
http://localhost:5984/_utils/script/jquery.couch.js
The same-origin policy dictates that your HTML
and AJAX data (JSON) must be retrieved from
the same origin.
Create Database
$.couch.db("mydb").create({
   success: function(data) {
     console.log(data);
   }
});

PUT http://localhost:5984/mydb   201 Created

{"ok":true}
Save New Document
$.couch.db("mydb").saveDoc({}, {
   success: function(data) {
     console.log(data);
   }
});

POST http://localhost:5984/mydb    201 Created

{
    "ok":true,
    "id":"e15d848571c8a0352e94738ba6018790",
    "rev":"1-967a00dff5e02add41819138abb3284d"
}
Save Updated Document
var doc = {
   _id: "0a72c9c36bd169818dc97ed18b000aa4",
   _rev: "1-967a00dff5e02add41819138abb3284d",
   title: "CouchApps"
};
$.couch.db("mydb").saveDoc(doc, {
   success: function(data) {
      console.log(data);
   }
});
Save Updated Document (cont’d)
PUT http://localhost:5984/mydb/0a72c9c36bd169818dc97ed18b000aa4   201 Created

{
    "ok":true,
    "id":"0a72c9c36bd169818dc97ed18b000aa4",
    "rev":"2-516027e3179a22a22e06874c374e8ef0"
}
Remove Document
var doc = {
   _id: "0a72c9c36bd169818dc97ed18b000aa4",
   _rev: "2-516027e3179a22a22e06874c374e8ef0"
};
$.couch.db("mydb").removeDoc(doc, {
    success: function(data) {
      console.log(data);
   }
});
Remove Document (cont’d)
DELETE http://localhost:5984/mydb/0a72c9c36bd169818dc97ed18b000aa4
?rev=2-516027e3179a22a22e06874c374e8ef0       200 OK

{
    "id":0a72c9c36bd169818dc97ed18b000aa4
    "ok":true,
    "rev":"3-e9a5aa1c486eee23c84fa028bc904991"
}
Changes (Long Polling)
$.couch.db("mydb").changes().onChange(function(data) {
   console.log(data);
});
GET http://localhost:5984/mydb/_changes
?heartbeat=10000&feed=longpoll&since=34      200 OK
{ "results":[
     { "seq":35,
       "id":"d12ee5ea1df6baa2b06451f44a01b7b5",
       "changes":[
         { "rev":"1-967a00dff5e02add41819138abb3284d" }
       ]
     }
  ],
  "last_seq":35
}
Why CouchApps?
Bene ts
Streamlining of your codebase (no middle tier)

Same language on both the client and server (JavaScript)

Show and list functions let you generate HTML from within CouchDB, if you don’t
want to rely on JavaScript

Replication of both data and code together

Deploy/replicate an application along with its data

Goes “with the grain” of the web
“Ground Computing”
Replication lters allow you to replicate relevant data to a user

Local data means faster access to the user’s data

Offline access

Data portability

Decentralization—no need for a canonical database

Potentially gives more control to the user over his or her own data
What about the HTML5
Web Storage API?
Allows persistent storage of key/value pairs

Enjoys signi cant cross-browser support

Lacks indexed queries

No replication features

IndexedDB might help, but is not part of the HTML5 speci cation and is only
implemented in a limited number of browsers

Need to look outside the HTML5 speci cation if you need more than just a key/
value storage
Trade-Offs
Tooling could use some improvement

Terminology still unclear—CouchApp can mean many different things

Must use JavaScript for the presentation tier

Pure JavaScript applications may have SEO issues

Show and list functions must be side-effect free, which can be limiting
Uses
Mobile applications that require offline access

Multi-device applications (e.g. address book, tasks)

Peer-to-peer collaboration applications

Distributed social networking

Any application that stores “documents”—CMS, wiki, etc.

Geospatial applications (via GeoCouch)
}
Mustache
Logic-Less Templates
Variables
Variables
Template:
<p>Hello, {{name}}.</p>

Hash:
{
  "name": "Bradley"
}

Output:
<p>Hello, Bradley.</p>
Unescaped Variables
Template:
<p>Hello, {{{name}}}.</p>

Hash:
{
  "name": "<em>Bradley</em>"
}

Output:
<p>Hello, <em>Bradley</em>.</p>
“Missed” Variables
Template:
<p>Hello, {{name}}.</p>

Hash:
{
  "role": "admin"
}

Output:
<p>Hello, .</p>
Sections
False Values
Template:
<p>Shown.</p>
{{#show}}
<p>Not shown.</p>
{{/show}}

Hash:
{
  "show": false
}

Output:
<p>Shown.</p>
Empty Lists
Template:
<p>Shown.</p>
{{#show}}
<p>Not shown.</p>
{{/show}}

Hash:
{
  "role": "admin"
}

Output:
<p>Shown.</p>
Non-Empty Lists
Template:
{{#users}}
 <p>{{name}}</p>
{{/users}}

Hash:
{ "users": [
    { "name": "Bradley" },
    { "name": "Jason" },
  ]
}

Output:
 <p>Bradley</p>
 <p>Jason</p>
Non-False
(and Not a List) Values
Template:
{{#user}}
 <p>Logged in as {{name}}</p>
{{/user}}

Hash:
{ "user": {
    "name": "Bradley"
  }
}

Output:
 <p>Logged in as Bradley</p>
Inverted Sections
Template:
{{^user}}
 <p>Not logged in</p>
{{/user}}

Hash:
{
  "user": false
}

Output:
 <p>Not logged in</p>
Evently
Evently is a jQuery plugin for
writing event-based applications
DOM Events
<p id="foo"></p>
<script type="text/javascript">
$("#foo").evently({
   click: function() {
     $(this).text("Clicked");
   }
})
</script>
Custom Events
<p id="user"></p>
<script type="text/javascript">
$("#user").evently({
   login: function(e, user) {
     $(this).text(user);
   }
})
$("#user").trigger("login", "Bradley");
</script>
Widgets
$("#user").evently({
   _init: {
     async: function(callback) {
        $.couch.session({
           success: function(data) {
             callback(data);
           }
        });
     },
     mustache: "<span>{{#name}}Logged in as {{name}}{{/name}}{{^name}}Not logged
in{{/name}}</span>",
     data: function(data) {
        return data.userCtx;
     }
   }
});
jQuery.data Syntactic Sugar
// $$ inspired by @wycats: http://yehudakatz.com/2009/04/20/evented-
programming-with-jquery/
function $$(node) {
 var data = $(node).data("$$");
 if (data) {
   return data;
 } else {
   data = {};
   $(node).data("$$", data);
   return data;
 }
};
$$ Examples
This:
$("#my-node").data("key", "value");

Becomes:
$$("#my-node").key = "value";

This:
var value = $("#my-node").data("key");

Becomes:
var value = $$("#my-node").key;
Design Documents
CouchApps & Design Documents
Each CouchApp is entirely self-contained in one design document

Design documents live alongside other documents, but have a special naming
convention of _design/<name>

A database can have multiple CouchApps (and/or design documents) and
CouchDB server can host multiple databases
What’s in a design document?
Can contain:
  • View de nitions
    • Map functions
    • Reduce functions
  • Show functions
  • List functions
  • Document update handlers
  • Document update validation functions
  • Rewrite de nitions
  • Any other elds you want, just like with any other document
  • Attachments, just like with any other document
ID follows the form of:
_design/<design_name>
Exploring Pages,
a CouchApp Wiki
Page Comments, JavaScript
views/recent-comments/map.js
function(doc) {
 if (doc.type == "comment") {
   emit([doc.topic, doc.at], doc);
 }
};
Wiring the Evently Widget
 <div id="comments"></div>
 …
<script type="text/javascript" charset="utf-8">
 var opts = {};
 …
 $.couch.app(function(app) {
  …
  $$("#wiki").docid = {{docid}};
  $$("#wiki").title = {{title_json}};
  $("#comments").evently("comments", app);
  …
 }, opts);
</script>
evently/comments/_init/query.js
function() {
 var docid = $$("#wiki").docid;
 return {
   view : "recent-comments",
   endkey : [docid, {}],
   startkey : [docid]
 };
};
evently/comments/_init/data.js
function(view) {
 var docid = $$("#wiki").docid,
   linkup = $$("#wiki").app.require("vendor/couchapp/lib/linkup");
 return {
   topic : docid,
   title : $$("#wiki").title,
   comments : view.rows.map(function(r) {
     var by = r.value.by || {};
     return {
       gravatar_url : by.gravatar_url,
       by : by.nickname,
       at : r.key[1],
       comment : linkup.encode(r.value.comment) // move to view
     }
   })
 }
};
evently/comments/_init/
mustache.html
<h3>Comments about {{title}}</h3>
<ul>
 {{#comments}}
 <li>
  <div class="avatar">
    {{#gravatar_url}}<img src="{{gravatar_url}}"/>{{/gravatar_url}}
    <div class="name">
     {{by}}
    </div>
  </div>
  <p>{{{comment}}}</p>
  <em><span class="date">{{at}}</span></em>
  <div class="clear"></div>
 </li>
 {{/comments}}
</ul>
evently/comments/_init/
mustache.html (cont’d)
<form>
 <label>Comment (w/ <a href="http://github.com/couchapp/couchapp"
target="_new">linkup</a>*)</label>
 <br/>
 <!-- <input type="text" size="60" name="comment"> -->
 <textarea name="comment" rows="4" cols="60"></textarea>
  <input type="hidden" name="topic" value="{{topic}}">
 <p><input type="submit" value="Save Comment"></p>
</form>
evently/comments/_init/after.js
function() {
 $(".date").prettyDate();
};
evently/comments/_init/selectors/
form/submit.js
function() {
 var form = $(this), app = $$(form).app,
   f = form.serializeObject();
 f.type = "comment";
 f.at = new Date();
 f.by = $$("#pro le").pro le;
 app.db.saveDoc(f, {
   success : function() {
     $("#comments").trigger("_init");
   }
 })
 return false;
};
All Comments, HTML
rewrites.json
[
    …
    {
       "from" : "/pages/comments",
       "to" : "_list/comments/all-comments",
       "query" : {
         "descending" : true,
         "limit" : 20
       }
    },
    …
]
CouchDB supports virtual hosts via the
“vhosts” server con guration section.
This lets you route to a rewrite handler
based on the Host HTTP header.
{
    "example.com": "/db/_design/tutorial/_rewrite",
    "www.example.com": "/db/_design/tutorial/_rewrite"
}
views/all-comments/map.js
function(doc) {
 if (doc.type == "comment" && doc.comment) {
   emit(doc.at, doc);
 }
};
lists/comments.js
function() {
 var row, ddoc = this,
   mustache = require("vendor/couchapp/lib/mustache"),
   markdown = require("vendor/couchapp/lib/markdown"),
   data = {
     title : "All Comments",
     site_title : this.couchapp.name,
     path : "/pages/comments",
     comments : []
   };
 provides("html", function() {
   while (row = getRow()) {
     log(row);
     data.comments.push(row.value)
   }
   send(mustache.to_html(ddoc.templates.comments, data, ddoc.templates.partials));
 });
};
templates/comments.html
{{>header}}
<ul>
 {{#comments}}
  <li>
    <span class="date">{{at}}</span>:
    {{#by}}{{name}} {{/by}}
   {{^by}}Unknown {{/by}}
    (<a href="../page/{{topic}}">{{topic}}</a>)
    <span class="idontknow">{{comment}}</span>
  </li>
 {{/comments}}
</ul>
 </body>
 …
</html>
templates/partials/header.html
<!DOCTYPE html>
<html>
 <head>
  <title>{{title}} - {{site_title}}</title>
  <link rel="stylesheet" href="../style/base-min.css" type="text/css">
  <link rel="stylesheet" href="../style/main.css" type="text/css">
 </head>
 <body>
  <div id="header">
   <div id="account"></div>
   <h1><a href="../page/index">{{site_title}}</a>: <a href="{{path}}">{{title}}
</a></h1>
  </div>
  <div id="pro le"></div>
Security
validate_doc_update.js
Function De nition
function (newDoc, oldDoc, userCtx, secObj) {
  var v = require("vendor/couchapp/lib/validate").init(newDoc, oldDoc, userCtx, secObj);
  …
}
Let Admins Do Anything
if (v.isAdmin()) {
  return true; // admin can do anything
}
Require Login to
Make Changes
if (!userCtx.name) {
  // this could be con gurable based on secObj
  v.unauthorized("please login to make changes");
}
Only Let Admins Delete
// only admin may delete
if (newDoc._deleted) {
  v.unauthorized("only admin may delete docs");
}
A special _security database property
lets you de ned database admins and
database readers
CouchApp Tool (Python)
CouchApps can be built without
CouchApp tooling—but the tooling
makes things much easier.
Installing CouchApp
$ sudo easy_install pip
$ sudo pip install couchapp
CouchApp Tooling Basics
Generate a CouchApp
$ couchapp generate tutorial
2011-06-15 16:25:18 [INFO] /tutorial generated.

$ cd tutorial
Generated Files
$ tree -FL 1
.
       README.md
     _attachments/
     _id
     couchapp.json
     evently/
     language
     lists/
     shows/
     updates/
     vendor/
README.md
Generated by CouchApp
CouchApps are web applications which can be served directly from CouchDB. This
gives them the nice property of replicating just like any other data stored in CouchDB.
They are also simple to write as they can use the built-in jQuery libraries and plugins
that ship with CouchDB.
More info about CouchApps here.
Deploying this app
Assuming you just cloned this app from git, and you have changed into the app directory
in your terminal, you want to push it to your CouchDB with the CouchApp command
line tool…
_attachments
$ tree -F _attachments
_attachments
       index.html
       style/
         main.css


1 directory, 2 files
_id
$ cat _id
_design/tutorial
couchapp.json
$ cat couchapp.json
{
   "name": "Name of your CouchApp",
   "description": "CouchApp"
}
evently
$ tree -F evently
evently
       items/
           _changes/
             data.js
             mustache.html
             query.json
       profile/
         profileReady/
            mustache.html
            selectors/
                 form/
language
$ cat language
javascript
lists
$ tree -F lists
lists

0 directories, 0 files
shows
$ tree -F shows
shows

0 directories, 0 files
updates
$ tree -F updates
updates

0 directories, 0 files
vendor
$ tree -FL 2 vendor
vendor
       couchapp/
         _attachments/
         evently/
         lib/
         metadata.json


4 directories, 1 file
views
$ tree -F views
views
       recent-items/
         map.js


1 directory, 1 file
views/recent-items/map.js
$ cat views/recent-items/map.js
function(doc) {
  if (doc.created_at) {
    emit(doc.created_at, doc);
  }
};
Deploying a CouchApp
Deploy to Localhost
$ couchapp push tutorial
2011-06-16 11:16:05 [INFO] Visit your CouchApp here:
http://127.0.0.1:5984/tutorial/_design/tutorial/index.html
My New CouchApp
Pathbinder
Pathbinder is a jQuery plugin for triggering
events based on the path components of a
URL hash.
Basic Usage
<div id="pro le"></div>
<script type="text/javascript">
$("#pro le").html('<p><a href="#/pro le">View Pro le</a></p>');
$("#pro le").bind("pro le", function() {
   $(this).html("<p>Pro le goes here…</p>");
});
$("#pro le").pathbinder("pro le", "/pro le");
</script>
Path Parameters
<div id="pro le"></div>
<script type="text/javascript">
$("#pro le").html('<p><a href="#/pro le/Bradley">View Bradley's Pro le
</a></p>');
$("#pro le").bind("pro le", function(e, params) {
   $(this).html("<p>Viewing " + params.id + "'s pro le</p>");
});
$("#pro le").pathbinder("pro le", "/pro le/:id");
</script>
Pathbinder,
Evently & Mustache
<div id="pro le"></div>
<script type="text/javascript">
$("#pro le").evently({
   _init: {
      path: "/",
      mustache: '<p><a href="#/pro le/Bradley">View Pro le</a></p>'
   },
   viewPro le: {
      path: "/pro le/:id",
      mustache: '<p>Viewing {{id}}'s pro le; <a href="#/">Back</a></p>',
      data: function(e, params) {
        return params;
      }
   }
});
</script>
The path name can be stored in a path.txt le
within an Evently widget in a CouchApp.
Alternative CouchApp Tools
node.couchapp.js
Command-line tool, written for Node.js

Simpler folder structure

Not compatible with the Python version

Links:
  • https://github.com/mikeal/node.couchapp.js
  • http://japhr.blogspot.com/2010/04/quick-intro-to-nodecouchappjs.html
  • http://vimeo.com/26147136
Kanso Framework
Also built using Node.js

http://kansojs.org/
soca
“Sammy On Couch App” or “Sittin’ on a Couch App”

Command-line tool written in Ruby

Uses Sammy.js

https://github.com/quirkey/soca
Reupholster
A simple way to get started developing CouchApps

http://reupholster.iriscouch.com/reupholster/_design/app/index.html
See the CouchApp wiki for a list of CouchApps
Hosting is available through Iris Couch
or Cloudant.
CouchDB & CouchApp Resources
CouchApp Wiki                             Scaling CouchDB
http://couchapp.org/                      by Bradley Holt (O’Reilly)
                                          063-6-920-01840-7
CouchDB Wiki
http://wiki.apache.org/couchdb/           Beginning CouchDB
                                          by Joe Lennon (Apress)
CouchDB: The De nitive Guide              978-1-430-27237-3
by J. Chris Anderson, Jan Lehnardt, and
Noah Slater (O’Reilly)
978-0-596-15589-6

Writing and Querying MapReduce Views in
CouchDB
by Bradley Holt (O’Reilly)
978-1-449-30312-9
Questions?
Thank You
                              Blog: http://bradley-holt.com
                       @BradleyHolt (http://twitter.com/BradleyHolt)
                               bradley.holt@foundline.com




Copyright © 2011 Bradley Holt. All rights reserved.

More Related Content

What's hot

An introduction to CouchDB
An introduction to CouchDBAn introduction to CouchDB
An introduction to CouchDBDavid Coallier
 
OrientDB the graph database
OrientDB the graph databaseOrientDB the graph database
OrientDB the graph databaseArtem Orobets
 
CouchDB Open Source Bridge
CouchDB Open Source BridgeCouchDB Open Source Bridge
CouchDB Open Source BridgeChris Anderson
 
NoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDBNoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDBJonathan Weiss
 
Apache CouchDB Presentation @ Sept. 2104 GTALUG Meeting
Apache CouchDB Presentation @ Sept. 2104 GTALUG MeetingApache CouchDB Presentation @ Sept. 2104 GTALUG Meeting
Apache CouchDB Presentation @ Sept. 2104 GTALUG MeetingMyles Braithwaite
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know Norberto Leite
 
Optimize drupal using mongo db
Optimize drupal using mongo dbOptimize drupal using mongo db
Optimize drupal using mongo dbVladimir Ilic
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDBNate Abele
 
Webinar: Building Your First App with MongoDB and Java
Webinar: Building Your First App with MongoDB and JavaWebinar: Building Your First App with MongoDB and Java
Webinar: Building Your First App with MongoDB and JavaMongoDB
 
Dealing with Azure Cosmos DB
Dealing with Azure Cosmos DBDealing with Azure Cosmos DB
Dealing with Azure Cosmos DBMihail Mateev
 
Presentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - WebinarPresentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - WebinarOrient Technologies
 
Learn Learn how to build your mobile back-end with MongoDB
Learn Learn how to build your mobile back-end with MongoDBLearn Learn how to build your mobile back-end with MongoDB
Learn Learn how to build your mobile back-end with MongoDBMarakana Inc.
 

What's hot (20)

An introduction to CouchDB
An introduction to CouchDBAn introduction to CouchDB
An introduction to CouchDB
 
An introduction to MongoDB
An introduction to MongoDBAn introduction to MongoDB
An introduction to MongoDB
 
Polyglot Persistence
Polyglot PersistencePolyglot Persistence
Polyglot Persistence
 
CouchDB
CouchDBCouchDB
CouchDB
 
Couch db
Couch dbCouch db
Couch db
 
OrientDB the graph database
OrientDB the graph databaseOrientDB the graph database
OrientDB the graph database
 
CouchDB Open Source Bridge
CouchDB Open Source BridgeCouchDB Open Source Bridge
CouchDB Open Source Bridge
 
NoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDBNoSQL - An introduction to CouchDB
NoSQL - An introduction to CouchDB
 
wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?
 
OrientDB
OrientDBOrientDB
OrientDB
 
Apache CouchDB Presentation @ Sept. 2104 GTALUG Meeting
Apache CouchDB Presentation @ Sept. 2104 GTALUG MeetingApache CouchDB Presentation @ Sept. 2104 GTALUG Meeting
Apache CouchDB Presentation @ Sept. 2104 GTALUG Meeting
 
Mongo-Drupal
Mongo-DrupalMongo-Drupal
Mongo-Drupal
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Optimize drupal using mongo db
Optimize drupal using mongo dbOptimize drupal using mongo db
Optimize drupal using mongo db
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDB
 
Ws rest
Ws restWs rest
Ws rest
 
Webinar: Building Your First App with MongoDB and Java
Webinar: Building Your First App with MongoDB and JavaWebinar: Building Your First App with MongoDB and Java
Webinar: Building Your First App with MongoDB and Java
 
Dealing with Azure Cosmos DB
Dealing with Azure Cosmos DBDealing with Azure Cosmos DB
Dealing with Azure Cosmos DB
 
Presentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - WebinarPresentation of OrientDB v2.2 - Webinar
Presentation of OrientDB v2.2 - Webinar
 
Learn Learn how to build your mobile back-end with MongoDB
Learn Learn how to build your mobile back-end with MongoDBLearn Learn how to build your mobile back-end with MongoDB
Learn Learn how to build your mobile back-end with MongoDB
 

Viewers also liked

Preparation Vs. Keyword Outline
Preparation Vs. Keyword OutlinePreparation Vs. Keyword Outline
Preparation Vs. Keyword Outlineguesteb0d27
 
Apache MINA: The high-performance protocol construction toolkit.
Apache MINA: The high-performance protocol construction toolkit.Apache MINA: The high-performance protocol construction toolkit.
Apache MINA: The high-performance protocol construction toolkit.osi
 
Beyond Agile Execution: Agility for Impact
Beyond Agile Execution: Agility for ImpactBeyond Agile Execution: Agility for Impact
Beyond Agile Execution: Agility for ImpactRyan Martens
 
Java in the database–is it really useful? Solving impossible Big Data challenges
Java in the database–is it really useful? Solving impossible Big Data challengesJava in the database–is it really useful? Solving impossible Big Data challenges
Java in the database–is it really useful? Solving impossible Big Data challengesRogue Wave Software
 
Marinheiros Do Poseidon Em CelebraçãO Pela Viagem Ao
Marinheiros Do Poseidon Em CelebraçãO Pela Viagem AoMarinheiros Do Poseidon Em CelebraçãO Pela Viagem Ao
Marinheiros Do Poseidon Em CelebraçãO Pela Viagem AoAndrea Bruzaca
 
Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...
Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...
Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...Yahoo Developer Network
 
Cunningham smith genre-historical_fiction
Cunningham smith genre-historical_fictionCunningham smith genre-historical_fiction
Cunningham smith genre-historical_fictionjamiecunningham
 
Introduction to Hadoop at Data-360 Conference
Introduction to Hadoop at Data-360 ConferenceIntroduction to Hadoop at Data-360 Conference
Introduction to Hadoop at Data-360 ConferenceAvkash Chauhan
 
Open Historical Map: re-using obsolete information - State of the Map 2013
Open Historical Map: re-using obsolete information - State of the Map 2013Open Historical Map: re-using obsolete information - State of the Map 2013
Open Historical Map: re-using obsolete information - State of the Map 2013OSMFstateofthemap
 
Extraction, analysis, atom mapping, classification and naming of reactions fr...
Extraction, analysis, atom mapping, classification and naming of reactions fr...Extraction, analysis, atom mapping, classification and naming of reactions fr...
Extraction, analysis, atom mapping, classification and naming of reactions fr...NextMove Software
 
Engineers and Business Agility for Intel Agile Conference 2015
Engineers and Business Agility for Intel Agile Conference 2015Engineers and Business Agility for Intel Agile Conference 2015
Engineers and Business Agility for Intel Agile Conference 2015Ryan Martens
 
Top 10 microblogging tools
Top 10 microblogging toolsTop 10 microblogging tools
Top 10 microblogging toolsiumstech
 
экономические проблемы материнства в современной россии
экономические  проблемы материнства в современной россииэкономические  проблемы материнства в современной россии
экономические проблемы материнства в современной россииЕлена
 
Juicer - A fast template engine using javascript
Juicer - A fast template engine using javascriptJuicer - A fast template engine using javascript
Juicer - A fast template engine using javascriptpaulguo
 

Viewers also liked (20)

The application of moral stages
The application of moral stagesThe application of moral stages
The application of moral stages
 
Preparation Vs. Keyword Outline
Preparation Vs. Keyword OutlinePreparation Vs. Keyword Outline
Preparation Vs. Keyword Outline
 
Dignity ethical approaches pp
Dignity ethical approaches ppDignity ethical approaches pp
Dignity ethical approaches pp
 
Apache MINA: The high-performance protocol construction toolkit.
Apache MINA: The high-performance protocol construction toolkit.Apache MINA: The high-performance protocol construction toolkit.
Apache MINA: The high-performance protocol construction toolkit.
 
Beyond Agile Execution: Agility for Impact
Beyond Agile Execution: Agility for ImpactBeyond Agile Execution: Agility for Impact
Beyond Agile Execution: Agility for Impact
 
Java in the database–is it really useful? Solving impossible Big Data challenges
Java in the database–is it really useful? Solving impossible Big Data challengesJava in the database–is it really useful? Solving impossible Big Data challenges
Java in the database–is it really useful? Solving impossible Big Data challenges
 
Marinheiros Do Poseidon Em CelebraçãO Pela Viagem Ao
Marinheiros Do Poseidon Em CelebraçãO Pela Viagem AoMarinheiros Do Poseidon Em CelebraçãO Pela Viagem Ao
Marinheiros Do Poseidon Em CelebraçãO Pela Viagem Ao
 
Friend Trusted
Friend TrustedFriend Trusted
Friend Trusted
 
Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...
Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...
Apache Hadoop India Summit 2011 talk "Online Content Optimization using Hadoo...
 
Cunningham smith genre-historical_fiction
Cunningham smith genre-historical_fictionCunningham smith genre-historical_fiction
Cunningham smith genre-historical_fiction
 
Introduction to Hadoop at Data-360 Conference
Introduction to Hadoop at Data-360 ConferenceIntroduction to Hadoop at Data-360 Conference
Introduction to Hadoop at Data-360 Conference
 
Open Historical Map: re-using obsolete information - State of the Map 2013
Open Historical Map: re-using obsolete information - State of the Map 2013Open Historical Map: re-using obsolete information - State of the Map 2013
Open Historical Map: re-using obsolete information - State of the Map 2013
 
Extraction, analysis, atom mapping, classification and naming of reactions fr...
Extraction, analysis, atom mapping, classification and naming of reactions fr...Extraction, analysis, atom mapping, classification and naming of reactions fr...
Extraction, analysis, atom mapping, classification and naming of reactions fr...
 
Engineers and Business Agility for Intel Agile Conference 2015
Engineers and Business Agility for Intel Agile Conference 2015Engineers and Business Agility for Intel Agile Conference 2015
Engineers and Business Agility for Intel Agile Conference 2015
 
Company Profile
Company ProfileCompany Profile
Company Profile
 
Top 10 microblogging tools
Top 10 microblogging toolsTop 10 microblogging tools
Top 10 microblogging tools
 
Metrics
MetricsMetrics
Metrics
 
Toki
TokiToki
Toki
 
экономические проблемы материнства в современной россии
экономические  проблемы материнства в современной россииэкономические  проблемы материнства в современной россии
экономические проблемы материнства в современной россии
 
Juicer - A fast template engine using javascript
Juicer - A fast template engine using javascriptJuicer - A fast template engine using javascript
Juicer - A fast template engine using javascript
 

Similar to OSCON 2011 CouchApps

CouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourCouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourPeter Friese
 
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaSolutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaGuido Schmutz
 
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...confluent
 
Introduction to CouchDB
Introduction to CouchDBIntroduction to CouchDB
Introduction to CouchDBBogdan Sabău
 
Going Serverless with Azure Functions
Going Serverless with Azure FunctionsGoing Serverless with Azure Functions
Going Serverless with Azure FunctionsShahed Chowdhuri
 
Solutions for bi-directional integration between Oracle RDBMS & Apache Kafka
Solutions for bi-directional integration between Oracle RDBMS & Apache KafkaSolutions for bi-directional integration between Oracle RDBMS & Apache Kafka
Solutions for bi-directional integration between Oracle RDBMS & Apache KafkaGuido Schmutz
 
Html5 and web technology update
Html5 and web technology updateHtml5 and web technology update
Html5 and web technology updateDoug Domeny
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)Uwe Printz
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
Data Modeling and Relational to NoSQL
Data Modeling and Relational to NoSQLData Modeling and Relational to NoSQL
Data Modeling and Relational to NoSQLDATAVERSITY
 
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.GeeksLab Odessa
 
Bare-knuckle web development
Bare-knuckle web developmentBare-knuckle web development
Bare-knuckle web developmentJohannes Brodwall
 
Conexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDays
Conexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDaysConexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDays
Conexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDaysCAPSiDE
 
Tearing the Sofa Apart: CouchDB and CouchApps from a Beginner's Perspective
Tearing the Sofa Apart: CouchDB and CouchApps from a Beginner's PerspectiveTearing the Sofa Apart: CouchDB and CouchApps from a Beginner's Perspective
Tearing the Sofa Apart: CouchDB and CouchApps from a Beginner's PerspectiveSeh Hui Leong
 
Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebJames Rakich
 
Webinar: The Anatomy of the Cloudant Data Layer
Webinar: The Anatomy of the Cloudant Data LayerWebinar: The Anatomy of the Cloudant Data Layer
Webinar: The Anatomy of the Cloudant Data LayerIBM Cloud Data Services
 
Introduction to MongoDB and Workshop
Introduction to MongoDB and WorkshopIntroduction to MongoDB and Workshop
Introduction to MongoDB and WorkshopAhmedabadJavaMeetup
 
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Luigi Dell'Aquila
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 

Similar to OSCON 2011 CouchApps (20)

CouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 HourCouchDB Mobile - From Couch to 5K in 1 Hour
CouchDB Mobile - From Couch to 5K in 1 Hour
 
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache KafkaSolutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
Solutions for bi-directional Integration between Oracle RDMBS & Apache Kafka
 
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
Solutions for bi-directional integration between Oracle RDBMS and Apache Kafk...
 
Introduction to CouchDB
Introduction to CouchDBIntroduction to CouchDB
Introduction to CouchDB
 
Going Serverless with Azure Functions
Going Serverless with Azure FunctionsGoing Serverless with Azure Functions
Going Serverless with Azure Functions
 
Solutions for bi-directional integration between Oracle RDBMS & Apache Kafka
Solutions for bi-directional integration between Oracle RDBMS & Apache KafkaSolutions for bi-directional integration between Oracle RDBMS & Apache Kafka
Solutions for bi-directional integration between Oracle RDBMS & Apache Kafka
 
Html5 and web technology update
Html5 and web technology updateHtml5 and web technology update
Html5 and web technology update
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
Data Modeling and Relational to NoSQL
Data Modeling and Relational to NoSQLData Modeling and Relational to NoSQL
Data Modeling and Relational to NoSQL
 
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
 
Bare-knuckle web development
Bare-knuckle web developmentBare-knuckle web development
Bare-knuckle web development
 
Conexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDays
Conexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDaysConexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDays
Conexión de MongoDB con Hadoop - Luis Alberto Giménez - CAPSiDE #DevOSSAzureDays
 
Tearing the Sofa Apart: CouchDB and CouchApps from a Beginner's Perspective
Tearing the Sofa Apart: CouchDB and CouchApps from a Beginner's PerspectiveTearing the Sofa Apart: CouchDB and CouchApps from a Beginner's Perspective
Tearing the Sofa Apart: CouchDB and CouchApps from a Beginner's Perspective
 
Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the Web
 
Webinar: The Anatomy of the Cloudant Data Layer
Webinar: The Anatomy of the Cloudant Data LayerWebinar: The Anatomy of the Cloudant Data Layer
Webinar: The Anatomy of the Cloudant Data Layer
 
Introduction to MongoDB and Workshop
Introduction to MongoDB and WorkshopIntroduction to MongoDB and Workshop
Introduction to MongoDB and Workshop
 
MongoDB Meetup
MongoDB MeetupMongoDB Meetup
MongoDB Meetup
 
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 

More from Bradley Holt

Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012Bradley Holt
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven DesignBradley Holt
 
Entity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf BostonEntity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf BostonBradley Holt
 
CouchConf NYC CouchApps
CouchConf NYC CouchAppsCouchConf NYC CouchApps
CouchConf NYC CouchAppsBradley Holt
 
ZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven DesignZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven DesignBradley Holt
 
ZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDBZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDBBradley Holt
 
jQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchAppsjQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchAppsBradley Holt
 
Load Balancing with Apache
Load Balancing with ApacheLoad Balancing with Apache
Load Balancing with ApacheBradley Holt
 
New Features in PHP 5.3
New Features in PHP 5.3New Features in PHP 5.3
New Features in PHP 5.3Bradley Holt
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHPBradley Holt
 
Resource-Oriented Web Services
Resource-Oriented Web ServicesResource-Oriented Web Services
Resource-Oriented Web ServicesBradley Holt
 
Zend Framework Quick Start Walkthrough
Zend Framework Quick Start WalkthroughZend Framework Quick Start Walkthrough
Zend Framework Quick Start WalkthroughBradley Holt
 
Burlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion PresentationBurlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion PresentationBradley Holt
 

More from Bradley Holt (14)

Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Entity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf BostonEntity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf Boston
 
CouchConf NYC CouchApps
CouchConf NYC CouchAppsCouchConf NYC CouchApps
CouchConf NYC CouchApps
 
ZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven DesignZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven Design
 
ZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDBZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDB
 
jQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchAppsjQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchApps
 
Load Balancing with Apache
Load Balancing with ApacheLoad Balancing with Apache
Load Balancing with Apache
 
Intermediate PHP
Intermediate PHPIntermediate PHP
Intermediate PHP
 
New Features in PHP 5.3
New Features in PHP 5.3New Features in PHP 5.3
New Features in PHP 5.3
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
Resource-Oriented Web Services
Resource-Oriented Web ServicesResource-Oriented Web Services
Resource-Oriented Web Services
 
Zend Framework Quick Start Walkthrough
Zend Framework Quick Start WalkthroughZend Framework Quick Start Walkthrough
Zend Framework Quick Start Walkthrough
 
Burlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion PresentationBurlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion Presentation
 

Recently uploaded

The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Scott Andery
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 

Recently uploaded (20)

The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 

OSCON 2011 CouchApps

  • 1. + = CouchApps Blog: http://bradley-holt.com @BradleyHolt (http://twitter.com/BradleyHolt) bradley.holt@foundline.com
  • 4. from Vermont Battery Park - Burlington, Vermont by Marty Desilets, on Flickr
  • 5. Organizer BTV
  • 7. Author http://oreilly.com/catalog/9781449303129/ http://oreilly.com/catalog/9781449303433/
  • 9. CouchDB is a database, web server & application server
  • 10. Bene ts Schema-less “self-contained” JSON documents—no tables, just documents RESTful HTTP API is simple to integrate with Custom-written MapReduce “views” index your data for fast retrieval Multi-master replication can happen continuously, in any direction, and/or whenever nodes can connect Can run on anything from a server to a mobile device (CouchDB can be embedded in Android and iOS apps)
  • 11. Trade-Offs No ad-hoc queries (you can use temporary views, but they’re slow on large data sets) Thinking in terms of MapReduce views can take some time to get used to No transactions across document boundaries Your data will be “eventually consistent” and con icts can occur (but can be resolved)
  • 13. Mapping Document Titles function(doc) { // JSON object representing a doc to be mapped if (doc.title) { // make sure this doc has a title emit(doc.title); // emit the doc’s title as the key } }
  • 14. Mapped Document Titles key id value "Building iPhone Apps with "978-0-596-80579-1" null HTML, CSS, and JavaScript" "CouchDB: The Definitive "978-0-596-15589-6" null Guide" "DocBook: The Definitive "978-1-565-92580-9" null Guide" "RESTful Web Services" "978-0-596-52926-0" null
  • 15. Mapping Document Authors function(doc) { // JSON object representing a doc to be mapped if (doc.authors) { // make sure this doc has an authors eld for (var i in doc.authors) { emit(doc.authors[i]); // emit each author as the key } } }
  • 16. Mapped Authors key id value "J. Chris Anderson" "978-0-596-15589-6" null "Jan Lehnardt" "978-0-596-15589-6" null "Jonathan Stark" "978-0-596-80579-1" null "Leonard Muellner" "978-1-565-92580-9" null "Leonard Richardson" "978-0-596-52926-0" null "Noah Slater" "978-0-596-15589-6" null "Norman Walsh" "978-1-565-92580-9" null "Sam Ruby" "978-0-596-52926-0" null
  • 17. HTTP API via the CouchDB jQuery Plugin http://localhost:5984/_utils/script/jquery.couch.js
  • 18. The same-origin policy dictates that your HTML and AJAX data (JSON) must be retrieved from the same origin.
  • 19. Create Database $.couch.db("mydb").create({ success: function(data) { console.log(data); } }); PUT http://localhost:5984/mydb 201 Created {"ok":true}
  • 20. Save New Document $.couch.db("mydb").saveDoc({}, { success: function(data) { console.log(data); } }); POST http://localhost:5984/mydb 201 Created { "ok":true, "id":"e15d848571c8a0352e94738ba6018790", "rev":"1-967a00dff5e02add41819138abb3284d" }
  • 21. Save Updated Document var doc = { _id: "0a72c9c36bd169818dc97ed18b000aa4", _rev: "1-967a00dff5e02add41819138abb3284d", title: "CouchApps" }; $.couch.db("mydb").saveDoc(doc, { success: function(data) { console.log(data); } });
  • 22. Save Updated Document (cont’d) PUT http://localhost:5984/mydb/0a72c9c36bd169818dc97ed18b000aa4 201 Created { "ok":true, "id":"0a72c9c36bd169818dc97ed18b000aa4", "rev":"2-516027e3179a22a22e06874c374e8ef0" }
  • 23. Remove Document var doc = { _id: "0a72c9c36bd169818dc97ed18b000aa4", _rev: "2-516027e3179a22a22e06874c374e8ef0" }; $.couch.db("mydb").removeDoc(doc, { success: function(data) { console.log(data); } });
  • 24. Remove Document (cont’d) DELETE http://localhost:5984/mydb/0a72c9c36bd169818dc97ed18b000aa4 ?rev=2-516027e3179a22a22e06874c374e8ef0 200 OK { "id":0a72c9c36bd169818dc97ed18b000aa4 "ok":true, "rev":"3-e9a5aa1c486eee23c84fa028bc904991" }
  • 25. Changes (Long Polling) $.couch.db("mydb").changes().onChange(function(data) { console.log(data); }); GET http://localhost:5984/mydb/_changes ?heartbeat=10000&feed=longpoll&since=34 200 OK { "results":[ { "seq":35, "id":"d12ee5ea1df6baa2b06451f44a01b7b5", "changes":[ { "rev":"1-967a00dff5e02add41819138abb3284d" } ] } ], "last_seq":35 }
  • 27. Bene ts Streamlining of your codebase (no middle tier) Same language on both the client and server (JavaScript) Show and list functions let you generate HTML from within CouchDB, if you don’t want to rely on JavaScript Replication of both data and code together Deploy/replicate an application along with its data Goes “with the grain” of the web
  • 28. “Ground Computing” Replication lters allow you to replicate relevant data to a user Local data means faster access to the user’s data Offline access Data portability Decentralization—no need for a canonical database Potentially gives more control to the user over his or her own data
  • 29. What about the HTML5 Web Storage API? Allows persistent storage of key/value pairs Enjoys signi cant cross-browser support Lacks indexed queries No replication features IndexedDB might help, but is not part of the HTML5 speci cation and is only implemented in a limited number of browsers Need to look outside the HTML5 speci cation if you need more than just a key/ value storage
  • 30. Trade-Offs Tooling could use some improvement Terminology still unclear—CouchApp can mean many different things Must use JavaScript for the presentation tier Pure JavaScript applications may have SEO issues Show and list functions must be side-effect free, which can be limiting
  • 31. Uses Mobile applications that require offline access Multi-device applications (e.g. address book, tasks) Peer-to-peer collaboration applications Distributed social networking Any application that stores “documents”—CMS, wiki, etc. Geospatial applications (via GeoCouch)
  • 34. Variables Template: <p>Hello, {{name}}.</p> Hash: { "name": "Bradley" } Output: <p>Hello, Bradley.</p>
  • 35. Unescaped Variables Template: <p>Hello, {{{name}}}.</p> Hash: { "name": "<em>Bradley</em>" } Output: <p>Hello, <em>Bradley</em>.</p>
  • 36. “Missed” Variables Template: <p>Hello, {{name}}.</p> Hash: { "role": "admin" } Output: <p>Hello, .</p>
  • 40. Non-Empty Lists Template: {{#users}} <p>{{name}}</p> {{/users}} Hash: { "users": [ { "name": "Bradley" }, { "name": "Jason" }, ] } Output: <p>Bradley</p> <p>Jason</p>
  • 41. Non-False (and Not a List) Values Template: {{#user}} <p>Logged in as {{name}}</p> {{/user}} Hash: { "user": { "name": "Bradley" } } Output: <p>Logged in as Bradley</p>
  • 42. Inverted Sections Template: {{^user}} <p>Not logged in</p> {{/user}} Hash: { "user": false } Output: <p>Not logged in</p>
  • 44. Evently is a jQuery plugin for writing event-based applications
  • 45. DOM Events <p id="foo"></p> <script type="text/javascript"> $("#foo").evently({ click: function() { $(this).text("Clicked"); } }) </script>
  • 46. Custom Events <p id="user"></p> <script type="text/javascript"> $("#user").evently({ login: function(e, user) { $(this).text(user); } }) $("#user").trigger("login", "Bradley"); </script>
  • 47. Widgets $("#user").evently({ _init: { async: function(callback) { $.couch.session({ success: function(data) { callback(data); } }); }, mustache: "<span>{{#name}}Logged in as {{name}}{{/name}}{{^name}}Not logged in{{/name}}</span>", data: function(data) { return data.userCtx; } } });
  • 48. jQuery.data Syntactic Sugar // $$ inspired by @wycats: http://yehudakatz.com/2009/04/20/evented- programming-with-jquery/ function $$(node) { var data = $(node).data("$$"); if (data) { return data; } else { data = {}; $(node).data("$$", data); return data; } };
  • 49. $$ Examples This: $("#my-node").data("key", "value"); Becomes: $$("#my-node").key = "value"; This: var value = $("#my-node").data("key"); Becomes: var value = $$("#my-node").key;
  • 51. CouchApps & Design Documents Each CouchApp is entirely self-contained in one design document Design documents live alongside other documents, but have a special naming convention of _design/<name> A database can have multiple CouchApps (and/or design documents) and CouchDB server can host multiple databases
  • 52. What’s in a design document? Can contain: • View de nitions • Map functions • Reduce functions • Show functions • List functions • Document update handlers • Document update validation functions • Rewrite de nitions • Any other elds you want, just like with any other document • Attachments, just like with any other document ID follows the form of: _design/<design_name>
  • 55. views/recent-comments/map.js function(doc) { if (doc.type == "comment") { emit([doc.topic, doc.at], doc); } };
  • 56. Wiring the Evently Widget <div id="comments"></div> … <script type="text/javascript" charset="utf-8"> var opts = {}; … $.couch.app(function(app) { … $$("#wiki").docid = {{docid}}; $$("#wiki").title = {{title_json}}; $("#comments").evently("comments", app); … }, opts); </script>
  • 57. evently/comments/_init/query.js function() { var docid = $$("#wiki").docid; return { view : "recent-comments", endkey : [docid, {}], startkey : [docid] }; };
  • 58. evently/comments/_init/data.js function(view) { var docid = $$("#wiki").docid, linkup = $$("#wiki").app.require("vendor/couchapp/lib/linkup"); return { topic : docid, title : $$("#wiki").title, comments : view.rows.map(function(r) { var by = r.value.by || {}; return { gravatar_url : by.gravatar_url, by : by.nickname, at : r.key[1], comment : linkup.encode(r.value.comment) // move to view } }) } };
  • 59. evently/comments/_init/ mustache.html <h3>Comments about {{title}}</h3> <ul> {{#comments}} <li> <div class="avatar"> {{#gravatar_url}}<img src="{{gravatar_url}}"/>{{/gravatar_url}} <div class="name"> {{by}} </div> </div> <p>{{{comment}}}</p> <em><span class="date">{{at}}</span></em> <div class="clear"></div> </li> {{/comments}} </ul>
  • 60. evently/comments/_init/ mustache.html (cont’d) <form> <label>Comment (w/ <a href="http://github.com/couchapp/couchapp" target="_new">linkup</a>*)</label> <br/> <!-- <input type="text" size="60" name="comment"> --> <textarea name="comment" rows="4" cols="60"></textarea> <input type="hidden" name="topic" value="{{topic}}"> <p><input type="submit" value="Save Comment"></p> </form>
  • 62. evently/comments/_init/selectors/ form/submit.js function() { var form = $(this), app = $$(form).app, f = form.serializeObject(); f.type = "comment"; f.at = new Date(); f.by = $$("#pro le").pro le; app.db.saveDoc(f, { success : function() { $("#comments").trigger("_init"); } }) return false; };
  • 64. rewrites.json [ … { "from" : "/pages/comments", "to" : "_list/comments/all-comments", "query" : { "descending" : true, "limit" : 20 } }, … ]
  • 65. CouchDB supports virtual hosts via the “vhosts” server con guration section. This lets you route to a rewrite handler based on the Host HTTP header. { "example.com": "/db/_design/tutorial/_rewrite", "www.example.com": "/db/_design/tutorial/_rewrite" }
  • 66. views/all-comments/map.js function(doc) { if (doc.type == "comment" && doc.comment) { emit(doc.at, doc); } };
  • 67. lists/comments.js function() { var row, ddoc = this, mustache = require("vendor/couchapp/lib/mustache"), markdown = require("vendor/couchapp/lib/markdown"), data = { title : "All Comments", site_title : this.couchapp.name, path : "/pages/comments", comments : [] }; provides("html", function() { while (row = getRow()) { log(row); data.comments.push(row.value) } send(mustache.to_html(ddoc.templates.comments, data, ddoc.templates.partials)); }); };
  • 68. templates/comments.html {{>header}} <ul> {{#comments}} <li> <span class="date">{{at}}</span>: {{#by}}{{name}} {{/by}} {{^by}}Unknown {{/by}} (<a href="../page/{{topic}}">{{topic}}</a>) <span class="idontknow">{{comment}}</span> </li> {{/comments}} </ul> </body> … </html>
  • 69. templates/partials/header.html <!DOCTYPE html> <html> <head> <title>{{title}} - {{site_title}}</title> <link rel="stylesheet" href="../style/base-min.css" type="text/css"> <link rel="stylesheet" href="../style/main.css" type="text/css"> </head> <body> <div id="header"> <div id="account"></div> <h1><a href="../page/index">{{site_title}}</a>: <a href="{{path}}">{{title}} </a></h1> </div> <div id="pro le"></div>
  • 71. Function De nition function (newDoc, oldDoc, userCtx, secObj) { var v = require("vendor/couchapp/lib/validate").init(newDoc, oldDoc, userCtx, secObj); … }
  • 72. Let Admins Do Anything if (v.isAdmin()) { return true; // admin can do anything }
  • 73. Require Login to Make Changes if (!userCtx.name) { // this could be con gurable based on secObj v.unauthorized("please login to make changes"); }
  • 74. Only Let Admins Delete // only admin may delete if (newDoc._deleted) { v.unauthorized("only admin may delete docs"); }
  • 75. A special _security database property lets you de ned database admins and database readers
  • 77. CouchApps can be built without CouchApp tooling—but the tooling makes things much easier.
  • 78. Installing CouchApp $ sudo easy_install pip $ sudo pip install couchapp
  • 80. Generate a CouchApp $ couchapp generate tutorial 2011-06-15 16:25:18 [INFO] /tutorial generated. $ cd tutorial
  • 81. Generated Files $ tree -FL 1 . README.md _attachments/ _id couchapp.json evently/ language lists/ shows/ updates/ vendor/
  • 82. README.md Generated by CouchApp CouchApps are web applications which can be served directly from CouchDB. This gives them the nice property of replicating just like any other data stored in CouchDB. They are also simple to write as they can use the built-in jQuery libraries and plugins that ship with CouchDB. More info about CouchApps here. Deploying this app Assuming you just cloned this app from git, and you have changed into the app directory in your terminal, you want to push it to your CouchDB with the CouchApp command line tool…
  • 83. _attachments $ tree -F _attachments _attachments index.html style/ main.css 1 directory, 2 files
  • 85. couchapp.json $ cat couchapp.json { "name": "Name of your CouchApp", "description": "CouchApp" }
  • 86. evently $ tree -F evently evently items/    _changes/    data.js    mustache.html    query.json profile/ profileReady/ mustache.html selectors/ form/
  • 88. lists $ tree -F lists lists 0 directories, 0 files
  • 89. shows $ tree -F shows shows 0 directories, 0 files
  • 90. updates $ tree -F updates updates 0 directories, 0 files
  • 91. vendor $ tree -FL 2 vendor vendor couchapp/ _attachments/ evently/ lib/ metadata.json 4 directories, 1 file
  • 92. views $ tree -F views views recent-items/ map.js 1 directory, 1 file
  • 93. views/recent-items/map.js $ cat views/recent-items/map.js function(doc) { if (doc.created_at) { emit(doc.created_at, doc); } };
  • 95. Deploy to Localhost $ couchapp push tutorial 2011-06-16 11:16:05 [INFO] Visit your CouchApp here: http://127.0.0.1:5984/tutorial/_design/tutorial/index.html
  • 98. Pathbinder is a jQuery plugin for triggering events based on the path components of a URL hash.
  • 99. Basic Usage <div id="pro le"></div> <script type="text/javascript"> $("#pro le").html('<p><a href="#/pro le">View Pro le</a></p>'); $("#pro le").bind("pro le", function() { $(this).html("<p>Pro le goes here…</p>"); }); $("#pro le").pathbinder("pro le", "/pro le"); </script>
  • 100. Path Parameters <div id="pro le"></div> <script type="text/javascript"> $("#pro le").html('<p><a href="#/pro le/Bradley">View Bradley's Pro le </a></p>'); $("#pro le").bind("pro le", function(e, params) { $(this).html("<p>Viewing " + params.id + "'s pro le</p>"); }); $("#pro le").pathbinder("pro le", "/pro le/:id"); </script>
  • 101. Pathbinder, Evently & Mustache <div id="pro le"></div> <script type="text/javascript"> $("#pro le").evently({ _init: { path: "/", mustache: '<p><a href="#/pro le/Bradley">View Pro le</a></p>' }, viewPro le: { path: "/pro le/:id", mustache: '<p>Viewing {{id}}'s pro le; <a href="#/">Back</a></p>', data: function(e, params) { return params; } } }); </script>
  • 102. The path name can be stored in a path.txt le within an Evently widget in a CouchApp.
  • 104. node.couchapp.js Command-line tool, written for Node.js Simpler folder structure Not compatible with the Python version Links: • https://github.com/mikeal/node.couchapp.js • http://japhr.blogspot.com/2010/04/quick-intro-to-nodecouchappjs.html • http://vimeo.com/26147136
  • 105. Kanso Framework Also built using Node.js http://kansojs.org/
  • 106. soca “Sammy On Couch App” or “Sittin’ on a Couch App” Command-line tool written in Ruby Uses Sammy.js https://github.com/quirkey/soca
  • 107. Reupholster A simple way to get started developing CouchApps http://reupholster.iriscouch.com/reupholster/_design/app/index.html
  • 108. See the CouchApp wiki for a list of CouchApps
  • 109. Hosting is available through Iris Couch or Cloudant.
  • 110. CouchDB & CouchApp Resources CouchApp Wiki Scaling CouchDB http://couchapp.org/ by Bradley Holt (O’Reilly) 063-6-920-01840-7 CouchDB Wiki http://wiki.apache.org/couchdb/ Beginning CouchDB by Joe Lennon (Apress) CouchDB: The De nitive Guide 978-1-430-27237-3 by J. Chris Anderson, Jan Lehnardt, and Noah Slater (O’Reilly) 978-0-596-15589-6 Writing and Querying MapReduce Views in CouchDB by Bradley Holt (O’Reilly) 978-1-449-30312-9
  • 112. Thank You Blog: http://bradley-holt.com @BradleyHolt (http://twitter.com/BradleyHolt) bradley.holt@foundline.com Copyright © 2011 Bradley Holt. All rights reserved.

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. Descends into the &amp;#x201C;user&amp;#x201D; context for the section\n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. The recent comments view&amp;#x2019;s map function\n
  56. Note that this template gets rendered server-side\n
  57. Builds a query to a CouchDB view\n
  58. Handles the resultant data from the CouchDB view and prepares it for use by the Mustache template\n
  59. The widget&amp;#x2019;s Mustache template\n
  60. \n
  61. This is executed after everything else is done\n
  62. Creates a selector based on the file path, and calls the function when its namesake event is fired\n
  63. \n
  64. Rewrites to the comments list, using the all-comments view\n
  65. \n
  66. \n
  67. \n
  68. The {{&gt;header}} syntax is for partials\n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. Update this file to be a README for your CouchApp\n
  83. _attachments/index.html will be the starting point for your CouchApp\n_attachments/style/main.css should be self-explanatory\n
  84. This is the name of the design document in which your CouchApp will live\n
  85. Metadata about the CouchApp\n
  86. User made widgets, which an override vendor widgets\n
  87. The language used for functions defined within the design document\n
  88. Contains CouchDB list functions\n
  89. Contains CouchDB show functions\n
  90. Contains CouchDB update functions, which can transform arbitrary HTTP requests into document updates\n
  91. Third-party &amp;#x201C;vendor&amp;#x201D; code that ships with CouchApp as a convenience, as well as some useful Evently widgets\n
  92. Function definitions for CouchDB MapReduce views\n
  93. \n
  94. \n
  95. \n
  96. Note the account, profile, and items widgets\n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n