sábado, 5 de octubre de 2013

Restaurar archivos desde el cache de un navegador

Este post está inspirado en How to recover a file in Google Chrome cache (gzipped or not) una guía que me salvó la vida, espero que esto le sirva a cualquier que pase por la misma situación en el futuro.

 

Contexto

Estaba trabajando en un web site con wordpress y necesitaba modificar un archivo php del tema que se estaba usando en ese momento, pero estaba realmente distraído con mi mente en otro lugar y aunque acostumbro hacer una copia del archivo antes de editarlo para poder dejarlo como estaba en caso de algo salga mal, esta vez no lo hice ¡GRAVE ERROR!

 

El problema

Reemplace el contenido del archivo de estilos principal (style.css) del tema con código php, para cuando me di cuenta de mi terrible error ya había guardado el archivo y no podía usar el historial de deshacer para restaurar el archivo a su forma anterior y entonces me doy cuenta de que no saqué la acostumbrada copia de respaldo. El problema era serio por que destruí un archivo importante y no tengo una forma obvia de restaurarlo y reescribirlo tomaría horas si es que era posible dejar todo como estaba...

 

La solución

Primero lo primero ¡No hay que entrar en pánico! se piensa mejor calmado.

Busqué en google por alguna forma de restaurar mi archivo y encontré que había una forma de recuperar lo usando la cache del navegador, como había estado revisando los cambios al sitio en varios navegadores a saber: chrome, firefox y opera tenía al menos una copia en la cache de alguno de esos, por supuesto no podía volver a abrir el sitio en uno de esos navegadores porque corría el riesgo de actualizar la cache y perder mi ultima esperanza de no tener que reescribir el contenido perdido por mi error.

Encontré en esta guía que existe un script mencionado aquí que te permite recuperar archivos de texto plano a partir del cache de firefox o chrome sin embargo en la primera guía dan una versión que permite recuperar archivos comprimidos usando gzip.

Para entrar al cache de firefox, chrome u opera debemos poner "about:cache" sin las comillas en el campo de dirección del navegador respectivo, a continuación algunos ejemplos de lo que muestran dichos navegadores:
  • firefox Version 24.0:
  • Chromium Versión 28.0.1500.71 Ubuntu 13.04 (28.0.1500.71-0ubuntu1.13.04.1):
  • Opera Version 12.16:
Los archivos disponibles se presentan (al menos en chrome) de la siguiente forma:

Lo que tenemos que hacer es escribir el siguiente script en un archivo php en nuestro disco duro y llamarlo por ejemplo restore.php:
<?php
// cache.log is a copy of chrome cache page with only the file content section
$cacheString = file_get_contents("cache.log");
$matches = array();
preg_match_all('/\s[0-9a-f]{2}\s/', $cacheString, $matches);
$f = fopen("t.bin","wb");
foreach ($matches[0] as $match)
{
  fwrite($f,chr(hexdec($match)));
}
fclose($f);

ob_start();
readgzfile("t.bin");
$decoded_data=ob_get_clean();
echo $decoded_data;

Luego escribimos el texto hexadecimal tomado del cache de nuestro navegador en un archivo llamado cache.log ubicado junto a restore.php, si deciden usar un nombre de archivo diferente al indicado deben ajustar el script restore.php.

Finalmente ejecutamos restore.php para obtener el archivo original (en la consola) a partir del archivo cache.log:
php restore.php

En mi caso particular usé el siguiente comando, para almacenar el texto en un archivo css:
php restore.php > style.css

 

Extra

Nunca se sabe cuando un script como este puede ser útil así que cree un proyecto en github y subí ambas versiones, a saber: la que recupera texto plano y la que recupera archivos comprimidos con gzip en un solo archivo que puede ser ejecutado de la siguiente forma:

php restore_from_cache.php > restored_file

 

