Type inference in C++

Last week I was on vacation, and I took the time to relearn C++, as it had been very long since I had last worked seriously with it.

In the process I thought that C++'s template system can also serve as a type inference mechanism.

Because what's the difference between having OCaml guess the types as in this snippet...

# let cat a b = a @ b;;
val cat : 'a list -> 'a list -> 'a list = <fun>

... and having C++ instantiate the template for the appropriate types in this other snippet?

template <typename List>
List cat(const List & a, const List & b) {
  List c = a;
  c.insert(c.end(), b.begin(), b.end());
  return c;
}

(Modulo syntax errors, of course.)

El herrero de canciones

Hace tiempo, Microsoft Research presentó Songsmith, que es un programa que, a partir de una canción, le compone una música de acompañamiento.

Os podéis imaginar que la calidad de las “piezas” resultantes es bastante variable, por decir algo. Por supuesto, la gente de Internet, que es muy mala, se dedicó a extraer las pistas vocales de unas cuantas canciones famosas, pasarlas por el Songsmith, y publicar el resultado.

Algunas veces es gracioso:

Otras veces es extraño:

Otras veces sólo es triste:

¿Habéis visto más? ¿Hay alguna que os haya llamado especialmente la atención?

De vulnerabilidades web

Muchas aplicaciones web están mal hechas. Cualquier página web maliciosa podría realizar acciones en esas aplicaciones web empleando las credenciales de los usuarios que accedan a la susodicha web maliciosa.

Lo comento aquí porque me he dado cuenta de que la protección que Drupal incluye contra esa vulnerabilidad impidió que haya tenido todavía más spam, aunque esa no fuera su finalidad primaria.

Esa vulnerabilidad se llama CSRF (aunque le han dado muchos más nombres), que son las siglas de “Cross-Site Request Forgery”, o, en castellano, “falsificación de consultas entre sitios”. Básicamente consiste en incluir código HTML y/o Javascript en una página web para realizar una consulta HTTP a una URL de otro sitio, y que esa consulta HTTP conlleve una acción (publicar un comentario, votar una historia en Menéame, etc.). Esto puede ser tan simple como incluir una etiqueta “IMG” que apunta a un URL, o tan complicado como crear un formulario, rellenarlo y enviarlo mediante Javascript.

Hay varias maneras de solucionarlo, pero las más efectivas parecen consistir en crear un “token” (un código de un solo uso) y añadirlo al formulario cuando el usuario accede a la página que lo muestra; cuando el usuario envíe el formulario el “token” irá incluido, y sólo se realiza la acción si el “token” correcto está en el formulario.

Como el atacante no tiene acceso al formulario (sólo puede enviar consultas, pero no ver el resultado), tampoco puede obtener un “token” válido, así que la consulta que envíe tampoco será válida, y la acción no se realizará.

Pues bien, revisando mis “logs” he visto muchos intentos de enviar spam desde hace mucho tiempo; sin embargo, éstos no tuvieron éxito hasta hace poco. ¿Por qué? Simple: antes, los spammers sabían qué campos había en el formulario, así que intentaban enviarlo directamente. Sin embargo, no tenían un “token” válido, y esos intentos fracasaban.

Ahora han cambiado el “modus operandi”: ahora descargan el formulario antes de enviarlo, con lo que consiguen el “token” y los comentarios se publican. O, más bien, se publicaban hasta que añadí Hashcash. Como el software de los spammers no soporta hashcash, esos comentarios vuelven a no ser publicados.

Por lo tanto, estaremos libres de spam, básicamente, hasta que los spammers implementen hashcash en su software. Pero bueno, ya cruzaremos ese río cuando lleguemos a él...

Damn spammers

Some people don't rest until they ruin everything.

Today, spammers have posted some 30 comments in my blog full of links to Viagra stuff. Of course, I removed them as soon as I could, but several of those comments were visible for a couple of hours.

Obviously, I don't want any spam in my weblog, but I don't want to remove the possibility to post comments either. Many people would install a “captcha” (one of these images with distorted characters you have to write in a text box to post a comment), but I hate them because they are hard to read for a human (and impossible for someone who cannot see well or at all) and easy to circumvent for a spammer.

Instead, I have installed a system called “hashcash”. Basically, it consists of having the browser perform some calculations before submitting the comment. This, in theory, slows down the rate spammers can send their material (as the calculations take a bit of time to perform) and ensures that it's an an actual browser that sends the comment, not a spam program. The problem is that it uses Javascript and, therefore, whoever doesn't use Javascript won't be able to post comments.

