Conquering the Server Side with Node.JS

      StartTechConf 2011         Caridy Patiño
                                 Search Direct Team
                                 YUI Evangelist
                                 YUI Contributor

                                 caridy@yahoo-inc.com
                                 @caridy




Saturday, November 5, 2011
Saturday, November 5, 2011
La industria esta cambiando
                                muy rápido




Saturday, November 5, 2011
Chrome + V8




Saturday, November 5, 2011
Internet de alta velocidad




Saturday, November 5, 2011
Coulds / Nubes




Saturday, November 5, 2011
WebApps & Apps




Saturday, November 5, 2011
Almazenamiento Másivo




Saturday, November 5, 2011
La web en tiempo real




Saturday, November 5, 2011
Y esto se traduce en...




Saturday, November 5, 2011
Peaks / Picos




Saturday, November 5, 2011
Concurrencia




Saturday, November 5, 2011
Concurrencia




Saturday, November 5, 2011
Saturday, November 5, 2011
ut
                                  O
                              old
                             S


   Microsoft VBScript compilation error ‘800a03e9′
   Out of memory
   /LM/W3SVC/600510919/Root/dStore/http://global.asa, line 0



Saturday, November 5, 2011
Desempeño




Saturday, November 5, 2011
Soluciones...




Saturday, November 5, 2011
Más servidores




Saturday, November 5, 2011
Más servidores




                                 $$$$$

Saturday, November 5, 2011
Nubes Elásticas




Saturday, November 5, 2011
Wow Amazon EC2 Is Expensive For Start Ups

                 “With EC2, I would pay 30 days * 24 hours * $0.1 * 1.19 (tax) = $85.
                        And that does not take into account backup space (S3),
                              traffic and true persistent storage (EBS) yet.”




Saturday, November 5, 2011
Delegar procesos hacia el cliente




Saturday, November 5, 2011
Saturday, November 5, 2011
Node.JS




Saturday, November 5, 2011
Server Side JavaScript
                                     (SSJS)




Saturday, November 5, 2011
NarwhalJS           RingoJS




                       Wakanda
                                  Rhino   Akshell




Saturday, November 5, 2011
Nuestros sistemas operativos y lenguajes derivan de los
               sistemas diseñados para teletipos.




Saturday, November 5, 2011
Las plataformas modernas de software siguen imitando
                     estas interfaces antiguas.




Saturday, November 5, 2011
“Blocking system call” is a call into the kernel which waits for
          some I/O to complete before before returning. Blocking syscalls
               introduce unbounded latency into the current thread.




Saturday, November 5, 2011
Los procesos son buenos para mantener unidades
           aisladas. Sin embargo, son demasiado pesados como
                  para dedicarle una conexión completa.




Saturday, November 5, 2011
Uno de los objetivos principales de Node es hacer
          accesible la programación sin bloqueo para aquellos
                      usuario que no son expertos.
Saturday, November 5, 2011
Node ha tenido éxito en poner
                             servidor de alto desempeño al
                             alcance de los programadores
                             utilizando una API sin bloqueos




Saturday, November 5, 2011
Un solo stack por cada proceso




Saturday, November 5, 2011
Node.JS solo tiene 2.5
                             años de edad.

                             La version 0.6 es la 3ra
                             iteración estable.




Saturday, November 5, 2011
Saturday, November 5, 2011
HTTP benchmark con 100 clientes concurrentes
                             en OSX 10.6



             - v0.2.6 5330 req/sec
             - v0.4.12 5552 req/sec
             - v0.5.10 5803 req/se




Saturday, November 5, 2011
Por qué Javascript?




Saturday, November 5, 2011
Javascript es el lenguaje
                                  del navegador




Saturday, November 5, 2011
Javascript es un lenguaje
                                     dinámico




Saturday, November 5, 2011
Closures y programación asincrónica
                    por naturaleza




Saturday, November 5, 2011
Comunidad creciente, activa y diversa




Saturday, November 5, 2011
http://github.com/languages

Saturday, November 5, 2011
No existe otro lenguaje que pueda
               destronar a javascript en un
                      future cercano




Saturday, November 5, 2011
Node Event Loop




Saturday, November 5, 2011
var result = db.query("select * from T");
   // use result




