@ agnasg

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.

Eveonline 2do intento: fallido

08-08-2018 7:24 PM

Por qué no estoy sorprendido.  Realmente intenté hacer el tutorial dos veces. Con diferentes personajes, porque al parecer no hay forma de resetear el tutorial (en honor a la verdad en otros juegos tampoco. Pero en Eve se puede regresar al último punto seguro como ellos lo llaman, que a veces funciona/sirve). Constantemente me quedaba trancado porque las instrucciones o no eran claras o se referían a cosas que no aparecían por ninguna parte. Y eso que hay paneles por doquier indicando dónde están las cosas (y normalmente están en el medio y no te dejan ver nada). Me quedaba 5-10 minutos viendo la pantalla repitiéndome, “esto debe tener sentido“. Usualmente lo encontraba. Creo que ya estaba terminando el tutorial cuando finalmente me tranqué sin remedio. Me gané por mis logros una nave nueva, el punisher, instalé los equipos, y me faltó cargar las municiones.  Supuestamente está en el items hangar, pero no, no está por ningún lado. En el canal de newbies me dieron algunas sugerencias pero nada, ninguna me ayudó aunque tenían sentido.

Finalmente alguien me dijo que las municiones eran una cosa llamada Standard S, cuyo panel de info no dice que es municiones. El segundo problema es cómo cargar las armas con estas municiones. Pero hablemos de eso dentro de un rato.

En general hay un esfuerzo genuino detrás de Eve en ser un buen juego. Pero hay las pequeñas estupideces difíciles de tolerar. Por ejemplo lo de colocar la barra de progreso abajo de la ventana (con el riesgo de que no se vea si la resolución no es la correcta). O que a veces el launcher dice “Please wait… Checking the GUI version… RETRY”. ¿Qué significa esto? ¿Que espere o que presione el botón RETRY? Lo peor es que el botón no responde (finalmente despliega el mensaje connection timeout. Otras veces despliega errores como error while refreshing token. Parece programado por Microsoft en el tiempo de Windows Vista.)

Volviendo a cómo cargar las armas. La interfase es complicada porque se trata de un juego complicado. Pero es, además, artificialmente complicada. Las armas se colocan en los slots de las armas, pero para cargarlas con las municiones, se debe hacer drag and drop de las municiones sobre la nave, no sobre las armas. ¿Por qué esta inconsistencia en un juego con 15 años en el mercado? No tengo idea.

Las inconsistencias inclusive son inconsistentes entre sí: las municiones se colocan en las armas colocándolas sobre la nave en la ventana donde físicamente se ve la nave, pero cuando vamos a salir de viaje debemos mover las municiones del hangar de la nave a otro sitio, que no sabemos cuál es porque debemos mover las municiones del hangar al inventario, arrojándolas sobre el nombre de la nave (esta vez es el nombre, no la imagen). Es decir, el inventario de la nave y el hangar de la nave parecen ser dos cosas diferentes, pero para llegar al hangar debemos presionar el botón de inventario. ¿Alguien entiende esto? Es como un equipo de computación que trabajé hace 30 años, Convex, la forma como se configuraban los discos parecía diseñado por un leñador. Tenías que configurar el configurador para poder configurar una partición del disco, y luego para formater la partición, tenías que configurar de nuevo los comandos. Tengo un bloqueo mental en este momento y no puedo explicar qué significa “configurar un comando”.

En el canal de los newbies con frecuencia salía alguien con similares problemas. Aura, el npc que te guía en el tutorial a veces te dice que hagas algo, y se queda callada después que lo haces. Tienes que deshacer lo que hiciste y hacerlo de nuevo para que ella se de cuenta que ya lo hiciste. De nuevo, cómo es posible que un juego tan maduro tenga este tipo de bugs es difícil de entender.

Hay otras cosas que forman parte de la idiosincrasia del juego que o las aceptas o no. El juego es así. Es como en este mud llamado Bat (bat.org), entre los magos hay una versión llamada los Riftwalkers. Estos magos tienen un voidwalker, es un poderoso tanque, de verdad es muy divertido jugarlo, pero está lleno de arbitrariedades. Por ejemplo el enlace entre el mago y el voidwalker se pierde y tienes que reactivarlo, y, si juegas demasiado, tu voidwalker se puede molestar contigo entonces tienes que hablar con el maestro de los Riftwalkers para que interceda a tu favor y tu voidwalker   te perdone y siga siendo tu tanque. Al menos dentro de todo Bat esto fue lo único que encontré diseñado de esta forma tan absurda. Bueno, imaginense un juego completo con mecánicas como esas. ¿Lo imaginan? Bueno eso es Eve.

