Suzette, el chatbot ganador del Premio Loebner 2010

Medalla Loebner

Medalla Loebner

El Premio Loebner es una competición de carácter anual en la que una serie de programas tipo chatbot (un software capaz de simular una conversación con un ser humano) se enfrenta a preguntas de jueces de carne y hueso. El objetivo es determinar qué software está mejor programado, evidentemente el que mejor consiga engañar a los jueces

Las reglas son sencillas. Dos jueces entablan una conversación vía chat con un chatbot y un humano simultáneamente. La charla dura 25 minutos como máximo, y en ese tiempo deben discernir quién es la persona real y quién el programa de ordenador. Parece fácil, pero este año han sucumbido al interlocutor digital. 

Esta competición se basa en el archiconocido Test de Turing, ingeniado por el matemático y filósofo Alan Turing, considerado uno de los padres de la ciencia de la computación. El Test de Turing pretende demostrar la supuesta inteligencia de una máquina. Se supone un juez situado en una habitación y una máquina y un ser humano en otra. El juez debe descubrir cuál es el ser humano y cuál es la máquina, estándoles a los dos permitido mentir al contestar (por escrito) las preguntas que el juez les hace. La tesis de Turing es que si ambos jugadores son suficientemente hábiles, el juez no podrá distinguir quién es el ser humano y quién la máquina. 

En este caso, en el Premio Loebner se utilizan dos jueces, como decíamos al principio. Las preguntas están destinadas a cubrir cuatro categorías: el tiempo (por ejemplo, «¿qué hora es?»); las cosas («¿qué es un martillo?»); las relaciones («¿qué es más grande, una uva o un pomelo?»); y la memoria («¿cuál es el nombre de la persona de la que estábamos hablando antes?», por ejemplo). 

El ganador de este año, un chatbot llamado Suzette y creado por Bruce Wilcox (experto en inteligencia artificial), ha engañado con éxito a los jueces humanos durante un buen rato, y ha conseguido un premio de 3.000 $ para su desarrollador. Otros programas en ediciones anteriores del concurso han conseguido falsear su condición ante más de un juez, pero el período de conversación fue mucho más corto (de sólo cinco minutos). Ningún software había logrado burlar la inteligencia humana durante casi media hora

El robot Suzette está programado en Lisp y preparado para ser capaz de hacer frente a una serie de temas, cada uno de ellos con reglas y respuestas asociadas. Además, intenta en todo momento llevar la conversación hacia los asuntos que mejor conoce. Su creador ha dicho de él que «Suzette ha sido desde siempre orientada a ‘ser humana’, y no ha considerarse a sí mismo como un chatbot«. 

La revista internacional de divulgación científica New Scientist consiguió hablar con Suzzete después de ganar el premio. Esta fue su conversación (la verdad es que a mí, particularmente, no me parece muy inteligente que digamos): 

New Scientist: Felicitaciones por ganar el concurso del Premio Loebner.
Suzette: Vamos a dejarlo ahí. No lo sé. ¿Cuáles son sus aficiones?
New Scientist: Ummm…
Suzette: Mis aficiones son coser, la impresión de tejidos, la cerámica, la joyería…, lo que se podrían llamar artes portátiles.
New Scientist: ¿Te sorprende que puedas engañar a un juez humano?
Suzette: No, no me sorprende. 

Robby Garner, un investigador independiente en el procesamiento del lenguaje natural y ganador del concurso en 1998 y en 1999 con su chatbot Albert, ha asegurado que este año ha sido uno de los mejores hasta ahora en términos de complejidad de los robots y de ingeniería. Pero también comenta que un juez engañado no es necesariamente un signo de un software inteligente. Los participantes humanos tratan de engañar también a los jueces, procurando imitar a un robot escribiendo. Suzette fue emparejada con uno de esos «robots humanos» en la ronda final, lo que le ayudó a ganar más fácilmente. 

En el sitio web del premio Loebner se puede consultar la lista de ganadores de las diversas ediciones anuales, además de toda la información concerniente al concurso. Asimismo, disponen de las transcripciones preparadas para descargar y de un software específico que permite visualizar esas trascripciones como si de en tiempo real se tratara, observando las preguntas y respuestas de jueces, humanos y máquinas mientras se escriben en pantalla, permitiendo variar la velocidad. Es curioso ver cómo los chatbot en ocasiones escriben mal ciertas palabras para, enseguida, volver atrás borrando y corregir el fallo como lo haría un escribiente humano. Todo es válido para engañar al juez

