@ agnasg

agnasg


Vivir deliberadamente

30-11-2020 4:26 AM

Sí, este es un post de enlaces. Los posts sobre Android y SDL siguen en la cola. Ambos son de más de 2000 palabras así que la espera va a valer la pena.

Que el festival de enlaces comience!!!

Es igual pero diferente

Esta respuesta en stackoverflow sobre para qué sirve super() en python, nos deja pensando si realmente stackoverflow es capaz de responder adecuadamente una pregunta, o deliberadamente intenta que tengas que leer medio libro de La Guerra y la Paz antes de entender la condición humana ¿? No, no estoy interesado en este momento en entender la condición humana, solo quiero saber para qué sirve super() en python. Las respuestas son del estilo “un destornillador permite destornillar un tornillo”, lo cual te obliga a buscar qué significa “destornillar ” para descubrir que “destornillar es la acción de usar un destornillador”. Al final, resulta que super() es la forma de python lidiar con class inheritance, es decir, cómo facilitarte la vida cuando te quieres complicar la vida. No necesariamente vas a tener éxito, pero mira el lado positivo, al menos descubriste que no solamente las classes en C++ son inútiles y están implementadas torpemente, también python es igual. Pero diferente. python es como un carro donde el volante está en los pies, y el acelerador y el freno están en las manos. Se maneja igual, pero es diferente. Tú sabes, la innovación es más importante que la utilidad.

De juegos multijugador

Volví a abandonar World of Warcraft. Terminé basicamente la expansión (Battle for Azeroth) y en algún momento jugaré Shadowlands, que salió el 23 de noviembre. Lamentablemente, el juego tomó un curso deprimente, y al parecer la nueva expansión va a continuar igual. Ahora no se trata de maximizar el equipo para derrotar a los jefes máximos. Ahora la idea es alimentar el poder de tu equipo infinitamente, hacer misiones, etc. Ya no es divertido, quizás para mí luego de 12 años, ya se terminó.

12 años es nada. Hay personas que tienen 20 años jugando Muds, y todavía siguen haciéndolo. Yo abandoné el Mud que jugaba, BatMud hace 5 años y desde entonces he estado buscando una nueva casa. Jugué Carrions Fields, Zombiemud, Lands of Redemption, Darkmud, Achaea, Alter Aeon, Genesis y ahora estoy probando nuevamente Sindome. Ya lo jugué sin éxito en 2016, y luego de leer este artículo, me animé a darle una nueva oportunidad. Es diferente a cualquier cosa que haya jugado antes, por ejemplo, la mayoría de los comandos son diferentes, por ejemplo, si ves un panfleto, “leer panfleto” es suficiente en cualquier mud, pero no, en Sindome hay que hacer “leer [pagina] de panfleto” donde [pagina] es primera, última, o un número. Pero los panfletos solamentienen una página, así que nada de eso funciona. Un mini puzzle que me tomó un buen tiempo resolver.

Qué es un Roguelike

Interesante artículo sobre la respuesta a esta pregunta (por supuesto, según el autor, es su opinión). Para mi es tan simple como cualquier juego que tenga los elementos del Rogue original. Si tiene graficos como Dungeons of Dredmor no es un roguelike, aunque apliquen reglas similares y el movimiento es 2d. Yo diría que es un juego con reglas similares a los roguelike. meh.

What stands in the way becomes the way — Marco Aurelio

Hay quienes se resisten a ver la realidad. Lo hacen voluntariamente, conscientemente, sin darse cuenta, intencionalmente, deliberadamente, con alegría, con tristeza, con obsecuencia, calladamente, a gritos o en una combinación de todo lo anterior. También hay quienes hacen papel de camello.

Resulta que los camellos no son iguales a los caballos. Los caballos dan por sentado su destino de servir al hombre, y de la misma forma que los perros, son sumisos e incapaces de levantar una pata o un colmillo contra sus amos. Los camellos por el contrario, aceptan su rol a regañadientes, y solo con la condición de ser tratados con gentileza y con una buena porción de comida. Pero, a veces, pierden la paciencia. Se enojan con su amo y comienzan a lanzar mordiscos y patadas. El camellero, que está muy consciente de esta posibilidad, está preparado: se quita la camisa y se la lanza al camello. Éste paga su rabia con la camisa, mordiendola y pateándola repetidamente. Al cabo de un rato, se cansa, se apacigua, y vuelve al trabajo mirando de reojo al camellero.

