sábado, 21 de septiembre de 2013

Charlemos de tecnología, ¿ta?

Surculus Fructum

Arrancó un promisorio podcast de tecnología en español, de los amigos uruguayos PoTe y Cuervo, bastante conocidos en la comunidad Ruby rioplatense.

Más allá de Ruby, porque son inquietos como la mayoría de los que andan por este blog, se juntan cada tanto a hablar de tecnología, y grabar un podcast sobre un tema o dos, y prometen invitados.

No se pierdan Surculus Fructum, el podcast. Ahí en el sitio pueden suscribirse mediante feed o iTunes, bajar el audio en varios formatos o escucharlo en la página, pero les dejo el primer episodio acá nomás para que si quieren escuchen un ratito y me crean que está bueno.

Destacable, también aunque esperable de esta gente, el hecho de que el sitio es una pinturita de HTML5 y con un diseño muuuuy minimalista y prolijo.

A prestar orejas:

lunes, 16 de septiembre de 2013

Se acerca Java 8

Java 8

La próxima versión del JDK está cada vez más cerca, con fecha estimada de disponibilidad general en marzo de 2014.

Para los interesados, hay una versión preliminar disponible, y la buena gente de JetBrains ya tiene una versión preliminar de IntelliJ que lo soporta.

Algunas de las características principales de la nueva versión de Java serán:

Mejoras en las interfaces

Ahora pueden definir métodos estáticos, pero sobre todo, pueden incluir una implementación default.

Para mi, esto último es notable.

Interfaces funcionales y Lambdas

Las primeras definen un único método abstracto, y están pensadas para servir principalmente para definir funciones de primer orden.

Las lambdas pueden ser instancias en base a estas interfaces, o de manera independiente, y su sintáxis es la siguiente:

(int x, int y) -> { return x + y; }

o en su forma más simple, sin parámetros de entrada:

() -> x

Hay soporte para closures en las lambdas, con algunas limitaciones, pero en general el soporte parece bueno.

Más ideas funcionales en la librería estándar

Por ejermplo, algunas de estas interfaces definidas en java.util.function:

Function<T, R> para definir funciones de prier orden, Predicate<T> para definir predicados como filtros, Consumer<T> para invocar acciones, Supplier<T> para devolver tipos y otras.

También se agrega el paquete java.util.stream donde se habilita finalmente esta funcionalidad básica en la programación funcional, que permite utilizar enumerables o iteradores de cualquier tipo de manera contínua, es decir que pueden pasar de funcione en función de forma secuencia o paralela, sin detenerse.

Mayor soporte a concurrencia

Siguiendo con el tema general, hay muchas mejoras en el API de colecciones usando streams, predicados y muchas de las características anteriores, y muchos agregados específicos para administrar concurrencia, basándose en todo lo anterior y empujando más fuerte el uso de estructuras inmutables.

Reflection, anotaciones y un nuevo motor para JavaScript

Hay agregados importantes en los dos primeros, y Nashorn es el nombre de código del nuevo motor de JS, que reemplazará a Rhino. Lamentablemente parecen estar implementándolo sobre hotspot en lugar de utilizar V8 u otro motor moderno. Esto en principio debería ser mejor a nivel de la interoperabilidad con el resto de la JVM, pero me deja dudas sobre el esfuerzo de generar un motor eficiente en cuanto a la ejecución de JS.

viernes, 13 de septiembre de 2013

JavaScript Jabber: hablando en JS

Post cortito hoy para compartir un podcast que vengo escuchando últimamente:

En este podcast semanal (en inglés), un grupo de programadores que programan en JS y otros lenguajes, se reúnen y charlan sobre un tema, en muchos casos con invitados como autores de librerías, frameworks, o miembros de equipos en organizaciones o proyectos interesantes.

Dejo aquí el último episodio (a hoy) con el autor de Grunt.js.

Episodio 74 - Grunt.js con Ben Alman

jueves, 12 de septiembre de 2013

JavaScript - La compilación del futuro (+ video)

Hace 5 años escribí en este mismo blog un post llamado "JavaScript - a programación del futuro", en honor a aquel libro clásico del Maestro ("Java - La programación del futuro", de MP Ediciones). Básicamente, mi hipótesis en ese momento, mirando alrededor, era que JS iba a impactar cada vez más, al resolverse temas de incompatibilidades entre navegadores, mejorar las implementaciones y herramientas, y solidificarse el lenguaje del lado del servidor.