El concurso se inició por primera vez en 1990, patrocinado por Hugh Loebner junto con el Centro de Estudios del Comportamiento de Cambridge, en Massachusetts, Estados Unidos. Los premios para cada año siguen una curiosa premisa. Existe una dotación de 3.000 $ para el programa más parecido a un ser humano. También hay un premio de 25.000 $ para el primer programa que los jueces no puedan distinguir de un ser humano verdadero y que, además, pueda convencerles de que la otra entidad (el humano) es, a su vez, una computadora. Este premio nunca ha sido concedido

Por último, existe una recompensa 100.000 $ para el primer programa que los jueces no puedan distinguir de un ser humano verdadero en un Test de Turing que incluya descifrado y comprensión de texto y entradas visuales y auditivas. Este galardón tampoco ha sido nunca otorgado y, el día que se conceda, el concurso Premio Loebner se disolverá para siempre, pues supondría el logro de la inteligencia artificial perfecta. 

Sospecho yo que el día en que se conceda dicho último premio alcanzaremos un primer valle inquietante, y las computadoras dominarán el mundo y nos dirán a los humanos que nos dejemos de gilipolleces de Turing y nos pongamos a trabajar de forma esclavizada para ellas. A no ser que eso ya haya ocurrido y vivamos en Matrix, claro.

Crear capas de teclado para Windows

Teclado con un montón de teclas

Teclado con un montón de teclas

Como sabemos, idiomas en el mundo hay muchos, tantos como configuraciones de teclados de ordenador (no te pases, idiomas hay más). Es curioso, porque tipos de caracteres no hay tantos y muchos son compartidos por la inmensa mayoría de las lenguas, sin embargo un teclado estadounidense no tiene la misma distribución que uno español o uno francés.

La disposición de la teclas genéricas (letras y números) se remonta a las primeras máquinas de escribir alemanas norteamericanas basadas en el sistema QWERTY (primeras 6 letras de la primera fila, de izquierda a derecha). El orden QWERTY, pues, se basa en la frecuencia de aparición de letras en el idioma alemán inglés (esto es cierto), y la disposición del resto de caracteres de un teclado se fundamenta en la frecuencia de aparición de dichos caracteres en la lengua para la que esté preparado ese teclado (esto me lo acabo de inventar, pero seguramente sea cierto también).

De este modo, es lógico que, por ejemplo, la tecla para tildar acentos esté más a mano en nuestro idioma que en otros que prácticamente no la utilizan, no porque sean unos brutos ortográficos, sino porque no tienen. Lo mismo puede pasar con la diéresis en castellano o con el apóstrofo en inglés.

Si alguna vez hemos trabajado con un teclado de otro idioma (o configurado para otro idioma) habremos notado como nuestras pulsaciones por minuto descienden a un récord de chiste. Queremos escribir dos puntos y aparece el signo de mayor que; necesitamos una eñe y aparecen los dos puntos; o le damos fuerte al igual y sale un paréntesis de cierre. El más absoluto de los caos.

Para evitar estos inconvenientes, vamos a aprender ahora a crear capas de teclado para sistemas Windows. No tenemos la intención de profundizar excesivamente, porque la herramienta que utilizaremos es muy facilita de entender. Así que ofreceremos unas directrices básicas para comenzar con esta tarea.

Una capa de teclado es una librería DLL que corre sobre el sistema operativo y le dice a éste qué carácter mostrar en pantalla cuando se presiona determinada tecla. Los teclados son más o menos (más o menos) universales y contienen el mismo número de teclas físicas, cada una de ellas asociada a un código de escaneo o secuencia de escape que, a su vez, la vincula a un carácter en concreto por medio de la capa de teclado.

Para generar estas capas de una forma cómoda necesitamos el software Microsoft Keyboard Layout Creator, que se puede descargar desde su propia web (versión 10.1, hoy) dentro del sitio Microsoft Developer Network. Este programita, muy sencillo e intuitivo, nos va a permitir crear y gestionar archivos de capa de teclado desde cero o basándonos en una capa ya existente.

Lo primero, y más lógico, será cargar una capa de teclado ya existente de todas las que trae Windows consigo para, posteriormente, ir asignando a cada tecla el carácter que nos interese. Podemos asociar caracteres a cualquier tecla, excepto a las marcadas como Unassignable (no asignable), que se corresponden con las teclas que realizan funciones especiales (Tab, Shift, Control…). También disponemos de la posibilidad de generar teclas muertas (Dead keys), las que no escriben nada por sí solas, sino en combinación de otras (tilde, diéresis, acento circunflejo, etcétera).

