Mostrando entradas con la etiqueta FOSS. Mostrar todas las entradas
Mostrando entradas con la etiqueta FOSS. Mostrar todas las entradas

miércoles, 20 de abril de 2011

Manos de Mono

Manos de Mono

Aunque suene raro, Manos de Mono es el nombre de un framework liviano para desarrollo web, soportado por Mono (la implementación abierta de .NET) e inspirado en TornadoSinatra, Node.js y otros mecanismos web recientes.

Creado por Jackson Harper, miembro del equipo de Mono en Novell, este framework intenta simplificar mucho el desarrollo web, evitando abstracciones y herramientas. Jackson usa como inspiración esta elegante frase de Alan Kay (inventor de Smalltalk, entre otras cosas):

"Las cosas simples deben ser simples. Las cosas complejas deben ser posibles."

Manos está concebido para ser simple de usar, fácil de probar y brindar altísimo rendimiento, sin necesidad de utilizar un servidor web (ni Apacha, ni IIS). Las aplicaciones desarrolladas con Manos incluyen el servidor web como parte del paquete, facilitando también la instalación y actualizaciones, y eliminando toda configuración.

Algunas de las características más interesantes de Manos son:

  • El servidor es muy escalable y no-bloqueante, es decir que no usa threads separados para cada petición, sino un loop de eventos, como hace Node.js (mas información sobre éste último en este post anterior).
  • Un sistema de cañerías (pipes) HTTP que facilita tratar cualquier petición o respuesta antes o después de que el framework los enrute.
  • El enrutamiento puede realizarse por convención, propiedades o métodos HTTP. Todas las rutas pueden definirse con expresiones del estilo "/Articulo/{titulo}/{pagina}".
  • Al generar un nuevo proyecto, Manos produce una serie de archivos básicos basados en el HTML5 Boilerplate (cubierto en este otro post), que después se personaliza por medio de un motor de plantillas muy rápido. Las vistas pueden generarse con cualquier editor y son casi HTML puro, pero son compiladas en tiempo de ejecución para maximizar el rendimiento.
  • La interfaz principal de Manos es una línea de comandos que permite crear, construir o iniciar las aplicaciones sin necesidad de ninguna IDE.
  • El diseño es totalmente modular, permitiendo extender Manos fácilmente, lo que puede facilitar que el ecosistema crezca con contribuciones de la comunidad.

Para crear una aplicación Monigote (por ejemplo), basta abrir una consola y escribir:

manos --init Monigote

y esto crea una carpeta Monigote con los archivos Monigote.cs, StaticContentModule.cs y una subcarpeta para las hojas de estilo y librerías Javascript (incluye jQuery, Modernizr, y otras). Los primeros archivos son programs C#, como se habrán dado cuenta. El primero es el punto de entrada de la aplicación, y el segundo se encarga de servir el contenido estático desde la sub-carpeta creada: scripts, imagenes, estilos, etc.

Dentro de Monigote.cs podemos incluir algo tan sencillo como:

Get ("/", ctx => ctx.Response.End ("¡Hola, Monigotes amigos!"));

Y esta acción procesa directamente la ruta raíz ("/"), respondiendo con un saludo.

Por supuesto que hay mucho más, pero este es el estilo de desarrollo en general. Antes de ejecutar la aplicación debemos construirla con el comando:

manos --build
Y para ejecutarla simplemente ejecutamos:
manos --server

Y la aplicación inicia, accesible en el localhost, en el puerto 8080 para pruebas.
Más detalles en este tutorial, y la documentación completa.

lunes, 18 de abril de 2011

Rails 3.1 incluirá jQuery, CoffeeScript y Saas

Ruby on Rails

La próxima entrega de Ruby on Rails, la versión 3.1, incluirá por omisión estas librerías como parte de todo nuevo proyecto.

Por supuesto que ya ha habido mucha discusión al respecto en la comunidad Rails, pero como siempre, la decisión está tomada por DHH y sus secuaces, y al fin y al cabo, cambiar los defaults no es complejo (basta alterar un par de líneas en el gemfile).

Pero repasemos un poco de que se tratan estos cambios:

Hasta ahora la librería estándar de Javascript que Rails agregaba por omisión era Prototype, pero como la mayor parte de la gente hoy día utiliza jQuery (lo que demuestra que no es tan complejo cambiar estas cosas), decidieron hacer oficial el cambio.

Saas

Los otros cambios son más dramáticos para algunos, y es la inclusión por omisión de CoffeScript y Saas.

Sobre CoffeeScript escribí un post hace poco, así que voy a evitar repetirme, pero básicamente es una sintaxis simplificada de Javascript, que facilita escribir la parte cliente de aplicaciones web (aunque también se usa a veces del lado del servidor, en conjunto con Node.js).

Saas, por su parte, es una sintaxis alternativa para hojas de estilo en cascada (CSS).

Históricamente tuvo dos sintaxis, la original es la indentada (con archivos de extensión .saas), inspirada en el lenguaje de templates Haml (también muy difundido en el ambiente Ruby), y en lugar de usar llaves y punto y comas para delimitar bloques, se basa en indentación, como en este ejemplo:

#main
  color: blue
  font-size: 0.3em

  a
    font:
      weight: bold
      family: serif
    &:hover
      background-color: #eee

La nueva sintaxis se llama SCSS y es un superset de la sintaxis CSS3 que utiliza archivos de extensión .scss. Esta es la que impulsan desde Rails, y en este caso no se remueven las llaves y punto y comas, sino que el foco está en mejorar las posibilidades de definición, por ejemplo, soportando anidamiento de estilos:

