jueves, 10 de noviembre de 2011

Dfilebrowser 1.1 para Plasma Active

Nueva versión de Dfilebrowser disponible para Plasma Active. Esta vez la compilación corre sobre Open Suse. Las novedades se corresponden con mejoras en la usabilidad y la experiencia de usuario al manejar la aplicación.

Dfilebrowser 1.1 on Plasma Active

Dfilebrowser 1.1
  • La vista por defecto para tablets es una lista.
  • Colores alternantes para las filas en las listas de archivos
  • Aumentado el tamaño disponible para la rejilla de iconos del modo de vista "iconview"
  • Mejoras en el modo de vista de lista con detalles de archivo: mejoras en la distribución de las columnas
  • Bugfix: en Plasma Active sobre Open Suse los archivos no se abrían al hacer "tap`"

viernes, 4 de noviembre de 2011

La vergonzosa guerra de las patentes


Justicia

Desde hace algún tiempo, todos los días nos desayunamos con sentencias sobre patentes entre las grandes compañías de tecnología y, últimamente, se producen especialmente entre los fabricantes de teléfonos móviles y tablets (léase Apple, Samsung, HTC...) Sin embargo ayer se dio a conocer una noticia bastante positiva en forma de sentencia a favor de una pequeña empresa española que ha conseguido batir ni más ni menos que a Apple en los tribunales.

Es un tema para indignarse, todo el mundo peleando y tratando de demostrar que patentes ha infringido el otro, bloqueando la venta de dispositivos en los mercados de tal o cual país, firmando acuerdos para ceder parte de los beneficios de las ventas en concepto de uso de cierta patente...

Al final el perjudicado es el usuario final. Todas estas batallas judiciales de coste incalculable deben terminar repercutiendo en el precio de lo que compramos ¿no? Es más, HTC paga 5 dolares a Microsoft por cada terminal Android que vende. También podríamos hablar de que no se pueda comprar ciertos cacharros de Samsung en Alemania y Holanda. Pero que nadie cante victoria antes de tiempo, donde las dan las toman y Apple se está ganando unos cuantos enemigos que ya están contraatacando.

Si nos situamos como espectadores podemos deducir que Apple saca pecho diciendo que han inventado algo que tecnológicamente estaba años por delante de sus rivales. Sus demandas se basan en la presunta copia de esta tecnología, o sea, se basan en que el futuro es suyo gracias a sus ideas avanzadas (y registradas) pero... ¿que hay del pasado? El pasado reciente es de otros y ahora mismo se enfrentan a demandas por el uso de tecnologías 3G y otros aspectos básicos de telefonía móvil.
Es una guerra sin ningún sentido y las compañías demandantes/demandadas se ven hasta obligadas a comprar compañías poseedoras de patentes. Quizá sea esto lo más vergonzoso: nada impide a una pequeña compañía incapaz de desarrollar una tecnología el poder patentarla. Después sólo hay que esperar a que a alguien le interese y compre dicha empresa o que algún incauto "infrinja" la patente y haga dinero con ella. Para ilustrar este caso basta decir que recientemente Zynga, la creadora de la archiconocida FarmVille, fue demandada por una desconocida empresa de Texas por el uso de tecnologías de pago en juegos.

Es evidente que si parece haber unos ganadores en todo esto, como mínimo los bufetes de abogados, al menos siempre cobran por representar a los fabricantes. A unos cuantos les conviene que se prolongue esta pelea barrio bajera en el tiempo y en el espacio. Lo primero lo tienen asegurado debido a la animadversión entre los rivales que hay en el ring pero lo segundo no está tan claro. Me explico, si hay un paraíso donde hincharse a repartir mamporros legales de lo lindo, ese es EEUU. De hecho los interesados en todo esto están intentando replicar este modelo en Europa, desean un tribunal único europeo que vele por las patentes. De conseguirlo, estas "pequeñas" batallas legales que, por ejemplo, prohíben la venta de un producto en un determinado país y que se libran por tanto a nivel nacional, tendrían ámbito europeo: se bloquearían ventas a nivel comunitario.

Debe quedar claro también que esto no repercute simplemente en productos tangibles. Estas artimañas también se intentan llevar al mundo del software, con diferente éxito según el país. Es bastante probable que al instalar un sistema operativo Linux no puedas reproducir ciertos formatos de video o audio al no haberse incluido los codecs necesarios. Hay otros formatos de carácter libre pero en la práctica no son tan extendidos y al final todos necesitamos ir a parar a los habituales. De nuevo es sólo un ejemplo, pero esto da a entender la cantidad de tiempo que pueden llegar a perder los desarrolladores de  software en sortear ciertas barreras (con forma de patente) para llevar a término su trabajo.