Al final el tutorial termina, pasa algo que al menos a mi me resultó decepcionante (que Jack Dawson muera al final de Titanic es triste. Que muera Rose sería decepcionante porque después de tanto trabajo de redención sería insólito que sea para nada). Que escritores más flojos, como diría Deadpool. La sensación que me quedó es como una duda primordial, si valió la pena pelear tanto con la interfase. Porque el problema de Eve es que tratar de hacer las cosas es tan difícil como meter un hilo en el ojal de una aguja, con dos pinzas de un metro de largo, agarrando las pinzas con  guantes de boxeo, con los ojos vendados, caminando en reversa sobre la cuerda floja, y vientos de 60 km/hora. No solamente por la arbitrariedad de cada paso, sino Eve hace un magnífico trabajo evitando que tengas una visión de lo que estás haciendo. En los combates estás como ciego, y en la pantalla también porque las ventanas se solapan, se colocan en el medio y no puedes ver al mismo tiempo información que requieres en una ventana teniendo la otra abierta. Algunas veces se les puede cambiar el tamaño, pero entonces tienes que hacer esto con frecuencia. Me imagino que en algún momento te acostumbras a todo esto, pero, en la vida, ¿no tenemos demasiadas cosas de las que nos tenemos que acostumbrar como para tener que hacerlo también con este juego?

Y ahora que lo pienso realmente no encuentro razón alguna para jugar de nuevo. Lo más divertido de Eve es cuando te sales y te pones a jugar otro juego.

Voy a jugar Eve

01-08-2018 8:48 AM

Estoy resucitando muertos insepultos así que decidí darle una nueva bocanada a Eve Online. La última vez yo lo llamé un juego estúpido, espero que esta vez tenga mejor suerte.

Lamentablemente comenzamos con mal pié. Luego de instalar presioné el botón “play” lo cual obvio significa lo que significa en cualquier juego a lo cual me respondió “not ready to play“. Salí del programa, entré de nuevo, reinstalé, etc al final terminó diciendo que no podía escribir en la carpeta SharedCache, por lo que se me ocurrió borrarla, pues se había creado la última vez que jugué el juego. Pensé que la instalación previa que hice hace años estaba interfiriendo con la nueva. Resultó ser 11gb, lo cual no parece ser cache, parece los datos del juego. ¡A alguien se le ocurrió llamar SharedCache a la carpeta que debería llamarse game data, o data, o lo que sea!

La resolución de mi pantalla es diferente, es más ancha que alta  que otras resoluciones,  es 1366×768 lo cual es 1.77, cuando lo normal es 1.33 (por ejemplo 800×600, o 1024 x 780) eso hace que cuando un programa torpe se le olvida leer la resolución de la pantalla (o lo hace en forma incorrecta como creo que hace el launcher de Eve) parte del programa no se ve, por ejemplo, en el launcher de Eve yo no pude ver la parte de abajo, justamente donde está el progress bar  que indica que está descangando game data. Es decir, el error “not ready to play” se debió a que estaba descargando el juego, no a un problema de cache.  Soy los 3 chiflados, Abbot y Costello y Mr. Bean todo en uno. Un simple mensaje diciendo “estoy descargando el juego”, o abrir el programa en la resolución correcta o colocar el progress bar arriba, o en el medio, hubiera sido suficiente.

Ya reportaré más adelante cómo me va.

Enlaces de Julio de 2018

