Planeta GNOME Hispano
La actividad Hispana de GNOME 24 x 7

04 de febrero de 2016

Puente Johnson de noche

Puente Johnson Puente Johnson de noche. Victoria, British Columbia, Canadá.

01 de febrero de 2016

Web Engines Hackfest according to me

And once again, in December we celebrated the hackfest. This year happened between Dec 7-9 at the Igalia premises and the scope was much broader than WebKitGTK+, that’s why it was renamed as Web Engines Hackfest. We wanted to gather people working on all open source web engines and we succeeded as we had people working on WebKit, Chromium/Blink and Servo.

The edition before this I was working with Youenn Fablet (from Canon) on the Streams API implementation in WebKit and we spent our time on the same thing again. We have to say that things are much more mature now. During the hackfest we spent our time in fixing the JavaScriptCore built-ins inside WebCore and we advanced on the automatic importation of the specification web platform tests, which are based on our prior test implementation. Since now they are managed there, it does not make sense to maintain them inside WebKit too, we just import them. I must say that our implementation is fairly complete since we support the current version of the spec and have almost all tests passing, including ReadableStream, WritableStream and the built-in strategy classes. What is missing now is making Streams work together with other APIs, such as Media Source Extensions, Fetch or XMLHttpRequest.

There were some talks during the hackfest and we did not want to be less, so we had our own about Streams. You can enjoy it here:

You can see all hackfest talks in this YouTube playlist. The ones I liked most were the ones by Michael Catanzaro about HTTP security, which is always interesting given the current clumsy political movements against cryptography and the one by Dominik Röttsches about font rendering. It is really amazing what a browser has to do just to get some letters painted on the screen (and look good).

As usual, the environment was amazing and we had a great time, including the traditional Street Fighter‘s match, where Gustavo found a worthy challenger in Changseok :)

Of course, I would like to thank Collabora and Igalia for sponsoring the event!

And by the way, quite shortly after that, I became a WebKit reviewer!

19 de enero de 2016

Ruby On Rails

Según me han comentado Ruby es una especie de Perl simplificado con una buena orientación a objetos, algo como Python pero con una sintaxis más similar a la de Perl.

Supongo que lo primero será instalar en mi servidor Ruby On Rails que supongo que consistirá en el lenguaje de programación Ruby junto con un entorno de ejecución (librerías, ficheros de configuración, componentes …).

En Debian tenemos el paquete rails que diría tiene todo lo necesario: «Rails is a full-stack, open-source web framework in Ruby for writing real-world applications.». El paquete no parece estar disponible en Debian Sarge así que haremos un paquete desde la versión inestable de Debian (backport). Ha sido realmente sencillo: ruby y las librerías de Debian Sarge valen para rails. Sólo he tenido que instalar una versión más moderna de rake con respecto a la que viene en Debian Sarge (haciendo un backport) y tras ello, he podido hacer el paquete de rails para Debian Sarge.

Como me ocurre siempre, el vídeo en Totem no se ve. Utilicemos mplayer. El vídeo es un poco grande y ha sido grabado en un escritorio MacOS X. Para poderlo ver de forma cómoda voy a reproducirlo a pantalla completa en 1024×768.

acs@delito:~$ mplayer -fs

Será esencial la tecla de pausa para irlo siguiendo paso a paso. Las primeras impresiones es que al crearte una aplicación rails por defecto, se crean un montón de ficheros que serán la infraestrutura de la aplicación y que son los que nos ahorrarán el escribir mucho código. De momento no nos ha tocado tener que escribir Ruby, pero seguro que algo nos tocará ;-)

Para crear el esqueleto básico de una aplicación rails:

acs@macito:~/devel/rails$ rails testRails
      create  app/controllers
      create  app/helpers
acs@macito:~/devel/rails$ sloccount testRails/
WARNING! File /home/acs/devel/rails/testRails/script/plugin has unknown start: #!/usr/bin/env ruby
SLOC    Directory       SLOC-by-Language (Sorted)
36      config          ruby=36
7       test            ruby=7
4       app             ruby=4
4       public          ruby=4
Totals grouped by language (dominant language first):
ruby:            51 (100.00%)

Vemos que tampoco se generá mucho código Ruby de forma automática, algo que sin duda es bueno (aunque sloccount ha fallado al contar en varios directorios, pero tras mirar a mano, parecen sólo unas 30 líneas de Ruby).

Por defecto dentro de cada aplicación Rails existe el fichero “README” que cuenta lo básico sobre como poner en marcha la aplicación y una descripción de los contenidos. Y también se incluye un servidor de web que ejecuta la aplicación rails. Para iniciarlo basta con:

acs@macito:~/devel/rails$ testRails/script/server
=> Booting WEBrick...
=> Rails application started on
=> Ctrl-C to shutdown server; call with --help for options
[2006-02-20 05:41:51] INFO  WEBrick 1.3.1

En el puerto 3000 de la máquina donde estamos ejecutando el servidor tenemos ya el servidor de rails funcionando. Pero aún no hemos hecho nada así que no hay gran cosa aún en él, salvo documentación de más pasos en el camino. En general da la impresión de que está todo rails muy trabajado para llevar de la mano al desarrollador durante todo el proceso.

Los siguientes pasos siguiendo la página web por defecto son los de crear la base de datos, configurarla en nuestra aplicación rails y utilizar el programa “script/generate” para generar los modelos y controladores de los datos en la base de datos, justo el proceso que se sigue durante el vídeo.

30 de diciembre de 2015

Frogr 1.0 released

I’ve just released frogr 1.0. I can’t believe it took me 6 years to move from the 0.x series to the 1.0 release, but here it is finally. For good or bad.

Screenshot of frogr 1.0This release is again a small increment on top of the previous one that fixes a few bugs, should make the UI look a bit more consistent and “modern”, and includes some cleanups at the code level that I’ve been wanting to do for some time, like using G_DECLARE_FINAL_TYPE, which helped me get rid of ~1.7K LoC.

Last, I’ve created a few packages for Ubuntu in my PPA that you can use now already if you’re in Vivid or later while it does not get packaged by the distro itself, although I’d expect it to be eventually available via the usual means in different distros, hopefully soon. For extra information, just take a look to frogr’s website at

Now remember to take lots of pictures so that you can upload them with frogr :)

Happy new year!

29 de diciembre de 2015

Sonic Pi packaged for Fedora

Maybe you know about Sonic Pi, the system to learn programming playing with music. Now I want to give it a try in my system (Fedora 23) and my sysadmin-TOC syndrome obligues me first to package it into RPM. Now I have good and bad news. The good news are I have a testing release of Sonic Pi for Fedora 23. It includes a desktop file too. The bad news are... it doesn't work yet. Sonic Pi uses jackd while a common Fedora Workstation uses pulseaudio and both try to manage the sound device by themselves.

After a quick googling seems possible to get a procedure for using some working configuration for puleaudio+jackd but I didn't have the time to find and check them. Meanwhile, if the RPM package is useful for someone here it is.

This package depends of Supercollider as provided by Planet CCRMA package repository. To use this Sonic Pi maybe you'll want to add the repository to your system.

Please feedback here if you know how to make sound to work.

PD: Post edited to add references to Planet CCRMA repositorie.

Running EPF (Eclipse Process Framework) in Linux

For many time I wanted to learn to use EPF but technical reasons always stoped me. Blame me because I'm not an Eclipse guy and I'm not into its eclipse-isms but until today I have not been able to launch it. Now, wirth this really simple recipe you'll be able to run it.

Initial technical scenario:

Then unzip the file and execute:

$ unzip
$ cd epf-composer
[epf-composer]$ ./epf
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /home/olea/epf-composer/plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.2.R36x_v20101019_1345/ which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.

(Epf:27092): Gtk-WARNING **: Unable to locate theme engine in module_path: "adwaita",

(Epf:27092): Gtk-WARNING **: Unable to locate theme engine in module_path: "adwaita",
Gtk-Message: Failed to load module "pk-gtk-module"
Gtk-Message: Failed to load module "canberra-gtk-module"

If you, like me, don't know nothing about Eclipse maybe you are doomed because the real problem is everything but clear. What you are having is the EPF application asking for a 32 bits java VM runtime. Nothing more, nothing less. But now is very easy to fix:
  1. just get a 32 bits java VM
  2. adjust epf-composer/epf.ini to use it
In my case I've installed a Java 1.7 (in my case from the same Russian Fedora repo):

and then change ~/epf-composer/epf.ini from this:


to this:


Please note the precise path may be different in your system but in any case it should point to a 32 bit java binary.

Then you just need to launch EPF and you are ready:

$ epf-composer/epf


24 de diciembre de 2015


Ahora mismo queda ya bastante claro de la FAQ de OpenJDK, la comunidad formada por SUN para desarrollar las versiones libre de Java, que casi todo JDK 6 es ya software libre aunque quedan algunas partes que aún están pendientes.

Presentación del estado de OpenJDK en Fosdem 2008 que muestra las partes que aún no son libres de JDK y que coinciden con las que se mencionan en la FAQ:

Graphics rasterizer
Font rasterizer
Imaging APIs
Sound engine
Crypto providers
Some SNMP code

 Fully buildable != fully free
     25,169 source files
894 (4%) binary only (“plugs”)


Las partes que aún no son software libre quedan claras en la FAQ:

What are the encumbered components in the JDK (Java SE)?
The larger encumbered components requiring binary files for a full build include the font rasterizer, the graphics rasterizer, and the sound engine. Smaller components include some cryptographic algorithms, some SNMP code, and some of the imaging APIs.


y las presentaron el equipo de SUN dentro del FOSDEM en la sala de Free Java. Son las partes de JDK que están calificadas como “encumbered” y que tienen problemas para ser publicadas con licencia GPLv2.

Imaging APIs van a dejar de ser problema en breve (Marzo 2008).

Módulos que ya son software libre

Las partes de JDK (Java SM) que ya son software libre son:

In November 2006, Sun open sourced the Java programming language compiler ("javac"), and the Java HotSpot virtual machine. In addition, Sun open sourced the JavaHelp 2.0 extensible help system, Sun's reference implementation of JSR 97.

The following components are newly open sourced under GPL version 2 plus the Classpath Exception:

    * Core libraries
    * Networking libraries
    * Security libraries
    * Serviceability libraries
    * Internationalization libraries
    * 2D graphics subsystem
    * AWT, the Abstract Windowing Toolkit
    * Swing GUI toolkit
    * Sound subsystem
    * Various tools, including JConsole and javadoc

the exception of a few encumbered components that we hope, with the community's help, can be re-implemented so that 100% of the OpenJDK code commons is available as free software.


Guía del Desarrollador de OpenJDK

Guía para el que quiere ser desarrollador de OpenJDK

Comunidad OpenJDK 6 (objetivo similar a Iced Tea, OpenJDK 6 totalmente libre)

Construyendo OpenJDK desde las fuentes

Una de las actividades que quiero llevar a cabo es construir todo JDK desde las fuentes. Para ello lo mejor parece ser comenzar con NetBeans aunque intentaré hacerlo todo desde un terminal a la vieja usanza.

El IDE para Java

De momento tengo idea de seguir con mis terminales y vi/emacs para editar en Java. Pero quizá en el medio plazo acabe utilizando Eclipse, NetBeans o quien sabe, Monodevelop y su extensión para Java. El IDE comercial mejor considerado en Liferay es IntelliJ IDEA pero haré lo posible por huir de tecnologías privativas.

El proyecto Iced Tea

En Red Hat han lanzado el proyecto Iced Tea para «que el software OpenJDK publicado por Sun Microsystems como software libre en 2007 sea usable sin que sea necesario ningún otro software que no sea software libre». En SUN tiene un objetivo similar en OpenJDK así que no sé cuanto de sentido tiene este proyecto. Aunque siempre está bien que haya diversas comunidades con diversos intereses cuidando de la libertad de las cosas. En Iced Tea se puede ver bien las partes no libres que quedan en JDK (Java SE), como un 4%.

«IcedTea is not a fork, and is not meant to be a permanent project – just a stopgap measure to create a fully FOSS OpenJDK. »

Utilizando Javascript en Java

Con el motor de Javascript Rhino se pude integrar en desarrollos Java partes hechas en Javascript fácilmente. Javascript está en auge con la llegada de la Web 2.0 y futuras evoluciones, así que podría ser un lenguaje de scripting muy adecuado para los programas en Java.

Tecnologías Java

Dentro de las tecnologías Java que hay que manejar en Liferay tenemos Spring, Struts, Hibernate, Java Faces, jQeury o Velocity. A parte de profundizar en todas ellas me interesa a día de hoy explorar en profundidad el uso de genéricos en Java, un diseño que también se utiliza en C#.


Generics está disponible desde la versión Java SE 5.0. En C++ se conocen como “Templates” y la idea básica es definir tipos de datos, clases, que reciben como variables los tipos de datos con los que trabajan. En vez de tener contenedores genéricos de objetos (Object) en los que se puede meter cualquier tipo de clase pero que obliga a hacer un “casting” luego de sacar el objeto genérico a la clase que metismo, los genéricos permiten especificar que estamos creando una lista para guardar un determinado tipo de datos.

List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3

pasa a ser

List<Integer> myIntList = new LinkedList<Integer>(); // 1’
myIntList.add(new Integer(0)); //2’
Integer x = myIntList.iterator().next(); // 3’


Máquinas virtuales en el servidor


Mi principal motivación a la hora de montar máquinas virtuales en mi servidor de casa es la de aprender a trabajar con los nuevos entornos virtuales, que aportan mayor seguridad (puedes dar por ejemplo clave de root en una máquina virtual de pruebas sin problemas), son más flexibles (puedes tener diferentes sistemas corriendo en el mismo hardware) y diría que hasta más sostenibles (menos hardware necesario). Además, es un campo de avance de la tecnología que abre posibilidades muy interesantes en sistemas distribuidos (migración de máquinas virtuales entre máquinas físicas, balanceo de carga, recuperación rápida ante fallos …).

En resumen, que son múltiples las ventajas de usar máquinas virtuales y merece la pena invertir un poco de esfuerzo en terminar de aprenderlas bien.

Nos referimos a máquinas virtuales a nivel de sistema que emulan por completo el hardware y permiten ejecutar sobre ellas sistemas operativos completos sin modificar, y no las máquinas virtuales de aplicaciones como por ejemplo Java.

Tecnologías de virtualización

No voy de momento a realizar un estudio de las diferentes alternativas que hay para la virtualización. De momento voy a tirar por Xen que es lo que ya conozco y una de las tecnologías libres más pujantes. A día de hoy ya hay otras opciones, tanto privativas como libres. Una de las que se oye hablar bastante últimamente es Virtual Box que en su versión básica es GPL.

Instalación de Xen en micro con soporte VT

Tras leer con detenimiento la información sobre máquinas virtuales en la Wikipedia, el objetivo es lograr explotar las capacidades que tienen los micros de Intel a nivel de hardware con la Virtualization Technology. Esta se puede explotar a partir de Xen 3.0 y permite correr diferentes sistemas operativos sobre el mismo hardware con un soporte más completo. Anterior a esto Xen era tecnología de paravirtualización, en la que se corrían diferentes sistemas operativos sobre el mismo hardware, pero con limitaciones. Con Xen 3.0 e Intel VT ya se puede correr por ejemplo Windows en Xen como sistema invitado. Como sistema hypervisor (virtual machine monitor) en nuestro caso usaremos una versión modificada de Linux, que será el domain0 en terminología Xen. Los sistemas invitados que corren sobre el hypervisor (dom0) se conocen como domain U (domU).

Por lo tanto, en mi portátil con soporte VT y Xen 3.0, podré tener como dom0 a Ubuntu y como uno de los domU a Windows, u otros Linux. En este sentido gracias a VT, Xen pasa a estar al nivel de emulación que VMWare. Anteriormente los domU sólo podían ser sistemas Linux y no sé si algún que otro Unix.

Nada mejor que utilizar la información de Xen del Wiki de Ubuntu. Aunque como suele pasar, está un poco anticuada (información para 8.04) y por ejemplo, no hace referencia a VT para nada. Pero sigamos lo que dice para tener nuestro sistema base corriendo como dom0 de Xen.

apt-get install ubuntu-xen-server
Se instalarán los siguientes paquetes NUEVOS:
  bridge-utils debootstrap libc6-xen libconfig-inifiles-perl libtext-template-perl libxen3 linux-image-2.6.24-19-xen linux-image-xen linux-restricted-modules-2.6.24-19-xen
  linux-restricted-modules-xen linux-ubuntu-modules-2.6.24-19-xen linux-xen python-dev python-xen-3.2 python2.5-dev ubuntu-xen-server xen-docs-3.2 xen-hypervisor-3.2 xen-tools

Con esto nos instala un nuevo núcleo (linux-image-2.6.24-19-xen) que incluye el hypervisor y que pasará a ser el dom0 de Xen. Se instala la versión Xen 3.2. Lo instalamos … y reiniciamos el sistema con este nuevo núcleo de Linux. Ya estamos dentro del dom0 de Xen. En realidad el dom0 debería de ser un sistema mínimo sobre el que correr los sistemas invitados, pero en mi caso de momento es todo el sistema completo com el escritorio GNOME y demás. Si veo que todo va muy bien, quizá piense en una reinstalación.

