Oregano migra a GtkPrint!

Si señores, ya era hora de tener un motor de impresión como la gente :-). Luego de varias consultas por parte de mis beta-testers me decidí migrar el soporte de impresión a la nueva API de impresión de Gtk+.

La migración fue simple, por lo menos para dar un soporte básico. Lo primero que hice fue borrar print.[h|c] que tenían el código de soporte de GnomePrint. Luego portá las funciones de modelo a Cairo (en lugar de usar las viejas API de Art) y por último le agregué el código para que se abra el diálogo de impresión.

oreganoprint.png

No se ilusionen mucho que faltan bastantes cosas por hacer antes de que tenga alguna utilidad :-). Una ventaja de esta migración es que ya tengo el código en el modelo para poder exportar el esquemático a un PNG, PDF, PS, SVG o cualquier otro backend que soporte Cairo, cosa que creo que varios van a agradecer :-).

Por ahora no voy a subir los cambios al repositorio principal, ya que esto me obliga a depender de Gtk+ 2.10, recién salida del horno, por lo que voy a mantener un branch privado hasta completar el código.

Mi pequeño TODO :

  • Agregar Labels de los componentes y textos.
  • Impresión Color y B&W (Qué colores te gustarían???!!)
  • Rótulo y orientación default de la página. (El tamaño es configurable y el circuito se adapta a la página)
  • Si ves algo que debería soportar, y no está en esta lista, dejó un comentario 🙂

UPDATE:

Ya tengo funcionando el diálogo y la código para exportar el esquemático. Actualmente hay soporte (dependiendo si la versión de Cairo instalada lo soporta) para PDF, PS, PNG y SVG (el Inkscape no lo abre bien, pero otros programas si). El ónico que anda realmente bien es el de PNG, el resto tiene varios problemas que sospecho que son de Cairo (ya sean bugs o que me está faltando llamar alguna función).

Models y SubCkt

Una cosa que le venía faltando a Oregano era la posibilidad de utilizar modelos complejos para la simulación, y que por suerte ya quedó en el pasado ;).

Hoy luego de mucho leer sobre Spice, NgSpice y GnuCap logré entender un poco como se usan los modelos (a través del comando .model) y los subcircuitos (a través del comando .subckt). Esto sumado a la magia del .include hacen posible, por ejemplo, utilizar un componente «Diode Bridge» en lugar de tener que poner cuatro diodos :-).

La historia empieza modificando el componente «Diode Bridge» de la biblioteca default para que en lugar de usar el template que no andaba utilice : X_@refdes %1 %2 %3 %4 @model, siendo Mode = DiodeBridge. El X_ le dice al backend que es una llamada a un subcircuito y @refdes es completado con el nombre elegido.

El siguiente paso es crear un archivo DiodeBridge.model en el directorio data/models que contenga la descripción del circuito. El resto de la mágia está ya en el código de generación de la netlist.

El objetivo ahora es tratar de extender más aún este nuevo feature y para eso voy a empezar con los ejemplos que encontró acá. Un punto importante y que yo realmente desconozco, es qué componentes son sumamente necesarios y deberían funcionar out-of-the-box. Si fuera por mí con resistencias ideales me sobra :P, por lo que escucho ofertas!.
El screenshot obligado (perdón, la ventana de plot ocupa mucho lugar y me tapa el fondo :-))

oreganomodels.png

Life

Facultad

Hoy empezaron las clases, y a diferencia de otros cuatrimestres tengo ganas de cursar :-). Tendré algo que ver que me anote en materias copadas?, seguramente ;-).

Estoy haciendo principalmente Teoría de Algorirmos II y Teoría del Lenguaje, y planeo aprovechar que curso con mi directora de Tesis para ponerle pilas.

Evince

Ya hace tiempo vengo aportando algún que otro parche a Evince, el visor de documentos de GNOME. Desde que comencía cerrar bugs de GNOME Love, había uno que me tenía atraido, y es el de agregarEvince New soporte para los comandos DVI Specials al backend de DVI. No es una tarea fácil, ya que me costó encontrar documentación sobre los comandos, y entender el código que se encarga de leer el archivo DVI.

Este fin de semana finalmente mande la primer versión del parche, a la que ya le contré por lo menos dos bugs :-), y eso que solo agregaba soporte para el color del texto :-D.

Anoche en un ataque de furia arregle los problemas anteriores y sume soporte para el comando background para ver el color de fondo de las páginas. Todavía tengo que arreglar un par de problemas pero ya casi está listo.

Evince OldLuego de eso quedan dos retos interesantes. El primero es el soporte de HyperText, que ya estuve jugando en mi primer intento de arreglar este bug y tengo idea de como hacerlo. Me falta resolver un problema de coordenadas y nada más. El componente más dificil va a ser mostrar las imágenes, ya que no siempre están presentes y pueden estar en diversos formatos. Veremos si logro hacerlo antes de aburrirme :-).

Human Computation