31-07-2018 4:04 AM
  • En el post pasado comento que Node.js es una inmensa pila de basura, pero corrijo diciendo que no lo es.  O quizás si lo es.
  • Esto está bien interesante. He comentado aquí sobre la guerra que le tienen a Yanderedev, el desarrollador de Yandere Simulator en reddit (aquí).  No parece ser un caso aislado. Recientemente la escritora de personajes de MMORPG Jessica Price fue despedida por sus comentarios en un hilo de tweets que no fueron bien recibidos por el subreddit de Guild Wars 2. Enlace a una nota en Slashdot. Jessica dice “si reddit quiere que te despidan de tu trabajo, te despiden”. Enlace al artículo in The Verge. ¿La razón? Ella pidió que no le digan cómo hacer su trabajo, y mucho menos alguien que no sabe nada del tema (desarrollo de personajes). Y agregó que este era su tiempo personal, que ella no estaba trabajando. Lo cual me suena a mi relativamente razonable (yo sé que Jessica no es un angelito, por ejemplo por su opinión sobre la muerte de tot*b1scuit. Dice en su profile de twitter: I block often). ¿Hay un patrón aquí? ¿Reddit se ha convertido en una dictadura para los desarrolladores? Yo se que Yanderedev está desarrollando un comportamiento errático y tóxico, pero, quizás está excesivamente a la defensiva por una comunidad excesivamente e igualmente toxica. Por alguna razón inventó o descubrió que aquéllos que lo critican utilizan un conejo como icono para reconocerse entre sí (aquí está el meme). Ellos lo niegan y dicen que Yanderedev está paranoico. Entonces alguien muestra esta foto. ¿Esto es alguna pesadilla tipo Stephen King o David Lynch?). Perturbador.
  • Hablando de cosas perturbadoras, aquí está una lista de razones de por qué no debemos usar Python. A mi no me gusta por una sola razón: creía que los lenguajes tipo RPG donde la posición de una instrucción en una línea era cosas del pasado. A quien quiera que sea al que se le ocurrió que la indentación para definir un bloque era una buena idea, debería ser expulsado de la academia de programadores. Sin embargo, creyó que de esa forma sería más claro que con {}.  Esta es la discusión en Hackernews donde desmontan todos y cada uno de los argumentos del autor (del artículo con la lista de razones de por qué no debemos usar Python). Claro, desde un punto de vista del tipo “mi mamá cocina mejor que la tuya“.
  • Este video donde alguien critica a Yanderedev (volviendo con el tema, me estoy poniendo reiterativo) hace que revise mi estilo de programación. Yo creo que cualquier programador competente nunca va a hacer una sucesión de if’s anidados de la forma como se muestra (hay como 12 if’s anidados donde se determina el color del cabello del personaje y se hace un ajuste). Inclusive un programador novato sabe o se le ocurre que eso es mejor con un switch o con una tabla, donde el primer campo indica el el color del cabello y el segundo campo cuál es el valor para hacer la corrección. ¿Es posible que por pereza cometamos estos errores? No. Escribir código elegante debe ser algo automático para nosotros, sin importar el tiempo que requiera.
  • Hablando de código elegante, para cargar los datos en un forma de Qt, tengo que hacer una llamada al convertidor de lenguaje, transformar de std::string a const char *, etc,etc. Si esto lo tengo que hacer 3 veces o más veces la cuestión queda parecido a esto:
    ui->formF1->setPlainText(CLang::GetClass()->get(answer_selected->answer[1]).c_str());
    ui->formF2->setPlainText(CLang::GetClass()->get(answer_selected->answer[2]).c_str());
    ui->formF3->setPlainText(CLang::GetClass()->get(answer_selected->answer[3]).c_str());<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>

    Not nice verdad? Bueno mi implementación quedó así:

    QVector<QPlainTextEdit*>    answersList={
            (ui->formF1),
            (ui->formF2),
            (ui->formF3),
        };
    for (u32 i = 0; i < answersList.size () || i < answer_selected->answer.size (); i++) {
    ui->formF1->setPlainText(CLang::GetClass()->get(answer_selected->answer[i]).c_str());
    }
    

    Si elimino o agrego cambios solamente tengo que modificar el vector answersList. Mejor, ¿verdad?

  • Un div que se muestra diferente en cada navegador.  Esto es solamente un ejemplo, cada navegador ha implementado el manejo de los divs de forma diferente, lo cual es una pesadilla para nosotros los programadores web. En los ejemplos en ese hilo se indica que solamente IE muestra los divs correctamente. Esto es una excepción. El 99% de las veces es al revés, los demás navegadores muestran los div bien y IE lo muestra mal. Yo tengo años sin dar soporte de IE y mucho menos del nuevo Edge.
  • Un larguisimo tratado sobre Rogue en su versión para la Amiga (alguna vez mencioné que la Amiga 500 fue mi primera computadora personal, y que programé en ella, en assembler durante 10 años?)
  • Un GameDevs Fact Sheet de /r/gamedev. Algo controversial que  se presente a DigitalOcean mejor que Linode (y varios comentadores lo, comentan) pero qué se yo. Sigo utilizando Bluehost para todas mis necesidades de almacenamiento. También recomiendan Trello para planning. Voy a seguir intentando usarlo.
  • Scott Pilgrin vs Todo el Mundo. ¿He mencionado lo fanático que soy de esta película? Y no estoy solo, este tweet donde su autor desnuda a Scott, egoista, manipulador, mentiroso. Sin embargo la película muestra su redención a un mejor comportamiento de una forma que ninguna otra película logra alcanzar. El tweet tiene 35k likes y 8k retweets, así que definitivamente no estoy solo.
  • ¿Cómo hacer para tardar 7 años haciendo un juego? Yo soy experto en esto, esta me la sé. El autor incluye cosas como programar tu propio motor (game engine), seleccionar un lenguaje como C++ que en el “mientras tanto” ha tenido 3 versiones (x00, x11, x17), hacer tu propio editor (en este momento estoy en esta fase, haciendo un editor en Qt para manejar la data del juego), hacer una campaña crowfunding (no, esto es demasiado, yo no he llegado ahí, ni lo haré, jamás, lo juro (sic)), hacer blogs sobre tu juego (¿yo?), hacer todo el testing en casa, etc. Pasa al siguiente bullet, yo no voy a decir nada sobre esto.
  • ¿Te has preguntado por qué std::map.find existe pero std::vector.find no existe? En esta respuesta en stackoverflow hay una interesante discusión sobre este tema, incluyendo consideraciones filosóficas sobre diseño OOP. A mi me parece que mvec.find(key) != mvec.cend() es preferible que std::find(mvec.cbegin(), mvec.cend(), key) != mvec.cend() como alguien dice, y no creo que tenga que ver con eficiencia, que es o no es miembro, ni que STL es un asco. Es simplemente lo caótico que puede ser un artefacto sometido a fuertes e intensas decisiones. Alguien decidió que find no fuera miembro de std::vector. Sufran las consecuencias.
  • Finalmente luego de 6 años pensándolo abrí una cuenta y descargué League of Legend. Todo bien y sin problemas… pero, cuando me pidió el nombre para mi summoner, generaba el error “An unexpected error has occurred”. Googleando comencé a sospechar, no que lo haya leído en alguna parte, que quizás los nombres que estaba usando, que son los que uso en todos los juegos (agnas, por supuesto) estaban reservados o algo así. Ingresé entonces un nombre random, algo así como “qweweaSF” que es lo que resulta de tipear en el teclado cualquier cosa. Funcionó, pero ahora resulta que no puedo cambiar el nombre, y aparentemente hay que pagar por un cambio de nombre. Fuuuuuuuuuuuuuuck.
  • Si normalmente trabajas en  C++ y PHP, y dedicas un mes a trabajar solamente en  C++, no vas a saber que hay de malo en este código:
    $token = "Token "+ $i;
    $image = "/images/" + $row->$token;
  • Un cepillo de dientes sin baterias recauda 400 mil dólares en kickstarter. ¿Un momento? ¿Qué es un cepillo de dientes sin baterías? Bueno, existen los cepillos de dientes, y los perezosos usan también cepillos de dientes eléctricos. Esta gente sacó un cepillo de dientes que funciona como los  eléctricos pero sin batería. Cierto. El chiste es que alguien sacó este video mostrando un demo falso del cepillo es decir, sus creadores mostraron un video del cepillo supuestamente funcionando pero que en realidad está editado para mostrar el cepillo funcionando pero en realidad es la repetición del mismo clip durante 15 minutos. Uff espero no tener que explicar eso otra vez. Y como dicen en reddit, ¿no es un cepillo eléctrico sin baterías un cepillo de dientes? Sí pero este cuesta $96. Ouch, cómo hay idiotas en este mundo.
  • ¿Tiro libre de Messi? ¿Gol de Cristiano? Nada que ver, esta narración de un juego de ajedrez es mucho más emocionante que cualquier juego del mundial de futbol: https://www.youtube.com/watch?v=kUr_gdKQ8j4

