riak-js




JavaScript turtles all the way down
           Sean Cribbs

         http://whenchemistsattack.com/2008/04/25/turtles-all-the-way-down/
Browser


 Server


    DB
Browser   JavaScript


        Java, Ruby,
 Server
        PHP, Python


    DB       SQL
Browser   JavaScript   JavaScript


        Java, Ruby,
 Server                 node.js
        PHP, Python


    DB       SQL          SQL
Browser   JavaScript   JavaScript   JavaScript


        Java, Ruby,
 Server                 node.js       node.js
        PHP, Python


    DB       SQL          SQL       JavaScript?!
Browser   JavaScript                         JavaScript                                              JavaScript


        Java, Ruby,
 Server                                            node.js                                             node.js
        PHP, Python


    DB       SQL                                           SQL                                       JavaScript?!




                   http://animals.nationalgeographic.com/animals/reptiles/kemps-ridley-sea-turtle/
What about Couch?
 It has JavaScript.
http://captainwildchild.blogspot.com/2011/04/stopping-for-turtles.html




What about Couch?
 It has JavaScript.
http://www.comicbookmovie.com/teenage_mutant_ninja_turtles/news/?a=18553




What about Couch?
 It has JavaScript.
What is Riak?
What is Riak?


• Distributed,
  Fault-Tolerant,
  Replicated
What is Riak?


• Distributed,
  Fault-Tolerant,
  Replicated

• Scales out linearly
What is Riak?


• Distributed,
  Fault-Tolerant,
  Replicated

• Scales out linearly
• Flexible data
  model
What is Riak?


• Distributed,
  Fault-Tolerant,
  Replicated

• Scales out linearly
• Flexible data
  model
What is Riak?

                       PLUS
                            IPT!
• Distributed,      JAVASCR
  Fault-Tolerant,
  Replicated

• Scales out linearly
• Flexible data
  model
riakjs.org
Getting Started
Getting Started
 Install Riak or Riak Search:
http://downloads.basho.com
Getting Started
    Install Riak or Riak Search:
   http://downloads.basho.com

$ npm install riak-js@latest
Getting Started
    Install Riak or Riak Search:
   http://downloads.basho.com

$ npm install riak-js@latest
$ git clone git://github.com/frank06/riak-js
Getting Started
    Install Riak or Riak Search:
   http://downloads.basho.com

$ npm install riak-js@latest
$ git clone git://github.com/frank06/riak-js
Basic Client
Operations
               http://ijustwanttofitin.com/tag/rally-cars/
Basic Operations
Basic Operations
// Get a client (pass options if needed)
var db = require('riak-js').getClient()
Basic Operations
// Get a client (pass options if needed)
var db = require('riak-js').getClient()

// Fetch an object
db.get('conferences', 'nodeconf',
  function(err, data) {
    console.log("Found the conference:" +
                sys.inspect(data))
  })
Basic Operations
// Get a client (pass options if needed)
var db = require('riak-js').getClient()

// Fetch an object                    typical node
db.get('conferences', 'nodeconf',    callback style
  function(err, data) {
    console.log("Found the conference:" +
                sys.inspect(data))
  })
Basic Operations
// Get a client (pass options if needed)
var db = require('riak-js').getClient()

// Fetch an object                    typical node
db.get('conferences', 'nodeconf',    callback style
  function(err, data) {
    console.log("Found the conference:" +
                sys.inspect(data))
  })

// Store an object
db.save('conferences', 'nodeconf',
        {date:"2011-05-05",
         title: "nodeconf 2011",
         presenters: ["Sean Cribbs"]})
Basic Operations




           Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')




                                       Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')

// Does this key exist?
db.exists('frameworks', 'node.js')

// Stream the keys (on master)




                                       Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')

// Does this key exist?
db.exists('frameworks', 'node.js')

// Stream the keys (on master)
db.keys('frameworks',{keys:'stream'}).
     on('keys', cb).start()




                                         Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')

// Does this key exist?
db.exists('frameworks', 'node.js')

