24 horas al día, 7 días a la semana, 365 días al año*, esto es Planeta GNOME Chile

December 30, 2016

Fluent Bit Status and 2017

Fluent Bit is a multi-platform Log Forwarder written in C

This year Fluent Bit got several new features, such as events routing, buffering, improved shared library mode and many new plugins to collect data and deliver to new destinations: in_tcp, in_forward, in_health, in_proc, out_http, out_influxdb, out_flowcounter, etc.

One of the recent features it got a lot of attention in the last CloudNativeCon, was the ability to extend it output destinations through Golang plugins, so Fluent Bit can load dynamically shared libraries created with Go, it’s really neat.

Something I did not write too much about it, is the that the new version is fully running in Windows environment, the same code base works on Windows, it’s portable (no Cygwin/MinGW), it can be compiled with Visual Studio without effort. This is still experimental but functional, I expect that for 0.11 release we have Windows binaries available and docs about it.

It have been exciting to see how the project have evolved and now is walking towards to be a Cloud Native Log Forwarder, there are some few missing features that are a priority for the beginning of this 2017 such as Filtering and Monitoring capabilities; they will come very soon.

At Treasure Data, we are fully committed to continue working hard to improve all aspects of logging in Cloud Environments, the recent news about Fluentd joining the Cloud Native Computing Foundation is just the beginning. You will expect many good news from both projects (Fluentd and Fluent Bit) in the incoming 2017.

Thanks to everyone involved in Fluent Bit!

December 15, 2016

Thu 2016/Dec/15

Igalia is hiring. We're currently interested in Multimedia and Chromium developers. Check the announcements for details on the positions and our company.

November 18, 2016

Some updates

It have been a while since the last post, so many good things happened. I will not dig into a full_detailed_post but some hints:

  • Fluent Bit project v0.9 have been released. Now working towards 0.10 which comes with Golang support for output plugins within other neat things. Shortly it will become the default Log Forwarder :).
  • Fluentd project have joined the Cloud Native Computing Foundation!
  • I spoke at LinuxCon Europe (Berlin), LinuxCon NorthAmerica (Toronto) and CloudNativeCon (Seattle).

I have no updates for Monkey or Duda, but they will come shortly as from a features perspective I need to connect the dots in Fluent Bit.

November 16, 2016

GPS Ami Logo

Now let me introduce the new Icon for GPS Ami, If you want to know what GPS Ami is just click here, but how I got involved? I was reading in GNOME Planet the introducing of Hubert Figuière for GPS Ami and read that he need a logo for this aplication, so I designed the Logo and Tweet him the first Idea, after to see the Idea he approved the design and the second step was uploaded to GPS Ami's GitHub.

GPSAmi, a GUI app to read data from GPS devices.

If you want a Icon, logo, Hackergotchi, Banner etc.. for your GNOME project, you can Add your request in GNOME Art Request.

Blender Models

After a long time without posting I decided to post in English to practice my writing.
In the last time I was designing some mechanical stuff in Blender and I would like to make some video tutorial, but for now I share all the mesh in this Blog, so you can start practicing and handle the models like change Texture, Interact with node editors, Add Light and so on.
All this models you can Download for free from a really good place for download Blenders Files.

Mining Shovel Bucket


For this design I use Hard OPS a really good tool for Boolean 

Mining shovel bucket inspired in CAT Buckets. Created under blender 2.77

Now you can download this model for free from here

Cubic Transition

In this model there are more texture and I decide to apply it in Black and White whith DoF so you can play with nodes and change the configuration. 

First Render 

Render Improved: New ceiling design and texture also add some fire sprinklers, improved Floor displacement lines and Glossy Material 0.010. Render setting with DoF F-stop and B&W node.

You can download this model for free from here

Liebherr LTM 1100

The crane Liebherr, this model was part of my job to apply in procedure of work and induction for new workers. this and all the model in this blog are created under Creative Commons Licence.

Crane Liebherr LTM 1100 6.1 Created Under Blender 2.7

You can download this model from here


May 05, 2016

I got a C.H.I.P! (9USD Computer)

Some weeks ago I attended the Embedded Linux Conference in San Diego, I’ve participate from the Showcase demonstrating Fluent Bit and a non-longer-secret-project that runs on top of it, more news in the incoming weeks.

The guys from NextThing Co were around giving for free C.H.I.Ps, for who’s not aware about what it is, the C.H.I.P is a 9USD ARM Embedded Computer, it’s pretty neat!

As soon you power up the device through the micro-USB, you can access the serial console and start playing with it; it comes with Debian 8, Wifi (AP mode supported), 512 MB Ram, 1GHz Processor, 4GB storage…within others (and for 9 dollars!). Definitely you should consider to get one!

I am putting my hands on to make packages now for Fluent Bit and Monkey HTTP Server

February 08, 2016

Mon 2016/Feb/08

About a year ago, Igalia was approached by the people working on printing-related technologies in HP to see whether we could give them a hand in their ongoing effort to improve the printing experience in the web. They had been working for a while in extensions for popular web browsers that would allow users, for example, to distill a web page from cruft and ads and format its relevant contents in a way that would be pleasant to read in print. While these extensions were working fine, they were interested in exploring the possibility of adding this feature to popular browsers, so that users wouldn't need to be bothered with installing extensions to have an improved printing experience.

That's how Alex, Martin, and me spent a few months exploring the Chromium project and its printing architecture. Soon enough we found out that the Chromium developers had been working already on a feature that would allow pages to be removed from cruft and presented in a sort of reader mode, at least in mobile versions of the browser. This is achieved through a module called dom distiller, which basically has the ability to traverse the DOM tree of a web page and return a clean DOM tree with only the important contents of the page. This module is based on the algorithms and heuristics in a project called boilerpipe with some of it also coming from the now popular Readability. Our goal, then, was to integrate the DOM distiller with the modules in Chromium that take care of generating the document that is then sent to both the print preview and the printing service, as well as making this feature available in the printing UI.

