Saturday, May 30, 2020

Definitivo: Windows 10 es más lento que Windows 7



El sistema operativo de Microsoft ha sido adoptado por unos mil millones de usuarios en el mundo, de acuerdo con este sitio, y aunque tardó dos años más de lo previsto, puede decirse que este es el sistema operativo más usado de todos los tiempos (hasta ahora). Sin embargo, aunque Microsoft puso de forma gratuita la descarga de Windows 10 en el 2015 (para que la gente lo descargara y usara), fue clara la estrategia para ir migrando su propia plataforma al hardware más del momento.

A cinco años de su introducción al mercado, podemos preguntarnos: ¿Es Windows 10 mejor que Windows 7? La respuesta en general es un rotundo sí. Esa más estable, menos pantallas de la muerte, una buena capacidad de recuperación, software más robusto por parte de Microsoft, etcétera. Sin embargo, la segunda pregunta clave es ¿Es más rápido Windows 10 que Windows 7? Pues no, la realidad es que Windows 10 -de acuerdo a mis propias pruebas, es mucho más lento que la versión anterior. La pregunta es ¿cuánto?

Para probar esto, decidí usar un programa escrito en Delphi, que hace una serie de búsquedas regulares en un archivo de datos. Este archivo tiene alrededor de 110 mil líneas y el programa debe buscar si una cadena de símbolos en particular aparece en el archivo de texto mencionado y además, que indique en qué líneas aparece. Lo que hace mi software puede verse aquí.

Busqué en Internet una respuesta a la razón por la cual Windows 10 se observa tan lento. Hay un sinfín de respuestas, pero la realidad es que no sé exactamente qué está pasando. La pregunta sería entonces: ¿Cómo hacer para que Windows 10 corra más rápido?

He aquí los dos videos con las pruebas referidas. Cuando en el video (que no tiene sonido), le pongo la opción de buscar patrón, entonces puse el cornómetro, que me dio los datos mencionados. A ver si alguien tiene alguna explicación al respecto.




La versión corriendo en Windows 10



La versión corriendo en Windows 7



Mi software lo probé en Windows 10 y obtuve un tiempo de proceso (tomado con mi celular), de 81 segundos. Esto significa que mi programa puede revisar 1358 cadenas por segundo. No parece demasiado lento. Sin embargo, corrí en mi máquina con Windows 7 exactamente el mismo programa con los mismos datos. El cálculo del tiempo que tardó fue de 33 segundos. Esto es 3333 cadenas revisadas por segundo. Vamos, Windows 7 es 2/3 veces mas rápido que el flamante Windows 10.

Para ser justos, esta es la comparación del hardware:


Windows 7



Windows 10

En términos del trabajo que estoy haciendo, el programa en Windows 7 puede revisar unas 54 partidas por segundo, mientras que en Windows 10 solamente 22. Demasiada diferencia, ¿No?

Wednesday, May 27, 2020

35 veces más rápido



Para la tesis de doctorado he escrito un programa que busca los patrones ajedrecísticos de acuerdo al lenguaje de descripción que definimos en este trabajo, y del cual he hablado ya muchas veces. El software -escrito en Delphi- permite buscar un patrón por segundo en toda una partida, en promedio. Desde luego, si es una partida de 20 movimientos la búsqueda tarda incluso menos. Si es una partida larga, 60 o más movimientos, probablemente la búsqueda del patrón se haga en un par de segundos.

Por supuesto que esta velocidad de proceso es muy lenta en términos de la velocidad de la computadora, aunque para los seres humanos usar un segundo por partida es extremadamente rápido sin considerar siquiera una remota posibilidad de poderlo hacer. De hecho, esto fue uno de los puntos en donde los revisores de mi artículo pusieron algunos peros. Tal vez los convencí indicando que el programa escrito buscaba ser una prueba del concepto investigado, es decir, el uso de patrones, y entonces terminaron por conceder que era un argumento razonable.

Pero desde luego que tardar un segundo por partida para hallar un patrón es lento. Y de hecho, llevaba ya tiempo dándole vueltas al problema. Si vemos los manejadores de partidas, como Chessbase, pueden hacer búsquedas -de posiciones, no patrones- en tiempos notables, por ejemplo, buscar una posición determinada puede llevarle unos 3 minutos en un conjunto de 7 millones de partidas. Y la pregunta es ¿cómo lo hace? Para poder acceder a estas velocidades hay que crear bases de datos de las partidas y manejarlas así. Por ejemplo, Chessbase tiene una serie de archivos de índice para esta tarea y es una de las explicaciones por las cuales sus búsquedas son más rápidas.

¿Sería la única alternativa? Decidí investigar una idea que tiene que ver con las búsquedas regulares, que además, ya he planteado antes en el blog. Entonces me di a la tarea de hacer un programa que mostrara la bondad de usar búsquedas regulares. En este caso el asunto sería de la siguiente manera: El patrón sería una cadena de caracteres, una cadena Forsyth (ver el articulo al que hice referencia para entender de lo que hablo) y cada partida sería una colección de cadenas de caracteres (posiciones) en formato Forsyth. Lo que tendría que hacer es ir recorriendo mi listado de posiciones y ver si pudiesen coincidir con la posición que define el patrón.