Después de reinicar el núcleo no funciona en el arranque dando un error que por suerte ya está estudiado en launchpad. El problema diría que es hald ya que lo da con el proceso hald-runner, que interactúa a bajo nivel con el hardware (hardware abstraction layer). He puesto un comentario y de momento no hay solución al bug. Y lleva ya varios meses. Diría que es la combinación con SMP, Xen y VT. De momento dejo un poco parado todo aquí :(

Montando todo sobre un Mac Mini

La idea de montar virtualización sobre un mac mini para utilizarlo como servidor ya ha ha sido cubierta en la red utilizando Xen. Vamos a partir de ella.

Como hacerlo bien

  • Instalar como dom0 un sistema mínimo con sólo ssh para poder acceder a él.

Puntos de trabajo

  • Virtualización software o completa con soporte del hardware (Xen 3.0 y extensiones del micro)

22 de diciembre de 2015



Bienvenido a este viaje apasionante por las entrañas de GNU/Linux. A lo largo de este artículo vas a aprender como funciona el corazón de GNU/Linux, y como has de configurarlo para que se adapte lo mejor posible a lo que tú quieres y necesitas, para obtener lo mejor de tú máquina.

Y todo lo haremos pensado que en estos momentos aún no eres ningún experto, por lo que te contaremos las cosas lo más claras posibles, guiandote para que en ningún momento te encuentres perdido. Y sabes que si en algún momento hay algo que te sorprende o no captas su significado, puedes acudir a las referencias que iremos citándote a lo largo de todo el artículo.

Ha llegado el momento de que busques un rato lipe, en el que no te molesten, y te lances a la lectura de este artículo que esperamos que te permita entender mejor lo que pasa en el interior de tú máquina

Seguro que si has comprado esta revista ya sapás que es GNU/Linux y posiblemente lo tendrás ya instalado en tú ordenador. Y si no es así quizás sea un buen momento para hacerlo, ya que será indispensable para que puedes comprender y seguir lo que te vamos a contar en este artículo.

Antes de que apareciera GNU/Linux no era tan común oir la palapa “kernel” (cuya traducción al español es núcleo). Al usuario final de la máquina se le daba el sistema operativo de tal forma que, la existencia de este componente muchas veces solo se reflejaba cuando se colgaba la máquina (el famoso fallo de protección general en kernel.dll). Era un elemento común a todos los usuarios y sólo se podía adaptar a cada tipo de hardware a través de los conocidos drivers (manejadores de dispositivos)

Con la llegada de GNU/Linux y su expansión (somos ya entre 8 y 9 millones de usuarios y subiendo a un ritmo anual superior al 20%) es común que se hable de este componente.

El kernel del sistema operativo es la parte fundamental del mismo ya que, se encarga de controlar todas las piezas de nuestra máquina, haciendo que dichas piezas formen un equipo que proporciona al usuario una máquina útil con la puede hacer muchas cosas diferentes: gestionar su negocio, navegar por todo el mundo a través de Internet, grabar sus maquetas de música, editar sus grabaciones de video …

Es el kernel el que se encarga de abstraer las comunicaciones con los dispositivos (la tarjeta de video o de sonido, la controladora del disco duro, la unidad ZIP enchufada al puerto paralelo …), la gestión de interrupciones, la coordinación para compartir los recursos entre diferentes aplicaciones que se ejecutan a la vez …

Esperamos que ya te hayas hecho una idea de la importancia del kernel y de su enorme complejidad, y posiblemente hapás podido llegar a una conclusión nada alejada de la realidad: “el kernel es el sistema operativo”.

El kernel es realmente lo que hace que tú maquina sea algo operativo y funcional, aunque ciertas compañías nos intenten hacer creer que los navegadores de Internet son también parte del sistema operativo.

Dejando a un lado esta discusión, la cual hoy por hoy no tiene ninguna conclusión clara y compartida por todo el mundo informático, vamos a continuar con nuestro viaje. Hapás podido observar pues que el kernel es lo que ha permitido a los desarrolladores software olvidarse del hardware en el que van a funcionar sus programas, al menos del 99% de dicho hardware, y centrarse en hacer aplicaciones cada día más complejas y potentes. Son este tipo de abstracciones las que permiten que las tecnologías avancen.

Rogamos al lector que piense por ejemplo en la abstracción de las comunicaciones que ha supuesto HTTP (el protocolo que se utiliza en el WWW) y el lenguaje HTML. Los desarrolladores se han podido olvidar, de nuevo en el 99% de los casos, de como se comunican los clientes y servidores. Esta abstracción ha llevado a una situación el la que es trivial desarrollar aplicaciones cliente/servidor, presentar información en Internet … y es esta sencillez la que ha permitido la explosión de Internet.

Por lo tanto podemos decir que: “el kernel permite al desarrolador olvidarse de como se gestionan los recursos hardware y centrarse en resolver los problemas que se presentan a su aplicación.”.

Y quizás haya llegado el momento de plantearse: ¿ cómo un software tan complejo y que require tanto trabajo ha podido ser desarrollado en el tiempo de lipe de programadores ?. Y quizás una pregunta que aún nos pueda sorprender más: ¿ cómo se ha logrado una calidad tan elevada que permite un funcionamiento del sistema durante años ?.

Las respuestas a estas preguntas son complejas y han llevado a ensayos de todo tipo, incluso socilógicos, sope este fenómeno. El lector interesado puede consultar las referencias sope dos documentos escritos por Eric S. Raymon que profundizan mucho sope las respuestas a estas preguntas: “La Catedral y el Bazar” (el método de desarrollo del software lipe) y “Homesteading the Noosphere (parcelando la Noospehere)” (las motivaciones de los desarrolladores de software lipe). Recomiendo fervientemente al lector ambas lecturas si es que quiere llegar a sentirse parte de esta comunidad tan utópica y fascinante, y quiere comprenderla.

Quizás sorprenda al lector que constantemente nos refiramos a lo que hasta ahora el conocia como Linux con la denominación GNU/Linux. Y en estos momentos ya sabe lo suficiente como para entender el motivo. Linux en realidad es solo el kernel de un conjunto software mucho más amplio.

Este kernel es lo que comenzó a desarrollar Linus Torvalds para aprender el modo protegido del microprocesador de Intel 386. Y fué este kernel lo que presentó en las noticias en Internet, retando a los programadores a que lo utilizarán y desarrollarán drivers para él. Y es este kernel lo que Linus Torvalds sigue manteniendo en la actualidad, con ayudas tam importantes como la de Alan Cox y una larga lista de colaboradores.

Todas las demás herramientas que rodean al kernel como son las diferentes shells (conchas: bash, ksh, csh …), editores como el vi o el emacs, los entornos de ventanas y las miles de utilidades que acompañan a un sistema Unix, no fueron desarrolladas por Linus y sus colaboradores y es más, la mayoría de ellas ya existían antes de que apareciera el kernel.

La mayor parte de estas herramientas fueran desarrolladas por la FSF (Free Software Foundation) dentro del proyecto GNU (GNU is not Unix), proyecto liderado por Richard Stallman.

Llegando más lejos, el kernel Linux será sustituido dentro del proyecto GNU por un kernel conocido por el nompe de Hurd, cuyo diseño es más avanzado tecnológicamente que el de Linux, y que ya se puede encontrar en distribuciones como Debian.

Vamos a buscar ahora el núcleo, y en particular sus fuentes, dentro de tú sistema.

El núcleo de Linux se suele instalar en el directorio /usr/src/linux. Dependiendo de que distribución de Linux tengas instalada lo tendrás allí o hapá que instalar algún paquete en el que estén dichas fuentes. Si lo tienes en ese directorio, o en alguno con el nompe kernel kernel-source-x.x.x pueden pasar al siguiente apartado.

En caso contrario intenta instalar un paquete que tenga un nombre del estilo kernel-source-x (en Debian se llama kernel-source-2.0.34).

Una última opción es conectarse por internet y bajar la última versión de algún ftp que este situado cerca de nosotros, por ejemplo en el espejo español de que está situado en

Al día de hoy (Marzo de 1999) puede ser esta la más recomendable ya que acaba de salir la versión 2.2 del núcleo y es muy recomendable obtener dicha versión.

Podemos conectarnos para ello a y de allí bajar linux-2.2.2.tar.gz (12804Kb). Con un poco de suerte dentro del cdrom que acompañará a este número de la revista estará incluido dicho núcleo. Así que te ahorrarás las 2 o 3 horas que puede costar bajarlo.

Una vez con el núcleo en tú poder lo mejor es que lo descomprimas dentro del directorio /usr/src (para ello tendrás que ser superusuario) utilizando el comando tar xvfz linux-2.2.2.tar.gz.

Descripción del kernel

Si has seguido con atención el anterior apartado dentro del directorio /usr/src/kernel-source-x.x.x estarán las fuentes del núcleo de Linux. Dentro de ese directorio encontrarás una estructura de directorios que reflejan los distintos cometidos que tiene que llevar a cabo el núcleo del sistema operativo, así como un directorio con abundante información sope el núcleo, sus diferentes partes, como compilarlo, como aplicarle parches … (mira dentro del directorio Documentation y encontrarás información muy detallada de muchos aspectos del núcleo).

Vamos a explicar a un nivel introductorio que es lo que hay dentro de los directorios más improtantes, sin descender en demasiados detalles que pudieran asustar a nuestros lectores.

Dentro de este directorio están las fuentes del núcleo que son necesarias adaptar a cada arquitectura en las que corre el núcleo.

Si entras aquí podrás ver los diferentes microprocesadores para los que está disponible el núcleo y dentro de cada directorio hay partes específicas de temas como la gestión de memoria, el arranque del sistema, la gestión de interrupciones … que son especifícos de cada arquitectura.

La idea es que sea solo este parte la que sea necesaria implementar para cada nueva arquitectura que se quiera incorporar, reutilizando la inmensa mayoría del código del núcleo.

Este directorio quizás sea más familiar para el lector. En el se encuentran las fuentes que se encargan implementar las comunicaciones son los distintos dispositivos del sistema: discos duros, cdroms, tarjetas de sonido, tarjetas de red, buses pci … Si por ejemplo nos metemos dentro del directorio sound, tenemos la mejor información de como funcionan las tripas de nuestra tarjeta de sonido: el código fuente en C que se encarga de controlarla.

Quizás sea bueno resaltar que la amplia mayoría de estos drivers no han sido hechos por el fapicante del hardware que controlan, si no por la comunidad de desarrolladores del núcleo que, a partir de la información del fapicante del hardware (cuando han podido disponer de ella y no han tenido que hacer ingeniería inversa) han implementado el controlador (driver) del dispositivo.

Hoy por hoy y gracias a la difusión que ha tenido Linux, fapicantes como Creative Labs ya están desarrollando sus propios drivers para Linux. Aunque aún hay casos como los de Toshiba que inicialmente se negaron a dar la información de como funcionaban sus puertos IrDA (infrarrojos), ante lo que se recomendó a la comunidad Linux no comprar sus portátiles. Poco más de una semana después Toshiba reconsideró su postura y decidió proporcionar dicha información. El poder que comienza a tener Linux es importante.

fs (file system)
Dentro de este directorio se encuentran las distintas implementaciones de los sistemas de ficheros que soporta Linux, entre ellos el propio de Linux (ext2) de MS-DOS (msdos), Windows 95 (vfat), … En la nueva versión 2.2.2 del núcleo también hay soporte para Windows NT.

Para que el lector se haga una idea, el que Linux soporte todos estos tipos de sistemas de ficheros significa que puede leer de ellos y escribir.

En este directorio se encuentra el código encargado de arrancar el sistema y realizar la configuración inicial de los diferentes sistemas del núcleo.

ipc (inter process communication)
Aquí podemos encontrar los diferentes mecanismos disponibles para comunicar los procesos que concurren concurrentemente en la máquina.

En este caso nos encontramos las implementaciones de muchas de las llamadas al núcleo (temporizadores, fork, …).

Mucho de este código es dependiente de la arquitectura en la que se ejecute el núcleo, por lo que parte de esta funcionalidad será específica de cada arquitectura y residirá en el directorio arch.

También reside aquí el algorítmo que se encarga de controlar que proceso debe ejecutarse en cada momento (planificador, sched.c)

Aquí reside código de utilidad general para otras partes del núcleo.

mm (memory management)
Este código se encarga de controlar la gestión de memoria del sistema, uno de los aspectos fundamentales dentro del sistema.

Entre sus funciones encontramos: reserva y liberación de memoria. paginación, gestión de memoria swap …

El núcleo de Linux soporta que partes que no hayan sido introducidas dentro del mismo a la hora de compilarlo, se puedan añadir a posteriori utilizando los módulos adecuados.

Esto permite tener un núcleo más reducido en el funcionamiento normal, y sólo incluir soporte para determinado harware en los momentos puntuales que lo necesitemos.

Otra utilidad de este sistema es para probar el funcionamiento de algún dispositivo (tarjeta de sonido o de red p.e.), del que podemos desconer la interrupción que utiliza, o si lleva un tipo de chip u otro. Gracias a los módulos podemos probar sin tener que recompilar el núcleo completo, algo que puede ser muy tedioso.

En este directorio es donde se almacenan los módulos que hayamos seleccionado en el proceso de compilación.

En este directorio se implementa todo lo que tenga relación con las comunicaciones entre diferentes máquinas. Por ello aquí está la implementación de protocolos como TCP/IP (v4 y v6), IPX, APPLETALK … o la implementación del uso de los sockets.

En este último directorio residen los programas que nos van a facilitar la configuración del núcleo, algo que vamos a analizar en el próximo apartado.

Configuración del núcleo

Si el lector ha llegado hasta aquí está a punto de recibir la recompensa a su paciencia. Vas a poder construir tú propio núcleo a partir de las fuentes que hemos descrito y de una forma sencilla, gracias a que al núcleo le acompañan unas utilidades que facilitan mucho su configuración.

Antes de configurar el núcleo hay que ejecutar “make mrproper” para limpiar posibles “restos” de configuraciones anteriores que pueden hacer que la generación no sea correcta.

Existen dos posibilidades básicas de configurar el núcleo: una desde un terminal utilizando el comando make menuconfig y otra desde el entorno de ventanas utilizando el comando make xconfig.

Solo en casos extremos podemos utilizar la opción make config, que nos hará ir paso por paso contestando a diferentes preguntas y como nos equivoquemos en uno de ellos … debemos volver a empezar. Un proceso horrible, os lo digo desde la experiencia.

En ambas interfaces, modo terminal y modo entorno de ventanas, la funcionalidad y modo de configuración es idéntica por lo que me voy a centrar el la opción de modo terminal, ya que si el sistema en el que se va a compilar el núcleo no tiene muchos recursos, el compilar el núcleo con el entorno de ventanas arrancado puede alargar mucho el proceso.

Ha llegado el momento de que te sientes delante del ordenador Linux y te dispongas a configurar tú kernel. Para ello adquiere la personalidad del superusuario (con el comando “su” por ejemplo) y vete al directorio /usr/src/kernel-source-x.x.x.

Una vez allí ejecuta el comando: make menuconfig.

Si todo va como debe (y el único incoveniente que podría surgir es que no tuvieras la lipería ncurses instalada en cuyo caso deberás instalarla y seguir el proceso) te aparecerá una pantalla con fondo azul y una ventana con fondo blanco con diferentes opciones. Como será una de las primeras veces que utilices este programa procura ir leyendo las instrucciones que aparecen, normalmente situadas en la parte superior de cada ventana.

Desde este programa vamos a poder ir entrando en diferentes menús que nos permitirán ir seleccionando que partes queremos meter en nuestro núcleo, en función del sistema con el que estemos trabajando.

No vamos a ir cupiendo de forma exhaustiva todas las posibles opciones pero si que vamos a detallar las principales, así como detallar en profundidad el funcionamiento de la interfaz de configuración.

La primera opción en la lista es “Code maturity level options”. El título de cada sección hace referencia a que parte del núcleo se configura dentro de ella. En este caso como su nompe indica, vamos a poder configurar si vamos a poder incluir en el núcleo partes que aún no son 100% estables. Pulsando la tecla “enter” entramos en dicha opción. En este caso sólo hay una opción, seleccionar o no seleccionar dicha opción. Para seleccionar/deseleccionar la opción utilizamos la barra de espacio. Podemos obtener ayuda sope cada una de las opciones seleccionando la opción de ayuda que está en la parte inferior de la ventana.

El sistema de ayuda que acompaña a la herramienta es muy completo por lo que ante la duda, es muy útil su consulta. Quizás en algunos momentos puede ser un tanto avanzado, pero al fin y al cabo estamos configurando el núcleo, y para ello hay que investigar, al menos las primeras veces.

Una vez que ya estemos de acuerdo con la selección de opciones, nos salimos del menú de selección y volvemos a la ventana principal, con todas las opciones del núcleo.

Si lugar a dudas lo más duro de configurar el núcleo son todas las opciones que están disponibles, por lo que las primeras veces es mejor entrar solo en aquellas en las que sepamos que vamos a hacer, aunque el núcleo que luego generemos no se adaptará totalmente a nuestro sistema y puede tener parte “inútiles” en nuestro sistema.

Continuando con la configuración, la siguiente opción es “Loadable module support” donde se puede activar la función del núcleo para el uso de módulos, tema que ya tratamos a la hora de describir el núcleo.

La siguiente opción “General setup” en la que se configuran opciones generales del núcleo, aplicables en todos los casos, por lo que siempre es bueno adaptarlas. Por ejemplo aquí seleccionaremos nuestro microprocesadores, si necesitamos que el coprocesador se emule por software (para los antiguos 286 y 386 SX), si queremos soporte para red …

El lector puede aprender mucho si profundiza en cada uno de los aspectos por lo que, debe vencer esa primera angustía por tantas opciones desconocidas, ya que en todo momento va a estar acompañado de una ayuda muy completa dentro de la herramienta de configuración, que incluso le dará punteros a documentos que podrán ampliar dicha información. En linux todo lo que se necesita para llegar a ser un “guru” es tiempo e ilusión.

En la opción “Floppy, IDE, and other block devices” nos hay que seleccionar mucho, tan sólo seleccionar el soporte para floppy y el soporte para IDE mejorado, que es se controlan nuestros discos duros (si no son scsi). También es habitual tener un CDROM IDE por lo que es bueno seleccionar esta opción.

Muchas veces las opciones que aparecen ya seleccionadas por defecto nos valen a nosotros, por lo que en estos casos la seleccion de opciones es sencilla.

La opción “Networking options” nos permite activar el soporte TCP/IP, algo que hoy en día es indispensable aunque nuestra máquina no este conectada a ninguna red, y también podemos configurar aspectos avanzados de dicho protocolo. En este caso es mejor no tocar nada si no sabemos lo que hacemos, ya que este es uno de los apartados más complejos, y hay que ser casi un experto en comunicaciones para utilizar algunas de las opciones.

La gestión de red que hace el núcleo de Linux de las comunicaciones es sin lugar a dudas uno de sus apartados más potentes. Permite controlar infinidad de cosas y es uno de los motivos que ha llevado a Linux a ser adapatado por una gran parte de los ISP (Internet Service Provider) de muchas partes del mundo.

“SCSI support” contiene las opciones para configurar el sistema SCSI. Dicho sistema suele estar dentro de una controladora a la que se pueden enchufar hasta sietes dispositivos, normalmente discos duros. Pero que te voy a contar, si tú máquina tiene soporte SCSI y tú lo pediste (con el consiguiente aumento de precio), sabes muy bien sus ventajas. Linux tiene soporte para SCSI desde sus inicios, por lo que en la actualidad es una de las partes más robustas del núcleo.

Por cierto, si tienes una unidad ZIP por el puerto paralelo, debes saber que esta para el sistema aparece como una unidad SCSI por lo que es aquí donde debes activar su soporte.

Dentro de “Network device support” debemos seleccionar como nos queremos conectar a las redes. Es aquí donde activaremos en nuestro núcleo el soporte PPP para conectarnos a Internet a través de nuestro proveedor, o el soporte para conectar ordenadores a través de los puerto serie o paralelo. Si tenemos una tarjeta de red también es aquí donde activaremos el controlador de la tarjeta dentro del núcleo.

En “ISDN subsystem” se configura el soporte para RDSI del núcleo. Decirte que este soporte ha avanzado mucho en los últimos núcleos de Linux, por lo que si tienes una tarjeta RDSI es muy recomendable que utilices la última versión del núcleo que ha ampliado mucho las tarjetas que están soportadas.

Si tienes un CDROM que no es IDE en la opción “CD-ROM drivers” quizás la encuentres y puedas trabajar con ella sin problemas, aunque es raro en los ordenadores nuevos ver este tipo de unidades de CDROM. Pero como Linux intenta soportar la más amplia gama de hardware, aquí tienes el soporte para esos casos extraños.

La opción “Filesystems” es una de las más interesantes. En ella se activan soportes como el de cuotas (limitar cuando espacio de disco puede ocupar cada usuario), o el de los diferentes sistemas de ficheros. A parte del soporte para “ext2”, el sistema de ficheros nativo de Linux, es recomendable que actives el de “fat”, “msdos” y “vfat” para poder ver las particiones Windows 3.x, 95 que a lo mejor viven en tú ordenador.

Verás una opción para dar soporte NLS (Native Language Support). Es importante que la actives ya que te permitirá montar los CDROM en formato Joliet que cada vez van a ser más usuales, y que dan soporte para el uso de UNICODE (permite utilizar en los nompes de ficheros caracteres de cualquier idioma).

Si estas instalando Linux en un Mac también querras activar el soporte para sus sistema de ficheros.

La opción “Character devices” es donde se configuran los puertos serie, el puerto paralelo, los ratones ps2 cada vez más usuales y en definitiva, todos los dispositivos que sus comunicaciones son de tipo caracter, es decir, que su unidad mínima de envío de datos es un caracter.

Si tienes alguna unidad de cinta para hacer copias de seguridad, es aquí donde deberás activar su soporte dentro del núcleo de Linux.

La penúltima opción es la de “Sound”. Como te podrás imaginar en ella se configura la tarjeta de sonido. El soporte para el sonido en Linux a mejorado mucho en los nuevos núcleos 2.2.x, por lo que te recomiendo que utilices dicho núcleo si quieres no tener muchos problemas a la hora de configurar dicho soporte.

La útima opción en nuestro camino de la configuración del núcleo es llama “Kernel hacking” y como te puede imaginar, el 99.9% de los usuarios se puede olvidar de su existencia, ya que no se suelen dedicar a desarrollar el núcleo. Bueno, tras este viaje a través de las diferentes opciones del núcleo, ha llegado el momento de salvar nuestra nueva configuración del núcleo, algo para lo que se nos solicitará confirmación tras seleccionar la opción de salir, y pasamos a compilar el núcleo que hemos configurado, proceso mucho más sencillo que su configuración.

Compilación e instalación

La compilación e instalación del núcleo tiene un conjunto de pasos que son siempre los mismos, y que haremos de forma mecánica una vez que los hayamos seguidos dos o tres veces.

Antes de configurar el núcle orecuerda que hay que ejecutar “make mrproper” para limpiar posibles “restos” (ficheros .o y dependencias) de compilaciones anteriores.

Con el núcleo configurado a nuestro gusto, ejecutamos dentro del directorio donde están las fuentes el comando: “make depend”.

Este comando actualiza las dependencias entre las diferentes partes, de forma que el orden de compilación sea correcto.

Con el comando “make zImage” es con el que se lanza la compilación. Ante él se pondrá el compilador gcc a compilar todas las partes del núcleo, un proceso que puede tardar desde varias horas (386 com 4 Mb de RAM) hasta 5 minutos (Pentium II o K6-2 con 32 Mb de RAM).

Una vez terminado este proceso tenemos ya la imagen de núcleo preparada para ser cargada y controlar el sistema. Dicha imagen se deja tras la compilación en el fichero “/usr/src/kernel-source-2.x.x/arch/i386/boot/zImage”, si la arquitectura es Intel.

Dicha imagen está comprimida por lo que verás que su tamaño es pequeño, entre 400 y 500 Kb si no has metido muchas opciones dentro del núcleo. Si el núcleo generado supera estas cantidades fallará la generación del nuevo núcleo. Debes utilizar make “bzImage” en esos casos.

Una vez generada la imagen se han de generar los módulos, aquellas partes de l núcleo que cargaremos cuando nos hagan falta. Para ello hay que ejecutar las ordenes: “make modules”, “make modules_install”.

Estas ordenes compilan los módulos y los dejan en el directorio adecuado para sus carga.

Para que nuestro ordenador utilice este nuevo núcleo, en el caso de utilizar LILO, debemos copiar la nueva imagen del núcleo al directorio donde guardemos los núcleos, normalmente la imagen del núcleo será /boot/zImage, y añadimos una nueva opción al fichero “/etc/lilo.conf” para que sepa como arrancar este nuevo núcleo. Tras ello ejecutamos “lilo” para que se actualice el arranque del ordenador y reincinamos el ordenador con “reboot”. Al arrancar, elegimos dentro del LILO el nuevo núcleo y con ello, nuestro GNU/Linux utilizará nuestro nuevo núcleo.

Una vez arrancado el sistema, si quieres insertar dentro del núcleo uno de los módulos que compilaste, basta con ejecutar “insmod ” y el núcleo ya podrá trabajar como si hubieras compilado soporte para ese módulo dentro del propio núcleo.

Evolución del núcleo

El núcleo de Linux está en constante evolución y hoy por hoy, no existe ningún otro sistema operativo que se adapte, actualice y corrige como Linux.

A finales de Enero de 1999 apareció la versión 2.2 del núcleo, un acontecimiento muy importante dentro de la comunidad Linux, y que lleva a Linux a soportar nuevas tecnologías como Video, USB …

Dentro del presente artículo no se ha tocado en profundidad todas las mejoras que introduce este nuevo núcleo, pero desde aquí os damos la URL a un excelente artículo en el que se describe este nuevo núcleo:


El núcleo de los sistema operativos constituyen la parte más compleja de los mismos, al tener controlar el uso de todos los recursos del sistema.

Linux poseé uno de los núcleos mejor desarrollados dentro de los sistemas operativos. Su eficiencia y robustez han logrado llevar a Linux a obtener una cuota importante dentro del mercado de los servidores, y a ser el sistema preferido dentro del mundo de los desarrolladores.

Su constante evolución y la rapidez con la que solucionan los problemas que se detectan están logrando que los sistemas Unix vuelvan a recuperar terreno frente al pujante Windows NT.

Su desarrollo abierto y la disponibilidad de las fuentes hacen que Linux sea el sistema ideal para aprender, por lo que su implantación dentro de las Universidades está siendo masiva.

Esperamos que este artículo te haya acercado un poco a este software y haya despertado tu interés de cara a profundizar más en su funcionamiento.


    “La catedral y el bazar” y “Homesteading the Noosphere”
    Pagina web de Linus Torvalds: http://www.cs.Helsinki.FI/~torvalds/
    Página web de Alan Cox:
    Página web de Eric S. Raymon:
    Free software Foundation:

26 de noviembre de 2015

Attending the Web Engines Hackfest

webkitgtk-hackfest-bannerIt’s certainly been a while since I attended this event for the last time, 2 years ago, when it was a WebKitGTK+ only oriented hackfest, so I guess it was a matter of time it happened again…

It will be different for me this time, though, as now my main focus won’t be on accessibility (yet I’m happy to help with that, too), but on fixing a few issues related to the WebKit2GTK+ API layer that I found while working on our platform (Endless OS), mostly related to its implementation of accelerated compositing.

Besides that, I’m particularly curious about seeing how the hackfest looks like now that it has broaden its scope to include other web engines, and I’m also quite happy to know that I’ll be visiting my home town and meeting my old colleagues and friends from Igalia for a few days, once again.

Endless Mobile logoLast, I’d like to thank my employer for sponsoring this trip, as well as Igalia for organizing this event, one more time.

See you in Coruña!

22 de noviembre de 2015

De visita en Madrid

Con la excusa de participar en el Taller de nanotecnología casera organizado por MediaLab Prado, de la última visita en Madrid me traigo entre otras varias cosas: 

  • conocer los trabajos de En-Te Hwu que han llevado a la creación de un microscopio de fuerza atómica de bajo coste y una alternativa OSS en desarrollo: OpenAFM;
  • descubrir el alucinante proyecto de microscopio de barrido láser opensource de Raquel López, del cual espero ansioso novedades de las versiones más avanzadas;
  • participar en la fundación del grupo de trabajo de Microscopía DIY creado en MediaLab Prado a consecuencia y por los participantes del taller impartido por En-Te;
  • visitar por primera vez a los amigos del Makespace en Madrid, que es otro punto de encuentro de potencial BESTIAL;
  • descubrir a la gente del BivosLab/Biocore, que están haciendo cosas que tal vez podamos aplicar también en el Club de Cacharreo;
  • el agradable reencuentro con los amigos de MediaLab Prado, de los cuales cada vez soy más admirador y que utilizo como inspiración para construir el HackLab Almería;
  • más equipos para la colección del museo de retroinformática (gracias Kix);
  • tratos con la realeza (sí, realmente estoy en esa foto, con mi camiseta celeste) ZOMG;
  • y hasta la petición de Jesús Cea de escribir mis experiencias «pastoreando los procomunes».

Un viaje preñado de... TODO.

07 de noviembre de 2015

Importing include paths in Eclipse

First of all, let me be clear: no, I’m not trying to leave Emacs again, already got over that stage. Emacs is and will be my main editor for the foreseeable future, as it’s clear to me that there’s no other editor I feel more comfortable with, which is why I spent some time cleaning up my .emacs.d and making it more “manageable”.

But as much as like Emacs as my main “weapon”, I sometimes appreciate the advantages of using a different kind of beast for specific purposes. And, believe me or not, in the past 2 years I learned to love Eclipse/CDT as the best work-mate I know when I need some extra help to get deep inside of the two monster C++ projects that WebKit and Chromium are. And yes, I know Eclipse is resource hungry, slow, bloated… and whatnot; but I’m lucky enough to have fast SSDs and lots of RAM in my laptop & desktop machines, so that’s not really a big concern anymore for me (even though I reckon that indexing chromium in the laptop takes “quite some time”), so let’s move on :-)