#navbar {
  width: 80%;
  height: 23px;

  ul { list-style-type: none; }
  li {
    float: left;
    a { font-weight: bold; }
  }
}

Y también variables, como en:

$main-color: #ce4dd6;
$style: solid;

#navbar {
  border-bottom: {
    color: $main-color;
    style: $style;
  }
}

a {
  color: $main-color;
  &:hover { border-bottom: $style 1px; }
}

Pero también hay soporte para mixins (a la Ruby), herencia de selectores, y más características.

Al igual que en el caso de CoffeeScript, Saas va a estar integrado al framework, de manera que nosotros editamos los archivos en estos lenguajes y automáticamente se generan sus equivalentes .js y .css sin mayores inconvenientes. En ambos casos, llegado el momento de tener que depurar el código directamente en el navegador (utilizando FireBug o herramientas similares) la distancia entre los lenguajes reales y estas sintaxis alternativas nunca es tan grande como para convertirse en un problema.

 

martes, 5 de abril de 2011

Recursos gratuitos para empezar con Node.js

Libro sobre Node

A través de un tweet de mi amigo Juancho Ladetto encontré este post de ReadWrite Hack comentando una series de recursos sobre Node.js.

Para los que no saben o no recuerdan de que se trata Node, hice una breve introducción en un post anterior, y los demás sabrán que es una de las tecnologías que me parece más prometedora entre las últimas apariciones, y creo que este año va a crecer muchísimo.

Uno de los recursos más interesantes es este libro (en progreso) de Tom Hughes-Croucher que O'Reilly, que puede leerse (en inglés) por ahora libremente en su versión previa (e incluso colaborar en la revisión).

El libro por ahora cubre los conceptos fundamentales, con buenas explicaciones incluyendo simpáticos dibujos como este:

Event Stack

También cubre las interfaces de programación principales como el EventEmitter, la sintáxis de Callbacks, servidores y clientes HTTP, peticiones GET, POST y PUT, el objeto ClientResponse y el uso de URLs, query strings, Streams de lectura, el FileSystem y Buffers.

Está iniciado también el capítulo cubriendo interfaces de ayuda, por ahora solo DNS, y el de documentación general que cubre varias clases, el depurador, marco de pruebas unitarias, sub-procesos, consola de comandos REPL, y mucho más (todo esto en formato de referencia).

Otro recurso interesante y en progreso es la guía de Felix (también en inglés), que cubre varias partes similares pero a distinta profundidad y con otro enfoque, y tiene una sección dedicada a "convencer al jefe" que apunta a resaltar las características principales de Node para poder explicarlo a otros.

martes, 29 de marzo de 2011

Cuba: un micro-framework para desarrollo web basado en Rum

Suba

(Después de un lapsus entre feriados largos y proyectos, vuelvo a la carga)

En el último Ruby Meetup en Buenos Aires, del que hablé un poco más en el último post hace una semana, otra de las presentaciones correspondió a Michel Martens (soveran, en GitHub), quien presentó Cuba, su microframework inicialmente basado en el proyecto anterior Rum, otro pequeño mapper sobre Rack, pero que quedó discontinuado.

Rack es una abstracción que muchos de los frameworks web de Ruby utilizan para evitar reimplementar toda la interacción básica con un servidor web. Es básicamente una interfaz estandarizada sobre el servidor, independiente de cada implementación particular (soporta Mongrel, WEBrick, FCGI, Thin, y otros).

Rack surgió básicamente como una alternativa a Ruby on Rails, pero hoy hay Rails también puede utilizar Rack por debajo.

Muchos de los frameworks más chicos, como Sinatra, Camping o Merb construyen una capa de aplicación muy fina por encima de Rack, con lo que obtienen un modelo más limpio (obviamente con mucha menos magia que Rails), pero más eficiente cuando uno está dispuesto a trabajar un poco en algunas características en pos de más velocidad, menos consumo de recursos y muchas veces, más claridad en la solución final.

Cuba es otro de estos microframeworks, y tiene algunas características muy interesantes, que me sorprendieron en la presentación de Michel:

  • Es realmente minimalista, muy cerca del mismo Rack, lo que otorga mucho control sobre el flujo de trabajo del servidor web.
  • A pesar de tener algunas similaridades con Sinatra, es todavía más rápido, y más explícito.
  • Integra plantillas para vistas usando Tilt y testing utilizando Cutest y Capybara, aunque es trivial integrar cualquier otra cosa.

Veamos un ejemplo mínimo para entender que tan simple y de bajo nivel es Cuba:

require "cuba"

Cuba.use Rack::Session::Cookie

Cuba.define do
  on get do
    on "hello" do
      res.write "Hello world!"
    end

    on true do
      res.redirect "/hello"
    end
  end
end

Por supuesto hay oportunidades para abstraer todo un poco más pero se puede notar como se puede manipular de manera explícita la respuesta del servidor (res). Esto en Sinatra es más implícito, lo que está bien para muchos casos pero a veces es bueno poder acceder y manipular la respuesta de manera directa.

Aclaro que no tuve oportunidad de probar mucho Cuba, pero me parecieron interesantes algunos de los principios de diseño y los resultados obtenidos, y más aún saber que es un proyecto que está vivo y en manos de alguien que tenemos cerca.

jueves, 10 de marzo de 2011

Python Tools for Visual Studio

Python Tools for Visual Studio

El equipo de Technical Computing de Microsoft acaba de liberar estas extensiones gratuitas y abiertas para dar soporte a Python dentro de su IDE de cabecera (por ahora en Beta 1).