Conclusión

  1. Siempre mira dos veces lo que estas editando para estar seguro que es el archivo correcto
  2. Aunque estés seguro de que es el archivo correcto siempre guarda un respaldo antes de hacer tus cambios
  3. En caso de desastre y si tienes la suerte de que tu o alguien más tenga el archivo en su cache puedes usar los scripts mencionados antes para recuperar el texto original
Al momento de escribir este post, veo que Opera 12.06 te muestra el contenido de los archivos en cache como texto legible en lugar de la versión en hexadecimal, así que si tienes el archivo en el cache de opera ¡que buena suerte! pero de todos modos quizás quieras extraer las versiones de los otros navegadores y compararla a antes de decidir cual usar.


Saludos y hasta la próxima.

viernes, 16 de agosto de 2013

Solución al problema de archivos de registro vacios en ubuntu

Esté post es una traducción de uno anterior. Hoy estaba tratando de configurar un cronjob o tarea programada y al tratar de verificar que todo estaba funcionando correctamente descubrí que el archivo /var/log/syslog estaba vacío, hace algunos días solucioné un problema similar con /var/log/auth.log el cual no tenía asignado el propietario correcto. Tras darme cuenta que el archivo syslog también estba vació empecé a sospechar que había algún tipo de problema con la configuración de mi servidor. Después de una pequeña busqueda encontré este post y se hizo bastante claro la causa del problema.

El problema
Al parecer hay varios archivos cuyo dueño es el usuario messagebus sin embargo ese no es el que debería ser dueño de dichos archivos, de acuerdo a la siguiente documentación que habla sobre bajar provilegios en rsyslog las siguientes líneas en el archivo /etc/rsyslog.conf definen el usuario y grupo a personificar después de que se completa el proceso de inicio:
$PrivDropToUser syslog
$PrivDropToGroup syslog
Como pueden ver el que debería ser dueño de dichos archivos de log mencionados antes es el usuario syslog.

La solución
Tal como indica Dan Ballard aquí necesitamos listar los archivos que tienen el dueño incorrecto.
ls -l /var/log/ | grep messagebus
Un ejemplo de lo que regresa el comando anterior es:
-rw-r----- 1 messagebus adm        0 oct 22  2012 kern.log
-rw-r----- 1 messagebus adm        0 oct 22  2012 mail.err
-rw-r----- 1 messagebus adm        0 oct 22  2012 mail.log
-rw-r----- 1 messagebus adm        0 mar 13 06:26 syslog
-rw-r----- 1 messagebus adm        0 oct 22  2012 ufw.log
Para finalizar el Sr. Ballard dice que simplemente debemos borrar esos archivos y reiniciar el servicio rsyslog, pero ten mucho cuidado con el comando rm.
Usa algo como lo siguiente para eliminar los archivos de log:
sudo rm -vi /var/log/syslog
Y algo como esto para reiniciar rsyslog
service rsyslog restart
En mi caso yo prefiero en vez de borrarlos cambiarle el propietario a los archivos mencionados usando:
sudo chown syslog:syslog /var/log/syslog
sudo chown syslog:syslog /var/log/kern.log
sudo chown syslog:syslog /var/log/mail.err
sudo chown syslog:syslog /var/log/mail.log
sudo chown syslog:syslog /var/log/ufw.log
ADVERTENCIA: No traten de cambiar los propietarios de todos los archivos dentro del directorio /var/log puesto que algunos podrían necesitar mantenerse como están, es decir podrían dejar de funcionar si les cambian el propietario.

Hasta la próxima.

Fix empty log files in ubuntu

Today I was trying to configure a cronjob and when I try to check if the service was running I found that the syslog file /var/log/syslog was empty, some time ago I did fix a similar problem with /var/log/auth.log file not being owned by the user syslog and after finding this other log file also empty I start suspecting that there is a problem with my server configuration. After a little search this post came out and it was clear to me what the problem was.

