0
CouchDB     relax
CouchDB                           relax                              Sander van de Graaf                                  ...
http://joind.in/talk/view/2495second talk ever, please provide feedback
CONTENTS• Introduction• PHP   Usage• Replication/Scalability• Backend   usage• Couchapps• Other   stuff
CouchDB     relax
NOSQL
IT’S A MOVEMENTMovement, definitions vary
1998Back in the day...
Lame movie 1
Another one
And then some more...
XML was introduced
Some game was published
MC Donald’s Happy Meal
Carlo StrozziReleased NOSQL open source DB
NOSQL == Not Only SQL
“[The NoSQL movement] departs from the relationalmodel altogether, it should therefore have been calledmore appropriately ...
CouchDB     relax
Ubuntu One, contacts sync
NUTSHELL
SPEEDSpeed Not diskpace (see cleanup)
APPEND ONLYAppend only storage, happy cup of coffee!
NO REPAIR NEEDED
COMPACTING
HTTP SERVERcaching, loadbalancing, without extracosts :D
CAP
CouchDB CAP
CouchDB       EVENTUALLY CONSISTENTCouchDB focus is on Availability + Reliability, and will beconsistent after replication.
FULL REST API
REST• GET        • SELECT• PUT        • UPDATE• POST       • INSERT• DELETE     • DELETE• COPY       • ...
JSON    {        total_rows: 2,        offset: 0,        rows: [            {                id: _design/foobar,          ...
REPLICATIONKey feature, relaxed about replicationissues, and version conflicts
Welcome to Futon, I prefer a UI
http-console rocks the socks out of telnet
Berkeley
CONTENTS• Introduction• PHP   Usage• Replication/Scalability• Backend   usage• Couchapps• Other   stuff
PHP USAGE
PHP LIBRARIES  • PHPillow     (LGPL)  • PHP    Object Freezer (BSD)  • PHP    On Couch (GPL 2 / 3)  • PHP    CouchDB Exten...
<?PHP  // setup connection for couchdb  $client = new Couchdb_Client(http://ponies.couchone.com:5984,rainbows);  // fetch ...
CONTENTS• Introduction• PHP   Usage• Replication/Scalability• Backend   usage• Couchapps• Other   stuff
REPLICATION
DEFINITION“Replication is the process of sharing information soas to ensure consistency between redundantresources, such a...
CouchDB     relax
CouchDB     relax             CouchDB                  relax
CouchDB
CouchDB                            relax          CouchDB               relax                       CouchDB               ...
CouchDB                relax                         CouchDB                              relaxMaster, Master replication
CouchDB                  relaxCouchDB     relax             CouchDB                  relax
US   NL                             CouchDB                                  relax           CouchDB                relax ...
P2P WEB
“World Domination”
CLUSTERING  “The fun stuff ”
Couchdb doesn’t support partitioning (sharding) itself, couchdb -> http based -> lots ofpossibilities
loadbalancer                                                                   ...n              CouchDB                  ...
CHALLENGES• Large   amounts of data• Large   views (with big/long map/reduce queries)• LOTS    of traffic• Location   based...
MAP/REDUCE
INPUT           IP                 Bytes     212.122.174.13           18271     212.122.174.13           191726     212.12...
MAPPER => REDUCER      IP         Bytes                 18271                 191726212.122.174.13                  198   ...
AFTER REDUCE      IP          Bytes212.122.174.13   210238 74.119.8.111    99643
PARTITION INPUT Partition           IP         Bytes    0          212.122.174.13   18271    0          212.122.174.13   1...
MAPPER => REDUCER   Partition                         IP                         Bytes                                    ...
AFTER REDUCE      IP          Bytes212.122.174.13   210238 74.119.8.111    99643
CLUSTERING OPTIONS• CouchDB    Lounge• Pillow• BigCouch
LOUNGE• partitioning/clustering• Nginx    module• meebo.com• ‘easy’• http://tilgovi.github.com/couchdb-lounge/
LOUNGE • dumb_proxy         => proxy for simple PUT/GET’s • smart_proxy        => proxy for map/reduce over shards • repli...
nginx                             dumb_proxy                                           ...n            CouchDB            ...
nginx                                   smart_proxy                                                                  ...n ...
Bonus:                    other nginx modules work toomod_cache, mod_expire, etc.
PILLOW• Erlang   based• router/rereducer   (map/reduce over multiple systems)• In   development (but promising!)• https://...
BIGCOUCH• Fork• 100%   api compatible• Open   Source/Commercial• https://cloudant.com/#!/solutions/bigcouch
CONTENTS• Introduction• PHP   Usage• Replication/Scalability• Backend   usage• Couchapps• Other   stuff
BACKEND USAGE
PROXIED                                       CouchDB                                            relaxproxied via middlewa...
DIRECT                                                           CouchDB                                                  ...
NOSQL && SQL HYBRID• onSave, onCommit      hooks available in every major framework• onSave -> make a JSON representation ...
MODEL<?phpclass Pony extends Application_models{    public function toArray()    {        $data = $this->_getData();      ...
AFTER_SAVE<?phpclass article_module extends admin_module{    public function after_save()    {        parent::after_save()...
PROXY            RewriteEngine On            RewriteRule /data/(.*)      http://127.0.0.1:5984/db/$1 [P,L]Proxy the calls ...
JAVASCRIPT<script type="text/javascript">$.getJSON("/db/ponies/_design/ponies/_view/best-ponies?include_docs=true",    fun...
CONTENTS• Introduction• PHP   Usage• Replication/Scalability• Backend   usage• Couchapps• Other   stuff
COUCHAPPCouchDB has it’s own structure for “distributed, scalable web applications” called couchapps
“Distributed, scalable, web   applications you say?omgwtfbbq!?!1!!!11!1!eleven”
_attachmentsthe magic is in _attachments
CouchDB                                    relax                CouchDB                     relax                         ...
INSTALLATION                         Couchapp 0.7.0installation is easy
$ couchapp initinit a project
LAYOUTcreates a default folder
$ couchapp push http://ponies.couchone.com:5984/rainbows
https://github.com/brandon-beacher/couchapp-tmbundlecouchapp push on save -> textmate
CONTENTS• Introduction• PHP   Usage• Replication/Scalability• Backend   usage• Couchapps• Other   stuff
OTHER STUFF
REWRITES
_REWRITE
$ curl "http://ponies.couchone.com/rainbows/_design/ponies/_view/best-ponies?descending=true&limit=5&key=”foobar”
such urls make us a sad panda
{    ....    "rewrites": [    {        "from": "/best-5-ponies",        "to": "ponies/_view/best-ponies",        "method":...
$ curl "http://ponies.couchone.com/rainbows/_design/ponies/_view/best- ponies?descending=true&limit=5&key=”foobar”rewrite ...
$ curl "http://ponies.couchone.com/rainbows/_design/ponies/_rewrite/best-5-ponies"to this
[vhosts]awesomeponies.com = /rainbows/_design/ponies/_rewrite
$ curl "http://ponies.couchone.com/rainbows/_design/ponies/_rewrite/best-5-ponies"rewrite this
$ curl "http://awesomeponies.com/best-5-ponies"to this
_CHANGES
$ curl -X GET "http://ponies.couchone.com/rainbows/_changes"
{"results":[],"last_seq":0}
curl -X PUT http://ponies.couchone.come/rainbows/foobar -d {"type":"awesome"}
{"results":[{"seq":1,"id":"foobar","changes":[{"rev":"1-aaa8e2a031bca334f50b48b6682fb486"}]}],"last_seq":1}
{"results":[{"seq":1,"id":"foobar","changes":[{"rev":"1-aaa8e2a031bca334f50b48b6682fb486"}]},{"seq":2,"id":"foobar2","chan...
_CHANGES OPTIONS• ?since• Longpolling• Continuous
$ curl -X GET "http://ponies.couchone.com/rainbows/_changes?since=20"
curl -X GET "http://ponies.couchone.com/rainbows/_changes?feed=longpoll&since=2"Longpolling: good for little updates, conn...
curl -X GET "http://ponies.couchone.com/rainbows/_changes?feed=continuous&since=2"Connections stays open, and you get upda...
FILTERSfilters can be used to filter documents from output
function(doc, req)                           {                               if(doc.priority == high)                     ...
curl -X GET"http://ponies.couchone.com/rainbows/_changes?feed=continuous&filter=app/important
function(doc, req)                        {                            if(doc.name == req.query.name) {                   ...
curl -X GET"http://ponies.couchone.com/rainbows/_changes?feed=continuous&filter=app/name&name=foobar
SHOWS
function(doc, req) {  return {    body: "Hello World"  }}
curl -X"http://ponies.couchone.com/rainbows/_design/foobar/_show/showfunction/docid"
function(doc) {                            return {                                "code": 302,                           ...
LUCENE
[external]fti=/path/to/python /path/to/couchdb-lucene/tools/couchdb-external-hook.py[httpd_db_handlers]_fti = {couch_httpd...
function(doc) {    var ret=new Document();    ret.add(doc.message);    ret.add(new Date(doc.datetime));    return ret;}
curl -X GET"http://ponies.couchone.com/rainbows/_fti/_design/unicorns/by-query?q=foobar"
GEOCOUCHhttps://github.com/vmx/couchdb
See Dericks talk yesterday
GEOCOUCH    • Supports     bbox    • fork    • outputs    via lists, georss possible    • directly   useable by google map...
SPATIAL INDEX                                       in spatial/points.jsfunction(doc){    if (doc.geo && doc.geo.latitude ...
Worldwide searchhttp://ponies.couchone.com/rainbows/_design/unicorns/_spatial/points?bbox=0,0,180,90    {"update_seq":3,"r...
GEORSS && GOOGLE MAPSif (GBrowserIsCompatible()){    map = new GMap2(document.getElementById(map));    var geoXML = new GG...
curl -X GET "http://ponies.couchone.com/rainbows/_design/alarmeringen/_spatial/points?bbox=51.711369,4.218407,52.136520,4....
Q?
http://www.couchone.com/get
http://joind.in/talk/view/2495second talk ever, please provide feedback
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Advanced CouchDB
Upcoming SlideShare
Loading in...5
×

Advanced CouchDB

7,974

Published on

http://joind.in/2495

PHPBenelux conference January 2011

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,974
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
124
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Transcript of "Advanced CouchDB"

  1. 1. CouchDB relax
  2. 2. CouchDB relax Sander van de Graaf @svdgraafFocus -> practical usage examples
  3. 3. http://joind.in/talk/view/2495second talk ever, please provide feedback
  4. 4. CONTENTS• Introduction• PHP Usage• Replication/Scalability• Backend usage• Couchapps• Other stuff
  5. 5. CouchDB relax
  6. 6. NOSQL
  7. 7. IT’S A MOVEMENTMovement, definitions vary
  8. 8. 1998Back in the day...
  9. 9. Lame movie 1
  10. 10. Another one
  11. 11. And then some more...
  12. 12. XML was introduced
  13. 13. Some game was published
  14. 14. MC Donald’s Happy Meal
  15. 15. Carlo StrozziReleased NOSQL open source DB
  16. 16. NOSQL == Not Only SQL
  17. 17. “[The NoSQL movement] departs from the relationalmodel altogether, it should therefore have been calledmore appropriately ‘NoREL’, or something to thateffect.” - Carlo Strozzi
  18. 18. CouchDB relax
  19. 19. Ubuntu One, contacts sync
  20. 20. NUTSHELL
  21. 21. SPEEDSpeed Not diskpace (see cleanup)
  22. 22. APPEND ONLYAppend only storage, happy cup of coffee!
  23. 23. NO REPAIR NEEDED
  24. 24. COMPACTING
  25. 25. HTTP SERVERcaching, loadbalancing, without extracosts :D
  26. 26. CAP
  27. 27. CouchDB CAP
  28. 28. CouchDB EVENTUALLY CONSISTENTCouchDB focus is on Availability + Reliability, and will beconsistent after replication.
  29. 29. FULL REST API
  30. 30. REST• GET • SELECT• PUT • UPDATE• POST • INSERT• DELETE • DELETE• COPY • ...
  31. 31. JSON { total_rows: 2, offset: 0, rows: [ { id: _design/foobar, key: _design/foobar, value: { rev: 5-982b2fc36835715b2aae54609b5d5f1e } }, { id: f0e1fd96eb6e094f74dda8d949000a6a, key: f0e1fd96eb6e094f74dda8d949000a6a, value: { rev: 1-86bca407fce8234a63c90ff549b56b10 } }, ] }Javascript == awesome! :D
  32. 32. REPLICATIONKey feature, relaxed about replicationissues, and version conflicts
  33. 33. Welcome to Futon, I prefer a UI
  34. 34. http-console rocks the socks out of telnet
  35. 35. Berkeley
  36. 36. CONTENTS• Introduction• PHP Usage• Replication/Scalability• Backend usage• Couchapps• Other stuff
  37. 37. PHP USAGE
  38. 38. PHP LIBRARIES • PHPillow (LGPL) • PHP Object Freezer (BSD) • PHP On Couch (GPL 2 / 3) • PHP CouchDB Extension (PHP license) • SAG for CouchDB (apache) • Doctrine 2 CouchDB ODMAll are quite nice, doctrine has some rough edges, I use PHP On Couch with custom patch forZend autoloader easyness
  39. 39. <?PHP // setup connection for couchdb $client = new Couchdb_Client(http://ponies.couchone.com:5984,rainbows); // fetch a document $doc = $client->getDoc(awesome_pony); // updating document $doc->newproperty = array("type","awesome"); try { $client->storeDoc($doc); } catch (Exception $e) { echo "Document storage failed : " . $e->getMessage(); }PHP On Couch with small ZF autoloader fix
  40. 40. CONTENTS• Introduction• PHP Usage• Replication/Scalability• Backend usage• Couchapps• Other stuff
  41. 41. REPLICATION
  42. 42. DEFINITION“Replication is the process of sharing information soas to ensure consistency between redundantresources, such as software or hardware components,to improve reliability, fault-tolerance, or accessibility.” Source: wikipedia
  43. 43. CouchDB relax
  44. 44. CouchDB relax CouchDB relax
  45. 45. CouchDB
  46. 46. CouchDB relax CouchDB relax CouchDB relax CouchDB relaxMysql can do this
  47. 47. CouchDB relax CouchDB relaxMaster, Master replication
  48. 48. CouchDB relaxCouchDB relax CouchDB relax
  49. 49. US NL CouchDB relax CouchDB relax BE CouchDB relaxNot only locally
  50. 50. P2P WEB
  51. 51. “World Domination”
  52. 52. CLUSTERING “The fun stuff ”
  53. 53. Couchdb doesn’t support partitioning (sharding) itself, couchdb -> http based -> lots ofpossibilities
  54. 54. loadbalancer ...n CouchDB relax CouchDB relaxThe basics are all the same: easy => couchdb instances 1..n => loadbalancer
  55. 55. CHALLENGES• Large amounts of data• Large views (with big/long map/reduce queries)• LOTS of traffic• Location based partitions• For fun and profit
  56. 56. MAP/REDUCE
  57. 57. INPUT IP Bytes 212.122.174.13 18271 212.122.174.13 191726 212.122.174.13 198 74.119.8.111 91272 74.119.8.111 8371 212.122.174.13 43Map/Reduce example
  58. 58. MAPPER => REDUCER IP Bytes 18271 191726212.122.174.13 198 43 91272 74.119.8.111 8371
  59. 59. AFTER REDUCE IP Bytes212.122.174.13 210238 74.119.8.111 99643
  60. 60. PARTITION INPUT Partition IP Bytes 0 212.122.174.13 18271 0 212.122.174.13 191726 0 212.122.174.13 198 1 74.119.8.111 91272 1 74.119.8.111 8371 0 212.122.174.13 43Map/Reduce example
  61. 61. MAPPER => REDUCER Partition IP Bytes 18271 191726 0 212.122.174.13 198 43 91272 1 74.119.8.111 8371If data is big enough, you could even need a re-re-re-reducer
  62. 62. AFTER REDUCE IP Bytes212.122.174.13 210238 74.119.8.111 99643
  63. 63. CLUSTERING OPTIONS• CouchDB Lounge• Pillow• BigCouch
  64. 64. LOUNGE• partitioning/clustering• Nginx module• meebo.com• ‘easy’• http://tilgovi.github.com/couchdb-lounge/
  65. 65. LOUNGE • dumb_proxy => proxy for simple PUT/GET’s • smart_proxy => proxy for map/reduce over shards • replicator => updates all copies, redudantlyit can make sure that there are N copies of a document at every moment
  66. 66. nginx dumb_proxy ...n CouchDB relax CouchDB relaxdumb_proxy == ONLY GET/PUT
  67. 67. nginx smart_proxy ...n CouchDB relax CouchDB relaxsmart_proxy takes care of the map/reduce and re-reducers over multiple nodes
  68. 68. Bonus: other nginx modules work toomod_cache, mod_expire, etc.
  69. 69. PILLOW• Erlang based• router/rereducer (map/reduce over multiple systems)• In development (but promising!)• https://github.com/khellan/Pillow
  70. 70. BIGCOUCH• Fork• 100% api compatible• Open Source/Commercial• https://cloudant.com/#!/solutions/bigcouch
  71. 71. CONTENTS• Introduction• PHP Usage• Replication/Scalability• Backend usage• Couchapps• Other stuff
  72. 72. BACKEND USAGE
  73. 73. PROXIED CouchDB relaxproxied via middleware, or via mod_proxy or similiar
  74. 74. DIRECT CouchDB relaxor direct, because http based, content is directly available in javascript
  75. 75. NOSQL && SQL HYBRID• onSave, onCommit hooks available in every major framework• onSave -> make a JSON representation of your object, and PUT it to couchdb (#protip: only ‘public’ data)• sql db is leading, you don’t care about versioning in couchdb• youcan use your data directly from couchdb within your frontend javascript
  76. 76. MODEL<?phpclass Pony extends Application_models{ public function toArray() { $data = $this->_getData(); unset($data[created_on]); unset($data[created_by]); unset($data[access_level]); unset($data[private_data]); $data[tags] = $this->getTags(); $data[categories] = $this->getCategories(); $data[rainbows] = double; return $data; }}
  77. 77. AFTER_SAVE<?phpclass article_module extends admin_module{ public function after_save() { parent::after_save(); $data = $this->toJson(); $res = CouchDB::put($data); $this->_id = $res->_id; $this->_rev = $res->_rev; }}
  78. 78. PROXY RewriteEngine On RewriteRule /data/(.*) http://127.0.0.1:5984/db/$1 [P,L]Proxy the calls (work around sandbox/other domain error), or use jsonp
  79. 79. JAVASCRIPT<script type="text/javascript">$.getJSON("/db/ponies/_design/ponies/_view/best-ponies?include_docs=true", function(res){ for(i in res.rows) { doc = res.rows[i].doc; // do stuff } });</script>
  80. 80. CONTENTS• Introduction• PHP Usage• Replication/Scalability• Backend usage• Couchapps• Other stuff
  81. 81. COUCHAPPCouchDB has it’s own structure for “distributed, scalable web applications” called couchapps
  82. 82. “Distributed, scalable, web applications you say?omgwtfbbq!?!1!!!11!1!eleven”
  83. 83. _attachmentsthe magic is in _attachments
  84. 84. CouchDB relax CouchDB relax CouchDB relaxdistribution via replication
  85. 85. INSTALLATION Couchapp 0.7.0installation is easy
  86. 86. $ couchapp initinit a project
  87. 87. LAYOUTcreates a default folder
  88. 88. $ couchapp push http://ponies.couchone.com:5984/rainbows
  89. 89. https://github.com/brandon-beacher/couchapp-tmbundlecouchapp push on save -> textmate
  90. 90. CONTENTS• Introduction• PHP Usage• Replication/Scalability• Backend usage• Couchapps• Other stuff
  91. 91. OTHER STUFF
  92. 92. REWRITES
  93. 93. _REWRITE
  94. 94. $ curl "http://ponies.couchone.com/rainbows/_design/ponies/_view/best-ponies?descending=true&limit=5&key=”foobar”
  95. 95. such urls make us a sad panda
  96. 96. { .... "rewrites": [ { "from": "/best-5-ponies", "to": "ponies/_view/best-ponies", "method": "GET", "query": { "descending": true, "limit": 5, "key": "foobar" } } ]}
  97. 97. $ curl "http://ponies.couchone.com/rainbows/_design/ponies/_view/best- ponies?descending=true&limit=5&key=”foobar”rewrite this
  98. 98. $ curl "http://ponies.couchone.com/rainbows/_design/ponies/_rewrite/best-5-ponies"to this
  99. 99. [vhosts]awesomeponies.com = /rainbows/_design/ponies/_rewrite
  100. 100. $ curl "http://ponies.couchone.com/rainbows/_design/ponies/_rewrite/best-5-ponies"rewrite this
  101. 101. $ curl "http://awesomeponies.com/best-5-ponies"to this
  102. 102. _CHANGES
  103. 103. $ curl -X GET "http://ponies.couchone.com/rainbows/_changes"
  104. 104. {"results":[],"last_seq":0}
  105. 105. curl -X PUT http://ponies.couchone.come/rainbows/foobar -d {"type":"awesome"}
  106. 106. {"results":[{"seq":1,"id":"foobar","changes":[{"rev":"1-aaa8e2a031bca334f50b48b6682fb486"}]}],"last_seq":1}
  107. 107. {"results":[{"seq":1,"id":"foobar","changes":[{"rev":"1-aaa8e2a031bca334f50b48b6682fb486"}]},{"seq":2,"id":"foobar2","changes":[{"rev":"1-e18422e6a82d0f2157d74b5dcf457997"}]}],"last_seq":2}
  108. 108. _CHANGES OPTIONS• ?since• Longpolling• Continuous
  109. 109. $ curl -X GET "http://ponies.couchone.com/rainbows/_changes?since=20"
  110. 110. curl -X GET "http://ponies.couchone.com/rainbows/_changes?feed=longpoll&since=2"Longpolling: good for little updates, connections stays open until change, then gets closedand you need to reconnect, lots of reconnects for lots of updates
  111. 111. curl -X GET "http://ponies.couchone.com/rainbows/_changes?feed=continuous&since=2"Connections stays open, and you get updates on the fly!
  112. 112. FILTERSfilters can be used to filter documents from output
  113. 113. function(doc, req) { if(doc.priority == high) { return true; } return false; }we only want high priority documents
  114. 114. curl -X GET"http://ponies.couchone.com/rainbows/_changes?feed=continuous&filter=app/important
  115. 115. function(doc, req) { if(doc.name == req.query.name) { return true; } return false; }you can use req for request based filters
  116. 116. curl -X GET"http://ponies.couchone.com/rainbows/_changes?feed=continuous&filter=app/name&name=foobar
  117. 117. SHOWS
  118. 118. function(doc, req) { return { body: "Hello World" }}
  119. 119. curl -X"http://ponies.couchone.com/rainbows/_design/foobar/_show/showfunction/docid"
  120. 120. function(doc) { return { "code": 302, "body": "See other", "headers": { "Location": doc.target } }; }You can also define http headers, we used this for translating public id’s into private storageid’s. In this way, couchdb took care of all the headers and http stuff, and we could use aregular nginx proxy module
  121. 121. LUCENE
  122. 122. [external]fti=/path/to/python /path/to/couchdb-lucene/tools/couchdb-external-hook.py[httpd_db_handlers]_fti = {couch_httpd_external, handle_external_req, <<"fti">>}
  123. 123. function(doc) { var ret=new Document(); ret.add(doc.message); ret.add(new Date(doc.datetime)); return ret;}
  124. 124. curl -X GET"http://ponies.couchone.com/rainbows/_fti/_design/unicorns/by-query?q=foobar"
  125. 125. GEOCOUCHhttps://github.com/vmx/couchdb
  126. 126. See Dericks talk yesterday
  127. 127. GEOCOUCH • Supports bbox • fork • outputs via lists, georss possible • directly useable by google maps • can read GIS data • combined with _changes makes interesting usecase- bbox => all items withing a certain bounding box, polygon is in the works- currently a fork of couchdb, in the works as external module- output can be setup seperately- google maps can use georss- GIS: Geographic Information System (used worldwide?)
  128. 128. SPATIAL INDEX in spatial/points.jsfunction(doc){ if (doc.geo && doc.geo.latitude != && doc.geo.longitude != ) { emit( { type: "Point", coordinates: [parseFloat(doc.geo.latitude), parseFloat(doc.geo.longitude)] }, [doc._id, doc] ); }}
  129. 129. Worldwide searchhttp://ponies.couchone.com/rainbows/_design/unicorns/_spatial/points?bbox=0,0,180,90 {"update_seq":3,"rows":[ { "id":"augsburg", "bbox":[10.898333,48.371667,10.898333,48.371667], "value":["augsburg",[10.898333,48.371667]] } ]}
  130. 130. GEORSS && GOOGLE MAPSif (GBrowserIsCompatible()){ map = new GMap2(document.getElementById(map)); var geoXML = new GGeoXml(http://ponies.couchone.com/rainbows/url-to-georss-view); map.addOverlay(geoXML);}
  131. 131. curl -X GET "http://ponies.couchone.com/rainbows/_design/alarmeringen/_spatial/points?bbox=51.711369,4.218407,52.136520,4.745740";
  132. 132. Q?
  133. 133. http://www.couchone.com/get
  134. 134. http://joind.in/talk/view/2495second talk ever, please provide feedback
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×