Cinco años después, por una vez en la vida, parece que no le había errado demasiado. JS explotó en librerías, frameworks y herramientas de todo tipo, Node lo impulsó mucho más allá de los navegadores, tanto a los servidores como a aplicaciones de escritorio, middleware, robótica y mucho más.

Ahora, sin embargo, viene el siguiente paso: si JS es el lenguaje que finalmente cumplió la promesa de correr en todos lados, es hora de pensarlo más y más como EL runtime. Brendan Eich, el creador original de JS dijo hace unos años algo como "JS is the x86 of the web", insinuando que podía convertirse en el "assembler" de la web. Muchos lo acusaron de exagerado, pero...

NewImage

Desde hace tiempo, kripken (también conocido como Alon Zakai) un investigador de Mozilla, trabaja en EmScripten, un compilador de LLVM a JS. En resumen, toma bitcode de LLVM, generado con C/C++ y lo compila a JS. ¿Parece ridículo? No lo es tanto, considerando que de esa manera ese código puede ejecutarse en cualquier navegador moderno.

Parece una propuesta completamente de laboratorio, con pocas aplicaciones prácticas. Hasta que uno mira los proyectos que ya la están usando en el mundo real. Uno de los ejemplos más impresionantes es el motor de renderización 3D del juego Unreal, que se migró de C++ a JS en 4 días. El resultado puede verse en este video.

El tema no se termina ahí, en la compilación a JS. Porque no todo código en JS es el más optimizable. Y aquí es donde kripken y amigos comenzaron ASM.js, un subset de JS que si permite altísima optimización en todos los navegadores, como puede verse en su presentación.

Para que quede claro, todo esto se está logrando en este mismo momento, con los motores de JS de hoy, sin cambios importantes. Si la idea se expande, como ya está sucediendo, los motores pueden optimizar aún más este subset, utilizando técnicas de compilación existentes y probadas por años, logrando aún mayor performance.

¿Estaremos llegando al runtime final? Dejo como material para pensarlo este video de Eich en la JsConf de este año (~26 minutos). Que lo disfruten.

miércoles, 11 de septiembre de 2013

Nitrous: un entorno de desarrollo completo en la nube

Después de un año de silencio ¡vuelve Code & Beyond!

Hace aproximadamente un año cambié de trabajo y me sumé a Kleer, donde como socio tengo muchas de las responsabilidades acuciantes de cualquier start-up, lo que requirió dejar algunas actividades de lado. Específicamente, este blog no tiene sentido para mi sin una frecuencia importante, por lo que quedó congelado… hasta ahora. Espero que disfruten algunos de los aprendizajes que compartiré con ustedes en adelante, y como siempre, el feedback es bienvenido en @MartinSalias.


Imagen básica

Estoy probando la beta pública de Nitrous.io, un servicio de "dev boxes" en la nube.

Básicamente, lo que nos brinda (partiendo de un servicio básico gratuito con 384 MB de RAM y 750 MB de storage) es una "caja" con Linux (la mía es un Ubuntu 12.04.1 LTS).

Lo bueno del servicio es que puede accederse de múltiples maneras:

  • por SSH directo
  • abriendo una terminal en el navegador
  • utilizando una IDE en línea (ver botón en la imagen)
  • a través de la aplicación para Mac (a las que se espera que se sumen otras para Linux y Windows). Esta aplicación genera una carpeta local con subcarpetas para cada "box" que uno tenga, y las mantiene sincronizadas (estilo DropBox). Además de eso, agrega un icono y menú en OS X que facilita llegar al sitio o la carpeta local, abrir una terminal vía SSH o la IDE en línea, controlar el port forwarding o la sincronización, etc.
Las "boxes" se pueden crear utilizando plantillas que incluyendo componentes pre-instalados para (por ahora) Ruby/Rails, Node.js, Python/Django y Go.
 
Personalmente, lo que más me atrajo es abrir la terminal desde el browser, jugar desde ahí, crear una carpeta para probar, usar vim para crear un ejemplo pequeño en Node,js (a pesar de haber creado mi box con la plantilla de Ruby, Node ya estaba ahí), correrlo desde la consola, ir a la URL de preview (agregándoe el puerto 3000) que elegí y ver que ya estaba funcionando.
 
La aplicación para Mac anda bien, pero la sincronización de archivos agrega una latencia que prefiero evitar. Siendo poco fanático de las IDE, tener la terminal me alcanza y sobra (es lo mismo que conectar por SSH, pero desde el browser de una).
 
La verdad es que el proyecto promete, y me gusta mucho la idea de usarlo para alguno de los entrenamientos que doy regularmente.