However, there’s this one little thing that still bothers quite me a lot of Eclipse: you need to manually setup the include paths for the external dependencies not in a standard location that a C/C++ project uses, so that you can get certain features properly working such as code auto-completion, automatic error-checking features, call hierarchies… and so forth.

And yes, I know there is an Eclipse plugin adding support for pkg-config which should do the job quite well. But for some reason I can’t get it to work with Eclipse Mars, even though others apparently can use it there for some reason (and I remember using it with Eclipse Juno, so it’s definitely not a myth).

Anyway, I did not feel like fighting with that (broken?) plugin, and in the other hand I was actually quite inclined to play a bit with Python so… my quick and dirty solution to get over this problem was to write a small script that takes a list of package names (as you would pass them to pkg-config) and generates the XML content that you can use to import in Eclipse. And surprisingly, that worked quite well for me, so I’m sharing it here in case someone else finds it useful.

Using frogr as an example, I generate the XML file for Eclipse doing this:

  $ pkg-config-to-eclipse glib-2.0 libsoup-2.4 libexif libxml-2.0 \
        json-glib-1.0 gtk+-3.0 gstreamer-1.0 > frogr-eclipse.xml

…and then I simply import frogr-eclipse.xml from the project’s properties, inside the C/C++ General > Paths and Symbols section.

After doing that I get rid of all the brokenness caused by so many missing symbols and header files, I get code auto-completion nicely working back again and all those perks you would expect from this little big IDE. And all that without having to go through the pain of defining all of them one by one from the settings dialog, thank goodness!

Now you can quickly see how it works in the video below:

VIDEO: Setting up a C/C++ project in Eclipse with pkg-config-to-eclipse

This has been very helpful for me, hope it will be helpful to someone else too!

17 de octubre de 2015

Sí, pienso seguir bloqueando anuncios (II)

Hace una semana que expliqué por qué sigo bloqueando anuncios. Pero siempre hay alguna vez que, sin querer, navegamos sin el bloqueo activado. Como me ha sucedido hace un momento al intentar consultar desde el móvil una noticia publicada en el, probablemente, diario más importante del Perú (El Comercio), que hizo que el navegador del móvil me mostrase este fraude:

Un intento de fraude capturado en El Comercio (Perú)

Segundos después, me apareció una página de la que es imposible salir sin cerrar el navegador:

La página de fraude de El Comercio (Perú) que impide continuar navegando

El resultado: cerrar el navegador y buscar la noticia en otro medio de comunicación. Adiós visita a El Comercio.

Este es uno de los muchos ejemplos que surgen diariamente: páginas que permiten publicidad fraudulenta que, además, nos impiden acceder a la información solicitada. La página es doblemente fraudulenta: no solo por mentir acerca de un supuesto virus en el móvil (y vender una app que seguramente nos lo infecte de verdad), sino además porque estaría contabilizando un hit en el anuncio, que no se ha producido voluntariamente por parte del usuario.

Al hilo de lo que comentaba el otro día: ¿qué pasará cuando anunciantes y demás afectados, vean todo el humo (y fraude) que hay detrás la publicidad on-line? Pues de momento ya se ha demostrado el fraude en algunos portales de vídeo on-line que cobran por visitas falsas.

Así que, gracias por seguir usando adblock, ublock o lo que se tercie.

09 de octubre de 2015

Sí, pienso seguir bloqueando anuncios

Empieza a ponerse de moda entre sitios web diversos, el anuncio para los que bloqueamos anuncios dejemos de hacerlo. Lo disfrazan con un gracias por no usar adblock plus con nosotros y ayuda a sostener este sitio y cosas por el estilo.


Y todo ello, al calor de la polémica sobre si adblock plus vende o no su lista blanca, que viene de largo, como si los expertos en publicidad animasen a reavivarla periódicamente.

Pero vamos a ver: lo primero de todo es que hace mucho tiempo que vengo usando ublock y ublock origin, alternativas independientes a adblock plus. Más que nada porque son técnicamente mejores y encima son software libre (github de ublock, github de ublock origin). Y si las listas blancas son mejor gestionadas, pues miel sobre hojuelas. Pero claro, no pueden o no son capaces de detectar que realmente no uso el susodicho plugin.


Lo segundo de todo, ¿verdaderamente esperan que dejemos de bloquear anuncios mientras a las plataformas más usadas le siguen colando anuncios con malware o simplemente muy molestos que te impiden acceder a la información que deseas ver? (especialmente desde los dispositivos móviles).

Y bueno, los anuncios en la web serán todo los efectivos que quieras. Eso dirán los publicistas. Pero me temo que en eso hay tanto humo, que el día que se den cuenta los anunciantes se va a producir una crisis peor que la de las punto-com y el ladrillo juntas… el fin del mundo, vamos.

06 de octubre de 2015

Los sueldos en el mundo de la informática

Sólo como referencia, he encontrado esta publicación del ministerio de trabajo de los EEUU: May 2014 National Occupational Employment and Wage Estimates con las estadísticas de sueldos de las profesiones informáticas en ese país:

Occupation code Occupation title (click on the occupation title to view its profile) Level Employment Employment RSE Employment per 1,000 jobs Median hourly wage Mean hourly wage Annual mean wage Mean wage RSE
11-3021 Computer and Information Systems Managers detail 330360 0.8% 2,445 $61.37 $65.52 $136,280 0.4%
15-0000 Computer and Mathematical Occupations major 3834180 0.5% 28,374 $38.18 $40.37 $83,970 0.5%
15-1100 Computer Occupations minor 3692980 0.5% 27,329 $38.17 $40.31 $83,840 0.5%
15-1111 Computer and Information Research Scientists detail 24210 4.2% 0,179 $52.09 $54.42 $113,190 1.4%
15-1120 Computer and Information Analysts broad 608500 0.9% 4,503 $40.13 $42.25 $87,890 0.3%
15-1121 Computer Systems Analysts detail 528320 0.9% 3,910 $39.76 $41.98 $87,320 0.4%
15-1122 Information Security Analysts detail 80180 2.0% 0,593 $42.74 $44.04 $91,600 0.6%
15-1130 Software Developers and Programmers broad 1492040 0.8% 11,042 $43.90 $45.81 $95,280 0.8%
15-1131 Computer Programmers detail 302150 1.4% 2,236 $37.28 $39.75 $82,690 1.3%
15-1132 Software Developers, Applications detail 686470 1.2% 5,080 $45.92 $47.85 $99,530 1.1%
15-1133 Software Developers, Systems Software detail 382400 1.6% 2,830 $49.46 $50.98 $106,050 0.6%
15-1134 Web Developers detail 121020 1.5% 0,896 $30.52 $33.02 $68,670 0.7%
15-1140 Database and Systems Administrators and Network Architects broad 617680 0.6% 4,571 $38.87 $40.85 $84,970 0.2%
15-1141 Database Administrators detail 112170 1.0% 0,830 $38.60 $39.56 $82,280 0.3%
15-1142 Network and Computer Systems Administrators detail 365430 0.8% 2,704 $36.44 $38.35 $79,770 0.3%
15-1143 Computer Network Architects detail 140080 1.4% 1,037 $47.32 $48.42 $100,710 0.4%
15-1150 Computer Support Specialists broad 738030 0.7% 5,462 $24.22 $26.42 $54,960 0.3%
15-1151 Computer User Support Specialists detail 563540 0.8% 4,170 $22.89 $24.76 $51,500 0.3%
15-1152 Computer Network Support Specialists detail 174490 1.3% 1,291 $29.72 $31.80 $66,140 0.5%
15-1199 Computer Occupations, All Other detail 212510 1.0% 1,573 $40.10 $41.12 $85,520 1.0%

