Working Canon PIXMA G3010/G3110 @ macOS

The only way to make this work is by using it vía network, forget about USB. Also, it only works as a printer, not as a scanner, blame Canon for not even implementing proper Bonjour support as a multifunctional printer. To make it work:

  • Download the drivers for the Canon PIXMA G3000 (it says 3200 but it’s the one for the 3000)
  • Download the Canon Android APP and setup the printer to connect to your network.
  • Install the PIXMA G3000 drivers and setup the printer as a network printer.

Done. It shows up as a regular printer, and you can print from it (it takes a little bit longer than printing from Windows), but it’s just a regular printer. The Android App might include some PPD files and/or drivers to really make it work, but who knows? I made sure to ask someone else to do the wireless setup for me so that I didn’t have to agree to any of the usually insane Terms & Conditions. This process might work for Linux-based systems but I do not use any of them at work, and I do not use printers at home.

More about Unions in Vala

In a previous post I speculated about adding tagged unions to Vala. Let’s do that again.

In order to support the C usecase, Vala would need to include 2 types of tagged unions, a legacy one, and an idiomatic one. The legacy should look like the C version of a tagged union:

struct tagged {
    short tag;
    union variants {
        string text;
        int num;
} tagged;

This is needed to bind the C libs out there. The type of the tag should be something that can be easily compared IMO (numeric datatypes, C enums, and string). The binding would then look like this:

[CCode (cname = "tagged", union_tag_field = "tag" union_tag_type = "short" union_field = "variants")]
union Tagged {
    [CCode (cname = "text", union_tag_id = "1")]
    [CCode (cname = "num", union_tag_id = "2")]

The idiomatic ones, however, would actually look like a Rust struct, so if we declare:

public union OrderStatus {
	CANCELLED {string reason, string cancelled_by},
	REJECTED {string reason},
	COMPLETED {DateTime completed_at},
	ON_HOLD {string reason, Datetime until}

We should get:

enum OrderStatusTag {
} OrderStatusTag

union order_status {
    struct accepted {OrderStatusTag tag};
    struct cancelled {OrderStatusTag tag; string reason, string cancelled_by};
    struct rejected {OrderStatusTag tag; string reason};
    struct completed {OrderStatusTag tag; GDateTime completed_at};
    struct on_hold {OrderStatusTag tag; string reason; GDatetime until};
} OrderStatus;

Fun things to support: GVariant variant types (unboxing, serialization, etc.), GValue, JSON representations.

Converting Array fields from PostgreSQL in jOOQ

There’s currently a “bug” (not really a bug, but it works for me in MySQL) that prevents jOOQ from reusing a forcedType when it appears as an array instead of a single value. I have a workaround for this: a forcedType for the array field, and binding it by field name. To facilitate the creation of an Array Converter, just subclass this and pass the right converter in the super() call:

package com.github.desiderantes.jooq;
import org.jooq.Converter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class ArrayConverter<T,U> implements Converter<T[], U[]> {
private Converter<T,U> converter;
public ArrayConverter(Converter<T, U> converter) {
this.converter = converter;
public U[] from(T[] databaseObject) {
List<U> list = new ArrayList<>();
for (T type : databaseObject) {
U from = converter.from(type);
return (U[]) list.toArray();
public T[] to(U[] userObject) {
List<T> list = new ArrayList<>();
for (U type : userObject) {
T to =;
return (T[]) list.toArray();
public Class<T[]> fromType() {
return (Class<T[]>) Array.newInstance(converter.fromType(), 0).getClass();
public Class<U[]> toType() {
return (Class<U[]>) Array.newInstance(converter.toType(), 0).getClass();

Unions in Vala

I’ve started to use Kotlin professionally, and keeping an eye on Rust. Both offer a lot of niceties that I wish we could adapt for Vala, but there’s one that keeps popping up my mind everytime: pattern matching.

The simplest pattern matching we have is C unions, and a lot of c-libs use them. Unfortunately, the current handling of unions in Vala is a disgrace, and there’s no alternative for it. But I believe we can import some syntax from both Kotlin and Rust. Here is my proposal of how should unions work in Vala:

//Opening a bracket defines an "anonymous struct"
public union OrderStatus {
	CANCELLED {string reason, string cancelled_by},
	REJECTED {string reason},
	COMPLETED {DateTime completed_at}
	ON_HOLD {string reason, Datetime until}

match (order.status) {
	ACCEPTED -> info("Cool!");
	CANCELLED -> debug(@"Not okay, it was cancelled because of $(it.reason) by $(it.cancelled_by)");
	REJECTED as that -> info (@"Rejected: $that.reason");
	default -> error("What is this?? There's no implicit \"it\" here because it's a catch-all!")

public union NestedUnion {
	union COMPLEX {
		HARD{string reason}

//The additional field belongs to the wrapping struct

public union ComplexUnion {
	THIRD {string reason};
	//parent field, children cannot have a field with the same name
	uint32 timestamp;

//Maybe this is not a good idea

public union VeryComplex {
		override void run() {
		override void run() {
		override void run() {
		override void do() {
			debug ("Yay!");
	//They are all required to implement it!
	abstract void run();
	//Optionally overriden
	virtual void do() {
	//Can't touch this
	public void execute() {

//In this case, they reuse existing datatypes

public union ExternalUnion {

public void method () {
	var order = new Order(OrderStatus.ON_HOLD("reason",;
	var other_order = new Order(OrderStatus.CANCELLED(cancelled_by = "desiderantes", reason = "who knows!")); 
	var nested = NestedUnion.COMPLEX.HARD(reason = "no reason at all");
	//'match' can return a value, but all branches should return the same type
	//this 'match' in particular is exhaustive, so no default needed, but if you return a value from 'match', you have to either
	//cover all cases or have a default branch
	NestedUnion another_nested = get_from_network();
	var reason = match (another_nested) {
		SIMPLE -> "Just because";
		COMPLEX -> match (it) {
			SOFT -> "Really easy";
			//if not renamed, then you'll lose access to the it from outer context, as it'll be shadowed
			HARD as that -> that.reason;
	//This errors
	var complex = ComplexUnion(123456789);
	var complex = ComplexUnion();
	var complex = ComplexUnion.FIRST();

	//This should work
	var complex = ComplexUnion.THIRD(123456789, "I can");
	var complex = ComplexUnion.THIRD(reason = "Just because", timestamp = 321654987);
	match (complex) {
		//properties from the parent are only accessible from the parent reference, no implicit parent var
		FIRST -> debug(@"$(complex.timestamp)");
		SECOND -> debug ("Oops");
		THIRD -> debug @("$(complex.timestamp) by $(it.reason)");
	var external = ExternalUnion.STRING("this string is required");

The internal structure (C-wise) of my proposed tagged union is not anything new, it has been done a lot before in C land (here is an explanation from the Rust viewpoint)

Tip: Emitting the notify signal in Vala

I needed a way to emit the notify signal of one of my objects from another place, and Vala didn’t show me a straightforward way to do it. If you need it for some reason, here’s a code snippet showing you how:

using GLib;

public class TestClass : GLib.Object {
	public string test1 {get;set;default = "test1";}
	//Ths one won't emit on assignment
	[CCode (notify = false)]
	public string test2 {get;set;default = "test2";}

	public static void main (string[] args) {
		var test = new TestClass ();
		test.notify["test1"].connect (() => GLib.print ("test1 notification\n"));
		test.notify["test2"].connect (() => GLib.print ("test2 notification\n"));
		test.test1 = "Ahoy";
		test.test2 = "Újale";
		test.test2 = "Ajúa";
		ParamSpec pspec = ((ObjectClass) typeof (TestClass).class_ref ()).find_property ("test2");
		GLib.print ("First try, will not work %s\n",;
		GLib.print ("second one, this is how it works");
		test.notify["test2"] (pspec);

Replay Edits

Being in the zone is amazing: your productivity skyrockets and the code just flows. Then somebody micromanages talks to you, the boss starts to scream discuss things on the phone, or it’s lunch time and this company won’t give back any minute you waste before starting to eat. Since this hapenned to me at least once, I’ve been looking for a simple way to get back my productivity when I resume my job. I’ve found that the best way for me is just doing insane amounts of Ctrl+Z and Ctrl+Shift+Z/Ctrl+Y to see what I did and where did I did it. But this is a tiresome activity, the kind that I expect to be automated. So why not add a simple option in your text editor, a nice Replay Edits that’ll just play in real time edits from last saved state to current state? I want this, and if you know something like this, PLEASE tell me, I’m all ears.

Abandoned Vala Projects

There was a time when Vala was really popular, and a plethora of Vala apps spawned. A lot of them are dead right now, so since i don’t have time to revive any of them, i’ll publish this list of interesting projects in case someone is interested in bringing back one of them:

On Vala and Composite Templates

If you want to use the GTK+ composite templates in Vala, please remember : you have to use a GResource. The syntax is not exactly hard, here’s an example:

<?xml version="1.0" encoding="UTF-8"?>
<gresource prefix="/org/gtk/Example">
<file compressed="true">window.ui</file>

Which is pretty simple. Let’s say you called that file project.gresource.xml, so to include it, you do (at compile time)

valac --target-glib=2.38 --gresources project.gresource.xml --pkg your_package1 --pkg you_package2 ...

Of course, it can’t be that simple, so first you have to _compile_ that xml file (crazy, isn’t it?), doing

glib-compile-resources project.gresource.xml

and then include the generated C file. As this won’t scale, and you probably aren’t compiling that way, the documentation suggest to include a make rule for this. So, our make rule should look like this:

project-gresource.c: project.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies project.gresource.xml)

and we can include the generated C file in our valac call:

valac --target-glib=2.38 --gresources project.gresource.xml --pkg your_package1 --pkg you_package2 file1.vala file2.vala project-gresource.c ...

Please don’t forget to read the announcement here for more info.

Sabemos que están allí, y vamos tras ustedes

Received: from stat.stellar.outer.ganymede (sent as byte stream []) for ; Thu, 26 Jul 3015 09:07:24 -0400 (EDT) DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=ganymede;s=notices; t=1343308044; bh=EbJxls+Dm+kfxT6Nc/p+DZKILowo7lypLeG+fVJ3IIA=; h=To:Subject:Date:From:Reply-To:Message-LANG:LANG-Version-ES: !Content:Start;b=CWO1WlY9eoRD6VbfkZ2JxHiBA5aK


Cometimos un error. Es la simple e innegable verdad, sin importar cuan dolorosa sea. La falla no estuvo en nuestros Observatorios, pues esas máquinas eran tan perfectas como nos era posible fabricarlas, y sólo nos mostraron la luz sin filtro de la verdad. La falla no estuvo en el Predictor, pues es un dispositivo de lógica pura e infalible, transformando información pura en información con sentido, sin la mancha de emoción o sesgo alguno. No, la falla estuvo en nosotros, los Orquestadores de este desastre, los cogniscientes que se creyeron por encima de tales fallas. Somos los responsables.

Todo comenzó hace poco tiempo, del modo en que estas cosas son medidas, diría que hace menos de 6⁶ Deeli, aunque sospecho que nuestros sistemas de medición serán de poco interés para cuando se reciba esta transmisión. Detectamos débiles señales de radio, provenientes de una civilización floreciente, a unos 214 Deeli hacia el exterior del Núcleo Galáctico, como los fotones viajan. Al inicio, crudas y sin estructura, estas trasmisiones rápidamente crecieron en complejidad y fuerza, así como lo hicieron los mensajes que transportaban. Mediante nuestros Observatorios, pudimos observar un planeta de luchas y violencia, plagado por una barbárica y efímera especie de alimañas, esparciéndose como la plaga. Eran seres salvajes e incivilizados, quienes se apuñalaban, se disparaban, y se quemaban los unos a los otros, sin propósito en su existir. Incluso sus conceptos de arte sólo hablaban de conflicto y dolor. Se distribuían de acuerdo a algún patrón cultural extraño, y enfocaban toda su producción industrial y su avance científico, a la maquinaria de guerra y muerte.

Nos aterrorizaron, pero éramos mayores y más sabios, y estábamos tan lejos, que no nos agitamos. Entonces observamos cómo aprendieron a dividir el átomo, y abrir sus cielos con el aliento exánime de una de sus cortas generaciones. Cuando comenzaron a enviar transmisiones más activamente, nos empezamos a preocupar. Sus transmisiones ahora prometían paz y camaradería a quien estuviese escuchando, pero los habíamos observado demasiado como para caer en sus engaños. Sabían que estábamos allí afuera, y venían tras nosotros.

Los Orquestadores consultaron al Predictor, y su predicción era inquietante. Se multiplicarían y crecerían, e inundarían su sistema hogar, como una avalancha descontrolada de Planarias devoradoras, consumiendo todo a su paso.Puede que esto sucediese a unos 6⁸ Deelis, pero, de descuidarlo, probablemente nos destruirían. Con el dolor en nuestros caparazones, decidimos actuar, y así sellamos nuestro destino.

El Don de la Misericordia tenía unos 8⁴ pasos de largo, con una boca de 2/4 de ello en diámetro, llena con bastantes 4⁴ pesos en maquinaria, combustible, y munición. Se impulsaría a 2/8 de la velocidad de la luz con el combustible a bordo, para luego alimentarse de Elemento Primario Interestelar 2/2, para alimentar su aceleración sinfín. Iría a una velocidad cercana a la de la Luz, al momento del impacto. Nunca lo verían venir. El día de su lanzamiento fue uno de sollozo, celebración, y reflexión. El horror del acto que habíamos cometido pesaba sobre todos nosotros. La necesidad de nuestro crimen vagamente nos reconfortaba.

El Don apenas había superado el halo exterior de cometas, cuando el primer error ocurrió, pero ya era demasiado tarde. El Don no podía ser desviado, ni devuelto, ni interceptado. Los arquitectos y el cuerpo de obreros, horrorizados por el aterrador poder de la cosa en la que habían trabajado, lentamente empezaron a suicidarse, andando sin protección en zonas radioactivas, dejando a un lado la presurización adecuada, su seguridad, o simplemente cesando la ingesta de nutrientes hasta que sus funciones metabólicas terminaran. El terrible costo de vidas obligó a los Orquestadores a simplificar el diseño y la construcción del Don. No hubo tiempo para diseñar o implementar algo más allá de los simples pero enormes motores, y el sistema de estabilización. Sólo podíamos mirar avergonzados y aterrorizados, mientras la luz del genocidio se difuminaba en infrarrojo contra el vacío distante.

Ellos, sin embargo, crecieron y cambiaron, en un corto rango de vidas. Abolieron la guerra, y abandonaron sus tendencias violentas para abocarse al gran propósito de la vida y el arte. Los observamos reinventarse a sí mismos, y luego a su mundo. Sus frágiles y suaves cuerpos cedieron ante los metales brillantes y los plásticos, unificaron a los suyos mediante una red de comunicaciones, y produjeron Arte de tal fuerza y emoción, como los gustos de la Galaxia jamás habían atestiguado. O, también, por nuestra culpa.

Convirtieron su hogar en un paraíso (bajo sus estándares) y muchos 10⁶ de ellos se esparcieron en el sistema con tal rapidez y vigor que sólo pudimos envidiar. Con cuerpos adaptados tanto para luminosa superficie de su mundo interior, como para la atmósfera gaseosa de su Mundo mayor, así como el frío vacío entre ellos, se dedicaron a esculpir su sistema en algo hermoso. Primero los consideramos simples mineros, explotando los planetas rocosas y las lunas para la obtención de recursos, pero luego pudimos apreciar el propósito de su construcción, las obras de arte talladas en cada superficie, recorriendo el sistema en luces brillantes y vías danzarinas que se fundían. Aún así, nuestro terrible Don se acercaba.

Tenían menos de 2² Deeli para verlo, siguiendo de cerca la cola de su propia luz. En ese momento, oh, tan corto aún para sus fugaces vidas, más de 1010 seres cogniscientes se preparaban para morir. Los amantes intercambiaban las últimas palabras, separados por mundos y la tiranía de la velocidad de la luz. Sus ingenieros planetarios trabajaban sin descanso para construir la transmisión necesaria para almacenar incontables masas con las necesarias modificaciones neuronales, mientras los que se hallaban en el poder desechaban una vida entera de música y literatura de sus bases de datos, a fin de dar cabida a más pasajeros. Los que carecían del hardware adecuado observaban con resignación su sentencia de muerte, se entregaban al miedo y al dolor, o simplemente continuaron con sus vidas lo mejor que pudieron bajo las circunstancias

El Don llegó de repente, la luz de su impacto visible en nuestro cielo, brillante y cruel luz aún para el receptáculo visual sin aumento. Vimos y lloramos por nuestras víctimas, muertos ya a muchos Deelis antes de que la luz de su destrucción llegara a nuestra vista. Muchos 6⁴ de los que que habían estado, directa o indirectamente envueltos en la creación del Don sellaron sus espiráculos, como última penitencia por sus roles jugados en tal atrocidad. La luz se desvaneció, el polvillo se asentó, y nuestros Observatorios se concentraron de nuevo en el espacio en que su brillante mundito azul alguna vez había estado, colgado en el vacío, para sólo hallar polvo y el pálido resplandecer de una luna huérfana, atrapada en un delgado y ardiente manto de lo que fuere la atmósfera de su planeta padre.

La radiación, junto a la metralla relativista, había borrado mucho de su sistema interno, y pedazos de roca hirviendo, del tamaño de continentes, transportaban fantasmas chirriantes a velocidades de escape interestelares, condenados a vagar por el vació por una eternidad. El daño fue apocalíptico, pero no completo. De las sombras de sus mundos externos, pequeños puntos de luz emergieron, miles de estelas de fusión de sus miles de embarcaciones, pequeñas, grandes, y todo lo que haya en el medio, surgieron, así como 10⁶ de sus sobrevivientes en carne y acero, con sus bancos de memoria, estaban listos para reconstruirse. Por un breve momento sentimos alegría y alivio, pues nos llenó la esperanza de que su cultura y su Arte sobrevivirían la terrible masacre que habíamos perpetuado. Luego vino un mensaje, enfocado a nuestra estrella con una gran precisión, transmitido en simultáneo por cientos de sus naves.

“Sabemos que están allí, y vamos tras ustedes.”


Traducción algo libertina de este creepypasta