sábado, 12 de noviembre de 2016

Construyendo una app modular en node.js


Hace años que trabajo con node.js, llegando a convertirse en mi principal entorno en backend e incluso un poco en frontend con nw.js, y aun así, cada proyecto nuevo que inicio, es una odisea para encontrar la mejor estructura en la que tenga máxima flexibilidad sin crear un sistema de carpetas demasiado complejo.
Yo cada vez que inicio un proyecto nuevo ¡party hard!
No os podéis imaginar la de veces que he reestructurado mi código, buscando siempre la mejor forma.

Ahora me doy cuenta que la respuesta a una pregunta tan compleja es muy sencilla. La respuesta es que no hay mejor forma, sino estructuras que funcionan mejor que otras, dependiendo del tipo de aplicación que quieras hacer.

Lo que sí queda claro es que, hoy por hoy, un sistema modular es probablemente la mejor forma de desarrollar una aplicación, ya que es difícil saber cómo va a crecer. Por ello voy a explicar cómo crear una app modular en node.js, y si eso, dar una estructura base para empezar.

¿Por qué node.js? Porque node.js es uno de los entornos más flexibles, con más librerías open source que me han echado a la cara.

¿Por qué modular? Porque da muchas ventajas, entre las más notables:
  • Permite reutilizar código entre los diferentes módulos que forman la aplicación, incluso pudiendo reutilizar módulos entre servidor y cliente.
  • Cuando la aplicación tiene que crecer o cambiar, ayuda a minimizar la cantidad de código que hay que reescribir, incluso no siendo necesario reescribir nada si se plantea bien desde un principio.
  • Permite comprender el código mucho más fácilmente, al tener poco código en cada archivo en vez de miles de líneas.

Empecemos con el lío.

Para empezar, necesitamos tener un binario de node.js. Es tan sencillo como hacer click aquí para descargar un ejecutable standalone, sin instalaciones. Lo guardamos en una carpeta, abrimos la consola de comandos y vamos a crear nuestro primer script, para probar que todo está correcto. Lo vamos a llamar main.js, mismo, y lo guardamos junto a nuestro binario de node.js:
Ahora vamos a meter en el archivo esto:
console.log("Hola desde node.js :P");
Y lo ejecutamos escribiendo en la consola de comandos node main.js, y se debería ver el resultado:
Perfecto. Ahora creamos la carpeta lib y ya estamos listos. Vamos a por los módulos.

Node.js funciona mediante módulos. Hasta el mismo script inicial se ejecuta como tal. Incluso las funciones internas de node.js (para acceder al sistema de archivos, por ejemplo) son módulos.
Yaaay... ¿?
Tranquila April, eso no es malo. Un módulo es algo diferente a los includes de C a los que más de uno está acostumbrado. Un módulo es un componente aislado del resto de la aplicación, es decir, cuando se incluye un módulo, este se ejecuta aparte, sin mezclar su código con el código del módulo que lo carga. Puedes tener 3 módulos diferentes con código que declara los mismos nombres de variables sin problemas. Cada uno tendrá acceso a su variable "local".

Como supongo que te estarás preguntando ya, si los códigos no se mezclan y no tienen acceso a las variables del resto de módulos ¿cómo interactúan entre ellos?

Cada módulo debe exportar las variables que desee que sean accesibles desde otros módulos, utilizando module.exports.

Vamos a empezar por lo fácil. Creamos un simple script, tal que así:
var saludo = "Hola";

function saludar(nombre) {
    console.log(saludo + " " + nombre);
}

module.exports = saludar;
Esto ya es un módulo. Lo voy a guardar como saludo.js dentro de la carpeta lib.

Si quisiéramos saludar a alguien, tendríamos que cargar el módulo con require(), lo cual devolverá el contenido de module.exports, el cual contiene una referencia a la función saludar(), así que dentro de nuestro main.js simplemente tendríamos que hacer lo siguiente:
var saludar = require("./lib/saludo");

saludar("Pepe");
saludar("Juan Doe");
E ya. Con require() hemos cargado nuestro otro módulo, el cual exporta una referencia de una función, pero no exporta la variable saludo, por lo tanto si hiciéramos
console.log(saludo);
devolvería error, ya que no forma parte de este contexto.

Vamos a complicar más las cosas. Vamos a crear dos módulos, juan.js y pepe.js, los cuales cargarán nuestro módulo saludo.js, tal que así:
/* lib/juan.js */
var saludar = require("./saludo");

function saludarJuan() {
    return saludar("juan");
}

module.exports = saludarJuan;
/* lib/pepe.js */
var saludar = require("./saludo");