Saturday, November 5, 2011
var result = db.query("select * from T");
   // use result

                             Qué esta haciendo el software
                             mientras se ejecuta la query?




Saturday, November 5, 2011
db.query("select * from T", function (result) {
       // use result
   });




Saturday, November 5, 2011
db.query("select * from T", function (result) {
       // use result
   });
                             Este código le permite al programa
                                    retornar al event loop
                                       inmediatamente




Saturday, November 5, 2011
Node maneja todas los IO de la misma manera




Saturday, November 5, 2011
Saturday, November 5, 2011
Menos memoria necesita ser usada, y un mayor
         rendimiento debido al menor número de cambios de
                             contexto.




Saturday, November 5, 2011
El uso de los closures para capturar el estado entre
                            diferentes eventos




Saturday, November 5, 2011
function adicionar(callback) {
      http.get(url1, function(respuesta1) {
          var parte1 = respuesta1.data;
          http.get(url2, function(respuesta2) {
              var parte2 = respuesta2.data;
              callback(parte1 + parte2);
          });
      });
  }




Saturday, November 5, 2011
Node Stack




Saturday, November 5, 2011
Como usar Node




Saturday, November 5, 2011
Download, configure, compile, and
                       make install it:

                             http://nodejs.org/



Saturday, November 5, 2011
Windows Build (Node v0.6.0):

        http://nodejs.org/dist/v0.6.0/node.exe




Saturday, November 5, 2011
NPM



                             http://npm.org/

Saturday, November 5, 2011
curl http://npmjs.org/install.sh | sh




Saturday, November 5, 2011
NPM 101

                              $ npm help

                              $ npm install <pkgName>
                              $ npm uninstall <pkgName>
                              $ npm publish
                              $ npm list
                              $ npm update


                       http://howtonode.org/introduction-to-npm
Saturday, November 5, 2011
$	
  npm	
  list
                             app@0.1.0	
  /Users/caridy/node/app
                                          	
  connect@1.7.1	
  
                               	
         	
  mime@1.2.4	
  
                               	
         	
  qs@0.3.1	
  
                                      	
  express@2.4.7	
  
                               	
         	
  mime@1.2.4	
  
                               	
         	
  mkdirp@0.0.7	
  
                               	
         	
  qs@0.3.1	
  
                                      	
  micro<me@0.1.3-­‐1	
  
                                      	
  mime@1.2.4	
  
                                      	
  yui3@0.7.4
                               	
         	
  htmlparser@1.7.3	
  
                               	
         	
  yui3-­‐core@3.4.0	
  
                               	
         	
  yuitest@0.6.9	
  
                                      	
  yui3-­‐core@3.4.0

Saturday, November 5, 2011
Express




                             http://expressjs.com/
Saturday, November 5, 2011
$ cd my/node/app/
                             $ npm install express




Saturday, November 5, 2011
Requiriendo Express NPM Module



                       var app = require('express').createServer();

                       app.get('/usuario/:id', function(req, res){
                         res.send('Bienvenido ' + req.params.id);
                       });

                       app.listen(3000);




Saturday, November 5, 2011
$ node app.js




Saturday, November 5, 2011
http://localhost:3000/usuario/caridy




Saturday, November 5, 2011
Express Boilerplate

                             $ npm install -g express
                             $ cd my/node/app/
                             $ express ./
                             $ npm install -d
                             $ node app.js




Saturday, November 5, 2011
YUI




Saturday, November 5, 2011
Saturday, November 5, 2011
$ npm install yui3




Saturday, November 5, 2011
var YUI = require("yui3").YUI;               Requiriendo YUI NPM Module


       YUI().use('json', 'io', function(Y) {

             Y.io('http://yuilibrary.com/gallery/api/user/caridy', {
                 on: {
                    success: function(id, o) {
                       Y.log(Y.JSON.parse(o.responseText), 'info', 'demo');
                    }
                 }
             });

       });




Saturday, November 5, 2011
var YUI = require("yui3").YUI;                           Requiriendo YUI NPM Module


            YUI().use('yql', function(Y) {

                var query = ' select * from geo.states where place="Chile" and lang="es-CL" ';

                 Y.YQL(query, function(result) {
                    // =result= now contains the result of the YQL Query
                    // use the YQL Developer console to learn
                    // what data is coming back in this object
                    // and how that data is structured.
                       Y.log(result, 'info', 'demo');
                 });

           });


                        http://developer.yahoo.com/yql/console/#h=select%20*%20from%20geo.states%20where
                                     %20place%3D%22Chile%22%20and%20lang%3D%22es-CL%22