Este equipo se dedica básicamente a dar soporte a escenarios de computación científica en ambientes distribuidos, clusters de computadoras, etc. Dentro de este ambiente, en el que Python también tiene un uso bastante intensivo como lenguaje de programación para MPI (Interfaz de pasaje de mensajes) que se utiliza para procesamiento en paralelo y distribuido, y mediante el uso de librerías como NumPy y SciPy.

Este plug-in para Visual Studio es producto de estas iniciativas construidas sobre el esfuerzo que hizo previamente el equipo de IronPython (la implementación de Python sobre el framework .NET), pero en este caso el soporte cubre tanto IronPython como el CPython standard, y tiene una serie de características muy interesantes, algunas ya disponibles y otras prometidas.

  • Intellisense, editor completo con coloreo, navegación de objetos y ventana de comandos integrada
  • Depuración local y remota (incluso en clusters)
  • Perfilamiento con múltiples vistas
  • Computación en paralelo interactiva desde la ventana de comandos
  • Soporte a clusters HPC y MPI, incluyendo depuración
  • NumPy y SciPy para .NET
  • Gratuita y de código abierto (licencia Apache 2.0)

Y prometidos para dentro de poco (esperemos que en la próxima Beta):

  • Soporte para Windows Azure
  • Soporte para Dryad (la implementación .NET de Linq para Map/Reduce)

Aunque en general en Python estamos acostumbrados a no usar Intellisense, hay que reconocer que el analizador que utilizan es bastante astuto, y es capaz de inferir los tipos de datos en contextos complejos, como se ve en el ejemplo:

Inferencia de Tipos

Otras características interesantes es la capacidad de saltar directamente entre fuentes, clases y métodos seleccionando de una lista que los agrupa correctamente, o saltar directamente a la definición de cualquier elemento desde algún uso en otra parte del código.

 

viernes, 4 de marzo de 2011

Joomla Buenos Aires 2011 (video)

Joomla BairesComunidad Joomla ha organizado el primer evento sobre esta plataforma en Buenos Aires, Argentina.

Joomla es un CMS (sistema de administración de contenidos) gratuito y de código abierto creado en PHP, y uno de los más populares del mundo. Es usado tanto por diseñadores o grupos no técnicos, gracias a la flexibilidad de configuración y la enorme cantidad de extensiones, como por desarrolladores que lo utilizan como plataforma.

Aunque en el mercado argentino también se lo utiliza con frecuencia, no se había hecho una reunión masiva todavía, y ha llegado el momento.

El evento es el lunes 14 de Marzo a las 18:40 hs en la UAI (Universidad Abierta Interamericana), sede central de Av. San Juan 983. En el sitio del evento hay instrucciones sobre cómo llegar.

Algo fuera de lo común para la comunidad PHP es el hecho de que Microsoft apoya el evento, y uno de los oradores será Drew Robbins, quien estará presentando WebMatrix, una herramienta para desarrollo web que soporta PHP y Joomla (además de otras plataformas).

Otro orador será Leandro D'Onofrio que presentará Joomla 1.6. También estará presente Gustavo Raúl Aragón, fundador de Comunidad Joomla, explicando como funciona el grupo (que abarca todo el mercado hispano-parlante) y las actividades que realizan.

Dejo un video introductorio de Joomla en español generado por la comunidad.

 

jueves, 3 de marzo de 2011

PyDay Córdoba 2011 (video del año pasado)

PyDay

PyAr, el grupo de usuarios de Python Argentina, sigue organizando sus jornadas sobre Python, como hizo el año pasado en Rafaela (Santa Fe) y Buenos Aires.

El 30 de abril próximo el evento estará en Córdoba, en la Universidad Tecnológica (UTN).

Como siempre el evento es gratuito pero hay que registrarse (las vacantes son limitadas, pero no ocupar lugar sin estar seguro, por favor) y quien quiera colaborar puede pagar por la emisión de un certificado, que sirve para cubrir parte de los costos.

La descripción del evento -directamente del sitio- dice:

El Python Day es un evento organizado por PyAr y dura un día donde se darán pequeños cursos y charlas relacionadas a este lenguaje que de a poco va a haciendo su lugar entre los desarrolladores. Tenemos como intención hacer un espacio en donde cualquier persona interesada pueda acercarse para preguntar, aprender y experimentar con estas herramientas.

Se puede ir viendo quienes están anotados para ir (varios sospechosos usuales de la comunidad Python ya figuran) en la página de participantes.

Y todavía no hay sesiones aceptadas, y se pueden proponer hasta el 1ero de abril, así que es una buena oportunidad para compartir experiencias.

Como ejemplo les dejo parte del programa de la jornada del año pasado en Buenos Aires:

Nivel Inicial

  • Python: Qué es y para que sirve
  • web2py: desarrollo web2.0 fácil y pythónico
  • Introducción a wxPython
  • import antigravity: 8 módulos útiles que probablemente no conocías
  • Como python puede mejorar tu productividad

Nivel Intermedio

  • Python 3000
  • Usando virtualenv e instanado librerias adicionales
  • OpenERP, sistema de gestión ERP y CRM desarrollado en Python
  • Entendiendo Unicode
  • XML con Python

Y finalmente, como otra muestra, dejo un video de la Introducción a Python a cargo de Ariel Rossanigo en el evento de Rafaela.

martes, 1 de marzo de 2011

Mono 2.10 y las últimas novedades de la monada

Mono

Por si alguno de los lectores de este blog aún no lo sabe, Mono es la implementación abierta de .NET para Unix, Mac OS X y Windows.

El increíble equipo de Mono nunca se detiene, siempre acompañado por su líder Miguel de Icaza.