The problem
It seems that several log files in ubuntu server are owned by the user messagebus but that user is not the right one, according to this documentation for dropping privileges in rsyslog the following lines in /etc/rsyslog.conf config file define the user and group used for impersonating as another user and/or group after startup:
$PrivDropToUser syslog
$PrivDropToGroup syslog
As you can see the owner of the log files mentioned before should be owned syslog user.

The solution
As indicated here by Dan Ballard first we need to list all files that have the incorrect owner using:
ls -l /var/log/ | grep messagebus
The previous command shows this output:
-rw-r----- 1 messagebus adm        0 oct 22  2012 kern.log
-rw-r----- 1 messagebus adm        0 oct 22  2012 mail.err
-rw-r----- 1 messagebus adm        0 oct 22  2012 mail.log
-rw-r----- 1 messagebus adm        0 mar 13 06:26 syslog
-rw-r----- 1 messagebus adm        0 oct 22  2012 ufw.log
Finally Mr. Ballard says that you just go and delete those files and restart syslog, but be careful with the rm command ¿ok?
use something like this to delete your log files:
sudo rm -vi /var/log/syslog
And this to restart syslog
service rsyslog restart
In my case I prefer not to delete those file but just change their owner using:
sudo chown syslog:syslog /var/log/syslog
sudo chown syslog:syslog /var/log/kern.log
sudo chown syslog:syslog /var/log/mail.err
sudo chown syslog:syslog /var/log/mail.log
sudo chown syslog:syslog /var/log/ufw.log
WARNING: Don't try to change the owner of all files under /var/log because some of them may need to be owned by other user.

Until next time.

lunes, 5 de agosto de 2013

Ubuntu Edge en indiegogo.com

Hola a todos, En caso de que no se enteraran recientemente la gente de Canonical lanzó una campaña para crear un smartphone que tendrá dual boot de ubuntu y android. Los detalles técnicos en lo personal me parecen interesantes y se ve prometedor el dispositivo el cual estaría disponible en el Mayo 2014 si es que logran llegar a la meta. Indiegogo es un sitio de financiamiento a proyectos o iniciativas en el que todos podemos participar y apoyar aquellas cosas que nos gustan o que deseamos ver convertidas en realidad. La campaña de Canonical es bastante ambiciosa pero estoy seguro que si recibe suficiente publicidad llegarán a su meta. Aquí les dejo el enlace para que vean los detalles del proyecto ¡su ayuda hace falta! http://www.indiegogo.com/projects/ubuntu-edge Saludos a todos.

martes, 11 de junio de 2013

Cómo instalar jetty 9 en ubuntu