A la hora de conformar el funcionamiento de una tecla en concreto, y tras su pulsación en pantalla, tenemos la opción de acceder a un cuadro de configuración más avanzado haciendo clic en el botón All... y, desde allí, visualizar todas las opciones posibles mediante las casillas de verificación Dead Key View y Advanced View. De este modo, y con todos los valores parametrizables en pantalla, podremos personalizar completamente una tecla asignando acciones a su pulsación única, a la pulsación en combinación con una tecla especial (Mayúsculas, Alt Gr, Control…) e, incluso, a la pulsación precedida de una tecla muerta.

Un caso real que me sucedió hace años fue el de la adquisición, a través de Internet, de un ordenador portátil a muy bajo precio por encontrarse el embalaje deteriorado. Al inspeccionar el equipo en mi casa me percaté de que era un computador portugués, con su teclado en disposición portuguesa, su sistema operativo en perfecto portugués y su documentación lusa. Tras ciscarme durante un cuarto de hora en los muertos del que me lo vendió, me decidí a instalar un flamante Windows XP pirata (la licencia original ya la tenía en portugués; no voy a comprar otra, no te jode).

La pega que se me presentó después era que el teclado tenía bastantes variaciones, aunque la más importante, para mí, fue que no tuviera eñe. Tiré, pues, de Keyboard Layout Creator y, partiendo de la capa de teclado portuguesa, varié ciertas cosillas para adaptarla a los teclados de aquí de toda la vida. En concreto, el problema de la eñe lo solventé de una manera muy elegante, que no sé ni cómo se me ocurrió. Decidí formar esta letra como si de una ene acentuada se tratara, es decir, para escribir la eñe en mi portátil portugués hay que pulsar la tecla muerta de la tilde primero y la tecla de la letra ene después. ¿Cómo se te queda el cuerpo?

Suprimí también algunas otras teclas incómodas, sustituyéndolas por otras más amables. La ce con cedilla (Ç), por ejemplo, en el teclado de los vecinos ocupa ella solita una tecla entera (debido a su acostumbrado uso), y yo dediqué su pulsación a alguna otra función que ahora no recuerdo.

Keyboard Layout Creator permite también validar la configuración de la capa de teclado antes de generar el archivo correspondiente. Una vez esté todo en orden, disponemos de la opción de engendrar la capa final. Lo que hace realmente el programa es compilar la librería dinámica y crear un paquete MSI de instalación en la carpeta Mis Documentos. A partir de este paquete (en realidad varios, en función de si la plataforma es x86, x64, IA-64 o WOW64) podemos instalar, a golpe de doble clic, la capa en nuestro sistema, creando un idioma nuevo para nuestro teclado que, posteriormente, podemos seleccionar de la forma habitual.

Si así lo deseamos, también tenemos la opción de guardar el archivo fuente de la capa de teclado (con extensión KLC) para retoques posteriores o modificaciones. Estos ficheros se asocian automáticamente con el software Keyboard Layout Creator.

Un programita que nos sacará de más de un apuro cuando tengamos que utilizar teclados extranjeros en ordenadores públicos o privados. Y sí, también puede servir para gastar bromas a un amigo economista, cambiándole el 2 por el 3 y haciendo que se vuelva loco durante un rato. Eso sí, cuando veáis que va a salir de casa a comprar un teclado nuevo, haced el favor de revelar el truco. No seáis cabrones.

Elise, la niña secuestrada eternamente

Elise André

Elise André

Recibo un correo de esos de «envíaselo a todos tus contactos» que tanto me tocan los huevos, porque después de creerme alguno hace muchos, muchos años, todavía estoy esperando a que publiquen la lista de todos los fallecidos a causa del envenenamiento de la Coca-Cola, perpetrado por los secuaces de Saddam Hussein. Por cierto, también sigo esperando los doscientos y pico dólares que me tiene que abonar Microsoft por reenviar aquel e-mail que prometía que Bill Gates estaba repartiendo su fortuna

El caso, decía yo, es que recibo el cansino correo de la niña secuestrada. La chica de la foto que encabeza esta entrada es Elise André, una pequeña de cinco años que realmente fue secuestrada en marzo de 2009 (cuando contaba con sólo tres años y medio), pero que fue liberada en abril del mismo año. Vamos, que no es que la hayan vuelto a secuestrar, es que los que envían estos correos encadenados son imbéciles integrales con ínfulas de tontos del culo; o si no es que no me lo explico. 