En las búsquedas regulares se usan "wildcards", comodines, que indican diferentes conceptos de búsqueda. Por ejemplo, el "?" significa que podemos poner cualquier caracter o símbolo en esa posición. Otro muy usado es "*", que generaliza la búsqueda a muchos caracteres o símbolos, sin importar cuáles sean estos. Por ejemplo, puedo buscar la posición: "???????k" o bien "*k". En la primera, busco siete símbolos pero el octavo debe ser una "k". En el segundo caso, puede haber un número, el que sea, de símbolos, antes de la "k". Desde luego que debe usarse cada símbolo considerando lo que tengamos en mente.

rnbqkbnr
pppppppp
11111111
11111111

11111111
11111111
PPPPPPPP  = 

rnbqkbnrpppppppp/11111111/11111111/11111111/11111111/PPPPPPPP/RNBQKBNR1111111111111111PPPPPPPPRNBQKBNR

Podemos quitar los "/" y tendremos:

rnbqkbnrpppppppp11111111111111111111111111111111PPPPPPPPRNBQKBNR

Ahora bien, supongamos que tengo el patrón del sacrificio griego:



111111r1
111111pp
111111X1
1111PX11
1111X111
111A1C11
11111111
111D1111

Esto es equivalente a la cadena de símbolos:

111111r1111111pp111111X11111PX111111X111111A1C1111111111111D1111

Las X son casillas que no deben estar ocupadas por ninguna pieza o peón en el momento de definir el patrón.

Si yo quiero buscar esta posición, lo que debo poner es:

??????k???????pp??????1?????P1??????1??????B?N?????????????Q????

Donde los escaques vacíos se ponen con "1".

El siguiente paso es poner una partida, jugada a jugada, en formato Forsyth, es decir, en este formato en donde se ve la partida, movimiento con movimiento como una cadena de caracteres. Por ejemplo, esta es una partida de ajedrez completa en formato Forsyth:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1
rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2
rnbqkbnr/pp1ppppp/8/2p5/4P3/2P5/PP1P1PPP/RNBQKBNR b KQkq - 0 2
rnbqkbnr/pp1p1ppp/8/2p1p3/4P3/2P5/PP1P1PPP/RNBQKBNR w KQkq - 0 3
rnbqkbnr/pp1p1ppp/8/2p1p3/4PP2/2P5/PP1P2PP/RNBQKBNR b KQkq - 0 3
rnbqkbnr/pp3ppp/3p4/2p1p3/4PP2/2P5/PP1P2PP/RNBQKBNR w KQkq - 0 4
rnbqkbnr/pp3ppp/3p4/2p1p3/4PP2/2P2N2/PP1P2PP/RNBQKB1R b KQkq - 1 4
rnbqkbnr/pp3ppp/3p4/2p5/4Pp2/2P2N2/PP1P2PP/RNBQKB1R w KQkq - 0 5
rnbqkbnr/pp3ppp/3p4/2p5/3PPp2/2P2N2/PP4PP/RNBQKB1R b KQkq - 0 5
rnbqkb1r/pp3ppp/3p1n2/2p5/3PPp2/2P2N2/PP4PP/RNBQKB1R w KQkq - 1 6
rnbqkb1r/pp3ppp/3p1n2/2p5/3PPp2/2PB1N2/PP4PP/RNBQK2R b KQkq - 2 6
rnbqk2r/pp2bppp/3p1n2/2p5/3PPp2/2PB1N2/PP4PP/RNBQK2R w KQkq - 3 7
rnbqk2r/pp2bppp/3p1n2/2p5/3PPB2/2PB1N2/PP4PP/RN1QK2R b KQkq - 0 7
rnbq1rk1/pp2bppp/3p1n2/2p5/3PPB2/2PB1N2/PP4PP/RN1QK2R w KQ - 1 8
rnbq1rk1/pp2bppp/3p1n2/2p5/3PPB2/2PB1N2/PP1N2PP/R2QK2R b KQ - 2 8
r1bq1rk1/pp2bppp/2np1n2/2p5/3PPB2/2PB1N2/PP1N2PP/R2QK2R w KQ - 3 9
r1bq1rk1/pp2bppp/2np1n2/2p5/3PPB2/2PB1N2/PP1N2PP/R2Q1RK1 b - - 4 9
r2q1rk1/pp2bppp/2np1n2/2p5/3PPBb1/2PB1N2/PP1N2PP/R2Q1RK1 w - - 5 10
r2q1rk1/pp2bppp/2np1n2/2p1P3/3P1Bb1/2PB1N2/PP1N2PP/R2Q1RK1 b - - 0 10
r2q1rk1/pp2bppp/2n2n2/2p1p3/3P1Bb1/2PB1N2/PP1N2PP/R2Q1RK1 w - - 0 11
r2q1rk1/pp2bppp/2n2n2/2p1P3/5Bb1/2PB1N2/PP1N2PP/R2Q1RK1 b - - 0 11
r2q1rk1/pp2bppp/2n5/2p1P2n/5Bb1/2PB1N2/PP1N2PP/R2Q1RK1 w - - 1 12
r2q1rk1/pp2bppB/2n5/2p1P2n/5Bb1/2P2N2/PP1N2PP/R2Q1RK1 b - - 0 12
r2q1r2/pp2bppk/2n5/2p1P2n/5Bb1/2P2N2/PP1N2PP/R2Q1RK1 w - - 0 13
r2q1r2/pp2bppk/2n5/2p1P1Nn/5Bb1/2P5/PP1N2PP/R2Q1RK1 b - - 1 13
r2q1r2/pp3ppk/2n5/2p1P1bn/5Bb1/2P5/PP1N2PP/R2Q1RK1 w - - 0 14
r2q1r2/pp3ppk/2n5/2p1P1bn/5BQ1/2P5/PP1N2PP/R4RK1 b - - 0 14
r2q1r2/pp3ppk/2n5/2p1P1b1/5nQ1/2P5/PP1N2PP/R4RK1 w - - 0 15
r2q1r2/pp3ppk/2n5/2p1P1b1/4NnQ1/2P5/PP4PP/R4RK1 b - - 1 15
r2q1r2/pp3ppk/2n1n3/2p1P1b1/4N1Q1/2P5/PP4PP/R4RK1 w - - 2 16
r2q1r2/pp3ppk/2n1n3/2p1P1bQ/4N3/2P5/PP4PP/R4RK1 b - - 3 16
r2q1rk1/pp3pp1/2n1n3/2p1P1bQ/4N3/2P5/PP4PP/R4RK1 w - - 4 17
r2q1rk1/pp3pp1/2n1n3/2p1P1bQ/4N3/2P5/PP4PP/3R1RK1 b - - 5 17
r4rk1/pp2qpp1/2n1n3/2p1P1bQ/4N3/2P5/PP4PP/3R1RK1 w - - 6 18
r4rk1/pp1Rqpp1/2n1n3/2p1P1bQ/4N3/2P5/PP4PP/5RK1 b - - 7 18
r4rk1/pp1q1pp1/2n1n3/2p1P1bQ/4N3/2P5/PP4PP/5RK1 w - - 0 19
r4rk1/pp1q1pp1/2n1nN2/2p1P1bQ/8/2P5/PP4PP/5RK1 b - - 1 19
r4rk1/pp1q1p2/2n1np2/2p1P1bQ/8/2P5/PP4PP/5RK1 w - - 0 20
r4rk1/pp1q1p2/2n1nR2/2p1P1bQ/8/2P5/PP4PP/6K1 b - - 0 20

