emerge -av life

Ha pasado un buen rato, y la verdad que no ha pasado mucho en mi vida. Estoy bastante ocupado con boludeces de la facultad (trabajos, entregas, parciales, etc) y principalmente con mi tesis que dio un giro que no me esperaba :), se recorto por todos lados lo que yo tenía pensado hacer (o más bien lo que yo había entendido que tenía que hacer :D).

Resumido en un párrafo de un mail en la charla con uno de mis directores de Tesis :

Tal vez para resumir mi idea sobre el proyecto, lo que estarías haciendo es un «reificador de mensajes entre objetos», configurable de forma que la reificación pueda encenderse y apagarse de forma dinámica por motivos de performance. Casi la palabra aspecto se puede suprimir 😀

En fin, parece tan simple, que complica. Para empezar estoy analizando diferentes weavers y como realizan su trabajo, para poder comprender los cambios que se necesitan en la VM.

Les dejo acá buen paper sobre el weaving en AspectJ.

En otro aspecto de la vida, mi hermana juró por su título hace un par de semanas, y ahora oficialmente soy el único miembro no-titulado de mi familia :), lo que suma una presión extra a completar mi carrera de grado. Tengo una foto que predice el futuro, donde estoy posando muy sonriente con el título de mi hermana (total enrollados todos son iguales!!), pero voy a tener que esperar a viajar a Cipolletti para obtener una copia :).

O.L.E. screencast!

Para aquellos curiosos hice un pequeño screencast de editor de componentes. Lo nuevo respecto de mi último post es la habilidad de modificar los puntos de control de los elementos y darles nuevas y alocadas formas :).

Por razones de sueño, no pude completar los puntos de control de lo elipces, por lo que no lo muestro en el video.

El screencast lo hice, como siempre, con vnc2swf y está acá y pesa casi 3Mb.

Oregano Library Editor!

Así como lo leen, ya estoy trabajando en un editor para las bibliotecas de componentes de Oregano. En principio para poder cambiar algunas que no me gustan mucho o que tienen detalles, después veré si la aplicación queda lo suficientemente linda como para hacerla crecer :-).

OreganoLibraryEditor.pngLuego de una frustrada búsqueda de algún Canvas (no iba a repetir los errores del pasado y usar GnomeCanvas :-)) decidí hacer uno minimalista, que soporte las operaciones básicas que requiero : Agregar cosas, moverlas y rotarlas. Salvo esta última, las demás están andando, con soporte Group y UnGroup

Y si, como ya se pueden imaginar la aplicación está escrita en C#, con Gtk# y Cairo#. Como el buildsystem depende enteramente de Monodevelop, no creo que libere código alguno por el momento.
En la captura se puede ver el diseño de un componente místico, conocido como Futirifoken 😀

UPDATE: Unos toque mágicos con el Stetic, un poco de magia de System.Xml.Serialization y un par de hacks para sacar la cosa más rápido y …

OreganoLibraryEditorWorking.png

Scary Code

Preparándome para mi charla sobre Mono en la CTT de junio organizada por el Cafelug, me puse a jugar con un ejemplo para mostrar que, efectivamente, anda eso de mezclar lenguajes en .NET.

Antes de seguir leyendo, si sufrís de nauceas, estás embarazado/a, o simplemente este tipo de cosas te impresionan, no sigas leyendo 🙂

Todo comienza con la definición de nuestra clase en C# :

using System;
public class ClaseCS {
    private int x;
    public int X {
        get { return x; }
        set { x = value; }
    }
    public ClaseCS (int x) {
        X = x;
    }
    public override string ToString () {
        return String.Format ("Soy ClaseCS hecha en C# {0}", x);
    }
}

No es una clase que haga mucho (el property está bien al cuete). Lo importante acá es el método ToString que luego utilizaremos desde IronPython.

Para compilar solo debemos ejecutar : #> mcs -target:library -out:clasecs.dll ClaseCS.cs.

La parte que asusta es ahora ejecutar la consola de IronPython, sobre todo por el notice de copyright que trae la última versión :-). Voy a mostrar todo de una y después explicar que es cada cosita.

