SlideShare a Scribd company logo
Node.js e Drupal


   Luca Lusso - Wellnet




martedì 6 dicembre 11
Cos’è e come funziona node.js


   •       Javascript sul server


   •       Basato su V8 di Google (il motore javascript di Chrome, open-source)


   •       Event driven


   •       I/O asincrono (mediante librerie esterne)




martedì 6 dicembre 11
Cos’è e come funziona node.js


    •      Un singolo processo gestisce il main event loop e tutte le connessioni (singolo thread)


    •      I task sono eseguiti in modo asincrono lasciando il main event loop libero di gestire altre richieste


    •      Anche nginx usa lo stesso modello semplicemente perché per una concorrenza massiva non
           possiamo usare un thread del sistema operativo per ogni connessione, è troppo pesante




martedì 6 dicembre 11
Cos’è e come funziona node.js
                               processo di I/O (lento)
                                es.: attesa dati da un   processo di I/O (veloce)
                        node          webservice          es.: query a Mongodb



         A




                                                                                    Tempo
         B




         C




martedì 6 dicembre 11
Node.js può essere usato (e da il suo meglio) per


    •      Gestire la concorrenza


    •      I/O asincrono


    •      Networking


    •      Caricamento asincrono di componenti di una pagina via Ajax




martedì 6 dicembre 11
Node.js è sconsigliato per


    •      Generare intere pagine web


    •      Restituire grosse quantità di dati (download di file) -> ha un thread solo




martedì 6 dicembre 11
Dove si usa?


    •      Applicazione mobile di Linkedin


    •      Cloud9 (IDE su web)


    •      Nodejitsu (Cloud per applicazioni in node.js)




martedì 6 dicembre 11
Installare node.js


    •      http://nodejs.org/


    •      Ultima versione stabile (0.6.3) disponibile per tutti i sistemi operativi


    •      github.com/joyent/node/wiki/Installation


    •      Per Mac Os X e Windows è disponibile l’installer, per Linux basta scaricare il sorgente e compilare :-)




martedì 6 dicembre 11
Installare node.js


    •      NPM (Node Package Manager)


    •      Gestisce il download e l’installazione delle librerie aggiuntive


    •      http://npmjs.org/


    •      Su Linux, Mac Os X: curl http://npmjs.org/install.sh | sudo sh (su Windows è un po’ più
           complesso)


    •      Attualmente sono disponibili più di 5000 librerie per i più svariati casi d’uso


    •      #> npm install express