Estos pasos los hice en un laptop con Ubuntu 13.04 x64, para detalles sobre versiones anteriores de jetty y ubuntu pueden consultar mi post sobre ¿cómo instalar jetty 7 en ubuntu?
Manos a la obra:
  1. Descargamos jetty 9 desde la sección de descargas del proyecto http://download.eclipse.org/jetty/, en dicha página encontraran muchas versiones del servidor, para este ejemplo usaré la 9.0.3.v20130506. Básicamente ingresamos a la dirección http://download.eclipse.org/jetty/9.0.3.v20130506/dist/ y descargamos la distribución zip de jetty:
    # vamos a la carpeta donde deseamos descargar jetty
    cd /usr/local
    
    # descargamos jetty 9.0.3.v20130506
    sudo wget -c http://eclipse.org/downloads/download.php?file=/jetty/9.0.3.v20130506/dist/jetty-distribution-9.0.3.v20130506.zip&r=1
    
  2. Anora descomprimimos el zip que acabamos de descargar para obtener una carpeta con todos los archivos necesarios:
    unsip jetty-distribution-9.0.3.v20130506.zip
    
    Opté por renombrar la carpeta a jetty-9.0.3.v20130506 porque me resulta más fácil de recordar pero pueden dejar la original o colocar lo que les guste, la idea es identificar de forma simple que contiene la carpeta más tarde
     
    mv jetty-distribution-9.0.3.v20130506 jetty-9.0.3.v20130506
    
  3. Creamos un enlace hacia el directorio que contiene jetty, esto facilita que en un futuro podamos cambiar la de versión cambiando hacia donde apunta el enlace evitando así ajustar cualquier configuración que pueda estar apuntando hacia la instalación del servidor.
    # recuerden que estamos en la ruta /usr/local
    ln -s jetty-9.0.3.v20130506 jetty
    # ahora podemos acceder a jetty en la ruta /usr/local/jetty
    
  4. Ahora configuramos jetty como un servicio en ubuntu, de esta forma iniciará automáticamente al iniciar el sistema operativo y nos permitirá controlar jetty usando el comando service:
    sudo ln -s /usr/local/jetty/bin/jetty.sh /etc/init.d/jetty
    sudo update-rc.d jetty defaults
    
    En mi caso, quiero poder controlar jetty usando el comando service pero no deseo que el servidor arranque con el sistema y permanezca consumiendo recursos por lo que deshabilité el inicio automático, sin embargo hay que resaltar que esto implica que deben iniciarlo manualmente cada vez que lo quieran usar:
    sudo update-rc.d jetty disable
    
    Aquí les dejo algunos ejemplos de como podemos controlar jetty usando el comando service en ubuntu, esto aplica para cualquier servidor que instalen de forma similar a la descrita anteriormente:
    sudo service jetty start       # inicia jetty
    sudo service jetty stop        # detiene jetty
    sudo service jetty restart     # detiene e inicia jetty
    sudo service jetty status      # imprime en la consola información del servicio como el process id (PID) 
    sudo service jetty             # muestra las opciones disponibles
    
  5. Usando las configuraciones por defecto jetty será accesible en la url http://localhost:8080/ si han iniciado jetty (sudo service jetty start) pueden probar dicha url en su navegador web favorito. Es posible que deseen cambiar el puerto en el que el servidor es accesible, por ejemplo a el puerto 80 para hacer esto editamos el archivos /usr/local/jetty/start.ini, cambiamos la línea que contiene: "jetty.port=8080" reemplazando la misma por jetty.port=80 y guardamos los cambios:
    cd /usr/local/jetty/
    nano start.ini # pueden usar su editor de preferencia
    
    El archivo final debe lucir más o menos como el siguiente ejemplo
    #===========================================================
    # HTTP Connector
    #-----------------------------------------------------------
    #jetty.port=8080
    jetty.port=80
    
    # el resto del contenido original del archivo ...
    
    Nota: Eso es diferente a la forma como configuré el jetty 7
Si todo ha ido bien en este punto tendrán su servidor jetty 9 corriendo en el puerto 80 y accesible en la url http://localhost/
En mi próximo post hablaré sobre como ejecutar aplicaciones php en jetty usando cgi.
Hasta la próxima.

miércoles, 8 de mayo de 2013

problemas con ipv6 y nginx en ubuntu despues de una actualizacion

Hoy estaba trabajando tranquilamente en mi ubuntu, instalando algunos paquetes con aptitude y recibí un mensaje diciéndome que debía actualizar, entre otros, nginx ¿por qué no? me dije a mi mismo ¡total ya estoy instalando otras cosas!
Después de que se descargaran los paquetes necesarios me salió otro mensaje diciendo que que tenía un conflicto en el archivo /etc/nginx/sites-available/default ya que lo había modificado y la actualización venía con algunos cambios hechos por el responsable del paquete, así que hice un respaldo del archivo y deje que la actualización sobre escribiera.
Cuando todo el proceso terminó sin problemas comparé las diferencias (usando meld) y noté una línea interesante, más que nada porque adiciona soporte para ipv6

    listen [::]:80 default_server ipv6_only=on;

