class: center, middle [nodejswtf]: img/nodejswtf.png [volto]: img/volto.png ![node? js? wtf?][nodejswtf] ### The sexy platform # Michele Nasti ### Linux Day, 19/10/2015, UNISA --- Chi Sono? ========= - I was a student @ Unisa, too! - http://michelenasti.com - Twitter ([@micnasti](https://twitter.com/micnasti)) - Linkedin (https://it.linkedin.com/in/michelenasti) ... e tutti gli altri posti on line (Stack Overflow, Github, ....) .right[
] ??? - mi sono laureato a Salerno nel 2012 - lavoro principalmente con Java e in ambito Enterprise, e ultimamente ho lavorato a un progetto con frontend Angular - Ho scoperto Javascript per caso e me ne sono innamorato - cerco di studiare al meglio tutte le tecnologie sia lavorative sia per sfizo, se trovo il tempo ;) - troverete queste slide sul mio sito --- .left-column[ ## What is NodeJS? ] .right-column[ ## linguaggio? libreria? framework? piattaforma? SaaS? PaaS? ...Risposta: **Piattaforma** Estratto dalla home page: > Node.js® is a JavaScript runtime built on Chrome's **V8 JavaScript engine**. Node.js uses an **event-driven, non-blocking I/O model** that makes it lightweight and efficient. ] ??? creatore di Node non ha dato una definizione. è una Piattaforma: fornisce un linguaggio di programmazione, Javascript, che non permette di accedere a file, socket, etc. (tantomento agli oggetti nel browser: controllate le specifiche!) Oltre al linguaggio fornisce le librerie per accedere al sistema operativo L'autore voleva provare a scrivere una piattaforma, o comunque un modello di programmazione, che non fosse il solito "request-based". Ha provato a scrivere qualcosa di simile con C++ ma non ci è riuscito. Quando Chrome ha reso disponibile il sorgente del suo motore JS, V8, si è trovato un linguaggio già pronto che rispecchiava il modello che aveva in mente. --- Vantaggi ======== - Il paradigma funzionale è **efficiente e reattivo** - è un modo di pensare diverso, e quando si impara qualcosa di diverso non sai mai quando ti potrà servire (ma poi ti serve) - aziende a tutti i livelli (Paypal, Ibm, Amazon, Ebay, Google...) stanno investendo in Node e stanno realizzando software con Node - Approccio **MEAN (MongoDB, ExpressJS, AngularJS, NodeJS)** --- Svantaggi ========= - è enterprise level? Il codice è strutturabile? (serve MOLTO testing) - non adatto a fare il sito web della salumeria di paese (ma se lo fate imparate tante cose) - è invece adatto per realizzare app che devono gestire molti dati in tempo reale (dashboard, backend di videogames, ...) --- .left-column[ ## What is NodeJS? Javascript Runtime ] .right-column[ ## Chrome V8 Javascript Engine - quanti altri JS runtime esistono? - Ecma2015 (o ES6) con Node 4.0 ] ??? Esistono tanti runtime di JS: actionScript, Nashorn, Rhino, i browser ... Da poco è uscita la versione 4.0 di Node che viene fuori da un merge con un fork, io.js supporta tutte le feature di JS es6 (funzioni arrow, variabili let, modularizzazione...) e le precedenti --- name: piccoladeviazione .left-column[ ## What is NodeJS? Javascript Runtime
] .right-column[ ## Addentriamoci in JS ! - il linguaggio più diffuso al mondo (gira su ogni browser) - è anacronistico disabilitare JS per motivi di sicurezza, e anche progettare siti senza JS - *"if something can be built in Javascript, it will eventually be built in Javascript"* - **JS non è più il giocattolo dei primi anni 2000. E' un linguaggio VERO e va studiato come tale** ] ??? Anche l'Enterprise sta sperimentando JS, con Angular, nel frontend Ai miei tempi i prof dicevano di progettare siti che non richiedessero js Ultimamente con JS stanno scrivendo di tutto Tutto questo rende difficile studiare JS. Online si trova di tutto, ma è tutto disorganizzatissimo. Con Node la conoscenza di JS potrà essere applicata sia su backend che su frontend!! --- .left-column[ ## What is NodeJS? Javascript Runtime
] .right-column[ ## Caratteristiche di JS - Non è *pure-OOP*, ma **prototype-based** - non è *pure-functional*, ma è un **ottimo linguaggio funzionale** - _purtroppo_ è facile (e sbagliato) creare funzioni super-globali: - la *community* ha risolto queste problematiche e le soluzioni sono state applicate anche su browser e in ES6 - browser !== nodejs ] ??? Js ha gli oggetti, ma non sono così importanti come lo sono in Java. Bisogna conoscerli Un linguaggio funzionale considera le funzioni come "first class object" JS è stato scritto in 10 giorni per il primo netscape, e nemmeno l'autore si immaginava tutto il successo che ha avuto. Dopo 30 anni è ancora Cool ! Il browser usa JS per creare pagine dinamiche; non si deve pensare di usare node per gli stessi compiti. Non si usa JQuery su node --- .left-column[ ## What is NodeJS? Javascript Runtime Event Based ] .right-column[ ## Event-Based - architettura a eventi ripresa da quella delle interfacce grafiche - browser: "se click su div, fai questo" - nodejs: "se conessione in input, scrivi "HTTP 200"
] ??? architetture ad eventi viene dalle interfacce grafiche il server viene programmato come se dovesse rispondere ad eventi; quando avviene qualcosa, è lui a richiamare la funzione adeguata. Nel frattempo potrà gestire altre richieste o fare altro. Questo approccio, insieme alla programmazione funzionale, ha spinto il parallelismo a livelli mai visti! Ma come fa un server con un solo thread ad essere parallelo? chart su nginx vs apache : mostrare pure che la memoria di nginx non aumenta --- .left-column[ ## What is NodeJS? Javascript Runtime Event Based Non-Blocking ] .right-column[ ## Non Blocking Model - tutto è asincrono... - ...e c'è un solo thread per JS
] ??? Cosa vuol dire "single threaded"? tutto il codice js viene eseguito all'interno di un singolo thread. le operazioni di IO, che sono quelle più lente, vengono delegate ad altri. --- name: helloworld .left-column[ ## Mani al codice! ] .right-column[ ## Hello World ```javascript console.log('Hello World!'); ``` ] --- .left-column[ ## Echo Server con Node ] .right-column[ ## Il nostro pappagallo-server ```javascript //echoServer.js var http = require('http'); http.createServer(function(request,response){ response.writeHead(200); request.on('data',function(message){ response.write(message); }); request.on('end',function(){ response.end(); }); }).listen(8080); ``` lanciamo il server con ```node echoServer.js``` testiamolo con ```curl -d 'ritorno al futuro!' http://localhost:8080``` ] ??? - 10 righe di codice, tanta roba! - parlare degli eventi "data" e "end" - modulo http (di node!) quello che avviene qui è asincrono --- class: center GRAZIE ====== ## Facciamo un Javascript User Group ?
The node Events loop