La última versión liberada es la 2.10 (en realidad la 2.10.1) mientras continúa el rumbo hacia el próximo gran lanzamiento, que será Mono 3.0.

Pero esta versión ya tiene grandes avances, como:

  • Soporte para el Google Native Client
    Esta es una tecnología que permite ejecutar código nativo dentro del browser de manera segura, y que ahora incluye no sólo la posibilidad de ejecutar código compilado previamente, sino también realizar compilación a demanda (JIT), lo que permite que Mono soporte Reflection.Emit o los lenguajes dinámicos, por ejemplo.
  • Nuevo motor de Profiling
    Este nuevo motor está optimizado para trabajar en entornos de múltiples hilos y es muy eficiente en todo sentido.
  • Implementación mejorada de Sockets
  • Mejoras en el Parallel Framework y en SGen, el nuevo recolector de basura (una increíble pieza de ingeniería)
  • Se unificó el runtime de soporte para MonoTouch y MonoDroid (versiones de Mono para IOs y Android respectivamente)
  • Cecil/Light es una versión mejorada de Cecil, la librería que permite generación e inspección de código en tiempo de ejecución, y que muchos utilizan incluso en .NET, donde no tiene un equivalente directo.
  • Nuevo mecanismo del compilador de C# y enormes mejoras en el shell interactivo
    Mientras Microsoft lleva más de dos años preparando su compilador como servicio, Mono lo tiene disponible desde entonces, incluyendo una consola que ahora permite no sólo la ejecución de expresiones sino de programas completos. El servicio de compilación además dejó de ser estático, con lo que se pueden crear diferentes instancias del compilador con contextos separados.
  • Compilador de VB que permite compilar a los perfiles de VB 2.0 al 4.0
  • Soporte completo para ASP.NET MVC 3 incluyendo Razor y WebPages. Mono 2.10.1 agregó algunos detalles que permiten ejecutar el CMS de código abierto Orchard de Microsoft, que de esta manera puede ejecutarse también en Linux.
  • Implementación de WebMatrix.Data, una librería de Microsoft que permite acceso a datos aprovechando los nuevos tipos dinámicos.
  • Muchísimas optimizaciones para Mono en OS X, que aprovechan más los servicios particulares del sistema operativo de Apple.
  • Compilador de F# e intérpretes de IronPython y IronRuby completamente integrados en los paquetes para Linux y Mac.
  • Gendarme 2.10, el analizador estático de Mono, también es mucho más rápido y tiene 33 reglas nuevas.

Como ven, nadie puede decir que Mono no avanza.

Para más detalles, se pueden ver las notas de los releases 2.10 y 2.10.1 en el sitio de Mono.

O pueden ir directamente a la página de descarga, donde encontrarán paquetes de instalación para Virtual PC, VMWare, LiveCD, openSUSE, SLES/SLED, Windows, Mac OS, CentOS, Solaris u otras distros de Linux.

viernes, 25 de febrero de 2011

Brunch: aplicaciones HTML5 desde los hombros de gigantes

Brunch

"Parado sobre los hombros de gigantes" es una frase típica de la cultura anglosajona, famosamente usada por Isaac Newton, que refiere a construir sobre el trabajo de quienes nos han precedido.

Esta idea es la base de Brunch, un framework compuesto de varias partes preexistentes para facilitar la construcción de aplicaciones web modernas.

Incluso si uno no va a usarlo directamente, es bueno recorrer y entrar en contacto con algunos de sus componentes, todos ellos de código abierto, no todos tan conocidos. Veamos cuáles son:

  • CoffeeScript
    Es un lenguaje que compila a Javascript, simplificando mucho la sintaxis, como se puede leer en este post previo.
  • Backbone.js
    Es una librería para aplicaciones JavaScript que brinda estructura para utilizar modelos y vistas con eventos de uso declarativo, un API para colecciones con mucha funcionalidad, y capacidades de conexión utilizando JSON con interfaces REST. Pueden ver un ejemplo en línea con el código completamente documentado a un link de distancia.
  • Underscore.js
    Es otra librería, que Backbone utiliza, y que provee más funciones para manejo de estructuras de datos a mas bajo nivel, incluyendo colecciones, arrays,  extensión sobre funciones (como memorización, diferimiento, composición, etc), objetos, utilidades y cadenas.
  • Eco
    Es un motor de plantillas que permite embeber CoffeScript dentro del markup de una página, como si fuese EJS o ERB.
  • Stylus
    Es un lenguaje de declaración de hojas de estilo en cascada (CSS) con una sintaxis simplificada, como CoffeScript hace con JavaScript. Es básicamente CSS sin llaves ni otros signos de puntuación, mucho más legible.
  • Docco
    Genera documentación de código en formato HTML, soportando Markdown y colorero de sintaxis. Unos cuantos de los proyectos anteriores utilizan Docco en su documentación.
  • jQueryZepto.js
    jQuery no requiere presentación para los lectores de este blog, pero Zepto es un framework minimalista compatible con jQuery y orientado a navegadores de dispositivos móbiles basados en WebKit.

En suma, más allá de Brunch mismo, puede verse un ecosistema creciente de librerías que trabajan en conjunto y con buen nivel de compatibilidad.

 

jueves, 24 de febrero de 2011

Festejando los 20 años de Python con la versión 3.2

Pyton

La mejor imagen de la celebración es el tweet de hace unos días del creador de Python, Guido van Rossum:

Guido Tweet

En nuestra industria 20 años parecen dos o tres generaciones de lenguajes, y Python sigue demostrando su relevancia y popularidad.