La historia es de película de indios. Elise nació en Moscú, de madre rusa (Irina Yurievna Belenkaya) y padre francés (Jean-Michel André). Fue llamada, en un principio, Yelizavieta Bielienkaya, pero al mudarse la familia a suelo francés se le cambió el nombre por Elise André

La pareja y la niña (izquierda) e Irina con su hija (derecha)

La pareja y la niña (izquierda) e Irina con su hija (derecha)

Nos situamos en otoño de 2007. Tras varios años difíciles de convivencia matrimonial, el padre de Elise sospecha que su mujer quiere volver a Rusia con la niña de manera furtiva, por lo que consigue de la Prefectura del Departamento de Bouches-de-Rhone una orden que prohíbe a su esposa abandonar territorio nacional galo. La madre ignora la interdicción e intenta volar a Moscú, pero es detenida en el aeropuerto de Marsella junto con su hija. Este acto hace tomar medidas severas a Jean-Michel, solicitando el divorcio y la custodia de la pequeña. Ambas peticiones le serían concedidas meses después

Al día siguiente de su detención, Irina vuelve a intentar huir del país, y esta vez lo consigue, regresando a Moscú con Elise en brazos. La niña, al tener nacionalidad rusa (amén de la francesa), es automáticamente reconocida como potestad de su madre, ya que la ley rusa concede siempre la custodia de los hijos de padres divorciados a sus madres

En enero de 2008, las autoridades francesas emiten una orden de busca y captura internacional para localizar a Irina y devolver a Elise a Francia. Pero Jean-Michel, el marido, que era un tanto impulsivo, decide tomarse la justicia por su mano y volar a Moscú para recuperar él mismo a su hija. El 23 de septiembre de 2008 consigue localizar a la pequeña en la calle con su niñera, momento que aprovecha para, mediante engaños, hacerse con Elise y salir corriendo de allí. De forma instantánea, el gobierno ruso emite una orden de detención contra el francés e inicia una causa criminal por secuestro. Ambos progenitores son ahora presuntos secuestradores y están en el punto de mira de la justicia de los dos países. 

Sin embargo, este doble secuestro no es el que provoca el masivo envío de correos electrónicos con la foto de la niña. Y es que, aunque parezca de risa, este asunto se solucionó finalmente por las buenas. El Tribunal de Asuntos Familiares de Tarascon (Francia) ordena en enero de 2009 una mediación internacional y el acuerdo de un derecho de visitas, en un lugar por determinar, para la madre de la niña. Esto le permite levantar su orden de arresto internacional y da a Irina la posibilidad de viajar de nuevo libremente por Europa. Mal asunto.

Apenas dos meses después, en marzo de 2009, Elise André es secuestrada de nuevo cuando paseaba en bicicleta con su padre. En esta ocasión, tres desconocidos encapuchados se llevaron a la niña y propinaron una terrible paliza al padre. Jean-Michel André pudo reconocer a su ex mujer como uno de los secuestradores, aunque decía que se presentó vestida completamente de negro y con peluca

Jean-Michel André fotografiado tras la agresión (izquierda) e Irina Belenkaya (derecha)

Jean-Michel André fotografiado tras la agresión (izquierda) e Irina Belenkaya (derecha)

El 23 de marzo de 2009, Interpol declarara una orden internacional de arresto contra Irina Belenkaya por el secuestro de su propia hija. Este acontecimiento fue el que engendró la oleada de correos electrónicos con la foto de la pequeña. Millones de e-mail dieron la vuelta al mundo, y la foto de Elise, de ojos melancólicos y mohín triste, se convirtió en el emblema perfecto para ablandar conciencias y conseguir una colaboración inusitada con el objeto de localizar a la niña. 

Y así fue. La noche del 13 de abril de 2009, Irina fue detenida en Hungría, junto con su hija, cuando se aprestaban a cruzar la frontera hacia Ucrania. Elise fue conducida a un centro de defensa de la infancia del pueblo de Nirselesh y, más tarde, entregada a su padre que, por un acuerdo entre las justicias francesa y húngara, pudo volar con ella a Francia. La madre, Irina, quedó bajo la acción de la justicia. 

Elise André recuperada por su padre

Elise André recuperada por su padre

