Una manita de gato al clon de Tetris

[singlepic=610,60,,,left]

Al parecer el proyecto de los steering behaviors va para largo.

Por mientras, este fin de semana le daré una manita de gato a mi clon de Tetris, incluso le cambiaré el nombre y lo subiré a GitHub. Entre otras cosas quiero convertirlo en gema y separar el único archivo que contiene todas las clases en varios ficheros.

También traduciré los comentarios al inglés, y será el juego que mantendré de manera oficial.
El antiguo Metris se quedará en su artículo como un programa didáctico en español para quien lo quiera usar.

Comenzaré ahora mismo. 🙂

Actualización 2009-08-01 03:29am

La refactorización va viento en popa, también ya casi termino la traducción al inglés y la separación en varios archivos. 😀

De paso modifiqué el algoritmo que obtenía los colores al azar de las piezas — ¡ya no más piezas oscuras que apenas se ven en el tablero ni piezas con colores desabridos!

¡Ah! y ya tengo el nuevo nombre… jojojo. 😀

goedkope energie

Optimizando operaciones sobre vectores en Ruby con memoization

[singlepic=484,60,,,left]

Ahora que estaba haciendo el clon del Missile Commander, me dieron ganas de implementar un movimiento más realista en los misiles.

En lugar de que simplemente tuvieran una velocidad lineal desde que salen hasta que explotan al llegar a su destino, quería que aceleraran a la hora de hacer su despegue.

Recordé que tengo un muy buen libro que habla sobre steering behaviors (comportamientos de dirección), y decidí implementarlos en Ruby.

Los steering behaviors usan mucha matemática de vectores, así que me puse a desarrollar una pequeña clase para realizar un par de cálculos comunes: longitud y normalización — conforme las necesite, le iré agregando otras operaciones útiles.

La clase Vector2d

Esta es la clasecita que me ayudará a darle vida a un sinnúmero de entidades virtuales en mis futuros proyectos. 🙂

  1. require 'benchmark'
  2.  
  3. class Vector2d
  4.   attr_reader :x, :y
  5.  
  6.   def initialize(x=0,y=0)
  7.     clear_length
  8.     @x = x
  9.     @y = y
  10.   end
  11.  
  12.   def clear_length
  13.     @length = nil
  14.     @length_sq = nil
  15.   end
  16.  
  17.   def length
  18.     Math.sqrt(length_sq)
  19.   end
  20.  
  21.   def sub_memoized_length
  22.     Math.sqrt(memoized_length_sq)
  23.   end
  24.  
  25.   def memoized_length
  26.     @length ||= Math.sqrt(length_sq)
  27.   end
  28.  
  29.   def length_sq
  30.     @x*@x + @y*@y
  31.   end
  32.  
  33.   def memoized_length_sq
  34.     @length_sq ||= @x*@x + @y*@y
  35.   end
  36.  
  37.   def normalize
  38.     Vector2d.new(@x/length, @y/length)
  39.   end
  40.  
  41.   def normalize!
  42.     @x = @x/length
  43.     @y = @y/length
  44.     clear_length
  45.     self
  46.   end
  47.  
  48.   def x=(x)
  49.     clear_length
  50.     @x = x
  51.   end
  52.  
  53.   def y=(y)
  54.     clear_length
  55.     @y = y
  56.   end
  57. end
  58.  
  59. Benchmark.bm do |x|
  60.   a = Vector2d.new(23,45)
  61.  
  62.   x.report do
  63.     1.upto(1000000) do
  64.       a.length
  65.     end
  66.   end
  67.  
  68.   x.report do
  69.     1.upto(1000000) do
  70.       a.sub_memoized_length
  71.     end
  72.   end
  73.  
  74.   x.report do
  75.     1.upto(1000000) do
  76.       a.memoized_length
  77.     end
  78.   end
  79. end

Conforme la programaba se me ocurrió hacer unas optimizaciones, lo que dio como resultado los métodos que incluyen la palabra memoized en su nombre.

