lunes, febrero 15, 2010

Migrar aplicación de ASP.NET Webforms a Mono

Hace un par de días me preguntaron, que se necesita para migrar una aplicación de ASP.NET Webforms a Mono y ejecutarla en un ambiente Linux.

Primeramente hay que conocer que según la pagina de ASP.NET Webforms de Mono, ASP.NET Webforms 2.0, ASP.NET Ajax y algunos controles 3.5 están soportados. Pero esto no es suficiente para algunas aplicaciones, ya que es posible que usen controles de 3ros. que no funcionan o funcionan correctamente en Mono, otro punto importante es que hay que recordar que los ambientes Linux son sensitivos a minúsculas/mayúsculas y si nuestra aplicaciones tiene archivos cuyos nombres están indistintos en minúsculas/mayúsculas muy probablemente vamos a tener problemas.

La opción segura para saber si nuestra aplicaciones puede funcionar o no en Mono es ejecutar MoMA, una aplicación para Windows que analiza nuestra aplicaciones ASP.NET Webforms y nos puede decir si todo esta bien o hay algo que no esta soportado en Mono.

Si nuestra aplicación no tiene ningún problema de acuerdo al reporte de MoMA, el siguiente paso es determinar si nuestra base de datos, usualmente MSSQL, server va a seguir en Windows o si también se va a migrar a MySQL o Postgresql.

Obviamente si se decide migrar la base de datos hay dos tareas importantes a realizar, la primera es convertir el esquema de MSSQL Server a la base de datos destino; la segunda tarea es que si nuestra aplicación hace uso de ADO.NET y estamos usando directamente las clases del namespace System.Data.SqlClient, vamos a tener que reemplazar esos objetos por los correspondientes a la base de datos destino.

Para MySQL hay que descargar el Connector/NET, el cual es un librería 100% .NET para conectarse a bases de datos MySQL. Si vamos a usar Postgresql, hay que descargar el Npgsql, librería 100% .NET para acceder a Postgresql.

SI ya llegamos hasta este punto y queremos publicar nuestra aplicación para que los usuarios se puedan conectar a ella; para tal efecto podemos utilizar el servidor Apache y el modulo Mod_Mono, que permite a Apache "servir" aplicaciones .NET.

Adicionalmente si vamos a desarrollar aplicaciones directamente desde Mono, una buena opción es descargar el ambiente de desarrollo llamado MonoDevelop; de esta forma vamos a poder desarrollar, modificar y depurar nuestras aplicaciones.

Sobre como instalar Mono, MySQL, Postgresql y Apache en Linux, va a depender de nuestra distribución, pero generalmente todas cuentan con un sistema de distribución de aplicaciones de donde podemos elegir tales aplicaciones para instalar. Como dato adicional, Ubuntu y SuSe son distribuciones "amigables" con Mono, por lo tanto ambas son recomendadas.http://mono-project.com/


martes, febrero 09, 2010

Pinta, alternativa de Paint para Gtk

Hace unos días me entere de la aplicación Pinta, la cual esta una alternativa sencilla para el dibujo/edición de imagines, desarrollada en Mono, usando como modelo Paint.NET.

Al ser una aplicación Mono basada en GtkSharp y Cairo, es altamente portable, y por lo tanto puede ejecutarse en Linux y OSX.

Una aplicación como esta, me es muy útil para realizar pequeños retoques a imágenes, por lo que procedí a descargarla, pero en la pagina solo existían paquetes para Suse y Ubuntu, ademas de la aplicación en un archivo zip.

Por lo tanto para poder utilizarla en OSX la única forma era ejecutarla desde la terminal, no muy amigable que digamos. Debido a esto decidí crear un Bundle para poder ejecutarla desde mi folder de Aplicaciones.

Le envié el bundle a Jonathan Pobst el Bundle, y a partir de ahora ya es posible la aplicación para OSX e instalarla como "un ciudadano de primera clase".

Pinta apenas esta en su versión 0.1 y le falta mucho camino por recorrer en Linux y OSX, pero aún así esta bastante completa para ser versión 0.1.


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.

martes, febrero 02, 2010

DevLab: Git para Windows

En este video se muestra como trabajar con repositorios Git desde el ambiente Windows. Para tal efecto se usa la herramienta msysgit.

DevLab: Como usar Git en Windows from Mario A Chavez on Vimeo.


lunes, febrero 01, 2010

Super Happy Dev House Tijuana 3

Una vez más ha llegado el momento de anunciar el próximo Super Happy Dev House - SHDH - Tijuana que se realizará el sábado 13 de Febrero del 2010. Si tienes alguna idea de un proyecto a realizar, o quieres aprender algo nuevo de forma practica esta es tu oportunidad, únicamente basta con ir al wiki y anotar tu idea o proyecto.

Se agradece el apoyo del clúster de tecnologías de IT@Baja por facilitarnos el espacio para poder llevar a cabo el evento.

IT@Baja, Clúster de Tecnologías de Información de Baja California
Blvd. Diaz Ordaz # 4558-209
Colonia Las Palmas
A un costado del centro comercial Las Palmas

Recuerden que el evento no esta patrocinado por ninguna empresa u organización, lo patrocinamos todos, por favor si piensas asistir apúntate en la pagina de patrocinio con algunas bebidas o comida con que puedas contribuir.