SlideShare une entreprise Scribd logo
1  sur  37
node­db
    La excusa perfecta para hablar de C++ y 
                    Node.js


                        
                                @mgiglesias
Se dice de mi
    Que soy nerd
    Que me gusta Apple
      Sí, ¡ni te imaginás cuánto!

    Que soy de opinar
      @mgiglesias es una mescolanza preocupante

    Que todos los lenguajes me quedan bien
      Duh! ¿De qué era esta charla?

    Que está en algún que otro proyecto FOSS
                                     
Se dice de mi
    Le sobraba el tiempo, y arrancó WORKANA
      Che, es http://workana.com

    Le gusta Seinfeld
      Y los zombies :­/

    Se mandó a mudar a Miramar
    Se encerró en un baño de un avión



                                    
Cortá el chamullo

              ¿De qué voy a hablar?




    Node­db
    Node.js + C++


                         
Había una vez un Alemán




             @felixge
                 
Propuesta node­db
    API C++ unificada
    Separar lo intrínseco de los protocolos
    Librerías DB blocking y non blocking
    API en JS land sencillo
    Performance
    Solo relacionales
      MySQL
      Oracle
                               
A laburar
$ npm install db­mysql

var dbmysql = require('db­mysql');
new dbmysql.Database({
       hostname: 'localhost',
       user: 'root',
       password: 'password',
       database: 'node'
}).connect(function(error, server) {
       if (error) {
             throw new Error('ERROR: ' + error);
       }
       console.log(server);
});

{ version: '5.5.24',
  hostname: 'localhost',
  user: 'root',
                                               
  database: 'node' }
Pooleando conexiones
var mysql = require('db­mysql'),
    generic_pool = require('generic­pool');

var pool = generic_pool.Pool({
    name: 'mysql',
    max: 10,
    create: function(callback) {
        new mysql.Database({ … }).connect(function(err, server) { 
              callback(err, this); 
         });
    },
    destroy: function(db) {
        db.disconnect();
    }
});

pool.acquire(function(err, db) {
      pool.release(db);
});
                                                
A consultar se ha dicho
db.query()
        .select(["id", "user", "email"])
        .from("users")
        .where("role IN ?", [ ["administrator", "user"] ])
        .and("created > ?", [ new Date(2011, 1, 1) ])
        .execute(function(error, rows, columns){
            if (error) {
                console.log('ERROR: ' + error);
                return;
            }
            // Hacer algo mas interesante
        });

                             http://nodejsdb.org
                                       
¿Qué hay detrás del telón?
    db­mysql.js
      exports.Database
      exports.Query
    lib/node­db
      binding.cc, query.cc, events.cc
      connection.cc, result.cc, exception.cc
    src/
      mysql.cc, query.cc
      connection.cc, result.cc    
En el fondo...



     Javascript
     C++
     V8: un amigo



                           
¿¿¿¿¿¿C++??????




            
C++ en Node.js
    Performance
      Ojo, ¡no siempre!
    Librerias C/C++
    Código proprietario
    Integración con otros lenguajes
      Python en Node.js via boost:python?



                               
C++ en Node.js
    Ya que estamos, le damos una mano




                     
C++ en Node.js

    V8
    libuv
    libeio
    Y lo que gustes... ¡es C++ después 
     de todo!
    waf / gyp
                       
¿¿¿¿¿¿WINDOWS??????




 
    Birra para el que adivina de qué película es esta foto
                                  
Muerte a los hola mundos
var binding = require('./build/Release/binding');

cerveza = new binding.Cerveza();
console.log(cerveza.estado());
cerveza.tomar(1);
console.log(cerveza.estado());
cerveza.tomar(2);
console.log(cerveza.estado());
cerveza.tomar(5);
console.log(cerveza.estado());


$ node test.js 
Arranca a tomar de una vez!
Segui tomando tranquilo
Mas vale que no manejes
Me parece que te falto el agua para las macetas
                                                
Qué ganas de una cerveza...
#ifndef CERVEZA_H_
#define CERVEZA_H_

#include <node.h>
#include <node_object_wrap.h>

class Cerveza : public node::ObjectWrap {
       public:
            static void Init(v8::Handle<v8::Object> target);

         protected:
              long liters;

              Cerveza();
              static v8::Handle<v8::Value> New(const v8::Arguments& args);
              static v8::Handle<v8::Value> Tomar(const v8::Arguments& args);
              static v8::Handle<v8::Value> Estado(const v8::Arguments& args);
};