Mientras que la versión 2.7 será probablemente la última importante de la línea 2.x, la rama 3.x empieza a tomar más impulso.

Siguiendo la PEP 3003, que declaró una moratoria para los cambios en el lenguaje, no hay cambios sintácticos en esta versión tampoco, y las mejoras se concentran en librerías y portabilidad desde 2.x.

Algunas de las principales novedades son:

  • mejoras en el módulo unittest (varias provenientes del amigo Michael Foord)
  • una nueva librería para programación concurrente
  • un GIL mejorado que reduce la contención (uno de los temas más problemáticos de Python en su historia)
  • manejo extendido de mails
  • mejor soporte para SSL incluyendo contextos y comparación de certificados
  • un módulo para acceder a información de configuración
  • mejoras al depurador pdb

Pueden leer (en inglés) el detalle completo de la versión, o la lista detallada de las novedades.

 

miércoles, 23 de febrero de 2011

Ruby Enterprise Edition y las mentes detrás (video)

Phusion

La gente de Phusion acaba de lanzar una versión actualizada de Ruby Enterprise Edition.

¿De qué se trata? Estos muchachos (Ninh Bui, Hongli Lai y Tinco Andringa) llevan bastante tiempo trabajando en Ruby on Rails, muchas veces en proyectos muy exigidos, y encontraron varios de los problemas más importantes de Ruby (1.8, básicamente) pero en vez de quejarse, con el mejor espíritu de la comunidad de código abierto, crearon un fork donde arreglaron varios de las principales preocupaciones del motor al usarlo en instalaciones de Rails de gran escala.

Para que quede claro, esta distribución está pensada para instalaciones en servidores, y sigue siendo código abierto y gratuito.

La diferencia principal contra el motor de Ruby 1.8 (aunque en 1.9.x muchos de estos temas mejoraron drásticamente) está alrededor del recolector de basura, que logra reducir el uso de memoria de las aplicaciones Rail en un promedio del 33%, y a la vez incluye un mecanismo optimizado de alocación de memoria que aumenta mucho el rendimiento.

Algunos de los usuarios más conocidos de esta distribución son el New York Times, Twitter, Shopify y 37signals (esta última la empresa de David Hienemeier Hansson, el creador de Rails).

Algo muy interesante es que todo esto se logró a través de pura ingeniería aplicada a mejorar proyectos existentes, y el equipo de Phusion lo usa como base de su trabajo de consultoría, pero lo comparte con la comunidad en general.

Dejo debajo el video de Hongli Lai explicando las optimizaciones que hicieron durante un Google Tech Talk (charlas que organiza Google para sus empleados y comparte en video con el resto del mundo).

Al video está en inglés, pero lo que puede resultar más complicado es seguir los detalles técnicos, que no son aptos para principiantes.

viernes, 11 de febrero de 2011

IonRuby 1.1.2 - Ruby sobre .NET sigue en marcha

IronRuby

En un mensaje en la lista IronRuby-core, Jimmy Schementi anunció la publicación de IronRuby 1.1.2.

Aunque esta es una versión intermedia para corregir algunos temas menores, es una buena noticia ver que el proyecto sigue en marcha después de que Microsoft lo dejara por completo en manos de la comunidad, al liberar todos los fuentes como código abierto bajo licencia Apache 2.0.

Esta versión básicamente mejora la compatibilidad con Ruby 1.9.2 e incluso corta la compatibilidad con Ruby 1.8.6, lo que es una buena medida para seguir hacia adelante con menores dependencias. Si alguien necesita todavía compatibilidad con 1.8.6 puede seguir utilizando IronRuby 1.0.

Recordemos que tanto IronRuby como IronPython son ahora proyectos en los que Microsoft no participa más, quedando por completo bajo control de la comunidad, y liderados por Jimmy, Miguel de IcazaMichael Foord, y Jeff Hardy.

El nuevo release mantiene las herramientas de integración con Visual Studio 2010, soluciona algunos problemas con la instalación de Gems, renueva por completo el parser (motivo de la decisión de soportar sólo 1.9.2) y arregla algunos problemas detectados en Windos Phone 7.

IronRuby Tools for Visual Studio

 

 

lunes, 17 de enero de 2011

Video: Avalancha de lanzamientos desde Microsoft

WebMatrix

El Web Platform & Tools Content Team de Microsoft (hasta donde recuerdo, el grupo en el que está Scott Hanselman) acaba de liberar una cantidad impresionante de productos:

El hecho de que haya salido todo junto no es casualidad: todos estos productos están relacionados de alguna manera, ya que en principio son todos piezas de la nueva estrategia de Microsoft para el desarrollo web, caracterizada por romper un poco los esquemas tradicionales de la compañía. Por ejemplo, muchos de los componentes están liberados como Open Source, y otros son gratuitos, y en líneas generales todos son bastante livianos (mucho más de lo habitual en el mundo Microsoft al menos).

Esta renovada plataforma responde indudablemente al intento de Microsoft de competir con el ambiente más popular en el desarrollo web que va desde PHP hasta Ruby on Rails, e incluso abarca parte de este espacio, como veremos.

Veamos cada componente en un poco más de detalle. Como hay mucha información de Microsoft al respecto, lo que leerán es mi interpretación personal sobre ellos, tratando de relacionarlos con equivalentes en otras plataformas con el objetivo de entender rápidamente el propósito de cada pieza, sin entrar en comparaciones sobre si una es mejor que otra. En principio, es difícil comparar plataformas disimiles y componentes aislados.