After a couple of months of work and thanks to the kind code reviews of the folks at Google, we got the feature landed in Chromium's repository. For a while, though, it remained hidden behind a runtime flag, as the Chromium team needed to make sure that things would work well enough in all fronts before making it available to all users. Fast-forward to last week, when I found out by chance that the runtime flag has been flipped and the Simplify page printing option has been available in Chromium and Chrome for a while now, and it has even reached the stable releases. The reader mode feature in Chromium seems to remain hidden behind a runtime flag, I think, which is interesting considering that this was the original motivation behind the dom distiller.

As a side note, it is worth mentioning that the collaboration with HP was pretty neat and it's a good example of the ways in which Igalia can help organizations to improve the web experience of users. From the standards that define the web to the browsers that people use in their everyday life, there are plenty of areas in which work needs to be done to make the web a more pleasant place, for web developers and users alike. If your organization relies on the web to reach its users, or to enable them to make use of your technologies, chances are that there are areas in which their experience can be improved and that's one of the things we love doing.

February 04, 2016

Thu 2016/Feb/04

We've opened a few positions for developers in the fields of multimedia, networking, and compilers. I could say a lot about why working in Igalia is way different to working on your average tech-company or start-up, but I think the way it's summarized in the announcements is pretty good. Have a look at them if you are curious and don't hesitate to apply!

Puente Johnson de noche

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

January 08, 2016

CMake: override subdirectory options

Last year I moved Monkey build system to CMake and when I started Fluent Bit I did it in the same way, a great experience.

Due to the nature of the projects mentioned where they can be build as libraries, I found that overriding the sub directories options was not too straightforward: if I have a project A with some options they should be listed like this in the CMakeLists.txt file:

option(WITH_FEATURE_AA  "Enable feature AA"   ON)
option(WITH_FEATURE_BB  "Enable feature BB"   OFF)

Now if I started a project B and I have included project A in a subdirectory, the files hierarchy should be:


When building project_B based on it CMakeLists.txt rules, I may want to override some default options values of project_A, documentation is a bit confusing and you are likely to waste time trying to determinate why you cannot override the values, the guilty is the CMake Cache. As a workaround I found that building a simple macro in project_B/CMakeLists.txt solves the problem without complexity:

macro(SET_OPTION option value)
  set(${option} ${value} CACHE INTERNAL "" FORCE)

# Let's override the values

# Now join the subdirectory

If you want to see a working code example, checkout the following GIT repository:

December 20, 2015

Fluent Bit: data from embedded/IoT matters

It’s not a surprise that year over year the number of connected embedded devices is growing exponentially; from one side many Hardware challenges are being addressed properly, we can find cheap devices that provides low power consumption with good connectivity, improved processors and flexible architectures in general. These are enough reasons to encourage the creation of innovative solutions for different markets such as automotive, medical and home automation within many.

When creating software on top of these new hardware, we often needs to address the next layer of challenges, one of them is data. The operating system and the set of applications that runs on your device often generate events that helps to troubleshoot of monitor general statuses, so collecting this information is a must.

There is one concept that is changing over the years, sometimes data is commonly known as logs, but logs are not longer considered a register as a set of bytes in the file system, logs are now a stream of events that usually can be collected through a serial or network interface.

Early this year at Treasure Data, we started researching the best ways to address all concerns described above for Embedded Software, for short how to solve data collection. I have to recall that data usually comes in different formats, while the Kernel writes to it Kernel messages interface, others applications writes to syslog or push some message to some network service.

Treasure Data solved data collection for servers with the creation of Fluentd, but this tool may not be applicable as a solution for all Embedded devices because of design and resources required, but there is a lot of acquired experience that can be used as the foundation for a new specialized solution, that’s why Fluent Bit have been created.

Along this year, the project have been growing and it’s becoming a great solution for data collection and data routing in general, the following table describe the usual scenarios on how Fluent Bit can collect data:

modes description
library Fluent Bit can be build as a shared or static library that can be used by your own program. So you invoke it API and ingest data to it.
metrics generator Fluent Bit auto-generate data from it built-in input metrics: CPU, Memory and Kernel log messages.
remote service This mode means that Fluent Bit runs as a service in a separate hardware and your embedded applications can send data to it.

In a more descriptive way, Fluent Bit provides input types for data, the current ones available as of v0.5 release are:

Input Plugin Description
CPU Calculate CPU usage in the system
Memory (metric) Gather memory usage in the system
Kernel log messages Gather Kernel logs from the Kernel messages interface
Serial Read data from the serial interface
STDIN Read data from the standard input interface
MQTT Listen for MQTT messages over the network.
XBee Listen for messages over a XBee Radio device.

Once the data is collected, it should go somewhere, that’s when the output plugins provide different options.

Output Plugin Description
Fluentd Fluentd is a famous open source data collector for servers, it provides an extensive list of interfaces for collecting and routing data to third party services.
Elastic Search Elastic Search is an open source database to search & analyze Data in Real Time.
Treasure Data Treasure Data provides an Analytics Cloud service for Big Data.
STDOUT Print event records to the standard output.

The project has reach a good level, flexible enough to behave as a puzzle in terms of which features to include and which not, it allows you to collect and route events easily across the network.

As this year I had the opportunity to attend and speak at a few conferences, I had learn from very experienced Embedded Engineers and end-users who shared their concerns and ideas on how data should be collected, this have been very useful to define current roadmap and general features available today.

Fluent Bit is Open Source and licensed under the terms of Apache License v2, feel free to contribute through our public repository on, or if you just want to get in touch, join our Slack team at

As said, embedded/IoT data matters, and Fluent Bit take cares of it, spread the word!

July 10, 2015

Fri 2015/Jul/10

It's summer! That means that, if you are a student, you could be one of our summer interns in Igalia this season. We have two positions available: the first related to WebKit work and the second to web development. Both positions can be filled in either of our locations in Galicia or you can work remotely from wherever you prefer (plenty of us work remotely, so you'll have to communicate with some of us via jabber and email anyway).

Have a look at the announcement in our web page for more details, and don't hesitate to contact me if you have any doubt about the internships!

April 28, 2015

Tue 2015/Apr/28

