domingo, febrero 07, 2010

Ironruby webcasts

Hace un par de semanas tuve la oportunidad de presentar dos webcast/VAN, uno para el Club de .NET de la Universitat Oberta de Catalunya y para AltNet Hispano.

Si bien ambos los puede llevar a cabo no sin algunos contratiempos, ya que en esas fechas tuvimos una tormenta en la ciudad y hubo cortes de energía, pero finalmente puede participar.

Este post tiene como finalidad el realizar una recapitulación de ambas presentaciones ya que si bien las dos fueron en relación a IronRuby el enfoque fue un poco diferente.

¿Que es IronRuby?
Bueno esta pregunta se tiene que responder primero comentado que es Ruby.

Ruby es un lenguaje dinámico bajo el paradigma de Orientado a Objetos, con sintaxis inspirada en Python, Perl y SmallTalk. Lenguaje que vio la luz publica en 1995 bajo la mano de Yukihiro "Matz" Matsumoto.

Ruby es un lenguaje moderno que cuenta con características que son estándar en lenguajes modernos, como: manejo de excepciones, iteradores y clausuras, sobre carga de operadores, recolección de basura, portable, carga dinámica de librerías, introspeccion-reflexion-metaprogramacion entre otras-; ademas de que la sintaxis esta diseñada pensando en la productividad y diversión del desarrollador y sobre todo que sea lo mas natural al lenguaje humano.

Algo importante a notar es que Ruby es un lenguaje distribuido y licenciado bajo una licencia de Software Libre.

Ahora si vamos a al origen de la pregunta, ¿Que es IronRuby?, pues IronRuby es la implementación del lenguaje Ruby como un lenguaje dinámico para .NET, llevada a cabo por Microsoft.

IronRuby ofrece un interprete de Ruby compatible con la version 1.8.6, el cual permite ejecutar aplicaciones de Ruby de manera transparente o casi transparente, ademas de permitir a los programas que se ejecutan bajo IronRuby el poder interactuar con las librerías de .NET, e inclusive incluir dentro de una aplicación de .NET funcionalidad de "scripting" con el lenguaje Ruby.

IronRuby como se menciono es desarrollado por Microsoft y esta disponible bajo una licencia de Software Libre. Aunque aun no ha alcanzado si versión 1.0 - al momento de este post están en su RC 1 -, es lo suficientemente maduro para ser utilizado para el desarrollo de aplicaciones.

¿Porque usar IronRuby?
Es una pregunta un tanto difícil de contestar sobre todo porque depende de la perspectiva y visión de cada desarrollador, por lo tanto voy a contestarla desde mi visión.

Ruby cuenta con una gran variedad de herramientas maduras para realizar pruebas de código bajo los enfoques TDD y BDD ademas de herramientas para realizar Mocking de objetos, si bien en .NET también las hay, existen algunos proyectos que intentan replicar algunas de estas en C#, pero entonces ¿para que replicarlas si las podemos usar con un poco de IronRuby?

En Ruby esta Rake, una herramienta para hacer scripts para "construir" aplicaciones o archivos de "Build", bastante poderosa y flexible, tanto así que proyectos populares de Software Libre en .NET usan esta librería para ejecutar pruebas, compilar y empaquetar estos proyectos, tal es el caso que inclusive hay una librería llamada Albacore, la cual es una compilación de tareas Rake para .NET.

Ruby es un lenguaje que favorece la creación de DSLs - Domain Specific Languages -, por ejemplo en Ruby on Rails encontramos la implementación de DLSs en diferentes puntos del Framework. Otro ejemplo muy bueno es Sinatra, un DSL para la creación de aplicaciones Web.

En la lista de IronRuby, también mencionan que es mucho mas fácil y rápido realizar aplicaciones con Ruby en comparación con su contraparte en C#, tan es así, que se han creado un par de "wrappers" para la creación de aplicaciones ASP.NET MVC totalmente en Ruby, también es posible crear aplicaciones en Silverlight con un Framework al estilo Ruby On Rails llamado IronNails.

Gracias a IronRuby es posible reutilizar la gran cantidad de librerías de Ruby, Frameworks y aplicaciones en ambientes .NET y viceversa.