Se cansa uno.

World of Warcraft Hecatombe

29-07-2018 6:37 AM

Como ya dije previamente, dejé de jugar wow al menos hasta el 8 de agosto porque me llenó de frustración el prepatch de Battle for Azeroth (BFA), y las pocas ganas de jugar wow que me quedaban se me esfumaron. No sé qué va a pasar el 14 de agosto pero tengo mis sospechas. Blizzard parececiera tener un plan para ahuyentar a todos los jugadores, y al menos en mi caso está funcionando. Lo peor es que no estoy solo. El precio de la ficha está en 195k al momento de escribir esta nota, una caída sin precedentes de 20K o casi el 10% de su valor. Ese precio está manipulado por supuesto, pero dado que con una ficha puedes pagar una suscripción que cuesta $14 y hay un tema legal alrededor de su valor, la manipulación la pueden hacer pero hasta cierto punto). La caída del precio de la ficha significa que la gente no la está comprando, es decir, la gente está dejando de jugar. Ya reportaré mis impresiones de BFA en agosto. Tengo que regresar a khpx.

QT-5.6.2: Compilar las librerías debug en una instalación solamente con las librerías Release

28-07-2018 10:05 AM

Si por alguna descabellada razón tienes una instalación solamente con las librerías “Release” y deseas agregar las librerías “Debug“, y estás usando shadow build, el proceso es tan simple como hacer algo así como:

nmake confclean
configure -debug -opensource -confirm-license -platform win32-msvc2013 -opengl desktop  -prefix C:\qt-5.6.2-build

Pero

Las nuevas librerías, por ejemplo, qtmaind.lib se van a quedar en qt-5.6.2/lib cuando deberían ir a qt-5.6.2-build/lib

La documentación dice que falta hacer nmake install pero esto no funciona. Hay que copiar las librerias manualmente. No se si esto fue corregido en las versiones posteriores o es una peculiaridad de mi instalación. Pero ahí queda el reporte para las futuras generaciones.

Battle for Azeroth: frustración

21-07-2018 4:44 AM

Ya está disponible el pre-patch de Battle for Azeroth (la última expansión de World of Warcraft, el único juego que juego regularmente). Quisiera decir que los resultados son mixtos, tristemente no, son de regulares a malos. Este pre-parche está full de bugs, como nunca había visto en wow, no parecen cosas de Blizzard, la compañia detrás de wow. Luego de 3 días la mayoría han sido resueltos, pero el conjunto de cambios que se hicieron  continúan(cambios en los talentos y en la interfase, las nuevas barras de comando son una desastre de diseño), y la mayoría no son tan buenos. La expansión estará disponible el 14 de agosto, así que no sé que se supone que vamos a hacer este mes. Usualmente hay un conjunto de misiones y una zona especial donde se realiza como un ajuste a la experiencia y al equipo antes de cada expansión, pero en esta ocasión eso solamente va a estar disponible durante la  semana previa. La gente está muy molesta en general, no soy el único. En el Q&A de ayer hay literalmente 100 personas diciendo que este prepatch está bugueado, incluyendo alguien que dijo: “it’s not my job QA your game, sorry” (no es mi trabajo hacer control de calidad de tu juego, lo siento”). Ouch.  Por esto y otras cosas  no voy a renovar la suscripción (pagada con oro, por supuesto). Al menos por ahora.

Me puse creativo entonces y dado que tenía en mi lista de juegos que debería probar  League  of Legends, decidí intentarlo y lo descargué. La gente dice que es una descarga de 13 gb. Falso, en mi caso fueron 5gb. El tutorial es un asco. No hay realmente ninguna ayuda para entender cómo es la mecánica, como se usan los hechizos, cómo es la estrategia, nada, nada, nada. De verdad hice algunos intentos pero no me atrapó en lo absoluto. Frustración. Así que volví a la rutina de lo que hago cuando abandono wow.

Cuando no estoy jugando wow mi juego alternativo es Wizard 101. Lo estoy jugando desde 2009, sin embargo apenas he trabajado 4 mundos. En este momento estoy en Grizzlehein (son 17 zonas y contando. Parece que sacan una zona nueva al año). Este juego tiene sus peculiaridades, incluyendo algunas cosas irritantes que wow no tiene. Por eso a veces lo abandono con rapidez. Por ejemplo en este momento estoy tratando de recoger El Ojo de la Verdad (Eye of Truth) en la cripta que está en Vigrid Roughland. El primer problema es que en este dungeon, antes de enfrentarte al boss que tiene the eye, hay 3 olas de mobs, lo cual te deja sin vida para enfrentarte al boss final. Wizard 101 es un juego por turnos, y las cartas que te salen son seleccionadas en forma aleatoria. Si no te salen cartas de sanación en el último enfrentamiento, mala suerte, tienes que repetir todo desde el comienzo.

Puedes colocar una marca para recuperar tu última ubicación pero en los dungeons no funciona (dice “The dungeon time has ended and the dungeon has been reset” que significa que tienes que comenzar el dungeon desde el comienzo. Hay un timeout que parece ser 20 segundos, casi inútil) (nota: finalmente descubrí que las pociones que venden en la feria no solamente restauran el mana sino tambien te sanan. Me parece que antes solamente restauraban el mana.) Las tres olas de mobs son: 1) Troubled Warriors y Hungry Soul con 310 c/u 2) Forgotten Clansman y Troubled Warrior con 620 y 310 respectivamente, y finalmente Forgotten Clansman y Hungry Soul.

