Ayer hubo un evento de lanzamiento de Visual Studio 2013, donde Microsoft conato una serie de novedades. Algunas eran sabidas, dos en particular me llamaron la atención, porque me parece que son movimientos en la dirección correcta.
Finalmente se mostró el primer preview de la versión online de Visual Studio, que al parecer sólo se puede ver en videos por ahora, pero suena interesante. A pesar de estar bastante pegada a TFS online, una plataforma que no me resulta especialmente atractiva, mantiene y expande una actitud más abierta, con fuerte integración con Git, como se puede ver en el video que dejo debajo. Por otro lado, como verán, Node mantiene una presencia muy fuerte, con gran cantidad de ejemplos. La idea de que este entorno sea gratuito para grupos reducidos es importante.
Leí un par de notas periodísticas que mencionan esta iniciativa como una competencia directa de Microsoft a GitHub, que realmente me hicieron reír. Es cierto que algunos desarrolladores muy establecidos en el ecosistema Microsoft pueden preferir moverse en algún momento, pero no veo ninguna posibilidad de que algo de esto se plantee como una alternativa masiva. Al contrario, veo que son plataformas que pueden complementarse, y aunque no tengo chance de probarlo todavía, intuyo por las demos que tranquilamente se podría trabajar con esta IDE online desde un repositorio de GitHub. No veo ninguna dificultad técnica, y confío que el espíritu de apertura que intentan mantener desde este grupo de Microsoft no genere una barrera artificial.
Queda un video breve (~ 5 min) donde se muestra un proyecto Node, y cómo se utiliza el entorno, altamente integrado con TypeScript, que es otra estrategia interesante, sobre todo por lo poco intrusiva:
El otro gran anuncio es una asociación más directa con la gente de Xamarin, la empresa formada por los iniciadores del proyecto Mono, y todavía uno de los mayores grupos contribuyendo con él, que se dedica a permitir el desarrollo de aplicaciones nativas (no híbridas) en C# para iOS, Android, Windows Phone, OS X y otras plataformas (por extensión).
Lo interesante de esta asociación es que más allá de temas comerciales, tiene puntos técnicos muy importantes, logrando abrir más las puertas del ecosistema Microsoft / .NET hacia el exterior. Por ejemplo, las Portable Class Libraries (PCL) de .NET son ahora realmente abiertas y soportan el movimiento de librerías entre cualquier plataforma, facilitando muchísimo el intercambio también a nivel NuGet (el mecanismo de manejo de dependencias abierto del mundo .NET).
En total, esta noticia parece más de índole comercial, pero para mi el acercamiento al equipo de Xamarin y el reconocimiento del valor de llegar a estas plataformas fuera de su control son un blanqueo y una buena actitud que espero seguir viendo desde Microsoft hacia afuera.
TDD es una técnica de diseño sobre la que se habla bastante (pueden ver varios post sobre el tema aquí mismo) y que realmente hace una diferencia en la calidad del código que generamos, y nos permite encarar cambios más profundos, incluso a nivel de la arquitectura ce la aplicación, con mucha más confianza.
A pesar de que hay muchos tutoriales sobre el tema, no es tan frecuente conseguir recursos que vayan más allá de ejemplos sencillos, generalmente con poca funcionalidad, mínimas dependencias, etc.
En esta VAN (reunión virtual) de ALT.Net Hispano, el Maestro Angel "Java" López deja de lado por un rato la física cuántica y dedica poco más de dos horas a crear una aplicación desde cero con TDD, basándose en ASP.NET MVC 3. Pero más allá de Visual Studio o C#, la manera en que el Maestro avanza en el desarrollo de la aplicación puede servir para entender el proceso a cualquier programador, en cualquier lenguaje: pasos mínimos, refactorización, foco en el modelo, etc.
La sesión es larga, pero sumamente recomendable. Incluso para quienes ya practican TDD, permite apreciar un estilo definido de construcción que seguramente tenga influencia en el nuestro, aunque no lo adoptemos completamente, o nos haga replantear parte de la manera en que avanzamos con algunos pasos. Personalmente creo que para todo desarrollado (y mejor aún si se lo ve en equipo) estas son horas extremadamente valiosas para invertir, que ahorran semanas a futuro.
Recuerden también que hay casi 90 sesiones de este estilo en el portal de ALT.NET Hispano (cientos de horas de entrenamiento gratuito).
A continuación el video, en español, de 144 minutos de duración:
La semana pasada avisé (el segundo día) sobre el evento en línea aspConf, que se extendió por dos días y varios tracks simultáneos.
Como era de esperar, las sesiones ya están disponibles. Hay 17; no se si son todas.
Uno de los principales problemas de este evento, en su edición en línea, fue seguir utilizando Live Meeting, que a mi juicio es una plataforma obsoleta y con muchos problemas, que va en contra de la apertura que Microsoft muestra en otros aspectos. Para empezar, no funciona bien en Mac o en cualquier cosa que no sea Windows, y tuve varios problemas para ver alguna sesión incluso en Windows 8.
A esta altura, uno espera de un evento en línea el llegar a una página y verlo, sin mucho más requerimientos ni tener que bajar ninguna plataforma cliente. Irónicamente, se dieron cuenta de algunas de las limitaciones de Live Meeting porque en paralelo con ese mecanismo, había un chat abierto a través de la web para la interacción con el público.
Pero dejemos de lado las críticas y vamos al contenido, que es lo que cuenta. Las sesiones ya está disponibles para ver directamente en el navegador (o descargarlas, incluso disponibles en múltiples formatos) en la página del evento en Channel 9.
Dejo de regalo las dos keynotes, a cargo de los Scotts: Guthrie y Hanselman.
Perdí ayer la oportunidad de avisar el primer día de la conferencia virtual sobre ASP.NET llamada AspConf.
Pero para los interesados, hoy pueden sumarse al segundo día, a partir de las 11 de la mañana (hora Argentina - 7 am horario del Pacífico).
Aunque todavía no vi disponibles los vídeos del primer día, estimo que todos quedarán en línea brevemente.
Este evento virtual es bastante grande, con 6 tracks en paralelo, y 5 slots de una hora y media cada uno, más charlas principales (keynotes) de una hora; la keynote de ayer estuvo a cargo de Scott Guthrie, la de hoy estará a cargo de Scott Hanselman.
Un grupo conformado por algunos de los sospechosos de siempre en el ambiente .NET han formado esta organización sin fines de lucro para evangelizar y apoyar activamente el desarrollo de proyectos y plataforma de código abierto alrededor de .NET.
Hay algunos ex-Microsoft como Phil Haack (actualmente en GitHub), Joseph Hill, cofundador de Xamarin con Miguel de Icaza, Dale Ragan, cofundador de Moncaí (una Plataforma como Servicio basada en Mono), e incluso un empleado activo (hiper-activo, en realidad) de Microsoft como Scott Hanselman.
Entre otras cosas, esta organización es actualmente la responsable de la conferencia MonoSpace 2012, que se realizará del 17al 19 de octubre en el Microsoft NERD Center (no, el nombre no es chiste) de Cambridge, Massachusetts. Los interesados en la conferencia puede acceder a todas las presentaciones de la edición del año pasado en InfoQ.
No hay muchas más noticias por ahora, pero parece un movimiento interesante.
Este post debería haber salido hace bastante tiempo atrás, durante el lapso en que este blog estuvo silencioso, pero -nobleza obliga- hay gente conocida que trabajó mucho por esto y vale la pena comunicarlo para los que todavía no estaban al tanto.
El equipo de ASP.NET MVC avanzó un paso muy grande en su impulso hacia el código abierto a fin de marzo pasado al publicar el stack completo de MVC 4, incluyendo Web API, Web Pages (o Razor, el motor de rendering de vistas) con contribuciones externas, bajo licencia Apache 2.0.
Como detalle interesante, el código del stack completo está alojado en GIT dentro de CodePlex (que hace tiempo soporta GIT y Mercurial además de TFS y SVN). Esto implica que los curiosos sólo necesitan hacer un:
Desde el anuncio, Microsoft avanzó hasta la publicación en junio de las "release candidates" de MVC 4 (incluyendo ya un montón de contribuciones de la comunidad) y Visual Studio 2012. MVC 4 también incluye otros paquetes abiertos como jQuery, jQuery Mobile, jQuery UI, Modernizr, Knockout y JSON.NET.
Otro detalle interesante es que MVC no está atado a Visual Studio ni a .NET, y también corre en Mono. Casualmente, Miguel de Icaza (líder del proyecto Mono) fue el primero en contribuir con un pull request.
Dejo para el final un video (en 6 partes, ~80 minutos, en inglés) de Scott Guthrie presentando MVC 4. El video tiene un tiempo, pero es de lo mejor que encontré, presentado por la persona que está directamente detrás del proyecto, y uno de los mayores impulsores del código abierto dentro de Microsoft. No por casualidad, ahora que Scott está a cargo de la experiencia de desarrollo de Azure, todos los SDK y herramientas son también abiertas.
La gente de JetBrains, los cerebros a propulsión detrás de IntelliJ IDEA, ReSharper y toda una familia de IDEs especializadas, anunció recientemente la contratación del núcleo del equipo de desarrollo de Nemerle, uno de esos "raros lenguajes nuevos", completamente abierto, que revisé en este blog un año atrás.
Como explican en el anuncio, la incorporación se decidió en reconocimiento al increíble trabajo de Nemerle en la implementación del lenguaje y sus características de meta-programación, inferencia de tipos, etc. El foco del equipo estará por o tanto en el proyecto N2, un framework para desarrollo de lenguajes, un área a la que JetBrains se dedica muy especialmente y con evidente éxito.
Para que se den una idea sobre lo que genera esta gente, les dejo un video fresquito de una sesión sobre este lenguaje presentada por Igor Tkachev, del equipo de desarrollo, durante la reciente Norwegian Developers Conference en Oslo, a principios de junio (dura menos de media hora y está en inglés).
Da la impresión que el contacto y la posibilidad de fusión surgió a partir de esta época, así que puede ser un video para la historia (al menos para el equipo de Nemerle y JetBrains).
Para los lectores interesados en .NET, esta es una muy buena noticia. La nueva versión de ASP.NET MVC ya está en Beta, y al parecer bastante estable, siguiendo el estilo de este equipo, que se diferencia de otros de Microsoft en su ciclo de producto sumamente iterativo y muy basado en pruebas.
Otra particularidad de este equipo es que termina liberando (ya que no arrancan así durante el desarrollo, lamentablemente) el producto como código abierto. Scott Guthrie, padre de ASP.NET MVC y buena parte del viejo ASP.NET, confirmó que esta versión también será licenciada como código abierto (la actual tiene licencia Apache 2.0), ante la pregunta de Miguel de Icaza en Twitter, lo que implica que podrá utilizarse con Mono próximamente.
La versión Beta, que ya está disponible para descarga y puede usarse en paralelo con MVC 3, tiene las siguientes mejoras principales:
ASP.NET Web API - la versión final del modelo para servicios REST, evolución de la WCF Web API.
Plantillas de proyecto nuevas y mejoradas, con código HTML mucho más cuidado, código más prolijo del lado del servidor, y uso de rendering adaptativo para que se vea correctamente en múltiples dispositivos.
Nueva plantilla para sitios móviles - aunque la plantilla básica se adapta bien a teléfonos, esta nueva está específicamente pensada para ese escenario, incluyendo de entrada jQuery Mobile para mejorar la experiencia táctil.
Modos de Display es la característica que permite cubrir el escenario mixto en que la misma aplicación debe tener vistas especializadas para diferentes dispositivos, con el mismo código servidor y mínimos cambios en el código cliente, pero que implican una gran diferencia en la experiencia del usuario.
Recetas para generación de código - facilitan a los autores de paquetes NuGet utilizar generación para alterar la generación ante los comandos de agregado de vistas, controladores, etc.
Soporte para Tasks (tareas asincrónicas) en los controladores.
Probablemente una de las novedades más importantes es la inclusión de la Web API, que permite generar servicios que pueden exponerse incluso fuera de IIS, y mejora mucho las capacidades para construir aplicaciones RESTful. Dejo un video (en inglés, 70 minutos) de Daniel Roth, del equipo de MVC, demostrando sus capacidades principales.
Heroku es un servicio PaaS (Plataforma como Servicio), que permite publicar en la nube aplicaciones Ruby (el lenguaje soportado originalmente), Node.js, Scala, Java y Python.
La plataforma es fabulosa porque tiene un modelo de escala muy interesante, y es muy sencillo montar aplicaciones de manera gratuita por bastante tiempo, hasta que el volumen de tráfico y consumo de recursos requiere que se pase a un plan pago (lo que en muchos casos debería suceder cuando la aplicación ya está generando dinero).
Por otro lado, Heroku es una de la plataformas en su tipo con mayor simpleza para el despliegue y mantenimiento de las aplicaciones. Fuertemente basada en los flujos de trabajo de GIT, el sistema distribuido de control de versiones (creado por Linus Torvalds), para las plataformas soportadas directamente, desplegar una aplicación es tan simple como ejecutar desde la línea de comandos, parados sobre nuestro repositorio de GIT local:
git push heroku master
Y listo. Heroku se encarga de resolver todas las dependencias de acuerdo a las convenciones de cada plataforma (bundle en Ruby, NPM en Node, etc), lo que usualmente es muy rapido, y hace que nuestra aplicación esté disponible en segundos.
Bueno, esto ya debe ser conocido por la mayoría de los lectores de este blog. La novedad es que Ben Hall, un colega desarrollador que trabaja regularmente en ASP.NET y Rails, encontró la manera de desplegar en Heroku una aplicación basada en Mono (la implementación abierta y gratuita de .NET).
La aplicación de prueba está escrita en C# y basada en el framework Nancy (basado en Sinatra, un framework web minimalista para Ruby; Nancy es el nombre de la hija de Frank Sinatra). Como Ben explica en este post, este mecanismo no está soportado en lo más mínimo por Heroku, pero abre el camino para que eventualmente sea soportado (nótese que todos los lenguajes soportados además de Ruby fueron agregados en los últimos seis meses, aproximadamente).
Aunque el proceso es bastante experimental (requiere desplegar unas cuantas piezas de infraestructura sobre el stack Cedar de Heroku, que es el más nuevo de los sabores, y provee proceso sobre Ubuntu 10.04, y sobre el que corren todos los nuevos lenguajes.
La prueba final de que esto puede pasar de ser un experimento a algo más es que Chris Kemp, del equipo de Soluciones Técnicas de Salesforce.com (la compañía dueña de Heroku) grabó este video (en inglés) en el que muestra cómo poner en práctica la receta de Ben. Disfrutenlo, y esperemos que dentro de un tiempo podamos tener soporte más directo para Mono en Heroku.
Se va terminando el año 2011 y mirando hacia atrás desde la perspectiva de la comunidad .NET somos varios los que vemos que este año fue sumamente importante para el código abierto en ese entorno. Y no estoy hablando solamente de Microsoft, ya que .NET ya tiene entidad independiente de su creador original.
Para los que tienen ganas de leer posts más largos y en inglés, recomiendo los de Phil Haack (hasta hace poco líder del ASP.NET MVC en Microsoft, ahora trabajando para GitHub) y Miguel de Icaza (el incansable líder del proyecto Mono).
Este post es un resumen breve del contenido que ellos exponen, con algunas apreciaciones personales.
El modelo Open Source fue algo que Microsoft, con su tradición de secretos y licenciamiento complejo, tardó muchísimo en incorporar. Y más complejo aún el modelo de Free Software, que implica tanto apertura como gratuidad de los productos. Sin embargo, desde hace años, con pioneros como IronPython, el DLR, y más tarde ASP.NET MVC, varios productos de la plataforma de desarrollo empezaron a producirse bajo esta premisa. Un punto culminante de esta iniciativa fue en 2008, cuando Microsoft anunció que comenzaba a incluir jQuery en Visual Studio, colaborando con el proyecto (de manera abierta, como cualquier otro) e incluso brindando soporte sobre el mismo.
Al entender la importancia del movimiento, Microsoft finalmente generó una Fundación llamada OuterCurve (originalmente se llamaba CodePlex, pero usar el mismo nombre que su sitio de alojamiento de código resultaba muy confuso), que como la Fundación Apache, permite resguardar los derechos del código y de los autores en un ambiente controlado. Muchos proyectos hoy existen bajo OuterCurve, aunque hay muchos también directamente en Apache.
Finalmente, este año Microsoft avanzó más en ese sentido, mejorando notablemente las condiciones de búsqueda e integración de código abierto propio o de terceros, a través de NuGet, el administrador de versiones para .NET, inspirado en Ruby Gems y similares. NuGet se integra en Visual Studio o puede usarse en la línea de comando, y permite buscar en un catálogo muy abundante actualmente de componentes abiertos, instalarlos en nuestros proyectos, incluyendo todas sus dependencias, e incluso automatizar tareas relativas a su instalación y uso, como declararlos en configuraciones, generar código u otros artefactos desde la consola, etc. NuGet también facilita mantener actualizadas, si es necesario, todas las versiones de estos paquetes.
Más allá de la reagrupación, que no redujo en lo más mínimo el impulso del proyecto Mono, a pesar de que el equipo de Xamarin se concentró en poner en el mercado MonoTouch y Mono for Android (productos comerciales que les permiten seguir sobreviviendo). Mientras tanto, el equipo de Mono (que excede también a Xamarin, como todo gran proyecto abierto) entregó este año una avalancha de tecnologías (más allá de varias versiones del runtime mismo de Mono y de MonoDevelop, su IDE), incluyendo:
.NET en el navegador (al menos en Chrome) a través de Mono corriendo en el Native Client de Google. De hecho, Google mostró Mono en Chrome en un evento reciente, del que dejo el video al final de este post. Aunque el año pasado ya se podía programar en mono y utilizar el compilador estático para ejecutar código dentro de Chrome, este año ya se puede ejecutar el compilador a demanda (JIT) de Mono.
MonoMac es una extensión de Mono para programar aplicaciones para Mac OS X en .NET, incluyendo el soporte para Cocoa y todo el entorno del sistema operativo. Se programa utilizando MonoDevelop y algunas herramientas nativas como los diseñadores de XCode.
MonoGame (ya comentado antes en este blog) es un port del entorno de desarrollo de juegos XNA de Microsoft, pero abierto y con mayor alcance en plataformas.
Sony PlayStation Suite es un framework de Sony para desarrollar juegos en diferentes dispositivos de su línea, completamente basado en Mono.
Phalanger es un compilador de PHP, actualmente basado en Mono, utilizando el DLR, que además de ser el motor PHP de mayor rendimiento, permite extender ejecutar cualquier aplicación PHP y extenderla con librerías o aplicaciones .NET.
CXXI es una tecnología puente entre C# y C++ que permite ejecutar código de una a otra plataforma, pero también heredar clases entre ellas, sobre-escribiendo métodos o no, o llamando a la clase base, todo de manera muchísimo más sencilla, segura y multi-plataforma que utilizando COM.
Y hay bastante más (ver el post de Miguel para el detalle completo), pero como detalle final, Miguel descubrió que Microsoft mismo utilizó Mono para producir el juego Kinectimals para iOS. ¡Toda una ironía!
Dejo el video (en inglés) del evento de Google Client para que lo disfruten:
Siguiendo con sus planes de dominar el mundo, JavaScript tiene desde hace un tiempo un interesante motor construido en .NET que permite ser embebido en cualquier aplicación: Jint
El proyecto es de código abierto y fue iniciado por Sébastien Ros y colaboradores antes de ingresar a Microsoft, donde trabaja en el equipo del proyecto Orchard.
A diferencia de otros proyectos que intentan emitir código IL a partir de JavaScript, lo que es problemático por el problema de no poder descargar los ensamblados generados, o de otros proyectos basados en el Dynamic Language Runtime, Jint es un intérprete completo basado en ANTLR.
Jint permite utilizar JS como lenguaje para extender aplicaciones dinámicamente, algo que en .NET muchos hicimos previamente utilizando IronPython o IronRuby. Pero JavaScript es bastante más amplio en su uso, y esta clase de recursos siempre es muy valioso, sobre todo en este caso en que el soporte es muy completo, cubriendo la especificación completa de ECMAScript 3.0, y soportando en el último release muchos elementos del estándar 5.0.
Dejo el ejemplo más básico de uso desde C# (obviamente puede ser embebido en cualquier lenguaje .NET):
script= @" function square(x) { return x * x; };
return square(number); ";
var result = new JintEngine() .SetParameter("number", 3) .Run(script));
Como comentaba días atrás, se está organizando una nueva reunión de la comunidad Alt.NET en Buenos Aires, y la fecha final es el sábado 16 de julio, de 9:00 a 18:00 en las oficinas de Microsoft Argentina (gracias al anfitrión Miguel Sáez), en Bouchard 710, 4to piso, Ciudad de Buenos Aires.
Para quienes no conocen el formato Open Space, les dejo el enlace a esta guía.
Tradicionalmente el almuerzo se hace en el mismo lugar, con empanadas o pizzas, en un intervalo a mediodía, de manera de aprovechar al máximo este sábado geek.
Otra cosa importante es que aunque la selección de temas se produce por presentación y votación en el primer momento del evento, hay una wiki donde se pueden ir proponiendo temas posibles, de manera de ir generando ideas. Es importante animarse a proponer temas, recordando que el que propone no necesariamente tiene que exponer, si no que puede hacer un llamado a charlar sobre algo que no conoce bien o que le genera dudas.
Como último detalle antes de cerrar (y que puede generar algún debate en el Open Space) les dejo el video de la más reciente de las VAN de Alt.NET Hispano (y recuerden que ya hay 75 sesiones de cerca de dos horas disponibles para ver a demanda):
El tema es "Identity Providers, oAuth y Autenticaciones on-line", presentado por Carlos Peix y Nelo Pauselli.
El video que comparto esta vez tiene un par de cosas raras para este blog:
Está en inglés (fue grabado en la reciente Norwegian Developers Conference)
Presenta un producto pago (no abierto)
¿Por qué lo publico entonces? Porque en 6 minutos, Hadi Hariri, colega que participa también en el grupo Alt.NET Hispano, y al que oportunamente espero conseguir para presentar algo de esto en español, demuestra algunas características de ReSharper 6, un complemento con Visual Studio que algunos describieron en Twitter como "una IDE que utiliza Visual Studio como host", por sus increíbles capacidades.
Específicamente, y más allá de que uno programe o no en .NET y eventualmente no utilice Visual Studio, me parece notable el nivel de análisis en vivo que pueden hacer sobre código JavaScript. Como Hadi dice en un momento del video, ya no es un tema de "estático o dinámico" sino de las herramientas adecuadas. JetBrains, la empresa detrás de ReSharper (conocidos también por su IDE para Java IntelliJ IDEA y otras como PyCharm y RubyMine) me sorprende siempre por su capacidad de innovación y de resolución de problemas complejos alrededor de la comprensión y análisis de lenguajes de todo tipo.
(gracias a José Romaniello por descubrirme este interesantísimo lenguaje)
Cobra es un lenguaje multi-plataforma y multi-paradigma que combina una cantidad de características sumamente interesantes.
Es obra de Charles Esterbrook, y su autor describe sus principios de diseño de la siguiente manera:
Programación rápida y expresiva
Rápida ejecución
Tipado estático y dinámico
Calidad soportada a nivel del lenguaje
Por supuesto que suena ambicioso y vendedor, pero en principio, es bastante realista. Veamos cómo se soporta cada cosa:
Programación rápida y expresiva
Cobra tiene una sintaxis basada en Python (sobre todo) y Ruby, lo que lo hace mucho más legible que los lenguajes "con llaves y punto y coma". Entre otras cosas, en Cobra los bloques se determinan por indentación, las listas y diccionarios se pueden declarar como literales, hay comandos como print y assert de uso sencillo y poderoso, la manera de iterar y dividir listas es simple, y mucho más.
Un ejemplo rápido de la sintaxis, con la definición de una clase:
class Person
"""
Declaración de una clase. Este comentario documenta la clase misma
"""
var _name as String # Declara variables de instancia (no estáticas)
var _age as int
cue init(name as String, age as int) # Inicializador (constructor)
base.init
_name = name
_age = age
def sayHello # Métodos
# Los corchetes interpolan valores en las strings
print 'Hello. My name is [_name] and I am [_age].'
def divide(i as int, j as int) as int
""" Este comentario documenta este método """
assert j > 0 # Si el divisor
return i / j
Rápida ejecución
Esto es logrado a través del uso de tipos estáticos con inferencia permanente, sin perder las capacidades dinámicas para los casos necesarios.
La implementación actual de Cobra utiliza la Infraestructura Comun de Lenguajes (CLI) de .NET/Mono, por lo que el compilador genera código intermedio (IL) que a su vez es es llevado a código nativo por el motor de ejecución de .NET/Mono como en otros lenguajes.
Tipado estático y dinámico
La mayor parte de la resolución es estática y en tiempo de compilación, mientras que siempre que haga falta puede utilizarse resolución dinámica en tiempo de ejecución, basada en Reflection de .NET y apoyándose en técnicas específicas de optimización.
Veamos un ejemplo sencillo de una misma función declarada estáticamente:
def add(a as decimal, b as decimal) as decimal
return a + b
... o dinámicamente:
def add(a, b) as dynamic
return a + b
En la práctica, no son la misma función, ya que la primera opera solamente con números decimales, y la segunda con cualquier tipo que soporte la operación suma.
Obviamente la primer función es más rápida, ya que se verifica y compila, y no requiere más recursos que los operandos de un largo conocido (decimal), mientras que la segunda, al resolverse dinámicamente, es verificada en tiempo de ejecución y requieres más recursos para la conversión de parámetros, etc.
Por otro lado, contar con ambas variantes es lo ideal, ya que podemos aprovechar el contrato estricto de los tipos estáticos para gran parte de la aplicación, pero con la flexibilidad de los dinámicos para las porciones que son más variables, o para facilitar el prototipado.
Nótese que el soporte a tipos dinámicos de Cobra, comparado con el de C# o VB (a partir de .NET 4), es sintácticamente más sencillo, mucho más integrado a nivel del lenguaje.
Calidad soportada a nivel del lenguaje
Cobra soporta contratos de código (algo proveniente de Eiffel que .NET 4 soporta parcialmente), pruebas unitarias, comentarios para documentación y verificación de valores nulos en tiempo de compilación, todo como parte de su sintaxis.
Veamos como las pruebas unitarias quedan embebidas directamente como parte de un método:
class Utils
shared
def countChars(s as String, c as char) as int
"""
Returns the number of instances of c in s.
"""
test
assert Utils.countChars('', c'x') == 0
assert Utils.countChars('x', c'x') == 1
assert Utils.countChars('X', c'x') == 0 # case sensitive
assert Utils.countChars(' ! ! ', c'!') == 2
body
count = 0
for ch in s
if c == ch
count += 1
return count
Las aserciones, además, pueden usarse en cualquier parte del código, y arrojan una excepción con información útil para depuración si no se cumplen (no son un IF).
Los contratos embebidos en el código permiten especificar pre y post-condiciones a los métodos, garantizando la consistencia antes de entrar y después de retornar el valor final. Por ejemplo:
class Customer
var _contacts as List<of Contact>
get contacts from var
def addContact(contact as Contact)
require # Arroja excepción si algo no se cumple ANTES de entrar
contact not in .contacts
contact.name
contact.customer is nil
ensure # Arroja excepción si algo no se cumple DESPUES de salir
contact.customer == this
.contacts.count = old .contacts.count + 1
body
contact.customer = this
_contacts.add(contact)
Y otra característica muy buena de seguridad es que los parámetros o tipos que pueden recibir nil (llamado como en Smalltalk o LISP), son los que se declaran como tales, agregando al sufijo "?" al tipo, como en:
def bar(s as String?)
if s # Es igual que preguntar "if s is not nil"
print Utils.countChars(s, c'x')
Cobra está escrito en Cobra
Una característica más que quiero remarcar es que este lenguaje está escrito sobre si mismo. Por supuesto hay una parte del compilador escrita para la plataforma nativa (C# en este caso), pero el resto está escrito en Cobra mismo, lo que hace que el lenguaje tenga un nivel de depuración y prueba mayor que otros que se construyen generalmente sobre lenguajes de más bajo nivel. Esto está sucediendo en otros lenguajes a posteriori, como en el caso de PyPy o Rubinius, pero en Cobra fue un principio de diseño.
Personalmente me parece uno de los lenguajes "experimentales" más interesantes y completos que he visto en los últimos tiempos, en parte porque se apoya en una plataforma que ya ofrece muchos servicios, y en parte por algunas de sus características maduras que y las herramientas con que ya cuenta (compilador, ejecutor de pruebas unitarias, generador de documentación, coloreador de sintaxis, etc).
Y también cuenta con soporte parcial en algunas IDEs y editores:
Visual Cobra es un complemento para Visual Studio que reconoce y colorea la sintaxis.
Naja es una IDE completa escrita en Cobra que ademas del coloreo de sintaxis tiene soporte para lista de tareas basada en comentarios, soporte para proyectos y un diseñador de formularios que genera código Cobra.
Y si uno prefiere un editor de texto hay muchos para los cuales hay complementos para soportar la sintaxis, incluyendo gedit, Notepad++, UltraEdit, Vim y TextMate (el que estoy usando yo), y mucho más para elegir según la plataforma que cada uno usa. Y para cualquier otro caso existe un detalle de las palabras clave y modificadores, de manera que en cualquier editor se puede partir del soporte para Python y cambiar estas listas.
Finalmente, dejo este video de la presentación de Esterbrook en el Lang .NET Symposium 2008. Aunque la implementación del lenguaje maduró bastante desde entonces, muchos de los principios siguen igual.
Cada tanto la comunidad Alt.NET se pone de acuerdo para realizar un Open Space en Buenos Aires, como en muchas otras partes del mundo. Ya he cubierto ediciones anteriores en este blog, y ahora me toca informar sobre la organización de una nueva reunión.
Como suele ocurrir, hay mucha gente que está interesada pero aún no se ha acordado la fecha definitiva, aunque hay consenso en hacerla durante el mes de julio. Para votar por la fecha que prefieran los interesados, estamos utilizando este mecanismo:
¡No sean tímidos! Todo el que esté realmente interesado en participar puede elegir qué sábado le queda mejor. Tengan en cuenta que usualmente s desde las 9 de la mañana hasta las 6 de la tarde, con la interrupción del almuerzo que se hace in-situ. Es probable que el lugar sea Microsoft de Argentina, en Bouchard 710, 4to piso, Ciudad de Buenos Aires.
Y como siempre, aprovecho para recordar que además de estas reuniones presenciales que se organizan esporádicamente en distintas ciudades, el grupo Alt.NET Hispano organiza reuniones virtuales en forma semanal (a veces más de una por semana), que se anuncian en la lista de distribución y en el calendario de reuniones del sitio.
Estas reuniones quedan grabadas y pueden verse a demanda una semana o dos después de su ejecución, y el grupo ya lleva (a hoy) 73 reuniones que pueden verse en línea o descargarse desde el histórico de reuniones.
Uno de los principios de diseño del framework .NET, o más específicamente del CLI (Common Language Infrastructure) es, como su nombre lo indica, permitir implementar fácilmente una variedad importante de lenguajes.
El CLI es una pieza estandarizada ante ECMA como un estándar abierto, y es lo que ha permitido la creación de implementaciones abiertas de .NET como Rotor y Mono.
Pero también ha permitido la implementación de muchos lenguages (más allá de Microsoft) que comparten todo el ecosistema de herramientas y bibliotecas disponibles.
Nemerle es uno de estos casos. Desarrollado en la Universidad de Wroclaw, Polonia, se trata de un lenguaje de tipos estáticos, casi un superset de C#, que soporta estilos de programación funcional y orientada a objetos, metaprogramación, lenguajes específicos de dominio y mucho más. Al estar basado en el CLI genéricamente, funciona en .NET y en Mono por igual.
Siendo un superset, es posible compilar (con un par de toques en el archivo .csproj) fuentes C# en Nemerle.
Dos de las características más distintivas de Nemerle son la inferencia de tipos y el uso de macros.
Veamos algunos ejemplos de código, con inferencia de tipos:
def d = Dictionary ();
d.Add ("Code and Beyond", 42);
foreach (s in args) {
...
}
Notese que no hace falta inicializar los tipos del diccionario, que son declarados y chequeados a partir del primer uso.
En el caso de las macros, pueden escribirse cosas como:
ExecuteReaderLoop ("SELECT nombre, apellido FROM personas WHERE nombre = $miNombre", dbcon,
{
System.Console.WriteLine ("Persona: {0} {1}", nombre, apellido)
});
que enmascaran la creación del SqlCommand y el SqlReader, la clásica iteración y la obtención de las strings para los dos campos leídos, pero es importante ver que es mucho más que una función de una biblioteca, ya que en este caso se está interpretando la string conteniendo la sentencia SQL y generando el código chequeado correspondiente.
Nemerle también tiene interpolación de strings más eficiente que en C#, ya que se ejecuta en tiempo de compilación, como en:
$"Me llamo $Nombre y tengo $Edad años."
donde las variables reemplazadas son chequeadas por el compilador, a diferencia de utilizar String.Format, donde se realizan en tiempo de ejecución.
Es muy interesante además la sencillez para definir Macros, que no tienen nada que ver con las de C, y son descendientes directas de las macros de LISP. Veamos este caso que define un bucle hacia atrás:
Actualicé la presentación con algunos cambios en los poquísimos slides y mejoré un poco mi parte de los ejemplos, centrándome más en Code First que es la parte que me interesa más.
Pero no tuve mucha suerte: esta semana entró en erupción el volcán Pehueye en Chile, provocando bastantes problemas allá primero y en Argentina también, sobre todo en Bariloche, pero llegando a provocar demoras o cancelaciones de vuelos en toda la región.
Así que me quedé sin asistir, pero decidí grabar la sesión en video y compartirla. No llegué a tiempo con el procesamiento y la subida del video, me parece, pero espero que mis colegas y amigos de Chaco hayan podido compartir el link con el público de allá. Por mi parte, lo comparto aquí con todos los demás.
En esta oportunidad me reuní a programar con Gabriel Falcone, líder técnico en equipos de desarrollo de una empresa multinacional de origen argentino.
Conozco a Gabriel desde hace unos años, y compartimos el interés por el desarrollo de software y la dinámica de equipos. Gabriel también es ayudante de cátedra en FIUBA, con mi amigo y futura víctima de esta serie, Nico Páez.
En esta ocasión nos sentamos con Gabriel, en el laboratorio del MUG, donde recién terminaba de dictar una clase de su curso de C#, para recorrer algunos ejercicios basados en cosas que implementó recientemente en proyectos reales, utilizando técnicas de Reflection en .NET. En el video recorrimos dos ejercicios, pero en total hay tres que Gabriel tenía a mano, y que incluyo para quienes quieran jugar con ellos:
Recientemente escribía sobre una situación que se generó en la comunidad a raíz de un cambio de política en .NET Reflector de Red Gate, un producto famoso en la comunidad .NET que pasó de ser gratuito a pago.
En ese artículo recorría varias alternativas gratuitas (de código abierto o no) y sobre el final comentaba que JetBrains, la empresa que produce IntelliJ IDEA (mi IDE favorita para Java) y ReSharper (mi plugin favorito para Visual Studio), estaba lanzando dotPeek, un descompilador gratuito, del que aún no había nada para probar.
En los últimos días, el producto ya está en Beta y disponible para probar, y como se anunció, cuando se libere la versión final seguirá siendo gratuita. El último release que lanzaron de hecho, ya funciona en Windows XP e incluso sin Visual Studio instalado.
Según el sitio del producto, aquí están las características principales:
Descompila ensamblados de .NET 1.0 hasta 4.0 a C#
Permite ir rápidamente a un tipo, ensamblado, símbolo o miembros dentro de un tipo
Navega a las declaraciones de símbolos, implementaciones, símbolos base y derivados, etc.
Permite buscar con precisión el uso de símbolos determinados, presentando todos los resultados
Muestra cadenas de herencia
Soporta descargar código de los servidores originales
Con este post comienzo una serie de entrevistas que tenía en mente desde el comienzo de este blog el año pasado, pero a la que no le encontraba el formato definitivo, hasta hace poco.
En realidad, me di cuenta que no quería hacer entrevistas convencionales, y me parece que lo mejor para nosotros desarrolladores es ver a otros en la práctica, así que estoy comenzando a grabar sesiones de programación de a pares.
La idea es aprovechar la excusa para darme el gusto de programar con amigos y conocidos de la industria regional. Algunos, como este primer caso con Carlos, serán sentados a la misma mesa, y algunos serán remotos, a distancias diversas según la ocasión. Como es tradición de este blog, tengo en mi backlog sentarme a programar en diferentes lenguajes, tecnologías, y en algunos casos tal vez no sea código sino diagramas en un pizarrón, o alguna charla más tradicional, pero siempre que pueda, será a código limpio. Para iniciar la serie entonces, recurrí a varios amigos, y la primer víctima fue Carlos Peix. Nos conocemos desde hace más años de los que puedo recordar, a través de la comunidad Microsoft. Carlos es un desarrollador independiente con muchos años de experiencia y una actitud abierta a nuevas ideas, pero que no se deslumbra fácilmente con las nuevas modas y prefiere centrar su atención en las técnicas de diseño e implementación más perdurables. Es reconocido sobre todo como especialista en desarrollo web y el mundo .NET, pero siempre está mirando y practicando un poco de Java, Ruby o Smalltalk.
Carlos también participa activamente en la comunidad Agiles.org localmente y en la organización de Agiles 2011. Tiene un blog con varios videos muy interesantes que graba por iniciativa propia y al participar en otras comunidades, como Alt.Net Hispano, donde es presentador habitual.
En el video que grabamos (unos 20 minutos en total), Carlos trajo un ejemplo extraído de un caso real que le tocó, sencillo pero ya algo avanzado y con unas pruebas unitarias, y entre ambos hicimos una sesión de refactorización. El ejemplo es en C#, y usamos Visual Studio 2010 con ReSharper. Para quienes quieran ver el código con más detenimiento, dejo la solución al inicio del ejercicio, y la solución al final.