Por último, otro punto a favor es la posibilidad de darle a nuestras aplicaciones .NET la posibilidad de extenderlas mediante "scripting" en el lenguaje Ruby.

Quizás puedan estar de acuerdo conmigo o no, o inclusive a la mejor me faltan mas escenario que hacen que IronRuby sea "deseable" en .NET; lo que si creo que vale la pena es darle la oportunidad y crear nuestro propio criterio. Esta discusión en la lista de IronRuby abre un abanico un poco mas amplio de posibilidades.

¿Que necesito para iniciar en IronRuby?
Lo primero que hay que hacer es descargar IronRuby de la página de http://ironruby.net, su instalación es tan sencillo como descomprimir IronRuby en nuestro disco duro y agregar esta carpeta en nuestro path.

No voy a publicar como trabajar con IronRuby ya que eso se mostró en los Webcast/VAN, en el momento que alguno de esos videos estén disponibles, pondré los enlaces en este post.

Una pregunta recurrente que me han hecho y no solo para IronRuby, sino también para Ruby es ¿Que IDE uso para *Ruby?, bueno en el mundo *Ruby es muy común el uso de editores como Emacs y VIM o editores de texto como TextMate en OSX, en Windows también es posible usar editores sencillos como Notepad2, eTextEditor o un IDE mas en forma como RubyMine de JetBrains.

Siendo RubyMine una de las IDEs disponibles enfocada al desarrollo de aplicaciones en Ruby - Debo aclarar que gracias a AltNetHispano y JetBrains me obsequiaron una licencia hace unos días, pero aun antes de esto ya había yo mencionado/recomendado RubyMine -, inclusiveRubyMine tiene soporte para IronRuby.

Hay una solicitud en Microsoft Connect para que Visual Studio 2010 incluya soporte a desarrollar aplicaciones IronRuby desde el mismo IDE.

Show me the code! Show me the code!
Después de esta larguísima introducción, ahora si ha llegado el momento de mostrar el código de ejemplo utilizado en las dos presentaciones, casi todo este código se ejecuto desde el interprete de IronRuby ir.exe

Para poder ejecutar algunos de los ejemplos es necesario instalar primeramente algunas gemas de Ruby. Una Gema es una librería que extendiende la funcionalidad base de Ruby.

Para encontrar Gemas para casi todo lo que nos podamos imaginar hay que visitar GemCutter.

El siguiente comando instalara gemas para Sinatrarb, Rails, Rspec, Cucumber, Rake y el driver de SQLServer para Ruby. Es importante actualizar nuestro path en Windows para incluir el directorio donde esta el código binario de IronRuby y el código de las gemas; asumiendo que instalamos IronRuby en C:\IronRuby ejecutamos:

set PATH=%PATH%;C:\IronRuby\bin;C:\IronRuby\lib\IronRuby\gems\1.8\bin

Para instalar las gemas ejecutamos:

igem install sinatra rake rails rspec cucumber ironruby-sqlserver --no-rdoc --no-ri

- Variables
Al ser un lenguaje dinámico, en Ruby podemos la declaración de variables se hace sin tipo.

- Métodos
La llamada a métodos puede realizarse con paréntesis o sin paréntesis para pasar parámetros.

- Clases
Al redefinir una clase no es necesario declararla por completo, solo declarando lo nuevo o lo que se modifica es suficiente. La reflexión y el manejo dinámico de las clases es muy poderoso.

- Ruby es amor, "Sintactic Sugar"
El lenguaje de Ruby en ocasiones se "siente" tan natural

- Expresiones regulares
Ruby es tan poderoso para el manejo de expresiones regulares como Perl

- Reflexion
Metaprogramacion, reflexion en Ruby es algo tan natural

- Sinatra
La siguiente aplicación de ejemplo de Sinatrarb muestra el uso de el DSL para aplicaciones Web, es importante que antes de ejecutar el ejemplo, instalemos el siguiente parche al código fuente de Sinatra para que funcione correctamente con IronRuby:


Para ejecutar la aplicación solamente iniciamos con el siguiente comando:

ir SinatraSample.rb