Ojalá os sirvan.

23 de septiembre de 2015

WebKit Contributors Meeting 2015 (late, I know)

After writing my last post I realized that I needed to write a bit more about what I had been doing at the WebKit Contributors Meeting.

First thing to say is that it happened in March at Apple campus in Cupertino and I atteded as part of the Igalia gang.

My goal when I went there was to discuss with Youenn Fablet about Streams API and we are implementing and see how we could bootstrap the reviews and being to get the code reviewed and landed efficiently. Youenn and I also made a presentation (mainly him) about it. At that moment we got some comments and help from Benjamin Poulain and nowadays we are also working with Darin Adler and Geoffrey Garen so the work is ongoing.

WebRTC was also a hot topic and we talked a bit about how to deal with the promises as they seem to be involved in the WebRTC standard was well. My Igalian partner Philippe was missed in this regard as he is involved in the development of WebRTC in WebKit, but he unfortunately couldn’t make it because of personal reasons.

I also had an interesting talk with Jer Noble and Eric Carlson about Media Source and Encrypted Media Extensions. I told them about the several downstream implementations that we are or were working on, specially the WebKit4Wayland one and that we expect to begin to upstream soon. They commented that they still have doubts about the abstractions they made for them and of course I promised to get back to them when we begin with the job. Actually I already discussed some issues with Quique, another fellow Igalian.

Among the other interesting discussions, I found very necessary the migration of Mac port to CMake. Actually, I am experiencing now the painbenefits of using XCode to add files, specially the generated ones to the compilation. I hope that Alex succeeds with the task and soon we have a common build system for all main ports.

21 de septiembre de 2015

WebKitGTK+ 2.10

HTTP Disk Cache

WebKitGTK+ already had an HTTP disk cache implementation, simply using SoupCache, but Apple introduced a new cross-platform implementation to WebKit (just a few bits needed a platform specific implementation), so we decided to switch to it. This new cache has a lot of advantages over the SoupCache approach:

  • It’s fully integrated in the WebKit loading process, sharing some logic with the memory cache too.
  • It’s more efficient in terms of speed (the cache is in the NetworkProcess, but only the file descriptor is sent to the Web Process that mmaps the file) and disk usage (resource body and headers are stored in separate files in disk, using hard links for the body so that difference resources with the exactly same contents are only stored once).
  • It’s also more robust thanks to the lack of index. The synchronization between the index and the actual contents has always been a headache in SoupCache, with many resources leaked in disk, resources that are cache twice, etc.

The new disk cache is only used by the Network Process, so in case of using the shared secondary process model the SoupCache will still be used in the Web Process.

New inspector UI

The Web Inspector UI has been redesigned, you can see some of the differences in this screenshot:


For more details see this post in the Safari blog


This was one the few regressions we still had compared to WebKit1. When we switched to WebKit2 we lost IndexedDB support, but It’s now back in 2.10. It uses its own new process, the DatabaseProcess, to perform all database operations.


WebKitGTK+ 2.8 improved the overall performance thanks to the use of the bmalloc memory allocator. In 2.10 the overall performance has also improved, this time thanks to a new implementation of the locking primitives. All uses of mutex/condition have been replaced by a new implementation. You can see more details in the email Filip sent to webkit-dev or in the so detailed commit messages.

Screen Saver inhibitor

It’s more and more common to use the web browser to watch large videos in fullscreen mode, and quite annoying when the screen saver decides to “save” your screen every x minutes during the whole video. WebKitGTK+ 2.10 uses the ScreenSaver DBus service to inhibit the screen saver while a video is playing in fullscreen mode.

Font matching for strong aliases

WebKit’s font matching algorithm has improved, and now allows replacing fonts with metric-compatible equivalents. For example, sites that specify Arial will now get Liberation Sans, rather than your system’s default sans font (usually DejaVu). This makes text appear better on many pages, since some fonts require more space than others. The new algorithm is based on code from Skia that we expect will be used by Chrome in the future.

Improve image quality when using newer versions of cairo/pixman

The poor downscaling quality of cairo/pixman is a well known issue that was finally fixed in Cairo 1.14, however we were not taking advantage of it in WebKit even when using a recent enough version of cairo. The reason is that we were using CAIRO_FILTER_BILINEAR filter that was not affected by the cairo changes. So, we just switched to use CAIRO_FILTER_GOOD, that will use the BILINEAR filter in previous versions of Cairo (keeping the backwards compatibility), and a box filter for downscaling in newer versions. This drastically improves the image quality of downscaled images with a minim impact in performance.


Editor API

The lack of editor capabilities from the API point of view was blocking the migration to WebKit2 for some applications like Evolution. In 2.10 we have started to add the required API to ensure not only that the migration is possible for any application using a WebView in editable mode, but also that it will be more convenient to use.

So, for example, to monitor the state of the editor associated to a WebView, 2.10 provides a new class WebKitEditorState, that for now allows to monitor the typing attributestyping attributes. With WebKit1 you had to connect to the selection-changed signal and use the DOM bindings API to manually query the typing attributes. This is quite useful for updating the state of the editing buttons in the editor toolbar, for example. You just need to connect to WebKitEditorState::notify::typying-attributes and update the UI accordingly. For now typing attributes is the only thing you can monitor from the UI process API, but we will add more information when needed like the current cursor position, for example.

Having WebKitEditorState doesn’t mean we don’t need a selection-changed signal that we can monitor to query the DOM ourselves. But since in WebKit2 the DOM lives in the Web Process, the selection-changed signal has been added to the Web Extensions API. A new class WebKitWebEditor has been added, to represent the web editor associated to a WebKitWebPage, and can be obtained with webkit_web_page_get_editor(). And is this new class the one providing the selection-changed signal. So, you can connect to the signal and use the DOM API the same way it was done in WebKit1.

Some of the editor commands require an argument, like for example, the command to insert an image requires the image source URL. But both the WebKit1 and WebKit2 APIs only provided methods to run editor commands without any argument. This means that, once again, to implement something like insert-image or insert link, you had to use the DOM bindings to create and insert the new elements in the correct place. WebKitGTK+ 2.10 provides webkit_web_view_execute_editing_command_with_argument() to make this a lot more convenient.

You can test all this features using the new editor mode of MiniBrowser, simply run it with -e command line option and no arguments.


Website data

When browsing the web, websites are allowed to store data at the client side. It could be a cache, like the HTTP disk cache, or data required by web features like offline applications, local storage, IndexedDB, WebSQL, etc. All that data is currently stored in different directories and not all of those could be configured by the user. The new WebKitWebsiteDataManager class in 2.10 allows you to configure all those directories, either using a common base cache/data directory or providing a specific directory for every kind of data stored. It’s not mandatory to use it though, the default values are compatible with the ones previously used.

This gives the user more control over the browsing data stored in the client side, but in the future versions we plan to add support for actually handling the data, so that you will be able to query and delete the data stored by a particular security domain.

Web Processes limit

WebKitGTK+ currently supports two process models, the single shared secondary process and the multiple secondary processes. When using the latter, a new web process is created for every new web view. When there are a lot of web views created at the same time, the resources required to create all those processes could be too much in some systems. To improve that a bit 2.10 adds webkit_web_context_set_web_process_count_limit(), to set the maximum number of web process that can be created a the same time.

This new API can also be used to implement a slightly different version of the shared single process model. By using the multiple secondary process model with a limit of 1 web process, you still have a single shared web process, but using the multi-process mechanism, which means the network will happen in the Network Process, among other things. So, if you use the shared secondary process model in your application, unless your application only loads local resources, we recommend you to switch to multiple process model and use the limit to benefit from all the Network Process feature like the new disk cache, for example. Epiphany already does this for the secondary process model and web apps.

Missing media plugins installation permission request

When you try to play media, and the media backend doesn’t find the plugins/codecs required to play it, the missing plugin installation mechanism starts the package installer to allow the user to find and install the required plugins/codecs. This used to happen in the Web Process and without any way for the user to avoid it. WebKitGTK+ 2.10 provides a new WebKitPermissionRequest implementation that allows the user to block the request and prevent the installer from being invoked.

20 de septiembre de 2015

How after an upgrade my /etc/sysconfig/docker-storage got me mad

I have a running docker service in a Fedora 21 system for a while. Recently I got some disgusting erros preventing restart docker:

device-mapper: table: 253:7: thin: Couldn't open thin
internal device 

I am a docker newbie so I lost a lot of time thinking if my thin device got corrupt or whatever. Indeed I openened an issue (#16341) to the docker project to report it. But now I conclude is not an upstream error but a Fedora's packaging one.

The problem was caused in this regular update:

which did this:
+DOCKER_STORAGE_OPTIONS=--storage-driver devicemapper --storage-opt
-dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/vg_patxuko-docker--pool

And after the next system reboot the docker service was unable to restart. Removing the DOCKER_STORAGE_OPTIONS value returned system to service.

More details at this comment.

Hope it helps


24 de agosto de 2015

Bienvenida, Lucía Killari

Bienvenida, Lucía-Killari, a ese mundo que ahora te parecerá enorme. Ese mundo que tú te vas a comer.

Lucía Killari

23 de julio de 2015

ReadableStream almost ready

Hello dear readers! Long time no see! You might thing that I have been lazy, and I was in blog posting but I was coding like mad.

First remarkable thing is that I attended the WebKit Contributors Meeting that happened in March at Apple campus in Cupertino as part of the Igalia gang. There we discussed of course about Streams API, its state and different implementation possibilities. Another very interesting point which would make me very happy would be the movement of Mac to CMake.

In a previous post I already introduced the concepts of the Streams API and some of its possible use cases so I’ll save you that part now. The news is that ReadableStream has its basic funcionality complete. And what does it mean? It means that you can create a ReadableStream by providing the constructor with the underlying source and the strategy objects and read from it with its reader and all the internal mechanisms of backpresure and so on will work according to the spec. Yay!

Nevertheless, there’s still quite some work to do to complete the implementation of Streams API, like the implementation of byte streams, writable and transform streams, piping operations and built-in strategies (which is what I am on right now).I don’t know either when Streams API will be activated by default in the next builds of Safari, WebKitGTK+ or WebKit for Wayland, but we’ll make it at some point!

Code suffered already lots of changes because we were still figuring out which architecture was the best and Youenn did an awesome job in refactoring some things and providing support for promises in the bindings to make the implementation of ReadableStream more straitghforward and less “custom”.

Implementation could still suffer quite some important changes as, as part of my work implementing the strategies, some reviewers raised their concerns of having Streams API implemented inside WebCore in terms of IDL interfaces. I have already a proof of concept of CountQueuingStrategy and ByteLengthQueuingStrategy implemented inside JavaScriptCore, even a case where we use built-in JavaScript functions, which might help to keep closer to the spec if we can just include JavaScript code directly. We’ll see how we end up!

Last and not least I would like to thank Igalia for sponsoring me to attend the WebKit Contributors Meeting in Cupertino and also Adenilson for being so nice and taking us to very nice places for dinner and drinks that we wouldn’t be able to find ourselves (I owe you, promise to return the favor at the Web Engines Hackfest). It was also really nice to have the oportunity of quickly visiting New York City for some hours because of the long connection there which usually would be a PITA, but it was very enjoyable this time.

14 de julio de 2015

Cómo buscar stickers para Telegram

Telegram, ese chat que le da bastantes vueltas a Whatsapp y a Line (por ahí dejan caer que en el último ataque DDOS, pudo Line tener algo que ver…), reinventó el concepto de Sticker de forma bastante más abierta (o neutral) que sus competidores. Y sin embargo, viene con un pequeño defecto: no hay una página oficial para buscarlos.

Se han intentado mantener directorios más o menos actualizados, como este de Reddit. Sin embargo, la guía definitiva es: ¡usa tu buscador!

Por ejemplo, si en tu móvil (o tu equipo) buscas algo como meme te saldrán enlaces de (el sitio web donde se publican los stickers) que tienen la palabra clave “meme”:

Buscando stickers

Ya está. Solo queda pulsar en el que más te guste y lo verás en tu Telegram, listo para instalar. Sencillo, ¿no? Por cierto, que si tu buscador no es Google también te vale. Duckduckgo, cómo no.

Instalando stickers

07 de julio de 2015

Hacking Team: el cazador cazado

Según un informe de Reporteros sin Fronteras, Hacking Team es una empresa con base en Milán que vende herramientas software de intrusión y vigilancia a gobiernos y agencias de seguridad gubernamentales. Sus sistemas de control remoto permiten a los gobiernos monitorizar las comunicacones de los usuarios de Internet, descifrar sus ficheros y mensajes de correo […]

03 de julio de 2015

On Linux32 chrooted environments

I have a chrooted environment in my 64bit Fedora 22 machine that I use every now and then to work on a debian-like 32bit system where I might want to do all sorts of things, such as building software for the target system or creating debian packages. More specifically, today I was trying to build WebKitGTK+ 2.8.3 in there and something weird was happening:

The following CMake snippet was not properly recognizing my 32bit chroot:

endif ()

After some investigation, I found out that CMAKE_HOST_SYSTEM_PROCESSOR relies on the output of uname to determine the type of the CPU, and this what I was getting if I ran it myself:

(debian32-chroot)mario:~ $ uname -a
Linux moucho 4.0.6-300.fc22.x86_64 #1 SMP Tue Jun 23 13:58:53 UTC 2015
x86_64 x86_64 x86_64 GNU/Linux

Let’s avoid nasty comments about the stupid name of my machine (I’m sure everyone else uses clever names instead), and see what was there: x86_64.

That looked wrong to me, so I googled a bit to see what others did about this and, besides finding all sorts of crazy hacks around, I found that in my case the solution was pretty simple just because I am using schroot, a great tool that makes life easier when working with chrooted environments.

Because of that, all I would have to do would be to specify personality=linux32 in the configuration file for my chrooted environment and that’s it. Just by doing that and re-entering in the “jail”, the output would be much saner now:

(debian32-chroot)mario:~ $ uname -a
Linux moucho 4.0.6-300.fc22.x86_64 #1 SMP Tue Jun 23 13:58:53 UTC 2015
i686 i686 i686 GNU/Linux

And of course, WebKitGTK+ would now recognize and use the right CPU type in the snippet above and I could “relax” again while seeing WebKit building again.

Now, for extra reference, this is the content of my schroot configuration file:

$ cat /etc/schroot/chroot.d/00debian32-chroot
description=Debian-like chroot (32 bit) 

That is all, hope somebody else will find this useful. It certainly saved my day!

17 de junio de 2015

¡Enhorabuena, wikipedistas!

09 de junio de 2015

Apple licenciará como software libre uno de sus productos

Ayer Apple anunció en uno de sus habitualmente pomposos eventos, que la próxima versión del lenguaje de programación Swift será open source.


La amplia comunidad de fanboys por un lado, y la de haters por otro, se lanzaron en masa a comentarlo. La verdad, si me enteré de la noticia fue porque open source llegó a ser tendencia en Twitter y, lo que más me sorprendió, que fuera por noticias relacionadas con Apple.

Las opiniones, para todos los gustos, muchas denotando gran entusiasmo (como suele pasar con cualquier anuncio de Apple) y algunas curiosas como esta de @phobophille:

Con Apple anunciando que Swift será Open Source es pertinente recordar que Open Source no significa necesariamente Software Libre #ojoCuidao

Veamos: Lo que Apple ha anunciado concretamente es que la versión 2.0 de Swift se liberará (esta vez sí, se libera) con una licencia permisiva aprobada por la OSI. ¿Qué significa esto? En primer lugar, significa que cumple la definición de Open Source disponible aquí. Esto es importante. Como lo es el hecho de que elijan una licencia permisiva, es decir, que permite cerrar el código fuente de los trabajos derivados. Esto es lo que la diferencia de las licencias de software libre copyleft, como la GPL. Y Apple, como tantas otras compañías, elige este modelo permisivo.

Pero también hay grandes proyectos de las comunidades que eligen licencias permisivas. Por ejemplo, FreeBSD o Apache. ¿Alguien duda de que son software libre? Pues lo son. Pero tampoco tienen licencia copyleft. Así que, pese a quien pese, Swift 2.0 sí, se libera y será software libre (mientras Apple no cambie de opinión).

¿Es la primera vez que Apple hace software libre? Pues tampoco. De hecho, Apple cuenta desde hace tiempo con una licencia permisiva, aprobada en OSI y considerada como de software libre: la Apple Public Source License. Esta licencia es la utilizada por Apple para liberar, por ejemplo, partes de su sistema operativo OSX.

Otra cosa es, cuántas veces más Apple decidirá liberar código con una licencia OSI. En esta ocasión, a Apple le conviene liberar, quizás para conseguir que más desarrolladores adopten este nuevo lenguaje de programación. Para que la gente use otros productos de software de Apple, como iOS, solo necesitan venderles un iPhone. Pero para que los desarrolladores adopten masivamente un nuevo lenguaje de programación, necesitan todo tipo de mimos. Recordemos también, que hay otras compañías que publican de vez en cuando software libre, sin que por ello estén muy comprometidas con la comunidad, que digamos.

27 de mayo de 2015

Google Calendar dejará de enviar SMS

De acuerdo a un correo que estamos recibiendo, Google Calendar dejará de enviar notificaciones por SMS. La justificación es que la mayoría de los usuarios tiene smartphones con aplicación de calendario, capaces de notificar a su usuario de forma más flexible.

Fin de SMS en Calendar

Quizás dentro de unos años eliminen los SMS en otros tipos de notificaciones. Por ejemplo, en la doble autenticación, obligando a utilizar la app Google Authenticator. Yo, personalmente, vengo usando estas notificaciones del calendario desde el principio y aunque poca falta me hacen ya, no las desactivé por dejadez.

Pero, ¿se muere el SMS? Pues no sé yo: por un lado, los 140 caracteres del SMS representan, desde siempre, los paquetes de datos más caros del mundo. Por otro lado, las operadoras y ciertos clientes con pocos escrúpulos tienen un buen negocio montado con los SMS premium. Tal vez, pronto queden relegados a este tipo de usos y a sus usuarios incautos.

Gmail Inbox, abierto para todo el mundo

Desde ya, Gmail Inbox no requiere invitación, como informan en el blog oficial. Para mí es un muy buen trabajo: después de revolucionar el correo web, han ido mejorando el concepto de etiqueta (que ya mejoró en su día el concepto de carpeta) añadiendo una suerte de filtros automáticos que clasificaban el correo según su tipo (redes sociales, promociones, notificaciones o foros).

Con Inbox dan una nueva vuelta de tuerca a ese filtrado automático, detectando patrones de mensajes que representan, por ejemplo, billetes de viaje, reservas de hoteles o pedidos a tiendas en internet, que vemos en la interfaz de usuario como una ficha completa del asunto que nos ocupe. Aunque Inbox fue creado como una app para móviles, tiene también una versión de escritorio. Y me da la impresión de que esta última está incluso mejor. Por ejemplo, me une la información de unas reservas de hotel en Sevilla y sus vuelos asociados en una ficha con un título de lo más lógico: “Fin de semana en Sevilla”, cosa que hasta ahora no he visto en la app de móvil.

Inbox en el escritorio

Lo dicho: ahora ya no es necesaria invitación para comenzar a usar Inbox (excepto si utilizas el correo de Gmail a través de Google Apps, donde todavía es necesaria la invitación). Basta con que te instales la aplicación en tu móvil y accedas a tu cuenta. Posteriormente, puedes acceder a la versión de escritorio utilizando

Inbox en el móvil

19 de mayo de 2015

Migración de Wordpress a Jekyll

Continuando con el trabajo comenzado con mi página, y buscando como objetivo hacerla responsive y compatible con móviles, procedí a realizar un trabajo de migración de Wordpress a Jekyll. Las razones para movernos a Jekyll están bien justificadas aquí.

Jekyll es un sistema de blogs con páginas estáticas muy sencillos. Para empezar, no necesita cookies para nada, por lo que me olvido de estas extrañas normas europeas.

Antiguo Wordpress

Un poco más en serio, el mantenimiento se simplifica enormemente. Me olvido de plugins, versiones de PHP (y sus problemas de seguridad). Y encima la página queda mucho mejor, y se puede alojar en cualquier proveedor de hosting, sin importarme si soporta o no PHP, cargando mucho más rápido. Como inconvenientes, no es tan fácil de usar para un blogger medio. Pero no me importa: a mí me basta.

Aunque en la página de información está descrita la tecnología usada, incluyo a continuación un resumen del proceso seguido:

  • Creamos entorno Jekyll con el diseño Feeling Responsive de Phlow y lo adaptamos para nuestras necesidades. Para ello hemos hecho un fork en github.
  • Obtenemos de los blogs en Wordpress (y también, ya puestos, de Blogger) los ficheros XML de exportación completos.
  • La importación de los ficheros anteriores las realizamos según estos consejos (para wordpress, para blogger).
  • Seguimos estos mismos consejos para importar comentarios a Disqus.
  • En los posts resultantes, usamos un pequeño script de sed para cambiar las URL de imágenes de artículos, ya que los moveremos a otro sitio.
  • Por último, incluimos información que antes no existía (como la información para SEO), en algunos posts (sería mucho trabajo revisarlos todos ahora…).

Al final, casi con seguridad miraré de publicar el blog directamente en Github en lugar de usar un hosting propio, pero por ahora lo dejo aquí. Que ha llegado el séptimo día y hay que descansar :-)

