@ agnasg

agnasg


Una recomendación para el desarrollo de juegos

16-10-2018 6:09 AM

Estaba leyendo estas recomendaciones de Niko para el desarrollo de juegos, y me llamó la atención en particular la última “No vas a tener éxito” porque siempre es bueno que hagamos un reality check sobre lo que hacemos, y también, meditemos sobre por qué las cosas no salen como deberían salir. No me refiero a las cosas fortuitas y fuera de nuestro control, como cambios en Steam que pueden afectar el éxito de nuestro juego, o desinterés del público.

Ciertamente hay que colocar nuestras expectativas en lugar correcto (“No vas a tener éxito” es algo exagerado pero debe estar dentro nuestras 5 primeras estimaciones). Ese sería el punto número uno. El punto número dos sería revisar qué cosas están afectando nuestro éxito, o qué cosas lo pueden afectar. No es fácil hacerse un examen de conciencia y determinar las fallas en nuestro comportamiento, pero si se pueden determinar malos hábitos que son susceptibles de ser corregidos. En mi caso estoy viendo en qué cosas pierdo tiempo al programar, y la lista es grande. Pero resalta algo que puede ser resuelto “fácilmente”, lo he identificado muchas veces y sin embargo sigue ahí, generando problemas y pérdida de tiempo: me refiero a no documentar correctamente y extensivamente el código que escribo.

Es real: yo pierdo minutos u horas trabajando cosas que ya he implementado, o utilizando incorrectamente una función porque la documentación no sirve. Pero el peor caso es la documentación arcana:

[code]
// the regeneration should take care of this
if (!g_planets[pl_idx].ships[i].captured) {
// if it has not been captured, it’s already created –>
// we don’t need to do anything here
continue;
}
[/code]

Cuál es el impacto de este código es algo que no se puede saber leyendo esos dos comentarios. El primero no explica nada: la regeneración se refiere a la regeneración de las naves, pero no dice qué es lo que debe ser atendido, cómo, ni cuando. El segundo es peor, la nave existe, no ha sido capturada, así que no tenemos que hacer nada, se supone que la nave está disponible y visible. Es decir, solamente cuando una nave es capturada debe ser regenerada, o re-inicializada si se quiere. Luego de analizar el código un buen rato podemos deducir lo que hace, o lo que no tiene que hacer. La idea es que los comentarios clarifiquen contexto, el para qué y el por qué ya que el cómo está más o menos visible. En resumen, cuando estoy estoy contra reloj tratando de hacer funcionar un feature, o corregir un bug, lo menos que deseo es encontrarme en mi camino una misteriosa función que se supone que hace algo relacionado con lo que estoy tratando de resolver y solamente tiene un mensaje ufano, risible, inútil: “Esta función hace lo que decidí que hiciera… y lo hace muy bien”. Se cansa uno.

Sí, tenemos que hacer respaldo de nuestros bookmarks, de nuevo.

28-09-2018 5:00 AM

Yo me había olvidado de hacer respaldos de mis bookmarks desde este nuevo sistema que tiene google. Al registrarte en el navegador chrome, todos tus bookmarks (favoritos) son guardados. En cualquier dispositivo en que te identifiques tendrás tus bookmarks disponibles.

Ups.

Al parece los genios de google decidieron hacer unos cambios, que todavía nadie entiende. Al parecer ahora no haces login en google, sino en chrome. ¿Qué significa eso? Al parecer nada, es lo mismo pero es diferente al mismo tiempo. La idea es que, entre otras cosas, la experiencia entre trabajar en tu laptop, tu desktop y tu celular sea más cómoda.

El problema es que con estos cambios los problemas pasan. En mi caso, los últimos 3 meses de bookmarks se perdieron. ¿Cómo es posible eso? Ni idea. Hay un procedimiento para recuperarlos, pero al menos en mi caso ya estaba arruinado. Al parecer voy a tener que hacer respaldo de nuevo de mis bookmarks, ya ni en google se puede confiar.

Aventuras

14-09-2018 4:09 PM