Como si eso no fuera suficiente, luego de eliminar el boss tienes que invocar tres monolitos que supuestamente te darán el ojo de la verdad. Pero eso no sucede. La meta de la misión cambia y dice “Recoger el ojo de la verdad en Vigrid Roughland” lo cual es confuso porque parece que hay que dejar la cripta. Resulta que lo que hay que hacer es conseguir la combinación correcta de invocación de los monolitos. Todo esto dentro de un dungeon que tiene toda la dificultad mencionada. Este tipo de diseño no lo encontramos en Wow. Bueno a veces sí, pero en wow los dungeons no se resetean, así que una vez que has vencido el boss tienes suficiente tiempo para hacer lo que tengas que hacer en el dungeon.

El ojo de la verdad lo que te da es frustración.

Enlaces de Junio 2018

30-06-2018 9:22 AM

Yo recorro los caminos de este país perseguido por mi sombra. A veces la sigo yo a ella, a veces me acompaña a la izquierda, o a la derecha. Excepto cuando está nublado, o de noche

— Wally Brando

  • Un año de C. Evitar el gamelote de C++ es algo que cada vez más gente reconoce como una ventaja. Como ya he dicho, mi último proyecto está hecho en C++ pero sin clases, que es mi intento de trabajar en C pero usando algunas bondades de C++ como el STL, y otras cosas. Como dice el artículo “Escribir clases de C++ a menudo implica escribir constructores, destructores, operadores de asignaciones y movimientos, a veces métodos de setter y getter… y así sucesivamente.” (“Writing C++ classes often involves writing constructors, destructors, assignment- and move-operators, sometimes setter- and getter-methods… and so on”). A eso lo llaman “Boilerplate Code” o código gamelote (sic)
  • Byteball se hace viral en la USB. Leyendo la página byteball.org encuentro esta perla “El algoritmo de consenso utilizado para proteger contra los gastos dobles se basa en el establecimiento de un orden total dentro del DAG. Esto se logra seleccionando una cadena, llamada cadena principal, que gravita hacia unidades emitidas por usuarios de reputación comúnmente reconocida – testigos. Consulte el documento técnico para obtener más detalles.” (“The consensus algorithm used to protect from double-spends is based on establishing a total order within the DAG. This is achieved by selecting a chain, called main chain, which gravitates towards units issued by commonly recognized reputable users — witnesses. See the white paper for details.”). Define “reputación comúnmente reconocida”. Está raro esto.
  • Un bug en MSVC 2017
  • Ya antes he hablado de Yandere Simulator y su peculiar programador conocido como Yanderedev. Este mes sacó uno de sus afamados videos (con alrededor de 1m de visualizaciones cada uno, alguien quien dice que esto le genera ingresos por arriba de los $5k que gana en el patreon). En esta ocasión sacó un video donde trata de responder a la pregunta ¿cuánto tarda hacer un video juego?. Digo trata porque opino que es una pregunta que no se puede responder. Tarda lo que tarda, básicamente es infinito porque uno nunca termina un video juego, simplemente lo abandona. El video viene a propósito del drama que se está viviendo en este momento en el subreddit del juego porque la gente se está impacientando y porque cuando la gente le pregunta cosas sobre los features del juego, Yanderedev responde de una forma realmente agresiva porque, bueno él también se está impacientando. Muchos dicen que desde hace mucho tiempo. En relación al mencionado video, mi opinión es que si necesitas argumentar todo eso, es porque el problema es mucho más grave de lo que la gente del subreddit piensa. La gente comienza a especular, como este redditor que dice que él realmente no quiere terminar el juego, sino que quiere ser famoso. Yo creo que eventualmente Yanderedev va a terminar el juego, pero algo que puede ayudar a ese objetivo es dejar el drama y los videos sobre el drama. Pero, el sucio dinero tiene un rol aquí, los videos y el drama le generan dinero. ¿Ven hacia dónde voy con esto? Money.
  • php es un ratoncito en comparación al tren cargado con elefantes llamado node.js en nivel de inutilidad sin sentido (php is a mouse compared to node.js’s train of elephants level of bloat nonsense). Esto es reddit siendo reddit: todo comenzó con una discusión sobre las políticas de reddit de eliminar silencionamente mensajes directos que contengan enlaces a ciertos sitios vetados por alguna razón (o por ninguna razón) y la discusión degeneró en ataques como el mencionado a esa inmensa pila de basura llamado Node.js. (Disclaimer: Node.js no es una inmensa pila de basura, lo que pasa es que quedaba muy bien en este párrafo)
  • Estoy seguro que ya lo he linkeado antes pero aquí está de nuevo: la cuenta github con todo el código fuente de id software, los creadores de Doom, Wolfenstein 3D y Quake. Reportado este mes, de nuevo, en reddit.
  • Un corto ensayo de Stephen King sobre los autores prolíficos. Parece haber una conclusión, o quizás no. “Poco es mejor” está sobrecalificado como una opinión. Si puedes escribir mucho, que bueno, pero la gente le va a prestar atención a tus libros uno por uno. De todas formas, según él, los autores prolíficos lo son, en forma inevitable. A mi lo que me gustó fue la anécdota de los señoras que no se tomaban el vino. Stephen es un escritor genial para crear imágenes provocativas.
  • Un dominó de 5 mm de alto y unos gramos de peso tumbando a un dominó de 50 kg. Tomado de 9gag. Interesante para reflexionar sobre las consecuencias de nuestras más insignificantes acciones. O como los grandes cambios comienzan por imperceptibles detalles. En los comentarios discuten que las analogías estúpidas nada significan, y que una demostración de un efecto físico nada tiene que ver con filosofía, psicología del comportamiento y otras menudencias. Cierto. Pero es cuando hacemos una analogía en la forma en que crece la levadura y la forma como nos impactan los cambios: el día anterior a cuando la levadura alcanza el 100% del tamaño esperado, tiene un tamaño de 50%. Es decir, el crecimiento es geométrico: así es el impacto de los cambios, al principio son imperceptibles, pero al final el impacto es total. Yo puedo esto de múltiples formas, pero la metáfora de la levadura es perfecta para explicarlo claramente: ¿me expliqué?
  • El principio de Peter dice que todos alcanzamos eventualmente nuestro nivel de incompetencia en una organización jerárquica. Este paper propone y discute estrategias para combatir este hecho comprobado incluyendo que se deben hacer nombramientos random o ascender al mejor y al peor candidato para aumentar la eficiencia. Esto resulta contra intuitivo por decir lo menos, y debería más bien ser sustituido por múltiples criterios (que es lo que usan las organizaciones actualmente), por ejemplo, competencia, desempeño, capacidad para conseguir los logros del equipo de trabajo, etc..
  • Interesante lectura sobre los avances de Blizzard con WOW Classic. Esta va a ser una versión de World of Warcraft similar a la que estaba disponible alrededor de 2005, un viejo deseo de la fanaticada de jugar la versión original del juego. Enlace.
  • En relación a la Copa Mundial de Futbol 2018: toda la selección de Islandia (Iceland)está formada por personas cuyo apellido termina en “son”: Halldorsson, Runarsson, Arnason, Skulason, Saevarsson, Ingason, Magnusson, Eyjolfsson, Sigurdsson, Gudmundsson, Bjarnason, Traustason, Hallfredsson, Sigurdsson, Skulason, Gislason, Fridjonsson, Gunnarsson. Si el porcentaje de la población cuyo apellido termina en “son” es tan alto ¿por qué siguen usando el “son”?
  • Una charla corta sobre Unit testing. Pregunta: ¿Por qué ciertos componentes (métodos estáticos de una clase) no se pueden testear? El orador: porque no se puede. Él explica porque no tiene “costuras”.  Algo asi como que no tiene por dónde agarrarlo. Mi solución: no uses algo que no puedes testear. Este sitio está lleno de videos sobre diversos tópicos de programación. Bien interesante de navegar.
  • Fortnite: Battle Royale es el juego con más ganancias en un mes que cualquier otro juego gratis. Ganó $318m en mayo. Según reporte en slashdot. ¿De dónde proviene esta ganancia? Vendiendo artículos no importantes como ropa y movimientos de baile. Cierto.
  • Interesante artículo en Gamasutra sobre algunas estadísticas de Steam: Se publican hoy en día 180 juegos con el nuevo sistema Steam Direct (más del doble que con el viejo sistema Greenlight). Hay opiniones como siempre en ambos sentido: es bueno (como dice Valve, porque facilita la publicación y los juegos consiguen su audiencia). Es malo: porque entre tanta maleza y monte, los humildes juegos indie se hacen invisibles. Como me dijo un amigo en facebook: las opiniones son como los traseros, cada quien tiene el suyo. Digo.