El peligro, al final, es llegar a un estado de medievalismo tecnológico en el que estemos estancados debido a las dificultades para innovar. ¿Para qué crear algo si después me la van a tumbar en un juzgado? Da igual que sea de interés general o sin ánimo de lucro, ya que se impediría el lucro de alguien que tiene una patente que afecta a una pequeña parte de tu trabajo.

No quedan muchas armas para combatir a un rival tan poderoso. Lo primero es intentar frenar su expansión, expresándonos en contra del tribunal europeo de patentes. En el peor de los casos, una vez lanzado un litigio siempre queda el concepto del arte previo que básicamente consiste en demostrar que alguien ya había pensado con anterioridad en lo que otro ha patentado y, por tanto, es de dominio público. Cuando esto se produce tiene su gracia, es algo así como darle una bofetada a un listillo y decirle "¿Ves? no eres tan inteligente como creías" Recientemente vimos como Samsung utilizaba una secuencia de la pelicula 2001 para demostrar que Apple no había sido la creadora del diseño del iPad. Otro ejemplo de esto ocurrió hace unos pocos años cuando en un juicio entre RedHat/Novell e IP Innovations LLC, se recurrió a un Amiga 1000  para demostrar que allá por el año 1986 ya había un ordenador capaz de manejar diversos escritorios y que además usaba ciertas características en ellos que correspondían con otras dos patentes.

miércoles, 19 de octubre de 2011

Dfilebrowser un navegador de archivos para Plasma Active One

Dfilebrowser corriendo en Plasma Active One

La semana pasada comentaba que echaba en falta un navegador de archivos en Plasma Active One. Hoy voy a aportar mi granito de arena para solucionarlo, aunque de todos modos sigo pensando que sus creadores  no tardarán en incorporar un gestor de archivos propio

Resulta que cuando empecé a probar Plasma Active me hallaba a su vez creando un gestor de archivos para usar embebido en Acid Rain. Por alguna razón, decidí desarrollarlo de forma que fuera un componente independiente, así que cuando me surgió la necesidad de usarlo como navegador de archivos en Plasma Active se encontraba bastante encaminado.

En realidad es bastante elemental y tiene cosas por pulir (consideradlo una beta) pero creo que es lo suficientemente útil como para que se empiece a usar. La idea es tener todos los botones y las opciones de menú del tamaño suficiente como para poder meter el dedo, así de simple. A modo de manual rápido:
  • Haciendo un toque corto con un dedo (tap), abrimos la carpeta o el archivo
  • Con un toque largo (long tap o tambien tap and hold) sacamos el menú contextual.
  • Podemos cambiar el tipo de vista con el último botón del menú superior.
  • En caso de usar un teclado, podemos usar las combinaciones de teclas habituales. Sí, ya sé que estamos hablando de un tablet pero la aplicación se ha pensado para que funcione también en un escritorio convencional:

    Dfilebrowser corriendo en Windows XP
En caso de que lo adoptes no olvides establecerlo como herramienta preferida para la gestión de archivos (lanzando  desde un terminal systemsettings o buscándolo en el lanzador de aplicaciones de Plasma Active One). Una vez  hecho esto, selecciona "Aplicaciones predeterminadas" y en la siguiente ventana, a la izquierda, "Gestor de archivos". Sólo os quedará añadir dfilebrowser como aplicación preferida.

Dfilebrowser es open source y tiene licencia GPLv3, el código fuente puede encontrarse aquí y para los que tengan Plasma Active One corriendo sobre Meego 1.2 sólo tenéis que descargaros este rpm.

martes, 11 de octubre de 2011

Plasma Active One

Seleccionando una actividad en Plasma Active One

Llevaba días esperando la aparición de Plasma Active One porque la preview me había gustado bastante y por fin he podido probarla.

El entorno me parece muy interesante y creo que aporta nuevas ideas al mundo de las tablets y además respeta los existentes en KDE. Me refiero a las actividades y por supuesto todo lo que rodea al entorno de Plasma Active. Con las actividades tendremos a nuestro alcance varios escritorios en los que podremos definir enlaces a aplicaciones, documentos o asignar widgets. Lo normal es que lo hagamos de forma temática y tengamos una actividad para el trabajo, otra para ocio, etc.
Aunque todo es muy prometedor, los desarrolladores tendrán que pulir varios aspectos algunos de ellos en el navegador, algo que es una pena ya que es la aplicación estrella en este tipo de dispositivos y con el que no he conseguido ver paginas con flash e incluso algunas en html no se muestran correctamente. También habrá que seguir mejorando el teclado virtual y el soporte a lenguajes distintos del inglés. Por ultimo, de lo que recuerdo ahora mismo, el arranque me parecio bastante lento.

Este es el tercer sistema operativo que pruebo en esta tablet Wetab (llamada también ExoPC) El primero, el Wetab OS, es seguramente el más estable y el que mejor integra Flash, Java en incluso Android. Una pena que el entorno de usuario sea un poco triste, aunque muy funcional, muy alemán :D

