Planeta GNOME Hispano
La actividad Hispana de GNOME 24 x 7

13 de abril de 2016

Chromium Browser on xdg-app

Last week I had the chance to attend for 3 days the GNOME Software Hackfest, organized by Richard Hughes and hosted at the brand new Red Hat’s London office.

And besides meeting new people and some old friends (which I admit to be one of my favourite aspects about attending these kind of events), and discovering what it’s now my new favourite place for fast-food near London bridge, I happened to learn quite a few new things while working on my particular personal quest: getting Chromium browser to run as an xdg-app.

While this might not seem to be an immediate need for Endless right now (we currently ship a Chromium-based browser as part of our OSTree based system), this was definitely something worth exploring as we are now implementing the next version of our App Center (which will be based on GNOME Software and xdg-app). Chromium updates very frequently with fixes and new features, and so being able to update it separately and more quickly than the OS is very valuable.

Endless OS App Center
Screenshot of Endless OS’s current App Center

So, while Joaquim and Rob were working on the GNOME Software related bits and discussing aspects related to Continuous Integration with the rest of the crowd, I spent some time learning about xdg-app and trying to get Chromium to build that way which, unsurprisingly, was not an easy task.

Fortunately, the base documentation about xdg-app together with Alex Larsson’s blog post series about this topic (which I wholeheartedly recommend reading) and some experimentation from my side was enough to get started with the whole thing, and I was quickly on my way to fixing build issues, adding missing deps and the like.

Note that my goal at this time was not to get a fully featured Chromium browser running, but to get something running based on the version that we use use in Endless (Chromium 48.0.2564.82), with a couple of things disabled for now (e.g. chromium’s own sandbox, udev integration…) and putting, of course, some holes in the xdg-app configuration so that Chromium can access the system’s parts that are needed for it to function (e.g. network, X11, shared memory, pulseaudio…).

Of course, the long term goal is to close as many of those holes as possible using Portals instead, as well as not giving up on Chromium’s own sandbox right away (some work will be needed here, since `setuid` binaries are a no-go in xdg-app’s world), but for the time being I’m pretty satisfied (and kind of surprised, even) that I managed to get the whole beast built and running after 4 days of work since I started :-).

But, as Alberto usually says… “screencast or it didn’t happen!”, so I recorded a video yesterday to properly share my excitement with the world. Here you have it:

[VIDEO: Chromium Browser running as an xdg-app]

As mentioned above, this is work-in-progress stuff, so please hold your horses and manage your expectations wisely. It’s not quite there yet in terms of what I’d like to see, but definitely a step forward in the right direction, and something I hope will be useful not only for us, but for the entire Linux community as a whole. Should you were curious about the current status of the whole thing, feel free to check the relevant files at its git repository here.

Last, I would like to finish this blog post saying thanks specially to Richard Hughes for organizing this event, as well as the GNOME Foundation and Red Hat for their support in the development of GNOME Software and xdg-app. Finally, I’d also like to thank my employer Endless for supporting me to attend this hackfest. It’s been a terrific week indeed… thank you all!

Credit to Georges Stavracas

Credit to Georges Stavracas

04 de abril de 2016

Mala semana para la seguridad de las extensiones en Firefox y Chrome

Investigadores de seguridad presentaron la semana pasada, en la Black Hat Asia 2016, bajo la ponencia “Automated Detection of Firefox Extension-Reuse Vulnerabilities” una extensión que reutiliza código de otras ya instaladas con fines maliciosos. Es una técnica nueva (extension-reuse) interesante.

En febrero presentaron un artículo sobre la misma vulnerabilidad (CrossFire: An Analysis of Firefox Extension-Reuse Vulnerabilities) en el simposium “The Network and Distributed System Security Symposium 2016” organizado por la Internet Society.

Y siguiendo con los ataques de seguridad a las extensiones, hoy se publica una noticia sobre una empresa que en febrero compró una extensión bastante popular (Better History) para inyectarle código malicioso que hace que los navegadores de sus usuarios sean redirigidos, a través de un enlace, a páginas con banners -al parecer a la página que más pague a la empresa- cada vez que pinchan en un enlace (realmente el 50% de la veces y no es una redirección simple, sino que la página original a la que el usuario se dirigía también se abre). El comportamiento no es maligno únicamente por esto, sino porque la empresa de esta extensión está recogiendo datos privados sobre las URL que los usuarios visitan. Para más inri, el código fuente de Better History en GitHub no refleja los añadidos maliciosos que la compañía ha introducido.

