martes, 28 de septiembre de 2010

Ciao Discordia


No me esperaba que nos dejases hoy. No sé, ayer cuando te vi pensé que te pondrías bien, incluso me dijeron esta mañana que estabas un poco mejor.

Pero mi móvil sonó esta tarde. Me dijeron en el hospital veterinario que sólo llamaban cuando las cosas empeoraban y resulta que lo hicieron a media tarde para decirme lo peor que me podían decir: te marchaste. Has luchado dos semanas contra tu hígado y al final no has  podido más

Ya me dirás que hago ahora con el pesado de tu hermano, lleva unos días muy empalagoso y extrañado de no verte por casa, vamos, que ahora no me lo voy a quitar de encima. Ya no tiene con quién jugar y dormir.Justo ahora no me está dejando teclear estas lineas en paz...

Ciao Discordia, fuiste una gata solitaria en un principio pero poco a poco confiaste en los humanos que te rodeaban hasta volverte cariñosa y sociable. Légolas y yo te echaremos de menos.

jueves, 16 de septiembre de 2010

Y además un lío de verdad

Hace unos cuantos meses contaba como me había metido en el lío de desarrollar una aplicación Open Source y parece que ahora toca narrar el final de este primer capitulo.

Todo marchaba bien con Kdropbox Kfilebox: las nuevas versiones me iban saliendo sin mucho esfuerzo y no me aburría de trabajar en ello, además aprendía cosas nuevas y repasaba otras. Para colmo, poco a poco las descargas subían y recibía bastantes comentarios de los usuarios. Sin saber ni cómo, conseguía sacar tiempo para programar, mantener la web, los sitios en Sourceforge y KDEApps y además me las ingeniaba para no dejar a ningún usuario sin respuesta a sus comentarios.

A finales de Agosto la cosa se estaba complicando, me encontraba con la incómoda situación de no saber muy bien por donde tirar. Intentaba averiguar más cosas del funcionamiento del demonio de Dropbox (la aplicación oficial para entendernos) para incorporar las mismas características a la versión libre del cliente para KDE. Buscaba en el wiki y el foro de Dropbox, miraba código de algunos plugins de otros desarrolladores Open Source e incluso, meses antes,   llegué a preguntar en dicho foro a la propia compañía sobre cómo podía desarrollar tal o cual cosa. La respuesta no fue de ayuda.
Poco a poco me di cuenta de que no llegaría mucho más lejos así que comenzaba a pensar en funcionalidades al margen de lo ofrecido por el cliente original, hay que tener en cuenta que la idea inicial era imitar esa aplicación tal cual era pero en una aplicación integrada en KDE. Como no encontraba ninguna idea, lo que barajaba era incorporar una arquitectura de plugins para que otros desarrolladores pudieran incorporar nuevas funciones y que estas se mostrasen en el menú de la aplicación.
Y en esas cavilaciones estaba cuando el 26 de Agosto recibí un mail de un responsable de marketing de Dropbox pidiéndome dos cosas: que dejará de usar kdropbox como nombre y que tampoco incluyese su logotipo. Era un mail frío, o al menos así me dejó. Bueno, evidentemente en lo del logo siempre he dicho que tenían toda la razón, lo del nombre ya me parece discutible.  De hecho ahora pienso que hay muchas cosas cuestionables, incluso en cuanto al uso del logo pero me las voy a reservar.
Después de esto decidí no entrar en polémicas y finalizar el desarrollo de la aplicación no sin antes publicar una última versión con un nuevo nombre, logotipo e iconos. Mientras tanto y por otro lado, hubo un poco de polémica [2] en sus propios foros al respecto de todo esto y solo diré dos cosas sobre lo que allí se  ha escrito:
  1. Como ellos dicen, debe quedar claro que en ningún momento se me envió un requerimiento legal ni nada parecido.
  2. No me he sentido ayudado por esa compañía en ningún momento.