IronPython 1.0.60523 (Beta) on .NET 2.0.50727.42  
Copyright (c) Microsoft Corporation. All rights reserved.  
>>> import clr  
>>> clr.AddReferenceToFile("clasecs.dll")  
>>> import ClaseCS   
>>> c = ClaseCS(1)  
>>> print c 
Soy ClaseCS hecha en C# 1

Trivial, no 🙂 ?. Básicamente lo que hago es importar un módulo especial de IronPython que se encarga de manejar las referencias a los assemblies .Net del sistema. Si hacemos cosas como «import System» el CLR se encargaría transparentemente. En mi caso, al cargar algo especifico lo debo hacer explicitamente (y no es mayor problema, porque el Zend de Python dice «mejor explícito que implícito» :-D) .

El método AddReferenceToFile agrega una referencia al DLL que habíamos generado antes, para que la máquina virtual la conozca. Luego importamos el módulo, y como no tenemos namespace declarado, podemos instanciar directamente ClaseCS ().

Por último llamamos a «print c» que lo que hace en llamar a c.__str__ para obtener la representación en forma de texto de la instancia. Internamente IronPython traduce a una llamada ToString del código intermedio que está mapeada con nuestro ToString de C#, dando como resultado que se imprima el texto que habíamos definido en nuestra clase de C#.

No es algo que recomiende hacer en sus casas, pero es algo relindo y loco para impresionar en una charla 😛

Ubuntu Update

Luego de varios días con los repositorios rotos, Ubuntu Breeze (como se llama la nueva versión de desarrollo) volvió a la vida. La novedad con la que me encontré es que han creado paquetes para Mono 1.1.X y Gtk# 1.9.x, con lo que ahora puedo probar todo eso que no podía antes, por no querer compilar Mono desde los fuentes, o sea : Beagle e iFolder.

También compilé Mono UML, una herramienta CASE para generar diagramas UML y luego código (C# por ahora si mal no recuerdo), entre otras cosas. Si bien está un poco verde, los diagramas son 1000 veces más lindos que los que hace Dia. Pueden ver como compilarlo en este enlace.

Mono UML

Sin duda Ubuntu crece y crece para el lado correcto cada día ….

Pero, para tener un poco de variedad, no le pierdan la vista a Foresight Linux, una distro que quiere pisar fuerte. Seguramente haré uno de mis famosos review’s cuando termines los actuales 🙂

Ubuntu@Work

Ayer y hoy estuve sin PC en el trabajo por culpa del micro que se quemó. Cuando tuve micro nuevo, tuve que cambiar el mother porque no lo soportaba, y con el nuevo mother algo falló y me quedé sin disco (solo lógicamente). Por lo que al tener que reinstalar, aproveché y migré a Ubuntu Linux.

La tarea fue muy dificil, no por la distro, sino porque luego de 4 horas de tratar de instalarlo (pasando por pruebas con Knoppix 2.4 y 3.6, y cambio de memoria), descubrí que el mother nuevo tiene problemas con el IDE0 y por eso fallaba. En fin, ya tengo cambie el que no andaba y terminó de instalar mi PC para poder retornar a mis tareas diarias.

GPuzzle

Leyendo este artículo de OsNews.com, me encontré con que nombraron a GPuzzle entre los programas desarrollados con Mono «menos conocidos» :-), claro, seguramente la editora tomó una lista de GnomeFiles.org y no ha tenido tiempo de probarlos todos :-P, porque GPuzzle apesta 🙂 (y lo dice quién lo programó). Una excusa para mejorarlo 😛

Ponele un TrayIcon a tu aplicación

Es realmente muy simple hacer que nuestra aplicación use el área de notificación de Gnome utilizando Mono y C#, gracias a que Todd Bermann hace ya unas semanas escribió el módulo Egg TrayIcon enteramente en C#, liberándonos de la tortura del código en C 🙂 … realmente se implementa en unos pocos minútos, veamos.

1) Primero bajamos el archivo TrayIcon.cs que Todd Bermann ha hecho.
2) Escribimos nuestra applicación de prueba, contará hacia adelante (hasta el overflow del int) :

// Namespaces que vamos a utilizar
using System;
using Gtk;
using Gnome;
using Egg; // Este namespace está definido en el archivo TrayIcon.cs