Wetab OS con su Pin Board

Hace un par de semanas lo intente con Meego 1.2 que si no recuerdo mal era una preview y, dadas las circunstancias, no va a pasar de ahí. Era bastante bonito pero muy inestable. Tampoco terminó de convencerme el entorno y el teclado virtual estaba muy verde. No me queda muy claro si tendremos un Meego 1.3, prometido para Octubre pero tal vez sentenciado por Tizen.

En este tercer intento corre un Plasma Active sobre Meego (también se puede probar sobre OpenSuse) y sin ser tan estable como el Wetab OS, al menos se merece una oportunidad y más porque me encanta el concepto de las actividades y su manejo.

¡Ah! Por cierto, en Plasma Active One se echa en falta un navegador de archivos y aunque supongo que pronto adaptarán Dolphin yo ya estoy trabajando en el mío propio, espero poder contaros más en muy poco tiempo.

martes, 17 de mayo de 2011

El futuro de Meego

Meego Logo

Con Meego 1.2 recién salido del horno resulta interesante pararse a pensar que le depara el futuro a este proyecto, en medio de una de las más interesantes guerras tecnológicas que se pueda recordar: la del control de los sistemas operativos que, además, tiene como principales batallas, en los últimos tiempos, la hegemonía en los móviles y en los tablets.

Cuando en Febrero se anunció a bombo y platillo la alianza entre Nokia y Microsoft una ola de pesimismo alcanzó a los que esperaban con curiosidad la llegada de algún dispositivo con este sistema. Tal vez era una opción mas lógica apostar por Meego para la gama alta y muchos acusan a Stephen Elop por esa decisión pero si el estaba en lo mas alto de la pirámide para poder decidir eso también pudo ser porque Nokia buscaba una aproximación a Microsfot.
Sea como fuere, resulta que estos días me ha dado por probar Meego y eso unido a la información que va llegando hace plantear lo siguiente:

¿Que va a hacer Nokia respecto a Meego?

Difícil de responder. Nokia no ha abandonado la plataforma, prueba de ello es que sigue animando a los desarrolladores mediante el envío de newsletters . Incluso hay dos concursos de aplicaciones en curso de cara al verano con los que colabora indirectamente.. La opción Meego para Nokia ha quedado como una posibilidad remota sobre la que se guarda silencio pero ya existen diversos rumores sobre planes B y ya veremos que pasa si la opción Windows Phone no resulta como se espera.Por otro lado estos días se está celebrando en San Francisco una conferencia y tanto Intel como Nokia están copatrocinándola.

Otro factor a tener en cuenta es que las ultimas versiones del SDK de QT (perteneciente a Nokia) incluye todo lo necesario para crear aplicaciones de Meego.

¿Que va a pasar con el proyecto Meego?

El apoyo a Meego no corre solo a cuenta de Nokia, Intel es el otro gran implicado y también ha redoblado su esfuerzo de comunicación en newletters desde el día siguiente al anuncio. No hay que olvidar que la alianza entre estas dos marcas no fue más que la fusión entre Maemo y Moblin. Si en su día Intel avanzaba con Moblin en solitario no va ha abandonar Meego aunque su compañero de camino no esté tirando del carro como se esperaba.Hay otros implicados como Novell que aporta los servidores repositorios de software y su Build Service.

La batalla de los móviles

Lo primero que hay que decir es que  Meego no sólo corre en teléfonos móviles, también en tablets,  PCs, dispositivos multimedia...  Además, ya existen dispositivos Meego como la tableta Webtab, el telefono de Nokia esta a punto de salir y es posible instalarlo en nettops y notebooks Atom. Hay mas dispositivos en camino, entre lo más recientemente anunciado estaría el netbook Asus Eee PC X101, el tablet Acer Iconia M500 y posiblemente pronto se anuncien más dispositivos por parte de LG y otros

 
Sin embargo es cierto que el futuro es menos esperanzador. El nicho de los móviles se esta poniendo muy caro debido a la apuesta de Nokia pero sobre todo por el tirón de iPhone y la inminente supremacía de Android. Es muy probable que tenga mas oportinidades en el sector de los tablets por la inmadurez del mercado y el inicio titubeante de Android.

Ecosistema

Meego posee todas las infraestructuras necesarias para competir, incluyendo el Garage (app store) Algo que me parece bastante importante es que tiene una dependencia ligeramente menor a un App Store que otros competidores ya que puede instalar aplicaciones Linux recompiladas. Se debería luchar por aumentar la comunidad de desarrolladores de aplicaciones que es escasa. Meego Garage esta un poco desolado hoy por hoy y las aplicaciones son lo que termina atrayendo al publico.  Pese a todo, Meego sigue siendo una opción valida. Tal vez no llegue a las masas como se creía hace unos meses pero los usuarios que accedan a uno de estos dispositivos no tendrán nada que envidiar al resto, bueno tal vez unos cuantos miles de aplicaciones, aunque esto podría quedar resuelto con el tiempo.