Pues bien, hay quienes se comportan como los camellos, desatando su ira hacia un objeto cualquiera, sin percatarse que lo que hacen es perder el tiempo, mientras el culpable se esconde, y los mira desde lejos, esperando a que regrese a su sumisión.

Wordplay

Yo estuve trabajando durante 5 años en Business Intelligence (BI) (hace más de una década), lo cual me permitió adquirir destrezas en el área de minería de datos, y sistema analíticos. BI forma parte de las herramientas de optimización de negocios.

Estaba viendo por casualidad la presentación de esta compañia (en una publicidad antes de ver un video en youtube) donde muestran como hacer data mining con python (tengo algunas historias sobre python, pero eso será contenido de otro post). Lo que me llamó la atención es el cambio de nombres, y nuevos nombres de las diferentes tecnologías: en esa presentación se habla de data wrangling (que llamábamos ETL, extracción, transformación y carga de datos), data science (BI lo podríamos catalogar entonces como un subconjunto de data science), cluster analisis, etc. Así, data science incorpora los nuevos desarrollos en machine learning y big data. Interesante.

De prestar atención

Este artículo trata (no necesariamente lo logra) que le prestemos atención a nuestra capacidad de prestar atención. Si no prestamos atención todo está perdido, lo cual parece intuitivamente correcto. Hay una claudicación en ese artículo: si no puedes prestarle atención a algo es mejor rendirse. No todo el mundo estuvo de acuerdo con este planteamiento, sobretodo los que tienen serios problemas para prestarle atención a algo: si te rindes, jamás vas a poder avanzar un proyecto.

El autor utiliza como técnica la clasificación de Eisenhower: urgente e importante y todas las combinaciones posibles de las dos. A mi, personalmente, eso me recuerda a hacer listas y colocarle prioridades. Lo cual no funciona para mi. Al final, todo es urgente e importante, esas clasificaciones son artificiales y dejan de funcionar, eventualmente. Las artividades tienen un ordenamiento lógico: más allá de eso, lo único que hay que hacer es trabajar. Llámalo como quieras: prestarle atención o no, procrastinación, pereza: ¡trabaja!

Vivir deliberadamente

He estado pensando en cambiar mi motto: “vivir sin virtudes aparentes“, y cambiarlo por deliberadamente: con pasión: no se me ocurre otra forma de vivir. En la película “Automata”, uno de los robots le responde al asesino: “¿soy sólo un robot? Eso es como decir que tú eres solo un mono”. Los idiotas de 9gag dicen que eso es un mal argumento, “somos solamente unos monos”, lo cual me hace pensar que por algo son idiotas: no entendieron el razonamiento de un robot (o el que escribió el guión).

No somos simplemente monos: somos capaces de vivir con pasión, cosa que ningún mono sabe hacer. ¡Los monos comen bananas, 9gag!

Cuando las aguas dejan de moverse

08-09-2020 6:57 AM

Este es un post explicativo. Es del tipo “¿qué está pasando?” (“what’s going on?”). ¿Por qué no hubo post en agosto? ¿Cómo salir de la pandemia vivo y coleando? ¿Es este el fin del mundo? ¿Debemos odiar a amazon por ser tan exitoso?

  1. Si hay un post de agosto, todavía no lo he publicado porque describe el procedimiento que seguí para publicar un juego en Play Store. Todavía no está listo. Espero publicarlo este mes. Para ello saqué un juego al azar de mi baúl de zombies (tilemovers) y lo reimplementé en SDL2. Está listo también hay una versión para pc lo voy a publicar itch.io.
  2. Coronavirus. El sentimiento generalizado es que no vale la pena cuidarse tanto porque ha habido personas que después de 6 meses de estricto aislamiento y bañarse en alcohol todos los días, se descuidan un día y se contagian. Si todos nos vamos a contagiar, ¿para qué tanta paranoia? La realidad es que todos los días existe una posibilidad de 1/1.000.000 que te caiga un piano en la cabeza. Repentinamente, ahora la posibilidad es 1/34. Yo no sé usted pero yo al menos comenzaría a mirar para arriba solo para estar seguro.
  3. Este no es el fin del mundo. El cambio climático es el fin del mundo tal como lo conocemos. La pandemia va a terminar. Nos tocó vivirla. Otras generaciones se salvaron, pero les tocaron otros retos. Cada generación tiene sus retos. La nuestra quizás se dedica más a llorar sobre platos rotos, lo cual siempre ha sido una pérdida de tiempo.
  4. Yo no tengo nada contra Amazon ni contra Bezos, y él no está obligado a retribuir sus ganancias a la comunidad. Depende de la comunidad que continúe haciendo negocios con él, lo cual parece que va a continuar por mucho tiempo.

