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 😛

Oregano «Plotting Is Not Easy» 0.50.0 Liberado!!

Y si, alguna vez tenía que pasar :-). Luego de un largo período de idas y vuelvas, ya está la última versión de Oregano lista para bajar.

Lo nuevo en pocas palabras :

  • Nueva ventana de ploteo.
  • Nuevo ventana para editar las propiedades de los componentes.
  • Mejoras en las operaciones de rotar y espejar (No andan al 100%, pero peor es no tenerlas).
  • Build System migrado a Scons

El ChangeLog completo estará en los archivos para descargar el fin de semana. Por ahora pueden obtener un smapshot fresquito desde el repositorio darcs :

#> darcs get --partial http://www.gazer.com.ar/repos/oregano-stable/ (readme)

Para compilar :

#> scons [PREFIX=path/to/prefix] [DESTDIR=path]

Para instalar :

#> scons [PREFIX=path/to/prefix] [DESTDIR=path] install

Enjoy It! 🙂

GPlot

GPlot es un nuevo widget para dibujar funciones que estoy haciendo para Oregano. ¿Pero cómo, no había hecho ya GtkCairoPlot?, pues sí, pero fue un buen ejemplo de intento frustrado 🙂

Este nuevo widget funciona lejos, mucho mejor que el anterior. Soporta zoom in, zoom out, paneo y algunas otras cosas que todavía estoy empezando a implementar.

Mi primer test-case completo :

GPlot

Todavía queda bastante por ajustar y pulir. Por ahora solo soporta dibujar líneas, ya que es lo que más me interesa por ahora.

Pueden probarlo bajando el código del repo acá. Necesitarán Gtk+ 2.8 o superior.

UPDATE: Hice un lindo demo con svn2sw mostrando el zoom y el panning del gráfico. Son unos 3Mb y lo puden ver en http://www.gazer.com.ar/wp-content/gplot.html

Plot window otra vez

Ya parece un tema recurrente en mi intento diario por hacer una ventana de ploteo que me guste. Este vez me cansé de mi intento frustrado de plot widget y me puse a buscar algo que ande de verdad 🙂

Lo que mejor se adapta a lo que necesitamos y que encontré fue GtkDataBox , aunque hay algunas cosas que todavía no me cierran del todo.

Vieja ventana de ploteo Nueva ventana de ploteo

El widget nuevo se nota que funciona mejor. El zoom anda bien, la velocidad de dibujo mejora y cuando el volumen de funciones es alto (más de 10 funciones) es notable la diferencia.

En fin, será cuestión de seguir trabajando y ver si algunas de las cosas que no he sabido hacer salen a la luz. Por si alguien quiere probar que onda, dejo el parche en el post. Solo he probado la versión 0.4.0 de GtkDataBox.

Espejando Componentes.

Mini
Este fin de semana estuve avanzando en reescribir el viejo y querido código de flipping en Oregano, tarea para nada trivial, donde he logrado grandes avances como se muestra en la imagen de ejemplo.

El principal problema son las etiquetas, que no deben rotar, sino que lo que rota es su posición. Ahora, una vez rotada la posición, hay que actualizar el anclaje del texto para que se vea bien.

Cómo es esto?, cuando uno pone un texto en una posición (x,y) por defecto esa posición indica el borde inferior izquierdo de la caja que contiene al texto. Al hacer un espejado horizontal, debemos cambiar el anclado para que la posición represente el borde inferior derecho de modo que el texto salga para el otro lado y no se superponga con el componente. Lo mismo aplica para el espejado vertical.

Anchor ExampleLos diferentes anclajes de un texto

Pero tenemos otro problema :-), la rotación también afecta el anclado, por lo que el resultado debe calcularse en base a los dos parámetros simultáneamente, cosa que no es trivial, pero que espero terminar en unos días.

Todo esto por ahora mejora el rotado y espejado de un componente individual. Por algún motivo no funciona bien cuando se aplica a una selección, pero es un problema que veré de solucionar más adelante.