Pero, ¿que aporta Meego?

Meego da otra visión ligeramente diferente de lo que debe ser un entorno de usuario para un dispositivo de ocio. No deja de tener los mismos componentes que Android o iOS pero manejados desde su punto de vista. En la versión para notebooks, elementos como Myzone, zonas, aplicaciones, miniaplicaciones, etc. nos recordarán al panel principal, gestor de procesos, las pantallas con aplicaciones y los widgets de sus rivales. Todo igual y a la vez ligeramente distinto
.
 Meego panels

En su versión para tablets encontramos como elemento diferenciador el concepto de paneles, que permite un acceso rápido a las funciones más utilizadas por el usuario ya sean aplicaciones, elementos favoritos del navegador, acceso a redes sociales, etc. Además mantiene la posibilidad de mostrar las aplicaciones en una cuadrícula de iconos tal y como estamos acostumbrados en los últimos años.

Aplicaciones en Meego

Este precisamente uno de los principalesl factores a tener en cuenta: con cada versión de Meego se dispone de la misma para móviles, netbooks / tablets, dispositivos para vehículos... Cada una con sus particularidades en el entorno de usuario y a la vez con todo el núcleo en común.

El futuro inmediato

Meego debería sobrevivir. Sólo el apoyo de Intel debería garantizar esto, pero las cosas siempre son más complicadas de lo que parecen en un principio. La perdida de interés de Nokia ha hecho que aparezcan otros actores interesados, algunos animados por Intel en los últimos meses. Esto nos llevará a ver unos cuantos tablets y notebooks Meego de aquí al final del año. A partir de aquí mandarán las ventas. Estas marcas que experimentan con la introducción de este sistema en alguno de sus dispositivos, son las mismas que han probado con anterioridad Ubuntu o Andorid y que nunca han conseguido un número estable de ventas con sus experimentos. Sería muy agradable poder comprar un notebook o un sobremesa con Meego instalado, y por tanto un equipo Linux con garantía de fabricante ya que hoy por hoy es bastante difícil.

Para terminar, existen rumores de una posible compra de Nokia por parte de Microsoft creciendo en los últimos días. Eso dinamitaría definitivamente el apoyo de una de las partes y dejaría al fabricante de procesadores como único pilar del proyecto. Ahora bien si, además de la división de telefonía, Microsoft se hiciera con la que se responsabiliza del desarrollo de QT, el SDK de este sistema estaría en manos de uno de sus rivales y entonces ¿que pasaria con Meego?

sábado, 5 de marzo de 2011

El videoclub de mi barrio, la ley sinde, el canon, los pirtatas y los ladrones

Mira tú por dónde que yo era de los que iban al videoclub y además le gustaba. Digo iba porque hace más de un año que cerró el de mi barrio y fue entonces cuando empecé a explotar páginas como cinetube. Hasta entonces yo era de los que decía que no le valía la pena dejarse el PC encendido toda la noche por unos cuantos torrents, que por dos euros y medio tenia dos pelis en el videoclub. Me perdía por sus cuatro pasillos extasiado por tanta carátula, sin saber por cuál decidirme y maldiciendo a todo vecino que había alquilado cada una de las copias de una novedad que me apetecía ver.
Aprobada la ley Sinde me encuentro apurando, tal vez, mis días de descargas. No se sabe muy bien hasta que punto conseguirán cerrar estas webs o si sólo conseguirán que se hospeden en el extranjero. Lo único claro es que la comisión que velará por los derechos de aquellos que nos llaman ladrones desde sus residencias de Miami, no tendrá tiempo a formarse antes de verano.

Es del género estúpido que los mismos que pretenden que les compremos sus productos y nos convirtamos en sus fans nos llamen piratas, ladrones y otras lindezas semejantes ¿Podéis imaginar que el kioskero de vuestro barrio os insultase y a la vez intentara venderos una revista? Visto de otro modo, son ellos los que se apropian de nuestro dinero por cada DVD, disco duro, teléfono, etc que compramos ¿Es justo pagar a la SGAE por un DVD en el que grabo mis fotos o una distribución Linux? Personalmente algunos de ellos han pasado, para mi, de no significar nada o causarme una ligera simpatía, a la mas profunda repugnancia. Se llevan mi dinero y me llaman ladrón.

Aún así he intentado buscar algún servicio [1] [2] que opere desde la nueva legalidad, algo parecido a Netflix, de la que tanto se habla. Ninguno de los servicios que me he encontrado me ha merecido la pena. En mi viejo videoclub podía llegar a ver 8 películas al mes por 10 euros. La mejor tarifa plana que he encontrado es de 15 (creo recordar pero ya no la encuentro) y es incluso difícil que yo llegue a ver ese número de filmes. De los precios de películas sueltas mejor no hablo. Y por cierto, la calidad del streaming deja bastante que desear.

