@ agnasg

agnasg


… hasta la eternidad termina: Duke Nukem Forever!!

29-12-2010 4:30 AM

Finalmente Duke Nuken Forever está disponible en Amazon para pre-orden (y GameStop). He estado hablando de este juego desde hace años, y se ha convertido en un chiste todo lo que ha pasado desde que fue anunciado el 27 de abril de 1997. Ya veremos si valió la pena toda la espera…

“Traté con Java pero lo encontré increiblemente aburrido”

16-12-2010 10:06 AM

El Desafio de Inteligencia Artificial de Google es un concurso de programación y teoría de juegos que teminó recientemente (a principios de diciembre). El desafio consiste en diseñar un bot que pueda jugar con éxito un juego llamado Planetwar. En un mapa generado aleatoriamente, los dos jugadores comienzan con un planeta y 100 naves, la meta es acumular o mantener la mayoría de las naves luego de 200 turnos (cada turno dura 1 segundo ). El ganador fue Gábor Melis con su bot bocsimacko escrito en lisp. Planetwar es basado en Galcon, un juego disponible en flash, iphone y otras plataformas. Al ser consultado sobre por qué Lisp, Gábor Melis contestó: “Traté con Java pero lo encontré increiblemente aburrido”. Interesante forma de decirlo, o, quizás, otra forma sería “Lisp es más divertido”.

Para ilustrar esto, voy a poner como ejemplo una rutina que estaba estudiando anoche. Se trata de una función que invierte una lista. Es decir, dada una lista del tipo (1 2 3 4) la rutina debe devolver (4 3 2 1).  Y esta rutina la necesito porque quiero programar una rutina que me permita multiplicar dos vectores.

A continuación la rutina para invertir una lista (que se puede ver aqui):

(defun REV (L)
(cond
((null L) NIL)
(T (CAT (REV (cdr L)) (list (car L))))
)
)

La función CAT se supone que debe concatenar dos listas, y el autor propone una implementación. Innecesaria porque Lisp dispone de una función que concatena dos listas, se llama append. Anyway, esa rutina se lee de la siguiente forma: si la lista L está vacia se debe retornar NIL, sino está vacía se debe retornar la concatenación de la lista L sin el primer elemento ejecutada recursivamente por REV más una lista formada solamente por el primer elemento de L. cdr devuelve la lista que pasamos como argumento pero sin el primer elemento y car devuelve el primer elemento de la lista.

La ejecución es algo como lo siguiente: REV (1 2 3 4) se traduce en REV (2 3 4)  concatenado con (1). Es decir, el resultado va a ser algo concatenado con la lista (1). Luego REV (2 3 4) se traduce en REV (3 4) concatenado con (2) que a su vez está concatenado con la lista que conseguimos en la última llamada es decir (1). Hasta este momento tenemos  (2 1). REV (3 4) se traduce en REV (4) concatenado con (3) concatenado con (2 1) y la última llamada nos devuelve (4) lo que nos genera la solución final (4 3 2 1). ¿Divertido verdad?

Un bug y Murphy juntos

06-12-2010 6:33 AM

Son una combinación letal. Este segmento de programa tiene una falla (un bug) que me hizo perder 16 horas de procesamiento (todo el fin de semana). La ley de Murphy en su esplendor:

$buscar = "texto";
$data = "este texto contiene la palabra que estoy buscando";
if (strpos($data, "contiene") !== false &&
strpos($data, "texto" !== false)) {
echo "Lo encontre";
} else {
echo "No lo encuentro";
}

Este segmento de programa PHP produce la siguiente salida:

No lo encuentro

Estuve 10 minutos tratando de descubrir por qué. La razón de que este es un bug invisible tiene que ver con el sistema de reconocimiento de patrones de nuestro cerebro: si algo incorrecto está en un sitio correcto, entonces nuestro cerebro concluye que debe estar bien. Eso, y además que PHP es un lenguaje interpretado y no nos advierte sobre las cosas sin sentido que estamos haciendo.

es Javascript

24-11-2010 5:09 PM

Nunca lo he mencionado aqui, no por alguna razón particular sino que tampoco soy muy como Nietzsche, que solía decir lo que le gustaba y no le gustaba hasta las nimiedades más insignificantes (el chocolate no es conveniente por la mañana). A mi  no me gusta flash, estuve probando actionscript hace un par de años y decidí que probablemente nunca voy a desarrollar en él. La principal razón es porque es un producto propietario, y no es que eso per sé sea malo, el problema con eso es que en algún oscuro sótano en el centro de adobe o en las oficinas de Papaltime se toman decisiones basadas en conveniencias de negocio que no necesariamente me convienen a mi como programador. Yo vivo en mi mundo idílico de Naboo, contemplando las cataratas y retozando en las praderas verdes y no quiero estar envuelto en conflictos programáticos por algo que una federación decida basado en circunstancias que me son tan lejanas como lo puede ser un neutrino de un pulsar.

Así que en lo que se refiere a programación en el navegador prefiero javascript, php, javascript y javascript. Ah, por cierto, también javascript. Elegante, seguro, bien diseñado, confiable, parecido a mi lenguaje preferido (C), y además, por si todo eso fuera poco,  es javascript.

Estoy programando un pequeño juego de piezas (tiles)(como dominó,  parecido a Mahjong, pero es como esos juegos en que el objetivo es cambiar la configuración de las piezas y ponerlas en orden, algo asi como Tangram, o más parecido a Sokoban. pero diferente porque este juego es basado en una misma y recurrente idea nivel tras nivel).

Como si fuera poco jquery facilita la vida enormemente. Es una librería que provee funciones para animación, efectos especiales, y con el soporte de funciona ajax permite la actualización de la página sin que se tenga que refrescar (usando XMLHttpRequest).

Finalmante al buscar javascript  en google aparecen todas las respuestas así que el apoyo es ilimitado.