Upload
dodat
View
224
Download
0
Embed Size (px)
Citation preview
NodeJS and JavaScript-everywhere
Matthew EernisseYOW Conference: December 2011
Tuesday, December 6, 11
A list of stuff• Ruby
• JavaScript
• Scala
• Java
• C#
• Rails
• NodeJS
• PostgreSQL
• Memcache
• Riak
• Redis
• BDB
• Vertica
• R
Tuesday, December 6, 11
JavaScript at Yammer• Browsers YamJS, a.k.a.,“YamJuice”
• Adobe AIR Desktop
• V8 in Rails via TheRubyRacer
• NodeJS
Tuesday, December 6, 11
• Netscape Enterprise Server (OG SSJS)
• Microsoft IIS
• Helma (now RingoJS)
• Whitebeam
• Zimki
• Jaxer
• Perservere
• Nitro
• Google App Engine
• CouchDB
• NodeJS
SSJS
Tuesday, December 6, 11
Why NodeJS?
• Death of Netscape
• Open source
• Yegge’s NBL, 2007-02-10
• Competition
• V8
Tuesday, December 6, 11
NodeJS:“Evented I/O for V8 JavaScript”
http://nodejs.org/
Tuesday, December 6, 11
var http = require('http');http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}).listen(1337, "127.0.0.1");console.log('Server running at ' + ' http://127.0.0.1:1337/');
Hello, NodeJS
Tuesday, December 6, 11
Jake build toolhttps://github.com/mde/jake
• Tasks, prerequisites
• File tasks, directory tasks
• Namespaces
• PackageTasks
• Just executable JavaScript
• Async task execution (shell commands)
Tuesday, December 6, 11
namespace('foo', function () { desc('This a sychronous task'); task('bar', function () { console.log('howdy'); });
desc('This an asychronous task'); task('baz', function () { require('child_process').exec('ls -l', function (err, stdout, stderr) { console.log(stdout); complete(); }); }, {async: true});
});
Tuesday, December 6, 11
Geddy Web framework:https://github.com/mde/geddy
Tuesday, December 6, 11
NodeJS at Yammer
• Upload service for files and images
• Realtime, collaborative document-editing feature
• Another, early-alpha service for mobile Web
Tuesday, December 6, 11
Remote upload service
• Minimal v1 in prod, Nov. 2010
• Onboard thumbnailing, remote services for video and document post-processing
• Redis, CORS XHR-push or JSONP for upload-progress reporting
Tuesday, December 6, 11
Realtime, collaborative documents feature
• In beta Oct. 21, 2011
• EtherPad Lite (https://github.com/Pita/etherpad-lite): NodeJS, Socket.io, PostgreSQL
Tuesday, December 6, 11
• Even shelling out is async?
• “Inside-out” execution
• Evented and callback-based control-flow
Async horror
Tuesday, December 6, 11
var fetchAndUpdate = function (params) { var items = db.fetch(someQuery); for (var i = 0, ii = items.length; i < ii; i++) { item.update(params); } return true;};
Sync fetch-and-update
Tuesday, December 6, 11
var fetchAndUpdate = function (params, callback) { db.fetch(someQuery, function (items) { var count = 0; for (var i = 0, ii = items.length; i < ii; i++) { item.update(params, function () { count++; if (count == ii) { callback(true); } }); } });};
Async fetch-and-update
Tuesday, December 6, 11
jQuery.ajax({ url: '/foo/bar.json', success: function () { alert('yay!'); }});
jQuery('#foo').bind('click', function (e) { // Do some stuff});
Is this familiar?
Tuesday, December 6, 11
var p = new yammer.util.Promise();p.when('foo', 'bar', 'baz').then( function () { console.log('done!');});
p.satisfy('foo');p.satisfy('bar');p.satisfy('baz');
p.then(function () { console.log('still done!');});
Promise
Tuesday, December 6, 11
• NPM is awesome
• Third-party modules still may change rapidly
• Maintain forks, push back patches where appropriate
App dependencies
Tuesday, December 6, 11
Timeout registry• Entries in an object with keys
• Per-item timeout
• Configurable polling-interval
• Define a timeout-handler
Tuesday, December 6, 11
var TimeoutReg = require('timeout_registry').TimeoutReg , handler = function (req, resp) { var registry = new TimeoutReg(function (key) {
resp.writeHead(500); resp.end('Oops, something bad happened.'); }); registry('foo', 10000); performFoo(req, function (result) { if (result.ok) { registry.clear('foo'); // Do some other stuff
resp.writeHead(200); resp.end('Hooray!'); } });};
process.on('uncaughtException', function (err) { // Do some kind of logging});
Timeout registry
Tuesday, December 6, 11
• Measure everything
• Log everything
• https://github.com/mikejihbe/metrics
Visibility, metrics
Tuesday, December 6, 11
• Communicative, consultative dev
• Ask what is expected
• Be transparent
• Play nicely with others
Ops
Tuesday, December 6, 11
Matthew Eernissehttp://twitter.com/mde
Yammer Developer Centerhttp://developer.yammer.com/
Tuesday, December 6, 11