Google ha eliminado la extensión de la Chrome Store, pero los usuarios han advertido de que este comportamiento se repite en otras extensiones populares como Chrome Currency Converter, Web Timer, User-Agent Switcher, Better History, 4chan Plus, and Hide My Adblocker.

Google ha eliminado también User-Agent Switcher, pero el resto sigue online.

25 de marzo de 2016

Instalando mod_wsgi en OSX El Capitan

Receta rápida:

$ git clone
$ cd mod_wsgi
$ ./configure
$ make
$ sudo make install
$ sudo vim /etc/apache2/httpd.conf

Añadir las siguientes dos líneas:

LoadModule wsgi_module libexec/apache2/
WSGIScriptAlias / /Library/WebServer/Documents/

Reiniciar Apache y comprobar:

$ sudo apachectl restart
$ apachectl -M | grep wsgi
 wsgi_module (shared)

Podemos probar con este Hello World ( Copiarlo en /Library/WebServer/Documents y abrirlo desde el navegador con http://localhost/ :

import os, sys
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello world!!\n'
    response_headers = [('Content-type', 'text/plain'),
        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]


22 de marzo de 2016

WebKitGTK+ 2.12

We did it again, the Igalia WebKit team is pleased to announce a new stable release of WebKitGTK+, with a bunch of bugs fixed, some new API bits and many other improvements. I’m going to talk here about some of the most important changes, but as usual you have more information in the NEWS file.


FTL JIT is a JavaScriptCore optimizing compiler that was developed using LLVM to do low-level optimizations. It’s been used by the Mac port since 2014 but we hadn’t been able to use it because it required some patches for LLVM to work on x86-64 that were not included in any official LLVM release, and there were also some crashes that only happened in Linux. At the beginning of this release cycle we already had LLVM 3.7 with all the required patches and the crashes had been fixed as well, so we finally enabled FTL for the GTK+ port. But in the middle of the release cycle Apple surprised us announcing that they had the new FTL B3 backend ready. B3 replaces LLVM and it’s entirely developed inside WebKit, so it doesn’t require any external dependency. JavaScriptCore developers quickly managed to make B3 work on Linux based ports and we decided to switch to B3 as soon as possible to avoid making a new release with LLVM to remove it in the next one. I’m not going to enter into the technical details of FTL and B3, because they are very well documented and it’s probably too boring for most of the people, the key point is that it improves the overall JavaScript performance in terms of speed.

Persistent GLib main loop sources

Another performance improvement introduced in WebKitGTK+ 2.12 has to do with main loop sources. WebKitGTK+ makes an extensive use the GLib main loop, it has its own RunLoop abstraction on top of GLib main loop that is used by all secondary processes and most of the secondary threads as well, scheduling main loop sources to send tasks between threads. JavaScript timers, animations, multimedia, the garbage collector, and many other features are based on scheduling main loop sources. In most of the cases we are actually scheduling the same callback all the time, but creating and destroying the GSource each time. We realized that creating and destroying main loop sources caused an overhead with an important impact in the performance. In WebKitGTK+ 2.12 all main loop sources were replaced by persistent sources, which are normal GSources that are never destroyed (unless they are not going to be scheduled anymore). We simply use the GSource ready time to make them active/inactive when we want to schedule/stop them.

Overlay scrollbars

GNOME designers have requested us to implement overlay scrollbars since they were introduced in GTK+, because WebKitGTK+ based applications didn’t look consistent with all other GTK+ applications. Since WebKit2, the web view is no longer a GtkScrollable, but it’s scrollable by itself using native scrollbars appearance or the one defined in the CSS. This means we have our own scrollbars implementation that we try to render as close as possible to the native ones, and that’s why it took us so long to find the time to implement overlay scrollbars. But WebKitGTK+ 2.12 finally implements them and are, of course, enabled by default. There’s no API to disable them, but we honor the GTK_OVERLAY_SCROLLING environment variable, so they can be disabled at runtime.

But the appearance was not the only thing that made our scrollbars inconsistent with the rest of the GTK+ applications, we also had a different behavior regarding the actions performed for mouse buttons, and some other bugs that are all fixed in 2.12.

The NetworkProcess is now mandatory

The network process was introduced in WebKitGTK+ since version 2.4 to be able to use multiple web processes. We had two different paths for loading resources depending on the process model being used. When using the shared secondary process model, resources were loaded by the web process directly, while when using the multiple web process model, the web processes sent the requests to the network process for being loaded. The maintenance of this two different paths was not easy, with some bugs happening only when using one model or the other, and also the network process gained features like the disk cache that were not available in the web process. In WebKitGTK+ 2.12 the non network process path has been removed, and the shared single process model has become the multiple web process model with a limit of 1. In practice it means that a single web process is still used, but the network happens in the network process.

NPAPI plugins in Wayland

I read it in many bug reports and mailing lists that NPAPI plugins will not be supported in wayland, so things like will not work. That’s not entirely true. NPAPI plugins can be windowed or windowless. Windowed plugins are those that use their own native window for rendering and handling events, implemented in X11 based systems using XEmbed protocol. Since Wayland doesn’t support XEmbed and doesn’t provide an alternative either, it’s true that windowed plugins will not be supported in Wayland. Windowless plugins don’t require any native window, they use the browser window for rendering and events are handled by the browser as well, using X11 drawable and X events in X11 based systems. So, it’s also true that windowless plugins having a UI will not be supported by Wayland either. However, not all windowless plugins have a UI, and there’s nothing X11 specific in the rest of the NPAPI plugins API, so there’s no reason why those can’t work in Wayland. And that’s exactly the case of, for example. In WebKitGTK+ 2.12 the X11 implementation of NPAPI plugins has been factored out, leaving the rest of the API implementation common and available to any window system used. That made it possible to support windowless NPAPI plugins with no UI in Wayland, and any other non X11 system, of course.


And as usual we have completed our API with some new additions:


07 de marzo de 2016

Transmission, torrents, OSX y malware KeRanger

Captura de pantalla 2016-03-07 a las 22.49.09 Cuando necesito descargar torrents, uso Transmission en Linux y uTorrent en OSX. No es que uTorrent esté libre de pecado (Spigot -PUP-,  EpicScale -mining de bitcoin no deseado, y demás basura), pero la semana pasada (4 de marzo) Transmission para OSX llevaba de regalo  KeRanger, ransomware. Sí, malware que cifra el contenido de tu disco duro y te pide un rescate – pagado en bitcoin, por supuesto- para obtener la clave que lo descifra. Parece ser el primer caso de ransomware dirigido específicamente a usuarios de OSX. Fue la gente de Palo Alto Networks fueron los primeros en dar el aviso, indicando que la web de Transmission había sido comprometida, dejando un fichero de instalación .dmg(la versión 2.90 de Transmission) infectado con KeRanger. Lo “bonito” del asunto es que esta versión de KeRanger había sido firmada con un certificado válido de desarrollador de aplicaciones para OSX, saltándose el control básico de Apple Gatekeeper que impide a un usuario básico instalar una aplicación que no venga firmada (se salta abriendo el binario con el menú contextual mientras pulsas Control, pero es una primera barrera de seguridad). Si el usuario instaló la versión infectada de Transmission, esta ejecutará una versión incrustada de KeRanger, esperará 3 días (suele ser habitual esperar a ejecutar el castigo, para ocultar al usuario el origen de la infección) y se comunicará con un servidor C&C (Command & Control) sobre la red Tor. A partir de ahí, cifrado del disco y petición de rescate (400 dólares).

Apple ha actuado rápido. Lo primero, invalidar el certificado con el que se firmó la aplicación en cuestión. Lo segundo, añadir una regla a XProtect, el sistema de lista negra que usa OSX por defecto. Puedes consultar los bichos que pululan por Internet en este fichero de tu OSX: /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist. ¿El primero de la lista? Nuestro amigo KeRanger:

Captura de pantalla 2016-03-07 a las 23.21.41

El análisis técnico del bicho en la página de Palo Alto Networks merece mucho la pena. Verás que el desarrollador está preparando funciones específicas para buscar y cifrar backups de Time Machine (qué angelito…). Verás también que usa tanto cifrado asimétrico (RSA) para cifrar un número elegido al azar junto a un IV dependiente del contenido del fichero, con lo que formará la clave que usará para cifrar el contenido del fichero usando cifrado simétrico (AES).

El 5 de marzo la gente de Transmission eliminó el ejecutable infectado de su web. Apple también ha hecho su trabajo. Pero el secuestro de webs para implantar malware parece que está de moda. Hace un par de semanas fue el turno de Linux Mint. Esta semana ha caído Transmission. ¿Quién será el siguiente?

Formateo y validación de objetos JSON

En esta ocasión, aprovechando que esta semana se estudia el formato JSON en una de mis clases, os quería recomendar un par de utilidades que utilizo a menudo: la herramienta jq y el plugin JSONView.

jq es una utilidad de la línea de comandos disponible para Linux, OS X y Windows que permite validar y visualizar de forma muy agradable objetos JSON. La mejor forma de apreciar el uso de jq es por medio de un ejemplo. En la siguiente figura, muestro un objeto JSON en la terminal sin usar jq. A continuación lo vuelvo a mostrar, esta vez filtrándolo con jq. Mucho mejor, ¿no?

Captura de pantalla 2016-03-07 a las 21.29.34


jq también detecta objetos JSON inválidos, marcando dónde se encuentra el error:

Captura de pantalla 2016-03-07 a las 22.00.40

JSONView es similar a jq, pero funciona como plugin o extensión, tanto de Google Chrome como de Mozilla Firefox. Veamos un ejemplo con el resultado de una llamada al API de OpenWeatherMap.

Sin usar JSONView:

Captura de pantalla 2016-03-07 a las 21.44.06

Con la extensión JSONView instalada:

Captura de pantalla 2016-03-07 a las 21.43.51

Sí, representan exactamente el mismo resultado. Pero uno es legible por humanos y el otro no 🙂

¿Conocíais estas utilidades? ¿Qué extensiones usáis en vuestros desarrollos? (HTML5, JS, PHP, whatever…)

05 de marzo de 2016

Demasiadas conexiones a MySQL desde R

Estoy desarrollando una nueva aplicación en R+Shiny. Entre otras cosas, el servidor Shiny necesita acceder a los datos de una BBDD en MySQL. Tengo código en R que accede a MySQL sin problemas, abre y cierra las conexiones bien, sin leaks  por dejar conexiones abiertas. Bueno, eso es lo que creía… cuando por alguna razón la aplicación fallaba, podían darse casos en los que alguna conexión se quedaba abierta. Por una o dos, no pasaba “nada”. Pero probando y probando, llegué a este error:

“cannot allocate a new connection — maximum of 16 connections  already opened”

Vaya… el primer problema es: ¿cómo desconecto las conexiones abiertas? La respuesta a esto en la lista de distribución de R:

cons <- dbListConnections(MySQL()) 
 for(con in cons) 

Y ahora, ¿cómo evitar el error? Lo ideal sería establecer una especie de conexión singleton que se reutilizara desde todo el código. La respuesta a esto, en StackOverflow (cómo no ;-))