En los próximos días tengo pensado publicar la primera y última versión de Kfilebox. Después de eso sólo haré un poco de mantenimiento en caso de que algún usuario informe de algún error y como mucho incluiría nuevos archivos de idioma.
En todo caso la experiencia me ha gustado, sobre todo por el apoyo de la comunidad de usuarios a los que tengo que agradecer que me hayan dado ánimos estos últimos días y sugerido ideas durante toda la vida del proyecto, algunos incluso se hicieron eco de la existencia del programa en sus blogs. Por supuesto no me olvido de aquellos que han traducido y aún hoy traducen la aplicación, a todos ellos muchas gracias.
Es por esto que en lo que pienso ahora es en comenzar otro proyecto Open Source del cual ya estoy haciendo alguna prueba a modo de prototipo rápido. En caso de que los resultados de las pruebas me parezcan adecuados volveré a las andadas y si no encontraré otra idea. Seguro estoy de que encontrare otro lío en el que meterme.

domingo, 8 de agosto de 2010

Jugando con DBus

Cuando los usuarios tienen la razón
Hace unos días recibí un mail de un usuario de Kdropbox diciendo que el comportamiento de la aplicación al hacer clic sobre el icono de la bandeja de sistema no era el habitual en KDE. Según me contaba al hacer clic se abría la ventana por tanto al volver a hacerlo debería cerrarse.
 Es curioso pero tantos años usando este escritorio y no me había fijado. Lo comprobé y es cierto que no todos los programas lo cumplen, pero aquellos que se distribuyen con KDE sí.  Kdropbox abría (y la versión estable la abre aún en el momento de escribir esto) una ventana de un navegador de archivos (dolphin o konqueror) cada vez que se hacía clic en el icono, por lo que era una buena manera de lanzar rápidamente 377 navegadores de archivos, dependiendo de la velocidad de nuestra mano :D
En todo caso terminaba siendo una cuestión de usabilidad y el usuario tenía razón así que había que cambiarlo. Sin embargo había un problema bastante importante en todo esto: hacer un control de ese tipo en una ventana propia de la aplicación hubiera sido relativamente sencillo, pero ¿que pasa si lo que hemos lanzado es un proceso independiente? Bueno, una solución podría ser la primera que se me ocurrió: lanzar el proceso, guardarme el pid y matarlo con el segundo clic. Error, Dolphin no se lanza como instancia nueva si ya está corriendo, o sea que si ya hay una ventana de Dolphin abierta cuando hacemos clic en el icono no tendremos un pid independiente y lo que es peor, matar ese proceso terminaría con todas las ventanas del gestor de archivos que tuviera abiertas el usuario.
DBus y qdbusviewer
 La solución para estos casos es hacer uso de DBus que es el estándar de Linux para la comunicación entre  aplicaciones. Si no tenemos experiencia previa lo mejor es trastear un poco con qdbusviewer el cual nos permitira escudriñar por todas las aplicaciones que utilizan este protocolo e incluso, llamar a sus métodos.
 Por ejemplo podemos abrir una ventana nueva de Dolphin indicando la URL que queremos mostrar.La condición previa necesaria es que Dolphin esté en ejecución ya que de otro modo no aparecerá en el listado de servicios de qdbusviewer (panel izquierdo)
 En cuanto le demos a OK en la ventana en la que se solicitan los parámetros veremos que en el panel inferior se muestra la respuesta al método o los posibles errores que ocurran.
Escribiendo el código para hacer llamadas
Pero ¿cómo hacemos esto desde nuestra aplicación? Hay bastantes ejemplos en la web para contestar a esta pregunta, un ejemplo rápido usando QT para el caso anterior sería este... bueno, no tan rápido. Un poquito de teoría antes.
Siempre necesitaremos saber lo siguiente:
  1. El nombre del servicio con el que el proceso se identifica en DBus, en la práctica se asemeja a una URL
  2. La ruta hasta el objeto al que queremos llamar
  3. El interfaz declarado por la aplicación para el método que buscamos
  4. El método al que queremos llamar y sus parámetros
