Documentación de fn 6.0

Descripción general

fn es un sistema que permite crear álbumes de fotos digitales y mostrarlos vía web. El sistema comienza cuando has descargado las fotos de la cámara al ordenador y termina cuando las dejas preparadas en el servidor web.

fn es software libre y está basado en software libre. Se distribuye con licencia "Dominio Público".

Las características que me parecen más importantes son:

Para ponerlo en marcha lo más rápido es tener un sistema operativo Debian, aunque cualquier otro sabor de GNU/Linux o *BSD debería valer perfectamente, con las oportunas adaptaciones de esta documentación. Sin embargo, el programa solo ha sido probado en Debian.

El sistema se divide en dos fases: la de preparación de las fotos y la de servirlas vía web. Para preparlas es necesario disponer de un servidor X Window (es decir, de un entorno gráfico). Para servirlas es necesario disponer de un servidor web con PHP (versión 5 al menos) con permiso para instalar y ejecutar algunos programas.

Descompresión de fn-6.0.tgz

Como el sistema fn se distribuye en formato tgz, hay que comenzar por descomprimirlo. Vamos a imaginar que entramos en el sistema como usuario root. Hemos descargado el archivo fn-6.0.tgz y lo hemos copiado en el directorio /root/tmp/. Nos situamos en ese directorio y tecleamos

tar xzf fn-6.0.tgz

Se crea el directorio fn-6.0, que contiene todos los archivos necesarios.

Contenido de fn-6.0.tgz

En el directorio fn-6.0 obtenido tras la descompresión se encuentra el archivo leeme.txt (quizá ya lo has leído) y estos directorios:

doc

Contiene la documentación que estás leyendo ahora.

instalar

Dos scripts Bash de instalación del sistema, uno instala los programas para preparar las fotos y otro los programas para servirlos.

preparar

Cuatro programas Python que sirven para preparar las fotos.

servir

Los archivos PHP que dirigen la navegación por las fotos junto con unos archivos auxiliares.

actualizar

Dos scripts Bash que permiten actualizar un sistema fn 5.0 a la nueva versión fn 6.0.

Instalación

Hay que explicar por separado la instalación de las dos fases: preparación de fotos y servidor de fotos. Es perfectamente posible preparar las fotos en un ordenador y servirlas con otro, de hecho yo lo hago así.

Preparar las fotos

A. Empezamos por instalar el software en que se basa fn.

B. Instalar los archivos propios de fn. Sitúate en el directorio fn-6.0 que se creó al descomprimir el archivo tgz. Por ejemplo:

cd /root/tmp/fn-6.0

Ejecuta el script fn-instala-preparar.sh que se encuentra en el directorio instalar. Así:

./instalar/fn-instala-preparar.sh

Esto copia cuatro programas al directorio /usr/local/bin, de modo que estarán disponibles para todos los usuarios.

Servir las fotos

A1. Software necesario para que funcione fn

A2. Software recomendado

B. Instalar los archivos propios de fn.

Debemos comenzar por saber cuál es el DocumentRoot del servidor web, es decir, el directorio del sistema de archivos que sirve cuando le piden por web el archivo raíz. Se define en el archivo de configuración de Apache, así que en Debian lo puedo saber así:

grep DocumentRoot /etc/apache2/sites-enabled/000-default

En mi sistema obtengo esta línea (hay alguna más, pero son comentarios):

DocumentRoot /home/web

Sitúate en el directorio fn-6.0 que se creó al descomprimir el archivo tgz. Por ejemplo:

cd /root/tmp/fn-6.0

Ejecuta el script fn-instala-servir.sh que se encuentra en el directorio instalar escribiendo como parámetro el DocumentRoot que acabamos de encontrar, siempre sin terminarlo en el carácter barra. Así (en mi caso):

./instalar/fn-instala-servir.sh /home/web