getConnection <- function(group) {
  if (!exists('.connection', where=.GlobalEnv)) {
    .connection <<- dbConnect(MySQL(), group=group)
  } else if (class(try(dbGetQuery(.connection, "SELECT 1"))) == "try-error") {
    .connection <<- dbConnect(MySQL(), group=group)

Este código comprueba si existe una conexión en el entorno global. Si no existe, la crea y la devuelve.
Si existe, comprueba que se pueda usar. Si no se puede usar, desconecta y vuelve a crear la conexión, para devolverla.
Es decir, funciona como una caché (o puede verse también como un objeto singleton de tipo connection).
Podríamos ignorar el parámetro group de la función getConnection y en su lugar, usar:

dbConnect(MySQL(), user=login, password=pass, db=database, host=host)

allí donde fuera necesario.

Configuración de WordPress

Después de varios días por fin saco tiempo para continuar la entrada del otro día donde os comentaba las bondades de WordPress. Hoy voy a daros algunos consejos sobre como configurarlo:

1. Estructura Permalink

Lo primero que debes cambiar es la estructura de enlaces permanentes. Se encuentran en Configuración → Enlaces permanentes. El enlace permanente por defecto es <postid>, pero yo prefiero utilizar el nombre de la entrada:



2. ¿SSL o no SSL?

En 2014 Google anunció que las webs corriendo bajo https tendrían mejor valoración de cara al posicionamiento por este motivo muchas web han cambiado a SSL. Todo depende de nuestro presupuesto, los SSL cuestan $$$.

3. ¿WWW vs no-WWW?

Aquí es cuestión de gustos, si quieres que tu blog aparezca en el navegador como como o simplemente Asegúrate de que en Configuración → General, la versión que deseas aparece correctamente.

4. Optimiza las descripciones

Los webmaster suelen centrarse en los títulos pero nunca hay que dejar de lado las descripciones. La descripción muestra una parte de información muy importante en los resultados de búsqueda y podemos incluir en ella las palabras clave (keywords) que queremos resaltar.

5. Limpiar el código

Reduce al mínimo posible los Javascript y CSS que pueda tener tu plantilla. Google valora la rapidez de carga de tu web, de hecho hay un test específico para ello que mide tanto la versión normal como la móvil (responsive):

Test de velocidad de carga de Google

6. SEO y contenido duplicado

Debes huir siempre del contenido duplicado ya que es una de las cosas que más penalizan a la hora de posicionar tu blog. Google tiene avanzados algoritmos que analizan el texto (densidad keywords, frases, párrafos, incluso el conjunto!) para ver si son copiados de otros existentes.

7. Encabezamientos (headers)

Aunque cada vez tienen menor peso en el SEO aún sigue siendo una buena idea poner algunos textos con encabezamientos, por ejemplo el de mayor tamaño <h1> para el nombre de la entrada. Puedes poner también algún <h2> y <h3> para slogan o títulos secundarios.


02 de marzo de 2016

De a

Llevo mucho tiempo intentando escribir este post. Incluso creo que lo llegué a hacer, pero perdí el fichero donde lo guardaba. No recuerdo si lo hice en un documento de Google Drive, en Keep, en un fichero de texto plano, en un borrador de post, en un mensaje de correo a mí mismo… o si lo soñé, que también puede ser. El mero hecho de perderlo o de no saber a ciencia cierta si lo llegué a crear, me da que pensar. Vivimos una época en la que las conversaciones se llevan a cabo en redes sociales (Facebook, Twitter) y programas de mensajería instantánea (WhatsApp, Telegram). Todo es rápido, al momento, todo se consume de manera inmediata. No queda tiempo para sentarse a reflexionar y menos para escribir posts largos.

Antes no era así. Recuerdo una época en la que escribía largos mensajes varias veces a la semana. Eran posts con enjundia, donde compartía conocimiento práctico que había probado con calma. Eran posts sobre temas relacionados con Linux y el software libre. Era lo que me movía. Era un bonito “trabajo”, que me llevó de 2001 a 2014. En los últimos dos años (2014-2015) dejé de escribir en el blog. Sucumbí a las redes sociales. En especial, a Twitter. Sucumbí al software privativo, en especial al sistema OSX.

Abandoné DiarioLinux, pero no abandoné Linux. Sigo usándolo, pero no en el escritorio. Me cansé de pelear con drivers, configuraciones, aplicaciones y entornos. Quería seguir trabajando con un sistema Unix. Pero también quería las últimas aplicaciones. Y sucumbí a la manzana. Es curioso, esa historia de la manzana ya ocurrió hace miles de años 😉

La cuestión es que tengo ganas de tomarme las cosas con más calma. Y de escribir de forma más pausada y pensada de lo  que escribo en Twitter. ¿Quiere esto decir que dejaré de tuitear? No, seguiré haciéndolo, aunque probablemente bajando la frecuencia. Sigo creyendo que Twitter aporta mucha información de calidad (aparte de montañas de ruido). Gran parte de esta información la tengo marcada con un “favorito” (ahora, con un corazón, cursi, rojo). Hasta ahora, marcaba así los tuits en los que me interesaba profundizar. “Cuando tenga tiempo”. “Este enlace quiero leerlo con calma”. Autoengaños. Ahí siguen, marcados pero sin leer. Como los cientos de libros técnicos en formato digital que acumulo (casi 300, y subiendo) para leer algún día (será imposible hacerlo).

Así que toca simplificar. No preocuparse tanto por acumular, sino por soltar lastre. No preocuparse tanto por las novedades, sino por profundizar en alguna de ellas o en alguna de las que, en su día, fue novedad marcada como “favorita” e interesante, pero de la que nunca más supe. Eso es lo que pretendo hacer, pararme a inspeccionar con más detalle aquellos temas que piquen mi curiosidad. Temas técnicos en su mayor parte, pero también sobre docencia, idiomas, running, series, cine o libros. Como veis, temas que no estarán ceñidos sólo a Linux o al Software Libre. Temas, en general, sobre los que querría aprender más. De ahí el cierre de DiarioLinux y el comienzo de este nuevo blog, /Aprendiendo/.

Espero que estas reflexiones no se queden sólo en eso o que, al menos, pasen a formar parte de una buena colección de posts al respecto 🙂

PD: cerrará, pero no se perderá el contenido. Todos los posts, comentarios e imágenes adjuntas han sido copiadas a dentro del subdominio Por el momento, estará unos meses redirigiendo el tráfico (con cabeceras 301 Redirect). En 2017 cerrará definitivamente.

26 de febrero de 2016

Über latest Media Source Extensions improvements in WebKit with GStreamer

In this post I am going to talk about the implementation of the Media Source Extensions (known as MSE) in the WebKit ports that use GStreamer. These ports are WebKitGTK+, WebKitEFL and WebKitForWayland, though only the latter has the latest work-in-progress implementation. Of course we hope to upstream WebKitForWayland soon and with it, this backend for MSE and the one for EME.

My colleague Enrique at Igalia wrote a post about this about a week ago. I recommend you read it before continuing with mine to understand the general picture and the some of the issues that I managed to fix on that implementation. Come on, go and read it, I’ll wait.

One of the challenges here is something a bit unnatural in the GStreamer world. We have to process the stream information and then make some metadata available to the JavaScript app before playing instead of just pushing everything to a playing pipeline and being happy. For this we created the AppendPipeline, which processes the data and extracts that information and keeps it under control for the playback later.

The idea of the our AppendPipeline is to put a data stream into it and get it processed at the other side. It has an appsrc, a demuxer (qtdemux currently

) and an appsink to pick up the processed data. Something tricky of the spec is that when you append data into the SourceBuffer, that operation has to block it and prevent with errors any other append operation while the current is ongoing, and when it finishes, signal it. Our main issue with this is that the the appends can contain any amount of data from headers and buffers to only headers or just partial headers. Basically, the information can be partial.

First I’ll present again Enrique’s AppendPipeline internal state diagram:

First let me explain the easiest case, which is headers and buffers being appended. As soon as the process is triggered, we move from Not started to Ongoing, then as the headers are processed we get the pads at the demuxer and begin to receive buffers, which makes us move to Sampling. Then we have to detect that the operation has ended and move to Last sample and then again to Not started. If we have received only headers we will not move to Sampling cause we will not receive any buffers but we still have to detect this situation and be able to move to Data starve and then again to Not started.

Our first approach was using two different timeouts, one to detect that we should move from Ongoing to Data starve if we did not receive any buffer and another to move from Sampling to Last sample if we stopped receiving buffers. This solution worked but it was a bit racy and we tried to find a less error prone solution.

We tried then to use custom downstream events injected from the source and at the moment they were received at the sink we could move from Sampling to Last sample or if only headers were injected, the pads were created and we could move from Ongoing to Data starve. It took some time and several iterations to fine tune this but we managed to solve almost all cases but one, which was receiving only partial headers and no buffers.

If the demuxer received partial headers and no buffers it stalled and we were not receiving any pads or any event at the output so we could not tell when the append operation had ended. Tim-Philipp gave me the idea of using the need-data signal on the source that would be fired when the demuxer ran out of useful data. I realized then that the events were not needed anymore and that we could handle all with that signal.

The need-signal is fired sometimes when the pipeline is linked and also when the the demuxer finishes processing data, regardless the stream contains partial headers, complete headers or headers and buffers. It works perfectly once we are able to disregard that first signal we receive sometimes. To solve that we just ensure that at least one buffer left the appsrc with a pad probe so if we receive the signal before any buffer was detected at the probe, it shall be disregarded to consider that the append has finished. Otherwise, if we have seen already a buffer at the probe we can consider already than any need-data signal means that the processing has ended and we can tell the JavaScript app that the append process has ended.

Both need-data signal and probe information come in GStreamer internal threads so we could use mutexes to overcome any race conditions. We thought though that deferring the operations to the main thread through the pipeline bus was a better idea that would create less issues with race conditions or deadlocks.

To finish I prefer to give some good news about performance. We use mainly the YouTube conformance tests to ensure our implementation works and I can proudly say that these changes reduced the time of execution in half!

That’s all folks!

08 de febrero de 2016

WordPress SEO

Con la invención de Internet y el marketing digital el alcance de la optimización de motores de búsqueda (SEO) se ha convertido en uno de los métodos preferidos de promoción web. Por este motivo en la entrada de hoy quiero hablaros de como utilizar el software de blogs más conocido del mundo (WordPress) para mejorar el SEO de vuestras webs.

SEO, en términos generales se denomina como la optimización de motores de búsqueda. A diario millones de personas utilizan los buscadores para acceder a la información que necesitan. Aparecer en las primeras posiciones de las palabras clave (keywords) es imprescindible para el éxito de nuestro proyecto en Internet. Por este motivo la mayoría de los webmasters han optado por la promoción basada en SEO para poder llegar a su público objetivo.

Con el paso de los años (incluso meses) las técnicas de optimización en buscadores se actualizan por lo que hay que estar atentos y en constante evolución ante los cambios del algoritmo de Google.

Recientemente la empresa donde alojo ACS (podeis ver su banner al pie del blog) ha lanzado un VPS específico para el SEO basado en WordPress.

¿Y por qué han elegido WordPress?

WordPress es uno de los mejores sistemas de gestión de contenido cuando se trata de SEO, teniendo en cuenta que casi una cuarta parte de las webs de internet están hechas con este CMS tantos webmasters no han podido equivocarse!.

Ahora al grano, lo que proponen con este VPS SEO es poder levantar en pocos minutos hasta 4 hosting WordPress cada uno con una dirección IP clase C propia (IPs españolas).

WordPress es un software muy bien optimizado y permite que cada página sea indexada rapidamente por los buscadores, por este motivo es muy sencillo crear un blog, añadir buen contenido y enlazar a nuestras webs para mejorar sus rankings.

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.

17 de enero de 2016

¿Usas código de StackOverflow? Debes citar la fuente

Leí la noticia en Slashdot hace unos días.  La gente de StackExchange (SE, madre nodriza de otras tantas, donde destaca quería discutir con la comunidad un cambio en la licencia de uso de los trozos de código de esta web.  La cuestión es que la nueva licencia, que entraría en vigor el 1 de marzo de 2016, proponía que:

* Las aportaciones que no fueran de código y estuvieran disponibles en alguna de las webs de la red StackExchange seguirían gobernadas por los términos de la licencia CC-BY-SA

* Las aportaciones de código estarían gobernadas por los términos de la licencia MIT (sin necesidad de tener que incluir todos los términos de la licencia en tu proyecto, basta con atribuir el origen.

Realmente esto sólo cambia con respecto a la licencia anterior de la red SE en que antes la atribución era bajo petición del usuario creador de dicho código (poseedor del copyright de dicho código) o de SE en representación o en nombre de dicho usuario.

Se lió una buena discusión con estos términos. Hay cientos de comentarios al respecto, muchos de ellos en contra de esta decisión.

Llevo tiempo usando StackOverflow, tanto de forma profesional como programador, analista de datos, para mis clases de docencia e incluso como elemento de investigación. En mi faceta de programador, siempre que recojo algún trozo de código de SO intento incluir una referencia al post original a través de un comentario en el código. No sólo por cortesía, que también, sino sobre todo porque me interesa documentar las fuentes en las que me baso a la hora de programar. Si he tenido que acudir a SO a buscar esta solución, seguro que en el futuro alguien que lea mi código (yo mismo, probablemente) tendrá la misma duda y querrá saber más al respecto, o simplemente, ese trozo de código le puede parecer interesante y puede querer seguir profundizando en el tema. El enlace al post original en SO seguro que le/nos ayuda.

Con respecto a la docencia, atribuir el origen del código es lo mínimo que deberíamos hacer los profesores. Y predicar al alumnado con el ejemplo: al César lo que es del César, give credit where credit is due. Aprender a citar correctamente cuesta, y pequeños gestos como éste no cuestan nada y van formando al alumno.

En definitiva, yo estoy a favor de tener que citar la fuente de los trozos de código que obtengamos de la red SE. De hecho, como he indicado, es algo que nos beneficia a todos.

Sin embargo, la gran discusión suscitada ha hecho que la gente de SE haya decidido, a fecha de 15 de enero de 2016, aplazar la decisión.

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.

10 de noviembre de 2015

Xuxen 5 instalatu eta hala ere LibreOfficek ez ditu zuzenketak egiten?

Xuxen 5 LibreOfficen instalatu duzu , argibideak jarraituz. Dena ondo dagoela dirudi, LibreOffice berrabiarazi duzu eta hala ere, euskaraz idatzitako testuetan zuzentzailea ez dabil?


Beno, ez zara bakarra! Arazoa nola konpondu daiteke? LibreOffice-n Basque Language Pack instalatu beharko duzu. Aukeratu Basque, instalatu pakete hori, berrabiarazi LibreOffice, eta orain bai, badabil 🙂



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

hackinteamSegú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 cifrados, grabar conversaciones de Skype y otras comunicaciones de VoIP activar remotamente micrófonos y cámaras en los ordenadores bajo control.

No debemos creernos todo lo que se dice 😉 (eso de descifrar ficheros y mensajes cifrados no termina de cuadrarme), pero claramente, la empresa Hacking Team no era precisamente una empresa bien vista en los círculos de seguridad informática. Entre otras cosas ha sido criticada varias veces por vender sus servicios a gobiernos bajo sospecha de violación de derechos humanos (Sudán).

Hace un par de días (el 5 de julio), Hacking Team fue hackeada (el cazador cazado). Su cuenta en Twitter fue secuestrada y se publicó un torrent con unos 400GB de datos (incluyendo emails, facturas, código fuente de los exploits y herramientas usadas…).

Uno de los exploits era un 0day para Flash, aunque entre las herramientas se encuentran también herramientas para monitorizar Windows Phone, exploits para Win32, Android, etc.

Curiosamente, ayer mismo alguien clonó los repos git (tras extraerlos del torrent de 400GB) en GitHub,, pero hoy – como siempre ocurre en estos casos – ya no está disponible. Sin embargo, Internet se mueve a un ritmo endiablado, y hubo gente que no sólo hizo un mirror de los repos Git, sino de todo el material publicado en el torrent

La cuenta Twitter de Christian Pozzi (, uno de los miembros del Hacking Team, indicó ayer que el material contenido en el torrent contenía un virus e información falsa. Poco tiempo después, la cuenta de Pozzi fue (tras ser supuestamente crackeada, yo no lo llegué a ver) cerrada.

También Anonymous (@YourAnonGlobal) hace su trabajo, y ya ha detectado, dentro del módulo RCS (Remote Control System, el módulo principal de la empresa Hacking Team) código que parece implantar “evidencias” ilegales en el ordenador bajo control.

La cuenta Twitter de la Confederación de Partidos Pirata (@partidos_pirata) informa sobre una hoja de cálculo dentro de los archivos del torrent donde se pueden ver supuestos clientes de la empresa: Policía Nacional y CNI (ES) entre ellos.

Al Hacking Team, lógicamente, no le gustaba el proyecto Tor. Desde allí le dedican un mensaje.

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, estás tardando en aplicar el parche.

¿No sabes si eres vulnerable? Bien, prueba esto:

Copia este código


gcc -o ghost gistfile1.c



Y verás si tu kernel es vulnerable o no. Ubuntu 14.01 está libre. Ubuntu 12.04 es vulnerable. CentOS 5.11 es vulnerable, CentOS 6.6 es vulnerable, CentOS 7.0.1406 es vulnerable.

Update: un vídeo del ISC (Internet Storm Center) que explica con más detalle el 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).

13 de diciembre de 2014

26 de noviembre de 2014

18 de noviembre de 2014