function saludarPepe() {
    return saludar("pepe");
}

module.exports = saludarPepe;
Y ahora vamos a jugar con ellos:
var juan = require("./lib/juan");
var pepe = require("./lib/pepe");

console.log(juan());
console.log(pepe());
En este código estamos cargando los módulos juan.js y pepe.js, y estos cargan el módulo saludo.js. Esto no quiere decir que el código de saludo.js es ejecutado 2 veces, ya que node.js es lo suficiente espabilado para cachear el módulo la primera vez que lo ejecuta y devolver esta caché las siguientes veces que se hace require().
Vamos, esos cinco April, que node masmola
Y con esto ya hemos sentado las bases de una aplicación modular en node.js. Como veis, si quisiéramos cambiar la forma de funcionar del saludo, tan sólo tendríamos que modificar saludo.js sin preocuparnos de nada más que exportar la función que queremos que se llame. Fácil, cómodo y JavaScript :P ¿Qué más se puede pedir?

Más adelante hablaré de una aplicación ¿supermodular? que estoy preparando. Con supermodular me refiero a una aplicación modular que es capaz de cargar módulos en caliente, sin necesidad de reiniciar el proceso principal y sin perder las referencias a los módulos antiguos mientras estos hagan falta. Es la magia de node.js.

domingo, 21 de agosto de 2016

Cosas curiosas: Velas espaciales


6.000-5.000 A.C. Los egipcios inventan la vela náutica permitiendo viajar grandes distancias, descubriendo lugares insospechados en la tierra, entre ellos uno de los más importantes allá por el año 1492 D.C. Unos 70 siglos más tarde de su invención.

Ahora le ha llegado la hora a las estrellas.

Empecemos por el principio. Hace casi 4 siglos, el astrónomo Johannes Kepler observó que la cola de los cometas no apuntan en dirección opuesta a su movimiento, como estamos acostumbrados a ver las cosas en la tierra, sino que se dibujan en dirección opuesta al Sol.


Ésto le hizo deducir que el Sol emitía un viento que empujaba las colas, y que deberíamos poder aprovechar ese viento creando velas para surcar el espacio.

Tan cerca pero tan lejos a la vez.

Johannes Kepler no se equivocaba en la idea de crear velas para surcar el espacio. Se equivocaba en la metodología. La mejor forma de impulsar una vela en el espacio no es mediante el viento solar, sino mediante el impulso de la luz solar.

Sí, la luz ejerce una fuerza sobre los objetos, y la explicación de ésto se lo debemos a la mecánica cuántica.
Cada vez que leo sobre mecánica cuántica
¿Cómo puede la luz ejercer una fuerza sobre los objetos? La explicación rápida es muy sencilla. Lo que nosotros llamamos comúnmente luz, es en realidad es una radiación electromagnética formada por partículas, las cuales se les llama fotones, y aquí es donde viene la magia. Los fotones son unas partículas un poco "especiales" que presentan el fenómeno cuántico dualidad onda-corpúsculo.

El fenómeno dualidad onda-corpúsculo significa que, según la situación, una partícula se puede comportar como onda o también como partícula con masa.

En la física de "toda la vida", estamos acostumbrados a tener una clara diferencia entre onda y partícula. Las ondas son simplemente variaciones en el espacio (presión, campos magnéticos, etc), sin transportar masa, nada más que energía, y las partículas con masa son eso, "objetos" minúsculos que pesan, poco, pero algo pesan, y como tales, en cuanto golpean a otro objeto, le transfieren su energía, es decir, lo "empujan".

¿Qué significa esta parrafada? Pues que la luz, al estar formada por fotones que también se comportan como partículas con masa, es posible que empujen otras partículas al golpearlas. La luz empuja, sí. Es algo que se empezó a debatir cuando se descubrió la presión de radiación, ya que la luz es una radiación electromagnética.

¿Es algo notable? Por supuesto. El tema que estábamos hablando al principio del post, la cola de los cometas, se ven en dirección opuesta al Sol por este motivo.

Algo más llamativo, el primer satélite de comunicaciones que lanzó el ser humano en 1960, el Echo-1, sufrió ésta presión, destrozando a golpes los fotones la delgada película que formaba el exterior del satélite.

Pero no es la primera vez que un satélite de la NASA es afectado por la presión de la luz solar. En 1974 la sonda espacial Mariner 10 se quedó corta de combustible al intentar realizar sus tareas alrededor del planeta Mercurio, así que los controladores tuvieron la idea de orientar los paneles solares de forma que pudieran aprovechar la presión de la luz solar para ahorrar combustible. Y gracias a unos tíos espabilados de la NASA se demostró la viabilidad de las velas solares, aunque fuera por accidente.