Hice unas benchmarks (pruebas de tiempo) —¡mi primer benchmark en Ruby! :D— para medir que tanto afectaban mis supuestas optimizaciones, y esto fue lo que descubrí:

  1. -*- mode: compilation; default-directory: "~/development/gamedev/steering/" -*-
  2. Compilation started at Wed Jul 29 23:52:19
  3.  
  4. /usr/bin/ruby -w /home/lobo/development/gamedev/steering/vehicle.rb 
  5.       user     system      total        real
  6.   1.460000   0.000000   1.460000 (  1.480273)
  7.   1.310000   0.000000   1.310000 (  1.352205)
  8.   0.270000   0.000000   0.270000 (  0.276391)
  9.  
  10. Compilation finished at Wed Jul 29 23:52:22

Una breve explicación

La prueba consistió en calcular la longitud de un vector determinado, un millón de veces.

La técnica de optimización usada se llama: Memoization.

En computación, memoization es una técnica de optimización que se usa principalmente para incrementar la velocidad de los programas de computadora al evitar que las llamadas repetidas a una función recalculen los resultados de entradas previamente procesadas.

El primer método medido:

  1.   def length
  2.     Math.sqrt(length_sq)
  3.   end

Calcula calcula la raíz cuadrada cada vez que es llamado, además calcula la suma de los cuadrados de X y Y.
Tarda: 1.480273 segundos

El segundo método:

  1.   def sub_memoized_length
  2.     Math.sqrt(memoized_length_sq)
  3.   end

Se ahorra el cálculo de los cuadrados de X y Y al guardar en una variable de instancia el cálculo realizado previamente.
Tarda: 1.352205 segundos

El tercer método:

  1.   def memoized_length
  2.     @length ||= Math.sqrt(length_sq)
  3.   end

Se ahorra el cálculo de la raíz cuadrada mientras X y Y no cambien.
Tarda: 0.276391 segundos

¿Qué tal? 🙂

En los juegos es necesario hacer todas las optimizaciones posibles, ya que las operaciones se están realizando una y otra vez en cada ciclo del game loop.

Creo que estás me vendrán muy bien. 😀

P.D. Estas pruebas fueron hechas con Ruby 1.9.

Torchwood — Children of Earth

[singlepic=673,220,,,left]

Hace un par de días vi los primeros dos episodios de una historia que es contada en cinco partes.

(Nunca antes había visto un episodio de Doctor Who o de Torchwood, pero después de leer un par de reseñas en la red me entró la curiosidad y me dispuse a conseguir una versión de evaluación de la mentada tercer temporada.)

Así, ayer llegando del SHDH comencé a ver el número tres. Había estado resistiéndome a aventarme el acostumbrado maratón-de-serie-nueva, viendo sólo un episodio al día, pero después de ver el tercero no pude más —literalmente.

Y quiero que sepan que estaba rendido, sumamente agotado, anduve en el SHDH desde pasaditas las 10am. El caso es que después del 3, me seguí con el 4, y como la serie iba tan bien que me echo el 5 al plato de una vez. A final de cuentas terminé durmiéndome cerca de las 3am jejeje. 🙂

Todos los actores tienen actuaciones estupendas, la trama esta literalmente de no mames y el final… el final… VÉANLA.

Torchwood: Children of Earth tiene sus partes cómicas y sus partes oscuras, muy oscuras. Después de ver el final, me fui a dormir con todo tipo de emociones fluyendo dentro de mí.

No es perfecta, pero creo que es de lo mejor que he visto en series de ciencia ficción. Los primeros cuatro episodios contribuyen muy bien a aumentar la tensión, y cuando ésta es finalmente liberada en el quinto, es abrumador.

Alan Moore: 25,000 años de libertad erótica

[singlepic=672,150,,,left]

Alan Moore es un conocido escritor, autor de varios cómics (historietas), entre ellos: From Hell, The League of Extraordinary Gentlemen y más recientemente: Watchmen.