El resumen de todo esto viene a ser que nos llaman ladrones, piratas, nos ofrecen unos servicios abusivos, se protegen con unas leyes que ya veremos para qué sirven y por otro lado desean que los idolatremos y que consumamos. Remarco ahora lo de la utilidad de la ley, pues sirve igual para cerrar cinetube que para cerrar un blog aludiendo al perjuicio de los derechos de autor, sin que necesariamente se enlacen películas o música para descargar ¿Alguna vez has colgado un vídeo tuyo con una canción de fondo? ¿Has adornado un post con una foto o un logotipo que encontraste "googleando"? Pues ya sabes: eres carne de cañón para la ley Sinde.

Pese a todo, espero que alguno de ellos abra los ojos, que alguien innove con un servicio rompedor y que de una vez se proclame lo injusto del canon. Mientras tanto seguiré descargando alguna película de vez en cuando y alegrándome por haber elegido un servicio de hosting alemán para mi blog y el resto de mis webs.

sábado, 29 de enero de 2011

Creando binarios para linux con Open Suse Build Service. II Paquetes rpm

Después de ver de un modo general como funciona OBS intentaremos mostrar ahora el caso práctico de creación de RPMs para varias distribuciones.
Imaginemos que nuestra aplicación consta de un archivo binario y de un .desktop, es un caso sencillo ya que no contamos con archivos de traducción. Lo que tenemos que montar es un archivo de descripción .spec y un .tar.gz de nuestro código fuente.

Entorno de trabajo:

Si trabajamos con Subversion, o cualquier otro sistema de control de versiones, haremos un "commit" de todo nuestro proyecto antes de comenzar con la paquetización. Después de esto exportaremos una copia limpia de archivos ocultos a un directorio de trabajo diferente. Sobre esta nueva carpeta ya podremos crear nuestro tar.gz.
Tal como vimos en el capítulo anterior en nuestra cuenta en OBS habremos creado un proyecto, las distribuciones para las que se construirá  y el paquete correspondiente a la versión sobre la que estamos trabajando. Una vez hecho todo esto, para añadir nuestro código fuente navegamos hasta el paquete creado y seleccionamos la pestaña Sources, donde clicaremos sobre el botón Add files.


Se nos despliegará un formulario en el que podemos cargar, en este caso, nuestro código. Lo más cómodo es haber nombrado el tar.gz de la mejor manera posible, especificando la versión, y ahorrarnos el rellenar el campo nombre, de manera que OBS lo haga automáticamente. Más adelante podremos subir el .spec del mismo modo.


El archivo spec

Ahora toca montar el archivo spec con la información adecuada. Tenéis, a continuación,  todo el archivo apropiado para el proyecto de ejemplo. Después desgranaremos lo más importante a destacar:

%if 0%{?fedora_version}
%define breq qt4-devel
%define reqs qt qt-x11
%define qmake /usr/bin/qmake-qt4
%endif
%if 0%{?mandriva_version}
%define breq libqt4-devel qt4-linguist
%define reqs libqtcore4 libqtgui4
%define qmake /usr/lib/qt4/bin/qmake
%endif
%if 0%{?suse_version}
%define breq libqt4-devel
%define reqs libqt4 libqt4-x11
%define qmake /usr/bin/qmake
%endif
 
Name: RegExpTester
Summary: RegExpTester is an application that lets you test regular expresions
Version: 1.0
Release: 1
License: GPL v3
Group: Productivity/Utility/TextTools
BuildRoot: %{_tmppath}/build-root-%{name}
Source0: /usr/src/packages/SOURCES/RegExpTester-1.0.tar.gz
Packager: Guillermo Amat
Url: https://www.deuteros.es
Vendor: Guillermo Amat
 
BuildRequires: gcc-c++, make, %{breq}
Requires: %{reqs} libc.so.6 libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libm.so.6 libpthread.so.0 libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4)
%description
RegExpTester is an application that lets you test regular expresions
 
RegExpTester is an application that lets you test regular expresions
 
%prep
rm -rf %{buildroot}
mkdir %{buildroot}
 
%setup -q
 
%build
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_datadir}/%{name}
mkdir -p %{buildroot}%{_datadir}/applications
%{qmake} %{name}.pro
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \
make
 
%install
cp %{name} %{buildroot}%{_bindir}
cp %{name}.png %{buildroot}%{_datadir}/%{name}/
 
cat > $RPM_BUILD_ROOT%{_datadir}/applications/%{name}.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=%{name}
GenericName=%{name}
GenericName[de]=%{name}
Comment=Synchronize files between computers
Exec=%{_bindir}/regexptester
Icon=%{_datadir}/%{name}/%{name}.png
Terminal=false
Type=Application
StartupNotify=false
Categories=Qt;KDE;Utility;TextEditor;
EOF
 