Saturday, November 5, 2011
{
                              "query": {
                               "count": 15,
                               "created": "2011-10-31T15:38:44Z",
                               "results": {
                                "place": [
                                 {
                                  "lang": "es-CL",
                                  "uri": "http://where.yahooapis.com/v1/place/2345028",
                                  "woeid": "2345028",
                                  "placeTypeName": { "code": "8", "content": "Región" },
                                  "name": "Maule"
                                 },
                                 {
                                  "lang": "es-CL",
                                  "uri": "http://where.yahooapis.com/v1/place/2345025",
                                  "woeid": "2345025",
                                  "placeTypeName": { "code": "8", "content": "Región" },
                                  "name": "Libertador General Bernardo O'Higgins"
                                 },
                                 {
                                  "lang": "es-CL",
                                  "uri": "http://where.yahooapis.com/v1/place/2345029",
                                  "woeid": "2345029",
                                  "placeTypeName": { "code": "8", "content": "Región" },
                                  "name": "Santiago"
                                 }
                                ]
                               }
                              }
                             }

Saturday, November 5, 2011
YUI Library          Who contributes?
                               Everyone, with committer review.




                 YUI Gallery         Who contributes?
                                 Everyone, with little review.




                 YUI Test         Comprehensive unit testing
                                   solution for any JS code




                 YETI            YUI Easy Testing Interface: run
                               browser JS unit tests from console



Saturday, November 5, 2011
Yahoo! Cocktails



Saturday, November 5, 2011
Saturday, November 5, 2011
Cocktails: Mojito




Saturday, November 5, 2011
Mojito es un
                             Web Application Framework




Saturday, November 5, 2011
Mojits MVC


                                      Controller




                       Model
                                            View




Saturday, November 5, 2011
Tres tipos de scripts:

                             - foo.server.js
                             - foo.common.js
                             - foo.client.js


Saturday, November 5, 2011
Multiples Runtimes


             Javascript on the   Native Bridges   Javascript on the
                 browser         iOS   Android         server




Saturday, November 5, 2011
Mojito Command 101

                               $ mojito help

                               $ mojito create app ./myApp
                               $ mojito create mojit Foo
                               $ mojito test
                               $ mojito compile
                               $ mojito start




Saturday, November 5, 2011
Mojito Application Folder

                              ./myApp
                              - application.json
                              - assets
                              - autoload
                              - index.js
                              - mojits
                                - Foo
                                - Bar
                              - package.json
                              - server.js

Saturday, November 5, 2011
Open Source a inicios del 2012




Saturday, November 5, 2011
Cocktails: Manhattan




Saturday, November 5, 2011
Yahoo! Manhattan es un ambiente de hosting para
            aplicaciones basadas en Mojito que utiliza la nube de
                    Yahoo! para correr esas aplicaciones.




Saturday, November 5, 2011
Server Side: Technology Stack


                                                                Mojito App




                                                                  Mojito




                             YUI                      Express       Mustache         Connect




                                                                                                 Cocktails Abstractions
                                                 Node.JS                       V8




                                                                Manhattan




                                   Security Filters              Tracking           Monitoring




Saturday, November 5, 2011
Yahoo! Manhattan extiende Node.JS para proveer fault-
      isolation & fault-tolerance, escalabilidad, disponibilidad,
                      seguridad y desempeño.




Saturday, November 5, 2011
Saturday, November 5, 2011
Manhattan provides a simple interface for developers to
        deploy, un-deploy and manage their Mojito-based
      applications, leveraging the scale and performance of
               Yahoo!’s technology infrastructure.




Saturday, November 5, 2011
Desempeño




Saturday, November 5, 2011
Saturday, November 5, 2011
Saturday, November 5, 2011
node.js 0.4 + express + yui + mustache




Saturday, November 5, 2011
Apache + PHP




                             Node + Express + YUI + Mustache




Saturday, November 5, 2011
Saturday, November 5, 2011
Apache + PHP no crece




