17 octubre 2011

Microwiki

El feriado lluvioso de la semana pasada, lo dedique a un pequeño proyecto que tenia en mente hace tiempo: hacer una pequeña wiki.

¿Para que sirve? Sirve para tener un wiki sin necesidad de un servidor externo, guardando los archivos en forma de texto plano. La ventaja es que la documentación del proyecto se mantiene en una carpeta junto con el código, en una forma fácil de editar y buscar. El formato que usa es Markdown, que es lo suficientemente amigable y legible para mantener los archivos de texto sin necesidad del wiki.

Pueden encontrar el código en GitHub: https://github.com/dfernandez79/microwiki

Todavía esta en desarrollo, pero la funcionalidad básica de ver y editar esta disponible. Hay muchas cosas por hacer que voy a ir agregando cuando tenga tiempo, al menos la siguientes características van a estar terminadas para el "release 1.0":
  • Búsqueda de texto rápida (quizás usando Lucene). Mi objetivo es que browsear y buscar sea rápido, de lo contrario no le veo mucha ventaja sobre utilizar archivos Word u HTML :)
  • Paquete binario fácil de usar, la idea es que el típico caso de uso sea hacer checkout de los archivos fuentes e iniciar el wiki (ya sea por un comando o un icono) con cero configuración (por default voy a hacer que tome el subdirectorio docs del directorio actual).
  • Modo solo lectura (lo veo útil para integrar con Hudson u algún otro servidor de CI)
Otras cosas que me gustaría agregar a futuro son:
  • Soporte para LaTeX probablemente usando http://www.mathjax.org/.
  • Soporte para renderizar grafos de GraphViz directamente (la idea seria que los links a gráficos usando la notación ![Alt text](file.dot) de Markdown se muestren directamente como PNG).
Si tienen interés en chusmear el código fuente, las herramientas que use son:

12 octubre 2011

Un brevísimo vistazo a Dart

El lunes pasado - 10/10/2011- Google presentó un nuevo lenguaje de programación llamado Dart.

La presentación realizada por Gilad Bracha y Lars Bak había sido anunciada hace unos meses atrás.

Dado que estos dos personajes hicieron cosas interesantes y tienen un pasado común en Smalltalk, el anuncio me genero mucha expectativa.

Después de leer un poco el sitio (por ahora solo el código fuente esta disponible para el publico general), mis expectativas decayeron: al menos en la superficie Dart no es muy distinto a lo que vienen produciendo otros lenguajes como Scala o Groovy.

Debido al trabajo de Gilad Bracha en Newspeak, y a que JavaScript es un lenguaje basado en prototipos, yo esperaba un lenguaje estilo Newspeak pero con sintaxis ala JavaScript. (En este video G. Bracha habla justamente que Dart es un lenguaje más "conservador" en comparación con Newspeak)

Tampoco voy a ser tan negativo, el gran punto a favor que tiene Dart es que si Google decide promocionarlo puede hacerlo a través the Chrome y Android. Y si logra que Mozilla lo adopte puede lograr algo similar a lo que ocurrió con HTML5: que IE tambien lo adopte como standard.

Lo más interesante es que si las herramientas que provee el lenguaje son las adecuadas e incursionan en herramientas del lado servidor, pueden lograr un lenguaje de programación ubicuo. Hoy en día JavaScript con node.js lo es, aunque las limitaciones del lenguaje respecto del manejo de módulos y la disponibilidad de herramientas no lo hacen para mi una opción fuerte del lado servidor.

Según lo que pude leer del material disponible, Dart es todavía un "work in-progress", y no se definieron ciertas cosas importantes sobre como va a ser el manejo de modularidad. En resumen algunas características de este lenguaje son:
  • Se va a poder utilizar en el browser, directamente si es Chrome (al menos en el futuro), o compilando JavaScript si no (como CoffeScript).
  • Es un lenguaje con clasificación con tipado opcional (como Strongtalk o Groovy).
  • Al igual que en muchos lenguajes dinámicos, se pueden re-definir operadores y tiene algo de syntax sugar como strings con variables del estilo "Hola $mundo"
  • Tiene generics y están reificados (los generics pueden ser opcionales como en Java y la información se mantiene "en runtime" como en C#).
Hasta ahora nada mal pero tampoco demasiado novedoso, lo que si destaco es:
  • Tiene un modelo de actores (como Erlang), llamado Isolates. Me parece una forma buena de encarar concurrencia.
  • Un programa compilado se puede guardar en un "snapshot" que es como una imagen de Smalltalk (de hecho esta idea viene de Strongtalk, donde creo tambien se llama snapshot). Eso es interesante por que si logran agregar el soporte adecuado en los browers, quizás logren hacer lo que Java no pudo lograr: un lenguaje con bytecode multiplataforma que funcione directamente en todos los browsers.

Lo que no me gusto de lo que leí hasta ahora es:
  • No vi absolutamente nada relacionado al manejo de "módulos" (de hecho ni siquiera existe el concepto de namespace o paquete), eso puede ser bueno: Gilad Bracha escribió artículos muy interesantes sobre este tema en su blog, asi que puede significar que todavía están evaluando la mejor forma de hacerlo. O bien puede ser malo, en los ejemplos vi unos #import  que funcionan como un include C que huelen muy mal.
  • Factories e interfaces. No sé si poner esto entre las cosas buenas o malas. Se me ocurren varios casos donde puede ser bueno: refactoring de una clase concreta a una interfaz, usos de implementaciones comunes por default (ej. en Java: HashSet o ArrayList). Sin embargo tienen un lado malo: funciona como un mecanismo rudimentario para manejo de dependencias estilo "service locator", algo que en Java demostró ser muy problemático.
  • Uso de underscore para indicar que algo es privado (Lang Spec sección 3.2). Es un shortcut aceptable para las variables de instancia, pero para los métodos me parece demasiado que quienes lo invocan sepan si lo que usan es privado o publico.
  • Las librerías "core" son una copia de las de Java, hubiese estado bueno que cambien algunas cosas como por ejemplo tener listas mutables e inmutables (ala Scala).
  • No vi que los generics se puedan acotar, por ejemplo HashSet<E> no es un HashSet<E extends Hashable> (Object en Dart no implementa hashCode, hay una interfaz Hashable).
En fin veremos que depara el futuro, es difícil hacer predicciones en estas cosas, pero creo que no es necesario que el lenguaje sea bueno para que tenga éxito si no que la plataforma lo sea. Si Google decide usar Dart para hacer aplicaciones Android nativas, y programar en el web browser, entonces puede que se convierta en el sucesor de Java. Sin embargo no creo que eso pase, desde afuera parece que la estrategia de Google es apostar a muchas cosas para ver que queda.