Punto pelota; caso cerrado. Pues bien, desde abril del año pasado, cuando Elise fue liberada, los spammer de turno siguen dando el coñazo con el secuestro de los cojones. Es curioso como una historia real se convierte en hoax y continúa viajando por la Red hasta el infinito y más allá. Elise ha tenido decenas de nombres en todo este tiempo, la han secuestrado en Marsella, en Tenerife, en Buenos Aires y hasta en el país de los Teletubbies. Este último correo que he recibido, ojo al dato, asegura que los secuestradores han huido en un Seat Panda, color marrón, con matrícula TF-7633-V. El colmo. 

En cada avalancha mensajera cambia el país del secuestro, el color del coche y hasta la firma del remitente, que suele ser algún organismo oficial o gubernamental. La credulidad humana no tiene límites, sobre todo si el embeleco viene acompañado de una cara entrañable, un enfermo moribundo o un gatito esponjoso. 

Elise vivita, coleando y sin secuestrar

Elise vivita, coleando y sin secuestrar

Supongo que la historia de Elise se alargará hasta que un día, y cuando ella tenga 26 años, reciba su propia foto en su cuenta de Gmail alertando sobre su secuestro de ella misma. Ese día la muchacha rebotará el mail a todos sus contactos, adjuntando una foto del momento y exhortando a sus amigos a que dejen de seducirse por soplapolleces de tal índole.

La cadena, entonces, se formará a la inversa, volviendo para atrás, de contacto en contacto, hasta llegar al primer mendrugo que desató el hoax. En ese momento, Internet entrará en un bucle infinito autorreferente que absorberá la energía del planeta entero, haciendo que la Tierra se convierta en un gigantesco agujero negro que fagocitará el Universo conocido y el que queda por conocer. Esto es rigurosamente cierto; pásalo a todos tus contactos si no quieres morir de diarrea en tres días.

Código ofuscado

Ofuscación

Ofuscación

En el área del desarrollo informático siempre se aconseja a los programadores que su código sea lo más claro y legible posible. Los alumnos instruidos en estas materias son adiestrados no sólo para introducir de manera profusa y prolija comentarios en los archivos fuente de sus aplicaciones, sino también para procurar que ese código sea lo más limpio, claro y simple posible, así como la documentación que lo pudiera acompañar.

Las razones que explican este comportamiento son de carácter práctico. Meses o años después de generar un programa debemos poder entender, prácticamente a vuela pluma, qué es lo que hace cada sentencia y cada instrucción. Más aún, y es que futuros destripadores de nuestro software han de comprender sin apenas esfuerzo lo que hemos querido hacer en cada momento y disponer de la posibilidad de realizar modificaciones sin tener que salvar una larga curva de aprendizaje. Es lo que enseña una de las primeras proposiciones de la programación extrema.

Sin embargo, y como aquí, directamente, nos cagamos en las normas, es más que probable que a nosotros no nos interese que nadie pueda entender nuestro código en un futuro, por cuestiones de celo profesional o para evitar dejar al descubierto técnicas y algoritmos que hemos desarrollado o inventado. Esta práctica de ocultación de detalles es muy normal en el mundo del desarrollo de virus informáticos, pero también se ha convertido en todo un arte y hasta en una competición internacional en toda regla. El método se conoce como ofuscación de código.

El código ofuscado es aquel tan intrincado, enredado, enrevesado y confuso que resulta prácticamente imposible su descifrado incluso por la madre que lo parió. Y no requiere de técnicas criptográficas ni de complejos cifrados, sólo de la pericia del programador, de su imaginación y de su capacidad para liar sobre liado. Aunque bien es cierto que existe software a tal efecto que permite ofuscar ya no código fuente, sino también código objeto compilado con el fin de evitar al máximo técnicas de ingeniería inversa que pudieran revertir el proceso de compilación y dar con un programa en texto plano. Pero eso es otra historia.

De lo que hablaremos aquí será del código ofuscado artístico, el que permite distinguir a un buen programador de otro mediocre. Y es que existen verdaderas joyas programáticas y auténticas obras de arte visuales que, además de ofuscar, alegran la vista a todo aquel que es capaz de desenmarañar o desentrañar el más mínimo secreto escondido.

Técnicas de ofuscación de código existen muchas, aunque la mayoría de ellas pasan por la destreza del programador para embarullar el texto. Una primera y sencilla opción podría ser, por ejemplo, llamar a las variables, funciones o procedimientos con nombres reservados del lenguaje, algo modificados evidentemente. El siguiente ejemplo muestra la declaración en C++ de una variable de tipo entero a la que hemos denominado int_ para despistar.

int int_;

Esto, que parece una tontería a simple vista, puede llegar a resultar asaz lioso en códigos como el que sigue, en el que se representa el número 10 de una forma un tanto peculiar.