Aunque en ese momento no le di mucha importancia cuando traté de reiniciar nginx para seguir trabajando noté un error en el log:

 cat /var/log/nginx/error.log

2013/05/08 15:40:14 [emerg] 29533#0: invalid parameter "ipv6_only=on" in /etc/nginx/sites-enabled/default:22

Por suerte una búsqueda rápida me llevo a la solución que indican en este bug de launchpad, básicamente lo que hay que hacer es usar ipv6only=on en lugar de ipv6_only=on (sin el _ separando ipv6 y only)

    listen 80 default_server;
#    listen [::]:80 default_server ipv6_only=on;
    listen [::]:80 default_server ipv6only=on;

Aunque este no es precisamente un problema reciente tampoco es muy viejo y bueno decidí que sería bueno dejar un registro para el futuro y por si le resulta útil a alguien más.

Saludos.

jueves, 25 de abril de 2013

Eliminar lineas de texto vacías por consola de comandos

Siguiendo un poco con el tema de este post anterior y porque me encontré algo relacionado aquí les dejo este post donde doy algunos consejos para eliminar líneas vacías
Asumamos que tenemos el mismo archivo de ejemplo de mi post anterior llamado dias.txt pero le agregaré unas cuantas líneas en blanco para poder que quede como sigue a continuación:
Lun

Mar

Mie

Jue

Vie

Sab

Dom

Pueden usar cualquiera de los siguientes comandos para borrar todas las líneas vacías del archivo dias.txt: sed, awk o perl
El resultado seria algo como lo siguiente:
Lun
Mar
Mie
Jue
Vie
Sab
Dom

Recuerden que pueden imprimir en pantalla el contenido de dias.txt usando el comando
cat dias.txt

  • Gnu/sed: Usando una regex le indicamos a sed que borre las líneas que no tienen nada entre el principio(^) y el fin($) de dicha linea
    podemos escribir el contenido de dias.txt modificado en otro archivo (dias2.txt):
    sed '/^$/d' dias.txt > dias2.txt
    
    #cat dias2.txt
    
    O bien podemos modificar dias.txt directamente
    sed -i '/^$/d' dias.txt
    #cat dias.txt
    
  • awk: Usando awk el comando sería
    awk 'NF > 0' dias.txt > dias2.txt
    #cat dias2.txt
    
  • perl: El siguiente comando usando perl, borra todas las líneas bacias y guarda el archivo original como dias.txt.bakup, muy practico para evitar perder el archivo original si algo sale mal
    perl -i.backup -n -e "print if /\S/" input.txt
    #cat dias.txt
    #cat dias.txt.backup
    
Espero que les sea de ayuda :D
Hasta la próxima.

jueves, 21 de febrero de 2013

howto detect date collisions or conflicts

Today during a test of a client's app I found an interesting problem, how to detect date collisions or conflicts?
Suppose you have to create an agenda app, that allows it's users to create meetings or appointments and it must not allow two events to happen at the same time, for simplicity let's just say "all events created must not be in schedule conflict with other events"
It seems simple to resolve at first glance, but allow me to show you some examples of why it is not: Suppose you have two events A which last 60 minutes and B which last 90 minutes.
There are so many ways that we can create this two events in our agenda so that there will be a schedule conflict (date collision)
  1. Setting A to start and same time as B http://screencloud.net/v/ChX3
  2. Setting A to start a few minutes before B http://screencloud.net/v/73vI
  3. Setting B to start a few minutes before A http://screencloud.net/v/uyaG
  4. Setting A to start a few minutes later of B http://screencloud.net/v/lpLg
  5. ...

If you try to list all possible combinations in which A and B are in conflict your code may become pretty big and very difficult to maintain for something as simple as "detect date collisions", luckily there is another way more simple: Instead of search all possible conditions in which A and B are in conflict lets search for the possibles situations in which they are not
  1. A starts and ends before B http://screencloud.net/v/hEXt
  2. B starts and ends before A http://screencloud.net/v/tR6X