%clean
rm -rf %{buildroot}
 
%files
%defattr(-,root,root)
%dir %{_datadir}/RegExpTester
%{_datadir}/applications/RegExpTester.desktop
%{_bindir}/RegExpTester
%{_datadir}/%{name}/%{name}.png
 
%changelog


Menudo rollo ¿no? Pues vamos a destriparlo paso a paso para que se entienda mejor:
El primer bloque se corresponde con una serie de declaraciones condicionales que dependerán de la maquina virtual en la que OBS ejecute la construcción del rpm.


%if 0%{?fedora_version}
%define breq qt4-devel
%define reqs qt qt-x11
%define qmake /usr/bin/qmake-qt4
%endif
%if 0%{?mandriva_version}
%define breq libqt4-devel qt4-linguist
%define reqs libqtcore4 libqtgui4
%define qmake /usr/lib/qt4/bin/qmake
%endif
%if 0%{?suse_version}
%define breq libqt4-devel
%define reqs libqt4 libqt4-x11
%define qmake /usr/bin/qmake
%endif


Por ejemplo, en los requisitos de construcción (breq) para Mandriva y Opensuse se necesitará el paquete libqt4-devel, mientras que el equivalente en Fedora recibe el nombre qt4-devel. OBS instalara el paquete adecuado en cada máquina virtual gracias a eso. En todo caso para cada una de las distribuciones definimos tres variables que usaremos mas tarde:
  • breq: requisitos para la construcción
  • reqs: dependencias para la ejecución de nuestro programa en el PC del usuario que se lo instale
  • qmake: ruta al ejecutable qmake
El siguiente bloque que nos encontramos es el de la información general de nuestra aplicación.  Aquí y en todo el fichero spec hay que tener cuidado con los saltos de línea y en concreto aquí  con no equivocarse con el valor del campo source0. Además, parte de esta información será mostrada al usuario en el gestor de paquetes de su distribución:
Name: RegExpTester
Summary: RegExpTester is an application that lets you test regular expresions
Version: 1.0
Release: 1
License: GPL v3
Group: Productivity/Utility/TextTools
BuildRoot: %{_tmppath}/build-root-%{name}
Source0: /usr/src/packages/SOURCES/RegExpTester-1.0.tar.gz
Packager: Guillermo Amat
Url: https://www.deuteros.es
Vendor: Guillermo Amat
BuildRequires: gcc-c++, make, %{breq}
Requires: %{reqs} libc.so.6 libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libm.so.6 libpthread.so.0 libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4)
%description
RegExpTester is an application that lets you test regular expresions
 
RegExpTester is an application that lets you test regular expresions  

En el bloque anterior también se aprecia la aparición de las variables que hemos definido con anterioridad. Su valor se concatena al de los nombres de los paquetes que aparecen definidos. Más claro: BuildRequires contiene gcc-c++ y make porque se llaman así en todas las distribuciones (menos mal) y el contenido de la variable breq que cambia en función de la máquina virtual.
En description tenemos una descripción corta y otra que puede ser más extensa. La linea en blanco que separa a ambas es necesaria.
Vamos con el siguiente trozo. Esto ya tiene que ver con la construcción del paquete y en el aparecen nuevas variables. La diferencia es que estas no son nuestras, sino predefinidas por el sistema:
  •  buildroot: el directorio donde se construirá el paquete en la MV
  • _bindir: el directorio de los ejecutables
  • _datadir: directorio de datos
  • name: es el nombre que aparece en el campo Name (linea 17 del .spec)
Así pues lo que se hace en este bloque es preparar todos los directorios necesarios. Después se ejecuta qmake sobre el archivo .pro cosa que creará el Makefile en la MV. La siguiente linea contiene opciones de compilación específicas para la creación de rpms que, a su vez, son usadas por el comando make.
Después de ejecutar make se procede con la sección install que, en este caso, copia un par de archivos en sus lugares correspondientes.

%prep
rm -rf %{buildroot}
mkdir %{buildroot}

%setup -q

%build
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_datadir}/%{name}
mkdir -p %{buildroot}%{_datadir}/applications
%{qmake} %{name}.pro
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \
make

%install
cp %{name} %{buildroot}%{_bindir}
cp %{name}.png %{buildroot}%{_datadir}/%{name}/


 En el siguiente bloque se crea el archivo .desktop que hará que nuestro programa aparezca en el menú de inicio de KDE. No es necesario crearlo así, podríamos haberlo escrito en un editor, empaquetado en el tar.gz y por último tratarlo en el .spec de la misma forma que al png. En todo caso, se debe saber que durante la construcción se comprobará este archivo y que es muy importante que el contenido de Categories siga las definiciones del estándar de freedesktop.org 
