SlideShare a Scribd company logo
1 of 28
Download to read offline
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

More Related Content

What's hot

Lezione 10: Web Service in Java (2)
Lezione 10: Web Service in Java (2)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 JavaLezione 9: Web Service in Java
Lezione 9: Web Service in JavaAndrea Della Corte
 
Progetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti WirelessProgetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti WirelessSilvio Daminato
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLAndrea Della Corte
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationLezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationAndrea 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-2013No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013Myti S.r.l.
 
Introduzione DevOps con Ansible
Introduzione DevOps con AnsibleIntroduzione DevOps con Ansible
Introduzione DevOps con AnsibleMatteo Magni
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingFrancesca1980
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
 

What's hot (20)

Lezione 10: Web Service in Java (2)
Lezione 10: Web Service in Java (2)Lezione 10: Web Service in Java (2)
Lezione 10: Web Service in Java (2)
 
Lezione 9: Web Service in Java
Lezione 9: Web Service in JavaLezione 9: Web Service in Java
Lezione 9: Web Service in Java
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
Progetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti WirelessProgetto su iPhone - Seminario di Reti Wireless
Progetto su iPhone - Seminario di Reti Wireless
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
 
Apache Parte 1
Apache Parte 1Apache Parte 1
Apache Parte 1
 
Apache Parte 2
Apache Parte 2Apache Parte 2
Apache Parte 2
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Lezione 6: Remote Method Invocation
Lezione 6: Remote Method InvocationLezione 6: Remote Method Invocation
Lezione 6: Remote Method Invocation
 
Corso Java 3 - WEB
Corso Java 3 - WEBCorso Java 3 - WEB
Corso Java 3 - WEB
 
REST con Jersey
REST con JerseyREST con Jersey
REST con Jersey
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
 
Javascript
JavascriptJavascript
Javascript
 
Introduzione DevOps con Ansible
Introduzione DevOps con AnsibleIntroduzione DevOps con Ansible
Introduzione DevOps con Ansible
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continuaDDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
 
Simple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computingSimple Cloud API: accesso semplificato al cloud computing
Simple Cloud API: accesso semplificato al cloud computing
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 
SaaS con Symfony2
SaaS con Symfony2SaaS con Symfony2
SaaS con Symfony2
 
Logging
LoggingLogging
Logging
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 

Viewers also liked

Tooling, theming, made easy
Tooling, theming, made easyTooling, theming, made easy
Tooling, theming, made easyEvan Butera
 
A new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp LondonA new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp LondonLuca Lusso
 
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAIDrupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAIDrupalDay
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DrupalDay
 
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?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...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
 

Viewers also liked (8)

Tooling, theming, made easy
Tooling, theming, made easyTooling, theming, made easy
Tooling, theming, made easy
 
A new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp LondonA new tool for measuring performance in Drupal 8 - DrupalCamp London
A new tool for measuring performance in Drupal 8 - DrupalCamp London
 
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAIDrupal Day 2011 - Drupal per la ricerca, il caso EAI
Drupal Day 2011 - Drupal per la ricerca, il caso EAI
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8
 
Ineditus
IneditusIneditus
Ineditus
 
Drupal per la ricerca
Drupal per la ricercaDrupal per la ricerca
Drupal per la ricerca
 
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?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?
 
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...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...
 

Similar to Drupal Day 2011 - Node.js e Drupal

Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e PostgresqlLucio Grenzi
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Alessandro Loffredo
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.jsnetmeansnet
 
SQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkSQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkAlessio Biasiutti
 
Deploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesDeploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesStefano Dindo
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)Davide Cerbo
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Railsjekil
 
Web base-03-js-numeri stringearray
Web base-03-js-numeri stringearrayWeb base-03-js-numeri stringearray
Web base-03-js-numeri stringearrayStudiabo
 
Advanced Database Models and Architectures: Big Data: MySQL VS MongoDB
Advanced Database Models and Architectures: Big Data: MySQL VS MongoDBAdvanced Database Models and Architectures: Big Data: MySQL VS MongoDB
Advanced Database Models and Architectures: Big Data: MySQL VS MongoDBLuca Marignati
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Java Unit Testing - In container and database testing
Java Unit Testing - In container and database testingJava Unit Testing - In container and database testing
Java Unit Testing - In container and database testingfgianneschi
 
Stack tecnologico Per Linked Data
Stack tecnologico Per Linked DataStack tecnologico Per Linked Data
Stack tecnologico Per Linked DataSynapta
 
Stack tecnologico Per Linked Data
Stack tecnologico Per Linked DataStack tecnologico Per Linked Data
Stack tecnologico Per Linked DataDavide Allavena
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 

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

Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e Postgresql
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015
 
Idp, passo dopo passo!
Idp, passo dopo passo!Idp, passo dopo passo!
Idp, passo dopo passo!
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
SQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkSQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with Spark
 
Infrastructure as Data
Infrastructure as DataInfrastructure as Data
Infrastructure as Data
 
J huery
J hueryJ huery
J huery
 
Deploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesDeploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web Services
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Rails
 
Web base-03-js-numeri stringearray
Web base-03-js-numeri stringearrayWeb base-03-js-numeri stringearray
Web base-03-js-numeri stringearray
 
Advanced Database Models and Architectures: Big Data: MySQL VS MongoDB
Advanced Database Models and Architectures: Big Data: MySQL VS MongoDBAdvanced Database Models and Architectures: Big Data: MySQL VS MongoDB
Advanced Database Models and Architectures: Big Data: MySQL VS MongoDB
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
Java Unit Testing - In container and database testing
Java Unit Testing - In container and database testingJava Unit Testing - In container and database testing
Java Unit Testing - In container and database testing
 
Stack tecnologico Per Linked Data
Stack tecnologico Per Linked DataStack tecnologico Per Linked Data
Stack tecnologico Per Linked Data
 
Stack tecnologico Per Linked Data
Stack tecnologico Per Linked DataStack tecnologico Per Linked Data
Stack tecnologico Per Linked Data
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 

More from DrupalDay

[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.[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...[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[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client ManagerDrupalDay
 
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al themingDrupalDay
 
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5DrupalDay
 
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...[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ù[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[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - Drupal 4 StakeholdersDrupalDay
 
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di SapienzaDrupalDay
 
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal![drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!DrupalDay
 
[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizio[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Quando l’informazione è un servizioDrupalDay
 
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8DrupalDay
 
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a timeDrupalDay
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 frameworkDrupalDay
 
[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release party[drupalday2017] - Devel - D8 release party
[drupalday2017] - Devel - D8 release partyDrupalDay
 
[drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - Speed-up your Drupal instance![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[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8DrupalDay
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8DrupalDay
 
[drupalday2017] - REST in pieces
[drupalday2017] - REST in pieces[drupalday2017] - REST in pieces
[drupalday2017] - REST in piecesDrupalDay
 
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...DrupalDay
 

More from DrupalDay (20)

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

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