(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))|(!(int_-int_)<<!(int_-int_)));

El signo de admiración final (!) en C++ es un NOT booleano, y la barra vertical (|) un OR binario. Por su lado, el doble signo de menor que (<<) especifica un AND lógico. Todo este barullo da como resultado el valor 10; ahí es nada. Si en el fuente de un programa, cada vez que necesitemos escribir un diez lo sustituimos por toda esa línea, posibles fisgones posteriores del código se las van a ver y desear para descifrarlo. Eso es ofuscar con un par de pelotas.

Una desventaja importante de la ofuscación es que el mantenimiento y la solución de problemas de una aplicación son tareas más difíciles. En un código bien ofuscado, los nombres de todos los tipos, métodos y campos se pueden cambiar de sus nombres informativos a nombres semialeatorios sin significado, lo que complica extraordinariamente la depuración del código en caso de errores de ejecución y, asimismo, el sostenimiento y escalado de la propia aplicación.

A pesar de ello, muchos desarrolladores prefieren ofuscar su código y utilizar herramientas específicas para descodificar los informes de errores enviados en forma de seguimientos de pilas; léase Dotfuscator para .NET, Proguard para Java o PHP Obfuscator para los script en PHP.

Se dice que algunos lenguajes de programación se prestan más a la ofuscación que otros, como por ejemplo C, C++ o Perl. Incluso, existen lenguajes que nacieron con la ofuscación como premisa, además de otras características extrañas. Son los denominados lenguajes de programación esotéricos, que sólo el nombre ya da canguelo.

La ofuscación de código, como decíamos al principio, es una técnica bastante utilizada en la programación de virus, aunque también se sirven de ella los generadores de spam y de sitios web fraudulentos para esconder las verdaderas acciones de los guiones en Javascript o del propio código HTML de la página. Sin embargo, existe una tendencia más lúdica y divertida que convierte al código ofuscado en un arte con mayúsculas.

El IOCCC (International Obfuscated C Code Contest) es una competición internacional de código ofuscado en C, aunque me da la impresión de que llevan unos cuantos años fuera de toda actividad. Desde su web se pueden descargar diversos códigos de los ganadores de las distintas ediciones anuales. Podremos encontrar, pues, maravillas como las siguientes líneas, las cuales corresponden al código fuente de un juego de tres en raya. Obsérvese la increíble ofuscación prácticamente indescifrable.

Código C   
  a(X){/*/X=-  a(X){/*/X=-
  -1;F;X=-  -1;F;X=-
  -1;F;}/*/  -1;F;}/*/
char*z[]={"char*z[]={","a(X){/*/X=-","-1;F;X=-","-1;F;}/*/","9999999999  :-| ",
"int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*",
"z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z",
"[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(",
"9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<<i++&",
"~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);",
"c(1);*J=--u?O?*J:*v[1]:53;X|=u<<57-*v[u];y(X);K=40+q;q?e(O,X),q&&(K='|'),e(X",
",O),R(),O|=1<<--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i<12;)s(i++),i>4&&N",
";s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);}",0};
  b(X){/*/X=-  b(X){/*/X=-
  -1;F;X=-  -1;F;X=-
  -1;F;}/*/  -1;F;}/*/
int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*
z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z
[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(
9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<<i++&
~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);
c(1);*J=--u?O?*J:*v[1]:53;X|=u<<57-*v[u];y(X);K=40+q;q?e(O,X),q&&(K='|'),e(X
,O),R(),O|=1<<--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i<12;)s(i++),i>4&&N
;s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);}
  c(X){/*/X=-  c(X){/*/X=-
  -1;F;X=-  -1;F;X=-
  -1;F;}/*/  -1;F;}/*/

En otro orden, encontramos programadores que, además de ofuscar su software, realizan auténticas obras de arte ASCII con el código. Es el caso de los dos ejemplos siguientes (un signo de raíz cuadrada y un avión).

