Wednesday, April 24, 2013

Plática en el Politécnico


Miguel Angel Castillo me ha invitado a dar una plática en el Festival de Ajedrez que se organiza en Zacatenco. Hablaré de las nuevas herramientas computarizadas para ayudarse a estudiar. La cita es hoy a las 2 de la tarde en el Auditorio "Dr. Víctor Flores Maldonado", edificio 9, Unidad Profesional "Adolfo López Mateos", en Zacatenco. ¡Ahí nos vemos!

Tuesday, April 23, 2013

Hoy es mi cumpleaños

y además de los amigos que me han felicitado (incluso aquellos que hace tanto que no veo), de la alegría de saber que a uno lo quieren, de todas estas cosas buenas que pasan, me encuentrto en Google esta imagen (la que ilustra esta nota). Puse el cursor del ratón sobre la imagen y apareció la leyenda: "¡Feliz cumpleaños, Manuel!" Al darle click al logo de Google hecho con pasteles, me encuentro que me remite a mi perfil en Google+. Me pareció un gran detalle. Quiero creer que como estoy en Google+ y saben mi fecha de ciumpleaños, redireccionan a una página con este doodle.

Wednesday, April 17, 2013

Capablanca contra Eliskases, 1936


El genio cubano, José Raúl Capablanca, jugó cuatro veces contra Erich Eliskases. La fotografía de estos jugadores ocurrió cuando ya había Alekhine le había quitado el título mundial a Capa, al enfrentarse en Argentina, en 1927. Sin embargo, Capablanca mantenía siempre su fuerza y era un peligrosísimo rival.

Del total de partidas que jugaron, Eliskases y Capablanca quedaron 2-2 (cada uno con +1-1=2). La partida de la foto corresponde al Torneo de Moscú de 1936 en donde aparentemente se jugaba partida y revancha. Ahí el cubano hizo 1.5 puntos de dos posibles. Sin embargo el siguiente año, en Semmering/Baden, Eliskases vencería por la misma puntuación 1.5 de 2 posibles, a su poderoso rival. De hecho, la partida que Eliskases le gana a Capablanca (no es la de la foto), es un muy interesante final de alfiles, en donde Capa cometió un sutil error y terminó perdiendo.

La foto de Capablanca pensando me parece única. Nunca había visto algo así.

Eliskases, Erich Gottlieb - Capablanca, José Raúl
Semmering/Baden, 1937

1. d4 d5 2. c4 c6 3. Nf3 Nf6 4. Nc3 dxc4 5. a4 Bf5 6. Ne5 Nbd7 7. Nxc4 Qc7 8. g3 e5 9. dxe5 Nxe5 10. Bf4 Nfd7 11. Bg2 f6 12. O-O Rd8 13. Qc1 Be6 14. Nxe5 Nxe5 15. a5 a6 16. Ne4 Bb4 17. Bd2 Qe7 18. Bxb4 Qxb4 19. Qc5 Qxc5 20. Nxc5 Bc8 21. Rfd1 Ke7 22. b3 Nf7 23. e4 Rd6 24. Rxd6 Kxd6 25. b4 Kc7 26. Rd1 Rd8 27. Rxd8 Nxd8 28. f4 b6 29. axb6+ Kxb6 30. Bf1 Ne6 31. Na4+ Kc7 32. Kf2 g5 33. Ke3 gxf4+ 34. gxf4 Ng7 35. Nc5 Ne6 36. Nxe6+ Bxe6 37. Kd4 Kb6 38. Bc4 Bg4 39. e5 fxe5+ 40. fxe5 h6 41. h4 Bh5 42. e6 Be8 43. Bd3 Kc7 44. Kc5 Bh5 45. Bh7 Bg4 46. e7 Kd7 47. Be4 Kxe7 48. Bxc6 Be2 49. Bb7 Kd7 50. Kb6 Kd6 51. Bxa6 Bf3 52. Ka5 Bc6 53. Bb5 Bf3 54. Bd3 Bc6 55. Bc2 Kc7 56. Ba4 Bf3 57. b5 Kb7 58. b6 Be2 59. Bc2 Bf3 60. Bd3 Bg2

Eliskases - Capablanca
Semmering/Baden, 1937
Juegan las blancas

 61. Ba6+ Kc6 62. Bc8 Bf1 63. Bg4 Bd3 64. Bf3+ Kd6 65. Bb7 Be2 66. Ba6 Bf3 67. Bf1 Bb7 68. Bh3 Ke7 69. Kb5 Kd6 70. Bg4 Ke7 71. Kc5 Bg2 72. Bc8 Kd8 73. Ba6 Bf3 74. Kd6 Bg2 75. Bc4 Kc8 76. Bd5 Bf1 77. Ke6 Be2 78. Kf6 Kd7 79. Kg6 h5 80. Kg5 Kd6 81. Bf7 Kc6 82. Bxh5  1-0.