Salta a la vista que todo esto lo obtenemos fácilmente con qdbusviewer. En nuestro caso:
  1. Nombre del servicio: org.kde.dolphin
  2. Ruta: /MainApplication
  3. Interfaz: org.kde.dolphin.Aplication
  4. Método: openWindow
Teniendo todo lo necesario QT lo pone muy fácil gracias a la clase QDBusInterface. Sólo tenemos que incluir las clases que necesitamos y unas cuantas líneas de código para hacer la llamada.

En este ejemplo se necesitan las siguientes clases relativas a DBus:

#include <qdbusinterface>
#include <qdbusreply>

El código necesario para abrir nuestra ventana de Dolphin es el siguiente, teniendo en cuenta que path debería contener alguna ruta válida:
QDBusInterface remoteApp("org.kde.dolphin","/MainApplication","org.kde.dolphin.Application",QDBusConnection::sessionBus());
if (remoteApp.isValid()){
QDBusReply<int> reply =remoteApp.call("openWindow",path);
int winid=(reply.value());
}
Hemos intentando la conexión con la aplicación en la ruta e interfaz deseado, después hemos comprobado que realmente hemos contactado con ella y así hemos podido llamar al método openWindow con la tura deseada. Por último nos hemos guardado la respuesta que nos devuelve el método que no es otra cosa que el identificador de la nueva ventana.

Un último ejemplo, vamos a ver como cerrar esa misma ventana ya que la forma de proceder varía ligeramente. Para entender esto hay que observar como se transforma el árbol de Dolphin en DBus, en la siguiente captura se pude ver como ha aparecido un nuevo nodo identificando la nueva ventana, de forma que si el identificador que nos ha devuelto el método anterior es el 3 tendremos la ruta
/dolphin/MainWindow3

Esto es importante a la hora de cerrar la ventana ya que es la ruta que utilizaremos:
QDBusInterface remoteApp("org.kde.dolphin","/dolphin/MainWindow"+QString::number(getWindowId()), "org.kde.dolphin.MainWindow", QDBusConnection::sessionBus());
if (remoteApp.connection().isConnected())
    QDBusReply<int> reply =remoteApp.call("quit");
 Hemos concatenado la cadena /dolphin/MainWindow  con el identificador de la ventana que nos habíamos guarda. En este caso el método no tiene parámetros y no devuelve tampoco ningún valor.
 Esto no ha sido nada
Esto solo han sido un par de ejemplos básicos, como se puede suponer cada aplicación será un mundo y habrá que investigar un poco los métodos que contiene para ver lo que podemos hacer con ella. Por supuesto que no todas las aplicaciones están preparadas para ser utilizadas mediante DBus. En fin, todo esto no es más que la punta del iceberg ya que por ejemplo se pueden usar señales y slots entre aplicaciones distintas de forma muy parecida a como lo hace QT. En mi caso no me ha hecho falta de momento nada más que esto pero al que le interese le vale la pena profundizar más.

lunes, 19 de julio de 2010

Creando binarios para linux con Open Suse Build Service