// Stream the keys (on master)
db.keys('frameworks',{keys:'stream'}).
     on('keys', cb).start()

// Give me them all
db.getAll('frameworks')




                                         Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')

// Does this key exist?
db.exists('frameworks', 'node.js')

// Stream the keys (on master)
db.keys('frameworks',{keys:'stream'}).
     on('keys', cb).start()

// Give me them all
db.getAll('frameworks')




                                         Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')

// Does this key exist?
db.exists('frameworks', 'node.js')

// Stream the keys (on master)
db.keys('frameworks',{keys:'stream'}).
     on('keys', cb).start()

// Give me them all
db.getAll('frameworks')

// How many are there? (counts keys)




                                         Picture: http://www.scooponpets.com/Turtlesaspets.html
Basic Operations
// Delete an object
db.remove('conferences', 'nodeconf')

// Does this key exist?
db.exists('frameworks', 'node.js')

// Stream the keys (on master)
db.keys('frameworks',{keys:'stream'}).
     on('keys', cb).start()

// Give me them all
db.getAll('frameworks')

// How many are there? (counts keys)
db.count('frameworks')



                                         Picture: http://www.scooponpets.com/Turtlesaspets.html
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)
    function cb(err, data, META){ }




          Picture: http://chronotron.files.wordpress.com/2010/07/turtles.png
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)

  • Request-time metadata
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)

  • Request-time metadata
   •contentType
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)

  • Request-time metadata
   •contentType
   •clientId
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)

  • Request-time metadata
   •contentType
   •clientId
   • links, usermeta
Meta Object
db.save(‘bucket’, ‘key’, data, META, cb)

  • Request-time metadata
   •contentType
   •clientId
   • links, usermeta
   • quorums (r,w,dw), returnBody
Meta Object
function cb(err, data, META){ }
Meta Object
 function cb(err, data, META){ }


• Response-time metadata
Meta Object
 function cb(err, data, META){ }


• Response-time metadata
 • bucket, key, vclock
Meta Object
 function cb(err, data, META){ }


• Response-time metadata
 • bucket, key, vclock
 • links, usermeta
Meta Object
 function cb(err, data, META){ }


• Response-time metadata
 • bucket, key, vclock
 • links, usermeta
 • lastMod, etag, statusCode
Using Meta
Using Meta
// Add a link to the object
db.get('frameworks', 'node.js',
  function(err, data, meta){
    meta.addLink({bucket:'vm', key:'v8', tag:'vm'});
    db.save('frameworks', 'node.js', data, meta)
  })
Using Meta
// Add a link to the object
db.get('frameworks', 'node.js',
  function(err, data, meta){
    meta.addLink({bucket:'vm', key:'v8', tag:'vm'});
    db.save('frameworks', 'node.js', data, meta)
  })

// Set the content type
db.save('pages', 'index.html',
        '<html><body>Hello, world!</body></html>',
        {contentType: 'html'})
Querying Beyond
  Key-Value




   Picture: http://greencs.files.wordpress.com/2008/07/turtle-
                              nom.jpg
Link-walking




      Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al-
                                     aquarium.html
Link-walking
// Find friends
db.walk('people', 'sean',
        [['_','friend']])




                            Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al-
                                                           aquarium.html
Link-walking
// Find friends
db.walk('people', 'sean',
        [['_','friend']])