No, no se trata de juegos, o ficción interactiva, sino de las aventuras que enfrentamos los programadores en nuestro días a día. Este sitio web micronosis.com ahora está alojado en linode en un servidor con Ubuntu. Toda la configuración la hice a mano con las guías de linode y las guías que se pueden conseguir en internet. Todo es relativamente fácil, incluyendo instalar ubuntu, apache, php, mysql, wordpress, el certificado SSL, las configuraciones de los archivos /etc/hosts, /etc/passwd, /etc/apache2/sites-available/* etc, etc. Pero hay cosas que dentro de un ambiente con cpanel y bluehost (mi anterior proveedor de hosting) son automáticas y aquí no.

Luego de traer los archivos del sitio, configurar la base de datos, y los datos en el apache todo debería funcionar, pero no necesariamente las cosas son así de fáciles. Mi archivo functions.php en el tema de este sitio debe tener como 7 años de antigüedad, funciona bien en PHP 5.4 pero no en PHP 7.0 la versión por defecto en linode. Tuve que pensar durante 10 minutos 15 minutos 20 minutos que podía ser hasta que encontré un “<?” que era la secuencia antigua para indicar en el código fuente dónde comienzan las instrucciones de php (debe ser reemplazado por “<?php”).

El segundo problema fue más grave, los permalinks. WordPress permite enlaces amigables, de forma que este post puede ser accedido a través del enlace https://www.micronosis.com/aventuras/ y no por el enlace críptico https://www.micronosis.com/?p=1234. El problema es que para que  https://www.micronosis.com/aventuras/ funcione se debe configurar correctamente .htaccess, y los archivos correspondientes de apache, si es que sabes cuáles son. Después de revisar 27182818284 archivos, encontré en algún recóndito sitio en internet que resulta ser que ups, la configuración en /etc/apache2/apache2.conf ignora cualquier cosa que coloques en el .htaccess local. Ups. Eso no aparece en ninguna parte. Ups. La sección <Directory /var/www/> debe incluir un AllowOverride All (no un AllowOverride None que es como viene por defecto). Ups.

Otra aventura, esta vez con Qt,  sin un final feliz

Qt. A mi me gusta en realidad esta plataforma para GUIs. De hecho la uso para todas mis aplicaciones desktop. Dicen que sirve para android también la verdad no la he usado porque no me gusta mobile.

Con Qt puedes hacer un browser porque tiene una integración con chomium bien interesante. El problema es que por defecto no tiene los codecs  MSE, AAC, MP3, H.264. Ahí comienzan los problemas. El procedimiento para generar una versión que permita soportar estos codecs es el siguiente:

1) vim C:\qt-5.11.1\qtbase\mkspecs\common\msvc-version
2) Uncomment 2 lines
QMAKE_CXXFLAGS_CXX14 = -std:c++14
QMAKE_CXXFLAGS_CXX1Z = -std:c++latest
3) Open Developer Command prompt in the Visual Studio 2017 Menu
4) cd c:\qt-5.11.1-build
5) c:\qt-5.11.1\qtbase\configure -debug-and-release -opensource -confirm-license -platform win32-msvc -opengl desktop -prefix c:\qt-5.11.1-build -no-compile-examples -nomake tests -nomake examples -no-accessibility -icu -openssl -L C:\ssl\openssl\lib -L C:\icu\lib
6) nmake
7) nmake install
8) mkdir qtwebengine <- en caso de que no exista
9) cd qtwebengine
10) qmake C:\qt-5.11.1\qtwebengine\qtwebengine.pro — -webengine-proprietary-codecs

Esto genera este error:

tools\gn\gn_main.obj : fatal error LNK1112: module machine type ‘x86’ conflicts with target machine type ‘x64’

Aquí está reportado como bug: https://bugreports.qt.io/browse/QTBUG-68462?attachmentViewMode=list

Al final se indica que se debe ejecutar:

“C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat” -arch=x86

Eso no funciona, de hecho creo que eso es lo que hace el paso 3 arriba.

Esto no es un final feliz.

PS: acabo de ver esta película, Sky High (en español academia de Superheroes). Comienza algo gafa pero después se compone. Y me alegró bastante. Y por si fuera poco ahí trabajan Mary Elizabeth Winstead y Danielle Panabaker. Por favó!

Enlaces de agosto

31-08-2018 5:49 AM
  • Es desafortunado todo este cuento de James Gunn, el director de Guardianes de la Galaxia, quien fue despedido por Disney debido a unos tweets ofensivos que escribió hace 10 años. Algunos actores de la película, y algunos cómicos (de stand up) han salido a defenderlo, o a defender lo indefendible, aduciendo que al fin y al cabo, son chistes malos, provocativos, estúpidos, pero chistes al fin. Hace 10 años era gracioso hacer chistes de penes, ¿ok? era gracioso. Ahora no lo es, los supuestos violadores tienen una lluvia de acusaciones encima, Bing Cosby,  Louis C.K., Kevin Spacey, Harvey Weinstein, justificado o no, el tema está candente, la sensibilidad está a flor de piel, así que hay una cacería de violadores, y nadie se escapa. No tengo los hechos tan claros, y no puedo emitir veredictos, pero despedir a alguien por unos chistes malos sobre penes. No sé. Me parece como mucho. Iniciar una investigación como menciona Gevlon, eso está claro, pero despedirlo sin que una conducta realmente criminal sea constatada, ups, es como mucho. Yo iba a colocar este video de Kang Yoon Kyung (Ruru) bailando de una forma sensual, y mencionar lo bien que hace los movimientos de las muñequitas de anime en su danza, y que ese video me llena de energía positiva, pero mejor no, no quiero que dentro de 10 años me acusen de pedófilo. Se cansa uno.
  • Parece que la BBC, la empresa detrás del afamado show Dr. Who quiere descubrir quién fue el que publicó algunas escenas robadas del último capítulo de la serie, que tiene la novedad de presentar un Dr. Who mujer. Esta investigación incluye actuaciones en USA solicitando la colaboración de Microsoft. ¿El detalle? El video es de la temporada 11, Episodio 1. ¿Temporada 11? ¿Cómo es que una serie que comenzó en 1963, hace 55 años va por la temporada 11? ¡Yo veía esa serie cuando tenía 7 años! Pero no, son 37 temporadas, lo que pasa es que hubo un reset del conteo después de una interrupción de 1989 hasta 2005. Me pregunto cuál fue el razonamiento detrás de esa decisión de hacer un reset en el conteo.
  • Una de mis motivaciones para escribir un compilador fue para que mi juego EMPIRE corriera más rápido” – (“One of my motivations for writing a compiler was to get my game Empire to run faster“) Walter Bright. Comentario del creador del excelente juego EMPIRE en un hilo en hackernews (Empire era el juego que los nerds de la PDP-11/45 en la USB jugábamos hasta altas horas de la noche alrededor de 1982). Pertinente sobre el tema de los programadores de juegos que en vez de escribir juegos terminan trabajando en herramientas para hacer juegos. Em, em., uhm, uhm. El sitio de Walter Bright. Wikipedia sobre Walter Bright. El artículo original en hackernews. La página con las características de Leaf (tuve que hacer unos cuantos clicks para llegar a ella). Wikipedia sobre Empire.
  • Tú no eres un jugador. Solamente una pieza en el juego de otro” (“You are not a player. Just a piece in someone else’s game”). Lapidaria sentencia de Gevlon sobre los últimos acontecimientos de Azeroth, la ira de Sylvana, la oposición de Delaryn, la quema del árbol del mundo, la incomprensible destrucción de Teldrasil, y otras peripecias, incluyendo la protesta generalizada de los jugadores de que esto no tiene sentido. Sí. No tiene sentido porque son las ideas de algún escritor subpagado de Blizzard. O quizás de un escritor altamente competente que se quedó sin ideas. Si a eso se le pueden llamar ideas. En otro orden de cosas todavía no he decidido cuando voy a volver, dado que pagué la expansión y tengo suficientes tokens para jugar unos cuantos meses. He entrado y salido del juego sin hacer el login unas 50 veces. En lo que estoy a punto de entrar cierro la aplicación. La gente de Blizzard debe estar preguntándose qué me pasa.
  • Leyendo este artículo sobre unit testing (preparar pruebas para tu código) descubrí que hay unas cosas llamadas funciones impuras,  es decir, funciones cuyo resultado puede variar aun cuando los parámetros son los mismos (funciones que tienen llamadas internas a bases de datos, llamadas a random (), etc). En programación web eso parece ser común. El problema  con las funciones impuras es que son difíciles de probar y predecir su resultado. Me puse a ver de reojo el código de khpx (mi proyecto actual) y no encontré nada que pueda entrar dentro de esa categoría: yo tengo una función getField (npcs_id) que retorna la data de un npc, pero siempre que el argumento es 1 devuelve lo mismo, y tengo otra función getRandom (x,y) y siempre retorna un valor random (o semi aleatorio) en el rango [x,y]. El mejor enlace que encontré sobre funciones impuras es en relación a java, así que supongo es “algo” sensible en ese submundo (lo cual no me sorprende). Por cierto, en el mencionado artículo sobre unit testing aparecen descritas técnicas que en mi opinión le sumarían un 30%-40% más tiempo a mis proyectos, en general. Claro que trato de escribir funciones más cortas, más específicas, y que los objetos sean inmutables (rara vez). Pero más allá de eso… está difícil.
  • Yo soy escritor. Yo puedo escribir una oración, un párrafo, 2000 palabras, un cuento de 15k palabras, y quizás más. Nunca he publicado nada, pero eso tiene que ver con otra cosa.  El escritor es el que escribe, no el que publica. Así que siempre que veo algo sobre escritura, cómo escribir, consejos sobre escritura, los veo/los leo de inmediato. Aquí está Henry Rollins hablando sobre escribir. Interesante, válido, etc. Pero lo que me llama la atención, lo que me alarmó inmediatamente, es que dice que no importa que seas el capitán del equipo de futbol, o seas un loser (un perdedor), tú puedes escribir. Lo que me alarma es que según él, ser capitán del equipo de futbol es lo opuesto de ser un perdedor.  Dicho de otro modo, si no eres el capitán del equipo de futbol, eres, ¿qué?, ¿un perdedor? ¿En que año estamos? ¿2018? Interesante, ¿verdad? Yo sé que eso no fue lo que él quiso decir, pero, te has dado cuenta que cuando tienes que elucubrar sobre qué fue lo que se quiso decir, ya vamos de partida por un mal camino? Yo nunca fui el capitán del equipo de basketbol (mi liceo jugaba basket no futbol), de hecho yo jugaba volleybol que era a donde mandaban a los que no quedaban en el equipo de basket. Y siempre sacaba las mejores notas. Yo era sin saberlo, un nerd, porque en esa época no existía la categoría o no había sido identificada como tal. ¿Era un loser?
  • La humanidad es en principio buena a menos que estés en un territorio bajo la influencia de Isis. Una pareja de milenials que recorrían el mundo en una cruzada para confirmar (¿?) que la gente es buena (en general) fueron asesinados por un grupo de miembros de Isis en Tajikistan. Enlace a la historia. Al parecer ellos decidieron que estaban gastando sus vidas trabajando, y salieron a recorrer el mundo. Los analistas y conocedores de la región dicen que asia central es regularmente segura. La pareja básicamente tuvo mala suerte. Sic. Es decir, la humanidad es buena, a menos que tengas mala suerte.
  • “Whenever a mechanics change is proposed on behalf of new players, that change is always to the overwhelming advantage of richer, older players.” (“Cada vez que se propone un cambio de mecánica en nombre de nuevos jugadores, ese cambio será siempre una ventaja abrumadora para los jugadores más ricos y antiguos.”) La ley de Malcanis, explicada en detalle. No conocía la ley, pero sospechaba sus consecuencias. En Eve son los inyectores de habilidades, en Wow muchas cosas, incluyendo que ahora puedes subir de 1-110 en un par de días (hay quienes lo hacen en un día). En mis tiempos de Burning Crusade yo necesité tres meses para llegar a 60. Ouch.