Saturday, April 13, 2013

El absurdo uso de las redes sociales


Leo lo siguiente en Facebook: "!!! ALERTA MIS AMIGOS Y AMIGAS !!! (compartido desde Tedi Kim). El domingo fue una familia de picnic y llevaron latas de bebidas. Lunes, dos miembros de la familia fueron ingresados a cuidados intensivos en el hospital. Murieron el día miércoles. Resultados de la autopsia concluyó que fue LEPTOSPIROSIS. El virus se encontraba en la parte superior de las latas, las que fueron consumidas sin el uso de vasos ni tazas. Los resultados de las pruebas mostraron que las latas estaban contaminadas con orina seca de ratón. La orina contiene LEPTOSPIRA".

Y continúa: "Recomendaciones: Lavar las latas antes de consumir directamente. Las latas son almacenadas en bodegas o galpones y se entregan directamente a las tiendas y supermercados sin lavarlas. Un estudio demostró que la parte superior de una lata contiene más gérmenes y bacterias que un baño público. Amigos y amigas: Toma las precauciones del caso, comparte y difunde esta información. Tus amigos te lo agradeceran".

Esta es la clásica información que mucha gente copia en sus muros de Facebook sin la mínima responsabilidad, sin siquiera revisar ninguna fuente. Tienen acceso a Google pero no investigan. Creen a la ciega todo lo que se publique en la red social.

Si quien puso el mensaje se hubiese preocupado de ver siquiera qué diablos es esta terrible enfermedad que mató aparentemente a dos miembros de una familia, aunque no hay ninguna referencia de nada, de país, de zona geográfica, de la identidad de los afectados, nada pues, habría visto en la Wikipedia que "la leptospirosis (también conocido como enfermedad de Weil o ictericia de Weill) es una enfermedad febril producida por la Leptospira interrogans, una bacteria del orden Spirochaetales, de la familia Leptospiraceae, que afecta a humanos y un amplio rango de animales, incluyendo a mamíferos, aves, anfibios, y reptiles". Así, de entrada, no es un virus, es una infección bacterial. Y hay diferencias notables entre virus y bacterias.

Ahora bien, leyendo en esta misma página de la Wikipedia, nos enteramos que: "El período de incubación es de 7-12 días (máximo de 2 a 20 días).7 En esta primera fase la enfermedad se muestra con síntomas similares a los del resfriado común, una presentación clínica que es muy similar al dengue, fiebre amarilla, malaria, influenza y muchas otras enfermedades tropicales, caracterizada por fiebre, dolor de cabeza y dolor muscular, haciendo que ese período inicial sea difícil de diagnosticar y orientar un tratamiento oportuno".

Pero más adelante dice: "La enfermedad dura desde unos pocos días hasta tres o más semanas, dependiendo de su gravedad. La mayor parte de las infectados presentan sólo una primera fase, presentando molestias leves o no presentado ningún tipo de molestias. La segunda fase puede ser grave y, si no es tratada debidamente puede provocar una recuperación lenta (meses), más raramente daños renales e incluso en casos extremos la muerte".

Así pues, la leptopirosis no mata a nadie en dos días, y menos a dos adultos que bebieron de latas que en la tapa tenían restos de orina de ratas, por asumir que de infectaron ahí. Ya no sigo. Creo que ha quedado claro que toda la historia de la familia en un picnic dominical se cae porque está llena de mentiras. Suena, desde luego, razonable el limpiar la lata del refresco que uno va a consumir y la advertencia puede ser sensata. Pero plantearla con esta historia ridícula, como si las latas tuviesen un virus como el del ébola o peor, pues es un exceso.

A mí me llama la atención esto. ¿Por qué hay este afán de poner mensajes alarmistas tan exagerados? Si no son como el mencionado, los hay peores: "Norcorea dispuesta a lanzar misiles nucleares" o "Se pronostica que un meteorito chocará contra la Tierra en marzo del 2062", o bien "El cambio climático podría provocar una nueva era del hielo en 50 años", etcétera. En ambos casos, estas lamentables noticias están más allá de lo que podemos hacer los seres humanos. Si Norcorea lanza un ataque nuclear, seguramente la borrarán del mapa los Estados Unidos y aliados. El problema es que si se llega a una conflagración nuclear, la radiación se esparcirá en todo el planeta con consecuencias poco amables, por decir lo menos. En el caso del meteorito que chocará contra la Tierra, presumiblemente en el 2062, podría acabar con la vida en el planeta y ¿saben? nadie podría hacer nada para evitarlo Finalmente, si el cambio climático produce una era del hielo nueva, tampoco podemos hacer nada. En resumen, ¿a cuenta de qué alarmarse de eventos en los cuales no tenemos control? ¿Es que hay quien le gusta vivir angustiado todos los días porque sólo hay noticias malas para el futuro? ¿Y cuántas de ellas se traducen en realidades? En mi opinión solamente son mensajes alarmistas que buscan vender la noticia... Y en las redes sociales -pienso- obtener la lectura de mucha gente, que entren muchos y lean la noticia fatídica de un futuro que quién sabe si llegue, pero que ahí lo ponen como inminente.

