Mostrando entradas con la etiqueta stockfish. Mostrar todas las entradas
Mostrando entradas con la etiqueta stockfish. Mostrar todas las entradas

miércoles, agosto 06, 2014

Configurar Stockfish con xinetd y systemd

Detallo a continuación la forma de ofrecer Stockfish como un servicio para acceder al motor de ajedrez mediante una ip y un puerto remoto.

Descargar, compilar y instalar Stockfish
#!/bin/bash
NOMBRE=stockfish
VERSION=$NOMBRE-$(date +"%F")
if [ -e "$VERSION" ]; then
echo "Directorio $VERSION existe, se procede a borrarlo"
rm -rf $VERSION
fi
if [ -h "$NOMBRE" ]; then
echo "Borrando enlace simbolico"
rm -f $NOMBRE
fi
echo "Obteniendo version del repositorio"
git clone https://github.com/official-stockfish/Stockfish.git $VERSION
cd $VERSION/src
make build ARCH=x86-64-modern
cd ../..
ln -s $VERSION/src/ $NOMBRE
Lo de arriba descarga stockfish, lo compila y deja un enlace simbólico a la última versión compilada. Lo bueno de esto, es que podemos ir descargando versiones nuevas para probar sin borrar lo anterior, con solo cambiar el enlace simbólico, usaremos una versión u otra.

Hasta aqui, mas o menos lo normal. Ahora hay que distinguir como vamos a invocar el servicio remoto. Podemos hacerlo mediante xinetd.d al estilo unix antiguo o al nuevo estilo con systemd.

Instalación como servicio bajo xinetd.d estilo sysinit de System V

Se necesitan crear dos ficheros, el primero sirve para indicar a xinetd que cuando se encuentra una petición dirigida al puerto 3333, ejecute el script de arranque del engine stockfish.
cat /etc/xinetd.d
# default: on
# description: An RFC 863 discard server.
# This is the tcp version.
service stockfish
{
disable         = no
server          = /usr/local/bin/chess_server_stockfish.sh
socket_type     = stream
protocol        = tcp
user            = alidhaey
wait            = no
port            = 3333
only_from = localhost
}
El segundo es la propia invocación del engine. He añadido algunos detalles más para que deje en el log el momento de su invocación y de su cierre.
cat /usr/local/bin/chess_server_stockfish.sh
#!/bin/bash
BINENGINE=/usr/local/stockfish/
LOG="/tmp/chess-server-stockfish.log"
/bin/echo "Start $(/bin/date)" > $LOG
/bin/echo >> $LOG
$BINENGINE/stockfish
/bin/echo  | /usr/bin/tee -a $LOG
/bin/echo "Stop $(/bin/date)" | /usr/bin/tee -a $LOG
Instalación como servicio bajo systemd

Con Systemd la cosa va a cambiar, es posible que haya otro forma, ya que aún estoy aprendiendo como funciona systemd, pero no es complicado.
[root@hppavilion system]# pwd
/etc/systemd/system
Creamos el fichero de definición del socket para el servicio de stockfish
[root@hppavilion system]# cat stockfish.socket
[Unit]
Description=Stockfish Engine Chess
[Socket]
ListenStream=3333
Accept=yes
[Install]
WantedBy=sockets.target
y el fichero para el servicio propiamente dicho
[root@hppavilion system]# cat stockfish@.service
[Unit]
Description=Stockfish Engine Chess
[Service]
ExecStart=/home/alidhaey/src/stockfish/stockfish
StandardInput=socket
Y para habilitar el servicio y arrancarlo podemos hacer
systemctl enable stockfish.socket
systemctl status stockfish.socket
systemctl start stockfish.socket
systemctl status stockfish.socket
netstat -nap | grep :3333
En la ruta /home/alidhaey/src/stockfish/stockfish tenemos el fichero resultando de compilar el engine.