Algunas de las modificaciones realizadas las propondré subir al repositorio original, pero por ahora si te interesan, haz un fork de mi trabajo, que para eso está :-)

Para trabajar con Jekyll en múltiples sitios, me ha resultado bastante cómodo preparar un docker, así que si alguien lo quiere utilizar, se encuentra aquí publicado (y su repositorio, aquí).

26 de abril de 2015

Lavado de cara a la web del Dr Amor :-)

Al parecer Google penaliza, o va a penalizar, aunque sea un poquito, las webs que no están optimizadas para móviles. Y la mía no podía estar peor. Así que, como no tengo ni idea de diseño web, he estado buscando plantillas responsive fáciles de utilizar y, al final, encontré una en HTML5UP que me convenció. El resto, ha sido buscar imágenes para ilustrarla (por supuesto, bajo una licencia Creative Commons que me permita copiarlas simplemente reconociendo su autoría) y adaptar el texto y las secciones (y ya puestos, meter un poco de SEO), para lo que, de paso, me he ayudado de una herramienta libre: Aptana Studio. El resultado, es éste ( Y por fin, mi web aprueba los requisitos del monopolio de google. Iré actualizando el resto de mis páginas, poco a poco. Entre ellas, este blog, que también es un poco pecadorrr...


11 de abril de 2015

Compiling node.js for Android Lollipop

While participating in the Nordic IoT Hackathon 2015 our team Hello North (wrongly tagged as «HackLab team») wanted to explore the potential of running node.js applications running native in Android.

Happily this was solved by Yaron Y. Goland and described in a post. Using his method I've compiled node.js against android-ndk-r10d running the example on a 4.2.2 rooted device.

The next step was to try in a unrooted one, but only got at first a 5.0 Lollipop one. Execution failed with a error: only position independent executables (PIE) are supported. error message. Some investigation got me to a solved bug report. The magic trick seems to be just this patch.

It took me some time to understand how to add this to the node.js building configuration system but seems got fixed just like this:

--- /home/olea/node/android-configure~  2015-04-11 02:46:04.063966802 +0200
+++ /home/olea/node/android-configure   2015-04-11 01:56:34.470154253 +0200
@@ -6,14 +6,16 @@
     --toolchain=arm-linux-androideabi-4.8 \
     --arch=arm \
     --install-dir=$TOOLCHAIN \
-    --platform=android-9
+    --platform=android-16
 export AR=arm-linux-androideabi-ar
 export CC=arm-linux-androideabi-gcc
 export CXX=arm-linux-androideabi-g++
 export LINK=arm-linux-androideabi-g++
+export CPPFLAGS="-fPIE"
+export LDFLAGS="-fPIE -pie -L$PREFIX/lib"

And this is the test:


PS: Just checked the same build using android-16 platform runs in 4.2.2. ¡Double Yepa!

30 de marzo de 2015

Bringing sanity back to my T440s

As a long time Thinkpad’s trackpoint user and owner of a Lenovo T440s, I always felt quite frustrated with the clickpad featured in this laptop, since it basically ditched away all the physical buttons I got so used to, and replace them all with a giant, weird and noisy “clickpad”.

Fortunately, following Peter Hutterer’s post on X.Org Synaptics support for the T440, I managed to get a semi-decent configuration where I basically disabled any movement in the touchpad and used it three giant soft buttons. It certainly took quite some time to get used to it and avoid making too many mistakes but it was at least usable thanks to that.

Then, just a few months ago from now, I learned about the new T450 laptops and how they introduced again the physical buttons for the trackpoint there… and felt happy and upset at the same time: happy to know that Lenovo finally reconsidered their position and decided to bring back some sanity to the legendary trackpoint, but upset because I realized I had bought the only Thinkpad to have ever featured such an insane device.

Luckily enough, I recently found that someone was selling this T450’s new touchpads with the physical buttons in eBay, and people in many places seemed to confirm that it would fit and work in the T440, T440s and T440p (just google for it), so I decided to give it a try.

So, the new touchpad arrived here last week and I did try to fit it, although I got a bit scared at some point and decided to step back and leave it for a while. After all, this laptop is 7 months old and I did not want to risk breaking it either :-). But then I kept reading the T440s’s Hardware Maintenance Manual in my spare time and learned that I was actually closer than what I thought, so decided to give it a try this weekend again… and this is the final result:

T440s with trackpoint buttons!

Initially, I thought of writing a detailed step by step guide on how to do the installation, but in the end it all boils down to removing the system board so that you can unscrew the old clickpad and screw the new one, so you just follow the steps in the T440s’s Hardware Maintenance Manual for that, and you should be fine.

If any, I’d just add that you don’t really need to remove the heatskink from the board, but just unplug the fan’s power cord, and that you can actually do this without removing the board completely, but just lifting it enough to manipulate the 2 hidden screws under it. Also, I do recommend disconnecting all the wires connected to the main board as well as removing the memory module, the Wifi/3G cards and the keyboard. You can probably lift the board without doing that, but I’d rather follow those extra steps to avoid nasty surprises.

Last, please remember that this model has a built-in battery that you need to disable from the BIOS before starting to work with it. This is a new step compared to older models (therefore easy to overlook) and quite an important one, so make sure you don’t forget about it!

Anyway, as you can see the new device fits perfectly fine in the hole of the former clickpad and it even gets recognized as a Synaptics touchpad, which is good. And even better, the touchpad works perfectly fine out of the box, with all the usual features you might expect: soft left and right buttons, 2-finger scrolling, tap to click…

The only problem is that the trackpoint’s buttons would not work that well: the left and right buttons would translate into “scroll up” and “scroll down” and the middle button would simply not work at all. Fortunately, this is also covered in Petter Hutterer’s blog, where he explains that all the problems I was seeing are expected at this moment, since some patches in the Kernel are needed for the 3 physical buttons to become visible via the trackpoint again.

But in any case, for those like me who just don’t care about the touchpad at all, this comment in the tracking bug for this issue explains a workaround to get the physical trackpoint buttons working well right now (middle button included), simply by disabling the Synaptics driver and enabling psmouse configured to use the imps protocol.

And because I’m using Fedora 21, I followed the recommendation there and simply added psmouse.proto=imps to the GRUB_CMDLINE_LINUX line in /etc/default/grub, then run grub2-mkconfig -o /boot/grub2/grub.cfg, and that did the trick for me.

Now I went into the BIOS and disabled the “trackpad” option, not to get the mouse moving and clicking randomly, and finally enabled scrolling with the middle-button by creating a file in /etc/X11/xorg.conf.d/20-trackpoint.conf (based on the one from my old x201), like this:

Section "InputClass"
        Identifier "Trackpoint Wheel Emulation"
        MatchProduct "PS/2 Synaptics TouchPad"
        MatchDriver "evdev"
        Option  "EmulateWheel"  "true"
        Option  "EmulateWheelButton" "2"
        Option  "EmulateWheelInertia" "10"
        Option  "EmulateWheelTimeout" "190"
        Option  "Emulate3Buttons" "false"
        Option  "XAxisMapping"  "6 7"
        Option  "YAxisMapping"  "4 5"

So that’s it. I suppose I will keep checking the status of the proper fix in the tracking bug and eventually move to the Synaptic driver again once all those issue get fixed, but for now this setup is perfect for me, and definitely way better than what I had before.

I only hope that I hadn’t forgotten to plug a cable when assembling everything back. At least, I can tell I haven’t got any screw left and everything I’ve tested seems to work as expected, so I guess it’s probably fine. Fingers crossed!

26 de marzo de 2015

Building a SNES emulator with a Raspberry Pi and a PS3 gamepad

It’s been a while since I did this, but I got some people asking me lately about how exactly I did it and I thought it could be nice to write a post answering that question. Actually, it would be a nice thing for me to have anyway at least as “documentation”, so here it is.

But first of all, the idea: my personal and very particular goal was to have a proper SNES emulator plugged to my TV, based on the Raspberry Pi (simply because I had a spare one) that I could control entirely with a gamepad (no external keyboards, no ssh connection from a laptop, nothing).

Yes, I know there are other emulators I could aim for and even Raspberry specific distros designed for a similar purpose but, honestly, I don’t really care about MAME, NeoGeo, PSX emulators or the like. I simply wanted a SNES emulator, period. And on top of that I was quite keen on playing a bit with the Raspberry, so I took this route, for good or bad.

Anyway, after doing some investigation I realized all the main pieces were already out there for me to build such a thing, all that was needed was to put them all together, so I went ahead and did it. And these are the HW & SW ingredients involved in this recipe:

Once I got all these things around, this is how I assembled the whole thing:

1. Got the gamepad paired and recognized as a joystick under /dev/input/js0 using the QtSixA project. I followed the instructions here, which explain fairly well how to use sixpair to pair the gamepad and how to get the sixad daemon running at boot time, which was an important requirement for this whole thing to work as I wanted it to.

2. I downloaded the source code of PiSNES, then patched it slightly so that it would recognize the PS3 DualShock gamepad, allow me define the four directions of the joystick through the configuration file, among other things.

3. I had no idea how to get the PS3 gamepad paired automatically when booting the Raspberry Pi, so I wrote a stupid small script that would basically wait for the gamepad to be detected under /dev/input/js0, and then launch the snes9x.gui GUI to choose a game from the list of ROMS available. I placed it under /usr/local/bin/snes-run-gui, and looks like this:



# Wait for the PS3 Game pad to be available
while [ ! -e /dev/input/js0 ]; do sleep 2; done

# The DISPLAY=:0 bit is important for the GUI to work
DISPLAY=:0 $BASEDIR/snes9x.gui

4. Because I wanted that script to be launched on boot, I simply added a line to /etc/xdg/lxsession/LXDE/autostart, so that it looked like this:

@lxpanel --profile LXDE
@pcmanfm --desktop --profile LXDE
@xscreensaver -no-splash

By doing the steps mentioned above, I got the following “User Experience”:

  1. Turn on the RPi by simply plugging it in
  2. Wait for Raspbian to boot and for the desktop to be visible
  3. At this point, both the sixad daemon and the snes-run-gui script should be running, so press the PS button in the gamepad to connect the gamepad
  4. After a few seconds, the lights in the gamepad should stop blinking and the /dev/input/js0 device file should be available, so snes9x.gui is launched
  5. Select the game you want to play and press with the ‘X’ button to run it
  6. While in the game, press the PS button to get back to the game selection UI
  7. From the game selection UI, press START+SELECT to shutdown the RPi
  8. Profit!

Unfortunately, those steps above were enough to get the gamepad paired and working with PiSNES, but my TV was a bit tricky and I needed to do a few adjustments more in the booting configuration of the Raspberry Pi, which took me a while to find out too.

So, here is the contents of my /boot/config.txt file in case it helps somebody else out there, or simply as reference (more info about the contents of this file in RPiConfig):

# NOOBS Auto-generated Settings:

# Set sdtv mode to PAL (as used in Europe)

# Force sound to be sent over the HDMI cable

# Set monitor mode to DMT

# Overclock the CPU a bit (700 MHz is the default)

# Set monitor resolution to 1280x720p @ 60Hz XGA

As you can imagine, some of those configuration options are specific to the TV I have it connected to (e.g. hdmi_mode), so YMMV. In my case I actually had to try different HDMI modes before settling on one that would simply work, so if you are ever in the same situation, you might want to apt-get install libraspberrypi-bin and use the following commands as well:

 $ tvservice -m DMT # List all DMT supported modes
 $ tvservice -d edid.dat # Dump detailed info about your screen
 $ edidparser edid.dat | grep mode # List all possible modes

In my case, I settled on hdmi_mode=85 simply because that’s the one that work better for me, which stands for the 1280x720p@60Hz DMT mode, according to edidparser:

HDMI:EDID DMT mode (85) 1280x720p @ 60 Hz with pixel clock 74 MHz has a score of 80296

And that’s all I think. Of course there’s a chance I forgot to mention something because I did this in my random slots of spare time I had back in July, but that should be pretty much it.

Now, simply because this post has been too much text already, here you have a video showing off how this actually works (and let alone how good/bad I am playing!):

Video: Raspberry Pi + PS3 Gamepad + PiSNES

I have to say I had great fun doing this and, even if it’s a quite hackish solution, I’m pretty happy with it because it’s been so much fun to play those games again, and also because it’s been working like a charm ever since I set it up, more than half a year ago.

And even better… turns out I got it working just in time for “Father’s Day”, which made me win the “best dad in the world” award, unanimously granted by my two sons, who also enjoy playing those good old games with me now (and beating me on some of them!).

Actually, that has been certainly the most rewarding thing of all this, no doubt about it.

23 de marzo de 2015

WebKitGTK+ 2.8.0

We are excited and proud of announcing WebKitGTK+ 2.8.0, your favorite web rendering engine, now faster, even more stable and with a bunch of new features and improvements.


Touch support is one the most important features missing since WebKitGTK+ 2.0.0. Thanks to the GTK+ gestures API, it’s now more pleasant to use a WebKitWebView in a touch screen. For now only the basic gestures are implemented: pan (for scrolling by dragging from any point of the WebView), tap (handling clicks with the finger) and zoom (for zooming in/out with two fingers). We plan to add more touch enhancements like kinetic scrolling, overshot feedback animation, text selections, long press, etc. in future versions.

HTML5 Notifications