// Find acquaintances of friends
db.walk('people', 'mathias',
        [['_','friend'],




                            Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al-
                                                           aquarium.html
Link-walking
// Find friends
db.walk('people', 'sean',
        [['_','friend']])

// Find acquaintances of friends
db.walk('people', 'mathias',
        [['_','friend'],
         ['people','_']])




                            Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al-
                                                           aquarium.html
Wait. You said Riak
had JavaScript in it!


                                           U MAD?


      Picture: http://arsnotoria.blogspot.com/2010_04_18_archive.html
MapReduce
MapReduce
  list of keys
MapReduce
                 list of keys



map()    map()      map()       map()   map()
MapReduce
                 list of keys



map()    map()      map()       map()   map()




                   reduce()
MapReduce
                 list of keys



map()    map()      map()       map()   map()




                   reduce()



                   results
MapReduce
                 list of keys
                       JSON



map()    map()      map()       map()   map()




                   reduce()



                   results
MapReduce
                            list of keys
                                  JSON



       map()       map()       map()       map()     map()
JavaScript     JavaScript     JavaScript     JavaScript      JavaScript



                              reduce()



                              results
MapReduce
                            list of keys
                                  JSON



       map()       map()       map()       map()     map()
JavaScript     JavaScript     JavaScript     JavaScript      JavaScript



                              reduce()
                              JavaScript

                              results
MapReduce
                            list of keys
                                  JSON



       map()       map()       map()       map()     map()
JavaScript     JavaScript     JavaScript     JavaScript      JavaScript



                              reduce()
                              JavaScript

                              results

                                  JSON
MapReduce
MapReduce
// Execute a MapReduce query
db.add('frameworks')         // Use all keys in bucket
  .map('Riak.mapValuesJson') // Map using a built-in
  .run(function(err, data){ // Execute the query
         console.log(data);
       })
MapReduce
// Execute a MapReduce query
db.add('frameworks')         // Use all keys in bucket
  .map('Riak.mapValuesJson') // Map using a built-in
  .run(function(err, data){ // Execute the query
         console.log(data);
       })

// Send a focused query
db.add('frameworks', 'node.js') // Start with one key
  .link({ bucket: "vm"})        // Follow some links
  .map(function(obj){           // Map using an inline
         var data =
            Riak.mapValuesJson(obj)[0];
         return [data.name]
       })
  .reduce('Riak.reduceSort')   // Sort via reduce
  .run()
MapReduce
MapReduce

// Initiate MapReduce with a key-filter
db.add({ bucket: 'emails',
         key_filters: [["ends_with", "basho.com"]] })
   // Map with a phase-argument
  .map({ name:'Riak.mapByFields',
         arg: { joined:'2010-01-01' })
  .run()
Riak Search
Riak Search

// Turn on automatic document indexing
db.enableIndex('documents')
Riak Search

// Turn on automatic document indexing
db.enableIndex('documents')

// Perform a simple search
db.search('documents', 'title:scalable')
Riak Search

// Turn on automatic document indexing
db.enableIndex('documents')

// Perform a simple search
db.search('documents', 'title:scalable')

// Start a MapReduce query with search
db.addSearch('documents', 'title:scalable')
// From here, add map and reduce phases
etc.
etc.

• Session Store
etc.

• Session Store
• Mini-Riak Test Server
etc.

• Session Store
• Mini-Riak Test Server
• Multi-protocol (HTTP, Protobuffs)
etc.

• Session Store
• Mini-Riak Test Server
• Multi-protocol (HTTP, Protobuffs)
• Luwak (large files)
COME AT ME BRO




   Picture: http://fl.biology.usgs.gov/posters/Herpetology/Snapping_Turtles/snapping_turtles.html




            Demo Time
https://github.com/basho/riaktant
Questions?
Questions?
     sean@basho.com
       @seancribbs


    jsconf.basho.com
Riak on Turtles



                           (someday)


Picture: http://scienceblogs.com/bioephemera/2008/07/gpsequipped_box_turtle_leads_p.php

riak-js: Javascript Turtles All the Way Down

  • 1.
    riak-js JavaScript turtles allthe way down Sean Cribbs http://whenchemistsattack.com/2008/04/25/turtles-all-the-way-down/
  • 2.
  • 3.
    Browser JavaScript Java, Ruby, Server PHP, Python DB SQL
  • 4.
    Browser JavaScript JavaScript Java, Ruby, Server node.js PHP, Python DB SQL SQL
  • 5.
    Browser JavaScript JavaScript JavaScript Java, Ruby, Server node.js node.js PHP, Python DB SQL SQL JavaScript?!
  • 6.
    Browser JavaScript JavaScript JavaScript Java, Ruby, Server node.js node.js PHP, Python DB SQL SQL JavaScript?! http://animals.nationalgeographic.com/animals/reptiles/kemps-ridley-sea-turtle/
  • 7.
    What about Couch? It has JavaScript.
  • 8.
  • 9.
  • 10.
  • 11.
    What is Riak? •Distributed, Fault-Tolerant, Replicated
  • 12.
    What is Riak? •Distributed, Fault-Tolerant, Replicated • Scales out linearly
  • 13.
    What is Riak? •Distributed, Fault-Tolerant, Replicated • Scales out linearly • Flexible data model
  • 14.
    What is Riak? •Distributed, Fault-Tolerant, Replicated • Scales out linearly • Flexible data model
  • 15.
    What is Riak? PLUS IPT! • Distributed, JAVASCR Fault-Tolerant, Replicated • Scales out linearly • Flexible data model
  • 16.
  • 17.
  • 18.
    Getting Started InstallRiak or Riak Search: http://downloads.basho.com
  • 19.
    Getting Started Install Riak or Riak Search: http://downloads.basho.com $ npm install riak-js@latest
  • 20.
    Getting Started Install Riak or Riak Search: http://downloads.basho.com $ npm install riak-js@latest $ git clone git://github.com/frank06/riak-js
  • 21.
    Getting Started Install Riak or Riak Search: http://downloads.basho.com $ npm install riak-js@latest $ git clone git://github.com/frank06/riak-js
  • 22.
    Basic Client Operations http://ijustwanttofitin.com/tag/rally-cars/
  • 23.
  • 24.
    Basic Operations // Geta client (pass options if needed) var db = require('riak-js').getClient()
  • 25.
    Basic Operations // Geta client (pass options if needed) var db = require('riak-js').getClient() // Fetch an object db.get('conferences', 'nodeconf',   function(err, data) {     console.log("Found the conference:" + sys.inspect(data))   })
  • 26.
    Basic Operations // Geta client (pass options if needed) var db = require('riak-js').getClient() // Fetch an object typical node db.get('conferences', 'nodeconf', callback style   function(err, data) {     console.log("Found the conference:" + sys.inspect(data))   })
  • 27.
    Basic Operations // Geta client (pass options if needed) var db = require('riak-js').getClient() // Fetch an object typical node db.get('conferences', 'nodeconf', callback style   function(err, data) {     console.log("Found the conference:" + sys.inspect(data))   }) // Store an object db.save('conferences', 'nodeconf',         {date:"2011-05-05",          title: "nodeconf 2011",          presenters: ["Sean Cribbs"]})
  • 28.
    Basic Operations Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 29.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 30.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') // Does this key exist? db.exists('frameworks', 'node.js') // Stream the keys (on master) Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 31.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') // Does this key exist? db.exists('frameworks', 'node.js') // Stream the keys (on master) db.keys('frameworks',{keys:'stream'}). on('keys', cb).start() Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 32.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') // Does this key exist? db.exists('frameworks', 'node.js') // Stream the keys (on master) db.keys('frameworks',{keys:'stream'}). on('keys', cb).start() // Give me them all db.getAll('frameworks') Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 33.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') // Does this key exist? db.exists('frameworks', 'node.js') // Stream the keys (on master) db.keys('frameworks',{keys:'stream'}). on('keys', cb).start() // Give me them all db.getAll('frameworks') Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 34.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') // Does this key exist? db.exists('frameworks', 'node.js') // Stream the keys (on master) db.keys('frameworks',{keys:'stream'}). on('keys', cb).start() // Give me them all db.getAll('frameworks') // How many are there? (counts keys) Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 35.
    Basic Operations // Deletean object db.remove('conferences', 'nodeconf') // Does this key exist? db.exists('frameworks', 'node.js') // Stream the keys (on master) db.keys('frameworks',{keys:'stream'}). on('keys', cb).start() // Give me them all db.getAll('frameworks') // How many are there? (counts keys) db.count('frameworks') Picture: http://www.scooponpets.com/Turtlesaspets.html
  • 36.
    Meta Object db.save(‘bucket’, ‘key’,data, META, cb) function cb(err, data, META){ } Picture: http://chronotron.files.wordpress.com/2010/07/turtles.png
  • 37.
  • 38.
    Meta Object db.save(‘bucket’, ‘key’,data, META, cb) • Request-time metadata
  • 39.
    Meta Object db.save(‘bucket’, ‘key’,data, META, cb) • Request-time metadata •contentType
  • 40.
    Meta Object db.save(‘bucket’, ‘key’,data, META, cb) • Request-time metadata •contentType •clientId
  • 41.
    Meta Object db.save(‘bucket’, ‘key’,data, META, cb) • Request-time metadata •contentType •clientId • links, usermeta
  • 42.
    Meta Object db.save(‘bucket’, ‘key’,data, META, cb) • Request-time metadata •contentType •clientId • links, usermeta • quorums (r,w,dw), returnBody
  • 43.
  • 44.
    Meta Object functioncb(err, data, META){ } • Response-time metadata
  • 45.
    Meta Object functioncb(err, data, META){ } • Response-time metadata • bucket, key, vclock
  • 46.
    Meta Object functioncb(err, data, META){ } • Response-time metadata • bucket, key, vclock • links, usermeta
  • 47.
    Meta Object functioncb(err, data, META){ } • Response-time metadata • bucket, key, vclock • links, usermeta • lastMod, etag, statusCode
  • 48.
  • 49.
    Using Meta // Adda link to the object db.get('frameworks', 'node.js',   function(err, data, meta){     meta.addLink({bucket:'vm', key:'v8', tag:'vm'});     db.save('frameworks', 'node.js', data, meta)   })
  • 50.
    Using Meta // Adda link to the object db.get('frameworks', 'node.js',   function(err, data, meta){     meta.addLink({bucket:'vm', key:'v8', tag:'vm'});     db.save('frameworks', 'node.js', data, meta)   }) // Set the content type db.save('pages', 'index.html',         '<html><body>Hello, world!</body></html>',         {contentType: 'html'})
  • 51.
    Querying Beyond Key-Value Picture: http://greencs.files.wordpress.com/2008/07/turtle- nom.jpg
  • 52.
    Link-walking Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al- aquarium.html
  • 53.
    Link-walking // Find friends db.walk('people','sean', [['_','friend']]) Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al- aquarium.html
  • 54.
    Link-walking // Find friends db.walk('people','sean', [['_','friend']]) // Find acquaintances of friends db.walk('people', 'mathias',         [['_','friend'], Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al- aquarium.html
  • 55.
    Link-walking // Find friends db.walk('people','sean', [['_','friend']]) // Find acquaintances of friends db.walk('people', 'mathias',         [['_','friend'],          ['people','_']]) Picture: http://fisherwy.blogspot.com/2007/09/two-headed-turtle-at-big-al- aquarium.html
  • 56.
    Wait. You saidRiak had JavaScript in it! U MAD? Picture: http://arsnotoria.blogspot.com/2010_04_18_archive.html
  • 57.
  • 58.
  • 59.
    MapReduce list of keys map() map() map() map() map()
  • 60.
    MapReduce list of keys map() map() map() map() map() reduce()
  • 61.
    MapReduce list of keys map() map() map() map() map() reduce() results
  • 62.
    MapReduce list of keys JSON map() map() map() map() map() reduce() results
  • 63.
    MapReduce list of keys JSON map() map() map() map() map() JavaScript JavaScript JavaScript JavaScript JavaScript reduce() results
  • 64.
    MapReduce list of keys JSON map() map() map() map() map() JavaScript JavaScript JavaScript JavaScript JavaScript reduce() JavaScript results
  • 65.
    MapReduce list of keys JSON map() map() map() map() map() JavaScript JavaScript JavaScript JavaScript JavaScript reduce() JavaScript results JSON
  • 66.
  • 67.
    MapReduce // Execute aMapReduce query db.add('frameworks') // Use all keys in bucket   .map('Riak.mapValuesJson') // Map using a built-in   .run(function(err, data){ // Execute the query          console.log(data);        })
  • 68.
    MapReduce // Execute aMapReduce query db.add('frameworks') // Use all keys in bucket   .map('Riak.mapValuesJson') // Map using a built-in   .run(function(err, data){ // Execute the query          console.log(data);        }) // Send a focused query db.add('frameworks', 'node.js') // Start with one key   .link({ bucket: "vm"}) // Follow some links   .map(function(obj){ // Map using an inline          var data =             Riak.mapValuesJson(obj)[0];          return [data.name]        })   .reduce('Riak.reduceSort') // Sort via reduce   .run()
  • 69.
  • 70.
    MapReduce // Initiate MapReducewith a key-filter db.add({ bucket: 'emails',          key_filters: [["ends_with", "basho.com"]] }) // Map with a phase-argument   .map({ name:'Riak.mapByFields',          arg: { joined:'2010-01-01' })   .run()
  • 71.
  • 72.
    Riak Search // Turnon automatic document indexing db.enableIndex('documents')
  • 73.
    Riak Search // Turnon automatic document indexing db.enableIndex('documents') // Perform a simple search db.search('documents', 'title:scalable')
  • 74.
    Riak Search // Turnon automatic document indexing db.enableIndex('documents') // Perform a simple search db.search('documents', 'title:scalable') // Start a MapReduce query with search db.addSearch('documents', 'title:scalable') // From here, add map and reduce phases
  • 75.
  • 76.
  • 77.
    etc. • Session Store •Mini-Riak Test Server
  • 78.
    etc. • Session Store •Mini-Riak Test Server • Multi-protocol (HTTP, Protobuffs)
  • 79.
    etc. • Session Store •Mini-Riak Test Server • Multi-protocol (HTTP, Protobuffs) • Luwak (large files)
  • 80.
    COME AT MEBRO Picture: http://fl.biology.usgs.gov/posters/Herpetology/Snapping_Turtles/snapping_turtles.html Demo Time https://github.com/basho/riaktant
  • 81.
  • 82.
    Questions? sean@basho.com @seancribbs jsconf.basho.com
  • 83.
    Riak on Turtles (someday) Picture: http://scienceblogs.com/bioephemera/2008/07/gpsequipped_box_turtle_leads_p.php

Editor's Notes

  • #2 \n
  • #3 Like all these turtles marching toward the sea, we&amp;#x2019;re on a path. And that path is the adoption of JavaScript in lots of places it hasn&amp;#x2019;t been before.\n
  • #4 Like all these turtles marching toward the sea, we&amp;#x2019;re on a path. And that path is the adoption of JavaScript in lots of places it hasn&amp;#x2019;t been before.\n
  • #5 Like all these turtles marching toward the sea, we&amp;#x2019;re on a path. And that path is the adoption of JavaScript in lots of places it hasn&amp;#x2019;t been before.\n
  • #6 Like all these turtles marching toward the sea, we&amp;#x2019;re on a path. And that path is the adoption of JavaScript in lots of places it hasn&amp;#x2019;t been before.\n
  • #7 So you&amp;#x2019;re probably saying &amp;#x201C;What about CouchDB? It has JavaScript&amp;#x201D;. \n\nCouchDB is great. I like it a lot. (apologies for the strawman) But it has been my experience that the types of applications people build on top of CouchDB are very different from the types of apps people build with Node.js. And you don&amp;#x2019;t want to end up like this turtle.\n\nYou want to be like these turtles!\n
  • #8 So you&amp;#x2019;re probably saying &amp;#x201C;What about CouchDB? It has JavaScript&amp;#x201D;. \n\nCouchDB is great. I like it a lot. (apologies for the strawman) But it has been my experience that the types of applications people build on top of CouchDB are very different from the types of apps people build with Node.js. And you don&amp;#x2019;t want to end up like this turtle.\n\nYou want to be like these turtles!\n
  • #9 So you&amp;#x2019;re probably saying &amp;#x201C;What about CouchDB? It has JavaScript&amp;#x201D;. \n\nCouchDB is great. I like it a lot. (apologies for the strawman) But it has been my experience that the types of applications people build on top of CouchDB are very different from the types of apps people build with Node.js. And you don&amp;#x2019;t want to end up like this turtle.\n\nYou want to be like these turtles!\n
  • #10 So you&amp;#x2019;re probably saying &amp;#x201C;What about CouchDB? It has JavaScript&amp;#x201D;. \n\nCouchDB is great. I like it a lot. (apologies for the strawman) But it has been my experience that the types of applications people build on top of CouchDB are very different from the types of apps people build with Node.js. And you don&amp;#x2019;t want to end up like this turtle.\n\nYou want to be like these turtles!\n
  • #11 * &amp;#x201C;Your data is safe with us.&amp;#x201D;\n* &amp;#x201C;Just add more machines.&amp;#x201D;\n* &amp;#x201C;Key-Value++, MapReduce, Search. With great power comes great responsibility - take ownership of your data.&amp;#x201D;\n
  • #12 * &amp;#x201C;Your data is safe with us.&amp;#x201D;\n* &amp;#x201C;Just add more machines.&amp;#x201D;\n* &amp;#x201C;Key-Value++, MapReduce, Search. With great power comes great responsibility - take ownership of your data.&amp;#x201D;\n
  • #13 * &amp;#x201C;Your data is safe with us.&amp;#x201D;\n* &amp;#x201C;Just add more machines.&amp;#x201D;\n* &amp;#x201C;Key-Value++, MapReduce, Search. With great power comes great responsibility - take ownership of your data.&amp;#x201D;\n
  • #14 * &amp;#x201C;Your data is safe with us.&amp;#x201D;\n* &amp;#x201C;Just add more machines.&amp;#x201D;\n* &amp;#x201C;Key-Value++, MapReduce, Search. With great power comes great responsibility - take ownership of your data.&amp;#x201D;\n
  • #15 * &amp;#x201C;Your data is safe with us.&amp;#x201D;\n* &amp;#x201C;Just add more machines.&amp;#x201D;\n* &amp;#x201C;Key-Value++, MapReduce, Search. With great power comes great responsibility - take ownership of your data.&amp;#x201D;\n
  • #16 So if you want to work with Riak from node.js, Francisco Treacy &lt;point him out&gt; wrote this awesome driver called riak-js. It&amp;#x2019;s also got a beautiful website at riakjs.org that is envy of all READMEs.\n
  • #17 \n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 \n
  • #22 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #23 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #24 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #25 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #26 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #27 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #28 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #29 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #30 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #31 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #32 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #33 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #34 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #35 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #36 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #37 Pretty much every API function takes a callback which receives the results - will be eliding the callback except where necessary.\n
  • #38 \n
  • #39 \n
  • #40 \n
  • #41 \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 \n
  • #56 \n
  • #57 \n
  • #58 \n
  • #59 \n
  • #60 \n
  • #61 \n
  • #62 \n
  • #63 \n
  • #64 \n
  • #65 \n
  • #66 \n
  • #67 \n
  • #68 \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 \n
  • #83 \n
  • #84 \n
  • #85 \n
  • #86 \n
  • #87 \n
  • #88 \n
  • #89 \n
  • #90 \n
  • #91 \n
  • #92 \n
  • #93 \n
  • #94 \n
  • #95 \n
  • #96 \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
  • #113 \n
  • #114 \n
  • #115 \n
  • #116 \n
  • #117 \n
  • #118 \n
  • #119 \n
  • #120 \n
  • #121 \n
  • #122 Hosted on no.de\n
  • #123 \n
  • #124 \n
  • #125 \n