Cada día estoy más convencido que Facebook y Twitter son herramientas del Internet moderno que podrían ser muy útiles pero que se usan inadecuadamente. Ojalá y que esto cambiara, pero la realidad es que la tendencia que veo es precisamente la contraria.

Wednesday, April 10, 2013

El efecto AT&T y un nuevo reto de la programación lúdica

En 1988 Gerard Holzmann escribió un interesante libro sobre procesamiento de imágenes: "Beyond Photography - The Digital Darkroom". Pocos años antes, el autor trabajó con Rob Pike, Dennis Ritchie, Ken Thompson, entre otros, en los Laboratorios Bell, que a la postre lo adquiriera la empresa ATT. Debe haber sido fascinante interactuar con toda estas gente que trabajaba en tecnología con una pasión desbordada. Ahí nació, por ejemplo, el sistema Unix y el lenguaje C, que no son poca cosa. Hasta donde recuerdo, los Laboratorios Bell tenían a 8 premios Nobel entre sus empleados.



El libro de Holzmann se puede conseguir en Amazon, pero nuevo cuesta 133 dólares. Hay copias usadas por unos 10 dólares. Sin embargo, el propio autor ha puesto una copia en pdf de forma gratuita, y que puede consultarse aquí.

En dicha obra, el el capítulo 4, Holzmann se dedica a experimentar con diferentes filtros gráficos. Muchos de ellos eran meros experimentos bajo la premisa "a ver qué pasa si aplicamos esta ecuación sobre la imagen". Y probablemente muchos de esos experimentos no fueron publicados. Sin embargo, uno de ellos me pareció interesante. Cito al autor en la página 42: "Por alguna razón, el retrato de Peter Weinberg siempre fue el objetivo principal en nuestro experimentos de edición de imágenes.  Todo empezó un par de años antes cuando Peter ascendió a jefe del departamento y a su notoria distracción de dejar su cuadro con su imagen en cualquier parte. Una tarde de sábado, que estábamos bromeando, Rob Pike y yo empezamos a hacer fotocopias de dicha fotografía de Peter, enfatizando la jerarquía administrativa existente cuando preparábamos una gráfica de la estructura de los Laboratorios Bell. Jugando poníamos a Peter en todos los posibles puestos. El propio Peter pronto se dio cuenta de esto y debe haber llegado a la conclusión de que lo mejor que podía hacer era no reaccionar a este asunto. Así al menos él esperaba que su imagen no fuese aparecer magnificada en alguna de las torres de agua del Laboratorio. No obstante, la foto de Peter aparecía y desaparecía en los lugares más extraños.

Un par de semanas después de que ATT revelara el nuevo logotipo corporativo, Tom Duff hizo una imagen de Peter al estilo de dicho logo y se convirtió en el símbolo de nuestro centro de trabajo. Rob Pike mandó hacer camisetas con la foto "ATT-izada" de Peter y Ken Thompson ordenó tazas de café con el logo de Peter. E inevitablemente el 16 de septiembre de 1985 apareció el logo de Peter en una de las torres de agua".

¿Cómo se pueden hacer imágenes de las personas basadas en el logotipo de ATT? Aparentemente Duff fue el autor del filtro y Holzmann no indica cómo se hizo. En consecuencia, hubo que partir de cero información. Consideremos la imagen original y el resultado mostrado por Holzmann:



El logo de ATT es éste:


A partir de esto es claro que las imágenes deben ser de blanco y negro estrictamente. La solución es pues una combinación de filtros. He aquí los pasos a seguir:

  1. Tómese una imagen
  2. Si es de color, pásese a tonos de gris
  3. Ya en tonos de gris, aplíquese el filtro alto contraste
  4. A esa imagen resultante, aplíquese el filtro ATT

Pasar a tonos de gris una imagen es uno de los filtros más comunes. En una imagen en tonos de gris tenemos que cada pixel tiene en sus componentes R=G=B, es decir, la tripleta (Rojo, Verde, Azul) (o (R,G,B) por sus siglas en inglés), tiene los mismos valores. Las imágenes de tonos de grises contienen a lo más 256 tonos diferentes (de (0,0,0), el negro, al (255,255,255) el blanco). Aquí hay dos formas de hacer esta transformación, usando para cada pixel una de las dos posibles ecuaciones:

(1) Gris = (R + G + B) / 3
o
(2) Gris = (0.30 * R) + (0.59 * G) + (0.11 * B)

Ahora bien, una vez teniendo la imagen en tonos de grises, aplicar un filtro alto contraste es fácil. Se recorre la imagen pixel por pixel. Se calcula el número de color, el cual se basa en la siguiente fórmula:


Número de color = (65536 * R) = (256 * G) + (B)

donde las componentes en el modelo R,G,B son: R el componente en rojo, G el verde y B el azul. Si éste número de color es mayor de 8 millones, entonces ponemos un color blanco. Si es menor de ese número, ponemos un color negro. Así, una imagen en tonos de grises se transforma en una imagen en blanco y negro, como en el siguiente ejemplo.


Y ahora está el problema de crear la imagen usando un filtro “ATT alike”. Pero aquí no diré cómo hacer esto (hasta que acabe el reto). Cuando aparezcan los resultados explicaré el filtro a detalle. Es decir, parte del reto es discurrir cómo se puede hacer un filtro de esta naturaleza y no sólo seguir la descripción que pueda hacer yo del mismo. Así pues, el reto tiene este giro adicional, con respecto a retos anteriores.

Los resultados fueron bastante satisfactorios y además, el software crea este tipo de imágenes de forma relativamente rápida. Por ejemplo, he aquí la imagen procesada con regiones de 9 pixeles y otra con regiones de 20 pixeles. Mientras más pixeles por región, más anchas son las franjas oscuras. ¿Cuál de los dos resultados le gusta más?
                 9 pixeles                             20 pixeles

Considerando todo esto, el siguiente reto de la programación lúdica es hacer el filtro ATT. En este caso no se describe cómo funciona ese filtro ATT y el programador que participe debe hallar cómo generar dicho filtro. Es decir, se complica un poco más el asunto, pues la descripción del filtro no se da. Cada quien tendrá que hallarla. Así pues, este reto es aún más complejo que el del filtro óleo.

He aquí las bases adicionales del reto:

  • Ganará el programa que transforme la imagen de Peter Weinberger (que aparece más abajo), en el menor tiempo posible. El segundo mejor tiempo obtendrá el segundo lugar. Desde luego, el resultado debe estar de acuerdo con la definición del filtro ATT del cual hemos hablado.
  • Habrá dos lugares: Ambos se llevarán una taza con el logotipo de La_Morsa. Mi intención es que al imprimir esas tazas aparezca una leyenda con el título de la misma y el lugar obtenido, para que quede constancia por el tiempo de vida de la taza.
  • Los programas pueden hacerse en cualquier lenguaje de propósito general y no se vale usar en éste particularmente, bibliotecas que hagan filtros gráficos. Los programadores tienen que resolver el problema por sí mismo, sin ayuda de bibliotecas externas. (Desde luego, se vale usar alguna biblioteca para cargar/guardar la imagen de Weinberger para procesarla, la cual es un JPG, pero nada más). Así pues, C, C++, C#, Pascal (Delphi), Javascript, Python, Ruby, Visual BASIC, Visual C, Java, etcétera, son idóneos para esta labor.
  • Los autores de los programas deberán mandar el código fuente y el archivo ejecutable en Windows 7.
  • Un autor puede mandar versiones mejoradas de su propio software dentro del tiempo del concurso. No se tomarán en cuenta las que se salgan del tiempo establecido.
  • En la medida de lo posible, el programa debe indicar el tiempo total del proceso realizado para crear la imagen tipo logo de ATT de Weinberger
  • El autor debe enviar el código fuente y quienes ganen aceptan que su código quede accesible para quien lo quiera ver.
  • Los programas deben poderse ejecutar en el sistema operativo Windows 7 de 32/64 bits. Se correrán en una máquina AMD con 6 núcleos y los resultados obtenidos son inapelables y definitivos. De nuevo aclaro: este es un reto de buena fe y no un concurso estrictamente. Los premios son meramente un estímulo extra para que se animen a entrarle al reto. Evidentemente asumo que el código de cada concursante es creación del mismo y que no andan copiando el código de otras partes, foros, sitios en Internet, etcétera. En caso de hallar que el código fue copiado, el programador queda descalificado.
  • El reto dura una semana a partir del día de la publicación del artículo. Por ejemplo, si éste se publica un 10 de mayo a las 3 de la tarde, el reto se cierra el 17 de mayo a esa misma hora.
  • Cuando reciba algún programa participante en el reto, le enviaré un acuse de recibo para asegurarnos que están todos los que son y son todos los que están.
  • El concurso es para quienes viven en la República Mexicana. Si alguien de otro país quiere participar es bienvenido, pero no podrá acceder a los premios (puede haber excepciones).
  • Los programas deben ser enviados a morsa@la-morsa.com o en su defecto a lopem@hotmail.com, por si alguna de las direcciones no funciona.