ASP.NET MVC es un framework open source basado en el ya antiguo patrón MVC (fue postulado originalmente por Trygve Reenskaug entre 1978/79 en Xerox) y mayormente ignorado por Microsoft en su aproximación a la web, mientras se lo adoptaba en otros ámbitos en frameworks como Struts en Java, Joomla/Drupal en PHP, Django en Python y Rails en Ruby.

Esta versión de MVC incorpora algunas novedades como un nuevo motor para las vistas, Razor, que tiene una sintaxis muy suscinta y clara para mezclar código con HTML con un mínimo de interferencia. También mejoraron mucho la limpieza del JavaScript que integran del lado cliente al evitar scripts inline y usar en cambio anotaciones de HTML 5 que son manejadas por JQuery y jQuery.unobtrusive-ajax, con lo que se pueden realizar validaciones y otras tareas del lado cliente.

Otro pilar de este framework es la extensibilidad, ya que se puede cambiar fácilmente el motor de vistas, soporta montones de frameworks de testing, alternativas para el modelo y su persistencia, y en esta nueva versión incluso mejora el mecanismo de inyección de dependencias, de modo de poder usar el contenedor que más nos guste para intercambiar cualquiera de las piezas.

NuGet es un administrador de paquetes que intenta acercar la funcionalidad de las gem de Ruby al mundo .NET. Todavía es relativamente nuevo, pero comparado con el proceso anterior de búsqueda e inclusión manual de las dependencias es un avance enorme, y seguramente va a facilitar mucho el uso de componentes externos. El proyecto es open source y es mantenido por Microsoft y miembros externos.

IIS Express es una versión gratuita de desarrollo del servidor web, mucho más liviana que el servicio completo, y con la posibilidad de utilizarlo y configurarlo sin requerir privilegios de administrador, algo que tradicionalmente generó muchísimos problemas en equipos dentro de un entorno corporativo seguro.

SQL Server Compact 4 es una versión embebida y gratuita de SQL Server. Algo similar a un SQLite. Los binarios se copian directamente dentro de la aplicación y la base de datos corre dentro del mismo proceso, con lo que no es necesaria ninguna instalación. Por supuesto este servidor no tiene las características de escala que sus hermanos mayores, pero es más que suficiente para una gran cantidad de aplicaciones, y no tiene ningún tipo de restricción de uso en su licencia.

Web Deploy y el Web Farm Framework, como sus nombres lo indican, facilitan el proceso de despliegue y actualización de aplicaciones web en servidores únicos o compuestos en granja. Ambos componentes son gratuitos.

Orchard es un sistema de administración de contenido y blogs open source, basado en MVC 3, utilizando Razor y SQL Compact por omisión. Después de un intento similar poco prolijo y muy criticado (llamado Oxite), Orchard estuvo mucho más cuidado en todo sentido, y aunque por supuesto hay críticas, el consenso es que esta es una aplicación de referencia mucho más valiosa.

Y finalmente, WebMatrix es una herramienta gratuita de desarrollo de aplicaciones web que soporta una cantidad bastante variada de tecnologías en base a plantillas, incluyendo cosas dentro y fuera del mundo Microsoft (aunque corriendo en Windows), como ScrewTurn, Umbraco, DotNetNuke, Orchard, Blogengine.net,WordPress, Drupal y Joomla. Por debajo, WebMatrix incluye IIS Express y SQL Compact, brindando un entorno completo.

Algo interesante que tiene WebMatrix es una cantidad creciente de helpers para integrar muchísimos servicios servicios populares hoy día en la web, como Bit.ly, Facebook, EventBrite, FourSquare, OData, Twitter, UserVoice y muchísimos más.

 

Finalmente, otro elemento importante de todo este combo es la cantidad impresionante de documentación disponible. Basta como muestre este listado de recursos.

Para cerrar, les dejo este video presentando WebMatrix dentro de CodeMash 2.0.1.1(si tienen problemas viendo el video, prueben en la página original en Channel 9):

miércoles, 5 de enero de 2011

Probando aplicaciones web con Zombie.js

http://www.flickr.com/photos/tohoscope/5086711384/Probar aplicaciones web modernas, con mucho scripting del lado cliente, es cada vez más complejo. El hecho de que la interfaz de usuario cambie dependiendo de las interacciones sin necesidad de pasar por el servidor genera la necesidad de realizar pruebas sobre el lado cliente.

El problema de esto es que la mayor parte de las herramientas para efectuar este tipo de pruebas requiere de una instancia de un browser real, lo que genera una dependencia fuerte y sobre todo, implica que cada prueba tarde más porque un browser demora un montón de tiempo en cargar y dibujar los elementos y tiene en cuenta montones de cosas que en realidad no necesitamos en la mayoría de los escenarios para hacer pruebas automatizadas.

Zombie.js se llama así porque es un entorno de prueba headless (sin cabeza; en realidad sin browser), y es muy rápido, además de brindar un API muy cómoda para escribir las pruebas.

La plataforma hace uso nuevamente de las ventajas de Node.js (más detalles en un post anterior) para recrear el entorno de un browser, incluyendo el DOM y características de HTML5, pero sin la necesidad de dibujar realmente nada, lo que le permite alcanzar velocidades totalmente diferentes.

Para lograr este entorno, Zombie combina varias librerías abiertas como JSDOM para emular el DOM, HTML5 para parsing, Sizzle para los selectores CSS y AJAXSLT para el soporte a XPath. Y el proyecto a su vez, también está abierto a quien quiera meter mano, alojado en GitHub.

Veamos un brevísimo ejemplo de cómo instanciar el entorno de un browser, navegar a una página, identificarse y verificar que la operación sea exitosa al llegar a una siguiente página de bienvenida.