¡Oh sí, nena! ¡Ciencia!
Desde ese momento han habido varios intentos, fructuosos e infructuosos de lanzar satélites de pruebas con velas solares al espacio.

La primera aplicación funcional de una vela solar como tal, ha sido en los satélites de comunicaciones INSAT de la India, donde utilizan velas para compensar el giro que genera la presión solar en los paneles solares.

"Pero eso no es navegación espacial". Poco a poco, amijo. Hasta el año 2010 no se lanza con éxito el primer satélite con una vela solar como medio de impulsoIKAROS, fabricado por ¿Mitsubishi? y tan sólo por 13 millones de Euros. Una ganga señora.

Mitsubishi. Desde aires acondicionados hasta satélites. Not bad.
La sonda IKAROS tiene como destino Venus, y pretende demostrar la viabilidad de los motores híbridos (Mitsubishi y sus motores híbridos, hasta en el espacio). El impulso de esta sonda no es 100% vela solar, sino que también utiliza un motor de iones, pero bueno, por algo se empieza.

Selfie del satélite IKAROS con una cámara autoexpulsada
El problema de las velas solares es que, como imaginaréis, producen muy poco impulso. Por ejemplo, la presión que ofrece la luz solar a una distancia aproximada de la tierra es de 10 gramos por hectárea, así que una vela solar puede necesitar un día entero para aumentar su velocidad en 100 Km/h. Eso en el espacio es muy muy pero muy poco. La ventaja con respecto a los motores de propulsión que utilizamos ahora es que es una aceleración contínua, así que, aunque un motor de propulsión consiga mucha más velocidad en mucho menos tiempo, tiene un impulso total limitado.

Veremos dentro de 70 siglos qué nos encontramos por el espacio. Como dijo Louis Friedman: "Las velas solares son el único medio conocido para lograr vuelos interestelares prácticos".

domingo, 7 de agosto de 2016

FFmpeg: La navaja suiza multimedia


Hoy voy a hablar de una herramienta que me ha salvado el culo infinidad de veces: FFmpeg.

¿Qué es FFmpeg? Es simplemente un procesador multimedia. Decodifica y codifica prácticamente cualquier formato de vídeo/audio/imagen/loquesea que se te pueda ocurrir. "Pero, si ya hay infinidad de herramientas para ello, ¿qué es lo que la hace tan especial?" preguntarás. Simplemente que es una de las herramientas más famosas de código libre. Al ser una herramienta de las más famosas y de código libre, hay una gran comunidad detrás mejorando e implementando nuevas funciones día a día.

¿Quieres pasar tu peli en DVD al nuevo H.265? FFmpeg. ¿Quieres extraer el audio de un vídeo sin recodificar y así no perder ni un bit de calidad? FFmpeg. ¿Quieres retransmitir tu webcam en tiempo real a otro PC? FFmpeg. Incluso puedes crear un gif tan molón como éste a partir de un vídeo:
Y por la compra de FFmpeg, le regalamos esta... este... ¡ésto!
Y todo configurable hasta el límite. Si creías que convertir vídeo no era mucho más que elegir formato, FPS y calidad... cuando veas las opciones de configuración que FFmpeg te ofrece, te caes de culo.
¡Oh sí! ¡ Max bitrate!
Bueno, se acabó el momento teletienda. Para descargar FFmpeg puedes acceder a esta web. También puedes descargar el código fuente aquí y compilarlo tú, siguiendo alguna de estas guías.

martes, 2 de agosto de 2016

Script Blogger: Ayudas para las imágenes en el editor


Después de crear mi primer post, enseguida empecé a sufrir un par de problemas que tiene el editor de Blogger. Uno de ellos es una función añadida, pero que resulta bastante molesta, y la otra es una función que falta añadir.

La función molesta es que cuando añades una imagen, Blogger automáticamente crea un enlace clickable que apunta a la misma. Está claro que está bien poder hacer click en una imagen y verla a pantalla completa, pero dos cosillas; primero, que esa es una opción que el usuario debería elegir cuando añade una imagen en vez de estar de serie, y segundo, que no hay peor forma de ver una imagen a pantalla completa que simplemente abrir el enlace en el navegador. Con lo famosa que es la plataforma Blogger, si van a forzar esa situación, ya podrían haberse currado un visualizador de fotos, en vez de esa cutrez.

Se puede solucionar simplemente haciendo click en la pestaña HTML y modificando el código para borrar el link, pero, de nuevo, no es una forma bonita de hacer las cosas.