We can use this conditions and some boolean logic to create for example a mysql query:
I hope this is useful for anyone of you.
Regards
Spanish version

Detectar colisiones o conflictos de fechas

Hoy mientras probaba una aplicación para un cliente encontré un problema interesante y es ¿cómo validar colisiones de fechas para un calendario? Supongan que tienen que crear una agenda que permita crear eventos como citas o reuniones y deben detectar que dos eventos no ocurran al mismo tiempo, por simplicidad solo digamos que "todos los eventos que sean creados no deben estar en conflicto de horario con los demás" Parece simple de resolver a simple vista pero permítanme mostrar unos ejemplos del motivo por el que no lo es: Supongan que tienen dos eventos A que dura 60 minutos y B que dura 90 minutos. Hay muchas formas en las que podemos crear estos eventos en nuestra agenda de manera que crean un conflicto de horario
  1. Haciendo que A y B inicien a la vez http://screencloud.net/v/ChX3
  2. Haciendo que A inicie unos minutos antes que B http://screencloud.net/v/73vI
  3. Haciendo que B inicie unos minutos antes que A http://screencloud.net/v/uyaG
  4. Haciendo que A inicie unos minutos despues de B http://screencloud.net/v/lpLg
  5. ...
Si tratan de identificar todas las posibles combinaciones en las que A y B entran en conflicto su código puede volverse bastante enorme y problemático a la hora de darle mantenimiento para algo tan simple como "encontrar conflictos de horario", por suerte hay otra forma más sencilla que explico a continuación: En lugar de encontrar las posibles condiciones en las que A y B entran en conflicto busquemos las posibles situaciones en las que no lo están
  1. A inicia y termina antes que B http://screencloud.net/v/hEXt
  2. B inicia y termina antes que A http://screencloud.net/v/tR6X
Podemos usar estas dos condiciones antes mencionadas y un poco de lógica booleana para hacer, por ejemplo una consulta en mysql: Bueno espero que esto les sea de ayuda

sábado, 16 de febrero de 2013

Actualizar ubuntu server desde la consola de comandos

A manera de recordatorio para mi mismo y si acaso le sirve a alguien más pues mejor, dejo hoy esta mini guía de como actualizar ubuntu server.

Lo primero que necesitamos hacer es instalar update-manager-core
sudo apt-get install update-manager-core
Luego ejecutamos el asistente para instalación/actualización
sudo do-release-upgrade Seguimos los pasos respondiendo a las preguntas que nos va haciendo el proceso de actualización y si todo sale bien al final reiniciamos.
Eso sería todo, el proceso es bastante simple y lo único que podría complicarse es si la actualización encuentra conflictos en los archivos de configuración, pero para eso te ofrece un serie de opciones como instalar la versión que viene con el paquete, conservar la existente (por defecto), entre otras.
Hasta la próxima.
Saludos.

Encontrar quien está haciendo qué en GNU/Linux

Aunque estos comandos solo los he probado en Ubuntu 12.04, deberían funcionar en otros SO GNU/Linux, solo hace falta tener instalado lsof y ps.
En mi experiencia ps siempre está presente, pero extrañamente lsof no estaba presente en el servidor donde ejecuté estos pasos aunque esto se soluciona simplemente instalándolo. Ubuntu o Debian instalamos lsof ejecutando el siguiente comando:
sudo aptitude install lsof

Ahora supongamos que queremos averiguar ¿cual servidor de correo está corriendo actualmente? Lo más simple sería preguntar al que lo instaló, pero si por alguna razón eso no es posible...
Partimos de que sabemos que el puerto donde está escuchando el servidor de correo es el 25 y listamos los archivos abiertos relacionados:

del resultado anterior nos interesa tomar el valor del PID y lo usamos para filtrar la salida del comando ps -ef:
En el resultado de ejecutar el comando ps vemos que es postfix el que lanzó el proceso 2446, por lo tanto  nuestro servidor de correo es el ya mencionado postfix.