Saturday, November 5, 2011
Saturday, November 5, 2011
Thank you
                             caridy@yahoo-inc.com
                             @caridy




Saturday, November 5, 2011
Links

            • nodejs.org
            • npm.org
            • expressjs.com
            • yuilibrary.com/projects/nodejs-yui3/

Saturday, November 5, 2011
Más sobre Yahoo! Mojito:

                             http://www.slideshare.net/rhyolight/mojito-sl-2011




Saturday, November 5, 2011
Más sobre Yahoo! Manhattan:

                  http://video.yahoo.com/yahoonet-24189541/yodel-24697328/
                  cocktails-in-action-27127763.html

                 http://video.yahoo.com/yahoonet-24189541/yodel-24697328/
                 introducing-cocktails-from-yahoo-27127762.html




Saturday, November 5, 2011

Conquistando el Servidor con Node.JS

  • 1.
    Conquering the ServerSide with Node.JS StartTechConf 2011 Caridy Patiño Search Direct Team YUI Evangelist YUI Contributor caridy@yahoo-inc.com @caridy Saturday, November 5, 2011
  • 2.
  • 3.
    La industria estacambiando muy rápido Saturday, November 5, 2011
  • 4.
    Chrome + V8 Saturday,November 5, 2011
  • 5.
    Internet de altavelocidad Saturday, November 5, 2011
  • 6.
    Coulds / Nubes Saturday,November 5, 2011
  • 7.
    WebApps & Apps Saturday,November 5, 2011
  • 8.
  • 9.
    La web entiempo real Saturday, November 5, 2011
  • 10.
    Y esto setraduce en... Saturday, November 5, 2011
  • 11.
    Peaks / Picos Saturday,November 5, 2011
  • 12.
  • 13.
  • 14.
  • 15.
    ut O old S Microsoft VBScript compilation error ‘800a03e9′ Out of memory /LM/W3SVC/600510919/Root/dStore/http://global.asa, line 0 Saturday, November 5, 2011
  • 16.
  • 17.
  • 18.
  • 19.
    Más servidores $$$$$ Saturday, November 5, 2011
  • 20.
  • 21.
    Wow Amazon EC2Is Expensive For Start Ups “With EC2, I would pay 30 days * 24 hours * $0.1 * 1.19 (tax) = $85. And that does not take into account backup space (S3), traffic and true persistent storage (EBS) yet.” Saturday, November 5, 2011
  • 22.
    Delegar procesos haciael cliente Saturday, November 5, 2011
  • 23.
  • 24.
  • 25.
    Server Side JavaScript (SSJS) Saturday, November 5, 2011
  • 26.
    NarwhalJS RingoJS Wakanda Rhino Akshell Saturday, November 5, 2011
  • 27.
    Nuestros sistemas operativosy lenguajes derivan de los sistemas diseñados para teletipos. Saturday, November 5, 2011
  • 28.
    Las plataformas modernasde software siguen imitando estas interfaces antiguas. Saturday, November 5, 2011
  • 29.
    “Blocking system call”is a call into the kernel which waits for some I/O to complete before before returning. Blocking syscalls introduce unbounded latency into the current thread. Saturday, November 5, 2011
  • 30.
    Los procesos sonbuenos para mantener unidades aisladas. Sin embargo, son demasiado pesados como para dedicarle una conexión completa. Saturday, November 5, 2011
  • 31.
    Uno de losobjetivos principales de Node es hacer accesible la programación sin bloqueo para aquellos usuario que no son expertos. Saturday, November 5, 2011
  • 32.
    Node ha tenidoéxito en poner servidor de alto desempeño al alcance de los programadores utilizando una API sin bloqueos Saturday, November 5, 2011
  • 33.
    Un solo stackpor cada proceso Saturday, November 5, 2011
  • 34.
    Node.JS solo tiene2.5 años de edad. La version 0.6 es la 3ra iteración estable. Saturday, November 5, 2011
  • 35.
  • 36.
    HTTP benchmark con100 clientes concurrentes en OSX 10.6 - v0.2.6 5330 req/sec - v0.4.12 5552 req/sec - v0.5.10 5803 req/se Saturday, November 5, 2011
  • 37.
  • 38.
    Javascript es ellenguaje del navegador Saturday, November 5, 2011
  • 39.
    Javascript es unlenguaje dinámico Saturday, November 5, 2011
  • 40.
    Closures y programaciónasincrónica por naturaleza Saturday, November 5, 2011
  • 41.
    Comunidad creciente, activay diversa Saturday, November 5, 2011
  • 42.
  • 43.
    No existe otrolenguaje que pueda destronar a javascript en un future cercano Saturday, November 5, 2011
  • 44.
    Node Event Loop Saturday,November 5, 2011
  • 45.
    var result =db.query("select * from T"); // use result Saturday, November 5, 2011
  • 46.
    var result =db.query("select * from T"); // use result Qué esta haciendo el software mientras se ejecuta la query? Saturday, November 5, 2011
  • 47.
    db.query("select * fromT", function (result) { // use result }); Saturday, November 5, 2011
  • 48.
    db.query("select * fromT", function (result) { // use result }); Este código le permite al programa retornar al event loop inmediatamente Saturday, November 5, 2011
  • 49.
    Node maneja todaslos IO de la misma manera Saturday, November 5, 2011
  • 50.
  • 51.
    Menos memoria necesitaser usada, y un mayor rendimiento debido al menor número de cambios de contexto. Saturday, November 5, 2011
  • 52.
    El uso delos closures para capturar el estado entre diferentes eventos Saturday, November 5, 2011
  • 53.
    function adicionar(callback) { http.get(url1, function(respuesta1) { var parte1 = respuesta1.data; http.get(url2, function(respuesta2) { var parte2 = respuesta2.data; callback(parte1 + parte2); }); }); } Saturday, November 5, 2011
  • 54.
  • 55.
    Como usar Node Saturday,November 5, 2011
  • 56.
    Download, configure, compile,and make install it: http://nodejs.org/ Saturday, November 5, 2011
  • 57.
    Windows Build (Nodev0.6.0): http://nodejs.org/dist/v0.6.0/node.exe Saturday, November 5, 2011
  • 58.
    NPM http://npm.org/ Saturday, November 5, 2011
  • 59.
    curl http://npmjs.org/install.sh |sh Saturday, November 5, 2011
  • 60.
    NPM 101 $ npm help $ npm install <pkgName> $ npm uninstall <pkgName> $ npm publish $ npm list $ npm update http://howtonode.org/introduction-to-npm Saturday, November 5, 2011
  • 61.
    $  npm  list app@0.1.0  /Users/caridy/node/app  connect@1.7.1      mime@1.2.4      qs@0.3.1    express@2.4.7      mime@1.2.4      mkdirp@0.0.7      qs@0.3.1    micro<me@0.1.3-­‐1    mime@1.2.4    yui3@0.7.4    htmlparser@1.7.3      yui3-­‐core@3.4.0      yuitest@0.6.9    yui3-­‐core@3.4.0 Saturday, November 5, 2011
  • 62.
    Express http://expressjs.com/ Saturday, November 5, 2011
  • 63.
    $ cd my/node/app/ $ npm install express Saturday, November 5, 2011
  • 64.
    Requiriendo Express NPMModule var app = require('express').createServer(); app.get('/usuario/:id', function(req, res){ res.send('Bienvenido ' + req.params.id); }); app.listen(3000); Saturday, November 5, 2011
  • 65.
    $ node app.js Saturday,November 5, 2011
  • 66.
  • 67.
    Express Boilerplate $ npm install -g express $ cd my/node/app/ $ express ./ $ npm install -d $ node app.js Saturday, November 5, 2011
  • 68.
  • 69.
  • 70.
    $ npm installyui3 Saturday, November 5, 2011
  • 71.
    var YUI =require("yui3").YUI; Requiriendo YUI NPM Module YUI().use('json', 'io', function(Y) { Y.io('http://yuilibrary.com/gallery/api/user/caridy', { on: { success: function(id, o) { Y.log(Y.JSON.parse(o.responseText), 'info', 'demo'); } } }); }); Saturday, November 5, 2011
  • 72.
    var YUI =require("yui3").YUI; Requiriendo YUI NPM Module YUI().use('yql', function(Y) { var query = ' select * from geo.states where place="Chile" and lang="es-CL" '; Y.YQL(query, function(result) { // =result= now contains the result of the YQL Query // use the YQL Developer console to learn // what data is coming back in this object // and how that data is structured. Y.log(result, 'info', 'demo'); }); }); http://developer.yahoo.com/yql/console/#h=select%20*%20from%20geo.states%20where %20place%3D%22Chile%22%20and%20lang%3D%22es-CL%22 Saturday, November 5, 2011
  • 73.
    { "query": { "count": 15, "created": "2011-10-31T15:38:44Z", "results": { "place": [ { "lang": "es-CL", "uri": "http://where.yahooapis.com/v1/place/2345028", "woeid": "2345028", "placeTypeName": { "code": "8", "content": "Región" }, "name": "Maule" }, { "lang": "es-CL", "uri": "http://where.yahooapis.com/v1/place/2345025", "woeid": "2345025", "placeTypeName": { "code": "8", "content": "Región" }, "name": "Libertador General Bernardo O'Higgins" }, { "lang": "es-CL", "uri": "http://where.yahooapis.com/v1/place/2345029", "woeid": "2345029", "placeTypeName": { "code": "8", "content": "Región" }, "name": "Santiago" } ] } } } Saturday, November 5, 2011
  • 74.
    YUI Library Who contributes? Everyone, with committer review. YUI Gallery Who contributes? Everyone, with little review. YUI Test Comprehensive unit testing solution for any JS code YETI YUI Easy Testing Interface: run browser JS unit tests from console Saturday, November 5, 2011
  • 75.
  • 76.
  • 77.
  • 78.
    Mojito es un Web Application Framework Saturday, November 5, 2011
  • 79.
    Mojits MVC Controller Model View Saturday, November 5, 2011
  • 80.
    Tres tipos descripts: - foo.server.js - foo.common.js - foo.client.js Saturday, November 5, 2011
  • 81.
    Multiples Runtimes Javascript on the Native Bridges Javascript on the browser iOS Android server Saturday, November 5, 2011
  • 82.
    Mojito Command 101 $ mojito help $ mojito create app ./myApp $ mojito create mojit Foo $ mojito test $ mojito compile $ mojito start Saturday, November 5, 2011
  • 83.
    Mojito Application Folder ./myApp - application.json - assets - autoload - index.js - mojits - Foo - Bar - package.json - server.js Saturday, November 5, 2011
  • 84.
    Open Source ainicios del 2012 Saturday, November 5, 2011
  • 85.
  • 86.
    Yahoo! Manhattan esun ambiente de hosting para aplicaciones basadas en Mojito que utiliza la nube de Yahoo! para correr esas aplicaciones. Saturday, November 5, 2011
  • 87.
    Server Side: TechnologyStack Mojito App Mojito YUI Express Mustache Connect Cocktails Abstractions Node.JS V8 Manhattan Security Filters Tracking Monitoring Saturday, November 5, 2011
  • 88.
    Yahoo! Manhattan extiendeNode.JS para proveer fault- isolation & fault-tolerance, escalabilidad, disponibilidad, seguridad y desempeño. Saturday, November 5, 2011
  • 89.
  • 90.
    Manhattan provides asimple interface for developers to deploy, un-deploy and manage their Mojito-based applications, leveraging the scale and performance of Yahoo!’s technology infrastructure. Saturday, November 5, 2011
  • 91.
  • 92.
  • 93.
  • 94.
    node.js 0.4 +express + yui + mustache Saturday, November 5, 2011
  • 95.
    Apache + PHP Node + Express + YUI + Mustache Saturday, November 5, 2011
  • 96.
  • 97.
    Apache + PHPno crece Saturday, November 5, 2011
  • 98.
  • 99.
    Thank you caridy@yahoo-inc.com @caridy Saturday, November 5, 2011
  • 100.
    Links • nodejs.org • npm.org • expressjs.com • yuilibrary.com/projects/nodejs-yui3/ Saturday, November 5, 2011
  • 101.
    Más sobre Yahoo!Mojito: http://www.slideshare.net/rhyolight/mojito-sl-2011 Saturday, November 5, 2011
  • 102.
    Más sobre Yahoo!Manhattan: http://video.yahoo.com/yahoonet-24189541/yodel-24697328/ cocktails-in-action-27127763.html http://video.yahoo.com/yahoonet-24189541/yodel-24697328/ introducing-cocktails-from-yahoo-27127762.html Saturday, November 5, 2011