// Nuestra clase de ejemplo
class TrayTest {
  static int count = 0;
  static Label label;

  public static void Main(string[] args) 
  {
    EventBox eb;
    TrayIcon trayIcon;
    // Creamos un programa
    Program test = new Program ("Test", "0.0.1", Modules.UI, args);

    // Creamos la etiqueta
    label = new Label ("Hola Mundo");

    // No realmente necesario para este ejemplo, pero si deseamos agregar
    // menú contextual o tooltip es necesario
    eb = new EventBox ();
    eb.Add (label);

    // Creamos el tooltip
    trayIcon = new TrayIcon ("Test");
    trayIcon.Add (eb);
    trayIcon.ShowAll ();

    // Iniciamos el texto
    Count ();

    // Refresco cada 1 segundo
    GLib.Timeout.Add (1000, new GLib.TimeoutHandler (Count));

    // Done!, Corriendo!!!
    test.Run ();
  }

  public static bool Count ()
  {
    label.Text = String.Format ("Voy contando {0} veces ...", count);
    count++;
    return true;
  }
}

3) Compilamos nuestra aplicación :

 $ mcs -target:exe -out:TrayTest.exe -pkg:gtk-sharp -pkg:gnome-sharp *.cs
 Compilation succeeded

4) La ejecutamos :

 $ mono ./TrayIcon.exe    (en Debian con "./TrayIcon.exe" alcanza, no se si otras distros usan binfmt por defecto)

Si no tenemos área de notificación en nuestro panel de Gnome, lo agregamos antes para ver el resultado, y veríamos algo como :

Ejemplo de TrayIcon

Como se darán cuenta, muy simple y rápido …. Espero que lo disfruten!

GPuzzle

GPuzzle es un simple programa realizado en Mono y GTK# de un viejo juego que tenía cuando era chico. El objetivo es ordenar la secuencia de números que se nos presentan, como se ven en las imágenes de ejemplo.

El otro día se me ocurrió hacerlo cuando leí que Sam Loyd había comercializado un juego llamado The Fifteen Puzzle, cuyo desafío era ordenar la secuencia de números, comenzando solamente con el 14 y 15 invertidos. Claro, que años más tarde un matemático demostró que ese juego no tiene solución :-), utilizando una técnica que mide el «nivel de desorden», con lo que se deduce que para que tenga solución debe tener un nivel par, y el juego de Lloyds tenía nivel de desorden 1 :-), el premio que ofrecía estaba bien a salvo.

Juego Terminado Formación Inicial

Como verán, Debian Sid está un poquito rota y las cosas se ven medio mal, pero no le presten importancia :-), lo mismo a mis feos recortes de imágenes apurados 😉

Bien, aún no está terminado, pero ya funciona y se puede jugar. Para descargarlo pueden utilizar mi repositorio Darcs bajando el repositorio GPuzzle.

Parche para MCatalog

MCatalog es un catálogos de libros y películas escrito en Mono+GTK# que promete cosas muy lindas. Puede manejar préstamos de nuestras cosas y lo más lindo es que busca en Amazon toda la info del libro/película (incluida una fotito).

Pero bueno, como mi ISP me obliga a usar proxy http, tuve que empezar a leer un poco del System.Net de la plataforma .NET para ver como diablos se le agrega un proxy a las conexiones HTTP.

El primer intento fue exitoso, pero solo era local para el System.Web.Services.Protocols.SoapHttpClientProtocol, que tiene una propiedad que es proxy donde le asignamos una instancia de WebProxy y sale todo andando bonito. El problema es que el resto de las consultas las hace con WebClient, que dentro usa WebHttpRequest. Este último soporta proxy, pero como esta oculto dentro del WebClient no tenia acceso a él.

Luego de un rato de googlear y leer la documentación de MSDN encontré System.Net.GlobalProxySelection !, la magia estaba hecha .. Tiene una propiedad que se llama Select donde asignamos una instancia de WebProxy , y todas nuestras HttpRequest utilizarán proxy cool.

Luego de fixear un par de cosas más, como ser sacar la configuración desde el Gnome Proxy Settings, el parche vino a mí y lo envié a los desarrolladores. Solo falta ver si lo aceptan mrgreen.

El parche fue realizado sobre la versión 0.0.4.