Así que queridos y entusiastas programadores, a entrarle al reto. Afilen sus herramientas de programación y que gane el mejor.

Imagen a procesar:


A quien le interese el filtro ATT, puede pedírmelo a morsa@la-morsa.com y a vuelta de correo lo recibirá sin costo alguno.

¡Ganadores del reto Óleo!


¡Tenemos ganadores! Este nuevo reto de la programación lúdica dio buenos programas, software de calidad, que demuestra que hay talento y neuronas para resolver los problemas de programación que surjan. Me queda claro que hay en este país mucha gente capaz en lo que se refiere a escribir código y es algo que debemos valorar. Después de ejecutar los programas de quienes participaron en el reto Óleo, se llegó a la siguiente tabla de resultados:

  • Fabián Vargas Quijano     0.336 segundos (ganador)
  • Rafael Mendoza                0.530 segundos (segundo lugar)
  • Juan Claudio                        0.630 segundos
  • Humberto Floriano               1.635 segundos
  • Sergio Avendaño                  1.840 segundos
  • Guillermo Canedo                2.421 segundos
  • Christian Israel                     2.963 segundos
  • Alex Zúñiga                         3.467 segundos
  • Manuel López Michelone    19.19 segundos (no participa)
  • Ernesto Valderrama             26.00 segundos (estimado)

En esta ocasión hubo menos participantes, pero asumimos que esto se debió a que el reto era más complicado. Sin duda que el ganador, Fabián Vargas, de Colombia, hizo un muy buen trabajo, pues la imagen de Lena la convirtió en una tercera parte de un segundo. Asombroso. El segundo lugar, Rafael Mendoza, logró un muy buen tiempo, aproximadamente medio segundo.

Fabián Vargas, ganador de este reto


Los archivos, con el código fuente y los respectivos ejecutables, pueden obtenerse aquí:

  •     Para el programa de Fabián Vargas, descargarlo de aquí.
  •     Para el programa de Rafael Mendoza, descargarlo de aquí.

No pongo el código fuente de los programas ganadores en este artículo porque tienen cierta complejidad y ocupan mucho espacio.

Rafael Mendoza, segundo lugar


Rafael Mendoza me mandó, en el transcurso del reto, varias versiones de su programa. En uno de sus mensajes me dice: Quizás no sea el más rápido, pero el haberlo hecho ya me hace ganador ya que primero me había rendido y después de investigar como tratar las imagenes con C#, empece y bueno, aquí está, tengo la idea de como mejorar el tiempo pero la verdad no he podido implementarlo.

Así pues, el esfuerzo tuvo más que recompensa.

El tercer lugar, Juan Claudio Toledo, (ganador del reto Collatz, a todo esto), me mandó un programa que por alguna razón en mi Ubuntu no corrió. No hacía nada. Le pedí me mandara información de la corrida en su máquina como las características de la misma y me da la impresión que por los datos que envió, en hardware es más o menos equivalente a mi máquina de pruebas. Tomo los tiempos que Juan Claudio me dio, con la promesa de que si puedo hacer correr su programa y además, corre más rápido que el primero o segundo lugar, le daré una taza de La_Morsa, aunque sea “post-mortem”.

Con respecto al programa de Ernesto Valderrama, lo escribió en Ruby, que es un intérprete (no es la mejor idea para competir contra otros sistemas que generan código nativo), usando una biblioteca para cargar imágenes llamada rmagick. Quise instalarlas y aún consultando con Ernesto e intercambio muchos mensajes, no lo logré. Entonces le pedí que corriera su software y me diera el tiempo estimado de procesamiento. Igualmente le pedí que me diera las características de su máquina y con esos datos saqué el tiempo estimado que habría tardado su programa en la máquina de pruebas. Desde luego que puedo estar equivocado pero el margen de error no representa “riesgo” para los que ganaron el reto, pues sus tiempos son demasiado cortos contra el que me envió Ernesto. Aún así, agradezco el interés por resolver la problemática.

¡Felicidades a ambos participantes! Y los esperamos en el siguiente reto, que promete ser complejo y emocionante. Gracias a todos por participar.

Sunday, April 07, 2013

¿Por qué las redes sociales no sirven?