Hay que reconocerlo: crear archivos ditribuibles para Linux es un auténtico infierno.  Además, como no, seremos víctimas de una nueva lucha de estándares rpm vs deb. Esto hace que sea bastante tentador distribuir simplemente el código fuente y desear suerte a los usuarios con la compilación, aunque de esta manera no llegaremos a los menos aventajados. También es cierto que distribuyendo el fuente no tardarán en aparecer voluntarios que crearán paquetes para determinadas distribuciones pero de esa manera perderemos el control de nuestro software. De modo  que, si queremos enfrentarnos a este problema, parece que sólo hay unas pocas soluciones: o bien encontrar un software que nos cree un instalable independiente de la distribución o tratar de llegar a la máxima cantidad de usuarios creando rpms y debs para las mayores distribuciones. Este artículo se centrará en el segundo enfoque. Open Suse Build Service (OBS) es, como su nombre indica, un servicio de construcción de paquetes binarios para las mayores distribuciones de Linux, incluyendo Ubuntu, Open Suse, Fedora, CentOs, Mandriva y alguna que otra más. Además de la creación de paquetes, pone a nuestra disposición los correspondientes repositorios de descarga para que puedan ser distribuidos a todo el mundo bien directamente, enlazando desde nuestra propia web si disponemos de ella, desde sitios capaces de integrar el servicio como kde-apps.org o desde el propio lugar habilitado por Open Suse para ello.
En este artículo trataré de describir mi experiencia para generar los binarios de un proyecto propio pero será difícil que no se me escape algún detalle así que, en todo caso, recomiendo que se de un vistazo a proyectos existentes en OBS para tener una referencia de la estructura de los archivos y a las configuraciones que se pueden encontrar en los .spec y .dsc necesarios para la construcción.
Como resumen antes de comenzar, sólo me queda decir que aunque su manejo no es todo lo sencillo que desearíamos, en cuanto se tiene un poco de práctica, obtenemos la ventaja de producir archivos instalables para la gran mayoría de distribuciones tanto en arquitectura 32 como 64 bits, algo que de otro modo no podríamos conseguir por nosotros mismos.

En qué consiste

Básicamente lo que se pone a nuestra disposición es una máquina virtual que se crea en el momento en base a nuestras necesidades. Dicho de otro modo, obtenemos un entorno de compilación y paquetización generado dinámicamente según los paquetes que habremos indicado previamente en los ficheros de descripción (uno para .deb y otro para .rpm)
Cada vez que modifiquemos alguno de los archivos de nuestro proyecto el servicio realiza una petición de construcción por el cual se crea de cero la máquina y, posteriormente a la instalación de todos los paquetes, se compila nuestro proyecto y se crea el binario. Como es natural este proceso no es especialmente rápido y más teniendo en cuenta que compartimos el servicio con otros usuarios pero con suerte, si no hay mucha cola, en poco más de unos 5 minutos podemos tener el resultado de todo el proceso.

Preparando el proyecto

Después de  crear nuestra cuenta llegará el momento de crear nuestro primer proyecto. Una de las cosas que hay que considerar es comprobar que no existe el mismo proyecto en la cuenta de otro usuario, si por ejemplo se está recompilando un fuente que no es nuestro porque lo queremos para nuestra distribución preferida.
En todo caso tendremos un proyecto creado por defecto, pero llevará el nombre de nuestro usuario, así que es recomendable crear uno nuevo.



Una vez creado el proyecto podremos asignarle paquetes y a estos a su vez podremos añadirles archivos. De una forma más práctica:
  1. Nuestro proyecto puede ser el nombre de nuestro programa
  2. Asignaremos las distribuciones (repositorios) para los que queremos paquetizar
  3. Podemos crear un paquete para cada versión
  4. A cada versión (paquete) le añadiremos todos los archivos descriptivos y de código fuente para que se creen sus binarios.
Iremos viendo a continuación como cumplir con los pasos que continúan a la creación del proyecto, pero antes de eso, como adelanto, en la imagen siguiente se puede ver la página inicial de un proyecto ya maduro




Creando los repositorios

El objetivo final de todo esto debería ser tener varios repositorios de paquetes para distribuir a nuestros usuarios. El concepto de repositorio estará ligado siempre a una distribución por lo que si elegimos distribuir para OpenSuse y Ubuntu, contaremos con dos repositorios.



En todo caso estará en nuestras manos que esta distribución de los binarios construidos sea libre o no. ¿Y por que no debería serlo? Para mí la respuesta es fácil, en mi cuenta nadie puede acceder a ellos ya que de momento OBS no registra estadísticas de descargas y ese es un dato que interesa controlar ya que mide el grado de aceptación que tiene nuestro trabajo. Una posible solución es descargarse los binarios (nuestro usuario siempre tendrá permiso por ser el creador) y subirlos a SourceForge dónde sí podremos controlar el número de descargas.
Al margen de cómo lo planteemos, la publicación es bastante flexible y podremos elegir que archivos son públicos o no por distribución y arquitectura. Esto lo veremos más adelante cuando se explique todo lo relativo a paquetes.