Toma de decisiones

28-06-2018 2:57 PM

Esto iba a ser un enlace en la lista de enlaces de junio, pero se fue extendiendo demasiado y se convirtió en un post. Mis discusiones de fin de mes se supone que deben ser breves reflexiones alrededor de algún post o suceso interesante, pero a veces cobran vida propia y se transforman en algo difícil de precisar. Algunos simplemente desaparecen y se convierten en nada, otros se transforman en un post, como este.

El enlace viene de gamasutra, A producer’s guide to decision-making (Guía del productor sobre la toma de decisiones).

El artículo hace un excepcional resumen de todo lo que viene alrededor de las malas y buenas decisiones y las consecuencias o beneficios que pueden ocasionar. Estuve envuelto en una de estas decisiones este mes, así que me vino como anillo al dedo el artículo. No porque yo tenga problema tomando decisiones, sino que como dice el artículo, no las debemos tomar tan a la ligera. Pienso que luego de sopesar correctamente los pro y contras no queda más remedio, hay que proceder y tomar la decisión que en nuestra opinión es la más apropiada.

Pero hay decisiones que debemos tomar casi con los ojos cerrados. Como un ciego en un gallinero. En mi luna miel, en mi otra vida, nos fuimos manejando hasta Mérida. Resulta ser que la via hacia Barinitas tiene un tramo de alrededor 100 kilómetros sin ningún tipo de señalización. Hasta que llegamos a la ciudad realmente yo no estaba seguro que era la via correcta. Ciertamente iba más o menos en el sentido correcto (sur-oeste) pero había momentos en que la carretera cruzaba hacia el oeste e inclusive hacia el noreste.

