MonoHotDraw

Por estos dias estoy programando MonoHotDraw, que es el séptimo intento por hacer una librería de diagramación para MonoUML. Se llama MonoHotDraw porque está basado en el diseño de HotDraw y JHotDraw. MonoHotDraw está escrito en C# con Mono y usa varias herramientas de GnomeGtkCairoPango, etc.

Aquí hay un video de una aplicación que estoy escribiendo para una tarea de universidad que usa MonoHotDraw. Es un sencillo editor de mapas mentales. Se supone que debo entregarlo el 18 de diciembre. Tengo que apurarme y convertirlo en algo decente.

Por cierto, YouTube no me reconoció el video correctamente. Termina instantaneamente. Google Video si lo reconoció, aunque la resolución está fea. ¿Alguien sabe como convertir videos ogg theora en avi xvid o algo compatible con YouTube?

Actualización.

Olvidé decir que MonoHotDraw se encuentra disponible en el repositorio Subversion de MonoUML. La licencia de MonoHotDraw es LGPL, aunque tal vez la cambie a MIT X11. ¿Qué opinan ustedes?

Error en Mono

Hoy, mientras trabajaba en MonoCanvas, estaba husmeando en el código de Mono, cuando por casualidad me di cuenta de un error que, al parecer, nadie había notado. El operador de inequidad (!=) entre dos objetos del tipo System.Drawing.RectangleF estaba implementado de esta forma:

public static bool operator != (RectangleF r1, RectangleF r2)
{
	return (r1.X != r2.X) && (r1.Y != r2.Y) &&
        (r1.Width != r2.Width) && (r1.Height != r2.Height);
}

Obviamente, la implementación correcta debería ser:

public static bool operator != (RectangleF r1, RectangleF r2)
{
	return (r1.X != r2.X) || (r1.Y != r2.Y) ||
        (r1.Width != r2.Width) || (r1.Height != r2.Height);
}

Aproveché que estaba trabajando con la versión SVN e inmediatamente hice un parche y lo mandé.

Es increible como, pese a la gran cantidad de pruebas unitarias que tiene Mono, se haya colado un bug de este tipo. Me he dado cuenta de que en el código trivial, como el de este ejemplo, es más fácil dejar pasar bugs. Esto caso me recuerda mucho al caso del error en la búsqueda binaria en Programming Pearls.

Curiosamente el error lo encontré mientras miraba el código, pero ¿qué hubiera pasado si estuviera escribiendo una aplicación que usara ese operador? Creo que hubiera pasado un largo rato partiendome la cabeza antes de siquiera sospechar que es el operador el que tiene un bug. La moraleja de la historia es no subestimar las tareas triviales a la hora de programar.