Creando paquetes en nuestro proyecto


Como se ha dicho con anterioridad podremos asimilar el concepto de paquetes a una versión de nuestro software. Además las tareas de construcción se lanzan contra los paquetes, dicho de otro modo, las maquinas virtuales creadas por OBS se ejecutan con la información de los archivos que habremos subido para un determinado paquete. Es por ello que todo lo que hemos visto con anterioridad sobre los permisos de construcción y publicación se hace para un determinado paquete.

Administración de los paquetes del proyecto

La creación de un nuevo paquete es muy simple, sólo se nos pide un nombre y una descripción que podemos dejar en blanco.




Una vez creado, de nuevo contaremos con una pantalla de resumen general desde la que tendremos a nuestro alcance las diversas opciones existentes para el paquete seleccionado. Es muy similar a la del proyecto pero tiene la opción files para añadir los archivos y aquí la opción repositories sirve para controlar la construcción y publicación para distintas distros y arquitecturas, mientras que en la opción del proyecto sirve para añadir o quitar distribuciones.




 Los archivos

A nuestro paquete subiremos archivos para que OBS construya los binarios pero antes de nada debemos saber que cada vez que subamos un archivo a un determinado paquete, se disparará un petición de construcción para los sistemas/arquitecturas permitidos.
Veremos por ahora de forma muy superficial los archivos que necesitaremos para la versión 0.0.1 de una aplicación llamada app de la que queremos .deb para Ubuntu y rpms para diversas distribuciones basadas en este otro sistema:
Para construir los rpms:
  • app.spec Es el descriptor del paquete que vamos a construir
  • app-0.0.1.tar.gz El código fuente a compilar para obtener el rpm
Para los debs:
  •  app_0.0.1-1.dsc Archivo de descripción
  • app_0.0.1-1.tar.gz Fuentes a compilar


Podremos editar los archivos de descripción desde la misma web pero veremos más adelante todo esto de forma más detallada cuando hablemos de cada uno de los casos de construcción en profundidad.

Controlando la construcción y distribución

Como se dijo antes, desde esta opción controlaremos todo lo relativo a la construcción y publicación de los repositorios que hemos elegido para nuestro proyecto. En la imagen que se puede ver abajo tenemos prohibida la publicación del repositorio para todas las distros y arquitecturas. Sólo nosotros, como creadores del paquete tendremos acceso a la descarga de los archivos generados.


 
También tendremos un modo similar de seleccionar para que distros y arquitecturas se debe lanzar la construcción. Por ejemplo si estamos peleándonos con la construcción de .deb para Ubuntu podemos tener paradas todas las construcciones basadas en rpm. De este modo no consumiremos recursos del servicio y no entorpeceremos a otros usuarios.




Conclusiones

Hemos visto como crear nuestro proyecto y la información básica para empezar a obtener archivos. Realmente con esto y observando en OBS algunos de los proyectos existentes, los más impacientes podrán empezar a trabajar ya. En todo caso, próximamente podréis encontrar por aquí los casos de construcción de .deb y .rpm con algunos problemas comunes y la forma a enfrentarse a ellos,

Moviendo el blog

¡Hola! Simplemente deciros que el blog está ahora en http://www.deuteros.es

La nueva web está todavía en construcción, tengo que cambiar la imagen de cabecera, enlaces y estructura en general, etc. Pero como no se cuando tendré tiempo para todo eso y ya he añadido un artículo nuevo ¿que mejor momento para contarlo?

Gracias a todos mis escasos lectores por haberme seguido en blogger, espero veros pronto por el nuevo sitio.

¡Saludos!