La pregunta parece fuera de lugar, considerando que hay millones de personas que las usan diariamente. Sin embargo, a mí me queda cada vez más claro que es una afición más, como perder el tiempo platicando con extraños en un chat. La razón es sencilla: en las redes sociales, Facebook y Twitter, por ejemplo, la gente pone pensamientos, denuncias, reclamos, textos o carteles para hacernos pensar, etcétera, pero no hay más allá.

Pongamos un ejemplo: veo un cartel en donde aparece una mujer sangrando de la cabeza y al lado un niño de unos 9 o 10 años llorando. Aparentemente es el hijo de esa señora. La historia es dramática y no tiene caso repetirla aquí. La cuestión es que una vez que alguien "denuncia"  en Facebook el hecho, entonces otros feisbuqueros ponen comentarios indignándose por la situación. Y los entiendo, es horrible lo que se denuncia., pero... ¿qué hacemos? ¿qué sigue? La respuesta es más indignante aún: NADA.

Y menciono esto porque precisamente a la persona que hizo esa denuncia visual en Facebook, así como a todos los que se indignaron, les pregunté ¿qué seguía hacer, qué acciones tomar? En lugar de dar alguna respuesta al respecto empezaron los ataques a mi persona. Alguien me inquiría ¿y tú qué haces? Le contesté que nada, porque le dije, de entrada, que yo no ponía carteles ni mensajes de ninguna injusticia en donde no hiciese algo realmente. Le comenté además que asumía que quien pone una imagen como la que nos ocupa, estaba involucrado en el tema y suscribía y se hacía eco del mismo. Así pues, no se trataba de si yo hacía algo, sino de qué hacían todos ellos que se indignan por la injusticia, ¿dónde están? ¿qué hacen?

Hubo quienes pusieron incluso "me gusta"  a mis comentarios, como otros que quisieron discutirlos. La persona que puso la imagen en cuestión, ante la imposibilidad de refutar lo que le decía contestaba "jajajaja", lo cual sólo habló de la pobreza de sus argumentos. Finalmente quien inició el tema decidió borrar el artículo y se borraron todos los comentarios, buenos y malos. Linda respuesta a la verdad irrefutable: hay muchos usuarios de las redes sociales que son quasi-revolucionarios, nomás que son de teclado y pantalla. No se saldrán de su zona de confort. No harán jamás nada en la realidad, pero eso sí, podrán perder horas haciendo carteles con photoshop para denostar a quien les caiga mal, o bien, para burlarse del político en turno. Para eso tienen todo el tiempo del mundo.

Las redes sociales no servirán jamás si no hay acción detrás de ellas. Los gobiernos lo saben. Por eso ignoran todas esas imágenes burlonas, de denuncia social, de rechazo a la imposición, que aparecieron después de las elecciones presidenciales. Saben ellos que los internautas estánb muy cómodos en sus casitas y que no pasará de poner en este mundo virtual la denuncia, la queja, la burla, pero que en el fondo no harán nada y por eso están muy tranquilos saqueando al país.

Les dejo una caricatura que apareció en Milenio Diario, que pinta de cuerpo entero cómo nos comportamos en general -como comunidad virtual- dentro de estas redes sociales:

Dé click en la imagen para agrandarla

Thursday, April 04, 2013

Paradigmas en programación... ¿verdad o mentira?


Los lenguajes de programación se basan en diferentes paradigmas. Unos son imperativos. Otros usan la lógica de predicados para funcionar (como Prolog), otros más han definido la programación orientada a objetos, con los subsecuentes beneficios que esto tiene en general para los desarrolladores. Por ello, parece ser necesario saber de qué se trata esto para poder decidir -en algún momento- cuál es el lenguaje a usar.

Curiosamente, como veremos más adelante, hay algo perturbador en esta idea de los paradigmas en los lenguajes de programación y la conclusión a la que llegaremos resulta en alguna medida, inesperada. Entremos pues en materia:

Consideremos las redes semántica, las cuales se representan comúnmente como gráficas consistiendo de nodos que se conectan a través de líneas. Los nodos representan objetos y los enlaces entre nodos representan las relaciones entre esos objetos.

Una red semántica simple puede verse en la siguiente imagen:



Nótese que los enlaces son flechas, lo cual implica una dirección. Así, el perro persigue al gato pero éste no persigue al primero. Esto podría ocurrir pero la red semántica no lo plantea explícitamente.

Las redes semánticas plantean una manera muy intuitiva de representar conocimiento sobre objetos y las relaciones entre ellos. Los datos de una red así se basan en un dominio en particular. Esto hace que el esquema sea limitado. Por ejemplo, no podemos establecer la regla de que "el perro no es un gato".