#endif
                                                     
Qué ganas de una cerveza...
void Cerveza::Init(v8::Handle<v8::Object> target) {
       v8::HandleScope scope;

       v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(New);
       v8::Persistent<v8::FunctionTemplate> constructorTemplate;
       constructorTemplate = v8::Persistent<v8::FunctionTemplate>::New(t);
       constructorTemplate­>InstanceTemplate()­>SetInternalFieldCount(1);

       NODE_ADD_PROTOTYPE_METHOD(constructorTemplate, "tomar", Tomar);
       NODE_ADD_PROTOTYPE_METHOD(constructorTemplate, "estado", Estado);

       target­>Set(v8::String::NewSymbol("Cerveza"), constructorTemplate­>GetFunction());
}

v8::Handle<v8::Value> Cerveza::New(const v8::Arguments& args) {
       v8::HandleScope scope;

       Cerveza* cerveza = new Cerveza();
       if (cerveza == NULL) { THROW_EXCEPTION("Ops! Tamos en el horno!") }

       cerveza­>Wrap(args.This());
       return scope.Close(args.This());                
}
Qué ganas de una cerveza...




                  
Los métodos expuestos
v8::Handle<v8::Value> Cerveza::Tomar(const v8::Arguments& args) {
      v8::HandleScope scope;

      if (args.Length() != 1) {
            THROW_EXCEPTION("Si no me decis cuantos litros que queres que haga?");
      } else if (!args[0]­>IsInt32()) {
            THROW_EXCEPTION("Que te tomaste?");
      } else if (args[0]­>ToInt32()­>Value() < 0) {
            THROW_EXCEPTION("Limpia ese enchastre!")
      }

    Cerveza* cerveza = node::ObjectWrap::Unwrap<Cerveza>(args.This());
    assert(cerveza);

    cerveza­>liters += (args[0]­>ToInt32()­>Value());

    return scope.Close(v8::Undefined());
}
                                                
Los métodos expuestos
v8::Handle<v8::Value> Cerveza::Estado(const v8::Arguments& args) {
       v8::HandleScope scope;

       Cerveza* cerveza = node::ObjectWrap::Unwrap<Cerveza>(args.This());
       assert(cerveza);

       const char* estado;

       if (cerveza­>liters > 4) {
             estado = "Me parece que te falto el agua para las macetas";
       } else if (cerveza­>liters > 2) {
             estado = "Mas vale que no manejes";
       } else if (cerveza­>liters > 0) {
             estado = "Segui tomando tranquilo";
       } else {
             estado = "Arranca a tomar de una vez!";
       }

    return scope.Close(v8::String::New(estado));
}
                                                    
Y le decimos a Node
extern “C” void init(v8::Handle<v8::Object> target) {
        Cerveza::Init(target);
}

NODE_MODULE(binding, init);


{
  "targets": [
    {
      "target_name": "binding",
      "sources": [ "cerveza.cc" ]
    }
  ]
}