Siguiendo una discución en el bugzilla de GNOME fui a parar a un video (Flash, 1 hora aprox de duración) de conferencia sobre Human Computation que está realmente interesante.

La charla empieza hablando de los Captchas y de cómo los spammers usan las páginas de p0rn para que sus visitantes les revelen los textos escondidos, y no tener que gastar tiempo de CPU para realizar esta ardua tarea.

Lo que sigue es una explicación de que es Human Computation, y cómo atraer a los usuarios a que sean sus computadores, utilizando los Juegos. El primero es realmente sorprendente, y por cierto un juego muy adictivo :).

Se trada de ESPGame. En este juego, uno hace equipo con una persona al azar y con la cual no es posible comunicarse, ni saber nada de él. El juego nos presenta una imágen y nosotros debemos escribir una palabra de algo relacionado con ella misma, miestras que nuestro compañero de equipo realiza la misma tarea. Si ambos en algún momento escribimos la misma palabra, sumamos puntos y pasamos a la siguiente imagen.

La idea detrás de todo esto es mejorar la accecibilidad de la web. Como se explica en la charla, el mayor problema es que los sitios webs no acostumbran a asignar descripciones a las fotos, por lo que, salvo por su nombre, no se puede determinar su contenido. Usando algunos algoritmos de probabilidades y «a prueba de trampas» sacan información útil del juego para taggear las fotos, y así poder utilizarlas en búsquedas dando resultados más exactos. Según dicen en el video, se podrían taggear todas las fotos e imágenes que hay en Google Image Search, en unos dos meses 🙂

El segundo juego es aún más interesante. Con un concepto similar, lo que se busca es identificar objetos dentro de las fotos. Por ejemplo, si sabemos que la foto tiene un perro, saber en que parte de la foto está el perro y así poder hacer un highlite cuando se realiza una búsqueda. El ejemplo que muestra se ve muy interesante.

En fin, lo malo del juego es que requiere el plugin de Java, pero si lo tienen les recomiendo jugar, es muy fácil ;).

El video realmente no tiene desperdicio, y el ingles del niato que da la charla es bastante claro.

PHP y PROXYS

Hace ya varias semanas venía peleando con el nuevo sitio de Oregano, donde quise agregar una pequeña sección que muestre los últimos commits en el repositorio, utilizando el RSS que provee darcsweb.

Me llevo muchas puteadas entender que el problema era que la función fopen de PHP no sabe realizar un GET a través de un proxy HTTP :(, pero por suerte la gente deja comentarios y la función en cuestión es la siguiente :

function proxy_url($proxy_url) {
   $proxy_name = 'proxy.fi.uba.ar';
   $proxy_port = 8080;
   $proxy_cont = '';
   $proxy_fp = fsockopen($proxy_name, $proxy_port);
   if (!$proxy_fp) {return false;}
   fputs($proxy_fp, "GET $proxy_url HTTP/1.0\r\nHost: proxy_name\r\n\r\n");
   while(!feof($proxy_fp)) {
     $proxy_cont .= fread($proxy_fp,4096);
   }
   fclose($proxy_fp);
   $proxy_cont = substr($proxy_cont,  strpos($proxy_cont,"\r\n\r\n")+4);
   return $proxy_cont;
}

Solo bastó con reemplazar el fopen por proxy_url y salió andando 🙂

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

Nuevo Hackergotchi!

Llego la hora de un cambio de Hackergotchi!, ya que el anterior nunca me terminé de gustar 🙂

GazerHack.png

No es para decir «Wow loco, te mataste que groso que quedó«, pero por lo menos me gusta más y refleja medianamente mi actual corte de pelo 🙂

UPDATE: Encontré una foto atípica en mí, he hice otro mockup de hackergotchi :-), después veré si este último lo agergo o no al Planet Lugfi

GazerHack2.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 😛

Game Addiction

En los últimos días me volví adicto a dos jueguitos muy pavos

gPlanarity

gPlanarity is a super-clone of the flash Planarity game written by John Tantalo. The original Planarity ran well in IE and Firefox on other platforms, but was slow and liked to lock up or abort under Linux browsers.

gPlanarity implements gameplay identical to the original Planarity but adds some UI and game extras around the basic game such as multiple board generation algorithms, puzzle boards, complete backing state, group select/drag and so on.

gPlanarity

qonk

Qonk is a small game I wrote to learn some SDL basics. The game is a small build-and-conquer strategy game with very simple rules. A complete game only lasts for a few minutes and can be a fun break away from work or whatever you’re doing.

The setting of the game is a solar system of planets. Your goal is to conquer all of the planets in the game by sending ships there. Planets that are under your control generate new ships. Simple AI players are playing against you. As you gain more experience throughout the game, more AI players have to be kicked out of bigger solar systems.

Qonk
Si tienen algo de tiempo que quemar y no saben que hacer, les recomiendo ambos :-). Eso si, puede llegar a resultar difícil dejarlos 😀