@ agnasg

agnasg


Cómo resolver el problema “Duplicate without user-selected canonical” sin perder el tiempo

07-02-2023 5:40 AM

Cuando la Google Search Console encuentra este error “Duplicate without user-selected canonical” si no lo conocemos nuestra primera reacción es ir a google a buscarlo. Ahora tenemos dos problemas.

Hay ciertas búsquedas en google que devuelven cientos de artículos, supuestamente respondiendo la pregunta pero en realidad son una novela de Corin Tellado, donde casi te describen lo que es el internet antes de responder la pregunta “¿Cómo resuelvo este error?” Entonces perdemos el tiempo leyendo y leyendo sin encontrar la solución.

Así que sin más preambulo, aquí está la solución:

Debes colocar en la cabecera de la página cerca de donde colocas los metas, por ejemplo meta name=”description” lo siguiente:

<link rel="canonical" href="URL" />

donde URL es por ejemplo “https://www.macronosis.com/products/” el URL que se debe usar para acceder a esta página.
Así que quedaría así:

<link rel="canonical" href="https://www.macronosis.com/products/" />

La razón por la que las páginas que tratan de explicar cómo se resuelven este tipo de problemas están llenas de banalidades tratando de extender el texto es porque ellos están dando espacio para colocar anuncios y presentar enlaces patrocinados. Lamentablemente esto se ha convertido en un negocio porque la gente buscando información y solución abunda en google. El hecho de que google coloca estas páginas arriba en las búsquedas cuando debería eliminarlas como spam también representa un problema, y una situación desconcertante, obviamente google también está ganando dinero.

Esta es la misma razón por la que yo no veo tutoriales en youtube, la información que busco se encuentra perdida en algún sitio en un video de 10 minutos, lleno de un palabrerío sin sentido, y al final una pobre explicación que la mayoría de las veces me deja frustrado.

La máquina de estados finitos que no existió

23-01-2023 5:36 PM

Este artefacto es un patrón en game programming, con el que se controla, entre otras cosas, el flujo de ejecución del juego en términos de las fases o etapas (llamados estados) que lo componen, y sus transiciones entre una y otra. La definición académica es:

“Una máquina de estados finitos es una estructura que permite definir comportamientos complejos. Facilita definir comportamientos complejos y encapsularlos en mini interacciones únicas que llamaremos estados. Cada estado debe describir una acción muy simple.”

Por ejemplo, en khpx (hasta ahora) he necesitado 3 niveles de control de flujo: el estado del juego (presentando la introducción, jugando, en el menú principal, dentro de un dungeon, etc). En los distintos estados de un dungeon (introducción, jugando, fase 1, fase2, game over, etc), y dentro de uno de estos estados, presentando un sprite, moviendo alrededor el sprite, haciendo fade in (lo cual puede requerir 2-3 etapas, etc).

La máquina de estados finitos (MEF) controla qué cosas puede y no puede hacer el jugador en cada etapa o fase del juego, y cuándo se deben activar cada tipo de eventos por fase del juego. Controla las distintas señales de los distintos componentes del juego que permiten cambiar de fase, activar un evento, cancelar otro, etc..

La máquina de estados finitos (MEF) es, en definitiva, un subsistema del juego, que permite programar en forma simple todo esto. Esa es la teoría. En juegos anteriores (antes de khpx) he implementado esto totalmente integrado al resto, en C o C++. A veces es buena idea que esta MEF tenga una interfase con un lenguaje scripting como python o LUA, lo cual va a facilitar el prototyping y configuración de estados, señales y eventos. En definitiva es un importante y crucial componente dentro del game loop.

Pero khpx no usa nada de eso.

Cuando comencé a programar el primer dungeon (“Mindworm”), lo hice completamente en C++, pensando que una vez completado podía reimplementarlo con el MEF y metascript (mi propio lenguaje interpretado tipo javascript pero no tan tarado, tan poderoso como python pero no tan, bueno eso, y más fácil que usar que Lua, porque si hay algo que no genera el resultado que espero, lo programo para que lo haga). Es decir, mi lenguaje de prototyping es, sí eso es correcto, es C++. Quedó tan bien, tan elegante y eficiente que ni en un millón de años lo voy a tocar para convertirlo en un indescifrable MEF y python y lua y no se qué cuernos. Así que en khpx, no hay máquinas de estados finitos, o, visto de otra forma, cada sección del juego que lo requiere tiene su propia MEF.

