server. var http = require('http'); // Configure our HTTP server to respond with Hello World to all requests. var server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello World\n"); }); // Listen on port 8000, IP defaults to 127.0.0.1 server.listen(8000); // Put a friendly message on the terminal console.log("Server running at 127.0.0.1:8000”); $ node hello_world.js Monday, October 15, 12
xmpp tor dns ssh . . . Database drivers Content Management Systems Message Queues Testing tools Command Line Tool libs ePub and Office docs in JS ... on and on, you know ... a language Monday, October 15, 12
etc) public/ routes/ views/ app.js package.json Socket.IO event based messaging client and server lib events over the wire websockets etc abstraction Monday, October 15, 12
and grok. After deep understanding, you see use cases. Sick of EventMachine (Ruby) and Twisted (Python)? Want one language stack? Want websockets? Want a proxy, load balancer, simple TCP server? Monday, October 15, 12
Authentication APIs / REST Everything Single File SQL HTML CSS Ala Vanilla PHP Vanilla JSP mod_perl old Cold Fusion? circa 2001 web technologies The App Monday, October 15, 12
Authentication APIs / REST Everything Single File SQL HTML CSS Ala Vanilla PHP Vanilla JSP mod_perl old Cold Fusion? circa 2001 web technologies Problems Multiple Concerns DRY SQL everywhere New devs are confused Spaghetti Procedural Brittle ... The App Monday, October 15, 12
devs are confused Event spaghetti Data mixed in with view Javascript in your app Ajax HTML Clicks Data DOM Callbacks MVC Pattern Model View Controller Monday, October 15, 12
Put JS data objects in model definition collections/ - Are many models routers/ - Wire URL paths to methods views/ - Render template, written in code (controller) templates/ - HTML with dynamic code tags <%= foo %> Monday, October 15, 12
simple.html js/lib/jquery-1.8.2.min.js js/lib/underscore-min.js js/lib/backbone.js js/simple.js Logic Flow html “sets” a message greeting model is created view uses model when model changes, trigger view reacts to trigger, renders Monday, October 15, 12
initialize: function(message) { this.set('message', message); } }); GreetingView = Backbone.View.extend({ el: $('#greeting h1'), initialize: function(){ _.bindAll(this, 'render'); this.render(); this.model.bind("change:message", this.render); }, render: function(){ var message_attr = this.model.get('message'); $(this.el).text(message_attr).el; } }); window.greeting = new Greeting("Hello from Model initialize."); window.greetingView = new GreetingView({model: greeting}); }); <-‐-‐ very critical to use model.set() <-‐-‐ bindAll makes 'this' be the view inside render() <-‐-‐ use window.global variable scope for js browser console demo <-‐-‐ normal jQuery onLoad() event, starts this whole thing up after page done Monday, October 15, 12
initialize: function(message) { this.set('message', message); } }); GreetingView = Backbone.View.extend({ el: $('#greeting h1'), initialize: function(){ _.bindAll(this, 'render'); this.render(); this.model.bind("change:message", this.render); }, render: function(){ var message_attr = this.model.get('message'); $(this.el).text(message_attr).el; } }); window.greeting = new Greeting("Hello from Model initialize."); window.greetingView = new GreetingView({model: greeting}); }); <-‐-‐ very critical to use model.set() <-‐-‐ bindAll makes 'this' be the view inside render() <-‐-‐ use window.global variable scope for js browser console demo <-‐-‐ you can drop :message to fire on all change events change is a built-‐in event, see FAQ for list <-‐-‐ normal jQuery onLoad() event, starts this whole thing up after page done Monday, October 15, 12
initialize: function(message) { this.set('message', message); } }); GreetingView = Backbone.View.extend({ el: $('#greeting h1'), initialize: function(){ _.bindAll(this, 'render'); this.render(); this.model.bind("change:message", this.render); }, render: function(){ var message_attr = this.model.get('message'); $(this.el).text(message_attr).el; } }); window.greeting = new Greeting("Hello from Model initialize."); window.greetingView = new GreetingView({model: greeting}); }); <-‐-‐ very critical to use model.set() <-‐-‐ very critical to use model.get() <-‐-‐ bindAll makes 'this' be the view inside render() <-‐-‐ use window.global variable scope for js browser console demo <-‐-‐ you can drop :message to fire on all change events change is a built-‐in event, see FAQ for list <-‐-‐ normal jQuery onLoad() event, starts this whole thing up after page done Monday, October 15, 12
initialize: function(message) { this.set('message', message); } }); GreetingView = Backbone.View.extend({ el: $('#greeting h1'), initialize: function(){ _.bindAll(this, 'render'); this.render(); this.model.bind("change:message", this.render); }, render: function(){ var message_attr = this.model.get('message'); $(this.el).text(message_attr).el; } }); window.greeting = new Greeting("Hello from Model initialize."); window.greetingView = new GreetingView({model: greeting}); }); <-‐-‐ very critical to use model.set() <-‐-‐ very critical to use model.get() <-‐-‐ bindAll makes 'this' be the view inside render() <-‐-‐ use window.global variable scope for js browser console demo <-‐-‐ you can drop :message to fire on all change events change is a built-‐in event, see FAQ for list <-‐-‐ el helps backbone bind itself to one part of the DOM, reduce drawing <-‐-‐ normal jQuery onLoad() event, starts this whole thing up after page done Monday, October 15, 12
initialize: function(message) { this.set('message', message); } }); GreetingView = Backbone.View.extend({ el: $('#greeting h1'), initialize: function(){ _.bindAll(this, 'render'); this.render(); this.model.bind("change:message", this.render); }, render: function(){ var message_attr = this.model.get('message'); $(this.el).text(message_attr).el; } }); window.greeting = new Greeting("Hello from Model initialize."); window.greetingView = new GreetingView({model: greeting}); }); <-‐-‐ very critical to use model.set() <-‐-‐ very critical to use model.get() <-‐-‐ bindAll makes 'this' be the view inside render() <-‐-‐ use window.global variable scope for js browser console demo <-‐-‐ you can drop :message to fire on all change events change is a built-‐in event, see FAQ for list <-‐-‐ el helps backbone bind itself to one part of the DOM, reduce drawing <-‐-‐ tack .el on the end for render chaining <-‐-‐ normal jQuery onLoad() event, starts this whole thing up after page done Monday, October 15, 12
initialize: function(message) { this.set('message', message); } }); GreetingView = Backbone.View.extend({ el: $('#greeting h1'), initialize: function(){ _.bindAll(this, 'render'); this.render(); this.model.bind("change:message", this.render); }, render: function(){ var message_attr = this.model.get('message'); $(this.el).text(message_attr).el; } }); window.greeting = new Greeting("Hello from Model initialize."); window.greetingView = new GreetingView({model: greeting}); }); <-‐-‐ very critical to use model.set() <-‐-‐ very critical to use model.get() <-‐-‐ bindAll makes 'this' be the view inside render() <-‐-‐ use window.global variable scope for js browser console demo <-‐-‐ you can drop :message to fire on all change events change is a built-‐in event, see FAQ for list <-‐-‐ el helps backbone bind itself to one part of the DOM, reduce drawing <-‐-‐ tack .el on the end for render chaining <-‐-‐ normal jQuery onLoad() event, starts this whole thing up after page done > greeting.set({message:'hello from js console!'}) Monday, October 15, 12
a million options but you only need six. Nginx does those six things, and it does five of them 50 times faster than Apache." -- Chris Lea, WordCamp 2008 Short config Unpopular Wordpress.com, Github, Sourceforge, Netflix Small Memory Monday, October 15, 12
processes (threaded mode), 30% CPU and 17MB of memory to serve 6,500 requests per second. Nginx used one worker, 15% CPU and 1MB of memory to serve 11,500 requests per second.” Monday, October 15, 12
weight=10 max_fails=3 fail_timeout=30s; server 192.168.1.16 weight=10 max_fails=3 fail_timeout=30s; # only comes alive when above two fails server 192.168.1.23 weight=1 backup; } ## Start www.example.com ## server { listen 3.3.3.3:80; server_name www.example.com; ## send request back to apacheboxes ## location / { proxy_pass http://apacheboxes; # what cases the request will be transmitted to the next server proxy_next_upstream error timeout invalid_header http_500 http_502 ... ; proxy_redirect off; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } Monday, October 15, 12
to an open bar party where the only beer is Heineken.” “If it's not MongoDB, it's the WrongoDB.” “Ruby on Rails is a lot like my Chuck Taylors: basically pretty cool, but such a frequent accessory for poseurs that I had to give them up.” hipstergrammers.tumblr.com Everything on Hacker News More Sources Parody Accounts and Srs Bsns Monday, October 15, 12