Esto crea en el DocumentRoot el directorio fotos, y prepara en él una estructura de directorios y archivos. Te aconsejo que eches un vistazo a lo que se ha creado, para familiarizarte un poco con el sistema. Cambia el owner del directorio según tus preferencias.

Si en este momento llamas con un navegador a tu servidor web y le pides el directorio fotos, ya deberías ver la página inicial de fotos digitales. Si no la ves, te aconsejo que añadas index.php a la lista de archivos que debe buscar Apache si se le pide un directorio.

C. Preparación de la administración vía web

Este paso es necesario para poder administrar las series de fotos vía web.

  1. Como vamos a escribir en la consola una contraseña, quizá quieras que no quede almacenada en el histórico del intérprete de órdenes. Con Bash, eso se consigue con

    unset HISTFILE

  2. Colócate en el directorio de las fotos de tu DocumentRoot; en mi caso:

    cd /home/web/fotos

  3. Genera el hash de la contraseña que quieras usar para identificarte en la interfaz web:

    ./generaContrasena.php EstaEsTuContraseña

  4. Edita el archivo contrasena.php y asigna a la variable $Contrasena el valor de la salida de la orden anterior.
  5. Si olvidaras la contraseña alguna vez deberás repetir los pasos anteriores.

Cuando se va a utilizar la administración vía web, el usuario que ejecuta el servidor web (normalmente, www-data) debe tener permisos de escritura en el archivo fn.db y si además se desea cargar nuevas series con este interfaz, también debe tener permisos de escritura en los directorios fotos, fotos/indices y fotos/carga. Estas comprobaciones son muy importantes, porque si los permisos no son los adecuados el sistema de administración vía web no funcionará pero no será aparente por qué.

Personalización

Es posible personalizar el aspecto y el contenido de la página index.php y también muchos de los parámetros del sistema editando el archivo config.php.

Utilización