No es una arbitrariedad de mi parte, es la filosofía de diseño de khpx, tiene y debe ser absolutamente simple. Por otro lado, está programado en C++ sin clases + la standard template library. Las implementaciones de los MEF usualmente consisten en una clase con médodos que permiten registrar los estados, las transiciones, los eventos, las señales etc.. La máquina de estados finita del dungeon Mindworm es un vector de estados, y cada estado es basicamente una estructura con apuntadores a tres funciones: inicialización, actualización y rendering. La primera se ejecuta una vez, al comenzar un estado, las dos siguientes en cada game loop. El cambio de estado se ejecuta simplemente incrementando el índice en el vector de estados. Eso es todo. Debuguear aquello es tan simple como revisar las funciones, no hay nada más que revisar. De hecho, luego de 40 horas de trabajo, 575 líneas de código, y 32 estados diferentes, acumulé 0 bugs debido MEF (pseudo MEF). Claro que hubo bugs, pero fueron sprites desapareciendo y cosas por el estilo (so->sy debe ser incrementado con so->vy, no con so->sy. Por algo prefiero los nombres largos. Menos confusiones).

La MEF, el lenguaje de scripting, el engine de sprites, el editor de recursos del juego y el manejo del menú principal son cinco cosas que ya he implementado al menos 3 veces desde 0. Todo lo he hecho de diversas formas, siempre diferentes, casi sin reutilizar nada. Espero que con khpx sea la definitiva de y ahora en adelante pueda usar estos componentes en el futuro.

De todo un poco, del tipo 2 +2 = 4, todavía en 2023

13-01-2023 5:19 PM

2 +2 = 4, inclusive en tu vida personal y profesional

Comienzo de 2023, época de planes, buenos deseos, mejores intenciones. Época en la comienzo a ver en perspectiva los resultados del año que acaba de terminar, hacer balances, revisar resultados, pero todo con la mira puesta en lo que voy a hacer este año. En los últimos meses he estado trabajando una lista de posibles nuevos proyectos, con toda seguridad, sin incluir una visita al baúl de los zombies (mi repositorio personal de proyectos inconclusos) porque ese tipo de visitas se transforma en una monumental pérdida de tiempo (usualmente, a veces es divertido). Por algo están en ese cementerio. Además, se supone que tengo khpx, y yo no debería estar viendo para otro lado, sino enfocarme en cumplir mi meta de un demo publicado en junio de 2018. Veremos si este año si se hace realidad. Para el que esté intesado trataré este año de mantener actualizada la página del juego (la página en este blog, no el sitio web del juego). Una interesante meta para este año sería tener listo el sitio web, con toda la información, la que, me da verguenza admitir, está casi lista. Este año pasado, le dediqué muy poco tiempo tratando de ponerme al día en otros proyectos. Las horas empleadas desde 2018, lo atestigua:

añohorascambios/adiciones
201860958
201934236
2020519278
2021270199
20221445
2023366 (hasta ahora)

No me atrevo a colocarle la línea de los totales, y me niego a darle formato a esa tabla. Eso es lo que el editor Gutenberg suelta cuando agregas un bloque tabla en wordpress. No me hagan hablar.

Aquí seguía una larga discusión sobre la falacia del costo hundido, y que nunca debemos tomar decisiones sobre lo que hemos hecho en el pasado, sino basar nuestras decisiones sobre los recursos, retos, metas, ventajas y desventajas actuales. Pero la borré, porque en este caso no aplica: khpx se convirtió en mi modo de vida y mi destino y será lo que haga de ahora en adelante. Fue, por así decirlo, una revelación. Para bien, o para mal. Porque el día en que reconoces que 2 + 2 = 4, ese día, ese día será un día feliz.

En 2006 dejé mi trabajo 9-5, me divorcié y me convertí en freelancer

Porque nunca estamos muy viejos para tomarnos un día libre tipo Ferris Bueller. Todavía estoy viviendo ese día libre, con resultados mixtos. La vida es demasiado corta para que la perdamos preocupándonos por objetos, personajes, hábitos, costumbres y tradiciones. Nada como mandar todo al carajo y bailar en la calle, Ferris Bueller style. Opiniones. Enlace. hn comments.

…que los niños sean nuestros guías

El ganso de los huevos de oro

Coloqué el enlace a los comentarios de Hacker News arriba con renuencia porque en realidad no son comentarios precisamente que aporten mucho en el sentido correcto a la película. Hablan de suicidio, y que esa película convive en el mismo universo de el Club de la Pelea. La gente de Hackers News no sabe lo que es el realismo mágico. Esa película vive en un universo autocontenido, como Macondo, aparece y desaparece con él. ¡Cómo se atreven a manchar el Teatro Mágico con gotas de realidad! (Armando en El Lobo Estepario)