Cabe decir que muchas de las relaciones son evidentes por sí mismas, pero hacen uso del conocimiento externo que tenemos del mundo. En principio, deberíamos definir dichas relaciones para evitar ambigüedades.

Herencia

Es una relación que puede ser particular útil. La idea de la herencia se entiende fácilmente de forma intuitiva. Por ejemplo, decimos que los mamíferos dan a luz bebes vivos y podemos decir también que todos los perros son mamíferos por lo que podemos concluir que un pero da a luz mamíferos vivos. Sin embargo, no estamos diciendo nada sobre el sexo del perro y por ello la relación no necesariamente sería cierta.

La herencia nos permite especificar propiedades de una superclase y así poder definir una subclase, la cual hereda las propiedades de la superclase. En nuestro ejemplo los mamíferos son una superclase y los perros una subclase.

Frames (marcos)

Los marcos son un desarrollo de las redes semánticas y permiten expresar la idea de herencia. Un sistema de marcos consiste en un conjunto de marcos (o nodos) quienes están conectados por una relación. Cada marco describe una instancia (un marco instancia) o clase (marco clase).

En este contexto, los objetos que se representan son objetos físicos pero no necesariamente tienen que serlo. Un objeto puede ser una propiedad (un color, una forma), un sentimiento, un lugar, una situación. La idea de los objetos en este sentido es idéntica a los que se ven en la Programación Orientada a Objetos (POO).

Cada marco tiene una o más ranuras, también podrían llamárseles "propiedades, a las que se le asignan valores. Esta es la manera en que una red de marcos se construye. En lugar de simplemente tener enlaces entre marcos, cada relación se expresa con un valor en una de las ranuras.

Por ejemplo, cuando decimos que "Fido es un perro" lo que queremos decir es que "Fido es una instancia de la clase perro"  o bien, que Fido es un miembro de la clase perro". Aquí la relación "es un" (is-a) es muy importante en una representación de marcos porque nos permite expresar que alguien es miembro de una clase. Esto se conoce como una generalización porque referirse a la clase de mamíferos es más general que referirse a la clase de perros y referirse a la clase de perros es más general que referirse a Fido.

Es también útil hablar de un objeto que es parte de otro objeto.  Por ejemplo Fido tiene cola, por lo que la cola es parte de Fido. Esto se llama agregación porque Fido puede ser un agregado de las partes de un perro.

Otra relación es la asociación. Un ejemplo es la relación de "perseguir" Esto explica cómo un perro y un gato están relacionados o asociados uno con el otro.

¿Por qué usar marcos?

La ventaja principal de usar sistemas de marcos es que la información de un objeto se encuentra toda en un solo lugar (esto es clásico en el paradigma de la POO). Además, la herencia puede extenderse de la siguiente manera. Por ejemplo:

Los perros persiguen a los gatos
Los gatos persiguen a los ratones

Para expresar este tipo de información, no necesitamos saber que el perro persigue al gato o que éste último persigue a los ratones. Podemos heredar la información porque un gato en particular podría ser una instancia de la clase gatos y en nuestro ejemplo, Fido es una instancia de la clase perro.

Podemos además añadir la siguiente información:

  • Los mamíferos respiran
  • Los perros son mamíferos
  • Los gatos son mamíferos

Y tenemos una superclase, mamíferos, en donde los perros y gatos son subclases. Así, no necesitamos expresar explícitamente que los perros y gatos respiran porque se puede heredar esta información.

Herencia múltiple

Es posible en un marco heredar propiedades de otro marco. En otras palabras, una clase puede ser una subclase de dos superclases y el objeto puede tener una instancia de más de una clase. Por ejemplo, podemos decir que el hombre es un constructor de casas, y que además, es un mamífero. Esto es la herencia múltiple, pero en mi opinión, es absurda si se tiene un sistema con una jerarquía bien armada. A la fecha, de hecho, no he hallado un ejemplo de la necesidad de herencia múltiple para representar conocimiento.

Procedimientos

En la POO las clases (y de hecho los objetos), tienen métodos asociados a ellos. Esto también ocurre con los marcos. Estos tienen métodos asociados a ellos llamados procedimientos.

Un procedimiento es un conjunto de instrucciones asociados al marco que puede ser ejecutado a petición. Por ejemplo, un procedimiento lector de las propiedades puede regresar un valor particular dentro del marco. Otro procedimiento puede insertar un valor en una propiedad. Un procedimiento importante es el constructor de una instancia, el cual crea la instancia de una clase.