martedì 6 dicembre 11
Hello world (hello.js)

    var http = require('http');

    http.createServer(function (request, response) {
       console.log('Request received’);

        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.end('Hello Worldn');
    }).listen(8000);

    console.log('Server running at http://127.0.0.1:8000/');




martedì 6 dicembre 11
Hello world (hello.js)

    funkymac2:Desktop lussoluca$ node hello.js
    Server running at http://127.0.0.1:8000/
    Request received




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags




    •      Chiama Ajax per autocompletare i tags durante la digitazione

    •      Necessita un bootstrap completo di Drupal per gestire la richiesta

    •      /taxonomy/autocomplete/field_tags/a




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags

    •       express (http://expressjs.com)


        •       web framework per Node.js


        •       Nel nostro esempio usiamo solo il routing, ma fa anche middleware, template e altro


    •       mysql (github.com/felixge/node-mysql)


        •       driver MySQL per node.js




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags




            var Client = require('mysql').Client;
            var client = new Client();

            client.user = 'root';
            client.password = 'root';
            client.port = 3306;
            client.database = 'drupaldb';




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags




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

       app.get('/autocomplete/:vid/:id', function(req, res) {




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags
           var query = client.query('SELECT * FROM [...]', [vid, arg, tags.join(',')],
               function selectCb(err, results, fields) {
                   if (err) {
                       throw err;
                                                      Callback! Node.js non si ferma ad aspettare
                   }
                                                            i risultati dal db, li invierà al client quando
                        var names = {};                                     saranno pronti!
                        var prefix = (tags.length > 0) ? tags.join(',') + ', ' : '';
           	     	       	   	
                        for (var i in results) {
                            var result = results[i];
                            names[prefix + result.name] = result.name;
                        }

                        res.write(JSON.stringify(names));
                        res.end(); // end the request.
                 });




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags




                         app.listen(3000);




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags



                	       $form['name_nodejs'] = array(
                	       	    '#type' => 'textfield',
                	       	    '#title' => t('Tags Node.js version'),
                	       	    '#autocomplete_path' => '/autocomplete/1',
                	       	    '#size' => '100',
                	       	    '#maxlength' => '100',
                	       );

                	       $form['name_drupal'] = array(
                	       	    '#type' => 'textfield',
                	       	    '#title' => t('Tags drupal version'),
                	       	    '#autocomplete_path' => 'taxonomy/autocomplete/field_tags',
                	       	    '#size' => '100',
                	       	    '#maxlength' => '100',
                	       );




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags

    •      /autocomplete/1/% non è un path Drupal


    •      Necessario per bypassare il problema del cross domain scripting


    •      Bisogna configurare il mod_proxy di Apache (cosa simile per nginx)




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags



                                                              Nella configurazione del VirtualHost
        <VirtualHost *:80>
        	

     [...]                                        diciamo ad Apache di girare le richieste
        	

     ProxyRequests Off
                                                           alla url “autocomplete” al server node.js in
                                                                      ascolto sulla porta 3000
        	

     <Proxy *>
        	

     	

    Order deny,allow
        	

     	

    Allow from all
        	

     </Proxy>

        	

     ProxyPass /autocomplete http://www.example.it:3000/autocomplete
        	

     ProxyPassReverse /autocomplete http://www.example.it:3000/autocomplete
        </VirtualHost>




martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags
                              Esempio di vocabolario con 3000 termini




                        Node.js: 15ms              Chiamata standard Drupal: 131ms



martedì 6 dicembre 11
Code session: realizzazione di un modulo per
   l’autocompletamento dei tags

    •       Possibili migliorie (però con implementazione più complessa)


        •       Mongodb per memorizzare i termini


        •       Socket.io per ovviare al problema del cross domain scripting




martedì 6 dicembre 11
drupal.org/project/nodejs


   •       Ancora in versione beta (ma sviluppato attivamente)


   •       Canali multipli per inviare messaggi asincroni a tutti i client connessi al sito a seconda dei ruoli/
           permessi


   •       Basato su Socket.io, express e connect


   •       Composto da uno script node.js e da un insieme di moduli Drupal


         •       nodejs_notify -> notifiche growl like


         •       nodejs_subscribe -> notifica cambiamenti nei contenuti


         •       nodejs_actions -> action per inviare messaggi, usabile anche da Rules




martedì 6 dicembre 11
drupal.org/project/nodejs

                        client                                                                Drupal
                                                      Richiesta iniziale


                                            Risposta con token di autenticazione


                                                              node
                                        Invio token
                                                                     Verifica autenticazione


                                                                           Lista canali


                                   Autenticazione riuscita




                                 Le chiamate successive non
                                   passano più da Drupal




martedì 6 dicembre 11
Domande ?!
                    (se non basta il tempo o volete vedere una demo ci
                                 vediamo al desk Wellnet)




martedì 6 dicembre 11
Luca Lusso

                        www.wellnet.it


                        it.linkedin.com/pub/luca-lusso/29/3a9/1a2




martedì 6 dicembre 11
martedì 6 dicembre 11
Ad

Recommended

Node.js - Server Side Javascript
Node.js - Server Side Javascript
Matteo Napolitano
 
Lezione 5: Socket SSL/ TLS
Lezione 5: Socket SSL/ TLS
Andrea Della Corte
 
Lezione12: Autenticazione e gestione delle sessioni in REST
Lezione12: Autenticazione e gestione delle sessioni in REST
Andrea Della Corte
 
Programmazione web libera dai framework
Programmazione web libera dai framework
Francesca1980
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
lordarthas
 
Lezione 11: Accesso ai RESTful Web Services in Java
Lezione 11: Accesso ai RESTful Web Services in Java
Andrea Della Corte
 
JavaScript
JavaScript
Manuel Scapolan
 
socket e SocketServer: il framework per i server Internet in Python
socket e SocketServer: il framework per i server Internet in Python
PyCon Italia
 
Lezione 10: Web Service in Java (2)
Lezione 10: Web Service in Java (2)
Andrea Della Corte
 
Lezione 9: Web Service in Java
Lezione 9: Web Service in Java
Andrea Della Corte
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
Giuseppe Dell'Abate
 
Progetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti Wireless
Silvio Daminato
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
Andrea Della Corte
 
Apache Parte 1
Apache Parte 1
Majong DevJfu
 
Apache Parte 2
Apache Parte 2
Majong DevJfu
 
Introduzione a node.js
Introduzione a node.js
Luciano Colosio
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method Invocation
Andrea Della Corte
 
Corso Java 3 - WEB
Corso Java 3 - WEB
Giuseppe Dell'Abate
 
REST con Jersey
REST con Jersey
Fabio Bonfante
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
Myti S.r.l.
 
Javascript
Javascript
Roberto Cappelletti
 
Introduzione DevOps con Ansible
Introduzione DevOps con Ansible
Matteo Magni
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
Dominopoint - Italian Lotus User Group
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
Francesca1980
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
Stefano Dindo
 
SaaS con Symfony2
SaaS con Symfony2
Matteo Moretti
 
Logging
Logging
Paolo Predonzani
 
Php mysql3
Php mysql3
orestJump
 
Tooling, theming, made easy
Tooling, theming, made easy
Evan Butera
 
A new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp London
Luca Lusso
 

More Related Content

What's hot (20)

Lezione 10: Web Service in Java (2)
Lezione 10: Web Service in Java (2)
Andrea Della Corte
 
Lezione 9: Web Service in Java
Lezione 9: Web Service in Java
Andrea Della Corte
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
Giuseppe Dell'Abate
 
Progetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti Wireless
Silvio Daminato
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
Andrea Della Corte
 
Apache Parte 1
Apache Parte 1
Majong DevJfu
 
Apache Parte 2
Apache Parte 2
Majong DevJfu
 
Introduzione a node.js
Introduzione a node.js
Luciano Colosio
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method Invocation
Andrea Della Corte
 
Corso Java 3 - WEB
Corso Java 3 - WEB
Giuseppe Dell'Abate
 
REST con Jersey
REST con Jersey
Fabio Bonfante
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
Myti S.r.l.
 
Javascript
Javascript
Roberto Cappelletti
 
Introduzione DevOps con Ansible
Introduzione DevOps con Ansible
Matteo Magni
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
Dominopoint - Italian Lotus User Group
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
Francesca1980
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
Stefano Dindo
 
SaaS con Symfony2
SaaS con Symfony2
Matteo Moretti
 
Logging
Logging
Paolo Predonzani
 
Php mysql3
Php mysql3
orestJump
 
Lezione 10: Web Service in Java (2)
Lezione 10: Web Service in Java (2)
Andrea Della Corte
 
Lezione 9: Web Service in Java
Lezione 9: Web Service in Java
Andrea Della Corte
 
Progetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti Wireless
Silvio Daminato
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
Andrea Della Corte
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method Invocation
Andrea Della Corte
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
Myti S.r.l.
 
Introduzione DevOps con Ansible
Introduzione DevOps con Ansible
Matteo Magni
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
Francesca1980
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
Stefano Dindo
 

Viewers also liked (8)

Tooling, theming, made easy
Tooling, theming, made easy
Evan Butera
 
A new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp London
Luca Lusso
 
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
DrupalDay
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8
DrupalDay
 
Ineditus
Ineditus
Eugenio Minardi
 
Drupal per la ricerca
Drupal per la ricerca
Eugenio Minardi
 
Wireframe, mockup e visual: quali strumenti per le prime fasi di un design?
Wireframe, mockup e visual: quali strumenti per le prime fasi di un design?
Eugenio Minardi
 
Codemotion 2012 : Accesso e analisi di Open Data: come gestire l'anarchia dei...
Codemotion 2012 : Accesso e analisi di Open Data: come gestire l'anarchia dei...
Eugenio Minardi
 
Tooling, theming, made easy
Tooling, theming, made easy
Evan Butera
 
A new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp London
Luca Lusso
 
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
DrupalDay
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8
DrupalDay
 
Wireframe, mockup e visual: quali strumenti per le prime fasi di un design?
Wireframe, mockup e visual: quali strumenti per le prime fasi di un design?
Eugenio Minardi
 
Codemotion 2012 : Accesso e analisi di Open Data: come gestire l'anarchia dei...
Codemotion 2012 : Accesso e analisi di Open Data: come gestire l'anarchia dei...
Eugenio Minardi
 
Ad

Similar to Drupal Day 2011 - Node.js e Drupal (20)

Introduzione a Node.js
Introduzione a Node.js
Michele Capra
 
Web frameworks
Web frameworks
Gianfranco Reppucci
 
Il Web orientato al futuro: Express, Angular e nodeJS
Il Web orientato al futuro: Express, Angular e nodeJS
Eugenio Minardi
 
Web frameworks
Web frameworks
Appsterdam Milan
 
Codemonkey, applicazione innovativa per programmatori e aziende
Codemonkey, applicazione innovativa per programmatori e aziende
ValerioIacobucci
 
Node js dev day napoli 2016
Node js dev day napoli 2016
Michele Nasti
 
Node and the Cloud
Node and the Cloud
Luciano Colosio
 
AngularJS: server communication
AngularJS: server communication
Vittorio Conte
 
Drupal Day 2012 - Applicazioni mobile multipiattaforma integrate con Drupal 7...
Drupal Day 2012 - Applicazioni mobile multipiattaforma integrate con Drupal 7...
DrupalDay
 
node.js e Postgresql
node.js e Postgresql
Lucio Grenzi
 
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
sparkfabrik
 
Code quality e test automatizzati con JavaScript
Code quality e test automatizzati con JavaScript
Roberto Messora
 
Introduzione a node: cenni storici ecc
Introduzione a node: cenni storici ecc
Luciano Colosio
 
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
Michel Morelli
 
DDAY2014 - Costruire una app mobile con Ionic, AngularJS ed ovviamente Drupal
DDAY2014 - Costruire una app mobile con Ionic, AngularJS ed ovviamente Drupal
DrupalDay
 
Tecnologie emergenti per lo sviluppo di web applications: il caso di Ruby on ...
Tecnologie emergenti per lo sviluppo di web applications: il caso di Ruby on ...
David Saitta
 
Web 2.0 sviluppare e ottimizzare oggi
Web 2.0 sviluppare e ottimizzare oggi
Alessandro Cinelli (cirpo)
 
breve introduzione a node.js
breve introduzione a node.js
netmeansnet
 
HTML5, il lato client della forza...
HTML5, il lato client della forza...
Marco Vito Moscaritolo
 
breve introduzione a node.js
breve introduzione a node.js
eugenio pombi
 
Introduzione a Node.js
Introduzione a Node.js
Michele Capra
 
Il Web orientato al futuro: Express, Angular e nodeJS
Il Web orientato al futuro: Express, Angular e nodeJS
Eugenio Minardi
 
Codemonkey, applicazione innovativa per programmatori e aziende
Codemonkey, applicazione innovativa per programmatori e aziende
ValerioIacobucci
 
Node js dev day napoli 2016
Node js dev day napoli 2016
Michele Nasti
 
AngularJS: server communication
AngularJS: server communication
Vittorio Conte
 
Drupal Day 2012 - Applicazioni mobile multipiattaforma integrate con Drupal 7...
Drupal Day 2012 - Applicazioni mobile multipiattaforma integrate con Drupal 7...
DrupalDay
 
node.js e Postgresql
node.js e Postgresql
Lucio Grenzi
 
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
sparkfabrik
 
Code quality e test automatizzati con JavaScript
Code quality e test automatizzati con JavaScript
Roberto Messora
 
Introduzione a node: cenni storici ecc
Introduzione a node: cenni storici ecc
Luciano Colosio
 
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
Michel Morelli
 
DDAY2014 - Costruire una app mobile con Ionic, AngularJS ed ovviamente Drupal
DDAY2014 - Costruire una app mobile con Ionic, AngularJS ed ovviamente Drupal
DrupalDay
 
Tecnologie emergenti per lo sviluppo di web applications: il caso di Ruby on ...
Tecnologie emergenti per lo sviluppo di web applications: il caso di Ruby on ...
David Saitta
 
breve introduzione a node.js
breve introduzione a node.js
netmeansnet
 
breve introduzione a node.js
breve introduzione a node.js
eugenio pombi
 
Ad

More from DrupalDay (20)

[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
DrupalDay
 
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
DrupalDay
 
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
DrupalDay
 
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
DrupalDay
 
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
DrupalDay
 
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
DrupalDay
 
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più
DrupalDay
 
[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 Stakeholders
DrupalDay
 
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
DrupalDay
 
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
DrupalDay
 
[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio
DrupalDay
 
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
DrupalDay
 
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
DrupalDay
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework
DrupalDay
 
[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party
DrupalDay
 
[drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance!
DrupalDay
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
DrupalDay
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
DrupalDay
 
[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces
DrupalDay
 
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
DrupalDay
 
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
DrupalDay
 
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
DrupalDay
 
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
DrupalDay
 
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
DrupalDay
 
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
DrupalDay
 
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
DrupalDay
 
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più
DrupalDay
 
[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 Stakeholders
DrupalDay
 
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
DrupalDay
 
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
DrupalDay
 
[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio
DrupalDay
 
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
DrupalDay
 
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
DrupalDay
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework
DrupalDay
 
[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party
DrupalDay
 
[drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance!
DrupalDay
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
DrupalDay
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
DrupalDay
 
[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces
DrupalDay
 
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
DrupalDay
 

Drupal Day 2011 - Node.js e Drupal

  • 1. Node.js e Drupal Luca Lusso - Wellnet martedì 6 dicembre 11
  • 2. Cos’è e come funziona node.js • Javascript sul server • Basato su V8 di Google (il motore javascript di Chrome, open-source) • Event driven • I/O asincrono (mediante librerie esterne) martedì 6 dicembre 11
  • 3. Cos’è e come funziona node.js • Un singolo processo gestisce il main event loop e tutte le connessioni (singolo thread) • I task sono eseguiti in modo asincrono lasciando il main event loop libero di gestire altre richieste • Anche nginx usa lo stesso modello semplicemente perché per una concorrenza massiva non possiamo usare un thread del sistema operativo per ogni connessione, è troppo pesante martedì 6 dicembre 11
  • 4. Cos’è e come funziona node.js processo di I/O (lento) es.: attesa dati da un processo di I/O (veloce) node webservice es.: query a Mongodb A Tempo B C martedì 6 dicembre 11
  • 5. Node.js può essere usato (e da il suo meglio) per • Gestire la concorrenza • I/O asincrono • Networking • Caricamento asincrono di componenti di una pagina via Ajax martedì 6 dicembre 11
  • 6. Node.js è sconsigliato per • Generare intere pagine web • Restituire grosse quantità di dati (download di file) -> ha un thread solo martedì 6 dicembre 11
  • 7. Dove si usa? • Applicazione mobile di Linkedin • Cloud9 (IDE su web) • Nodejitsu (Cloud per applicazioni in node.js) martedì 6 dicembre 11
  • 8. Installare node.js • http://nodejs.org/ • Ultima versione stabile (0.6.3) disponibile per tutti i sistemi operativi • github.com/joyent/node/wiki/Installation • Per Mac Os X e Windows è disponibile l’installer, per Linux basta scaricare il sorgente e compilare :-) martedì 6 dicembre 11
  • 9. Installare node.js • NPM (Node Package Manager) • Gestisce il download e l’installazione delle librerie aggiuntive • http://npmjs.org/ • Su Linux, Mac Os X: curl http://npmjs.org/install.sh | sudo sh (su Windows è un po’ più complesso) • Attualmente sono disponibili più di 5000 librerie per i più svariati casi d’uso • #> npm install express martedì 6 dicembre 11
  • 10. Hello world (hello.js) var http = require('http'); http.createServer(function (request, response) { console.log('Request received’); response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello Worldn'); }).listen(8000); console.log('Server running at http://127.0.0.1:8000/'); martedì 6 dicembre 11
  • 11. Hello world (hello.js) funkymac2:Desktop lussoluca$ node hello.js Server running at http://127.0.0.1:8000/ Request received martedì 6 dicembre 11
  • 12. Code session: realizzazione di un modulo per l’autocompletamento dei tags • Chiama Ajax per autocompletare i tags durante la digitazione • Necessita un bootstrap completo di Drupal per gestire la richiesta • /taxonomy/autocomplete/field_tags/a martedì 6 dicembre 11
  • 13. Code session: realizzazione di un modulo per l’autocompletamento dei tags • express (http://expressjs.com) • web framework per Node.js • Nel nostro esempio usiamo solo il routing, ma fa anche middleware, template e altro • mysql (github.com/felixge/node-mysql) • driver MySQL per node.js martedì 6 dicembre 11
  • 14. Code session: realizzazione di un modulo per l’autocompletamento dei tags var Client = require('mysql').Client; var client = new Client(); client.user = 'root'; client.password = 'root'; client.port = 3306; client.database = 'drupaldb'; martedì 6 dicembre 11
  • 15. Code session: realizzazione di un modulo per l’autocompletamento dei tags var app = require('express').createServer(); app.get('/autocomplete/:vid/:id', function(req, res) { martedì 6 dicembre 11
  • 16. Code session: realizzazione di un modulo per l’autocompletamento dei tags var query = client.query('SELECT * FROM [...]', [vid, arg, tags.join(',')], function selectCb(err, results, fields) { if (err) { throw err; Callback! Node.js non si ferma ad aspettare } i risultati dal db, li invierà al client quando var names = {}; saranno pronti! var prefix = (tags.length > 0) ? tags.join(',') + ', ' : ''; for (var i in results) { var result = results[i]; names[prefix + result.name] = result.name; } res.write(JSON.stringify(names)); res.end(); // end the request. }); martedì 6 dicembre 11
  • 17. Code session: realizzazione di un modulo per l’autocompletamento dei tags app.listen(3000); martedì 6 dicembre 11
  • 18. Code session: realizzazione di un modulo per l’autocompletamento dei tags martedì 6 dicembre 11
  • 19. Code session: realizzazione di un modulo per l’autocompletamento dei tags $form['name_nodejs'] = array( '#type' => 'textfield', '#title' => t('Tags Node.js version'), '#autocomplete_path' => '/autocomplete/1', '#size' => '100', '#maxlength' => '100', ); $form['name_drupal'] = array( '#type' => 'textfield', '#title' => t('Tags drupal version'), '#autocomplete_path' => 'taxonomy/autocomplete/field_tags', '#size' => '100', '#maxlength' => '100', ); martedì 6 dicembre 11
  • 20. Code session: realizzazione di un modulo per l’autocompletamento dei tags • /autocomplete/1/% non è un path Drupal • Necessario per bypassare il problema del cross domain scripting • Bisogna configurare il mod_proxy di Apache (cosa simile per nginx) martedì 6 dicembre 11
  • 21. Code session: realizzazione di un modulo per l’autocompletamento dei tags Nella configurazione del VirtualHost <VirtualHost *:80> [...] diciamo ad Apache di girare le richieste ProxyRequests Off alla url “autocomplete” al server node.js in ascolto sulla porta 3000 <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /autocomplete http://www.example.it:3000/autocomplete ProxyPassReverse /autocomplete http://www.example.it:3000/autocomplete </VirtualHost> martedì 6 dicembre 11
  • 22. Code session: realizzazione di un modulo per l’autocompletamento dei tags Esempio di vocabolario con 3000 termini Node.js: 15ms Chiamata standard Drupal: 131ms martedì 6 dicembre 11
  • 23. Code session: realizzazione di un modulo per l’autocompletamento dei tags • Possibili migliorie (però con implementazione più complessa) • Mongodb per memorizzare i termini • Socket.io per ovviare al problema del cross domain scripting martedì 6 dicembre 11
  • 24. drupal.org/project/nodejs • Ancora in versione beta (ma sviluppato attivamente) • Canali multipli per inviare messaggi asincroni a tutti i client connessi al sito a seconda dei ruoli/ permessi • Basato su Socket.io, express e connect • Composto da uno script node.js e da un insieme di moduli Drupal • nodejs_notify -> notifiche growl like • nodejs_subscribe -> notifica cambiamenti nei contenuti • nodejs_actions -> action per inviare messaggi, usabile anche da Rules martedì 6 dicembre 11
  • 25. drupal.org/project/nodejs client Drupal Richiesta iniziale Risposta con token di autenticazione node Invio token Verifica autenticazione Lista canali Autenticazione riuscita Le chiamate successive non passano più da Drupal martedì 6 dicembre 11
  • 26. Domande ?! (se non basta il tempo o volete vedere una demo ci vediamo al desk Wellnet) martedì 6 dicembre 11
  • 27. Luca Lusso www.wellnet.it it.linkedin.com/pub/luca-lusso/29/3a9/1a2 martedì 6 dicembre 11