$ node­gyp configure build
info it worked if it ends with ok
make: Leaving directory `/home/mariano/Documents/Talks/JSConf/src/build'
info done ok 
                                           
libuv

“El mundo no es perfecto. 
   A veces no podemos 
  hacer non­blocking....... 
       sin threads”

               
libuv

cerveza.comprar(function() {
     cerveza.comprar(function(compradas) {
         console.log('Ya compre ' + compradas + ' cervezas');
     });
});




$ node test.js 
Ya compre 2 cervezas


                                     
libuv
uv_work_t* request = new uv_work_t();
request­>data = // ….
uv_queue_work(uv_default_loop(), request, uvComprar, uvComprado);
uv_ref(uv_default_loop());


       void uvComprar(uv_work_t* uvRequest)



       void uvComprado(uv_work_t* uvRequest)



        uv_unref(uv_default_loop());
                                    
A comprar cerveza
class Cerveza : public node::ObjectWrap {
       protected:
              long compradas;
              pthread_mutex_t compradasLock;
              struct compra_t {
                   Cerveza* cerveza;
                   v8::Persistent<v8::Function>* callback;
                   v8::Persistent<v8::Object> context;
              };

              static v8::Handle<v8::Value> Comprar(const v8::Arguments& args);
         static void uvComprar(uv_work_t* uvRequest);
         static void uvComprado(uv_work_t* uvRequest);
};

Cerveza::Cerveza():litros(0), compradas(0) {
      pthread_mutex_init(&(this­>compradasLock), NULL);
}
Cerveza::~Cerveza() {
      pthread_mutex_destroy(&(this­>compradasLock));
                                              
}
v8::Handle<v8::Value> Cerveza::Comprar(const v8::Arguments& args) {
      v8::HandleScope scope;

      Cerveza* cerveza = node::ObjectWrap::Unwrap<Cerveza>(args.This());
      assert(cerveza);

      compra_t* compra = new compra_t();
      if (compra == NULL) { THROW_EXCEPTION("Sin espacio!") }

      cerveza­>Ref();
      compra­>context = v8::Persistent<v8::Object>::New(args.This());
      compra­>cerveza = cerveza;
      compra­>callback = NULL;
      if (args.Length() > 0) {
            compra­>callback = node::cb_persist(args[0]);
      }

      uv_work_t* req = new uv_work_t();
      req­>data = compra;
      uv_queue_work(uv_default_loop(), req, uvComprar, uvComprado);
      uv_ref(uv_default_loop());

      return scope.Close(v8::Undefined());
                                              
}
void Cerveza::uvComprar(uv_work_t* uvRequest) {
     compra_t* compra = static_cast<compra_t*>(uvRequest­>data);
     assert(compra);

     pthread_mutex_lock(&(compra­>cerveza­>compradasLock));
     compra­>cerveza­>compradas++;
     pthread_mutex_unlock(&(compra­>cerveza­>compradasLock));
}




                                  
void Cerveza::uvComprado(uv_work_t* uvRequest) {
       v8::HandleScope scope;

      compra_t* compra = static_cast<compra_t*>(uvRequest­>data);
      assert(compra);

      uv_unref(uv_default_loop());
      compra­>cerveza­>Unref();

      if (compra­>callback != NULL) {
            v8::Local<v8::Value> argv[1] = {
                 v8::Number::New(compra­>cerveza­>compradas)
            };

           v8::TryCatch tryCatch;
           (*(compra­>callback))­>Call(compra­>context, 1, argv);
           if (tryCatch.HasCaught()) {
                  node::FatalException(tryCatch);
           }
      }

      compra­>context.Dispose();
      if (compra­>callback != NULL) {
            compra­>callback­>Dispose();
      }

      delete compra;                             
}
libeio

       “libeio es como si me 
    teletransportara del laburo 
     al bar. Cada 5 segundos”


                  
libeio

cerveza.consultar(function(r) {
    console.log(r);
});




$ node test.js 
John Doe


                              
libeio
ev_io* ioRequest = new ev_io();
ev_init(ioRequest, eioConsultado);
ev_io_set(ioRequest, fd, EV_READ);
ev_io_start(EV_DEFAULT_UC_ ioRequest);



      void eioConsultado(EV_P_ ev_io* ioRequest, int revents)



      ev_io_stop(EV_A_ ioRequest);


                                  
v8::Handle<v8::Value> Cerveza::Comprar(const v8::Arguments& args) {
      consulta­>connection = mysql_init(NULL);
      mysql_real_connect(consulta­>connection, "localhost", "root", "password", 
  "node", 3306, NULL, 0);
      mysql_send_query(consulta­>connection, "SELECT * FROM users", 20);

     consulta­>context = v8::Persistent<v8::Object>::New(args.This());
     consulta­>cerveza = cerveza;
     consulta­>callback = NULL;
     if (args.Length() > 0) {
          consulta­>callback = node::cb_persist(args[0]);
     }

     consulta­>cerveza­>Ref();

     ev_io* ioRequest = new ev_io();
     ioRequest­>data = consulta;

     ev_init(ioRequest, eioConsultado);
     ev_io_set(ioRequest, consulta­>connection­>net.fd, EV_READ);
     ev_io_start(EV_DEFAULT_UC_ ioRequest);
}                                        
void Cerveza::eioConsultado(EV_P_ ev_io* ioRequest, int revents) {
      v8::HandleScope scope;

     consulta_t* consulta = static_cast<consulta_t*>(ioRequest­>data);
     assert(consulta);

     ev_io_stop(EV_A_ ioRequest);
     consulta­>cerveza­>Unref();

     mysql_read_query_result(consulta­>connection);

     MYSQL_RES* result = mysql_store_result(consulta­>connection);
     assert(result);
     char** row = mysql_fetch_row(result);

     // …

     mysql_free_result(result);
     mysql_close(consulta­>connection);
}                                       
Conclusión
    C++ sigue sirviendo para algo
    libuv y libeio te simplifican la vida
      ¡No solo para Node.js eh!
    Ojeá el fuente de Node. Hay cosas interesantes 
     ahí ;)
    No minimices el poder de V8. Por algo se llama 
     V8


                                
¿Preguntas?




            :­)
 
    www.workana.com
                  
                          @mgiglesias

Contenu connexe

Tendances

Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)videos
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispanohdgarcia
 
Aprende a programar con KDE y una patata
Aprende a programar con KDE y una patataAprende a programar con KDE y una patata
Aprende a programar con KDE y una patatakdeespana
 
Programación reactiva con Vert.x
Programación reactiva con Vert.xProgramación reactiva con Vert.x
Programación reactiva con Vert.xFran García
 
Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11Sebastián Vizcay
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkMario IC
 
Desarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con TwistedDesarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con Twistedjjconti
 
Ansible administracion simplificada
Ansible   administracion simplificada Ansible   administracion simplificada
Ansible administracion simplificada bcoca
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvmsuperserch
 
Node al limite con Nest
Node al limite con NestNode al limite con Nest
Node al limite con NestArturo Silvelo
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threadsjubacalo
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandboxTensor
 

Tendances (18)

Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispano
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Aprende a programar con KDE y una patata
Aprende a programar con KDE y una patataAprende a programar con KDE y una patata
Aprende a programar con KDE y una patata
 
MODELO PASO DE MENSAJES
MODELO PASO DE MENSAJESMODELO PASO DE MENSAJES
MODELO PASO DE MENSAJES
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Programación reactiva con Vert.x
Programación reactiva con Vert.xProgramación reactiva con Vert.x
Programación reactiva con Vert.x
 
Ajax
AjaxAjax
Ajax
 
Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform framework
 
Desarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con TwistedDesarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con Twisted
 
Ansible administracion simplificada
Ansible   administracion simplificada Ansible   administracion simplificada
Ansible administracion simplificada
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvm
 
Node al limite con Nest
Node al limite con NestNode al limite con Nest
Node al limite con Nest
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threads
 
Groovy
GroovyGroovy
Groovy
 
Pyrapidc
PyrapidcPyrapidc
Pyrapidc
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandbox
 

En vedette

Node.js/io.js Native C++ Addons
Node.js/io.js Native C++ AddonsNode.js/io.js Native C++ Addons
Node.js/io.js Native C++ AddonsChris Barber
 
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++Writing native bindings to node.js in C++
Writing native bindings to node.js in C++nsm.nikhil
 
Using Cloud in an Enterprise Environment
Using Cloud in an Enterprise EnvironmentUsing Cloud in an Enterprise Environment
Using Cloud in an Enterprise EnvironmentMike Crabb
 

En vedette (6)

Node.js/io.js Native C++ Addons
Node.js/io.js Native C++ AddonsNode.js/io.js Native C++ Addons
Node.js/io.js Native C++ Addons
 
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++Writing native bindings to node.js in C++
Writing native bindings to node.js in C++
 
Node.js extensions in C++
Node.js extensions in C++Node.js extensions in C++
Node.js extensions in C++
 
Extending Node.js using C++
Extending Node.js using C++Extending Node.js using C++
Extending Node.js using C++
 
Using Cloud in an Enterprise Environment
Using Cloud in an Enterprise EnvironmentUsing Cloud in an Enterprise Environment
Using Cloud in an Enterprise Environment
 
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4jBases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
 

Similaire à node-db: La excusa perfecta para hablar de C++ y Node.js

José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]RootedCON
 
Hardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RADHardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RADestialvarez
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesMartín Volpe
 
PHPAJAX
PHPAJAXPHPAJAX
PHPAJAXrodasc
 
CouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidCouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidRicardo Monagas Medina
 
Reactvolution
ReactvolutionReactvolution
Reactvolution_Lagash
 
Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDKFe
 
Introducción android ndk
Introducción android ndkIntroducción android ndk
Introducción android ndkBarcelona GTUG
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0wcuestas
 
Dce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetDce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetvictdiazm
 
Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valeraguestf280e2
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redesguest5d7f33c
 
Cloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de PersistenciaCloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de PersistenciaDavid J. Brenes
 

Similaire à node-db: La excusa perfecta para hablar de C++ y Node.js (20)

Hardware Hacking Rad
Hardware Hacking RadHardware Hacking Rad
Hardware Hacking Rad
 
7 curso
7 curso7 curso
7 curso
 
José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]
 
Hardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RADHardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RAD
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
 
PHPAJAX
PHPAJAXPHPAJAX
PHPAJAX
 
CouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidCouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones Android
 
Reactvolution
ReactvolutionReactvolution
Reactvolution
 
Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDK
 
Introducción android ndk
Introducción android ndkIntroducción android ndk
Introducción android ndk
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0
 
Dce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetDce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnet
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valera
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
 
Cloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de PersistenciaCloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de Persistencia
 

Plus de Mariano Iglesias

ElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden GoogleElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden GoogleMariano Iglesias
 
Workana: work in your underwear and still get paid
Workana: work in your underwear and still get paidWorkana: work in your underwear and still get paid
Workana: work in your underwear and still get paidMariano Iglesias
 
Random tips that will save your project's life
Random tips that will save your project's lifeRandom tips that will save your project's life
Random tips that will save your project's lifeMariano Iglesias
 
ONGs como Extreme Startups
ONGs como Extreme StartupsONGs como Extreme Startups
ONGs como Extreme StartupsMariano Iglesias
 
Node.js - Eventos para Todos
Node.js - Eventos para TodosNode.js - Eventos para Todos
Node.js - Eventos para TodosMariano Iglesias
 
Things that suck... and some that don't
Things that suck... and some that don'tThings that suck... and some that don't
Things that suck... and some that don'tMariano Iglesias
 
Going crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHPGoing crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHPMariano Iglesias
 

Plus de Mariano Iglesias (8)

Go nuts with Go and PHP
Go nuts with Go and PHPGo nuts with Go and PHP
Go nuts with Go and PHP
 
ElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden GoogleElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden Google
 
Workana: work in your underwear and still get paid
Workana: work in your underwear and still get paidWorkana: work in your underwear and still get paid
Workana: work in your underwear and still get paid
 
Random tips that will save your project's life
Random tips that will save your project's lifeRandom tips that will save your project's life
Random tips that will save your project's life
 
ONGs como Extreme Startups
ONGs como Extreme StartupsONGs como Extreme Startups
ONGs como Extreme Startups
 
Node.js - Eventos para Todos
Node.js - Eventos para TodosNode.js - Eventos para Todos
Node.js - Eventos para Todos
 
Things that suck... and some that don't
Things that suck... and some that don'tThings that suck... and some that don't
Things that suck... and some that don't
 
Going crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHPGoing crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHP
 

Dernier

Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 

Dernier (20)

Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 

node-db: La excusa perfecta para hablar de C++ y Node.js

Notes de l'éditeur

  1. - Douglas Crockford: cuando hablas de JS, tenes que hablar de el no? Chuck norris de JS? - db-mysql.js: JS land. Extiende Query y Database de EventEmitter. Alli se llevaran los helper methods para escribir SQL - binding.cc: exports.Database - query.cc: exports Query - events.cc: usa el EventEmitter extendido de db-mysql.js
  2. * Librerias: una cosa es implementar un cliente Paypal Payments Pro en Node, otra cosa es implementar un cliente Oracle puro en JS * Codigo proprietario: integracion con Ideafix
  3. * Isaac Schlueter
  4. * V8: Lo usamos para “convertir” datos JS en C++. Para exportar funciones. * libuv: nace como wrapper alrededor de libev, solo unix, para abstraer IOCP en Windows. Tiene thread pool, DNS asincrono, spawn de procesos, non blocking TCP * libeio: parecido a libev, manejo asincrono de file resources (open, close, read, write), ev_timer para timeouts * waf: via node-waf, hecho en Python. Syntaxis sencilla. * gyp: tb Python, mucho mas piola para cross-platform. En particular node-gyp es el equivalente a node-waf
  5. * NODE_ADD_PROTOTYPE_METHOD: Define en cerveza.h que crea un nuevo prototype en base a un callback
  6. * THROW_EXCEPTION: #define que RETORNA un v8::ThrowException
  7. * NODE_MODULE: #define de node, Crea la estructura del modulo, dandole un nombre al modulo, y definiendo la funcion de inicio * EXTERN “C”: Le decimos a C++ que hay funciones C adentro
  8. * uvComprar: en el thread pool * uvComprado: en el thread de V8
  9. * Ref(): metemos una referencia asi no nos borra el garbage collector
  10. * El callback se ejecuta cada vez que el evento sucede: en este caso cada vez que el FD es leible * revents: bitset de los eventos recibidos: EV_READ, EV_TIMEOUT, EV_ERROR, y otros