Y si pensamos en esto, una red semántica dirigida (los marcos, pues), son un equivalente a la programación orientada a objetos, en donde se definen las propiedades de los mismos, los métodos que pueden usar y la herencia. Solamente quedaría duda de cómo usar el polimorfismo, es decir, cuándo se debe usar un procedimiento de un objeto u otro. Evidentemente esto se puede hacer y entonces, cualquier lenguaje basado en el paradigma de la POO puede ser usado para escribir programas " inteligentes". Es más, hay una clara equivalencia entre los marcos y la programación basada en la lógica de predicados y por ende, si podemos expresar un marco en la POO o bien, en la lógica de predicados, entonces en el fondo no hay un cambio de paradigma. Lo que parece ser que realmente tenemos es un esquema ded representación de conocimiento que no distingue entre paradigmas, porque en el fondo todos los lenguajes que expresan y representan conocimiento, hacen lo mismo.

Este resultado me parece asombroso en cierta medida. Así pues, no hay necesidad de elegir un lenguaje de programación que use un paradigma u otro, cualquiera puede usarse para representar conocimiento de la misma manera.

Wednesday, April 03, 2013

De árbitros y reglas


Hoy leo, en el periódico, que hay una pequeña crisis en el futbol mexicano. Aparentemente la semana pasada estuvo llena de fallos en el arbitraje de la liga de futbol MX. Expulsiones indebidas, tarjetas de amonestación exageradas, decisiones equivocadas, las cuales dejaban a un equipo literalmente en la indefensión. Y el punto es que en mi opinión, al contrario de lo que dice el Presidente Ejecutivo de la Liga MX, Decio de María que simplemente aclara: "Creo que es un tema que preocupa, pero no para calificarlo de crisis ..."

Pero la realidad es que las decisiones de los silbantes afectan en los resultados finales de los encuentros y entonces el futbol se vuelve un deporte injusto, el cual se decide muchas veces por una decisión errónea del árbitro.

La realidad -en mi opinión- es que la estructura del arbitraje en el futbol está totalmente equivocada. El hecho de que por tradición, si se quiere, exista sólo un árbitro, el principal, con los respectivos abanderados en las laterales de la cancha, hacen que el trabajo del silbante del encuentro sea lo más parecido al infierno: persigue una pelota los 90 minutos del encuentro pero no puede jugar con ella, tiene que tener vista de lince para reconocer una falta en un instante determinado, tiene que tener mil ojos para tomar decisiones casi al vuelo sobre todo lo que acontece en el terreno de juego y la verdad, es un trabajo proclive al error.

En deportes como el futbol americano, por ejemplo, hay un árbitro principal, pero se ayuda de no sé cuántos jueces auxiliares que monitorean cada jugada que se realiza en el juego. Un error, un movimiento ilegal y salen a relucir los pañuelos amarillos indicando que el proceso fue defectuoso. El árbitro principal toma las decisiones finalmente, pero es claro que su grupo de ayuda le hace la labor más sencilla. En cambio, en el futbol soccer el árbitro tiene una compleja labor y prácticamente está solo.

Y miren ustedes. La idea de un  árbitro es para que se respeten las reglas del deporte en cuestión. En ajedrez, por ejemplo, en algún momento hubo una regla, en donde el jugador debía reclamar si el rival perdía por tiempo. Si no se hacía el reclamo en el momento correcto, entonces el infractor podría no ser penalizado por ello. Después, me parece, la FIDE cambió la regla y entonces el árbitro puede decir cuando un jugador sobrepasa el tiempo de reflexión sin necesidad de esperar que el rival de dicho jugador se dé cuenta de esto.  Suena más sensato que el árbitro sea quien penalice a quien cometió la falta pues para ello está. Es su función. La idea, al final del día, es que se cumplan los reglamentos del deporte del que estemos hablando.

Por ello, pienso que la solución de De María está fuera de lugar: "más capacitación a los árbitros". Y es absurda la idea porque repito, la carga y responsabilidad que tiene un silbante en un partida es demasiado para una persona. Por ejemplo, ¿qué tal poner más de un árbitro, digamos uno para cada mitad de la cancha? Eso seguramente eliminaría errores de juicio causados por cansancio, por correr tanto en la cancha e ir observando todas las acciones. Repito ser árbitro de un partido de futbol es demasiado complejo y sujeto al error por la cantidad de juicios que debe hacer a cada instante el árbitro sobre todas las jugadas.

Tal vez como me dijo una vez Silvio Pla: No cambian las reglas de futbol, no se ponen más árbitros, no se usa la repetición instantánea en caso de jugadas dudosas, porque eso provoca la polémica al día siguiente en los medios. Se habla entonces toda la semana de las pifias de los árbitros, de todo lo que se marcó mal, etcétera. Da la impresión que la FIFA no piensa cambiar nada de eso porque eso hace más popular el juego al tener a los medios hablando de él todo el día.