Prueba final
[alidhaey@hppavilion ~]# telnet localhost 3333
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Stockfish 220714 64 SSE4.2 by Tord Romstad, Marco Costalba and Joona Kiiski
uci
id name Stockfish 220714 64 SSE4.2
id author Tord Romstad, Marco Costalba and Joona Kiiski
option name Write Debug Log type check default false
option name Write Search Log type check default false
option name Search Log Filename type string default SearchLog.txt
option name Contempt Factor type spin default 0 min -100 max 100
option name Min Split Depth type spin default 0 min 0 max 12
option name Threads type spin default 1 min 1 max 128
option name Hash type spin default 32 min 1 max 1048576
option name Clear Hash type button
option name Ponder type check default true
option name MultiPV type spin default 1 min 1 max 500
option name Skill Level type spin default 20 min 0 max 20
option name Emergency Move Horizon type spin default 40 min 0 max 50
option name Emergency Base Time type spin default 60 min 0 max 30000
option name Emergency Move Time type spin default 30 min 0 max 5000
option name Minimum Thinking Time type spin default 20 min 0 max 5000
option name Slow Mover type spin default 80 min 10 max 1000
option name UCI_Chess960 type check default false
uciok
quit
Connection closed by foreign host.
Si recibimos un uciok, cuando le mandemos el comando 'uci', es que todo ha ido como la seda.

martes, enero 04, 2011

Ajedrez en Linux con Stockfish

Poquito a poco, quizas influenciado porque meti en el iphone varios juegos de ajedrez como stockfish (antes llamado glaurung) y abaia, así como visores de partidas como ChessDB y Chess Database, me puse a trastear algo con las aplicaciones para linux.

Parece ser que existen varios motores de ajedrez, es decir, programas que evaluan las posiciones y determinan los mejores movimientos. Con estos programas no se pueden jugar, se necesitan otros programas que muestran la interfaz GUI, ie, muestran las piezas y el tablero y nos permiten hacer los movimientos contra la 'máquina'. Pero ahí no queda eso, existe una tercera aplicación que pone de acuerdo al tablero y al motor, siempre que hablen el mismo idioma (protocolo).

Por tanto la interfaz como el motor tienen que implementar un protocolo de comunicación. A su vez existen muchos protocolos, pero dos destacan sobre los demas. El protocolo xboard, el primero que salio, y una mejora llamada UCI. Polyglot sirve para comunicar las aplicaciones que manejan el protocolo xboard con las que manejan el protocolo UCI.

Mi primera prueba fue utilizar la combinación xboard+polyglot+stockfish. Aunque hay otros motores, elegí stockfish porque hablan muy bien de él y lo comparan con los mejores motores comerciales.

En debian se puede descargar stockfish pero para sus versiones más recientes es necesario bajarse el codigo fuente y compilarlo por nosotros mismos.

Para descargarlo solo hay que visitar la web http://www.stockfishchess.com/download/, descomprimir el fichero que nos descargamos y luego nos vamos al directorio src para compilar con 'make all'. Esto nos genera un fichero ejecutable de nombre stockfish que nosotros situaremos en /usr/games/ con el nombre stockfish-version. Si nos hemos bajado la versión 1.9.1, sera stockfish-1.9.1 y si nos hemos bajado la 2.0 será stockfish-2.0. Hacerlo de esta forma nos permite posteriormente ir probando con diferentes versiones del motor.

El siguiente paso es instalar polyglot, la forma más sencilla es con 'apt-get install polyglot'. Una vez instalado es necesario crear los archivos ini con las opciones del motor. Para ver varios ejemplos entramos en /usr/share/doc/polyglot/examples. El archivo normal.ini es una buena opción. La copiamos dentro del directorio ~/.polyglot bajo el nombre del motor en cuestion, por ejemplo stockfish-1.9.1.ini y modificamos su contenido añadiendo las rutas del engine y el nombre del binario. Para otras opciones nada mas que tenemos que ver los ejemplos.

Sólo nos falta instalar xboard, que con 'apt-get install xboard' resolvemos el problema.

Para hace una prueba podemos teclear lo siguiente:

xboard -fd "/home/alidhaey/.polyglot/" -fcp "polyglot stockfish.ini" -debug

Este comando lanza xboard y el motor de juego stockfish, que usa polyglot para comunicarse con él. Para aquellos que se han atrevido a compilar varios versiones de stockfish, tenemos el siguiente comando, que tiene dos motores diferentes

xboard -fd "/home/alidhaey/.polyglot/" -fcp "polyglot stockfish-1.9.1.ini" -scp "polyglot stockfish-2.0.ini" -debug

Y para jugar 4 matches entre ambos motores, añadimos la opcion '-mg 4' y listo.

Como se puede ver, no es muy complicado de hacer. En otro momento con más tiempo me pongo escribir algo sobre scid, que es una base de datos tipo chessbase pero para linux.

Cómo utilizar el servicio Secrets Manager para guardar las claves privadas de SSH

Para guardar la clave privada en el servicio Secrets Manager como un secreto en modo texto sin formato, sigue estos pasos Supongamos que la ...