Cawen la leche, Blogger...
Como no puede ser de otra forma, ya estoy solucionando a golpe de script esas cosillas que no me gustan. He creado un script de Greasemonkey (Tampermonkey en Chrome) que realiza 2 funciones:
  • Eliminar los enlaces que se crean automáticamente cuando añades una imagen.
  • Poder añadir y y quitar clases de estilos CSS con un sólo click.
Yo en el mismo momento de crear este script
Con este script escribir entradas se hace más cómodo. Simplemente tengo que definir las clases que quiera en el header de la plantilla y, después de configurar el script, puedo aplicarlas a mis imágenes con un simple click.

¿Cómo instalar y configurar el script?

Para instalar el script hay que tener la extensión Tampermonkey (Chrome) o Greasemonkey (Firefox) instalada, entrar en uno de los siguientes enlaces: Greasyfork o OpenuserJS y hacer click en el botón Instalar este script o install, dependiendo de la página.

Después de haber instalado el script, hay que ir al panel de control de la extensión que hayas instalado, abrir el script y buscar la línea que empieza por var config = {


La configuración de serie viene con removeAnchor activado (true para activar, false para desactivar) y con 2 clases configuradas, gif e img.

Si activas removeAnchor, automáticamente va a eliminar los molestos enlaces clickables cada vez que añades una nueva imagen.

Viendo las dos clases se puede ver que tienen un color configurado, red y blue en este caso. Es es color que se mostrará en el editor para, visualmente, saber qué clase has colocado a una imagen. También están configuradas como unique (de nuevo true para activar y false para desactivar), lo que indica que sólo se permite tener una de esas dos clases activa a la vez. Si desactivas unique, entonces puedes colocar las dos clases a una misma imagen.

Después de configurar el script, nos vamos al editor de Blogger, añadimos una nueva imagen y hacemos click sobre ella. En el menú que se muestra bajo la imagen al hacer click, se podrá observar a la izquierda unos botones con los nombres de las clases configuradas, SET img y SET gif:


Y que al hacer click en uno de ellos, se enmarca la imagen con el color que hemos configurado y cambia el texto a REMOVE:


Simplemente con un click ya hemos cambiado el atributo class de nuestro <img>. Ahora sólo falta ir a la plantilla, editar el HTML y añadir en el header el código CSS que más nos guste. En mi caso:


Este CSS simplemente redondea el borde. Aunque el código sea el mismo para las dos clases, los diferencio porque así puedo ejecutar la librería Gifffer bajo todos los elementos que contengan la clase gif. Ya hablaré en otro post sobre ella.

Se acabó.
¿Eh? ¿Qué? ¿Ya? Me había dormido...

domingo, 31 de julio de 2016

Nuevo blog, nuevo lenguaje: TypeScript


¿Qué mejor forma de iniciar un blog que hablando del lenguaje que acabo de estrenar? Typescript, un lenguaje de programación de código libre desarrollado por Microsoft.

Sí, Microsoft y código libre en la misma frase.
Mi careto cuando ví esta noticia
Para muchos de la "old school" es algo extraño, pero realmente Microsoft lleva un tiempo haciendo las cosas así, y es de agradecer. No sé si estoy cambiando mi forma de pensar con respecto a ellos, pero, en los últimos meses, no es la primera vez que me beneficio de un producto desarrollado por Microsoft sin que me obliguen indirectamente a ello (Véase: Windows Monopolio).

¿Qué es Typescript? Typescript es Javascript con anabolizantes. Añade a Javascript todo lo que más de una vez has echado de menos cuando te has encontrado con un undefined en un sitio donde no debería estar, pero sin perder la "magia" del mismo.

Typescript añade clases, tipos, control de argumentos, etc. Vamos, da la sensación de estar programando en .NET (Javascript.net?), pero mantiene la versatilidad de Javascript que tanto nos gusta.

Pero ¿Qué entornos soportan Typescript? Muy sencillo, cualquier lenguaje que acepte Javascript. Typescript compila en Javascript sin problemas. Es más, se diseñó principalmente bajo esa idea. La mayoría de IDEs (Visual Studio Code por aquí), tienen integrado el compilador a Javascript y, con tan sólo una combinación de teclas, convierte tus archivos .ts a .js, dejándolo todo listo para lanzar tu proyecto en Node, tu navegador preferido (Chrome por aquí, como era de esperar) o incluso Windows CScript.

Y todo ésto con la comodidad de poder repasar el código en GitHub, con todas las ventajas que ésto supone.

¿Qué más decir? Por mi parte, nada más. A mí ya me han comprado.


Más adelante hablaré más exhaustivamente sobre Typescript. Lo dejo aquí por ahora.