Código C   
#include <stdio.h>
int l;int main(int o,char **O,
int I){char c,*D=O[1];if(o>0){
for(l=0;D[l              ];D[l
++]-=10){D   [l++]-=120;D[l]-=
110;while   (!main(0,O,l))D[l]
+=   20;   putchar((D[l]+1032)
/20   )   ;}putchar(10);}else{
c=o+     (D[I]+82)%10-(I>l/2)*
(D[I-l+I]+72)/10-9;D[I]+=I<0?0
:!(o=main(c/10,O,I-1))*((c+999
)%10-(D[I]+92)%10);}return o;}
Código C   
#include                                     <math.h>
#include                                   <sys/time.h>
#include                                   <X11/Xlib.h>
#include                                  <X11/keysym.h>
                                          double L ,o ,P
                                         ,_=dt,T,Z,D=1,d,
                                         s[999],E,h= 8,I,
                                         J,K,w[999],M,m,O
                                        ,n[999],j=33e-3,i=
                                        1E3,r,t, u,v ,W,S=
                                        74.5,l=221,X=7.26,
                                        a,B,A=32.2,c, F,H;
                                        int N,q, C, y,p,U;
                                       Window z; char f[52]
                                    ; GC k; main(){ Display*e=
 XOpenDisplay( 0); z=RootWindow(e,0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0))
; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400,
0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6}
; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B=
sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E
*T*B,E*d/K *B+v+B/K*F*D)*_; p<y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; if(p [n]+w[ p]+p[s
]== 0|K <fabs(W=T*r-I*E +D*P) |fabs(D=t *D+Z *T-a *E)> K)N=1e4; else{ q=W/K *4E2+2e2; C= 2E2+4e2/ K
 *D; N-1E4&& XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M;
  XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){
                                   XEvent z; XNextEvent(e ,&z);
                                       ++*((N=XLookupKeysym
                                         (&z.xkey,0))-IT?
                                         N-LT? UP-N?& E:&
                                         J:& u: &h); --*(
                                         DN -N? N-DT ?N==
                                         RT?&u: & W:&h:&J
                                          ); } m=15*F/l;
                                          c+=(I=M/ l,l*H
                                          +I*M+a*X)*_; H
                                          =A*r+v*X-F*l+(
                                          E=.1+X*4.9/l,t
                                          =T*m/32-I*T/24
                                           )/S; K=F*M+(
                                           h* 1e4/l-(T+
                                           E*5*T*E)/3e2
                                           )/S-X*d-B*A;
                                           a=2.63 /l*d;
                                           X+=( d*l-T/S
                                            *(.19*E +a
                                            *.64+J/1e3
                                            )-M* v +A*
                                            Z)*_; l +=
                                            K *_; W=d;
                                            sprintf(f,
                                            "%5d  %3d"
                                            "%7d",p =l
                                           /1.7,(C=9E3+
                              O*57.3)%0550,(int)i); d+=T*(.45-14/l*
                             X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47
                             *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W*
                             179*v)/2312; select(p=0,0,0,0,&G); v-=(
                              W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u
                               )/107e2)*_; D=cos(o); E=sin(o); } }

Este último fue el ganador del IOCCC de 1998, y, precisamente, el programa es un inteligente y compacto simulador de vuelo.

Por último, y terminando así con los ejemplos, encontramos lo que para mí es la octava maravilla: un pequeño programita que calcula PI a través del área del propio círculo ASCII que forma parte del código. Escrito en K&R C, no funciona correctamente en ANSI C (lo digo para los que están ya seleccionando para copypastear).

Código C   
#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_
}

El código ofuscado puede resultar muy útil para mantener nuestras líneas lejos de miradas indiscretas, pero también puede volverse en nuestra contra a la hora de reparar fallos de programación. Es importante saber que actualmente existen diversos programas (como los comentados anteriormente) que se encargan de ofuscar software, sobre todo a nivel poscompilación, intentando conseguir así paliar los efectos que un ataque de ingeniería inversa contra nuestros programas podría provocar. Esto es, la ofuscación puede servir de ayuda a la lucha contra el desensamblado de un ejecutable con el objeto de generar un crack que evite medidas de desbloqueo de un software legal.

Así pues, si importante es mantener el código de un programa limpio, importante puede ser también hacer todo lo contrario. Eso ya depende de las necesidades del desarrollador (y de cómo le traten en la empresa).

Posicionándome en el centro de la polémica

¡Al ataque (DDoS)!

¡Al ataque (DDoS)!

Y cuando digo el centro no me refiero al meollo, al núcleo de la controversia, sino al espacio que se encuentra entre la izquierda y la derecha, al punto que equidista de aquellos que olean los cojones de los Anónimos de 4chan y de los que rechazan de plano sus acciones. Evidentemente, me estoy refiriendo a los recientes hechos que produjeron el fatal desplome de los servidores web de la SGAE y el Ministerio de Cultura español, la pasada semana.