Así, buscar posiciones se reduce a hacer una búsqueda regular en las cadenas de caracteres. La pregunta que me hacía es qué tan rápido sería.

Los programas de mi tesis están todos escritos en Delphi, porque tengo una serie dee bibliotecas que ya me hacen la tarea de dibujar los tableros de ajedrez gráficos, el movimiento de las piezas, etcétera. Entonces, lo que estaba necesitando era una biblioteca que hiciese búsquedas regulares. Hallé una rutina que usaba los comodines "*" y "?", la cual se discutía en este sitio. La copié y la implementé.



Entonces hice mi primera prueba y encontré que el software tardaba 32 segundos analizando 1030 partidas. Esto significó buscar el patrón en aproximadamente unas 32 partidas por segundo, lo que es equivalente a 32 veces más rápido que en el software de patrones original de patrones.

Pero recordé entonces que tenían en otro paquete una biblioteca de búsquedas llamada hyperstrings, la cual estaba escrita en buena parte en ensamblador, buscando ser muy rápida. Hurgué en mi respaldo (porque dicha biblioteca ya no está accesible ahora), y entonces la puse en mi sistema. En este caso el sistema tardó ¡19 segundos!, lo que significa 54 partidas analizadas por segundo, lo que ya me gusta más y que es casi el doble que con la primera rutina en Delphi.

Tomando en cuenta esto último, si el sistema puede buscar un patrón a una velocidad de 54 partidas por segundo, en 48 horas (dos días), podría hacer la búsqueda en unas 9 millones de partidas (la Megabase 2020 contiene menos de 8.5 millones de partidas). Originalmente había pensado que este análisis me llevaría entre 3 y 6 meses sin apagar la computadora.