Notifications are transparently supported by WebKitGTK+ now, using libnotify by default. The default implementation can be overridden by applications to use their own notifications system, or simply to disable notifications.

WebView background color

There’s new API now to set the base background color of a WebKitWebView. The given color is used to fill the web view before the actual contents are rendered. This will not have any visible effect if the web page contents set a background color, of course. If the web view parent window has a RGBA visual, we can even have transparent colors.


A new WebKitSnapshotOptions flag has also been added to be able to take web view snapshots over a transparent surface, instead of filling the surface with the default background color (opaque white).

User script messages

The communication between the UI process and the Web Extensions is something that we have always left to the users, so that everybody can use their own IPC mechanism. Epiphany and most of the apps use D-Bus for this, and it works perfectly. However, D-Bus is often too much for simple cases where there are only a few  messages sent from the Web Extension to the UI process. User script messages make these cases a lot easier to implement and can be used from JavaScript code or using the GObject DOM bindings.

Let’s see how it works with a very simple example:

In the UI process, we register a script message handler using the WebKitUserContentManager and connect to the “script-message-received-signal” for the given handler:

webkit_user_content_manager_register_script_message_handler (user_content, 
g_signal_connect (user_content, "script-message-received::foo",
                  G_CALLBACK (foo_message_received_cb), NULL);

Script messages are received in the UI process as a WebKitJavascriptResult:

static void
foo_message_received_cb (WebKitUserContentManager *manager,
                         WebKitJavascriptResult *message,
                         gpointer user_data)
        char *message_str;

        message_str = get_js_result_as_string (message);
        g_print ("Script message received for handler foo: %s\n", message_str);
        g_free (message_str);

Sending a message from the web process to the UI process using JavaScript is very easy:"bar");

That will send the message “bar” to the registered foo script message handler. It’s not limited to strings, we can pass any JavaScript value to postMessage() that can be serialized. There’s also a convenient API to send script messages in the GObject DOM bindings API:

webkit_dom_dom_window_webkit_message_handlers_post_message (dom_window, 
                                                            "foo", "bar");


Who is playing audio?

WebKitWebView has now a boolean read-only property is-playing-adio that is set to TRUE when the web view is playing audio (even if it’s a video) and to FALSE when the audio is stopped. Browsers can use this to provide visual feedback about which tab is playing audio, Epiphany already does that :-)


HTML5 color input

Color input element is now supported by default, so instead of rendering a text field to manually input the color  as hexadecimal color code, WebKit now renders a color button that when clicked shows a GTK color chooser dialog. As usual, the public API allows to override the default implementation, to use your own color chooser. MiniBrowser uses a popover, for example.



APNG (Animated PNG) is a PNG extension that allows to create animated PNGs, similar to GIF but much better, supporting 24 bit images and transparencies. Since 2.8 WebKitGTK+ can render APNG files. You can check how it works with the mozilla demos.



The POODLE vulnerability fix introduced compatibility problems with some websites when establishing the SSL connection. Those problems were actually server side issues, that were incorrectly banning SSL 3.0 record packet versions, but that could be worked around in WebKitGTK+.

WebKitGTK+ already provided a WebKitWebView signal to notify about TLS errors when loading, but only for the connection of the main resource in the main frame. However, it’s still possible that subresources fail due to TLS errors, when using a connection different to the main resource one. WebKitGTK+ 2.8 gained WebKitWebResource::failed-with-tls-errors signal to be notified when a subresource load failed because of invalid certificate.

Ciphersuites based on RC4 are now disallowed when performing TLS negotiation, because it is no longer considered secure.

Performance: bmalloc and concurrent JIT

bmalloc is a new memory allocator added to WebKit to replace TCMalloc. Apple had already used it in the Mac and iOS ports for some time with very good results, but it needed some tweaks to work on Linux. WebKitGTK+ 2.8 now also uses bmalloc which drastically improved the overall performance.

Concurrent JIT was not enabled in GTK (and EFL) port for no apparent reason. Enabling it had also an amazing impact in the performance.

Both performance improvements were very noticeable in the performance bot:



The first jump on 11th Feb corresponds to the bmalloc switch, while the other jump on 25th Feb is when concurrent JIT was enabled.

Plans for 2.10

WebKitGTK+ 2.8 is an awesome release, but the plans for 2.10 are quite promising.

  • More security: mixed content for most of the resources types will be blocked by default. New API will be provided for managing mixed content.
  • Sandboxing: seccomp filters will be used in the different secondary processes.
  • More performance: FTL will be enabled in JavaScriptCore by default.
  • Even more performance: this time in the graphics side, by using the threaded compositor.
  • Blocking plugins API: new API to provide full control over the plugins load process, allowing to block/unblock plugins individually.
  • Implementation of the Database process: to bring back IndexedDB support.
  • Editing API: full editing API to allow using a WebView in editable mode with all editing capabilities.

20 de marzo de 2015

GStreamer Hackfest 2015

Last weekend I visited my former office in (lovely) Staines-upon-Thames (UK) to attend the GStreamer hackfest 2015, along with other ~30 hackers from all over the world.

This was my very first GStreamer hackfest ever and it was definitely a great experience, although at the beginning I was really not convinced to attend since, after all, why bother attending an event about something I have no clue about?

But the answer turned out to be easy in the end, once I actually thought a bit about it: it would be a good opportunity both to learn more about the project and to meet people in real life (old friends included), making the most of it happening 15min away from my house. So, I went there.

And in the end it was a quite productive and useful weekend: I might not be an expert by now, but at least I broke the barrier of getting started with the project, which is already a good thing.

And even better, I managed to move forward a patch to fix a bug in PulseAudio I found on last December while fixing an downstream issue as part of my job at Endless. Back then, I did not have the time nor the knowledge to write a proper patch that could really go upstream, so I focused on fixing the problem at hand in our platform. But I always felt the need to sit down and cook a proper patch, and this event proved to be the perfect time and place to do that.

Now, thanks to the hackfest (and to Arun Raghavan in particular, thanks!), I’m quite happy to see that the right patch might be on its way to be applied upstream. Could not be happier about it! :)

Last, I’d like to thank to Samsung’s OSG, and specially to Luis, for having done a cracking job on making sure that everything would run smoothly from beginning to end. Thanks!

17 de marzo de 2015

How do you upgrade your distro? A tale of two workarounds

Every classic Linuxer would know why it's very handy to dedicate a separate partition for the /home folder of your tree: you could in theory share it between multiple OSs that you installed in your box (which you choose to run when you start your computer).

Now, I'm guessing that many people reading and nodding to the above, will also know that sharing /home/ is one thing, sharing $HOME (/home/yourUserName) is a completely different beast.

For example: you have a stable distro installed in your box; you decide to install a new version of that distro along the old one, in the same box. You run the new distro with a new account tied to the old /home/yourUserName folder: KABOOM!!! Weird things start happening. Among these:

  • The newer versions of your desktop or desktop programs don't run properly with the settings saved in your .dotDirectories (they are to blame because they didn't probably have a settings-conversion feature).
  • The newer versions of your desktop or desktop programs have a buggy settings-conversion feature; because your program does not run properly, or as well as it would have run if it had been ran for the first time with no settings saved at all.
  • The newer versions of your non-buggy desktop or desktop programs convert your settings to a new format. Then when you go back and run your old distro again, your old-versioned programs stop working because they see settings in a new format which they don't understand. (This is impossible to fix, or very hard.) It's very important that this scenario works, because the migration to the new version of your distro may not be immediate, it may take you some days to figure everything out, and until that happens, you want to still be able to run the stable version of your desktop and desktop programs
  • Etc.

To workaround these problems, I have a strategy: I use a different /home/ sub-directory for each distro installed in my system. For example, for distro X version A.B I use /home/knocteXAB/, for distro Y version C.D I use /home/knocteYCD/. The advantage about this is that you can migrate your settings manually and at your own pace. But then, you may be asking, how to really take advantage of sharing the /home folder when using this technique?

Easy: I keep non-settings data (mainly the non-dotfiles) in a different /home/ folder with no associated account in any of the distros. For example: /home/knocte/ (no version suffix). Then, from each of the suffixed /home/ subfolders, I setup symlinks to this other folder, setting the appropriate permissions. For instance:

  • /home/knocteXAB/Music -> /home/knocte/Music
  • /home/knocteXAB/Documents -> /home/knocte/Documents
  • /home/knocteYCD/Music -> /home/knocte/Music
  • /home/knocteYCD/Documents -> /home/knocte/Documents
  • Etc.
You may think that it's an interesting strategy and that I'm done with the blog post, however, when using this strategy you may start finding buggy applications that don't deal very well with symlinked paths. The one I found which annoyed the most was my favourite Gnome IDE, because it meant I couldn't develop software without problems. I mean, they were not just cosmetic problems, really:

So I had to use a workaround for my workaround: clone all my projects in $HOME instead of /home/knocte/Documents/Code/OpenSource/ (yah, I'm this organized ;) ).

I've been trying to fix these problems for a while, without much time on my hands.

But the last weeks a magical thing happened: I decided to finally sit down and try to fix the last two remaining, and my patches were all accepted and merged last week! (at least all the ones fixing symlink-related problems), woo!!!

So the lessons to learn here are:

  • Even the slickest workarounds have problems. Try to fix or report settings-conversion bugs!!
  • Don't ever quit trying to fix a problem. Some day you'll have the solution and you will realize it was simpler than you thought.
  • realpath is your friend.
  • MonoDevelop (master branch) is now less buggy and as amazing as (or more than) ever (</PUBLIC_SERVICE_ANNOUNCEMENT>).

10 de marzo de 2015

Qué es el procomún

El siguiente texto lo he preparado a la sazón del programa de actividades complementarias del Almería Creative Commons Film Festival, el primer festival, y casi la primera actividad, en Almería exclusivamente dedicado a este mundo. Me ha gustado tanto que he querido publicarlo en mi propio blog. Aquí queda:


El DRAE lo define como

        ( De pro, provecho, y común).
        1. m. Utilidad pública.

pero el filósofo Antonio Lafuente va mucho más allá:

«lo que es de todos y de nadie al mismo tiempo»

Para Antonio la expresión procomún es la traducción al español más acertada para el término inglés commons. Pero ¿tiene que ver el procomún con nuestra vida diaria? Absolutamente: el aire, el futuro, los sentimientos, el ADN, todos son procomunes cotidianos, casi personales. Otros son más distantes pero igualmente indispensables: las pesquerías, parques naturales… la lista es ¿infinita?. Y tenemos otros procomunes que están floreciendo avivados por el galopante desarrollo tecnológico: el software libre, la Wikipedia, Internet y la Web dentro de ella. El mismo HackLab Almería es un modesto procomún que nos empeñamos en construir para ponerlo a vuestra disposición.

18 de febrero de 2015

¿Cambios en la AC FNMT-RCM? Probando el servidor OCSP

#BG_1424275458364_78302 { float: right; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; width: 300px; } #BG_1424277684349_27454 { float: right; margin-top: 1em; margin-bottom: 1em; margin-left: 1em; width: 300px; }

A raíz de un hilo en Twitter sobre la inexistencia del servicio de CRL de la Autoridad de Certificación de la FNMT sólo se me ha ocurrido que en vez de dedicarme a mis responsabilidades me era imperioso saber qué se estaba cociendo... La noticia más chocante es la actividad reciente en la infame entrada #435736 del bugzilla de Mozilla (abierta desde 2008 para que Mozilla acepte el certificado raiz de la AC FNMT). Parece que por fin alguien se está aplicando a resolver el problema. Y entre las perlas más suculentas allí recogidas está un documento titulado General Certification Practices Statement en el que aparecen detalles como, precisamente, las URIs de publicación de los CRL o los varios servicios OCSP aparentemente disponibles. Si eres de los que han estudiado anteriormente el uso de CERES-FNMT probablemente hayas levantado una ceja. Sí: parece que están habilitando por fin estos servicios. El que no conozca la causa de nuestra sorpresa deberá saber que hasta ahora el servicio de validación de certificados de CERES FNMT para certificados de usuario final (por ejemplo de ciudadanos corrientes y molientes) ha sido de pago (ver ilustración). Para algunos esta ha sido otra de las causas que han lastrado la adopción de la firma digital en España.

Entre los detalles me han llamado la atención las URIs de los servicios OCSP:

y claro, inmediatamente he querido verificar si ya estaban operativos, con la triste circunstancia de que no tengo ni idea de cómo hacerlo. Tras algo de investigación y con oportunismo de corta y pega he dado con una orden que creo serviría:

openssl ocsp -issuer AC_Raiz_FNMT-RCM_SHA256.cer -serial 0x36f11b19 -url -CAfile AC_Raiz_FNMT-RCM_SHA256.cer 
  • -issuer AC_Raiz_FNMT-RCM_SHA256.cer el certificado raiz de la AC en cuestión;
  • -serial 0x36f11b19 el número de serie de un certificado FNMT emitido en 2005 y caducadísimo;
  • -url la URI del servicio OCSP que usaremos, en este caso he elegido el que arriba aparece denominado «ROOT AC. Access» porque me ha parecido el más general para el servicio de particulares comparado con los otros dos;
  • -CAfile AC_Raiz_FNMT-RCM_SHA256.cer realmente no sé porqué habría de usar este parámetro, entiendo que es para verificar el resultado ofrecido por el servicio OCSP y todos los ejemplos que he encontrado lo usan de alguna forma; curiosamente sólo he conseguido eliminar los mensajes de error usando el mismo certificado que en -issuer pero no sé si es el comportamiento correcto o si en este caso funciona así por ser un certificado raiz autofirmado.

El resultado obtenido es el siguiente:

Response verify OK
0x36f11b19: good
    This Update: Nov 18 12:11:20 2014 GMT
    Next Update: May 17 11:11:20 2015 GMT

Y podréis decir «pues qué bien, ¿no?». O no. No lo sé. Ignoro los intríngulis de protocolo OCSP pero me esperaba  otra respuesta para un certificado caducado hace más de ocho años. El  caso es el que servicio sí está levantado y podemos ver más detalles usando la opción -text de openssl oscp:

OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Produced At: Feb 18 16:27:29 2015 GMT
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: BADF8AE3F7EB508C94C1BAE31E7CDC3A713D4437
      Issuer Key Hash: F77DC5FDC4E89A1B7764A7F51DA0CCBF87609A6D
      Serial Number: 36F11B19
    Cert Status: good
    This Update: Nov 18 12:11:20 2014 GMT
    Next Update: May 17 11:11:20 2015 GMT

El caso es que he probado a usar variantes del número serie aleatorias así como de certificados en vigor y siempre da un «good» por respuesta. Y lo poco que me ha podido contar alguien más familiarizado con la tecnología de AC es que este tipo de comportamiento en un servicio OCSP sería normal.


  • El servicio OCSP de FNMT, o al menos el que he usado, está levantado, sí, pero ¿ya está realmente operativo?
  • ¿Es correcta mi manera de invocarlo desde openssl? no estoy seguro;

Otras conclusiones:

Diría que efectivamente parece FNMT se ha tomado en serio configurarse como una autoridad de certificación seria. Por fin. Supongo que ha podido la presión de al menos los usuarios corporativos públicos que últimamente están emitiendo sus certifcados X509 de servidor a través de Camerfirma (verbigracia la Agencia Tributaria), supongo que cansados de que los usuarios menos avezados se hagan un lío con el proceso de instalación del certificado raiz adecuado y de no saber interpretar correctamente los mensajes de precaución de los navegadores. También parece que empiezan a dejar de usar el nombre Ceres para referirse al servicio. Al menos ha sido mi impresión.

Si alguien detecta errores en lo aquí mostrado estaré encantado de corregir lo que haga falta.


15 de febrero de 2015

I shot the Tracker

In free software some fashions never change, and some are particularly hard to overcome. Today I’ll talk about the “Tracker makes $ANYTHING slow” adage, lately gnome-music being on the spotlight here. I’m glad that I could personally clear this up to some individuals on the hackfests/conferences I’ve been around lately.

But convincing is a never ending labor, there’s still confused people around the internets, and disdainful looks don’t work as well over there. The next best thing I could do is fixing things myself to make Tracker look less like the bad guy. So, from the “can’t someone else do it” department, here’s some commits to improve the situation. The astute reader might notice that there is nothing about tracker in these changes.

There’s of course more to it, AFAICT other minor performance hits are caused by:

  • grilo emitting one signal per media item found, which is somewhat bad on huge lists
  • icon view performance generally sucking, which makes scrolling not as smooth in the Albums view while covers are loading
  • After all that, well sure, Tracker queries can be marginally optimized.

This will eventually hit master and packages, until then, do me a favor an point to this post anyone still saying how Tracker made gnome-music slow.

Developer experience hackfest

Kind of on topic with this, I attended a few weeks ago to the Developer experience hackfest. Besides trying to peg round pieces into square holes, after some talking with how much of a steep barrier was Sparql as a prerequisite for accessing Tracker data, I started there on a simpler query API that abstracted all of these gritty details. Code is just shaping up there, but I expect it to cover the most common usecases. I must thank Red Hat and Collabora for enabling me to go there, all the people there, and particularly Philip for being such a great host.

Oh, and also attended Fosdem and Devconf, even talked on the last one about the input plans going on in GNOME, busy days!

01 de febrero de 2015

¿Cambios en la AC FNMT-RCM? Probando el servidor OCSP

A raíz de un hilo en Twitter sobre la inexistencia del servicio de CRL de la Autoridad de Certificación de la FNMT sólo se me ha ocurrido que en vez de dedicarme a mis responsabilidades me era imperioso saber qué se estaba cociendo... La noticia más chocante es la actividad reciente en la infame entrada #435736 del bugzilla de Mozilla (la que está abierta desde 2008 para que Mozilla pueda aceptar el certificado raiz de la AC FNMT). Parece que por fin se han puesto en serio a resolver el problema. Y entre las perlas más suculentas está un documento titulado General Certification Practices Statement en el que aparecen detalles como precisamente las URIs de publicación de los CRL o los varios servicios OCSP aparentemente disponibles. Si eres de los que han estudiado anteriormente el uso de CERES-FNMT probablemente has levantado una ceja. Sí: parece que están habilitando por fin estos servicios, aunque en mi ignorancia técnica aún no he sido capaz de validar 100% que están operativos. El que no conozca la causa de nuestra sorpresa deberá saber que hasta ahora el servicio de validación de certificados de CERES FNMT para certificados de usuario final (por ejemplo de ciudadanos corrientes y molientes) ha sido de pago. Para algunos esta ha sido otra de las causas del impacto limitado de la adopción de la firma digital en España.

IMG ~/public_html/ilustraciones/diario/201502-fnmt-ocsp.png


28 de enero de 2015

Parcheando GHOST

GHOST es un nuevo bug de seguridad (esta vez en glibc, más en concreto en la función gehostbyname que se usa en casi cualquier aplicación que trabaje con la red, como por ejemplo, apache, mysql, ssh…) que permite tomar el control remoto de una máquina Linux. Se hizo público ayer. Dada la peligrosidad del bug, […]

08 de enero de 2015

Frogr 0.11 released

Screenshot of Frogr 0.11

So, after neglecting my responsibilities with this project for way too long, I finally released frogr 0.11 now, making the most that I’m now enjoying some kind of “parenting vacation” for a few days.

Still, do not expect this new release to be fully loaded of new features and vast improvements, as it’s more like another incremental update that adds a couple of nice new things and fixes a bunch of problems I was really unhappy about (e.g. general slowness, crashes).

Wrapping it up, the main changes included with this release are:

  • Moved to the new GTK+’s header bar plus the typical menu button when GTK+ >= 3.12 (GTK+ 3.4 is still supported). I personally like this change a lot, as it makes frogr much more compact and sleek IMHO, and much better integrated with newer releases of GNOME.
  • Added a new option to automatically replace the “date posted” field in flickr with the “date taken” value from the EXIF metadata when uploading pictures. Useful to keep your photo stream sorted regardless of when you uploaded which pictures. Thanks a lot to Luc Pionchon for requesting this feature. I never thought of it before, now I use it all the time!
  • Sped up the load of pictures into the main window, as it was a very slow process when importing tags from the XMP keywords was enabled. I measured a 3x improvement, but YMMV.
  • Fixed random crashes due to the missing initialization of the gcrypt library introduced with the recent changes to use SSL API end points. Thanks a lot Andrés for your help with this!
  • Fixed issues related to the OS X port, which prevented frogr 0.9 from having video support and caused many problems with the 0.10 release. Now it should be fine, grab the bundle from here.
  • Other things: removed calls to deprecated APIs, updated translations, fixed a few minor bugs and a bit of a clean-up here and there, which is usually good.

As usual, feel free to check the website of the project in case you want to know more about frogrhow to get it or how to contribute to it. I’m having a hard time lately to find time to devote to this pet project, so any help anyone can provide will be more than welcome :-) fosdem-15-logo