De forma similar se pueden verificar otros servicios por ejemplo ¿quién está escuchando en el puerto http(80)?
sudo lsof -i tcp:80

El comando lsof y la forma como usarlo para determinar el comando que invocó el mail server encontré en: http://ubuntuforums.org/showthread.php?t=871508

Espero les sea de ayuda.

Hasta la próxima.

Aprender a jugar ajedrez en Ubuntu GNU/Linux

Desde que tengo memoria siempre me ha resultado interesante el ajedrez, las jugadas posibles, los famosos grandes maestros y los campeonatos pero por mucho tiempo me limité solo a juegos ocasionales con GNU Chess. No fue hasta el 2012 que supe un poco más acerca de este mundo gracias a unos colegas, entonces me interesé un poco más en ese mundo y todo lo que abarca, descubrí algunos libros interesantes que planeo comprar. Hace poco surgió un tema de conversación tomando café :D ¿qué programas existen para ayudarnos (profesionales y principiantes) a mejorar la forma como jugamos ajedrez? En dicha conversación aprendí que existen motores y bases de datos de jugadas que permiten entrenarnos en posibles escenarios de partidas reales y bueno como dicen el dicho "la practica hace al maestro". Con la duda sobre estas herramientas me puse a investigar un poco por mi cuenta, en especial algo que pudiera usar en Ubuntu para practicar y encontré este tutorial creado por Justin Mcclure en su blog Attacking Chess que está dedicado al ajedrez como podrán deducir por el nombre :D . Justin Mcclure menciona dos herramientas interesantes:
  • SCID
    Web site: http://scid.sourceforge.net/
    Detalles: Scid ("Shane's Chess Information Database"), una aplicación de base de datos de ajedrez que funciona en Windows, Linux y Mac OS. Con Scid puedes mantener una base de datos de juegos de ajedrez, hacer búsquedas por muchos criterios, estudiar tus partidas usando programas de análisis compatibles con Xboard o UCI, estudiar finales con tablas base de finales (endgame tablebases) y mucho más.
  • Stockfish
    Web site: http://stockfishchess.org/
    Detalles: Un poderoso motor de ajedrez software libre, disponible bajo licencia GPL 3 (GPLv3).
    De acuerdo con su web site no se debe tomar a la ligera a este motor pues juega al mismo nivel que algunos motores comerciales como Rybka 4 y Houdini 2, además de ser el más poderoso en la rama de los motores de ajedrez de software libre en el mundo. (fuentes IPON y CCRL)
La instalación me resultó un poco más simple de lo que indica Justin, en lugar de descargar y compilar todo yo mismo opté por usar los paquetes ya existentes, aparte de ser más sencillo tuve algunos problemas tratando de compilar Scid. Despues de instalar necesitamos configurar Stockfish en Scid:
  1. En una terminal ejecutamos scid
    scid
  2. En el menú, clic en Tools y luego Analysis Engine...
  3. Creamos un nuevo motor de ajedrez: clic en el botón New...
  4. En el nombre ingresamos Stockfish
  5. En el comando tenemos que colocar el ejecutable de stockfish, en mi caso el valor correcto es /usr/games/stockfish, pueden por ejemplo usar el comando "whereis stockfish" para buscar en su SO
  6. El campo Directory debe asignarse el valor . para indicar que el directorio a usar debe ser el mismo en el que se encuentra el ejecutable.
  7. Clic en el botón Configure UCI Engine.
  8. En la ventana que se abrió para configurar el motor, existen muchas opciones, de las cuales Justin recomienda colocar el valor del campo book como book.bin y establecer el valor del campo Multiple variations a 4.
Eso es todo por el momento, ya que Justin no ha publicado la segunda parte de su tutorial y yo aún estoy aprendiendo a usar estos programas y jugar ajedrez :D Hasta pronto