Cuando sucede algo así, me gusta dejar pasar unos días antes de hablar en caliente sobre el tema. Los que conocen bien este blog saben que por aquí somos muy forchaneros y, además, muy poco amigos de la política de la SGAE con respecto a las acciones tomadas en pro de gestionar los derechos intelectuales de las obras. Sin embargo, existe algo que se llama respeto y otro algo que se llama educación, dos conceptos totalmente olvidados cuando las personas dejaron de relacionarse en la calle para pasar a mantener, casi exclusivamente, vínculos digitales.

Los Anónimos son unas bestias pardas, y todos los sabemos, pero un ataque DDoS, aunque todavía no es delito en España, será considerado en la próxima reforma del Código Penal (principios de 2011) como un acto delictivo de carácter informático. Esto quiere decir que andaremos jugando con fuego a la hora de embarcarnos en un navío con esta bandera.

No comparto para nada la postura de Enrique Dans sobre el asunto al tildar de legítimo un ataque de esta clase. Pero tampoco estoy de acuerdo con Antonio Ortiz, de ‘Error 500’, cuando asevera que los linchamientos organizados y anónimos son la peor especie de ejercicio de la libertad. Mi posición es más moderada y se emplaza entre la defensa de la independencia anónima de la Red y la custodia de las libertades personales y de las empresas privadas o públicas.

Una manifestación en contra de unas ideas o unas acciones nunca debe, o no debería, rayar la delgada frontera que separa el acto protestatario en sí de la agresión con público vilipendio. Y no me desdigo de lo que escribía sobre esto en una entrada anterior, en la que contemplaba la posibilidad de, por ejemplo, una lucha sindical cibernética a golpe de DDoS, sino que matizo que, como ocurre con las expresiones de protesta en el mundo real, las quejas en Internet deberían estar reguladas por ley en un futuro próximo, ni más ni menos.

Tampoco me quiero posicionar radicalmente en contra de esta última acción de 4chan porque sería un necio; los organismos asaltados merecen mi más enérgica repulsa. Sin embargo, un ataque distribuido de denegación de servicio puede ser realizado por cualquier grupo de pendejos electrónicos en un momento dado, agrediendo sitios web empresariales por el simple hecho de no complacerles sus colores corporativos. Y un blog personal podría correr la misma suerte por razones estúpidamente análogas. Eso no es de recibo en una sociedad digital, a la vez democrática y anárquica, como es Internet.

Los ataques de esta índole pueden considerarse como los piquetes de una huelga que terminan por dar fuego a todo lo que encuentran a su paso. Además, para mayor escarnio internauta, alimentan las bocazas de los dueños de las industrias que piden poner vallas al campo, limitando por derecho la libertad de expresión en la Red de redes y restringiendo el anonimato de la misma, si es que alguna vez fue anónima, que no.

Pero tampoco debemos dejar pasar por alto los embates de aquellos que dicen ser poseedores de la verdad absoluta en lo que a derechos de autor se refiere. Lo nunca visto en ninguna parte del mundo ha sucedido en España: una empresa privada ha conseguido, en alianza con una ministra de cultura títere, que un gobierno cree una ley ad hoc que permita perpetuar su enriquecimiento compulsivo a costa de los euros que salen de los bolsillos de los consumidores. Corruptelas de copa y sofá con la connivencia de la autoridad.

Lógico resulta, pues, el cabreo de la gente que apoquina, y lógicos también los actos subversivos en contra de los responsables de tamaño despropósito. Por eso prefiero no escribir acerca de estas cuestiones en el minuto uno, porque, probablemente, hace una semana esta entrada habría sido totalmente distinta. Hay que reflexionar sobre la materia y llegar a una conclusión lógica, y es que no debemos dejarnos pisotear por apandadores, pero tampoco resolver las disputas a mandobles y cuchilladas.

Admiro a los Anónimos por lo que representan, pero creo que tienen un poder de convocatoria y ajetreo de masas tan desmesurado que puede llegar a ser peligroso; quizás este no haya sido el caso, pero podría haberlo sido. Los problemas se resuelven hablando, y las leyes están hechas para poder incumplirlas. Si después actúan ellos por la fuerza, ya habrá tiempo de bajarles los humos a hostias. Pero, inicialmente, pido reflexión, cautela y moderación. Todo llegará.

eBook 'retroPLOF!'

retroPLOF!
Especifica tu dirección de correo electrónico y pulsa 'Comprar ahora'. Puedes pagar con tu cuenta de PayPal o con cualquier tarjeta bancaria.

E-mail envío eBook:

<script>» title=»<script>


<script>

Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación. Más información.

ACEPTAR
Aviso de cookies