By the way, I’m going to FOSDEM this year again, so feel free to say “hi” if you want to chat and/or share a beer (or more!).

07 de enero de 2015

Streams API in WebKit at the Web Engines Hackfest

Yes, I know, I should have written this post before you know, blah, blah, excuse 1, blah, excuse 2, etc. 😉

First of course I would like to thank Igalia for allowing me to use the company time to attend the hackfest and meeting such a group of amazing programmers! It was quite intense and I tried to give my best though for different reasons (coordination, personal and so on) I missed some session.

My purpose at the hackfest was to work with Youenn Fablet from Canon on implementing the Streams API in WebKit. When we began to work together in November, Youenn had already a prototype working with some tests, so the idea was taking that, completing, polishing and shipping it. Easy, huh? Not so…

What is Streams? As you can read in the spec, the idea is to create a way of handling different kind of streams with a common high level API. Those streams can be a mapping of low level I/O system operations or can be easily created from JavaScript.

Fancy things you can do:

  • Create readable/writable streams mapping different operations
  • Read/write data from/to the streams
  • Pipe data between different streams
  • Handle backpressure (controlling the data flow) automagically
  • Handle chunks as the web application sees fit, including different data types
  • Implement custom loaders to feed different HTML tags (images, multimedia, etc.)
  • Map some existing APIs to Streams. XMLHttpRequest would be a wonderful first step.

First thing we did after the prototype was defining a roadmap:

  • General ReadableStream that you can create at JavaScript and read from it
  • XMLHttpRequest integration
  • Loaders for some HTML tags
  • WritableStream
  • Piping operations

As you can see in bugzilla we are close to finishing the first point, which took quite a lot of effort because it required:

  • Code cleaning
  • Making it build in debug
  • Improving the tests
  • Writing the promises based constructor
  • Fixing a lot of bugs

Of course we didn’t do all this at the hackfest, only Chuck Norris would have been able to do that. The hackfest provided the oportunity of meeting Youenn in person, working side by side and discussing different problems and possible strategies to solve them, like for example, the error management, queueing chunks and handling their size, etc. which are not trivial given the complexity created by the flexibility of the API.

After the hackfest we continued working and, as I said before, the result you can find at bugzilla. We hope to be able to land this soon and continue working on the topic within the current roadmap.

To close the topic about the hackfest, it was a pleasure to work with such amount of awesome web engines hackers and I would like to finish thanking the sponsors Collabora and Adobe and specially my employer, Igalia, that was sponsor and host.

16 de diciembre de 2014


In the last year working at Xamarin, I have learned lots of new things (.NET, Cocoa, …), and since the beginning of that, I was thinking on bringing some of that nice stuff to GNOME, but didn’t really had the chance to finish anything. But, fortunately, being free now (on vacation), I finally finished the 1st thing: GObservableCollection, a thread-safe collection implementation which emits signals on changes.

It is based on ideas from .NET’s ObservableCollection and concurrent collections, which I’ve used successfully for building a multi-thread data processing app (with one thread updating the collection and another consuming it), so I thought it would be a good addition to GLib’s API. This class can be used on single-threaded apps to easily get notifications for changes in a collection, and in multi-threaded ones for, as mentioned above, easily share data between different threads (as can be seen on the simple test I wrote).

This is the 1st working version, so for sure it will need improvements, but instead of keeping it private for a few more months, I thought it would be better getting some feedback before I submit it as a patch for GLib’s GIO (if that’s the best place for it, which I guess it is).

28 de septiembre de 2014

HackIt! 2014 : epílogo

Tras mi insistencia a @ramonechavarri y @abeaumont de w0pr para que nos echara un cable con el writeup de alguno de los dos levels del HackIt! 2014 que se nos quedaron en el tintero, nos pasaron hace unos días un extenso y completo texto que explica paso a paso en qué consiste y cómo superar el […]

22 de septiembre de 2014

GNOME 3.14 approaching

With 3.14 almost out of the door, it seems like a good opportunity to blow the cobwebs of this blog and highlight some shiny new features I was involved in during this cycle:

Gesture support in GTK+

It’s finally happening :), GTK+ 3.14 brings in infrastructure to handle gestures. Maybe the word “gesture” is automatically associated to “multitouch”, but actually this infrastructure is meant to deal with all kinds of pointer/touch input, and as such is used fairly intensively now within GTK+ itself, so even mouse users will be unknowingly using this.

These gesture objects are of course readily available for applications too. Individually, these are quite simple in essence, but can be easily stitched together to compound higher-level behavior. So far, eog and evince (and by extension gnome-documents) have bitten the bullet and now handle some of the gestures you’d expect on touchscreens there, the API documentation and HowDoI are available for anyone wanting to follow.

Gesture support in gnome-shell

Just to feed the cabal claiming that gnome-shell is designed for tablets, I also managed this cycle to add gesture infrastructure in mutter, so it is able to pre-process touch events before applications do, these events are then handled through ClutterGestureActions, or “rejected” and eventually handled by the application. This has been put to use in gnome-shell, making some actions readily available through multitouch.

Edge swipes

Showing the overview

Switching workspaces

Switching apps in a workspace

Note: Recorded with the help of this, bug #732367 is yet another 3.16 todo item…

Freebase support in libgdata

This one feature has certainly went underpublicited, and I found myself with little time to make use of it :(, but I nonetheless find that very interesting things can be done with this. Freebase is a community-maintained knowledge base (currently backed by Google), as seen on its homepage it is extremely wide in topics (some better covered than others), and has a very well defined ontology, think of it as a companion to Tracker on the web.

There are dedicated methods for the most usual ways to query data (search, lookup on topic…), but additionally Freebase offers a powerful MQL query method. MQL is very analogous to SPARQL, with the main difference that it’s based on JSON. All together allows for querying in very creative ways from very various data, a few examples being:

  • The mandatory “query for movie/album info” example, actually these topics are the best covered.
  • Fetching stock images for movies/cities/landmarks/directors/…, you name it.
  • Looking up monuments close to a geolocation.
  • Getting direct links to Wikipedia, in your language.

Looking forward for 3.15

It is almost time to celebrate, but I evidently won’t sit twiddling my thumbs :), a few items I’d like to tackle on the next cycle are:

  • During the 3.14 cycle I got briefly started on adding optional gesture integration to GtkStack and a new “tabs” widget, now it sounds like a good time to resume. I would also like to make gestures used integrally for event handling in GTK+ (we’re already just a few widgets away from that goal)
  • There’s a few gaps still left to solve on handling touchpad gestures, which I’d like to get closed ASAP, at least for touchpads handling >2 fingers on X11.
  • Improving gnome on Wayland. I merely got started this cycle adding DnD/clipboards support to GTK+ and bringing touchscreen behavior on mutter more or less on par to X11’s. There’s a few input details that need shuffling so they’re done in the same place on X11/wayland (pointer cursor visibility, device mapping…), and I hope the timing to be right to bring in a sort of tablet support (libinput and wayland protocol details have been shaping up despite my times on, most times off help, thanks Peter, Lyude, Jason et al!), I will be putting my hacking efforts wherever it’s necessary to make this happen.
  • WebKitGTK+ could be definitely made friendlier on touchscreens, additionally to the DOM touch event support it already does, it would be great to handle touch scroll/pinch/zoom as you can see in other pure GTK+ apps now.

26 de agosto de 2014

HackIt! 2014: final

Hubo otra prueba que nos tuvo a todos los participantes danzando al lado de la “caseta” de redes y sistemas. @marcan42 puso una Raspberry Pi enviando pings extraños vía wifi. El título del level era “Raspberry Pi(ng)” y el enunciado decía: “Hemos montado una Raspberry Pi de router wifi (¡no se lo digas a Iban!), […]

Endless changes ahead!

I know I haven’t blogged for a while, and definitely not as much as I would like, but that was partially because I was quite busy during my last days in Samsung (left on the 25th of July), where I wanted to make sure I did not leave any loose end before departure, and that everything was properly handed over to the right people there.

But that was one month ago… so what did I do since then? Many many things, and most of them away from a keyboard, at least until the past week. Main highlights:

  • One week travelling by car with my family all the way down to Spain from the UK, through France, visiting all the nice places we could (and could afford) in the way, which was a lot of fun and an incredible experience.
  • The goal of taking the car to Spain was to sell it once we were there and, surprisingly enough, we did it in record time, so one thing less to worry about…
  • 2 weeks in Spain having proper “relaxing holidays” to get some quality time off in between the two jobs, to properly recharge batteries. Not that the previous week was not holidays, but travelling 2200 km by car with two young kids on the back can be amazing and exhausting at the same time :-)
  • 1 week in the UK to make sure I had everything ready by the time I officially started in the new company, where I will initially be working from home: assemble a home office in my spare bedroom, and prepare my new laptop mainly. In the end, we (my wife helped me a lot) finished by Wednesday, so on Thursday we went for a last 2-day getaway to Wales (what a beautiful place!) by car, making the most that we were kids-free.

Endless Mobile logoTherefore, as you can imagine, I didn’t have much time for blogging lately, but still I would like to share with the world my “change of affiliation” so here it is: since yesterday I’m officially part of the amazing team at Endless, an awesome start up from San Francisco committed to break the digital divide in the developing world by taking GNOME-based technology to the end users in ways that were not imaginable before. And I have to say that’s a vision I fell in love with since the very first time I heard about it (last year in Brno, during Matt’s keynote at GUADEC).

But just in case that was not awesome enough by itself, the other thing that made me fall in love with the company was precisely the team they have assembled, because even if I’m mostly a technical guy, I still value a lot the human side of the places I work in. And in this regard Endless seems to be perfect, or even better!

So, I’m extremely happy these days because of this new challenge I’m seeing in front of me, and because of the opportunity I’m being given to have a real positive impact in the lives of millions of people who still can’t access to technology as they should be able to do it. Also, I feel blessed and privileged for having been given the chance to be part of such an amazing team of people. Could not be happier at this time! :)

Last to finish this post, I would like to say thanks to my friend Joaquim, since he was who introduced me to Matt in the first place and “created” this opportunity for me. Thank you!

14 de agosto de 2014

HackIt! 2014 _ Level 6

¿Level 6? ¿Y qué ha pasado con el level 5? El nivel 5 está cocinándose en el server de @marcan42 (prepararlo sobre un server con arquitectura Big Endian requiere su tiempo ;-). Así que vamos a por el level 6. No pudimos superarlo en la competición. Tras la Euskal, con ayuda de Timosoft, supimos por […]

13 de agosto de 2014

HackIt! 2014 _ Level 4

“Bitcode. Esta vez te toca investigar lo profundo de Python.” Para ello, nos pasan un fichero tar.gz que contiene un archivo (texto plano) y otro routines.pyc (binario). # from routines import chk_serial   _in = raw_input("Do you feel lucky?: ") print chk_serial(_in) Así que lo que queda por hacer es entender la función […]

11 de agosto de 2014

HackIt! 2014 _ Level 3

nyan0verflow, “No siempre todo es lo que parece. Y lo que aparece no es siempre el todo”. Con la foto de un gato (no es nyan cat ;-) y el texto anterior empieza el tercer reto del HackIt! Atendiendo al nombre de la imagen, a simple vista parece que han usado algún algoritmo de esteganografía […]

10 de agosto de 2014

HackIt! 2014 _ Level 2

El nivel 2 del HackIt! tiene como título “Nivel Cromado”. Nos indican que es un nivel sólo compatible con Google Chrome (o Chromium). También hay un enlace a un fichero hackit.crx (una extensión para Chrome). Para instalarla en Chrome lo tuvimos que hacer descomprimiéndola y cargándola desde el botón “Cargar extensión descomprimida” del menú chrome://extensions/ […]

08 de agosto de 2014

HackIt! 2014 _ Level 1

24 de julio, a alguna hora de la noche cercana a las 22:00. Mis compañeros de DL me indican que marcan ha dado comienzo al HackIt de este año. Esta vez no podré acudir a la presentación y me tendré que aguantar hasta el viernes 25 a eso de las 18:00, así que estaré un […]

06 de agosto de 2014

GTK+ 3 Plugins in WebKitGTK+ and Evince Browser Plugin

GTK+ 3 plugins in WebKitGTK+

The WebKit2 GTK+ API has always been GTK+ 3 only, but WebKitGTK+ still had a hard dependency on GTK+ 2 because of the plugin process. Some popular browser plugins like flash or Java use GTK+ 2 unconditionally (and it seems they are not going to be ported to GTK+ 3, at least not in the short term). These plugins stopped working in Epiphany when it switched to GTK+ 3 and started to work again when Epiphany moved to WebKit2.

To support GTK+ 2 plugins we had to build the plugin process with GTK+ 2, but also some parts of WebCore and WebKit2 (the ones depending on GTK+ and used by the plugin process) were built twice. As a result we had a WebKitPluginProcess binary of ~40MB, that was always used for all the plugins. This kind of made sense, since there were no plugins using GTK+ 3, and the GTK+ 2 dependency was harmless for plugins not using GTK+ at all. However, we realized we were making a rule for the exception, since most of the plugins don’t even use GTK+, and there weren’t plugins using GTK+ 3 because they were not supported by any browser (kind of chicken-egg problem).

Since WebKitGTK+ 2.5.1 we have two binaries for the plugin process: WebKitPluginProcess2 which is exactly the same 40MB binary using GTK+ 2 that we have always had, but that now is only used to load plugins using GTK+ 2; and WebKitPluginProcess, a 7,4K binary that is now used by default for everything except loading plugins that use GTK+ 2. And since it links to GTK+ 3, it might load plugins using GTK+ 3 as well. Another side effect is that now we can make GTK+ 2 optional, WebKitPluginProcess2 wouldn’t be built and only plugins using GTK+ 2 wouldn’t be supported.

Evince Browser Plugin

For a long time, we have maintained that PDF documents shouldn’t be opened inside the browser, but downloaded and then opened by the default document viewer. But then the GNOME design team came up with new mockups for Epiphany were everything was integrated in the browser, including PDF documents. It’s something all the major browsers do nowadays, using different approaches though (Custom PDF plugin inside the web engine, JavaScript libraries, etc.).

At the WebKitGTK+ hackfest in 2012 we started to think about how to implement the integrated document reading in Epiphany based on the design mockups. We quickly discarded the idea of implementing it as a NPAPI plugin, because that would mean we had to use a very old evince version using GTK+ 2. We can’t implement it inside WebKit using libevince because it’s a GPL library, so the first approach was to implement it inside Epiphany using libevince. I wrote a first patch, it was mostly a proof of concept hack, that added a new view widget based on EvView to be used instead of a WebView when a document supported by evince was requested. This approach has a lot of limitations, since it only works when the main resource is a document, but not for documents embedded in a HTML page or an iframe, and a lot of integration problems that makes it quite difficult to maintain inside Epiphany. All of these issues would be solved by implementing it as a NPAPI plugin and it wouldn’t require any change in Epiphany. Now that WebKitGTK+ supports GTK+ 3 plugins, there’s no reason not to do so.

Epiphany Evince Plugin