Una explicación inútil

12-07-2020 8:18 AM

“There is a different between live intensely and live with passion” (“Hay una diferencia entre vivir intensamente y vivir con pasión”)

Itzhak Perlman



Ok, yo no sé qué significa eso, pero ¿qué tal ambas cosas? Cuando oí esa afirmación (Itzhak Perlman es una violinista consagrado, así que él sabe de intensidad y de pasión) lo primero que pensé fue “no sabía que ambas cosas eran mutuamente excluyentes”. Yo siempre he vivido intensamente como un funámbulo y con pasión como un violinista. Así que agárrame esa ballena por el chorrito, Itzhak!

De “Dark” y Hitler

Advertencia: no hay realmente spoilers en lo que viene, pero los comentarios pueden sugerir algunos elementos que forman parte de la trama. Quizás sea buena idea que termine de ver la serie y regrese. Suerte con eso.

La serie de Netflix “Dark” ha causado revuelo. Primero, porque no se entiende. Segundo, porque cualquier especulación sobre lo que está sucediendo genera polémica. Por ejemplo esto:

“hicieron lo correcto”

El problema, sin ahondar mucho si la serie tiene la intención oculta de sugerir una respuesta a ese dilema, o a esa decisión, es que, si algo hemos aprendido con todas las experiencias en “Volver al futuro” 1, 2 y 3, “El vengador del futuro” (“Total Recall”) el capítulo “Al borde de la eternidad” de “Viaje a las Estrellas” y otras películas similares con viajes en el tiempo, es que esos personajes de “Dark” hicieron lo correcto al tener sexo con sus tías y no asesinar a Hitler, porque el resultado hubiera sido el mismo, o peor.

Me explico.

La cuestión fundamental es si la segunda guerra mundial era evitable. Mi teoría es que no. Muerto Hitler, cualquier otro canciller alemán, u otro líder cualquiera hubiera tomado similares decisiones, dadas las malas condiciones en que Alemania terminó después de la 1ra guerra. Además, haber perdido territorios era algo inaceptable en aquéllos tiempos, y otra cantidad de razones que ya todos conocemos. Así que Alemania hubiera ido a la guerra de todas maneras. La pregunta es qué hubiera pasado si Alemania no ataca en la forma que lo hizo a Rusia, sino que comienza a ganar tiempo, a fortalecer los territorios conquistados, a prepararse para el ataque, desistir de la solución final con los judios, etc.. Rusia quizás no hubiera atacado, y tendríamos hoy en día una Europa alemana. Alemania perdió la segunda guerra mundial por la tonta decisión de Hitler de invadir Rusia en las peores condiciones cuando todavía no había consolidado su poder sobre Inglaterra y continuaba enfrascada en resolver el tema de los judíos. Con un líder diferente Alemania quizás hubiera tenido éxito en sus loqueras, e inclusive, quizás una política exterior más razonable. Claro, buena parte de Europa sería territorio alemán y hoy en día sería una potencia mundial (tal como lo es de todas formas). Así que asesinar a Hitler probablemente no hubiera resuelto nada, o quizás hubiera sido peor.

C++ sin clases

06-06-2020 5:06 AM



Ventaja oculta de no usar c++ clases: cuando agregas una nueva función no tienes que registrarla en la clase, la escribes, la usas y ya.

Prometo que este va a ser mi último post “yo uso C++ pero no uso clases“. Quiero concentrarme en el tema de la complejidad en si misma y olvidar otros temas. No he querido buscar en wikipedia como se llama el síndrome de los que piensan “por qué hacerlo sencillo si lo podemos hacer complicado“, estoy seguro que este síndrome tiene un nombre. Bueno, yo sufro de ese síndrome. Por ejemplo, cuando abandoné mi juego psyblast (para los que nos visitan por primera vez yo tengo una enorme colección de juegos inconclusos, es parte de mi hobbie, comenzar juegos y no terminarlos, es divertido sugiero intentarlo) decidí que mi próximo juego sería algo simple, muy simple, un juego en el espacio, donde el jugador tiene una consola donde pueda ver diversos medidores, y el juego sea simplemente tratar de viajar lo más lejos optimizando el uso de combustible, oxigeno, hidrógeno, etc.

5 años después esto se convirtió en khpx, un juego de estrategia con elementos del género 4x (eXploración, eXpansión, eXplotación, eXterminio) (pero no es un juego 4x) donde el jugador puede practicar la minería, la cosecha, desarrollo de tecnología, y en general desarrollo y dominio de recursos. Y sigue y sigue complicándose hasta el infinito. Así que todos los días mi motto es “cómo hago para simplificar las cosas” o “qué puedo simplificar hoy”.

