Your SlideShare is downloading. ×
Introducción a NodeJS
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Introducción a NodeJS

2,033
views

Published on

Ideas y principios de NodeJs ¿por qué es una buena opción? Descubre sus ventajas y funcionamiento a través de esta presentación informativa.

Ideas y principios de NodeJs ¿por qué es una buena opción? Descubre sus ventajas y funcionamiento a través de esta presentación informativa.

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,033
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
21
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Noviembre 2013 https://github.com/QuickTutorials/nodeJS luis.gonzalez@beeva.com carlos.hernadez@beeva.com manuel.delavega@beeva.com manuel.depaz@beeva.com
  • 2. Estructura del curso ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ¿Javascript en el lado del servidor? Ideas y principios de Node.js Benchmarking: Apache vs Node.js Teoría de la programación en Javascript Concurrencia, Ciclo de Eventos y I/O no bloqueante JSON = JS Object Notation Instalando node.js Modules, packages, ... NPM Developing and debugging with Eclipse Otro IDE… en la nube El estado del arte Referencias y documentación
  • 3. ¿Qué es node.js? Node.js es un entorno de programación en el lado del servidor basado en el lenguaje de programación Javascript, con I/O de datos en una arquitectura orientada a eventos, y creado a partir del motor del navegador Chrome: V8. Fue creado con el enfoque de ser útil en la creación de programas de red altamente escalables, como por ejemplo, servidores web.
  • 4. Historia de node ● ● ● La primera versión se publicó en 2009 Node es el entorno de ejecución más librerías. Se ha creado a partir del motor V8 de Google Chrome: 8000 líneas de C/C++ 2000 líneas de Javascript ● ● ● ● ● Javascript del lado del servidor (SSJS) Centrado en la eficiencia Utiliza un ciclo de eventos en lugar de hilos nuevos por cada conexión (event loop). Cada operación de I/O de node es asíncrona. Puede manejar miles de conexiones simultáneas con una sobrecarga mínima en un sólo proceso
  • 5. Historia de node ¿Quién usa node?
  • 6. Historia de node ¿Para qué se puede usar node? ● ● ● ● ● ● ● ● Creación rápida de servidores http/tcp/… (http, net,...) Aplicaciones Web (p.e. Express, Jade, …) Servicios Web (p.e. Restify,...) Conexión con Bases de datos (MySQL, MongoDB, SQlite) Control de dispositivos Arduino (p.e. Johnny-Five) Scripting y conversiones en local o en servidor (p.e. Less) Manejo de flujos binarios por ejemplo para para Web RTC (p.e. Lynckia) … Todo esto se logra de forma ágil y rápida con las funcionalidades de node.js y a través de multitud de módulos que siempre se intenta que se integren de forma transparente bajo la misma perspectiva de rendimiento y asincronía.
  • 7. Benchmarking: Apache vs Node.js Node.js Apache PHP Leyenda Fuente: Usuarios Concurrentes http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php https://code.google.com/p/node-js-vs-apache-php-benchmark/wiki/Tests http://blog.loadimpact.com/2013/02/01/node-js-vs-php-using-load-impact-to-visualize-node-js-efficency/ Tiempo de Respuesta Uso de CPU en servidor
  • 8. Benchmarking: Apache vs Node.js Fuente: http://www.richwandell.com/wordpress/realistic-node-js-vs-apache-php-test/
  • 9. Benchmarking: Apache vs Nginx I/O latency L1: 3 cycles L2: 14 cycles RAM: 250 cycles DISK: 41,000,000 cycles NETWORK: 240,000,000 cycles Nginx también usa un ciclo de eventos en lugar de una conexión por hilo como Apache. Fuente: http://blog.webfaction.com/2008/12/a-little-holiday-present-10000-reqssec-with-nginx-
  • 10. ¿Por qué es más rápido Node.js? Gracias a su naturaleza asíncrona Node no ocupa ciclos de procesador ni recursos cuando se cambia de hilo o proceso. 500 milisegundos llamada a BBDD llamada a BBDD IDLE 500 milisegundos proceso respuesta programa síncrono java/php ... proceso respuesta programa asíncrono en nodejs
  • 11. ¿Por qué es más rápido Node.js? Node.js no es más rápido… pero maneja mucho mejor la concurrencia “masiva” ya que es asíncrono… lo que da la apariencia de ser más rápido.
  • 12. Teoría de Javascript ● ● ● Lenguaje interpretado Débilmente tipado Sobrecargado gracias a V8 pero también con ● ● ● ● ● POO Excepciones Herencia Prototipos … Ahora, lo que antes era window (front-side) es runtime (server-side)
  • 13. Concurrencia, Ciclo de Eventos y I/O no bloqueante PHP <?php $books = array("Myst: The Book of Atrus", "Myst: The Book of Ti'ana", "Myst: The Book of D'ni"); serveBooks($books); function serveBooks($books) { echo $html = '<b>' . join($books, '</b><br/><b>') . '</b>'; $books = array(); // Intentionally cleaned } ?> Node.js var books = [ 'The Fellowship of the Ring', 'The Two Towers', 'The return of the King' ]; function serveBooks() { var html = '<b>' + books.join('</b><br/><b>') + '</b>'; books = []; // Intentionally cleaned } Recordad Chavalada: “Un gran poder conlleva una gran responsabilidad”
  • 14. Concurrencia, Ciclo de Eventos y I/O no bloqueante PHP <?php print('Hello'); sleep(5); print('World'); ?> Node.js console.log('Hello'); setTimeout(function() { console.log('World'); }, 5000); console.log('(Im waiting here meanwhile... but not blocked)'); // Imprime Hello (espera 5s) World // Imprime Hello I’m waiting here meanwhile… but not blocked (espera 5s) World
  • 15. Concurrencia, Ciclo de Eventos y I/O no bloqueante // Operaciones de E/S bloqueantes var urls = db.query("select * from urls"); //esperar urls.each(function(url) { var page = http.get(url); //esperar save(page); //esperar }); // E/s No bloqueante, petición asíncrona db.query("select * from urls", function(urls) { url.each(function(url) { http.get(url, function(page) { save(page); }); }); });
  • 16. Concurrencia, Ciclo de Eventos y I/O no bloqueante Aún así, siempre podemos hacerlo mal var start = Date.now(); console.log('time at start? ' + start); console.log('calling #1'); setTimeout(function() { console.log('seconds elapsed at #1 function? '+ (Date.now()start)); for (var i=0;i<10000000000; i++) { /* do nothing, but blocks the execution */ } }, 1000); console.log('calling #2'); setTimeout(function() { console.log('seconds elapsed at #2 function? '+ (Date.now()start)); }, 2000); console.log('EOF'); // Imprime time at start? 1383521764394 calling #1 calling #2 EOF seconds elapsed at #1 function? 1006 (espera 17s bloqueado) seconds elapsed at #2 function? 17526
  • 17. Concurrencia, Ciclo de Eventos y I/O no bloqueante PHP (30s aprox = 3000 emails) <?php $addresses = array( ‘luis.gonzales@beeva.com', ‘carlos.hernadez@beeva.com', ‘manuel.delavega@beeva.com', ‘manuel.depaz@beeva.com' ); $message = 'I am writing to inform you of a...'; $count = 0; foreach($addresses as $person) { // Attempt to send email. if (mail($person, 'New opportunity', $message)) { $count++; } } Node.js (3s aprox = 3000 emails) var mail = require('mail'); var addresses = [ ‘luis.gonzales@beeva.com', ‘carlos.hernadez@beeva.com', ‘manuel.delavega@beeva.com', ‘manuel.depaz@beeva.com']; var message = 'I am writing to inform you of a...'; var count = 0; addresses.forEach(function(person, i) { // Attempt to send email. mail(person, 'New opportunity', message, function(err) { if (!err) { count++; } // Don't wait, get the next address NOW. if (i == addresses.length - 1) { console.log(count + " messages sent"); } // Once email is sent, get the next address. echo $count . "messages sent"; ?> }); });
  • 18. Python Single Thread vs Node Ejemplo gráfico acerca de qué significa realmente asíncrono vs síncrono: *Insertamos en python (sin hilos) 50 elementos en una tabla. *Insertamos esos mismos 50 elementos con node. ¿Qué pasa? fuente: https://github.com/roclas/nodejsutilities/tree/master/benchmarks
  • 19. JSON = JS Object Notation if (process.argv.length<3){ console.error("missing argument (file to parse)"); return(-1); } var fs = require('fs'),readline = require('readline'); Ejemplo práctico. ¿Que mejor lenguaje que javascript para procesar objetos en notación javascript (json)? var rd = readline.createInterface({ input: fs.createReadStream(process.argv[2]), output: process.stdout, terminal: false }); rd.on('line', function(line) { try { var l=JSON.parse(line); console.log(JSON.stringify(l,null,4)); } catch(error) {} }); Fuente https://github.com/roclas/nodejsutilities/blob/master/parse_json_lines.js
  • 20. Instalando node.js Descargamos la última versión desde: http://nodejs.org/download/ * Requiere Python 2.6+ si se quiere construir a partir de los fuentes ● Instalar node.js en Ubuntu sudo apt-get install python-software-properties sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs npm ● Compilar* e Instalar node.js en otras distribuciones: apt-get install python g++ make mkdir ~/nodejs && cd $_ wget -N http://nodejs.org/dist/node-latest.tar.gz tar xzvf node-latest.tar.gz && cd `ls -rd node-v*` ./configure make install ● Microsoft Windows y Mac OS X tienen su propio asistente instalador: http://nodejs.org/dist/v0.10.21/x64/node.exe (x64) o http://nodejs.org/dist/v0.10.21/node.exe (i386) http://nodejs.org/dist/v0.10.21/node-v0.10.21.pkg (universal)
  • 21. Modules, packages, ... Packages per day across popular platforms. (Source: www.modulecounts.com)
  • 22. Modules, packages, ... Fuente https://www.modulecounts.com
  • 23. Modules, packages, ... Un módulo es cualquier cosa que pueda cargarse con un require() en un programa, por ejemplo: ● ● ● ● Una carpeta con un fichero package.json que tiene dentro con un main(). Una carpeta con un fichero index.js. Un fichero javascript cualquiera. Un fichero json cualquiera. Un paquete es: A. Una carpeta que contiene un programa descrito por un fichero package.json. B. C. D. E. F. G. un tarball comprimido que contiene un A. una url que resuelve a un B. un <name>@<version> que es publicado mediante un C. un <name>@<tag> que apunta a un D. un <name> cuyo último tag satisface E. una url Git que cuando es clonada se convierte en un A.
  • 24. package.json { "name": "best-practices", "description": "A package using versioning best-practices", "author": "Charlie Robbins <charlie@nodejitsu.com>", "dependencies": { "colors": "0.x.x", "express": "2.3.x", "optimist": "0.2.x" }, "devDependencies": { "vows": "0.5.x" }, "engine": "node >= 0.4.1" }
  • 25. Desarrollando y depurando con Eclipse Hay dos alternativas para desarrollar con Eclipse: ● Nodeclipse: http://dl.bintray.com/nodeclipse/nodeclipse/0.7.0/ ● eNide: http://www.nodeclipse.org/enide/studio/
  • 26. Desarrollando y depurando en Chrome Fuente: https://developers.google.com/chrome-developer-tools/docs/javascriptdebugging
  • 27. Otro IDE… en la nube https://c9.io
  • 28. El estado del arte A continuación os mostraremos una serie de aplicaciones realizadas con Node.
  • 29. Proxy inverso de CSS Proxy inverso de CSS para desarrolladores de front. Utilizado para no tener que instalar entornos (eclipse+maven+tomcat+...¿?) si solo queremos editar css / falsear ciertos servicios. https://github.com/roclas/nodejsutilities
  • 30. scripting… Node.js se puede utilizar también para crear herramientas y programas para línea de comando (CLI). https://github.com/vonkhades/stem.js/wiki intérprete https://github.com/vonkhades/stem.js
  • 31. angularjs+websocket+mongodb El propósito de esta aplicación es ofrecer una arquitectura completa basada en javascript para el desarrollo de aplicaciones web, tanto el lado de servidor como el de front. Hoy en día estos es posible gracias a entornos de ejecución como NodeJS, que nos permiten programar nuestro backend en javascript, pero también nos ayuda a realizar ciertas tareas en el front. La comunicación con el servidor en esta aplicación estará basada en websockets, conectando con una base de datos orientada a documentos (en nuestro caso una mongodb), alojada en www.mongolab.com. https://github.com/madelavega/angularjs-websocket-mongodb
  • 32. Referencias y documentación ● ● Web Oficial de Node.js: http://nodejs.org/ eBook Smashing Node.js http://smashingnode.com/ ● ● ● ● ● Presentación sobre el modelo I/O http://nodejs.org/jsconf.pdf Artículo teórico sobre el diseño de node.js http://blog.nodejitsu.com/the-nodejs-philosophy Artículo de introducción a NPM http://informatica27.wordpress.com/2012/04/18/una-introduccion-a-npm-nodejs/ Presentación node.js http://www.slideshare.net/gabriele.lana/nodejs-explained-with-examples Presentación node.js http://blog.elfilo.net/charla_nodejs/ ● ● ● ● Blog con muchos ejemplos: http://howtonode.org/ Página web del proyecto V8 (Core del navegador Chrome): http://code.google.com/p/v8/ Repositorio con los ejemplos del curso en GitHub: https://github.com/QuickTutorials/nodeJS Tutorial-Ejemplo de una aplicación con node.js y express: http://codehero.co/series/node-y-express/ ● ● Charla sobre Node.js en (castellano): Charla de Node.js (castellano) http://www.tucamon.es/contenido/drupal-node-js ● Benckmark Java EE vs Node http://bijoor.me/2013/06/09/java-ee-threads-vs-node-js-which-is-better-for-concurrent-data-processingoperations/
  • 33. Ejercicio... Ejemplos de infobox vcard ● Crear un programa CLI o servidor que lea una pagina de la wikipedia como parámetro, y si esa pagina tiene "infobox vcard" que regrese un JSON. ● El programa deberá devolver específicamente el elemento DOM con clase “vcard” ● Utilizar jsdom https://github.com/tmpvar/jsdom para hacer el parser de HTML ● Para leer parámetros (CLI) usar process.argv[XXX] p.e. http://es.wikipedia.org/wiki/España leer el HTML de la wikipedia parsear el elemento DOM con clase css “vcard” recorrerlo y generar un json pantalla.

×