Y apuntamos nuestro navegador a:

http://localhost:4567 http://localhost:4567/acercade http://localhost:4567 /Mario

Para conocer mas de Sinatra pueden ver este screencast en español.

- Ruby on Rails
Ruby on Rails es el framework mas famoso en Ruby para el desarrollo de aplicaciones Web. Con IronRuby podemos crear aplicaciones bajo este Framework. Para este ejemplo se requiere de tener una base de datos en SQL Server llamada ironruby_on_rails_dev.

Hay que seguir las instrucciones en el código que se muestra, ya que es necesario realizar algunos cambios a ciertos archivos de nuestra aplicación Rails para que pueda funcionar, una vez que ejecutemos el server de Rails podemos apuntar nuestro navegador a: http://localhost:3000/posts

Nuestra aplicación de debe de mostrar en el navegador.

- Usando IronRuby para probar nuestras aplicaciones .NET
Partiendo de la idea que tenemos la siguiente clase en C# que deseamos probar, inicialmente con Rspec, definimos únicamente es esqueleto de la misma, para compilarla, desde la linea de comandos ejecutamos:

csc /target:library /out:Bowling.dll *.cs

Ahora definimos su funcionamiento con Rspec

Para ejecutar nuestras pruebas podemos ejecutar alguno de los siguientes comandos:

spec --format specdoc spec --format html > spec_bowling.html

Después de ejecutar el comando podemos ver que pruebas pasan y cuales fallan

Si implementamos nuestra clase y la compilamos de la siguiente forma y ejecutamos nuestras pruebas, ahora nuestra especificación debe pasar

csc /target:library /out:Bowling.dll *.cs spec --format specdoc

Otra herramienta para probar nuestras aplicaciones es Cucumber, para poder traerlo a nuestro escenario, hay que crear un folder llamado features y crear el siguiente documento

Dentro de feature hay que crear otro folder llamado step_definitions y dentro creamos el siguiente archivo

Ahora si podemos ejecutar alguno de los dos siguientes comandos para ejecutar nuestra prueba con Cucumber

cucumber features/bowling.feature cucumber features/bowling.feature --format html --out features.html

- Extender clases de C# desde IronRuby
La reflexion y la metaprogramacion de Ruby la podemos llevar también a las clases de C#, por ejemplo con la clase compilada de Bowling.cs, si cargamos el interprete de Ruby podemos extenderla de la siguiente forma:

- Incluyendo Ruby para darle capacidad de scripting a nuestras aplicaciones en .NET
Con IronRuby podemos hacer que nuestras aplicaciones en .NET "hablen" Ruby

Para compilar el siguiente ejemplo ejecutamos:

csc Program.cs /r:IronRuby.dll /r:Microsoft.Scripting.dll /r:Microsoft.Scripting.Core.dll

La librerías requeridas están incluidas en la instalación de IronRuby.

Conclusion Ruby es un lenguaje con muchos pequeños detalles que hacen que sea agradable programar en el, el soporte y actividad de la comunidad Ruby es mas que excelente, el contar con un Framework para el desarrollo de aplicaciones que otros lenguajes/comunidades han buscado replicar, son puntos adicionales para investigar y experimentar con Ruby.

El plus que trae IronRuby es el poder unir los dos mundos, el dinámico y estático con .NET, de una forma que no causa "fricción" el pasar de .NET a Ruby y viceversa.

Me han preguntado por ejemplos de grandes aplicaciones que se hallan desarrollado en .NET, hasta ahorita no hay una que conozca, pero estoy seguro que una vez que IronRuby alcance la versión 1.0, no tardaremos en ver aplicaciones que hagan extenso uso de Ruby.

Recursos A continuación les presento los siguientes blogs/sitios con referencia sobre Ruby e IronRuby.

2 comentarios:

Archtron dijo...

De los pocos análisis existentes acerca de IronRuby este es uno de los mejores. Si es posible podrías continuar haciendo mas artículos acerca de ironruby. Por ejemplo como se lo utiliza con Winforms, con ADO.NET. Y como funciona la implementacion dbi con ADO.NET y salida con Winform.

p1r4t0s dijo...

muy buena introducción.

+1