Voy a ir explicando con un ejemplo cómo se puede preparar una serie de fotos desde que la descargas al ordenador hasta que las colocas en el servidor web.
  1. Descargo las fotos de la cámara a un directorio. Yo guardo las fotos en ~/dat/fotos/, cada día en un directorio distinto. Como muchas cámaras ponen nombres demasiado largos y complicados que no me parecen apropiados, empiezo por cambiarlos. Esto no es estrictamente necesario, tú puedes poner a las fotos los nombres que quieras (sin espacios ni acentos, ya que luego hay que servirlas vía web).

    Para hacer una simulación de los cambios de nombres primero hago

    fn-numera.py 1 s

    Si veo que todo va a mi gusto, realizo los cambios con

    fn-numera.py 1 r

    El programa fn-numera.py cambia los nombres no solo de los archivos JPG, sino de cualquier otro que pueda generar la cámara.

    Esto deja los nombres como 0001, 0002, etc, y extensión jpg, en minúsculas.

    A veces hago en un día fotos en varias tarjetas de memoria y necesito renumerar algunas fotos a partir de un determinado número; para eso uso, por ejemplo:

    fn-numera.py 120 r

    para que la primera foto se llame 0120.jpg, la segunda 0121.jpg, etc. Así ya puedo tener todas las fotos de un día numeradas correlativamente y en un mismo directorio.

  2. Otra situación común es unir en un solo directorio fotografías realizadas con diferentes cámaras. Para que eso funcione bien es importante sincronizar los relojes de las cámaras antes de disparar con ellas. Si te das cuenta de que los relojes no están sincronizados después de disparar, se puede arreglar con jhead. Pero al final hay que unir las series de fotos y dejarlas correlativamente. Para eso me ayudo del script fn-descarga.py.

    Me sitúo en el directorio en el que quiero que queden todas las fotos y voy invocando el script una vez por tarjeta. Por ejemplo:

    fn-descarga.py /mnt/tarjeta1

    Este programa va copiando archivos (solo los que tienen extensión jpg) al directorio y les va asignando nombres que no interfieren unos con otros. Cuando están todos descargados, ya les puedo aplicar fn-numera.py.

  3. Para no borrar por equivocación las fotos originales, les cambio los permisos. Me sitúo en el directorio donde están las fotos del día y

    chmod 444 *

  4. Copio las fotos a otro directorio, para conservar los originales y trabajar con seguridad. Por ejemplo, me pongo a trabajar en ~/tmp con las fotos del día 2003-03-11:

    cd ~/tmp
    rm *
    cp -a ~/dat/fotos/2003-03-11/* .
    chmod 644 *
    
  5. Empiezo a trabajar con las fotos. Hay que hacer dos cosas: eliminar las que no quiero mostrar en el álbum web y girar las que he compuesto en vertical, que en la cámara se han almacenado en vertical. Para las dos cosas utilizo el programa qiv, personalizado con el archivo qiv-command, que arranco así:

    qiv -ft *.jpg

    La opción "f" significa "Pantalla completa" y la opción "t" significa "Ajustar imagen a pantalla". Para eliminar una foto pulso "d"; realmente qiv la traslada a .qiv-trash, de modo que se puede recuperar pulsando "u". Cuando tengo que girar una foto, pulso la tecla "1" (gira -90 grados) o "2" (gira 90 grados). Otra pulsación útil es "0", que muestra la información EXIF de la foto.

    Si la cámara ha almacenado información sobre la orientación en que se ha efectuado la toma, un modo automático de pasar a formato vertical las fotos que lo necesiten es con la orden

    exifautotran *

  6. Doy varias pasadas a las fotos; voy a la foto siguiente pulsando "Espaciador" y a la anterior pulsando "Retroceso". Cuando termino borro el directorio .qiv-trash, en el que están las fotos que no deseo mostrar:

    rm -r .qiv-trash

  7. Una vez decididas las fotos que se van a mostrar, hay que prepararlas. Esto se hace con el programa fn-prepara.py, que crea miniaturas y versiones medianas de las imágenes. El índice creado se llama indice.jpg y las imágenes medianas tienen extensión jpeg. Para usarlo, te sitúas en el directorio en que están las imágenes y lo lanzas así:

    fn-prepara.py

    Este programa admite ajustar algunos parámetros internos, mira el código y ajústalos a tu gusto.

    Cuando lo ejecutas, tiene este aspecto:

    fn-prepara-antes

    Puedes manejar el programa a tu gusto y cuando te parezcan adecuados los parámetros, pulsar el botón Preparar.

    Cuando el programa termine verás la aparición de las imágenes medianas y el índice:

    fn-prepara-despues

  8. Para poder modificar los comentarios de las fotos vía web posteriormente es necesario que el usuario que ejecuta el servidor web tenga permisos de escritura sobre los imágenes medianas. Esto lo consigo ahora con la orden

    chmod 664 *.jpeg

  9. Es el momento de añadir comentarios a las imágenes que quieras. Para ello ejecutas el programa fn-comenta-py:

    ./fn-comenta.py

    Tiene este aspecto:

    fn-comenta.py

    Con este programa puedes ir añadiendo comentarios a las fotos que quieras. No uses las comillas en los comentarios, porque el programa fallará. Tienes que acordarte de pulsar el botón Grabar tras hacer cambios en los comentarios, porque el programa no te lo va a recordar.

  10. Llevo todos los archivos jpg (las fotos originales y el índice) y jpeg (las imágenes medianas) al directorio de carga de fotos del servidor, [DocumentRoot]/fotos/carga/. Por ejemplo, con scp o por FTP.
  11. Entro en una consola del servidor (local o por ssh), me coloco en el directorio de las fotos y ejecuto fn-coloca.php, que necesita como parámetro la descripción que se quiere dar a la serie, que como suele ser una frase, habrá que ponerla entre comillas. Por ejemplo:

    ./fn-coloca.php "Fotos del día de la simetría"

    El script fn-coloca.php asigna como nombre de la serie la fecha de la primera foto, con formato AAAA-MM-DD.

  12. El proceso ha terminado. Si vamos con un navegador a la página de las fotos, ya aparecerá la nueva serie y se podrá navegar por sus fotos.

Administración vía web

Si se ha activado la contraseña de administración, se puede gestionar vía web el conjunto de series de fotos.

Comentarios técnicos

Estructura en el servidor

En el directorio fotos del servidor se usan varios archivos: En el directorio fotos del servidor se usan cuatro directorios: Cada vez que se añade una serie, se crea un directorio con su nombre que contiene las fotos originales; dentro del directorio se crea un subdirectorio llamado reducidas en el que se almacenan las imágenes medianas y se añade una imagen jpg en el directorio indices.

La base de datos fn.db

Este archivo es una base de datos con formato SQLite3. Por tanto, se puede manejar perfectamente con cualquiera de las herramientas disponibles.

Se crea usando el archivo fn.sql, con esta orden:

sqlite3 fn.db ".read fn.sql"

Estas son las órdenes SQL del archivo fn.sql:

CREATE TABLE serie (
  num         INTEGER,
  nombre      TEXT,
  descripcion TEXT,
  visible     INTEGER DEFAULT 1,
  cantidad    INTEGER
  );

CREATE INDEX n ON serie(num);

Explicación de los campos de la tabla serie:

El modo más sencillo de ver el contenido de esta base de datos es usar la orden

sqlite3 fn.db "select * from serie;"

Funcionamiento de fn-prepara.py

Al arrancar averigua cuántas imágenes hay en el directorio, lo anota en la sección Directorio, las examina todas para determinar si tienen formato 4:3 o 3:2 y rellena la sección Formato con la información obtenida.

Calcula el número de columnas y filas que puede tener la imagen índice partiendo del mínimo cuadrado que pueda englobar a todas las imágenes y quitando tantas filas como sea posible.

Utiliza una variable interna para calcular las dimensiones de las miniaturas en el índice y otra para proponer el tamaño de las imágenes medianas.

Actualización de fn 5.0 a fn 6.0

Actualización del sistema para preparar fotos

Esta actualización se hace entrando al sistema con el usuario root

  1. Sitúate en el directorio donde se descomprimió fn-6.0.tgz:

    cd /root/tmp/fn-6.0

  2. Ejecuta la orden

    ./actualizar/fn-elimina-preparar.sh

  3. Ejecuta la orden

    ./instalar/fn-instala-preparar.sh

Actualización del sistema para servir fotos

Esta actualización se hace entrando al sistema con el usuario que normalmente se utilice para gestionar la web.

  1. Sitúate en el directorio donde se descomprimió fn-6.0.tgz:

    cd /root/tmp/fn-6.0

    Ejecuta el script fn-actualiza-servir.sh que se encuentra en el directorio actualizar indicando el DocumentRoot del servidor web. Por ejemplo, así:

    ./actualizar/fn-actualiza-servir.sh /home/web

  2. Incorpora en el archivo config.php todo lo que personalizaste para fn 5.0 y que aún está en el archivo config.php.seg. Recuerda que ahora está en UTF-8, quizá tengas que cambiar la codificación.
  3. Cuando veas que todo está a tu gusto, puedes eliminar archivo config.php.seg.
  4. La contraseña de administración anterior ya no es válida, hay que generar una nueva con el método de esta versión.
  5. El archivo SQLite3 con las series contiene las descripciones con codificación ISO 8859-1 (aunque realmente SQLite3 no lo admite, pero la extensión PHP para manejar SQLite3 no se queja). Al haber pasado la versión 6.0 a UTF-8, es necesario hacer la conversión. El programa fn-actualiza-basedato.py, que está en el directorio actualiza, se encarga de hacer esa conversión.

Historia de las versiones

La primera versión en la que escribí documentación fue la 4.0, así que podemos decir que es la primera versión oficial. Anteriormente hubo más versiones, pero de uso privado o quizá reducido, no lo recuerdo bien.

Versión 4.0

Versión 5.0

Versión 6.0

Agradecimientos