Como mi compulsión me impide simplificar más allá de cierto nivel el juego, apunto mis baterías a C++. ¿Qué más puedo simplificar? No mucho pero contener mi impulso natural a usar clases ya es un comienzo.

Entonces cayó en mis manos este software, recientemente liberado por EA, el código fuente de CnC(Command & Conquest). C++. Clases. Muchas. Ví archivos muy grandes, vi un caos en la nomenclatura de los archivos, los nombres de clases, variables, métodos, todo. Y sentí un alivio porque así es khpx: un caos de nomenclatura donde hay funciones_con_barra_de_abajo, funcionesConNotacionCamel, variables_con_la_funcionalidad_al_comienzo y demás cosas similares.

CnC tiene un DISPLAY.CPP (de 190k) y un DISPLAY.H de 13k (en khpx el archivo más grande tiene 40k y es mucho) Ví cosas como DisplayClass::TacticalClass::Command_Object (..), y mezclado con esto, muchas funciones static funcion_no_en_una_clase_y_es_libre (…). Lo cual me lleva a pensar cuál es el punto. Sin embargo, el código se deja leer, el nivel de espaguetismo es minimo (khpx es un espagueti de pasticho hecho con pasta corta). Ahora, en el código de CnC seguir el camino de las clases esa es otra historia: entre algo->subalgo (..) mezclado con OtroAlgoSolo(…) entender quién llama a quién desciende a un nivel de complejidad natural, porque está implementando un juego naturalmente complejo, complicado por la complejidad de la capa de clases mezclada con funciones estáticas imposibles de meter en clases porque son libres como el viento. La idea de las clases es organizar la complejidad, a veces con éxito, a veces agregando una nueva capa de complejidad a la complejidad para que la complejidad subyacente sea invisible, aunque nosotros sabemos que está ahí, e inevitablemente nos devora como arenas movedizas.

Es decir, buen intento, pero las clases en sistemas complejos fracasan en hacer amigable la complejidad, simplemente la ocultan y la hacen más compleja a niveles inmanejables.

Este nivel de complejidad innecesario y a veces inútil (estas palabras no son sinónimos), es como el síndrome de willicoyotismo (algo que acabo de inventar) Willie el Coyote quiere atrapar al correcaminos (en la vida real un coyote alcanza en una carrera a un correcaminos en cuestión de 30 segundos) pero utiliza catapultas, cuerdas atadas a un risco, y se coloca un casco con una rueda arriba, y patas para arriba se lanza sobre la cuerda corriendo con la rueda que tiene en el casco como un funicular invertido. También arroja misiles, bombas, tumba puentes etc. Es lo mismo que utilizar los artefactos alrededor de las classes de OOP. ¿Ejemplos? Bueno este señor quería calcular la desviación estándar para las mediciones de un sensor. Lo que hizo fue tener una clase Sensor y una clase Medida, y cada vez que quería calcular la desviación estándar, convertía los valores tipo double a Medidas, los cargaba en un Sensor, llamado “CalculateStDev”, y tomaba la propiedad “CurrentStdDev” del Sensor. ¿Ok? ¿Cuál es la diferencia entre eso y meterse en un cañon como el hombre bala, activar el disparador calculando que la trayectoria dé exactamente en el sitio donde el correcaminos va corriendo por una carretera cualquiera a una velocidad de 24 km por hora ? Yo no veo la diferencia honestamente.

Como un ejemplo adicional, este señor muestra como OOP es inconveniente en algunos casos (realmente todos) y cómo una solución escrita con clases puede ser escrita fácilmente con una simple función. En realidad, cuando resolvemos un problema, es en el problema en que debemos estar pensando, no en cómo usamos nuestro lanzamisiles de última generación para resolver el problema. Lo cual es la principal razón por la que dejé de usar clases. Pierdo mucho tiempo pensando en cómo emplear sus patterns para resolver problemas, en vez de simplemente resolver el problema.

Esta pérdida de perspectiva termina desvirtuando “lo que tienes que hacer” de maneras incomprensibles. Es como ciertos gerentes de proyecto que manejan los proyectos usando el software, viendo las actividades en gráficos y los tickets cambiando de estatus. Quizás ves algunas cosas pero no el conjunto y sus interacciones, y tus acciones y rabietas terminan siendo absurdas. Los demás te miran desde el otro lado de la mesa con perplejidad: ¿qué le pasa?.