I'm very sorry, but that's life. I know that this is not the final solution to the spam problem (the reasons are so many and so varied, if I started writing them I wouldn't finish today), but it is the best I have right now. Obviously, if someone over here refuses to use Javascript and wants to complain, just post a comment ;)

Contando los segundos

Si vas por la calle y paras a alguien para preguntarle la hora, puedes encontrarte tres tipos de respuesta:

  1. “Son las tres menos cuarto”
  2. “Son las quince cuarenta y siete”
  3. “¡No tengo dinero! ¡No me atraques! ¡No me atraques!”

Por tanto, si no contamos a la gente que se cree todo lo que sale en la tele y vive aterrorizada de sus semejantes, vemos que hay dos tipos de personas: unos se conforman con saber la hora con una precisión de unos tres o cuatro minutos, mientras que los otros quieren tener la hora más exacta posible. Esta historia no va sobre los primeros, sino sobre los segundos (al fin y al cabo, las historias sobre gente con rarezas son mucho más entretenidas que las historias sobre la gente normal).

My lava lamp

I have a lava lamp (one of the perks of my job). Unfortunately, while it has more than enough lamp, it is lacking in the “lava” department:

That's how it is, with a single lava blob going up and down all day long. It must be the saddest lava lamp in the world...

Stack overflow

I'm a voracious reader, but the size of my stack of books to read (which appears on the right, under the title “the pila de books”) is starting to scare me. And if I add to it the stack of DVD, I get even more scared.

I suppose I will have to stop buying books for the next few weeks. (The one I bought yesterday from Amazon doesn't count, as it is technical.) The publishing industry will have to find someone else who will save it for the next days.

Por qué ya no traduzco software

Este es un texto que escribí en noviembre de 2004 en mi página web, explicando por qué ya no me dedicaba a traducir software. Desde entonces volví a ponerme a traducir software de Mozilla (aunque sin intentar “oficializar” mi traducción) y el instalador de Debian, aunque volví a dejarlo recientemente (octubre de 2008).

Por favor, tened en cuenta que este texto lo he escrito hace cuatro años. Desde entonces he cambiado ligeramente mi opinión sobre algunos de los asuntos que discuto en él, aunque sigue siendo la misma en lineas generales. Lo publico aquí, de todas maneras, porque hay páginas que aún apuntan a este texto, y no quiero romper todos esos enlaces.

El origen del nombre de Dublín

Las guías de viaje de Dublín suelen decir que su nombre en irlandés es “Baile Átha Cliath”, y que el nombre “Dublín” procede de “Dubh Linn”, que significa “laguna negra”, y se quedan tan panchas. Así, sin explicar a qué viene lo de la laguna negra de marras, y por qué esta laguna era tan importante como para darle su nombre a la ciudad.

El río que cruza Dublín es el Liffey. El Liffey se ve afectado por las mareas: cuando la marea es alta, el agua del río es salada. Por este motivo, no se podía utilizar el agua del río para beber, y los antiguos habitantes de Dublín tenían que recurrir al río Poddle, uno de los afluentes del Liffey, para obtener su agua potable.

En aquella época el Poddle formaba una laguna antes de desembocar en el Liffey. Esta laguna era accesible por barco desde el Liffey, así que los vikingos solían amarrar sus barcos allí, y por lo tanto construyeron la ciudad al lado de la laguna. Como podéis imaginar, esta laguna era la “laguna negra” que dio nombre a la ciudad de Dublín.

En la Edad Media, los normandos conquistaron Irlanda, construyeron el castillo de Dublín y fortificaron la ciudad. El río Poddle pasaba al sur y al este del castillo, y complementaba las fortificaciones.

Con el tiempo, el Poddle se hizo insuficiente para aportar el agua necesaria para la ciudad, la laguna dejó de utilizarse y con el tiempo fue modificada y después rellenada, la ciudad siguió creciendo, y, como hacía falta el espacio, a finales de la Edad Media canalizaron el Poddle por tuberías subterráneas para poder construir encima sin que estorbara. Desde entonces, según fue creciendo la ciudad, fueron cubriendo más y más tramos del Poddle.

Hoy en día, de la laguna negra sólo queda el nombre, y la desembocadura del Poddle sólo se puede ver cuando hay marea baja:

Desembocadura del Poddle.

Some nerd notes

  • The UNIX clock will soon reach 1234567890 seconds. That will happen on February 13th, 2009, at 23:31:30 UTC. Is anyone going to celebrate?

    The UNIX clock counts the number of seconds since January 1st, 1970, at 0:00 hours UTC. In 32-bit computers, the maximum date this clock can record is January 19th, 2038, at 3:14:07 UTC. In 64-bit computers, the maximum date is almost three hundred billion years in the future.

  • When we buy something in a supermarket, the cashier will wave the product in front of the barcode scanner without having to worry about its orientation. How can that gadget read an upside-down barcode and not get it wrong?

    Easy: the codes in a barcode make sense only when they are read in the correct direction, so it's just a matter of reading them in both directions at the same time and then use the code that could be deciphered.

  • Speaking about barcodes: in the modern mobile phones you can buy in Europe and the USA we can install QR-code scanning applications (of course, they have had them in Japan for years now). QR codes are two-dimensional codes that can contain text, Internet addresses, contact information, etc.

    QR code example.

    In Japan you can see QR codes in billboards, and people can visit the associated website by only taking a photo of the billboard with their phone. Another idea is to put a QR code in the back of a business card; in that way, its recipient can store the contact information in their mobile phone without having to type everything.

  • The first episode in the last season of Battlestar Galactica is aired today in the USA, and it will be aired next Tuesday in the UK and Ireland.

    Who will the fifth cylon be?