Thanks to a project in Igalia I’ve been able to work on it, and today I’ve landed an initial implementation of the browser plugin to Evince git master. It’s only a first implementation (written in C++ 11) with the basic features (page navigation, view modes, zoom and printing), and a very simple UI that needs to be updated to match the mockups. It can be disabled at compile time like all other frontends inside Evince (thumbnailer, previewer, nautilus properties page).

Epiphany embedded PDF document Epiphany standalone PDF document

Another advantage of being a NPAPI plugin is that it’s scriptable so that you can control the viewer using JavaScript.

Epiphany scriptable PDF

And you can pass initial parameters (like current page, zoom level, view mode, etc.) from the HTML tag.

<object data="test.pdf" type="application/pdf" width="600" height="300" 
                currentPage="2" zoomMode="fit-page" continuous="false">
  The pdf could not be rendered.

You can even hide the default toolbar and build your own one using HTML and JavaScript.

01 de agosto de 2014

WebKitGTK+ 2.5.1: Good bye WebKit1

WebKitGTK+ 2.5.1 is the first version of this release cycle. It comes very late mainly due to the regressions introduced by the switch to CMake and the problems we found after removing WebKit1 from the tree. It also includes some new features that I’ll talk about in other posts, probably when 2.6.0 is released. In this post I’ll only focus on the breaks introduced in this release, in order to help everybody to adapt their applications to the API changes if needed.

Wait, but why breaking the API?

Since the release of WebKitGTK+ 2.0 the WebKit1 API has been considered deprecated and in maintenance mode. The new WebKit2 API is quite complete and stable now, so the plan for WebKitGTK+ 2.6 was removing WebKit1, leaving it alive, but still in maintenance mode, in the 2.4 branch. After removing the code from trunk we realized that newer versions of WebKitGTK+ that are WebKit2 only should be parallel installable with older versions of WebKitGTK+ that also include WebKit1. After some discussions trying to find the best solution, we reached the conclusion that we had to bump the binary version. But then I thought, since we were going to force everybody to recompile, why not take advantage to introduce some small (but necessary) API changes that in most of the cases will not affect the the users anyway? And then I started to review the API and proposing some changes. I also wanted to make sure all API changes were introduced in the first unstable release, so that users only have to adapt their applications once, and that’s the main reason why the release has taken so long.

Binary version bump

The new binary version is 4.0, so to use this new release you need to update your build system to look for webkit2gtk-4.0 pkg-config file.

GObject DOM Bindings

The GObject DOM bindings API situation was actually the main reason for breaking the API. The problem was that the code for the DOM bindings is generated automatically from the IDL files. This means that every time a new IDL file was added to the build system, we ended up exposing a new class in our public API without even noticing. Same happened when a API incompatible change was introduced in an IDL file, for example to update it to the current standard. We added a script to our build bots to warn us when that happened, and then we had to manually deprecate the existing API and add exceptions to the code generator. This was a lot of work just to keep backwards compatibility of an API nobody was using. Most of the people actually use a 5-10% of the DOM bindings API.

Since WebKitGTK+ 2.5.1 the GObject DOM bindings API is split into stable and unstable parts. The stable part contains the most commonly used API that it’s unlikely to change. We will keep maintaining backwards compatibility of this part of the API. The rest of the API is considered unstable and might change at any time, you can still use it but at your own risk. We thought this solution was better than just removing the unstable API. There are two kind of unstable APIs:

  • Classes that are considered unstable: the entire class is considered unstable. The header is not included in the main webkitdom.h header, so to use them you have to include the header file explicitly.
  • Unstable symbols of stable classes: a method or constant in a stable class that is considered unstable. In this case the header file is included by the main webkitfom.h header, but it doesn’t contain any unstable symbols, they are included in a new header WebKitDOMClassNameUnstable.h that also needs to be included explicitly.

In both cases you need to define WEBKIT_DOM_USE_UNSTABLE_API before including the headers

#include <webkitdom/WebKitDOMHTMLMediaElement.h>
#include <webkitdom/WebKitDOMElementUnstable.h>

WebKit2 GTK+ API

The API changes in the WebKit2 GTK+ API could have been avoided, by deprecating symbols and adding new ones, but since we were going to break the API anyway, and the affected symbols are not that commonly used we thought it was worth it.

  • WebKitWebView::create: the signal now receives a WebKitNavigationAction parameter containing information about the navigation action that triggered the event. So now you can know the type of event (if it was a link clicked, a form submitted, etc.), the mouse button and keyboard modifiers, the URI request or even if it was a user gesture. This information is very useful to implement a popup blocker, for example.
    /* before */
    static WebKitWebView *
    web_view_created_cb (WebKitWebView *web_view,
                         gpointer       user_data)
    /* after */
    static WebKitWebView *
    web_view_created_cb (WebKitWebView          *web_view,
                         WebKitNavigationAction *navigation_action,
                         gpointer                user_data)
  • WebKitWebViewGroup has been removed. This class was only introduced to add the user stylesheets API, since most of the people actually use the default web view group. The grouping of pages inside WebKit2 is something that will be eventually removed, in favor of users doing the groups they need. The user stylesheets API has been moved to a new class WebKitUserContentManager that will also be extended to support user scripts. The settings can still be handled directly with the WebKitWebView API, so that if you want a group of web views to share the same settings you can simply call webkit_web_view_set_settings() for all the web views passing the same WebKitSettings object.
    /* before */
    WebKitWebViewGroup *group = webkit_web_view_get_group (web_view);
    webkit_web_view_group_add_user_style_sheet (group, 
                                                NULL, /* base URI */
                                                NULL, /* whitelist */
                                                NULL, /* blacklist */
    /* after */
    WebKitUserContentManager *user_content;
    WebKitUserStyleSheet     *style_sheet;
    style_sheet = webkit_user_style_sheet_new (buffer,
                                               NULL, /* whitelist */
                                               NULL /* blacklist */);
    user_content = webkit_web_view_get_user_content_manager (web_view);
    webkit_user_content_manager_add_style_sheet (user_content, style_sheet);
    webkit_user_style_sheet_unref (style_sheet);
  • WebKitCertificateInfo has been removed. This was supposed to be a convenient way of handling TLS certificates, but when trying to use it in a real case, it ended up being unconvenient. The WebKitWebView::load-failed-with-tls-errors signal now receives a GTlsCertificate and TlsCertificateFlags, and webkit_web_context_allow_tls_certificate_for_host() receives a GTlsCertificate.
    /* before */
    static gboolean
    load_failed_with_tls_errors_cb (WebKitWebView         *web_view,
                                    WebKitCertificateInfo *info,
                                    const gchar           *host,
                                    gpointer               user_data)
      WebKitWebContext *context = webkit_web_view_get_context (web_view);
      GTlsCertificate *certificate = webkit_certificate_info_get_tls_certificate (info);
      GTlsCertificateFlags errors = webkit_certificate_info_get_tls_errors (info);
      if (add_exception_for_error (host, errors))
        webkit_web_context_allow_tls_certificate_for_host (context, info, host);
    /* after */
    static gboolean
    load_failed_with_tls_errors_cb (WebKitWebView       *web_view,
                                    GTlsCertificate     *certificate,
                                    GTlsCertificateFlags errors,
                                    const gchar         *host,
                                    gpointer             user_data)
      WebKitWebContext *context = webkit_web_view_get_context (web_view);
      if (add_exception_for_error (host, errors))
        webkit_web_context_allow_tls_certificate_for_host (context, certificate, host);
  • View mode API: The view source mode was removed from WebCore, and the API was already marked as deprecated. Since it’s very unlikely we add more view modes, we just removed the API. There’s no replacement for this, but it could be easily implemented either using a external window with a GtkSourceView or embedded into a WebKitWebView by using a custom URI scheme and a JavaScript library for syntax highlighting.


Since version 2.5.1 WebKitGTK+ uses CMake instead autotools as its build system. The equivalent to configure, make and make install now would be something like this:

$ cd webkitgtk-2.5.1
$ make
(enjoy the summer in the meantime)
# make install


Sure, we are available as usual in the #webkitgtk+ IRC channel at FreeNode and our mailing list

30 de julio de 2014

Evince Hackfest

The Evince hackfest took place last week from 23rd to 25th July in Strasbourg. Yes, 3 days only, but very productive in my opinion, I’ll summarize all the cool stuff we worked on.


This work was initially started by Owen, and then Germán kept the patches up to date with evince git master. I reviewed all the pending patches and updated the thumbnails one and the result is that evince doesn’t look blurry on HiDPI screens any more.

Evince running with GDK_SCALE=2

Evince running with GDK_SCALE=2

Recent View

This was a GSoC project of 2013, but the patch provided by the student was never in an “upstreamable” state. Again Germán, who always loved this feature, took care of the patch addressing my review comments. At the beginning of the hackfest most of the work has already been done, we only needed a few more review iterations during the hackfest to finally push this feature to master. The idea is to show the list of recent documents as an icon view with thumbnails and documents metadata. This view is loaded when evince is launched without any document replacing the useless empty window we had before. It also replaces the recent documents submenu in the gear menu.

Evince Recent View

UI improvements

The move to the header bar recently made the toolbar look a bit cluttered, mainly because the title might use a lot of space. We discussed several ideas to improve the header bar and implemented some of them:

Evince header bar improvements


Juanjo Marín also wrote a patch to change the default zoom mode to “Automatic”, since several people commented that the current “Fit Width” mode doesn’t look good in screens with higher resolutions. The patch is still waiting review.


Giselle and Anuj, our GSoc students this year, worked on their projects to improve the annotations support in both Evince and poppler.

    • Anuj wrote some patches to add support for Free Text annotations to poppler glib API. After a couple of review iterations and discussions about the API, the patches are now in bugzilla waiting for a final review (I hope to find the time soon)
    • Giselle was focused on adding support for highlight annotations to Evince, since poppler already has all the required API for this. The patches are not yet ready, but they look really promising.


Caret navigation and accessibility

Joanie and API continued improving the evince a11y support and fixing some remaining issues from the FoG project. Antía fought with the caret navigation implementation again to implement some missing key bindings and fixing other issues.

Comics backend

Juanjo Marín focused on the comics backend, working on a patch to use libarchive to uncompress the documents instead of spawning external command line tools.


I started to review the gestures branch during the hackfest, patches looked clean and simple, but since I was not familiarized with the new GTK+ touch API and I didn’t have a touch screen to try it out either, I decided to wait after the hackfest and see it in action in garnacho’s laptop during GUADEC. Carlos explained to me how the touch API works in GTK+ and I could check it actually works great. The code doesn’t affect the normal use with the mouse, so the branch will be merged in master soon.

Evince hackfest dinner

And of course not everything was hacking


Many thanks to Alexandre Franke for the local organization, everything worked perfectly. Of course thanks to the GNOME Foundation for sponsoring the GSoC students, Giselle and Anuj, and Igalia for sponsoring all the Igalians attending the hackfest. Thanks also to Epitech for allowing us to do the hackfest there before the GUADEC.

Igalia S.L. GNOME FoundationEPITECH

06 de julio de 2014

Bloqueando el seguimiento de Facebook con Adblock Plus

Hace unos días leí en Genbeta que en Adblock Plus se podía bloquear el seguimiento que hace Facebook de nuestra navegación añadiendo la lista"Fanboy's Annoyance List" disponible en la web de las diferentes listas de bloqueo de Adblock Plus. Esta lista, en realidad, bloquea botones "+1", "Me gusta" y demás que podamos poner en nuestras páginas (y que permiten a Facebook y compañía hacernos seguimiento cuando navegamos por cualquier web que los incorpore).

Sin embargo, no era suficiente: veía que en muchas páginas seguía apareciendo mi usuario para introducir comentarios, con lo que entendí que Facebook estaría, de nuevo, siguiéndonos. Comprendo que a mucha gente no le apetezca que le sigan, así que busqué información y encontré la forma de arreglarlo en esta entrada del foro de Adblock Plus: se trata de bloquear los plugin "sociales" de Facebook. Y listo. Eso sí, en las páginas afectadas ya no podremos hacer comentarios.

En realidad, estos trucos los suelo tener desactivados. Pero comprendo que a mucha gente le preocupe, y con razón, el seguimiento que los grandes de Internet hagan de la actividad de los usuarios, incluso navegando fuera de sus sitios web.

Dejo abajo el vídeo. Seguro que muchos tenéis reglas para bloquear otros plugins "sociales" de Google+, twitter, Youtube y demás. Agradezco comentarios.

PD: Si te ha gustado este artículo, haz "Me gusta" ya puestos X-))

25 de junio de 2014

C#/Cocoa – Animate a split view’s collapsing/expanding

When I started working at Xamarin, I had the intention to blog about new technologies I was learning, but it’s been already 6 months and it didn’t happen at all, so better to start late than never. I’ll start then with a nice piece of code I came up with, and which is this:

public static class CocoaExtensions
	public static void AnimatedSetPositionOfDivider (this NSSplitView splitView, float position, int divider)
		var view0 = splitView.Subviews [0];
		var view1 = splitView.Subviews [1];

		var newFrame0 = view0.Frame;
		var newFrame1 = view1.Frame;
		if (splitView.IsVertical) {
			newFrame0.Width = position == 0 ? 0 : position - splitView.DividerThickness;
			newFrame1.Width = position == splitView.MaxPositionOfDivider (divider)
				? 0
				: splitView.Bounds.Width - position - splitView.DividerThickness;
		} else {
			newFrame0.Height = position == 0 ? 0 : position - splitView.DividerThickness;
			newFrame1.Height = position == splitView.MaxPositionOfDivider (divider)
				? 0
				: splitView.Bounds.Height - position - splitView.DividerThickness;

		newFrame0.Width = newFrame0.Width < 0 ? 0 : newFrame0.Width;
		newFrame0.Height = newFrame0.Height < 0 ? 0 : newFrame0.Height;
		newFrame1.Width = newFrame1.Width < 0 ? 0 : newFrame1.Width;
		newFrame1.Height = newFrame1.Height < 0 ? 0 : newFrame1.Height;

		view0.Hidden = view1.Hidden = false;
		view0.AutoresizesSubviews = view1.AutoresizesSubviews = true;

		if ((newFrame0.Width == 0 && newFrame0.Height == 0) ||
		    (newFrame1.Width == 0 && newFrame1.Height == 0)) {

		var singleAnimation0 = new NSMutableDictionary ();
		singleAnimation0 [NSViewAnimation.TargetKey] = view0;
		singleAnimation0 [NSViewAnimation.EndFrameKey] = NSValue.FromRectangleF (newFrame0);

		var singleAnimation1 = new NSMutableDictionary ();
		singleAnimation1 [NSViewAnimation.TargetKey] = view1;
		singleAnimation1 [NSViewAnimation.EndFrameKey] = NSValue.FromRectangleF (newFrame1);

		var animation = new NSViewAnimation (new NSDictionary[] { singleAnimation0, singleAnimation1 });
		animation.Duration = 0.25f;
		animation.StartAnimation ();

The main reason to share this code is because I couldn’t find anything that worked to do that (animate the collapsing and expanding of a NSSplitView, which is, yes, you got it right, a split view, like GTK’s GtkPaned), so I hope it is useful for someone. But it also shows a few interesting things about both C# and Cocoa:

  • The most obvious one: writing Cocoa apps in C# is much better than using Objective C (although, to be honest, I also like Objective C).
  • Cocoa (and CoreAnimation) lets you easily add animations to your UI, by having the animations layer tightly integrated into the API. Of course, animations are not always great, but in some cases, like this one where the collapsing/expansion of the split view’s subviews is animated, it makes such a huge difference to the UI that it’s very nice to be able to do it that easily.
  • C# allows extending existing classes, by writing extension methods (static methods in static classes that have a “this” modifier in the 1st argument, which specifies the class the method extends). This is a great way to extend existing classes, without having to do any subclassing. Once you have the extension method, you can just call it on any NSSplitView:
    mySplitView.AnimatedSetPositionOfDivider (position, divider);

    You can extend any class, and this what a lot of technologies (LINQ, Reactive Extensions, etc) in the .NET world use.

I started also, when I started working at Xamarin, getting some of the nice ideas from Cocoa and C# into GLib/GTK, so will publish that as soon as I get something useful from it. Hopefully it won’t be another 6 months :-D

And yes, Xamarin is hiring. If interested, drop me a mail, or just apply directly, as you wish.

17 de junio de 2014

Frogr 0.10 released

frogrQuick post to let the world know that I’ve just released a new version of frogr right now, in order to address a few issues present in the previous version. Mainly:

  • Deprecation of non-SSL end points for the Flickr API (see these two posts for more info). From now on, frogr will use SSL-only API calls.
  • Address issues with frogr‘s AppData file. Apparently, the AppData file was neither valid (according to appdata-validate) nor being installed properly, preventing frogr from showing up nicely in the GNOME Software app.
  • Allow disabling video uploads at configuration time (enabled by default), instead of making the decision depending on the detected platform. This will hopefully make life easier for packagers of other platforms (e.g. MacPorts).
  • Removed libsoup-gnome code once and for all (API deprecated a while ago).
  • Other things: updated translations and fixed a few minor bugs.

As usual, feel free to check the website of the project in case you want to know more about frogrhow to get it or how to contribute to it.

04 de junio de 2014

Receta rápida para optimizar MySQL

Siguiendo con el post anterior (recordemos, tengo un servidor muy humilde en recursos que quiero aprovechar al máximo), le toca el turno al servidor MySQL. Tengo un libro (High Performance MySQL, de la editorial O’Reilly) que -entre otras cosas- se dedica a explicar cómo obtener el mejor rendimiento de un servidor MySQL, así que en […]

31 de mayo de 2014

Desactivando módulos innecesarios en Apache

Tengo un servidor Apache montado en una máquina física muy justita de recursos (especialmente de memoria RAM). El servidor Apache que viene por defecto tendría que cambiarlo por nginx. Por lo que dicen en los mentideros de Internet parece que consume menos recursos que Apache… mientras tomo la decisión de migrar, he optado por recortar […]