miércoles, 9 de diciembre de 2015

Convertir bases de datos de ajedrez en PGN a tablas de datos MySQL

¿Por qué?


El estándar para guardar partidas de ajedrez es el formato PGN (Portable Game Notation). No ha sufrido cambios desde su última versión estable debido a su sencillez. Adaptación de las bases de datos de partidas de ajedrez a tablas MySQL, enriqueciendo y favoreciendo las relaciones y búsquedas con sistemas pensados para ello. Estandarización de este sistema para permitir que nuevos usuarios generen ejemplos y nuevos desarrollos.

Objetivos:


  • Repositorio de utilidades sobre ajedrez con licencia de acceso libre.
  • Adaptar bases de datos de ajedrez en formato PGN a MySQL o similar.
  • Relacionar columnas en las bases de datos de ajedrez y propiciar DIY.
  • Acceso de terceros a un servidor de partidas a través de APIs.
  • Reducir duplicidad de bases de datos de ajedrez en internet.





El formato PGN. Portable Game Notation

El formato PGN es un formato de texto (ASCII) para guardar partidas de ajedrez. Surge antes de la primera década del año 2000 a raíz del formato de jerarquías XML y de la necesidad de estandarizar las anotaciones de partidas de ajedrez para desarrolladores de interfaces gráficas y webs.  La guía de implementación y estandarización del formato PGN se puede encontrar en directorio de Andreas Saremba, uno de los coordinadores del grupo de desarrollo.

El ajedrez en la web 2.0

Magnus Carlsen, el mejor jugador de la segunda década del 2000, después de ganar el campeonato mundial en un match espectacular contra el indio Anand, declaraba que había tenido la incalculable ayuda de las computadoras. No cabe duda que los desarrolladores de lenguajes como PGN o el Protocolo UCI de los 'chess engines' han servido para que un joven noruego gane el campeonato mundial. El desarrollo de técnicas para analizar, relacionar y mejorar tu propio sistema es un tema hablado desde  "La práctica de mi sistema" del Gran Maestro Nimzovich y actualmente, los grandes maestros utilizan los ordenadores en su día a día para esta labor.

Problemas del formato PGN en la web 2.0

El formato PGN es, técnicamente, un lenguaje de marcas jerárquico que se representa utilizando [tags]. Los problemas surgen cuando los diferentes motores no estandarizan la jerarquía en los archivos que generan a través de las interfaces gráficas y los competidores del mercado, desarrollan sus propios sistemas para guardar las partidas (ejemplo Chessbase) además de innovar en la adición de variantes en las partidas.

La anotación de comentarios y variantes complica su lectura en un parser con scripts debido a la recursividad necesaria. Las herramientas actuales, no son 'open source' (de libre uso) exceptuando algunas nuevas librerías que actualmente se encuentran en desarrollo como Chess.js.

Los 'engines' que juegan al ajedrez, utilizan su propio protocolo en árbol (UCI Protocol) para mejorar la funcionalidad y no necesariamente son user friendly. Aunque existen cientos de interfaces para conectar con motores de ajedrez, no existe ningún repositorio que permita a desarrollar aplicaciones de chess learning orientadas al usuario final que no tiene tantos conocimientos informáticos pero sí de usabilidad.

Bases de datos de ajedrez y su gestión

El ajedrez y la informática van tan de la mano que existen cientos de interfaces gráficas multiplataforma para jugar, así como para almacenar partidas y analizarlas. Las potentes aplicaciones más complejas de análisis como Stockfish o Komodo sumadas a las nuevas interfaces gráficas desarrolladas para smartphones, hacen que el ajedrez sea cada vez más atractivo. Pero aún así, no existe un servidor estándar internacional con partidas de ajedrez, que evite la duplicidad obvia de las bases de datos. Quizás tenga algo que ver la dirección actual de la FIDE (envuelta en diferentes casos de corrupción), que las competiciones oficiales de ajedrez solo utilizan la tecnología más puntera cuando hay inversiones privadas y esto también propicia secreto industrial y tecnologías cerradas, sin acceso al público geek.

¿Por qué MySQL?