A follow up to my last post. As I was writing it, someone was packaging Linux 4.0 for Debian. I fetched it from the experimental distribution today and all what was broken with the X1 Carbon now works (that is, the bluetooth keyboard, trackpad button events, and 3G/4G USB modem networking). The WEP128 authentication still doesn't work but you shouldn't be using it anyway because aircrack and so on and so on.

So there you have it, just upgrade your kernel and enjoy a functional laptop. I will still take the opportunity to public shame Lenovo for the annoying noise coming out of the speakers every once in a while. Bad Lenovo, very bad.

March 05, 2015

Y finalmente ha llegado

Para los que creían que nunca sucedería :-)
daniel@daniel-vaio:~$ lsb_release -d
Description: Ubuntu Vivid Vervet (development branch)
daniel@daniel-vaio:~$ systemctl status | head
● daniel-vaio
State: running
Jobs: 0 queued
Failed: 0 units
Since: Wed 2015-03-04 18:55:00 CLST; 3h 8min ago
CGroup: /
├─1 /sbin/init splash
│ ├─avahi-daemon.service
│ │ ├─690 avahi-daemon: running [daniel-vaio.local
daniel@daniel-vaio:~$ dpkg -l upstart systemd
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
ii systemd 219-4ubuntu1 amd64 system and service manager
ii ubuntu-minimal 1.331 amd64 Minimal core of Ubuntu
un upstart <none> <none> (no description available)

February 20, 2015

Inkscape Multiple Pages

Actualmente me encuentro trabajando en el diseño del Annual Report para Software Freedom Conservancy, luego de presentar el Mockup he decidido realizar el Informe en su totalidad con Inkscape y no con Scribus que para mucho es la herramienta ideal para este tipo de Publicación.

 Mockup Annual Report

Para lograr mi independencia de Scribus, existe una extensión para Inkscape denominada Inkscape Pages, el cual contiene las siguientes características:
  • Insertar páginas.
  • Insertar márgenes de la página.
  • Utilizar una página maestra.
  • Mover Objetos de una página a otra.
  • Reorganizar páginas.
  • Quitar páginas.
  • La exportación a PDF. (Single .pdf)
  • Navegar a través de páginas. 
  • etc ...
Para Instalar esta extensión primero tienes que descargar:


Luego descomprimir e Instalar:

tar -zxvf inkscape-pages-1.1.tar.gz
cd inkscape-pages-1.1
sudo ./install en
(Si quieres la Extensión en español tan solo reemplaza en por es)
Reiniciar Inkscape luego verificar la instalación en Extensions - Pages 

Inkscape 0.91 - Pages

Ahora con Pages Instalado y tras realizar unas pruebas, he detectado el requerimiento de pdftk a la hora de exportar el documento a PDF.

para ello:

sudo apt-get install pdftk
Ahora se me hace mas fácil poder continuar con lo diseñado en el mockup y mantenerme en la aplicación en vez de traspasar el layout a Scribus, además espero utilizar esta misma extensión para el GNOME Annual Report 2014.

February 13, 2015

Add Locations to GNOME Weather

Al ver que GNOME Weather no mostraba todas las locaciones que estaba buscando, decidí meter mano y agregar a mi Ciudad Natal (Calama), por lo que decidí escribir este mini tutorial en caso que quieras agregar una locación que no aparezca por defecto.

OS: Ubuntu 14:10

Lo primero sera editar el archivo Locations.xml para agregar nuestro lugar.
Puedes usar tu editor favorito en este caso usaremos gedit.

sudo gedit /usr/share/libgweather/Locations.xml 

Tome como referencia Antofagasta que es la ciudad mas próxima que aparece por defecto y ahora agregamos los siguientes datos.

Calama-22.4667 -68.9333
  • name Agregamos el nombre de nuestra locación.
  • coordinates Agregamos las coordenadas de nuestra locación.

Aeropuerto de CalamaSCCF -22.4897 -68.9036   
  • name Agregamos el nombre del aeropuerto. 
  • code ID Aeropuerto.
  • coordinates Agregamos las coordenadas del aeropuerto. 

Y con esto Reboot y listo! nuestra locación ya aparece en GNOME Weather.

Ahora si quieres le puedes agregar una extensión, en mi caso instalé OpenWeather.

Con GNOME Shell Extension Preferences puedes editar diferentes unidades para: Temperatura, Velocidad del Viento, presión Atmosférica, etc.

September 10, 2014

Evince Highlighting support

So this is a quick update on Giselle post on SoC. (see here) There you could see a screencast of highlighting working but with a big lag. It turns out that the lag was related to a memory leak on the cache engine that only was triggered when doing the "animation" in the drag-and-drop of the highlighting annotation. Giselle luckily fixed this already, and I managed to spend some time adding new API to poppler to render the annotation directly, without need of reloading the page as we were force to before. Thus, we get an even smoother animation, as you can see here.

March 14, 2014

Cargador de signo de exclamación en Atari – Decodificado

El famoso signo de exclamación

Cuando los computadores Atari recién llegaron a Chile, practicamente todos los juegos que se podían encontrar en cassette usaban el famoso cargador del signo de exclamación.  Se iniciaba la carga de cassete encendiendo el computador con las teclas OPTION + START presionadas, sonaba un beep, se presionaba una tecla y después de unos 10 segundos sonaban unos 6 “pitos” y aparecía un signo de exclamación en la parte inferior derecha de la pantalla, luego pasaban unos 10 segundos más y comenzaba a sonar la carga del juego en sí, a veces amenizada por alguna simple pantalla de presentación.

Si algo fallaba durante la carga, se debía comenzar desde cero, por lo que toda la ansiedad acumulada durante los varios minutos de carga se veía absolutamente recompensada cuando finalmente aparecía el juego en pantalla.  Posteriormente aparecieron mejores sistemas de carga aplicando “turbo” (mayor bitrate) y un mecanismo de recuperación de errores que permitía continuar la carga desde el punto de falla y así no comenzar todo desde cero.  Estos sistemas de carga avanzados merecen un artículo propio, lo que vamos a ver acá es el cargador original del signo de exclamación.

Básicamente estos sistemas de carga funcionaban así: Al iniciar el sistema, la tecla OPTION presionada indicaba al sistema operativo del ATARI que desconectara la ROM del lenguaje BASIC (su espacio era ocupado por muchos juegos), y la tecla START indicaba que se quería hacer un boot desde cassette.  Cuando el usuario presionaba una tecla después del beep, el sistema operativo del ATARI cargaba un archivo y lo ejecutaba.  En el caso de practicamente todos los juegos, este archivo era un cargador un poco más inteligente que se encargaba de cargar el juego en un formato más flexible (XEX).  Si vieramos la cinta como un esquema, sería así:

| ------- CARGADOR EN FORMATO BOOT DE ATARI -------|---------- JUEGO EN FORMATO XEX ----------|
| CARRIER - BLK1 - BLK2 - BLK3 - BLK4 - BLK5 - EOF | CARRIER - BLK1 - BLK2 - ... - BLKn - EOF |

Siempre quise saber exactamente qué hacía el código de este cargador tan simple, y por qué era tan grande (unos 640 bytes). Gracias al usuario AsCrNet de AtariWare que me envió un dump del cargador pude finalmente decodificarlo y ver qué hacía.

Formato XEX

Para que sea más fácil entender el cargador conviene entender primero cuál era el formato del archivo que procesaba el cargador, el formato “del juego”.  Este formato es conocido con el nombre XEX y tiene más o menos la siguiente estructura

|---------------- Archivo en formato XEX ------------- ...
|------ ENCABEZADO ------ | DATA |------ ENCABEZADO -- ...

Un archivo XEX son varios bloques de datos.  Cada bloque comienza opcionalmente con un marcador con la secuencia FF FF (hexadecimal), luego viene la dirección de inicio expresada como 2 bytes (INIL INIH) y la dirección de término expresada también como 2 bytes (ENDL ENDH).  Estos 6 bytes son la cabecera del bloque, luego vienen los datos propiamente tal.  Por ejemplo si el juego tiene dos bloques, uno desde 32768 hasta 40959 y otro desde 3072 a 4096 veríamos la siguiente secuencia hexadecimal

|---------------------------- Archivo en formato XEX ----------------------------|
|--------------- BLOQUE 1 ----------------|------------- BLOQUE 2 ---------------|
|--- ENCABEZADO ---|-------DATOS----------|--- ENCABEZADO --|-------DATOS--------|
|FF FF 00 80 FF 99 | 16384 bytes de datos |FF FF 00 0C FF 0F| 1024 bytes de datos|

Después de cargar cada bloque, el cargador ejecuta una llamada a la dirección apuntada por el par de direcciones 738 y 739 ($02E2, $02E3).  Si el cargador quisiese ejecutar un código durante la carga, por ejemplo para mostrar una presentación, debía poner un bloque que escribiera en esas direcciones.  Supongamos que el código que muestra la presentación está en la direcció $0A3B, entonces aparecería un bloque así:

FF FF E2 02 E3 02 3B 0A

Cuando se llega al final de la carga, se transfiere el control al código apuntado por las direcciones 736 y 737 ($02E0, $02E1) utilizando el mismo esquema recién explicado.

El cargador

El cargador tiene el formato de BOOT propio de Atari, obviamente ya que de otro modo el sistema no lo podría ejecutar.  El sistema de BOOT de Atari comienza con 6 bytes para definir el número de bloques de datos, la dirección de inicio de carga y la dirección de ejecución.  En este cargador vienen los valores (hex) : 20  05  00 07 20 07 que son interpretados como : 5 bloques cargados a partir de $0700, inicio de ejecución en $0720. Por qué suenan 6 bloques de carga y acá dice que son 5? Porque son 5 de datos y el 6to es el EOF (End of File).

Si bien la dirección de ejecución es $0720, el sistema operativo de Atari primero ejecuta lo que está a continuación de este encabezado, en este caso es lo que está en $0706.  Y ahí comienzan las sorpresas!!!

Lo primero que me llamó la atención es que eset vil cargador está protegido.  Si uno trata de ver el código directamente, no se puede a menos que se vaya revisando la ejecución paso a paso.  Lo primero que hace el cargador es automodificarse para comenzar a ejecutarse en una dirección diferente a la que viene cargada originalmente. De la siguiente forma (ordenado por legibilidad):

706  32 244   8  JSR STOPANDPATCH ; $8F4


8f4  32 207   8 JSR MOTOROFF
8f7  32 213   8 JSR PATCHJSR
8fa  96         RTS

8cf 169  60     LDA #60
8d1 141   2 211 STA 54018
8d4 96          RTS

8d5 169  32     LDA #32   ; JSR
8d7 141   9   7 STA $709
8da 169 157     LDA #157  ; $9D
8dc 141  10   7 STA $70A
8df 169   8     LDA #8    ; $08
8e1 141  11   7 STA #70B
8e4  96         RTS

Cuando se ejecuta PATCHJSR se modifica el código que se ejecutará justo después de volver via RTS en $8D4, para que salte a $089D, y qué encontramos ahí? La rutina que desprotege el resto del código invirtiendo todos los bits mediante XOR #$FF, una ténica que podríamos considerar milenaria.

A partir de ese momento, el código queda legible completamente.

No voy a analizar el detalle del cargador, pero sí me interesa destacar las siguientes curiosidades:

  • No logré identificar la parte en donde se pone el signo de interrogación en la pantalla.  Sólo veo la impresión de un caracter que limpia la pantalla.  Será el signo de exclamación un bug del sistema operativo del Atari?
  • El código de carga XEX en este cargador es HO-RRI-BLE.  Esto se debe principalmene a que está mezclada la llamada a las rutinas del sistema operativo para cargar datos desde cassette, con la interpretación de los encabezados XEX. En comparación, cargadores más modernos como CAIN (ahem!) usan una abstracción tipo stream, en donde los bytes se procesan uno a uno y la carga física de los bloques se procesa en forma independiente, como si se tratara de un sistema opaco subyacente (le puse color ah).  En todo caso, se entiende que sea así, hay que pensar que ese código debe ser de principios de los ’80, cuando muchos de nosotros no sabíamos ni ir a comprar el pan.
  • Si la carga falla en algún momento, se invoca a la rutina del sistema operativo que imprime BOOT ERROR.  Por algún motivo, en los computadores que conocí esto nunca fue así, y el sistema simplemente se colgaba.  Es probable que la dirección de rutina haya sido válida sólo para equipos antiguos (400/800) y no para sistemas operativos más modernos (XL/XE).
  • Se nota que el código fue parchado a nivel binario, ya que usaron NOP en varias partes, desactivando código.
  • Derivado de lo anterior, hay muchos accesos de 16 bit a direcciones que están en la página cero, en donde se pueden usar instrucciones especiales que direccionan con sólo 8 bits (ej, 133, 2 en vez de 141, 2, 0).
  • Si hay un cartridge insertado, aparece un mensaje en pantalla que lo advierte.  Este mensaje nunca lo había visto, y es muy probable de que hasta el momento nadie lo haya visto tampoco!  Les adjunto una captura al final de este artículo foryourpleasure.

Para quién quiera ver el detalle de cargador, les dejo los siguientes archivos en una carpeta de DropBox:

  • casboot.asm : Archivo de texto con el código del cargador. Lo decodifiqué a mano, por lo que el código no es compatible con ningún assembler.
  • dump.c : Programa en C para hacer un dump del código que me envió AsCrNet.  Al cambiar UNPROTECT a 1, se aplica el XOR #$255 para desproteger el código
  • casboot.atr : Imagen de disco que contiene un pequeño programa en BASIC que hice para saber cómo se vería el mensaje del cartridge insertado (cartmsg.bas)

PD1 : La imagen del cargador que encabeza este artículo es un fake.  Fue lo más rápido que pude hacer.

PD2 : Por algún motivo se borró la mitad de este artículo mientras lo estaba creando. Lo tuve que hacer de nuevo. NOT FUN.

PD3 : Ningún juego fue dañado durante la creación de este artículo.

ACTUALIZACIÓN: Gracias a los aportes de Guillermo Fuenzalida y ArCrNet finalmente fue resuelto el enigma del signo de exclamación.  Cuando el cargador imprime el caracter de limpiar pantalla, lo hace con el siguiente código:

765 169 125     LDA #125   ; CLEAR SCREEN
767 32  164 246 JSR PRINT  ; $F6A4

Sin embargo la rutina del SO para imprimir en $F6A4 sólo es válida para la ROM de la generación Atari 400/800, porque en la ROM de los Atari XL/XE se encuentra en otro lugar.  Según Mapping the XL/XE:

Many 400/800 programs made direct jumps to keyboard ‘get’ and ‘put’ routines rather than through the proper vectors, which makes them incompatible with XL/XE machines. The get routines in the XL/XE begin at 62026 ($F24A). This was 63038 ($F63E) in the 800. The put routines begin at 62128 ($F2B0). or 63140 ($F6A4) in the 800. If you have a program which won’t work on your XL/XE, try finding if it uses these locations and change them.

Por lo tanto, el famoso caracter “!” de este cargador aparece debido a un bug sin mayores consecuencias.  Para comprobarlo, modifiqué la llamada a $F6A4 y la cambié por $F2B0 y efectivamente, se limpia la pantalla y no aparece el caracter “!”.  Lo mismo demostró ArCrNet usando el cargador en un emulador con la ROM del 400/800, nada de signo de exclamación.

Cartridge insertado

Mensaje que aparece si hay un cartridge insertado


October 30, 2013

Anotaciones PDF en Poppler GLib

El fin de pasada estuve con el ánimo de terminar el soporte de anotationes en documentos PDF en Poppler GLib.

Para aquellos que no lo sepan, Poppler es la biblioteca utilizada por Evince (y por extensión Documents [vaya nombre]) para desplegar el contenido de documentos PDF. Cualquier mejora visual o de rendimiento en Poppler se ve automáticamente reflejado en Evince.

Partí por restructurar poppler-glib-demo para que fuera más sencillo agregar y probar múltiples tipos de anotaciones (el código estaba muy ligado a las anotaciones de texto, aquellas que parecen notas amarillas Post-it). Después de revisar el código fuente de anotaciones de Poppler, decidí implementar las anotaciones de líneas (sólo las simples), luego cuadrados y círculos; y, finalmente, marcado de texto (resaltado, subrayado, subrayado ondulado, tachado).

Aquí un video que muestra el progreso hasta el momento.

En el código de la demostración, yo no dibujo directamente en una superficie cairo, sino que añado la anotación a la página, la actualizo según el movimiento del puntero mientras está el botón presionado y le pido a Poppler que despligue el PDF resultante. Lo bueno de este enfoque es que se ve el resultado final del documento PDF mientras es modificado interactivamente. Lo malo es el potencial costo en rendimiento en aquellos documentos donde Poppler es lento de desplegar.

Si ya tienes compilado Evince con lo típico de jhbuild, entonces basta seguir unos simples pasos para probarlo:

$ cd /to/your/jhbuild/checkout
$ git clone
$ cd poppler
$ git checkout annot-demo-fixes
$ jhbuild make
$ jhbuild shell poppler/glib/demo/poppler-glib-demo <pdf-document>

Los futuros pasos son: mejoras las anotaciones en Evince, editar y mover anotaciones, añadir más tipos de anotaciones y pulir.

Mi motivación para hacerlo es que Evince es una aplicación crítica para mí. Leo muchos documentos PDF y también produzco algunos. Para anotar documentos he estado usando ezPDF Pro (para Android), conveniente pero no es Software Libre y no me sirve en el escritorio, donde paso la mayor parte del tiempo. El visor de Mendeley es lo más cercano a mis necesidades, pero tampoco es Software Libre. Scholiar (un derivado de Xournal) es bueno para anotar en documentos, pero guarda realmente las anotaciones como tales en los documentos PDF, sino que las funde con el resto del contenido (me imagino como formar de suplir las carencias de Poppler GLib). Así que espero tener otro fin de semana similar para terminar lo que falta.

April 16, 2013

Building evince with jhbuild under a fresh install of Ubuntu 12.04

In the last year or so, Jhbuild has received a lot of  love and know it is much easier to use (for the first time) than it used to, but how much? Since Google Summer of Code is coming, I wondered whether was easy for a person with no experience building GNOME to build Evince. It turns out it is not that trivial, although it is quite better than the first time I managed to compile Evince using jhbuild.  Since the Jhbuild manual seems to be still a little outdated, I publish here the steps I needed, on a fresh install of Ubuntu 12.04.

  1. Install all the things jhbuild won't install for you. 
    $sudo apt-get install build-essential
    $sudo apt-get install git
    $sudo apt-get install gettext xsltproc docbook-xml docbook-xsl
    $sudo apt-get install apt-file autopoint
  2. Install jhbuild from git (if you have previously installed from apt-get, use apt-get remove jhbuild to remove it)
    $git clone git://
    $cd jhbuild
    $make install
    $echo PATH=$PATH:~/.local/bin >> ~/.bashrc
  3. Prepare your first .jhbuildrc config file.
    $cp examples/sample.jhbuildrc ~/.jhbuildrc
  4. Edit ~/.jhbuildrc file
    • Search for the line starting with "prefix" and change the directory to a writable one (the default /opt/gnome is not writable by default on ubuntu it seems)
    • For evince, you need to add the following lines to ~/.jhbuildrc
      module_autogenargs['evince'] = autogenargs + ' --enable-debug --disable-nautilus'
  5. Install dependencies using the new "sysdeps" command of jhbuild
    $jhbuild sysdeps --install
  6. Building evince
    $jhbuild build evince --ignore-suggests --nodeps
NOTE: For the time being, this will give you an error because jhbuild won't compile libsecret when compiling using --ignore-suggests. See this bug for more info. If it fails for you with a LIBSECRET not found error, then start a shell, do
$jhbuild buildone libsecret

and then resume the compilation of evince. If you want, you could do, at this stage
$jhbuild buildone evince
to trigger just the compilation of evince and NONE of its dependencies.
We use --ignore-suggests to ignore compiling a lot of modules that are not really important for developping with evince.
If everything goes right, you should have evince 3.8 compiled. If you want master, you need to choose the "gnome-suites-core-3.10" moduleset

April 09, 2013

Apache2 + SSL en ambiente de pruebas

Tiempo atrás escribí este documento (para cuando era Apache1.3), ahora lo actualicé para Apache2 en Debian7. Si a alguien le interesa se los comparto Apache2_SSL.

March 19, 2013

Aclaraciones sobre el acceso a mi colección de videos y música simplificado

Con la publicación de mi artículo sobre cómo simplifiqué el acceso a mi colección de videos y música, tuve varias conversaciones con personas que habían hecho algo similar, y como en los asados, cada uno tiene su propia y “mejor” forma de hacer las cosas.

Para los amigos que aun están en la etapa de ver cómo hacerlo, quiero hacer algunas aclaraciones para ayudarlos a entender mi experiencia y el por qué de algunas decisiones que tomé en la implementación.

Creo que lo primero que conviene saber es qué es lo que ya había probado (y no era suficiente).  Por ejemplo muchas de las soluciones que me indicaron del tipo “pero es más fácil si …” eran justamente lo que tenía como punto de partida, y quería mejorar.

Implementación original

Incialmente tenía un Zotac Mag con XBMC conectado a uno de los televisores.  Este equipo tenía parte de mi contenido en su disco duro, y el resto lo leía desde una biblioteca compartida en otro PC via red.  Este es el equivalente a tener por ejemplo un computador con una biblioteca de iTunes compartida y un AppleTV o un Mac Mini conectado al televisor actuando como reproductor.

Esta solución tiene varios problemas para mis necesidades personales:  Uno es que necesitas tener al menos un equipo siempre encendido, en este caso el que comparte la biblioteca (sea iTunes u otro), y si es un Apple, necesitas además tener un reproductor Apple por cada televisor.  Si no es Apple, pues es lo mismo que ya tenía con el Zotac Mag.  Por otra parte, el contenido del disco del Zotac Mag no podía ser compartido fácilmente.

Mientras tanto, el segundo televisor no tenía nada conectado, y la única forma de acceder al contenido era sacando el disco USB con mi biblioteca para conectarlo directamente al PC.  Engorroso si son las 2AM o estás compartiendo un buen momento con otra persona. Ni hablar si eso implicaba copiar archivos o que el televisor no pudiera reproducir los archivos.

Pensé en algún momento conseguir otro equipo como reproductor, pero en el camino y por otros motivos, me hice de un GoogleTV y un AndroidTV, ambos con capacidad de reproducir contenido via DLNA.

Entra el NAS

Para eliminar el equipo que siempre está encendido, fue donde recurrí al NAS.  También es un equipo que siempre está encendido pero tiene ventajas bien interesantes:  Su consumo de energía es mínimo, es un server puro (no hay capacidad ociosa), y ocupa tan poco espacio que es como si no existiera.

Aca pueden ver una foto del NAS, y para apreciar su reducido tamaño, le puse encima un DigiPass, que es del porte de un llavero.


NAS junto a un DigiPass

Tener el NAS es como si mi biblioteca estuviera simplemente “en la red” de mi casa.  Es tan pequeño que el router motorola de VTR parece una torre al lado de él.  Lo único molesto es su led rojo cuando está encendido, pero se nota sólo si la pieza en donde está tiene todo apagado.  Tampoco tiene ventiladores, por lo que es absolutamente silencioso.

Los reproductores

Para la reproducción de video, independiente de que ocupara XBMC, un computador con VLC, un televisor Smart, GoogleTV, Android TV, etc, el denominador común siempre terminó siendo DLNA.  Es más, en el televisor Smart sólo enchufas el NAS y te aparece lo que muestra la foto de abajo.

NAS en LG Smart TV

NAS en LG Smart TV

Una de las críticas a mi implementación era que era “muy hacker”.  Pero las “hackers” de mi casa no tienen mayor problema presionando el botón “input” para seleccionar el NAS.

Acá hay una captura de lo que se ve cuando selecciono el NAS en el televisor.

Selección de videos del NAS en LG SmartTV

Selección de videos del NAS en LG SmartTV

Por el lado del televisor “no smart”, este ya se encontraba conectado a un GoogleTV. Lo único que me costó fue decidir qué aplicación usar para acceder al NAS, y justamente escribir este artículo es para ahorrarles ese tiempo. Basta instalar MediaHouse desde Google Play, seleccionar el NAS y listo, verán las mismas carpetas que se ven en la foto.


El no poder reproducir el contenido por encontrarse en un formato no procesable por los reproductores es algo que sólo se puede evitar conectando un computador con XBMC o VLC al televisor, en donde la disponibilidad de codecs es infinita.  Pero eso es volver al punto de inicio, cuando ya tenía el Zotac Mag con XMBC.  Lo mismo sería conectar un Mac Mini o un AppleTV, es volver al punto de inicio del que quería escapar.

La transcodificación tiene sus pro y sus contras. El principal contra es que es un proceso lento, dependiendo del computador puede tomar unos 10 minutos por hora de video.

A su favor tiene varias cosas, sobre todo considerando que el video se transcodifica sólo una vez. Vamos viendo:

  • El archivo resultante generalmente es más pequeño que el original, dependiendo del bitrate seleccionado.  Por ejemplo muchos DVD’s de 4.7GB terminan convertidos en archivos de 500MB con la misma calidad aparente.
  • Se puede integrar en un solo archivo el video con sus subtítulos, nada de andar con los archivos sueltos por ahí
  • Muchos de los videos en HD que pululan en la red ya están en el formato correcto (MKV/H.264), no hay que transcodificarlos
  • El archivo SIEMPRE funcionará en todos los dispositivos.  Aquí your mileage may vary porque depende de tus dispositivos.
  • En mi caso, la mayoría del contenido que estoy moviendo al NAS lo tengo originalmente en DVD, por lo que la transcodificación es INELUDIBLE.  Por otro lado, la ganancia en espacio físico es altísima, ya que el CD/DVD se puede descartar una vez transcodificado.

Lo que no se vió

Hay una parte del proceso que quizás confundió a algunos que lo encontraron “muy hacker” y fue la actualización del firmware para instalar Snake OS.

En la realidad, los “complejos” pasos fueron:

  • Conectar el NAS a la red
  • Encenderlo
  • Abrir la página web de administración (como si fuera un router)
  • Seleccionar el archivo con SnakeOS y darle Aceptar
  • Esperar a que terminara la instalación y posterior reinicio.
Video en 1080p corriendo sobre LG SmartTV conectado al NAS

Video en 1080p corriendo sobre LG SmartTV conectado al NAS

Los costos

La parte de costos no es menos importante.  No me gusta llenarme de equipos con capacidades que no voy a usar, y si puedo reutilizar algo que ya tengo, mejor aún.  Por otro lado me si voy a gastar en algo, tiene que ser proporcional al uso que le voy a dar.  Como a veces le digo a mis amigos, para qué quiero un auto caro si pasará casi todo el tiempo estacionado.

Esto era lo que ya tenía antes de comenzar esta implementación:

  • 1 Televisor con soporte de DLNA
  • 1 Televisor sin soporte de DLNA
  • 1 Google TV enchufado al televisor sin DLNA
  • 1 Disco duro de 500GB que me sobró cuando le cambié el disco al Mac Mini
  • 1 Red Wifi :-P

Estos fueron mis costos en hardware:

  • 1 NAS : USD$40
  • 1 Adaptador para el enchufe : USD$1

Total : USD$41 (unos CLP$20.500)

Mis costos en horas hombre (aproximado):

  • Actualización del Firmware : 5 minutos considerando lo que tuve que leer

También hay costos del “noviciado” y que se evitarán con este par de artículos sobre el tema. No tengo estimaciones ni tampoco interesa mucho, porque no tendrán que pasar por eso nuevamente:

  • Reformatear disco NTFS a EXT
  • Buscar solución al problema de Mac OSX con versiones antiguas de SMB
  • Probar el codec que funcionara mejor, junto a su configuración

A modo de comparación de costos, aquí están los costos calculados de las alternativas “más fáciles”, pero que tenían el pequeño inconveniente de ser iguales a mi problema original, el que ya tenía solucionado:

Alternativa 1:

Time Capsule + 1 Mac Mini por cada televisor, o sea 2 Mac Mini

  • 2 Mac Mini = 2 * CLP$384.000 = CLP$768.000
  • 1 Time Capsule para alojar la biblitoeca (2TB) = CLP$192.000

Costo total sólo en hardware : CLP$960.000

Una diferencia de un 4.800% con el costo de mi implementación.

Alternativa 2:

1 Mac Mini + 1 Apple TV por cada televisor, es decir, 2 Apple TV

  • 2 Apple TV = 2* CLP$76.000 = CLP$152.000
  • 1 Mac Mini  = $384.000

Costo total sólo en hardware : CLP$536.000

Una diferencia aproximadamente de 2.600% con el costo de mi implementación.

Además hay que agregar que con un sistema basado en Apple no podría acceder al contenido desde los 2 computadores con Linux que además se usan en la casa, ni los Android’s.

En mi caso personal también podría descontar el Mac Mini, porque hay uno.  Pero ni loco lo dejaría encendido 24×7.  Aún así la implementación sería un 700% más cara que lo que conseguí finalmente.

February 03, 2013

Add Color to your Life, Add color to your Terminal OSX

Trabajar con un terminal en Linux es muy agradable dado a que es muy fácil diferenciar los archivos de las carpetas por sus colores, pero a la hora de abrir un Terminal en OS-X nos damos cuenta que esos colores no existen por lo que se hace fundamental agregar colores para hacer mas agradable el trabajo.
Terminal sin Colores

Lo siguiente es abrir el Terminal y escribir lo siguiente:

sudo nano bash_profile
A continuación copiamos y pegamos el siguiente texto:

export CLICOLOR=1
export LSCOLORS=GxFxCxDxBxegedabagaced
Luego para guardar los cambios Ctrl + O 

Reiniciamos el Terminal y vemos los cambios.

Ahora para entender un poco la asignación de colores en:

export LSCOLORS=GxFxCxDxBxegedabagaced
Asignación de colores:
a black
b red
c green
d brown
e blue
f magenta
g cyan
h light grey
A bold black, usually shows up as dark grey
B bold red
C bold green
D bold brown, usually shows up as yellow
E bold blue
F bold magenta
G bold cyan
H bold light grey; looks like bright white
x default foreground or background

Y el orden de los atributos:
1. directory
2. symbolic link
3. socket
4. pipe
5. executable
6. block special
7. character special
8. executable with setuid bit set
9. executable with setgid bit set
10. directory writable to others, with sticky bit
11. directory writable to others, without sticky bit

Si quieres personalizar los colores, por Ej: que tus directorios sean de color Azul, es tan solo reemplazar   el primer carácter por E.

export LSCOLORS=ExFxCxDxBxegedabagaced
Guardamos Ctrl + O, reiniciamos el terminal y veremos los cambios efectuados.
Terminal con los directorios de color Azul.

De esa manera puedes agregar y personalizar colores de un Terminal en OSX.

December 27, 2012



testing gnome-blog

testing gnome-blog with gtk3 and gsettings.

gnome-blog home


Portando gnome-blog a gtk3.

Como muchas otras aplicaciones, ésta también necesita ser migrada a GTK3. Y como en otras migraciones, también es necesario portar de gconf a gsettings. Es el caso de gnome-blog, que necesita de tal tarea. El bug es éste.

He realizado ya los cambios principales y la prueba es éste post (que espero que aparezca :D ).

Los cambios hechos son:

+ paso de pygtk a pygobject.

+ paso de gconf a gsettings. (creación de su esquema y eliminación de gconf)

+ pruebas con MetaWeblog Protocol. (el resto de los protocolos hay que testearlos)


+ Drag and Drop para las imágenes.

+ Pruebas en otros equipos.

Unas pruebas… (

Screenshot from 2012-12-27 15:52:27 Screenshot from 2012-12-27 15:54:49


aaaa aaaaaa aaaaaa aaaaaaaa

December 03, 2012

Día GNOME 2012

El pasado Sábado 27 de octubre, se llevó a cabo el Día GNOME 2012 en la ciudad de Curicó, Chile.

La asistencia fue espectacular y gracias al auspicio de la GNOME Foundation se pudo seguir con la costumbre de entregar a cada uno de los asistentes un pequeño almuerzo y así poder compartir entre todos los asistentes y continuar con el espíritu del Software Libre.

November 18, 2012

Tiling rendering in Evince

One of the oldest bug in evince is the ability to zoom-in a large scales, like 1600% or more. This happens because the Cache that render the pages can only render full pages and rendering full pages at large scales eats a lot of memory. So some days ago I started to work on making the cache in evince "tile" aware, that is, to render only portions of a full page. I am happy to say that a preliminary result can be found in
my evince repo in github ( in the wip/tiling_manager branch. Right now a lot of things still don't work, but tile rendering in single and continuous mode are working (not in dual mode yet)...

In the video above, you can see evince rendering a page using 256 tiles. The red tiles only appear while there is no rendered tile, and are just there to test the code.

Note that the rendering 256 tiles is quite slow because Poppler will reparse the pdf file each time we render a tile... So why bother? In fact, the video is only for ilustration, ideally evince will use tiles of the size of the screen or around that size, so you only get to see a few tiles at a time. The main advantage of this code is that now we can easily implement larger zoom modes. The next picture shows Evince running the Pdf 1.7 reference document at 1600% using 256 tiles for each page. Memory used by evince is around 150 M with this.

Unfortunately, there are a lot of things that still don't work...selections, dual_page mode, and other... Also since this is a main refactor/rework of the Cache code, it will need a lot of testing and review before it gets merged into master (as new code it is likely to have more bugs and we don't want to evince to be unstable) ... but we are right in the begining of the 3.7 cycle, so I hope I can get this merged into evince 3.8.

February 10, 2012

That's why Windows Movie Maker is so popular

Bajar videos de Youtube en Linux, a pesar de haber miles y miles de aplicaciones, no encuentro absolutamente ninguna que me caliente lo suficiente (sic) como para usarla por un tiempo. Use abby en Ubuntu 11.04, pero debido a un grave problema mental de la aplicacion, dejo de funcionar para bajar videos de Youtube (LP #784724).

Despues de estar casi dos horas cepillando para poder bajar y convertir en MP4 dije el tipico "stop". Mas bien fue un "estas puro hueveando"

Volvamos a la consola. Necesitan cclive y umph.. No saquen ninguno de los repositorios de su distro, por que ambos estan quebrados. CClive desde fuente y Umph tambien.

En el caso de umph van a necesitar algunas bibliotecas de Perl (Getopt::ArgvFile, XML::DOM y Umph::Prompt, conseguibles en su CPAN favorito). Ambos deben andar.

Y, la receta magica. Yo al menos soy fan del canal de videos de ScienceOnline, sobre todo por que gastar 5 minutos en aprender algo, no es perder el tiempo ;-) Asi que para bajar el feed entero... (si, completo)

$ umph -a -t u ScienceOnline | cclive

Antes, claro, dense una vuelta para ver los formatos soportados. Usen esto para mostrar los soportados del video:

$ cclive --query-formats
fmt05_240p|fmt18_360p|fmt34_360p|fmt35_480p|fmt43_360p|fmt44_480p :

El formato de mas de la derecha es 480p.

Ahora, corrigiendo el primer llamado...

$ umph -a -t u ScienceOnline | cclive -f fmt44_480p

La hombria no me llego a tanto como para convertirlos a MP4 dentro de la misma linea.

Bitch-ass motherfucking update!

$ umph -a -t u ScienceOnline | cclive -f fmt44_480p --exec "ffmpeg -i '%f' '%f.mp4'"

No es la gran cosa, pero siento que esto se esta convirtiendo cada vez mas en rocket science.
A todo esto, algun editor de video en Linux similar a WMM? Openshot me sirve, pero agregar un texto SIN TENER QUE USAR EL MALDITO BLENDER...digamos que no es de mi agrado.