var zombie = require("zombie");
var assert = require("assert");


// Carga la página desde el localhost
zombie.visit("http://localhost:3000/", function (err, browser) {


  // Completa email y password y confirma el formulario
  browser.
    fill("email", "zombie@underworld.dead").
    fill("password", "eat-the-living").
    pressButton("Sign Me Up!", function(err, browser) {


      // Al procesar el form, ve si fue a la página correcta
      assert.equal(browser.text("title"), "Welcome To Brains Depot");
    })
});

Como se ve, el API es muy sencilla y natural, y como siempre en Node, no hay llamadas bloqueantes; todo lo que pasa se maneja con callbacks, lo que hace también que correr una batería importante de pruebas sea más rápido en total, facilitando la ejecución más frecuente, lo que siempre eleva la calidad del proceso de desarrollo.

 

miércoles, 29 de diciembre de 2010

Node.js: simplicidad y eficiencia

node.JS

Desde hace tiempo tenía pendiente escribir sobre Node.js (Node para los amigos). Hago una breve introducción primero para que se entienda por qué me parece importante:

Hace ya un par de años escribí un post hablando del resurgimiento de Javascript como lenguaje en todos lados, y la tendencia que veía entonces está empezando a ser notoria este año y creo que se va a afianzar el próximo.

El primero paso hacia un mayor uso de Javascript del lado del servidor fue la aparición de CommonJS como iniciativa para unificar detalles de las diferentes implementaciones, y es algo que está ganando bastante aceptación, especialmente en el soporte para los modules.

Node inició fuera de este estándar, pero luego se adaptó a CommonJS, y es un motor de Javascript del lado del servidor fuertemente basado en eventos y orientado principalmente a un manejo eficiente de comunicaciones en red. Se basa a su vez en el motor de Javascript V8, creado por Google y utilizado en Chrome, pero publicado como código abierto. Node también es código abierto con ncia MIT.

Lo notable de Node es que aprovecha la característica de Javascript como lenguaje y cultura, que a diferencia del resto del universo de la programación, siempre vio como algo natural el hacer llamadas no-bloqueantes.

Veamos la diferencia. Mientras en otros lenguajes cosas triviales como una consulta tienden a escribirse naturalmente como:

resultado = query( 'select * from Tabla');

en Javascript lo usual sería expresar esto como:

query( 'select * from Tabla', function (resultado) {
   // y aquí vemos qué hacemos con el resultado...
});

¿Cuál es la diferencia principal? Que la primer manera de llamada es bloqueante; es decir que mientras el resultado de la consulta no llega, el programa está detenido. En el segundo ejemplo, la llamada es no bloqueante, por lo que el resultado no se asigna a una variable sino que se pasa como parámetro a un callback (una función que será llamada al terminar la ejecución de la consulta, en este caso). En el ejemplo el callback se define en el mismo lugar para abreviar, pero podría ser una función definida en otra parte.

Lo importante de esta diferencia es que el estilo bloqueante de llamadas consume muchísimos recursos mientras se produce esa espera, que al involucrar acceso a disco o recursos de red puede ser por un tiempo importante, sobre todo al considerar una ambiente de alta concurrencia.

El modelo no-bloqueante o asincrónico, permite además manejar el procesamiento de esos callbacks dentro de un bucle de atención de eventos en lugar de necesitar threads separados para cada instancia. Y los threads son costosos y cuello de botella a la hora de escalar con mucha concurrencia.

Node aprovecha esta diferencia cultural de Javascript y brinda un entorno donde podemos realizar la mayor parte de las conexiones de red en forma no-bloqueante.

Veamos un ejemplo rápido que puede ilustrar la sencillez y eficiencia de Node en acción:

http = require('http');
Buffer = require('buffer').Buffer;
mega = 1024 * 1024;
bloque = new Buffer(mega);
for (var i=0; i<mega; i++) bloque[i] = 65; // Letra "A"
// SERVIDOR
http.createServer( function (pedido, respuesta) {
respuesta.writeHead(200);
respuesta.end(bloque);
}).listen(8000);

Las últimas cuatro líneas son la versión más básica de un web server en Node. ¿Sencillo, verdad?

Las primeras dos líneas utilizan el mecanismo de CommonJS de inclusión de módulos. El módulo HTTP permite acceso completo al protocolo como cliente o servidor y soporta cosas interesantísimas como la capacidad de devolver contenido como streaming. El módulo Buffer se utiliza para preparar bloques de datos binarios o crudos, no Unicode.

Las siguientes tres líneas solamente crean ese bloque de 1 Megabyte exacto de largo.

Lo más interesante son esas últimas cuatro (una sola sentencia, como se puede apreciar). Allí creamos una instancia del servidor web que atenderá en el puerto 8000 y al recibir cualquier pedido (HTTP request) responderá el bloque lleno con 1 Mb de letras A con status Ok (200) en la cabecera.

Pero lo más interesante es la manera en que se comporta el servidor si lo sometemos a una prueba de alta concurrencia. En pruebas con 100 requests concurrentes, Node llega a responder más de 800 requests por segundo (respondiendo 1 Mb para cada uno), lo que es un rendimiento asombroso. Estas características brillan en servicios de chat, presencia, colaboración o cualquier otro escenario donde típicamente deban soportarse muchas conexiones concurrentes.

Node tiene muchas otras ventajas, pero espero que hasta acá alcance para interesarlos. Lo ideal para conocer más sobre Node, además del sitio oficial, es la comunidad de artículos sobre usos y extensiones How to Node.

martes, 28 de diciembre de 2010

