Mostrando entradas con la etiqueta diseño. Mostrar todas las entradas
Mostrando entradas con la etiqueta diseño. Mostrar todas las entradas

Sobre Gext (la librería)

miércoles, 25 de noviembre de 2009 0 comentarios
¡Hola!

Como veis, últimamente estoy más animado para avanzar con el proyecto, aunque sólo sea pensar (porque la fase de desarrollo todavía no está oficialmente abierta). Este post va sobre la librería que comentábamos en el anterior.

Me he dado cuenta de que tanto el editor como el compilador son sólo accesorios. Lo único imprescindible es la librería. Me explico: el objetivo final será un script, generado con el compilador a partir de un proyecto creado con el editor. Pues bien, ese script se puede escribir a mano (obviamente, no quiero que eso sea siempre así, pero para probar la librería es válido). Por lo que la parte por la que empezaré será esa: gext.

Según lo tengo pensado, una de las funciones principales será la de emular el comportamiento humano, es decir, generar eventos del teclado y del ratón. Actualmente, la mayoría de los sistemas a los que va dirigida esta aplicación sólo cuenta con un dispositivo de cada tipo (si esto cambia, ya veremos :D). Por ello, intuitivamente, tendremos dos objetos, uno para el teclado y otro para el ratón (sendos singletones ;) ). Estos objetos tendrán una interfaz que permita controlar los dispositivos programáticamente. Por ejemplo, para el ratón, se debería poder mover, pulsar el botón derecho, soltarlo (con soporte para todos los botones posibles, claro :D), obtener su posición, etc. Y para el teclado idem.

Me atrevería a esbozar las interfaces aquí mismo. Veamos. La del ratón:
class Mouse:
    def getPosition(self):
        pass
 
    def moveTo(self, x, y, abs=True):
        pass

    def pressButton(self, button):
        pass

    def releaseButton(self, button):
        pass

Las argumentos x e y son enteros que indican la posición, y abs especifica si el movimiento es absoluto (desde la posición 0,0 de la ventana root), o relativo a la posición actual del ratón. Button es un entero que indica el número de botón a pulsar. Se pueden añadir algunos métodos para simplificar ciertas tareas comunes, por ejemplo, un leftClick(), o un dragTo(). La del teclado, podría ser algo así:
class Keyboard:
    def pressKey(self, key):
        pass

    def releaseKey(self, key):
        pass
De nuevo, también añadiré algunos métodos para tareas comunes. En este caso, es muy frecuente querer introducir muchos caracteres seguidos, en vez de ir uno por uno. Para ello, algo como generateKeyEvents(seq) sería útil, donde seq es una cadena de texto.

Bueno, creo que por hoy, ya tengo bastante :D . ¡Hasta el siguiente post!

Partes del proyecto

martes, 24 de noviembre de 2009 0 comentarios
Hola de nuevo.

Según el planteamiento del post anterior, gexter no va a ser una sola herramienta, sino un conjunto de ellas. A primera vista, veo como mínimo tres entidades completamente diferenciadas.

  1. El editor de secuencias. Con el se crean realmente los screencasts, especificando la secuencia de acciones, opciónes de configuración, gestión de proyectos, etc.
  2. Librería. Será un módulo que englobe todo lo necesario para poder lanzar los scripts que ejecuten las acciones. 
  3. Compilador, algo sencillo que tome como entrada un fichero de proyecto de gexter y produzca un script en Python autosuficiente (lo que quiere decir que no depende del editor), para ejecutar en cualquier parte.
¿Nombres? Buena cuestión. Nunca he sido demasiado bueno en este campo ;) Pero bueno, alguno tienen que tener: la librería será "gext", (una ola de imaginación), el compilador podría ser "gexta" (uff, quizá este cambie), y el editor se va a quedar con "gexter". Bueno, divide y vencerás... a ver si es cierto ;)

Entrando en materia

lunes, 23 de noviembre de 2009 0 comentarios
¡Hola a todos!

Creo que es hora de ir impezando con el proyecto. Y lo mejor para empezar es contar de que va todo esto ;)

Muchas veces me he encontrado en la necesidad de explicar paso a paso como hacer determinada tarea en GNU/Linux. Y en esas ocasiones, he pensado: "Si tuviera un video para enseñarselo, sería genial". Otras veces, el problema ha sido diferente: añadir una nueva característica a la interfaz gráfica de una aplicación, o un nuevo plugin a cierta web, y tener que ejecutar los mismos pasos una y otra vez para probarla. Exasperante.

Para estas ocasiones (y otras), podemos usar software que nos ayude. Tanto para crear rápidamente un vídeo como para automatizar las pruebas de una interfaz gráfica. Aunque parece que no tiene nada que ver, pero ciertamente comparten mucho ámbito del problema. Si nos ponemos a buscar herramientas para esto, encontramos algunas. La mayoría privativas, algunas otras libres. Pero casi todas adolecen de algo. Por ejemplo, encontré xnee. Promete bastante, pero está basado en una extensión de X (RECORD) que hace varios meses que no funciona (por lo que no he podido probarlo). Además, resuelve uno de los problemas (la automatización), pero no todos.

Otra librería que se usa para esto mismo es LDTP. Está dedicada a la automatización de pruebas para interfaces gráficas. Promete mucho, pero usa las librerías de accesibilidad para la introspección de widgets. No es que tenga nada en contra de ellas, pero son bastante intrusivas, y algunas veces me he encontrado con problemas (especialmente con la combinación python (GIL) + Gtk (no thread-safe) + LDTP).

Por otro lado, están las herraminetas para grabar el screencast (como recordmydesktop, istambul, etc.). Estas se especializan en otra tarea (la de grabar), pero no dan la posibilidad de añadir "objetos visuales" al vídeo (como cuadros de texto, zoom, sobreado, etc.).

Tendríamos que combinar varias de estas herramientas, creando algunos scripts ad-hoc, para nuestra tarea. Si bien se podría hacer (yo me encontré en la necesidad de hacerlo alguna vez, cosa que, de hecho, fué la clave para iniciar este proyecto), no es nada cómodo.

Es por eso por lo que nace el proyecto Gexter. Pretende ser un software completo, que permita realizar las siguientes tareas, de una forma visual y sencilla:
  • Automatizar pruebas de interfaces gráficas (GUI).
  • Grabar en vídeo el resultado de la automatización.
  • Añadir elementos visuales para destacar ciertos objetos/zonas, tales como cajas de texto, sombreado, zoom, control de temas, etc. 
  • Poder editar individualmente cada grupo de acciones, navegar a través del flujo de eventos, etc.
  • Generar scripts autónomos, para lanzar sin necesidad de disponer de la herramienta completa, o conocer su funcionamiento. 
  • Soporte para audio, ya sea directo u off-line.
Y muchas más cosas que ahora mismo no sé, pero que se me ocurrirán :P Por supuesto, no pretendo reinventar la rueda. Si veo que LDTP o recordmydesktop me sirven, los utilizaré, ya que son grandes proyectos muy válidos. El objetivo es más bien aunar todos los esfuerzos (siempre que se pueda).

Las herramientas que voy a emplear serán muy dispares, pues es muy amplio el conjunto de problemas a resolver. Pero una cosa sí tengo clara: utilizaré Python, que tiene una gran cantidad de módulos muy útiles, aunque no descarto realizar partes en otros lenguajes (con sus binddings asociados).

De momento, poco más. Ya se me van ocurriendo ideas sobre el diseño, y problemas que estas presentan. Así que pronto escribiré sobre esto.

¡Saludos a todos!