Si todo sale bien, el fin de semana tendríamos cerrado un bug de más de una año de edad 🙂

GnomeLove – Performance Love Day


La gente de Gnome Love hace este domingo el Performance Love Day donde cualquiera que está pensando en empezar a colaborar con Gnome se acerque y ayude a hacer el desktop más veloz y liviano.

Hay varias tareas simples para novatos preparadas. La idea es reportar y arreglar bugs, detectar cuellos de botellas y ese tipo de cosas.

La cita es este domingo 30 de octubre de 14:00 UTC to 03:00 UTC en el canal #gnome-love en GimpNet.

Más info acá

Cairo 1.0.0 ve la luz

Hace unos momentos he descubierto que Cairo 1.0.0 fue liberado ayer.

Ya el lunes había probado la versión 0.9.0 que apareció en Ubuntu pero no pensé que llegara tan rápido el primer main release. Si bien es un paso importante, hay backends que siguen siendo inestables (como el de PDF y glitz) y se irán estabilizando en las próximas releases. Esto no detuvo a la gente de Gtk+ en delegar el dibujado de los widgets en esta fantástica biblioteca.

Ya hay un bug encontrado al utilizar gEdit y todo 🙂

Oregano 0.40.5 liberado !!

Hace solo un ratito terminé de armar los tarballs de la nueva versión y ya están en línea la página del proyecto. La mayoría de los cambios no son visibles, pero he aquí un pequeño resumen :

  • Ploteo de Funciones : además plotear las tensiones en los nodos del circuito, como ya había dicho antes, ahora se pueden hacer operaciones sobre 2 nodos, como por ejemplo sacar la diferencia o la división (este último importante para graficar la transferencia entre dos nodos).
  • FileManager : a partir de esta versión va a ser posible agregar otros formatos de archivo para grabar o cargar esquemáticos de una manera fácil y transparente. Claro que primero alguien tendría que escribir los módulos para ello :-). Si alguien tiene información sobre algún formato útil para empezar a agregar, avise.
  • Reporte de errores : haciendo el punto anterior noté que si por ejemplo queríamos abrir un archivo que no sea de Oregano, el usuario nunca era notificado, por lo que agregué todo lo necesario y ahora nos aparecen unos lindos cartelitos de error 🙂
  • Por úlrimo varios bugs y mejoras sobre el engine de ploteo, no es perfecto, pero funciona mejor.

Por favor a todos los interesados bajen y prueben esta versión! (que tengo que cursas Análisis de Circuitos y hacer mi TP :-D).

Más sobre funciones en Oregano

Ya en el post pasado había comentado el nuevo feature de poder agregar funciones. Lo primero que surgió como necesidad fue modificar la forma en como se muestran las cosas en la lista de la izquierda de la ventana de ploteo, para poder separar aquellas que eran nodos, de las funciones. Todo esto para tener más comodidad a la hora de querer seleccionar las cosas.

El primer intento fue bastante desastroso visualmente, aunque funcionaba. Lo que realmente quería mostrar era lo siguiente :

Concepto

Lo cual no fue nada fácil encontrar como realizar. La solución llegó en #gnome-hackers de FreeNode, donde federico me dio el hack necesario para hacerlo, quedando finalmente así :

Concepto

No le presten mucha atención a los colores, pues es otro hack a medio hacer y que todavía no me convence :-), pero la idea es también mostrar de que color se está dibujando cada curva para poder identificarlas fácilmente.

No es exactamente la idea original, pero está cerca. Más adelante veré si es posible mejorar la disposición de las celdas para que queden como a mi me gusta 🙂

La principal ventaja de este nuevo método es que para elegir que curvas dibujar no se depende de una «selección en la lista» lo cual hace mucho menos traumática la tarea, ya que antes accidentalmente era muy fácil romper la selección y tener que comenzar desde 0.

Update
Finalmente he logrado hacer exactamente lo que quería 🙂 … hoy descubrí gtk_tree_view_column_pack_start, el resto fue cuestión de minutos.

Concepto