cat > $RPM_BUILD_ROOT%{_datadir}/applications/%{name}.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=%{name}
GenericName=%{name}
GenericName[de]=%{name}
Comment=Synchronize files between computers
Exec=%{_bindir}/regexptester
Icon=%{_datadir}/%{name}/%{name}.png
Terminal=false
Type=Application
StartupNotify=false
Categories=Qt;KDE;Utility;TextEditor;
EOF 

Y para acabar se define el paso de limpieza y se enumeran los archivos generados para la creación del paquete. Cualquier inconsistencia entre esta lista y lo que se encuentre realmente generará un error, por ejemplo: si nuestro tar.gz contiene un segundo png que no hayamos nombrado aquí.


%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root)
%dir %{_datadir}/RegExpTester
%{_datadir}/applications/RegExpTester.desktop
%{_bindir}/RegExpTester
%{_datadir}/%{name}/%{name}.png

%changelog

El archivo tar.gz

Como se ha dicho antes, lo mejor es generar el tar.gz desde una copia limpia de nuestro código fuente. Si trabajamos con Subversion haremos un "svn export" y después comprimiremos el resultado.
A parte de eso, habrá que llevar cuidado con incluir todo lo necesario y especificar correctamente las rutas de todo lo que aparezca en el .spec

El resultado

Si todo va bien en nuestro panel de resumen del paquete tendremos indicado que el proceso ha finalizado con éxito y podremos navegar hasta el repositorio de descarga de cada una de las distribuciones.


 Si por ejemplo pulsamos sobre openSuse_11_3 llegaremos a la página donde tenemos todos sus binarios disponibles:


Si algo falla, desde la pantalla de resumen veremos que se nos indica un error (failed en vez de success) y haciendo clic sobre la palabra failed accederemos al log de la máquina virtual donde veremos el error.

Una imagen vale más que mil palabras

Y un par de enalces y de archivos de ejemplo también, así que allá va:

jueves, 20 de enero de 2011

Un tutorial rápido de QT: evaluador de expresiones regulares

Estaba dándome cabezazos contra la mesa el otro día porque no conseguía hacer funcionar una expresión regular en el código de Acid Rain sin encontrar la explicación. La situación me llevaba casi a la decepción por haber olvidado toda esa teoría cuando se me ocurrió buscar alguna web donde probar lo que hacía. Al encontrarla me di cuenta de que no era tan mentecato, algo fallaba ya que la expresión regular funcionaba. Tan loco me estaba volviendo que decidí hacer una aplicación en QT en donde testar de forma rápida las expresiones, ya que con la que estaba trabajando realmente me costaba un poco llegar al punto donde se evaluaba la expresión.


Y así fue que me puse a hacer una aplicación muy parecida a la web que he comentado antes. En poco más de cinco minutos la tenía hecha y se me ocurrió que sería un buen ejemplo para iniciarse en QT. Es tan sólo un poco más complicado que un "Hola mundo" y de paso se ve como utilizar aspectos esenciales de QT Creator, signals/slots y cómo trabajar con la disposición de los elementos en un formulario. ¡Vamos al tema!

Creando el proyecto

 Lo primero será crear el proyecto eligiendo "QT C++ Project" y como subopción  "QT GUI Application"


 Ahora le damos un nombre apropiado a la aplicación y apretamos sobre "Next"


 Como se nos crea un formulario, debemos definir su nombre y el de la clase asociada al mismo


En cuanto a la creación del proyecto sólo nos queda aceptar el resumen.


Lo que queremos hacer

Lo que nos interesa es tener un texto sobre el que queremos hacer alguna prueba, usando una expresión regular para reemplazar parte del él por otro texto determinado. Así pues necesitaremos unos cuantos campos etiqueta, tres campos de entrada y uno de salida.
Los campos de de entrada serán: el de la expresión regular, el de la cadena que queremos introducir y el del texto inicial sobre el que trabaja. Para los dos primeros campos nos bastará con un "line edit" mientras que para el texto usaremos un "text edit". El resultado lo mandaremos a otra caja de texto ("text edit") de salida que tendrá marcada la propiedad "read only".
En cuanto le demos al botón "Test"  se evaluará la expresión regular y, para hacerlo mas emocionante y poder probar más rápido nuestras expresiones, también se evaluará con cada cambio que hagamos en el campo de entrada de la expresión, con lo que veremos los resultados al vuelo mientras la escribimos.
En cuanto a la disposición de los elementos, usaremos dos frames para agrupar por un lado los campos del formulario y por otro el botón "Test".

Insertando los elementos de la ventana

Lo primero que haremos será insertar los dos frames, arrastrándolos a la ventana.


Lo segundo debe ser elegir la disposición de la ventana (hay que asegurarse de que está seleccionada), en este caso le daremos una disposición vertical "Layout vertically"


Es el momento de darle vida a todo esto. En el marco superior dejamos caer cuatro campos "label", los dos "line edit" y los dos "text edit"