Pero bueno, es Hacker News. Hace poco alguien publicó el FAQ de gail.com, un sitio que recibe casi 6 millones de hits diarios porque la gente lo confunde con gmail.com. El punto es que no tiene contenido, el dueño no le gana nada, no tiene anuncios y no tiene intenciones de venderla. Yo comenté que era una ironía que el dueño del ganso de oro le dió por botar los huevos. Me dijeron que si me habían criado en una prisión, y que por mi culpa no podemos tener cosas bonitas. Como en cualquier otro foro, es imposible discutir porque empeora las cosas. Mi punto era la ironía alrededor de aquéllo, no era mi intención per sé, criticar lo que ese señor hace con su página. Es de él, puede hacer lo que quiera. No me parece por lo demás, algo romántico, un gesto hermoso ni nada por el estilo. Me parece que nos está restregango en la cara “mira, yo tengo gail.com y hago con él lo que me dé la gana incluyendo no ganar nada con ese sitio. Y no te lo voy a vender: es mio.”

Michael, Jim, Pam, Dwight, Stanley, Kevin, Creed, Ryan, Angela, Oscar, Meredith, Kelly, Toby

Y ya que me estoy poniendo intenso, pusieron The Ofiice (US) en Netflix, así que me estoy devorando los episodios, 1 diario. Los memes tenían razón (sacrilegio! mi frase parece indicar que un meme pueda no ser cierto, lo cual es, por supuesto, una blasfemia!), The Office da en el clavo consuetudinariamente, mostrando la realidad en una oficina, de una forma mordaz y cruda. Me siento identificado con mucha de las situaciones porque durante 16 años trabajé en una oficina ridiculamente similar, y sí, en algún momento me sentí y actué como Michael, Jim, Pam, Dwight, Stanley, Kevin, Creed, Ryan, Angela, Oscar, Meredith, Kelly, Toby. Bueno no tanto como Jim pero más como Michael. Es horrible. Cuanto agradezco haber abandonado todo aquello (fuí vendedor de tecnología durante 16 años). Por cierto, la escena de la venta donde Michael y Jam le venden a un funcionario, es 100% fidedigna. Pero yo nunca terminé acostandome con mi compañera de trabajo despues de cerrar la venta. Lo juro. Eso estuvo muy mal, Michael.

El sexo es binario, de acuerdo a los tribunales Suizos.

Suiza, en una insólita decisión legal, acaba de rechazar que existen más de 2 sexos, declarando que el sexo solo tiene dos posibilidades: femenino y masculino. Queda pendiente todavía la cuestión de si 2 +2 siguen siendo 4, a lo que las autoridades suizas se negaron a responder mientras escribíamos esta nota. Así que podemos suponer que, todavía en 2023, 2 +2 siguen siendo 4.

Damar Hamlin y la técnica shaolin del dedo de la muerte

Damar Hamlin, un jugador de la liga de futbol americano sufrió un golpe (sic) y cayó inconsciente. Le aplicaron CPR y fue llevado a emergencias. Al parecer el golpe le provocó un infarto, paralizando su corazón. En esta discusión en reddit, alquien especula que pudo haber sido un golpe directo al corazón, justamente en el sitio correcto, en el momento correcto. Este tipo de golpes puede generar un paro cardiáco, según parece basado en múltiples incidentes similares.

Esto me generó la idea de que quizás esa técnica del kung fu (el arte marcial originado en China y practicado por los monjes del templo Shaolin) donde un luchador puede matar al contrincante con un solo golpe en el sitio preciso no es tan descabellada o fantasiona como parece ser al principio. Esta técnica aparece en varias películas, siendo 5 dedos de la muerte la primera vez que la ví. También aparece en El tigre y el dragón (Crouching Tiger Hidden Dragon) y en Kill Bill, donde Uma Thurman (Beatrix “the Bride” Kiddo, nombre código: Black Mamba) usa esta técnica para matar a Bill al final de la película. ¿Qué podemos aprender de esto? Que cuando vemos algo absurdo en una película con un monje shaolin, no necesariamente es una invento del guionista de la película.

Pega un brinco

O baila en la calle. Compra un libro a un vendedor ambulante, y léelo con animosidad. Cómete otro helado. Piensa en ideas descabelladas y lánzate la aventura de hacerlas realidad. Atrévete a ser atrevido. Vuélvete loco. Este año es una maravillosa oportunidad para demostrar de lo que somos capaces. Pero no esperes a que el año despeque: ¡hazlo ahora!

De todo un poco: edición brujas, hechiceros y charlatanes

14-12-2022 6:38 AM

Impostor

Si alguna vez viene alguien a decirte que tiene 20 años programando en C/C++, y sospechas que está mintiendo, lo puedes descubrir fácilmente con la siguiente prueba. Todo programador eventualmente tiene que lidiar con cualquier tipo de compilador, IDE, y librerías. Por ejemplo, en el caso de C/C++ es inevitable pasar por manos de Visual Studio, de gcc/g++, mingw, Turbo C, Dev++, Borland, etc.. Por el lado de librerías, SDL, DirectX, Opengl, SQLite, las librerías de SSL, bases de datos, y decenas de otras más. Así que el interrogatorio puede ser algo así como lo siguiente:

Sherlock Dev: ¿es decir que has trabajado con Visual C++?

Impostor: Claro que sí, hasta el cansancio.

Sherlock Dev: ¿incluyendo Visual C++ Versión 6?

Impostor: Por supuesto

Sherlock Dev: Ok cuál es la salida de este programa compilado y ejecutado con Visual C++ Versión 6?


int main ()
{
    for (int i = 0; i < 3; i++) {
        printf ("%d,", i);
    }
    printf ("%d\n", i);
    return 0;
}

La respuesta correcta es 0, 1, 2, 3, pero una respuesta comprensible pero equivocada sería que ese programa no compila, porque hay una variable desconocida en la línea 6. Y ahí entra en acción el conocimiento de Visual C++ Versión 6. Es un bug archiconocido de esa versión que una vez que declaras una variable dentro de un bloque (en este caso en el for) la variable puede ser usada de ahí en adelante. Eso fue corregido en Visual Studio Express 2005 (al menos fue la primera vez que lo vi corregido).

De esa manera, el impostor podría quedar al descubierto. Aunque en mi caso, el impostor con el que estaba hablando ni siquiera se acercó porque respondió “1 2 3 4”. Ni idea qué hizo con las comas y de donde sacó el 4. Por no mencionar que a ese programa le falta el “#include <stdio.h>”. Se cansa uno.

De Borges

¿Son ideas mías o la escritura de Jorge Luis Borges es rígida? Es decir, lo que surge de esa escritura, esos universos, son, literariamente hablando, rígidos? ¿Por qué me siento tan constreñido en sus escritos? ¿Por qué pienso que sé lo que va a pasar, porque, en el transcurso de su discurso, me ha dado las herramientas para saber qué es lo que va a escribir? No es exactamente que es predecible, no, su voz es como la de un profesor de matemática a medio camino en una demostración donde las fórmulas aparecen y desaparecen, y los números surgen naturalmente. Y entonces, ahí está el resultado, porque, es que no podía haber otro resultado. ¿Verdad?

Y ya que estamos hablando de Borges, “La biblioteca de Babel“, al buscar en wikipedia y otros sitios lo que leo son repeticiones de la trama del cuento, pero no su significado. Siempre recuerdo que mi profesora de segundo año cuando trató de explicar el cuento “El guardagujas” de Juan José Arreola, dijo que seguramente el sistema de ferrocarriles de Mexico es muy malo. ¿Qué? Ese cuento no tiene nada que ver con el sistema de ferrocarriles de Mexico, es una metáfora de la vida. De igual forma, La biblioteca de Babel no tiene nada que ver con libros y hexágonos, es una metáfora del universo (finalmente encontré en el artículo de wikipedia una insinuación breve y escueta de esto, escondida en el cálculo del número de libros en la biblioteca. Quizás parezca tonto pero un lector desprevenido como yo podría obviar que la primera frase del cuento lo dice: ” El universo (que otros llaman la Biblioteca) “). Leí de nuevo el cuento, no recuerdo la última (y quizás la primera) vez que lo leí, me motivó alguien en reddit diciendo que lo leía todos los años. No me imagino para qué, los hexágonos son inmutables, o en todo caso, siempre se puede encontrar un libro con una diferencia de una letra con el libro que se está buscando y no se encuentra. Es decir, todo sigue igual en el universo.

Dwarf Fortress

Este es un juego viejo (2006 al menos) que acaba de resucitar porque su versión en Steam está disponible, y ha causado cierto revuelo (artículo de pcgamer indicando que ahora ellos tienen que acostumbrarse a la idea de ser millonarios, y comentarios al respecto de hn). La verdad yo lo jugué algo en el período 2008-2010, y nunca entendí la fascinación de sus fans, a mi me parecía un roguelike más. Quizás porque en aquélla época estaba demasiado concentrado en Batmud y wow, y porque estaba algo hastiado de jugar Nethack y el Rogue original, ni hablar de ese engendro del mal llamado Adom. Ahora que lo pienso, la forma como sistemáticamente lo ignoré me resulta una sorpresa. Como quiera que sea, etc., realmente no lo he jugado, pero dado el conato de motín que hay en Steam, bajé la versión ascii para probarlo. Ya reportaré cómo me va. Mientras tanto, eniko dice que el éxito de este juego en Steam no se puede emular, porque “tú no estás haciendo Dwarf Fortress. nunca harás Dwarf Fortress. Nadie volverá a hacer Dwarf Fortress, nunca jamás“. Lo sé. Entiendo de qué hablas.