Cabe señalar que para poder usar mi programa de búsqueda de patrones a través de posiciones Forsyth (FEN), se necesita pasar todas las partidas del archivo PGN (portable game notation) a Forsyth. GigaChess era mi esfuerzo en software para ello, pero hay dificultades, y esto tiene que ver con el sistema operativo, el cual por la propia interfaz gráfica es demasiado lento (véase https://la-morsa.blogspot.com/2019/08/un-misterio-sin-resolver.html).

Entonces se me ocurrió que ya alguien debía haber hecho esta tarea en Internet y sí, hallé este sitio: http://chessbrigade.com/pgnviewer/pgn2fen.html, pero solamente puede hacer la transformación de partida por partida. Sería interesante poder transformar todas las partidas en un archivo PGN. La solución la encontré aquí: https://queenalice.com/topic.php?id=18185, la cual transforma muy rápidamente un archivo de partidas en formato PGN a FEN (esto lo hace desde la consola porque es un programa de DOS). Cabe decir que acabo de hallar otro que aparentemente lo hace en Windows, pero no lo he revisado aún (https://www.bluechillies.com/details/8077.html).

En resumen, si se tiene ya un archivo PGN en formato FEN, mi software puede hacer la búsqueda de patrones unas 50 veces más rápidamente que con el programa original de patrones que había escrito. Y desde luego, para que sea útil, no solamente debe decirme que halló una o varias posiciones donde se da al patrón, si no que debe indicar en qué partidas ocurrió el patrón que estamos buscando. Ahora estoy trabajando sobre eso que ya me parece algo relativamente sencillo.

Seguiremos informando. Una vez que tenga todo funcionando, pondré mi software a disposición de quien le interese.

Monday, May 25, 2020

Finalmente se ha publicado mi artículo de patrones


Los que siguen mi blog saben que en los últimos años he trabajado en mi doctorado en ciencias de la computación, el cual realizo en la UNAM. Uno de los requisitos obligatorios es la publicación de al menos un artículo en una revista internacional arbitrada. El asunto supone que si se acepta en ese tipo de publicaciones, con académicos que no saben quién es uno, que finalmente sólo leen lo que único está investigando, pues debe tener valor. Esa idea parece que fue de Sandoval Vallarta, físico, profesor en el MIT y del Instituto de Física de la UNAM, quien alguna vez indicó a un reportero que le preguntó cómo es que la ciencia nacional podía validarse, su respuesta fue: "publicando en el extranjero". Y tiene su propia lógica viniendo de un país que es del tercer mundo. Por ejemplo, mi asesor estudió su doctorado en el Reino Unido y no había ese requisito e incluso, les sorprendía cuando le pregunta eso a sus tutores.

Como sea, después de casi dos años desde que mandé el primer borrador del artículo, finalmente lo aceptaron. Mi asesor me decía que no tomara a mal las correcciones que me hacían, pues no eran personales. Así que aguanté todo lo que me dijeron, corregí todo lo que me pidieron y finalmente fue aceptado y publicado -según entiendo- en el número de mayo 2020. Esta revista sale cuatro veces al año.



Así pues, requisito cumplido y además contento, porque creo que la contribución vale la pena, particularmente en los patrones de ajedrez, en los que llevo trabajando desde mucho antes de que entrara al doctorado.

Cabe decir que en estos días de cuarentena se me ha ocurrido que el lenguaje de descripción podría hacerse más robusto si le añadimos la capacidad de ser programable. Es decir, por el momento, en el artículo se analiza cómo describir posiciones en ajedrez de manera generalizada, lo que haría finalmente tener la posibilidad de describir los patrones en ajedrez, cuyo mérito es que muestran que no necesariamente hay que analizar profundamente en un árbol de variantes para encontrar la mejor jugada.

Por ello mismo, añadiendo capacidad de procesamiento de los patrones en bases de partidas, se podría tener un ambiente en donde podríamos eliminar los manejadores de bases de datos (de encuentros ajedrecísticos) y darle así independencia al lenguaje de descripción de este tipo de aplicaciones.

Ya hablaré más de esto en la medida que vaya progresando en el problema. Por lo pronto, como ya dije antes, creo que empiezo a ver la luz al final del túnel.

Saturday, May 23, 2020

La cuarentena, el semáforo epidémico y las mentiras del gobierno



Seguimos en cuarentena y ya en la Ciudad de México se ha anunciado que el semáforo rojo, es decir, la condición actual de la pandemia, nos mantendrá encerrados hasta el 15 de junio. Y se supone, de acuerdo a las predicciones de un grupo de matemáticos de los cuales nadie sabe quienes son, se empezarán a abrir las actividades, de las imprescindibles hasta las no imprescindibles. Es decir, actividades como la distribución de alimentos, que son necesarias e imprescindibles, no pueden detenerse. Pero actividades como las diversiones, los cines, los teatros, etcétera, que no son imprescindibles, no empezarán pronto.

Y desde luego, cuando empiecen a haber más actividades, que se abrirán gradualmente, puede haber rebrotes y entonces ya lo digo López Gatell, se tendría que regresar a la fase anterior, regresando a la cuarentena, aunque fuese más selectivamente. En resumen, todo el problema tiene tres vertientes: por un lado el hecho de que la pandemia no puede curarse con ningún tratamiento o vacuna, otro, que no se puede perpetuar la inmovilidad social de las ciudades y finalmente, el hecho de la miserable infraestructura médica gubernamental. Y es que el gobierno está preocupado porque requiere que los casos de contagio no sobrepasen cierta cantidad porque no habría manera de atenderlos. Y entonces nos hablan de la disponibilidad de camas y de respiradores todos los días, como si fuésemos primer mundo. Pedro hay historias de enfermos que han pasado un  vía crucis para ser atendidos.

Así las cosas, el asunto es que López Gatell nos dijo que el pico de la pandemia sería el 10 de mayo. Pero no solamente no se cumplió esa fecha, a pesar de lo que dijeron los matemáticos que hacen las predicciones y que el Secretario López Gatell ha anunciado como luminarias de la ciencia en México. Y ojo, entiendo que los modelos matemáticos fallan, pero decir una y otra vez que el pico sería en un día determinado y ver que no se cumple y que además, sigue creciendo la cantidad de contagiados, habla que algo estamos haciendo mal.

Y ya no voy a hablar de los números que presentan. Hay muchas voces que dicen que hay muchos más muertos de los que menciona el Gobierno Federal. Sea como sea, el asunto es que empieza a dar impresión de que todas las medidas han sido inadecuadas o bien que no se han cumplido como se cacarea, literalmente.

Termino con eso: apuesto doble contra sencillo que saldrá la Dra. Sheinbaum a decirnos que la cuarentena se extenderá hasta finales de junio y cuando estemos por llegar ahí, dirá que se alargará otros 15 días de julio. Y puedo entender las razones, pero estamos llegando al límite de esta cuarentena. Y ojo, ni siquiera estamos hablando de regresar a las escuelas, que se supone está planeado para agosto de este espantoso 2020. Así están las cosas. Yo ya no les creo nada a las fechas que propone el gobierno.

Más sobre las imágenes hechas con dados



Hace apenas un par de días escribí sobre la imagen de Michael Jordan, creada con dados, hecho por Barbara Lynn Helman, una ciberartista. La foto del basquetbolista está hecha con pequeños dados negros con puntos blancos. Después de elaborar una versión que ya tenía para hacer imágenes -pero con fichas de dominó- me di a la tarea de simular los dados. No fue difícil pues en Internet hay muchísimas imágenes de dados como los que necesitaba.

Pues bien, debido a que el tema me era familiar, decidí replicarlo por software, es decir, me iba a evitar comprar 5300 dados para hacer algún cuadro, pues iba a simular los mismos poniendo las gráficas correspondientes a cada cara del dado, de acuerdo al tono de gris que requiriera la imagen.

Sin embargo, como ya mencioné antes, mis resultados -usando la misma imagen que usó la artista- no lo replicaba. Sí, se parecía bastante pero por alguna razón la creación con dados reales se veía mejor que en mi simulación con dados virtuales.

Así descubrí que Barbara Lynn Helman había manipulado la fotografía de Michael Jordan. El fondo de la imagen original lo oscureció totalmente -lo cual tiene sentido si consideramos que las caras de los dados pueden dar apenas seis tonos de gris: el dado marcado con un punto es el más oscuro y la mula de seis es la más clara. Igualmente, Barbara cambió el contraste y el brillo dela imagen antes de procesarla, para que la creación quedara mejor. Así que decidí manipular la imagen y sí, los resultados empezaron a parecerse más, pero aún notaba que la imagen de la artista era más clara.

Entonces decidí ver por qué no se podía ver mi imagen procesada como la creada con dados reales. Vi el video de Barbara y hallé la razón: usa dados negros que tienen puntos blancos muy grandes. Por ello, algunas partes de su cuadro parece que tienen dados blancos pero no es así, es que el dado  marcado con los seis puntos se ve muy claro. La siguiente imagen muestra un fragmento del video. Obsérvese que los dados tienen puntos muy grandes.



Entonces rehice mis dados virtuales e hice unos con puntos gordos.


Y volví a procesar la imagen de Jordan, ahora con mejores resultados. Igualmente, le agregué un marco a los dados para que se viera que estaban separados unos de otros, aunque fuese por muy poco, para dar la sensación de ser dados independientes. Esto mejoró el asunto. Así entonces, ahora mi software puede generar dados simples, con marco y con puntos "gordos". De hecho, esta el la opción que da mejores resultados.

Este es el resultado final:



Podemos compararlo contra la versión anterior (a la izquierda). Esta última versión es más clara y la razón es simple: los puntos de los dados son más grandes.


Todas las pruebas que hice, en su tamaño original, pueden descargarse de este enlace.

Finalmente, hice un último experimento, pero hora tomé una de las fotos de Instagram de Barbara Lynn Helman, y este fue el resultado (que puede descargarse en su tamaño final de este otro enlace).



Creo pues haber encontrado el problema por el cual mi software sí, hacía estas creaciones muy parecidas a las de Lynn Helman, pero que no quedaban tan bien como su trabajo. De nuevo, a quien le interese el software, puede pedírmelo a morsa@la-morsa.com y con gusto se lo mandaré de forma gratuita.

Voy a dejar un nuevo video con las mejoras del software. Puede verse aquí abajo.



Friday, May 22, 2020

Fotografías hechas con dados



Recientemente vi un video de Barbara Lynn Helman, en el cual muestra una imagen del basquetbolista Michael Jordan, hecho con 5300 dados de color negro con puntos blancos. La idea de hacer imágenes con objetos no es realmente muy novedosa y de hecho, en el curso de Proceso Digital de Imágenes que imparto en la Facultad de Ciencias de la UNAM, muestro algunas ideas al respecto.



La primera vez que vi algo al respecto fue en el 2006, en un documental sobre el matemático Martin Gardner, a quien Ken Knowlton le había hecho un cuadro con piezas de dominós (ver aquí). Así que la idea de Lynn Helman, usando dados no era necesariamente muy original. El mérito de la artista es que usó 5300 dados físicos para armar la imagen de Michael Jordan.


Martin Gardner y su cuadro hecho con fichas de dominó

Como para el curso de Proceso Digital de Imágenes ya había hecho algo parecido con fichas de dominó, decidí hacer lo mismo pero usando dados. Fue un trabajo de un par de horas, pues ya tenía realmente el software escrito. Sin embargo, cuando tuve la primera versión modificada, me di cuenta que mi resultado no encajaba con lo que había hecho Barbara Lynn Helman.

El asunto va de la siguiente manera:

  • Tenemos seis posibles dados, del 1 al 6. El 1 es el más oscuro y el 6 es el más claro. Desde luego que con tan pocos tonos de gris, por decirlo de alguna manera, el resultado siempre es complicado para que salga bien.

  • Por otra parte, quería usar la misma foto que usó la artista y después de una media hora, finalmente la hallé en Internet.

La foto original usada por Barbara Lynn Helman

  • La artista manipuló la imagen de Jordan, poniendo en negro todo el fondo. Esto ahora lo sé porque tengo la imagen que usó originalmente.

  • Curiosamente hay una foto donde está el escritorio con la imagen a medio formar con los dados y la foto que usa no tiene modificado el fondo.


Así que tomé la imagen de Jordan. La recorté lo necesario tratar de hacer una imagen del mismo tamaño que uso Lynn Helman. Me guié del video que mostró la artista en Instagram.

Y entonces procesé la iamgen y en menos de un minuto tenía ya el resultado final. Este es el resultado:


La diferencia es que yo usé 6 imágenes el decidir qué cantidad de puntos iban en cada posición lo hizo el software automáticamente. La teoría al respecto es muy sencilla:


  • Tómese una imagen a procesar
  • Cuadricúlese la imagen en pequeñas regiones cuadradas (porque los dados son cuadrados). Entonces vea la primera región y calcule su tono de gris. Este será de 0 a 255. Hay que poner el dado que se acerque más a ese tono. Como tenemos solamente seis caras de un  dado, cada una contempla unos 42 tonos de gris. del 0 al 41 usé el dado con un punto. de 42 a 81 usé el que tiene dos puntos y así sucesivamente. Haga este procedimiento para toda la cuadrícula definida.
Si comparamos ambos resultados, hallamos lo siguiente:



El resultado prácticamente es el mismo. La única diferencia es que yo no tuve que conseguir 5300 dados negros con puntos blancos.

En realidad la arrtista Lynn Helman usó la conocida teoría de los semitonos, la cual ya expliqué aquí.

A quien le interese el software, escríbame a morsa@la-morsa.com y se lo mando gratuitamente por correo electrónico. Dejo más abajo un video sobre los pasos a seguir con la aplicación escrita para crear este tipo de imágenes.


Wednesday, May 20, 2020

La cuarentena interminable



La pandemia provocada por covid-19 parece que no se resolverá pronto. Y es que las mediciones de los enfermos, contagiados, intubados (¿no debería ser entubados?) siguen creciendo. El subsecretario de salud, López Gatell, había hablado del pico de la pandemia era, primero el 6 de mayo, después el 8 de mayo y finalmente hablaba del 10 de mayo. Y comentaba que esto era la predicción de un grupo de matemáticos capaces, coordinados por CONACyT.

Pues bien, ya el Dr. López Gatell ha olvidado esas predicciones y ahora parece que el pico de la pandemia será los primeros días de junio. Y entonces, en ciudades como la CDMX, se mantendrá la cuarentena hasta el 15 de junio. ¿Entonces? ¿Qué pasó con las predicciones? ¿Por qué ha fallado el modelo? Bien podrán decir que es un modelo y que no es una ciencia exacta. Pues muy bien, pues si es así, ¿para qué se la pasaron anunciando picos que no ocurrieron y fechas que no se dieron?

Ahora en la CDMX se seguirá inventando esta "nueva normalidad", porque ahora hay que seguir la nomenclatura que diga el Presidente. Por lo pronto, las universidades y las actividades escolares empezarán, si bien nos va, en agosto. Mientras tanto nos seguirán dando largas, explicando las razones para seguir manteniendo a la gente en sus casas, porque no parecen tener ninguna otra idea. En términos reales, si para septiembre no se está en un semáforo verde, estará claro que toda la gestión del gobierno habrá sido un fracaso.

En fin, la cuestión es que seguiremos en esta cuarentena que no parece tener fin. Vamos a ver qué pasa.

Tuesday, May 19, 2020

Las redes sociales y el Presidente de México



Hace unos pocos días, el Peje, el actual presidente de México, Andrés Manuel López Obrador, en una de sus conferencias mañaneras, dijo que había que pedir explicaciones a Facebook y Twitter, pues estaban llenas de "bots", los cuales desacreditaban las acciones de la 4T (palabras más, palabras menos).

No sé Facebook, pero Twitter contestó a las preguntas de nuestro tlatoani mayor indicando que el negocio de Twitter no era ni remotamente los bots, de lo cual se deslindaban de una buena vez. Esta respuesta apareció en Twitter pero... ¿qué dijo López Obrador? Fácil: que había recibido respuesta de la empresa Twitter, pero que no había podido saber lo que dice porque el mensaje venía en inglés y como todos saben, el Peje no habla inglés (ni como Peña Nieto).



Cuando escuché la declaración de AMLO pensé que era absurdo que el presidente de este país no hubiese tenido la iniciativa trivial de llamar a alguien para que le tradujera el dichoso mensaje. Pero la realidad es que caí en la ingenuidad. López Obrador sabe perfectamente que si el mensaje venía en inglés, alguien podría traducírselo. Entonces, ¿por qué dijo semejante barbaridad? Simple, porque el Peje quiere que sus votantes, las personas que están con él, se identifiquen con él.

Entonces, es sumamente probable que mucha gente que lo sigue ciegamente tampoco sepa inglés y entonces, estas personas podrán sentirse identificadas con la cabeza de la nación. Vamos, que es un truco del Peje para ganarse simpatía y empatía. Desde luego que hacer ese comentario es ponerse "en la foto" para ser criticado por ello. Pero eso es un costo nimio ante la certeza de ganarse simpatías con todos aquellos que cultural e intelectualmente son como él.

Alguien me había dicho, más de una vez, que el Peje es muy inteligente y que lo que dice -aunque parezca absurdo- tiene una intención más oculta. Ante ese comentario me quedé con la idea de que esto simplemente justificaba los dislates presidenciales que dice diariamente. Sin embargo, ahora -con este episodio- no estoy ya tan seguro de ello. En cualquier caso me parece una mala idea hacerse de una imagen tan lamentable para seguir pretendiendo ganarse a los votantes ¿o estoy equivocado?


Sunday, May 10, 2020

Reto de programación lúdica: Un ensamblador del 6502 escrito en algún lenguaje moderno



Hoy los procesadores son muy poderosos, corren a velocidades que ya van en los 4 GHz y pueden soportar 64 bits. Estos chips tienen incluido un conjunto de instrucciones que son las que gobiernan lo que hacen los microprocesadores a cada momento. Hay diferentes arquitecturas y conjuntos de instrucciones. Pero en el pasado no tan remoto, llegaron los primeros procesadores, que eran de 8 bits, con un bus de 16 bits de direccionamiento, lo que hacía que pudiesen tener hasta 64K bytes de memoria RAM para poder trabajar. Considerando lo que puede hacerse ahora esta cantidad de memoria parece muy limitante y lo es, porque los sistemas ahora requieren de toda una infraestructura de hardware para poder ejecutarse.

Sin embargo, los procesadores de 8 bits nos enseñaron muchas cosas, entre ellas, a programar en ensamblador, que es el lenguaje más cercano al lenguaje de máquina. Un microprocesador, como el 6502, que fue muy popular en las máquinas Commodore, Atari y Apple II, tenía un conjunto de instrucciones y éste a su vez una serie de modos para direccionar la memoria. Había, por ejemplo, instrucciones para guardar un dato de memoria de manera directa, o bien, que lo guardase en una localidad de memoria especificando un índice que salía de un arreglo. Los modos de direccionamiento enriquecían el lenguaje del procesador y lo que podía hacerse.

Desde luego que los códigos de la máquina tenían ya para ese entonces (principios de los años 1980s), una serie de códigos “mnemotécnicos”, los cuales se asociaban a los valores de las instrucciones porque no hay que olvidar, que al final de cuentas, la máquina solamente usa números. Así, por ejemplo, LDA significaba Load the Accumulator A, un registro del microprocesador y NOP simbolizaba la instrucción de No Operation, es decir, solamente gasta ciclos de reloj.

Con esta lista de pseudo códigos, un programador podía entonces escribir programas y estos se traducían a los códigos numéricos, que formaban el archivo binario que era finalmente un programa “ensamblado” por un sistema llamado “ensamblador”. El ensamblador era pues un editor específico para crear programas al casi más bajo nivel de cómputo y sin tener que escribir los códigos numéricos que representaban las instrucciones. Esta labor tediosa la hacía el ensamblador.

Con el tiempo, los ensambladores crearon un sistema para poner macroinstrucciones, es decir, un grupo de instrucciones en ensamblador que hacían una tarea en particular. Y de pronto el ensamblador era un poco más que un editor de programas, era todo un sistema que daba muchas más facilidades al que codificaba.



Encuentro ahora en la red un ensamblador para el procesador 6502 escrito en BASIC. La ventaja de este enfoque es que el sistema puede trabajar simplemente si se tiene acceso a algún intérprete o compilador del BASIC tradicional. Este ensamblador no requiere además de tener un microprocesador 6502, pero genera código para una máquina de estas características. A todo esto, si no tiene una computadora con un 6502, siempre puede usar un emulador, que los hay por decenas. Si está en ese caso, el programa en BASIC es realmente un “ensamblador cruzado”, es decir, corre en una máquina que soporta un conjunto de instrucciones, pero genera código para otro tipo de procesador.

La idea es pues: ¿sería usted capaz de escribir un ensamblador para un microprocesador como el 6502 o el 6800 (que es igualmente sencillo en sus modos de operación)? El reto tendrá como premio una taza de la Morsa. Si el ganador es de provincia, se le mandará un USB de 8 GB al menos, porque mandar una taza por mensajería es ridículamente costoso. Cabe señalar que este concurso busca simplemente alentar el trabajo de la programación y mostrar que puede ser lúdica. Es un concurso de buena fe. Si hay, por ejemplo, dos o más respuestas satisfactorias, ganará quien la haya mandado primero. El ganador cede su código fuente a la comunidad. Es decir, se promueve el código abierto.

Las respuestas al reto deben mandarlas a morsa@la-morsa.com.



El ejercicio es interesante y quien lo intente seguramente comenzará a tener una visión mucho más rica de lo que hacen los procesadores. Más allá del posible premio, hay una cuestión de satisfacción personal en realizar este tipo de trabajos. Así que manos a la obra, es decir, ¡Manos al teclado!


Wednesday, May 06, 2020

La interminable cuarentena


Desde el 23 de marzo, si es que la memoria no me falla, empezó la cuarentena en México. Con el pomposo nombre de "Jornada Nacional de Sana Distancia", el gobierno federal empezó a implementar las acciones para evitar que la pandemia nos fuese a agarrar desprevenidos. Y desde luego, el covid-19 llegó tarde que temprano. La razón es que la epidemia viaja en jet, como comentó el Dr. Antonio Lazcano en algún momento, es decir, gracias a cómo nos movemos los seres humanos hoy en día, el contagio puede ser muy, pero muy rápido.

Y llegó finalmente el primer contagiado confirmado... Y los medios hicieron su agosto vendiendo el terror. La pandemia iba a llegar y lo único que teníamos que hacer es estar lo mejor preparados posibles para darle pelea a la misma. Y es que hay dos problemas a resolver: como no existe vacuna o medicina que cure a quien se contagia de coronavirus, pues todos estamos en riesgo de que nos pase algo grave e incluso perdamos la vida. Por otra parte, los servicios de salud de México, sobre todo los públicos, siempre han sido poco menos que lamentables, con sus honrosas excepciones. Y entonces, la problemática es que si se enferma demasiada gente al mismo tiempo, el sistema de salud no va a ser suficiente y morirán personas que de otra manera quizás hubiesen podido salvar la vida.

Para taparle el ojo al macho, el gobierno ha empezado a soltar dinero, y ha comprado estos respiradores que parecen ser fundamentales para aquellos que pueden padecer lo peor del virus. Y en el camino tenemos un conflicto de intereses porque el hijo de Bartlett es quien ha vendido 160 millones de pesos al gobierno en estos equipos. Por otra parte, se han creado "hospitales covid" de la noche a la mañana e incluso un área de los Pinos se acondicionó para que lo usen un contingente de valientes médicos. Lo malo es que todas esas acciones suenan maravillosas, pero se enfrentan a la realidad de la burocracia mexicana. Yo no me la creo, y mucha gente estará conmigo, de que en el papel y los anuncios en las conferencias diarias, México es maravilloso. Pero ya teniendo que enfrentar la problemática en el mundo real, podemos esperar los escenarios más kafkianos... Y  no sé si me estoy quedando corto.

Los epidemiólogos entonces salen a hacer su trabajo. Se conoce el mecanismo de las pandemias y claramente el crecimiento de las personas contagiadas se vuelve exponencial... hasta que se llega a un pico y de ahí empieza a haber cada vez menos casos. Y entonces, de lo que se trata es de aplanar la curva, frase que se ha vuelto popular y que finalmente indica que lo que se quiere es que el incremento exponencial de los enfermos sea más lento, porque así nos da más tiempo para tratar (como país) a los enfermos.

La ciencia conoce estos modelos y los matemáticos, a la luz de los datos que se tienen incluso a nivel mundial, pueden dar predicciones y estimados de cuando ocurrirá cada fase del fenómeno. Por ejemplo, se estuvo mencionando que el 6 de mayo, es decir, el día en que escribo esto, se llegaría al pico y que entonces, en los siguientes días, empezarían a bajar los contagiados. Pero el Dr. Hugo López Gatell ya comentó que la fecha era una predicción "robusta" y a pesar de querer enfatizar en el poder de la ciencia, pues resulta que hubo que cambiar la fecha del pico de la pandemia para el 8 de mayo.

Pero curiosamente, López Gatell dijo que el cambio de fecha del pico no era necesariamente una mala noticia, porque esto implicaba que ganábamos tiempo aplanando más la curva. Y aseveró con toda honestidad que esto significaría que la salida de la pandemia podría llegar a ocurrir a fines de junio. Y dijo algo como que no se puede ganar en todos los frentes (aunque no fueron sus palabras textuales).

Pero el punto crítico, más allá de la pandemia, de los 2500+ personas fallecidas por el covid-19, está el tema económico. El mismo López Gatell indicó que no se puede mantener esta situación a perpetuidad. La actividad económica está en un mínimo y claramente tiene que empezar a liberarse la actividad económica, sea de manera escalonada, gradual, como quieran, porque la pregunta sería entonces: ¿Cuánto puede aguantar la economía de un país si se le cierra por N meses?

Y sí, lo sé, nadie quiere esto. Y sí, la vida es muy importante, vamos, fundamental. Nadie imaginó la problemática de un virus de estos ni las consecuencias del mismo, pero evidentemente el mundo, no sólo México está siendo rebasado. Y a todos nos agarró como con los dedos en la puerta, pero más allá de eso, hoy día, el propio gobierno -quien es el que tiene el poder para mantenernos en cuarentena- está cerca de tomar decisiones cruciales y probablemente no sean las mejores. Yo, por mi parte, ya me estoy haciendo a la idea de que ir a la UNAM después de mayo será aún poco probable. Y ojalá y me equivoque.

Friday, May 01, 2020

La luz al final del túnel



En esta cuarentena he estado trabajando en mi tesis de doctorado. Lo he hecho de manera errática, sin disciplina, pero las condiciones de trabajo no parecen ayudarme aunque sí, es más por procrastinar más de la cuenta, asumiendo que las horas pasan más lentamente que en un momento de no-cuarentena.

El punto es que he estado reflexionando en donde estoy en el doctorado y quiero creer que ahora sí veo la luz al final del túnel, para decirlo de una manera coloquial. Me explico: para obtener el grado de doctor (PhD), se requieren cumplir una serie de requisitos. Primero, poder publicar un artículo en una Conferencia Internacional. Así, me aceptaron un artículo en SugarLoafPLoP '16: Proceedings of the 11th Latin-American Conference on Pattern Languages of Programming que se llevó a cabo en Buenos Aires, Argentina en el 2016.

Aparte de esto, unos dos o tres semestres después, tuve que presentar el examen de candidatura, donde los sinodales, observan el trabajo realizado y miden si se van cumpliendo loos objetivos. Tuve cuatro de los cinco sinodales el día del examen (el quinto estaba de viaje), y me dieron recomendaciones sobre lo que tenía que hacer para seguir en mi investigación. Ya hablé de esto aquí.

Un tercer requisito, el cual me parecía el más complicado, fue el poder publicar un artículo en una revisat internacional arbitrada. Elegí la publicación de la ICGA (International Computer Games Association), donde han publicado los más destacados personajes del área. Mandé mi artículo y tuve que pasar por varias revisiones, las cuales, casi dos años después, me dieron la aceptación y el artículo se publicará en el número de mayo 2020. Esta fue quizás la parte más complicada, pues hay que aceptar las recomendaciones de los revisores, los cuales normalmente son bastante estrictos. Bueno, el requisito se ha cumplido y de nuevo, parece haber más luz al final del túnel.

Ahora lo que falta es generalizar una serie de resultados y trabajar sobre un álgebra que defina patrones para los juegos de suma-cero e información perfecta. Igualmente, tengo que empezar a eliminar un montón de texto de mi tesis porque lo que me parecía relevante antes ahora me parece simple paja. Ya mi asesor me dijo que esto es normal y que me aplique.

Así las cosas... Seguiremos informando.