El tema de este artículo es para comentarles que está por lanzar en Octubre, un libro titulado: 25,000 Years of Erotic Freedom.

Se ve que la obra va a estar magnífica, y siendo el señor Moore, no podría esperar menos, sólo lean lo que viene a continuación:

Con cada avance tecnológico, la pornografía ha proliferado y se ha degradado en calidad. Hoy, la encuentras por doquier, ¿pero dónde está el arte? 25,000 Years of Erotic Freedom recorre la historia de la pornografía y argumenta que el éxito y la vitalidad de una sociedad está íntimamente ligada con su permisividad en cuestiones sexuales.

Esta historia del arte erótico nos trae algunas de las ilustraciones más provocativas jamás publicadas, mostrándonos la evolución de la pornografía en diversas culturas desde la era prehistórica hasta los tiempos modernos. Comenzando con la Venus de Willendorf, creada entre 24,000 – 22,000 aec (antes de la era común), y terminando con fotografías contemporáneas, también contiene una línea de tiempo que cubre los trabajos eróticos más grandes en varias culturas. 25,000 Years of Erotic Freedom captura hábilmente la antigua e irreprimible creatividad del espíritu sexual, haciendo de este libro un tratado sobre el arte erótico.

Moore dice:

Las culturas sexualmente progresivas nos dieron la literatura, la filosofía, la civilización y muchas otras cosas más, mientras que las culturas sexualmente restrictivas nos dieron el Oscurantismo y el Holocausto.

Hmm, interesante lo que comenta Alan Moore, ¿no lo creen?

Definitivamente un libro que estará en mi colección.

Depredado en

Alan Moore: 25,000 Years of Erotic Freedom

Twitter Tools para WordPress

[singlepic=671,220,,,left]

Después de probar un par de plugins para WordPress que no me funcionaron, me encontré con Twitter Tools.

Recién me sumo a la ola de twitteros y este plugin me ayudará a integrar mi blog con mi cuenta de Twitter sin dolor. 🙂

Para los que no saben, Twitter es un servicio web en el que lo único que tienes que hacer es contestar a la pregunta:

¿Qué estás haciendo?

Si quieren seguirme, aquí está mi Twitter: lobo_tuerto

SHDH9 — SuperSizedNerdCore Edition

[singlepic=670,120,,,left]

¿Tienes una mente inquieta, te encanta programar y aprender por el sólo gusto de hacerlo? ¿Te apasiona la tecnología y conocer como funcionan las cosas?

¿Si? También a mí.

Siempre me pregunté si no existiría un lugar donde se reuniera gente afín a mi. Gente curiosa respecto a la tecnología, código, cables y arte. Hackers, geeks y nerds que pusieran sus conocimientos en acción.

Ser un lobo solitario es bueno, pero nada como andar y sentirse en manada. Se aprende más rápido si tienes una fuente dispuesta de donde aprender. Y que mejor si puedes compartir y enseñar también.

Zed Shaw ilustró muy bien en un ensayo lo que sería el lugar ideal para ir a pasar mis fines de semana. Hmph, y recién me entero de que hay algo que se le parece mucho, aquí, ¡en México! 😀

Esta es la página del evento: SHDH 9 – SuperSizedNerdcore Edition (Sábado 25 de Julio de 10am a 10pm). En la wiki pueden consultar las personas que asistirán y leer sobre lo que planean hacer este día.

Realmente lamento no haber podido publicar esto con tiempo, apenas ayer en la noche (muy noche) me enteré de ello. Pero, según leí, se realiza cada seis semanas, y ahí me tendrán. 🙂

En concreto, el SHDH es un evento en el que varias personas se reúnen para desarrollar sus proyectos personales, compartir conocimiento, evangelizar nuevas tecnologías y en general para pasársela bien en compañía de otros geeks.

Si extrañabas un lugar como este, pues bienvenido a casa. 😉

P.D. Por cierto, le doy las gracias a mi buen ex-compañero de la ESCOM Nation84 por pasarme el dato.