Ahora hay que seleccionar el marco superior y después pinchar sobre "Lay out in a form layout". Todavía no quedará muy bonito asi que habrá que corregir  la posición de los elementos. También podemos redimensionar un poco el formulario haciendo uso del ratón para que no quede todo tan ahogado en cuanto espacio.
Vamos con el marco inferior: hay que añadir un "Push Button",  después seleccionar "layout horizontally" para el marco y finalmente añadirle un espaciador horizontal.


El siguiente paso es cambiar el texto que muestran las etiquetas y el botón y darle un nombre correcto a cada uno de ellos para que sea más intuitivo utilizarlos desde el código. Los nombres podrían ser estos (según el orden del formualrio):
lblRegEx | leRegEx 
lblReplace | leReplace 
lblText | teText
lblResult | teResult
         pbTest
Aprovecharemos para seleccionar teResult y marcar la propiedad "read only"


Jugando con los slots

No voy a entrar mucho en esto, tan solo una breve explicación. En QT la comunicación entre objetos se hace mediante signals  y slots. Por un lado hay determinados eventos de los objetos que lanzan señales (al hacer clic sobre un botón, al cambiar el texto en un campo de texto, etc) Por otro lado los objetos también tienen asociadas una serie de funciones llamadas slots cuya finalidad es ser receptoras de señales de otros objetos ( por ejemplo setText(QString) en un campo text edit). Uniendo ambas cosas podemos hacer que al hacer clic sobre un boton "clear" se borre todo el contenido de una caja de texto.
Volvamos a lo nuestro. Seleccionando el botón "Test", apretamos el botón derecho de nuestro ratón para obtener el menú contextual y buscamos la opción "Go to slot..."


Se nos abrirá una ventana en la que elegiremos la señal clciked() y se nos creará automáticamente la cabecera y el cuerpo vacío de un slot llamado "on_pbTest_clicked". Internamente ya se ha relacionado la señal "clicked" con el nuevo slot, así que sólo tendremos que añadir el código que queramos al mismo (cosa que haremos luego) y este se ejecutará al pinchar el botón en nuestra aplicación.


Lo anterior sirve cuando es un objeto  llamándose a si mismo, pero ¿cómo hacemos algo similar entre dos objetos distintos? Pues ahora lo vemos, recordemos antes que queríamos evaluar la expresión al vuelo mientras la escribíamos así que vamos a relacionar la señal "textChanged" del campo leRegExp con la ranura "clicked" del botón pbTest. Para ello nos vamos al modo de edición "edit signals/slots" mediante f4 o haciendo uso del botón de la parte superior de QT Creator. Una vez cambiado el modo, arrastramos el ratón desde el campo de entrada hasta el botón y se nos abrirá una nueva ventana de selección. En la izquierda escogemos la señal "textChanged" y en la derecha el slot "click", aceptamos y los tendremos ya relacionados. Esto quiere decir que cuando haya cualquier cambio en la expresión regular será a todos los efectos, como si pulsásemos el botón "Test" con lo que se irá evaluando al vuelo.


Un poquito de código

Bueno, ya tenemos todo relacionado pero esto todavía no hace nade de nada. Vamos a insertar el código, para ello abrimos el archivo "regextextwindow.cpp" y buscamos la función que QT Creator nos ha insertado. Bastará con dejarla así:

void RegExTestWindow::on_pbTest_clicked()
{
 ui->teResult->setText(ui->teText->toPlainText().replace(QRegExp(ui->leRegExp->text()),ui->leReplace->text()));
}

Lo que significa que asigne como texto del campo "teResult" lo obtenido al reemplazar en el texto de prueba que hemos dejado en "teText" todo lo que encaje con la expresión regular contenida en "leRegExp". Todo lo que encaje con la expresión se sustituye por el valor de "leReplace"
¡Ya está!
Pues si todo ha ido bien  le damos al botón de ejecución y se nos lanzará la apliación. Sólo nos queda desengrasar nuestros conocimientos en expresiones regulares :) Cuando tenga un rato colgaré el código fuente y la aplicación en esta web para los más perezosos.

Sobre mi estupidez

Tal vez os hayáis quedado pensando en lo que contaba al principio del post. Resulta que cuando probé la expresión en la aplicación test la cosa funcionaba. Así que tenía lo siguiente: funcionaba en la web, funcionaba en el testador y fallaba en mi código. Cuando pasan cosas así siempre piensas lo mismo "tiene que ser una estupidez como un piano" Efectivamente así era, no se me había pasado por la cabeza el escapar el carácter de escape, que perogrullada más infernal.
Una expresión valida como \s\d+/\d+\s escrita en código es \\s\\d+/\\d+\\s
Perder tanto tiempo con una tontería semejante suele llevarme, cuando encuentro la solución, al segundo pensamiento típico: "que empanado que estoy"