Kod: un editor de código (abierto) para OS X

Kod

Kod es un editor orientado a escribir código para OS X. Es de código abierto, bajo licencia MIT (modificada para no permitir vender el editor como tal) y alojado en GitHub.

Tiene algunas características muy interesantes, que me llamaron la atención y por lo que estoy empezando a usarlo con bastante buen resultado (listo lo que detallan en el sitio oficial, con mis comentarios):

  • Tiene un comportamiento muy asincrónico, y aprovecha el poder de los procesadores de múltiples núcleos que tenemos hoy día. Esto es algo que hace tiempo espero de más aplicaciones.¿Porqué tengo que esperar a que las cosas se terminen de grabar para poder seguir trabajando? Kod es muy eficiente al estar trabajando con múltiples archivos de diferentes tamaños.
  • El entorno de scripting está basado en el ascendente Node.js, sobre lo que tengo que escribir un próximo post en más detalle.
  • Interfaz de usuario inspirada en Chromium, utilizando tabs que pueden soltarse en ventanas independientes y volverse a unir, pero sobre todo, permitiendo escribir el nombre del archivo a editar directamente en la barra de direcciones, algo que es muy práctico al editar código, en lugar de tener que abrir un cuadro de diálogo.
  • Tiene algunas cosas que no usé, como que permite editar directamente archivos a través de HTTP (aunque no grabarlo, claro), y para cambiar estilos en el editor todo se hace mediante CSS 3.
  • Soporta al parecer 65 lenguajes o dialectos, y al menos tiene buen soporte para Ruby, JScript y Python por lo que vi hasta ahora.

Atención: para los que buscar una IDE, este es sólo un editor. Pero es muy interesante, parece ser activamente mantenido, y puede ser una competencia interesante a los tradicionales TextMate y Vim habituales en el mundo Mac.

Dejo como muestra una captura del editor en mi máquina:

Kod-screen

viernes, 17 de diciembre de 2010

LiveReload: Mejorando la productividad, tecla por tecla

Acabo de encontrarme con una herramienta asombrosamente trivial pero increíblemente útil y adictiva: LiveReload.

Esta herramienta es para Mac OS X y soporta por ahora Safari y Chrome, pero imagino que pronto veremos clones para otras plataformas y browsers. El concepto es tan básico que parece increíble que nadie lo haya hecho antes.

Básicamente LiveReload se configura para monitorear una carpeta, de la que pueden incluirse o excluirse algunas extensiones en particular, etc.

A partir de el inicio del servicio (y teniendo la extensión correspondiente instalada y habilitada en alguno de los browsers), cualquier cambio que se graba en uno de esos archivos refresca automáticamente el contenido de la página (en gran parte de los casos ¡sin refrescar la página misma!) sin que tengamos que hacer nada en el browser.

Como siempre, un video vale más que 1024 palabras, así que dejo debajo uno grabado por Gregg Pollack para que vean la magia en acción.

Por supuesto, esto no es tan fácil de lograr tan eficientemente en entornos con compilación de por medio, pero solamente la magia de tocar hojas de estilo o scripts y verlos variar instantáneamente puede transformar nuestra forma de trabajo.

lunes, 13 de diciembre de 2010

Biblioteca open source de algoritmos y estructuras de datos para .NET

Frans Bouma

Frans Bouma, reconocido en la comunidad por su O/RM LLBLGen Pro, ha publicado recientemente en CodePlex una biblioteca open source para .NET cubriendo una cantidad importante de algoritmos y estructuras de datos clásicas que la Base Class Library no tiene, o cuya implementación podía mejorarse.

Algunas de las estructuras y algoritmos asociados son:

  • Comandos (y su administración): con soporte de undo/redo y grupos de comandos.
  • Grafos: directos y no-directos, sub-grafos, clausuras transitivas y ordenamiento topológico, etc.
  • Heaps
  • Colas prioritizadas
  • Ordenamiento
  • Bolsa de Propiedades
  • Implementaciones mejoradas de IEditableObject/IDataErrorInfo
  • Filtro de eventos
  • y otras utilidades menores

Esta biblioteca, llamada Algorithmia, se suma a las BCLExtensions, un conjunto de extension methods sobre varios tipos de la Base Class Library, para propósitos generales.

Ambos proyectos están disponibles en CodePlex, utilizando el soporte de código fuente de Mercurial y licenciados bajo BSD2.

Como Frans ya ha aclarado varias veces, no importa si a alguien le gusta más GIT que Mercurial o GitHub que CodePlex. Esas elecciones corresponden al autor, y sólo tienen importancia si uno está decidido a colaborar con el proyecto (para usarlo basta con un download plano de los fuentes), cosa que pocos hacen en la práctica, y quienes realmente quieren contribuir nunca tienen problemas en utilizar un cliente u otro de control de código.

 

jueves, 2 de diciembre de 2010

Videos de las 6tas Jornadas de Software Libre - Junín 2010

Sextas Jornadas de Software Libre

El 5 y 6 de noviembre pasados se realizaron en la localidad de Junín, Buenos Aires, Argentina, las 6tas Jornadas de Software Libre.

Hubo charlas de Python, Debian, Ubuntu, Linux en general, programación y administración, como pueden ver en el Cronograma completo.

Durante el evento se pudieron grabar las charlas y ahora ya están disponibles para quienes no pudieron asistir.

Pueden ver muchos de los videos en esta página:

http://unnoba.blip.tv/posts?view=archive&nsfw=dc

Y les dejo a mano este del amigo Juan Gabardini charlando sobre la relación entre Software Libre y Métodos Ágiles. Espero que la disfruten.