Muchas decisiones son así. No hay señalización. Tomas una decisión y solamente vas a saber el resultado cuando llegas a la meta, no antes. Ni siquiera hay una buena pista que te dé alguna orientación. Solamente tu intuición y sentido común te pueden ayudar.

En este mes mi plan era trabajar tiempo completo con las misiones  y diálogos de mi juego espacial, khpx. Todo estaba almacenado en estructuras C++, inicializadas a través de las nuevas funcionalidades de c++11, todo en un archivo llamado db_init.cpp. Luego un proceso se encargaba de guardar estas estructuras en tablas de sqlite para ser leidas por el juego a tiempo de ejecución. Cuando el juego pase a producción la base de datos sqlite será eliminada y un sistema de archivos altamente optimizado tomará su lugar. Se supone.

El punto es que con 10 misiones, 10 npcs, 10 items, 10 recompensas, las estructuras de c++ se convierten en un código escrito en sánscrito encriptado en antiguas claves macedónicas.

Algo tenía que hacer, y todo apuntaba en una dirección que yo conozco perfectamente: hacer un editor tipo GameMaker que maneje la data del juego, y la almacene en una base de datos para que la lea posteriormente el juego. El problema de este enfoque es que contradice todas las reglas que he venido aplicando hasta ahora con khpx: debe ser simple, rápido, y lo que sea que se haga debe facilitar y acelerar la publicación del juego: un editor de la data y metadata de los objetos del juego ni es simple, ni es fácil, y es una enorme desviación en el objetivo de publicar el juego.

El riesgo es  que implementar este sistema puede tardar semanas, más de un mes quizás, y no sabemos si eso va a funcionar o cómo va a afectar al juego y su publicación. Históricamente (me refiero a mis otros desarrollos, taisec y psyblast) me he perdido en interminables desarrollo de características en este tipo de editores, y para cuando ya está casi listo he perdido interés en el proyecto en sí.

Claro que ahí vienen los argumentos y contra argumentos: esto va a ayudar a largo plazo el desarrollo, organiza lo que a todas luces es algo de por sí complicado, de todas formas hay que hacerlo porque parte de estos datos deben ser accesibles por el jugador para consulta, como si fuera una enciclopedia.  Y es una mejor practica (best practices). Al fin y al cabo no hay que ser como el herrero que trabaja en su casa con cuchillo de palo, blah, blah, blah.

Desde taisec (mi primer juego, tipo aventura, nunca publicado) he estado haciendo este tipo de editores. Este es un screenshot de lo que yo llamaba scredit porque se suponía que iba a implementar un script para controlar las acciones del juego:

Y en psyblast (otro zombie del baul de los zombies) hice un superprocesador del documento maestro para pasar la info al juego, es decir, hice un mega GDD (de 60 páginas) con un lenguaje que un procesador interpreta, y extrae para pasarlo a una base de datos. Lo cual por supuesto, es una inmensa locura. ¿Cuánto tiempo estuve trabajando en eso? Semanas.

Y para khpx lo que tengo que hacer es el super definitivo editor de worldbuilding. Que puede tomar meses.

El plan es hacer un editor, al que llamo summa, implementado en Qt, es un visor/editor de la base de datos del juego. Es decir, al mismo tiempo sirve para el juego y se puede visualizar en forma de wiki desde otro programa. Genial. ¿Cuánto tiempo le he dedicado a esto en este momento? 2 semanas y el plan es terminar en una semana más.

Así luce la pantalla que se encarga de la información de los planetas:

Ya reportaré de nuevo en julio si llegué a Barinitas o me perdí.