Esta parte es la que todavía no tengo muy clara, después de investigar me doy cuenta que el formato PGN nace mucho antes de que el software especializado en gestión de tablas de datos fuese tan potente como es hoy en día. El formato PGN es un formato liviano y pensado para que pueda ser interpretado por una persona sin necesidad de la documentación y eso favorece que los desarrolladores de  software puedan adaptar fácilmente sus interfaces a este sistema, incluyendo la facilidad de exportación a otros formatos.

Las interfaces gráficas invierten demasiados recursos a la hora de leer las bases de datos, la principal ventaja de aplicaciones como  Chess24 es que cuentan con una base de datos de partidas de más de 6 millones y acceden a ellas en consultas específicas para buscar relaciones.

La idea de un servidor standar que pueda albergar la mayor base de datos de partidas en tablas dinámicas es necesaria para que los desarrolladores se centren en aplicaciones especificas sobre cuestiones del juego que en diseñar la estructura de las tablas de datos o las posibles relaciones, que siempre o casi siempre son las mismas. A través de una API, los desarrolladores pueden tener acceso a partidas o torneos, guardados en la base de datos con un ID único, así centrándose en el desarrollo de aplicaciones para comentarios, análisis, elearning u otras.

Existe algún motor de ajedrez que gestiona los archivos PGN en bases de datos MySQL como José Chess, sin embargo su desarrollo se ha quedado parado y obsoleto. Los websites más modernos de ajedrez como chess24, que cuentan con retransmisiones en vivo de grandes torneos, aprovechan la tecnología de bases de datos relacionables para realizar tareas de comparación de partidas y así poder estructurar los datos, por ejemplo de aperturas, en árbol (como explicaba brillantemente A. Kotov en "Piense como un gran maestro") y así enriquecer un visionado en vivo de una partida. Sin embargo, todas las aplicaciones modernas que se refieren al análisis de partidas de ajedrez y relacionadas son shareware o incluyen métodos de purchase-in que limitan el acceso a su tecnología.






Diseño técnico del flujo de trabajo


Leer un archivo PGN con JavaScript (usando jQuery)


En un principio desarrollé un 'parser' de PGN en JavaScript con la librería jQuery, esto no está nada mal, porque una vez cargadas las partidas en un un objeto HTML, puedes acceder a ellas y dibujar las partidas en un tablero. Esto podría mejorar si, fundamentalmente,  se cargan las partidas en una base de datos para así hacer búsquedas rápidas entre tantas partidas, sumando a ello la complejidad que supone la gestión de los torneos y diferentes jugadores teniendo que leer archivos de texto plano, que mejor que convertir este texto plano en datos dentro de tablas dinámicas.



No existe ningún repositorio de fácil uso para realizar esta labor de convertir las bases de datos de partidas en PGN a tablas de datos MySQL o al menos no lo he encontrado.

Esquema para convertir un archivo PGN a una tabla de datos MySQL

  1. Load PGN usando input file
  2. Leer recursivamente el archivo, convertir los [tags] en un objeto array
  3. Determinar los datos de la partida, petición post a un php remoto
  4. El php remoto comprueba si existen los jugadores y la partida en la bd
  5. Añadimos la partida a la base de datos, además de si no existen los jugadores
  6. Una vez se termine la ejecución del archivo php remoto, vuelve al punto 2.
  7. Imprime estadísticas del parseo en un canvas HTML.


Más ideas para el convertidor de pgn a mysql

  1. Comprobar el ECO de la partida si no existe dentro del PGN
  2. Extraer el rating actual del jugador de la página ratings.fide.com
  3. Establecer un servidor de partidas en MySQL descargable


Dentro de todo este flujo de trabajo, encontré una herramienta desarrollada en PHP y que puede instalarse usando el gestor de paquetes "Composer". Con la misma librería, utilizando PHP del lado del servidor, el parsing de las partidas PGN se hace mucho más rápido y estable. Una vez cargadas, puedo cargarlas en una base de datos aunque todavía estoy desarrollando el concepto de la base de datos, la funcionalidad del sitio tiene mucha mejor pinta.




No hay comentarios:

Publicar un comentario