Actualización de WordPress a versión 3.3.1

Hola a todosEloy Mier 02

Hoy he realizado la actualización de la aplicación principal del site de la versión 3.2.1 a la versión 3.3.1

La actualización era necesaria pues corrige ciertos problemas de seguridad que me han parecido importantes.

Si alguien nota algún problema o tiene algún inconveniente, que no dude en reportármelo para intentar en lo posible solucionar todos los problemas que se puedan plantear.

Por otro lado he agregado funcionalidad para que podáis hacer loggin en el site usando vuestra cuenta de FaceBook. Si ya teníais cuenta en local, podéis enlazarla con el perfil sin problema. Si no la tenéis, podéis directamente entrar como usuarios registrados usando la cuenta de FB.

Saludos a todos.

10 errores de novato que todo desarrollador Android debería evitar..

Como veteranos desarrolladores de aplicaciones móviles, con experiencia en muchas de las plataformas mas populares de la pasada década, sabemos que la plataforma Android es una de las mas accesibles para los nuevos programadores. Herramientas de desarrollo baratas, una comunidad de desarrollo muy amigable, un lenguaje de desarrollo comúnmente conocido (Java), el desarrollo de aplicaciones Android nunca ha sido mas sencillo. Dicho esto, sigo viendo un gran numero de errores que los programadores, que son relativamente nuevos en Android, siguen cometiendo una vez tras otra. Las 10 meteduras de pata mas comunes son:

1. No se lee la documentación de Android

El sitio web de Android para desarrollo (Android Developer Website) existe para ayudarnos. Enormes cantidades de documentación pueden ser descargadas junto al SDK e incluso lo tenemos todo disponible online (formato preferido por muchos por que esta en constante actualización). La documentación es mucho mas que un Javadoc del API. Incluye muchas guías, tutoriales, vídeos, formación y otro material de ayuda para la creación de aplicaciones Android..

El site de formación sobre Android (Android Training) es la ultima novedad relacionada, mediante la organización de tutoriales en clases y lecciones para guiarnos en la resolución de un determinado problema o en la implementación de funcionalidades particulares.

2. No nos familiarizamos con las herramientas Android

El SDK de Android es mucho mas que una librería que se usa para compilar nuestra aplicación para hacerla correr en nuestros teléfonos Android; el SDK tiene por lo menos una docena de herramientas que nos pueden ayudar en la construcción de las aplicaciones. Algunas de estas herramientas nos pueden ayudar en el diseño de los gráficos y layouts de nuestras aplicaciones. Otras por el contrario son herramientas de linea de comandos, que proporcionan acceso al emulador y al hardware del dispositivo de una forma sencilla y ademas habilitan características de script. Por ultimo también existen herramientas que nos van a permitir realizar un tuneado/perfilado fino del desarrollo.

Podéis encontrar toda la información sobre estas herramientas (Android tools) en la documentación del SDK(Android SDK documentation).

3. No solemos pedir ayuda de la comunidad Android

La comunidad Android es bastante grande y además, por lo poco que he podido ya ver, es bastante amigable. Cuando tengas una duda que no tenga respuesta en la documentación del SDK de Android, te recomiendo que te pases por la página StackOverflow.com, en la que puedes encontrar una etiqueta especifica para desarrollo Android. Otro recurso muy interesante es la lista de correo de Google y otros sitios con tutoriales tales como Android Development Center o en español http://www.sgoliver.net. Dentro de este mismo site teneis una etiqueta Android en la que ire agregando todos aquellos enlaces que considere de interés, y ademas en la página de desarrollo de Invisible Friend, al final de la misma, tambien tenéis los que voy usando en el propio desarrollo.

4. Somos perezosos debido a que las aplicaciones Android son Java

Java es una lenguaje de programación de alto nivel que se ejecuta en una máquina virtual que logra hacer que el desarrollo sea lo mas sencillo posible, pero esto no nos da ningún derecho a convertirnos en desarrolladores perezosos. Los estándar de programación son guías que todavía debemos seguir y defender, esto es lo que diferencia a un desarrollador profesional de un pelanas sin formación de consultora. La mayor parte de los dispositivos Android tienen una capacidad de proceso y de almacenamiento local limitadas (no como mi S2 que es la puta máquina) comparados con los ordenadores tradicionales, por lo tanto, practicas de programación incorrectas o ineficientes tienen mucho mayor impacto sobre el rendimiento general y también sobre la experiencia de usuario.

5. Asunción de que los desarrollos móviles pueden realizarse con poco Dinero/Recursos

Pantalla pequeña != Proyecto pequeño (como ejemplo podeis echar un vistazo al desarrollo de IF en este mismo site). Muchos nuevos desarrolladores para móviles (y, desafortunadamente, sus jefes) tienen la errónea impresión de que los proyectos de desarrollo para móviles pueden ser realizados mas o menos un fin de semana y por estudiantes hasta las trancas de café (sip, yo también lo he visto por desgracia. Desde entonces tengo pesadillas). No obstante, la realidad es que la mayor parte de los proyectos fructuosos requieren especificaciones funcionales, programación de tareas, seguimiento de errores, ingenieros y diseñadores dedicados, aseguramiento de la calidad y planes de versiones y mantenimiento, al igual que los proyectos de desarrollo de software tradicional.

6. Uso de prototipos como inicio del desarrollo de aplicaciones Android

Demasiadas veces hemos visto una aplicación que básicamente era un hola mundo con un montón de código de ejemplo pegado en lugares al azar. No existe ningún tipo de previsión (requerimientos) ni tampoco se hace ningún tipo de diseño en el código, tampoco existe en muchas ocasiones un fichero de proyecto.

Tomémonos nuestro tiempo para aprender y experimentar con la plataforma Android en un primer momento. Más tarde, sentémonos con el equipo y pensemos en cómo realmente queremos empezar a construir y a empezar desde cero. Al final, ahorraremos tiempo y frustraciones innecesarias y obtendremos código de calidad mas sencillo de mantener en futuras versiones.

7. Integración con el Sistema Operativo lamentable o pobre en el mejor de los casos

La plataforma Android proporciona muchas funcionalidades para que los desarrolladores integren sus trabajos con el propio sistema e incluso con otras aplicaciones. Debemos aprovechar las ventajas de dichas funcionalidades tales como widgets de escritorio, Content Providers, intent handling, y otras muchas (no traduzco por que me queda como el culo). El usar estas características de la plataforma es lo que diferenciará nuestra aplicación de otra mas genérica.

8. Errónea definición de los detalles de configuración de la aplicación

El fichero de configuración de la aplicación (Android Manifest file) es el eje central de la misma, el problema es que la información que contiene es en muchas ocasiones errónea, incluso en aplicaciones ya publicadas. Muchos desarrolladores no especifican de forma correcta las características del dispositivo soportado.

Otro error bastante común en el fichero de configuración de la aplicación es el registro de permisos innecesarios. Estos errores pueden producir que la aplicación se publique incorrectamente en Android Market, lo que resulte en puntuaciones bajas por parte de los usuarios y otras muchas cosas.

9. Desarrollando una aplicacion iPhone para Android

Seguro que lo has visto. Yo lo he visto. Te descargas la mega aplicación para tu flamante nuevo terminal, y resulta que la aplicación se comporta y luce exactamente igual que una aplicación típica de iOS (iKaka). No es divertido para nadie y menos para mi, que no lo puedo ni ver. La plataforma Android tiene su propio look&feel y su propio comportamiento, que ademas es el que los usuarios Android esperamos — recordemos que hemos preferido comprar un dispositivo Android en primer lugar en vez de un iKaka. Estas aplicaciones son de forma frecuente las que ademas no están integradas en el sistema, no usan widgets, no usan proveedores de contenidos, etc, en definitiva no usan las características que provee la propia plataforma, y que hacen que la aplicación quede mas fuera de lugar si cabe.

10. Falta de mantenimiento después de la publicación

¿Te has parado a mirar en tu terminal cuantas de las aplicaciones que tienes instaladas nunca han sufrido ninguna actualización, mientras otras son actualizadas de forma constante? Para lograr que las aplicaciones mantengan su relevancia, los desarrolladores deben permanecer al tanto de las actualizaciones de las mismas, me explico. La plataforma Android se encuentra madurando a un ritmo constante. Debemos prestar especial atención a las comunicaciones que recibimos del Market Android pues muy frecuentemente avisan de los cambios necesarios que los desarrolladores deben acometer en sus aplicaciones. Sin esas actualizaciones, algunas aplicaciones pueden quedar descolgadas. Asegúrate de que tu aplicación no es una de ellas.

En consecuencia, si somos conscientes, lo podremos evitar….

La mejor forma de evitar cometer un error es ser conscientes del peligro de hacerlo en primer lugar. Aquí he mostrado los primeros 10 errores mas comunes que he visto en el poco tiempo que llevo con este asunto. Seguro que esta simple alerta te vacunan a ti y a tu equipo contra estos errores absurdos.

 

Un saludo a todos.

Buscando dependencias entre paquetes en Ubuntu con apt-rdepends

Hola a todos de nuevo,

en algunas ocasiones nos vemos en la necesidad de buscar todas las dependencias de un paquete. Hasta hace relativamente poco tiempo yo buscaba dicha informacion en aptitude, entrando en el paquete, o bien buscaba por Inet la información que me hacia falta. En este tutorial voy a explicar como usar la herramienta apt-rdepends para de forma recursiva listar todas las dependencias de un paquete Debian/Ubuntu.

1 Instalación de apt-rdepends

Puedes instalar apt-rdepends de la siguiente forma en el caso de que seas root:

apt-get install apt-rdepends

en otro caso deberás usar:

sudo apt-get install apt-rdepends

2 Usar apt-rdepends

apt-rdepends puede usarse como a continuación se indica

apt-rdepends <packagename>

Por ejemplo, si quisiésemos buscar todas las dependencias del paquete at de forma recursiva obtendriamos la siguiente información:

eloy@ubuntuEEEbox:~$ apt-rdepends at
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo la información de estado… Hecho
at
Depende: libc6 (>= 2.7)
Depende: libpam0g (>= 0.99.7.1)
Depende: lsb-base (>= 3.2-14)
Depende: upstart-job
libc6
Depende: debconf (>= 0.5)
Depende: debconf-2.0
Depende: findutils (>= 4.4.0-2ubuntu2)
Depende: libc-bin (= 2.11.1-0ubuntu7)
Depende: libgcc1
Depende: tzdata
debconf
Depende: debconf-english
Depende: debconf-i18n
PreDepende: perl-base (>= 5.6.1-4)
debconf-english
Depende: debconf
debconf-i18n
Depende: debconf
Depende: liblocale-gettext-perl
Depende: libtext-charwidth-perl
Depende: libtext-iconv-perl
Depende: libtext-wrapi18n-perl
liblocale-gettext-perl
Depende: libc6 (>= 2.2)
PreDepende: perl-base (>= 5.10.0-24ubuntu4)
PreDepende: perlapi-5.10.0
perl-base
PreDepende: dpkg (>= 1.14.20)
PreDepende: libc6 (>= 2.11)
dpkg
PreDepende: coreutils (>= 5.93-1)
PreDepende: libc6 (>= 2.11)
PreDepende: lzma
coreutils
PreDepende: libacl1 (>= 2.2.11-1)
PreDepende: libattr1 (>= 2.4.41-1)
PreDepende: libc6 (>= 2.11)
PreDepende: libselinux1 (>= 1.32)
libacl1
Depende: libattr1 (>= 2.4.41-1)
Depende: libc6 (>= 2.4)
libattr1
Depende: libc6 (>= 2.4)
libselinux1
Depende: libc6 (>= 2.8)
lzma
Depende: libc6 (>= 2.4)
Depende: libgcc1 (>= 1:4.1.1)
Depende: libstdc++6 (>= 4.4.0)
libgcc1
Depende: gcc-4.4-base (= 4.4.3-4ubuntu5)
Depende: libc6 (>= 2.2.4)
gcc-4.4-base
libstdc++6
Depende: gcc-4.4-base (= 4.4.3-4ubuntu5)
Depende: libc6 (>= 2.4)
Depende: libgcc1
perlapi-5.10.0
libtext-charwidth-perl

Depende: libc6 (>= 2.1.3)
Depende: perl-base (>= 5.10.0-24ubuntu4)
Depende: perlapi-5.10.0
libtext-iconv-perl
Depende: libc6 (>= 2.1.3)
Depende: perl-base (>= 5.10.0-24ubuntu4)
Depende: perlapi-5.10.0
libtext-wrapi18n-perl
Depende: libtext-charwidth-perl
debconf-2.0
findutils

PreDepende: libc6 (>= 2.7)
libc-bin
tzdata

Depende: debconf (>= 0.5)
Depende: debconf-2.0
libpam0g
Depende: debconf (>= 0.5)
Depende: debconf-2.0
Depende: libc6 (>= 2.8)
lsb-base
Depende: ncurses-bin
Depende: sed
ncurses-bin
PreDepende: libc6 (>= 2.4)
PreDepende: libncurses5 (>= 5.6+20071006-3)
libncurses5
Depende: libc6 (>= 2.4)
sed
Depende: dpkg (>= 1.15.4)
Depende: install-info
PreDepende: libc6 (>= 2.4)
PreDepende: libselinux1 (>= 1.32)
install-info
Depende: libc6 (>= 2.4)
upstart-job
eloy@ubuntuEEEbox:~$

3 Links de interés

Nota: Recuerda de vez en cuando pinchar en la publicidad por favor.


Ingresos año 2011

Hola a todos….

Paso a publicar los ingresos obtenidos por el site en el pasado año 2011……resultan muy curiosos desde luego.

Segun adSense de Google:

  • Ingresos totales/año 25,99€
  • Páginas vistas* 15133
  • Número de clicks 89

*Las visitas a una página son lo que Google cuenta en los informes cada vez que un usuario ve una página con anuncios de Google. Contamos una visita sea cual sea el número de anuncios publicados en la página.

Hace unos días publique las visitas que tiene la página en las estadísticas que publico anualmente. El número de visitas para 2011 era de 61315, ¿solo 89 clicks habeis hecho?, anda que menudos cojones que tenéis….

Bueno, pues nada, hasta aquí los datos de los que dispongo en adSense. Que cada uno saque sus conclusiones sobre el coste de mantener un site como este…….

Sincronización de ficheros entre dos servidores usando Unison

En este tutorial vamos a ver cómo realizar sincronización de ficheros entre dos servidores Ubuntu usando una herramienta de nombre Unison. Unison es una herramienta de sincronización similar a rsync (tengo algún articulo sobre rsync en el site), la gran diferencia respecto a ella es que Unison traza/sincroniza cambios bidireccionalmente, ficheros modificados en el servidor 1 serán replicados en el servidor 2 y vice versa.

Notas preliminares

foto de Eloy Mier Pérez
En este tutorial voy a hacer uso de los siguientes dos servidores Ubuntu 11.10:

  • server1.example.com con dirección IP 192.168.0.100
  • server2.example.com con dirección IP 192.168.0.101
La idea del ejemplo es la sincronización del directorio /var/www entre ambos servidores. Unison lo voy a ejecutar como usuario root de forma que la herramienta tenga los privilegios suficientes para sincronizar los permisos de grupo y de usuario.
Los pasos a dar en el tutorial los vamos a rfealizar como root, asi que aseguremonos de ser root:
sudo su

Instalando Unison

Unison debe ser instalado tanto en el servidor1 como en el servidor2; además como vamos a conectar desde el servidor1 al servidor2 usando ssh, vamos a necesitar tambien los paquetes relativos a SSH. Para lograrlo debemos ejecutar:

apt-get install unison openssh-server ssh

Creación de claves privada/publica en el servidor 1

Ahora vamos a crear el par de claves privada/publica en el servidor server1.example.com:

ssh-keygen -t dsa

root@server1:~# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): <– ENTER
Created directory ’/root/.ssh’.
Enter passphrase (empty for no passphrase): <– ENTER
Enter same passphrase again: <– ENTER
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
32:0f:f5:49:f0:32:f8:d0:63:8d:44:88:a5:12:f9:73 root@server1.example.com
The key’s randomart image is:
+–[ DSA 1024]—-+
|  .. o.o+        |
|  …..+ =       |
|  … o O +      |
|   .o E= * .     |
|     o+ S o      |
|       =         |
|        .        |
|                 |
|                 |
+—————–+
root@server1:~#

Es importante no introducir una clave de paso pues si la indicamos la sincronización no va a funcionar sin la intervención del usuario, por lo tanto cuando nos la pida, simplemente pulsad ENTER!.

El siguiente paso será copiar la clave pública al servidor server2.example.com (en este servidor debe estar habilitada la cuenta de root y activado el loggin remoto). Para habilitar el loggin de root en un sistema Ubuntu simplemente le asignamos una contraseña a la cuenta de root:

sudo passwd root

Para verificar que la cuenta de root puede contectar mediante ssh debemos echar un vistazo a la directiva PermitRootLogin en el fichero /etc/ssh/sshd_config. Después de cualquier cambio en este fichero, deberemos re arrancar el servicio ssh.

Retomando el asunto de la clave, vamos a proceder a la copia de la misma:

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101

root@server1:~# ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101
The authenticity of host ’192.168.0.101 (192.168.0.101)’ can’t be established.
ECDSA key fingerprint is a2:38:f3:df:7a:6c:b6:3c:d6:c3:9c:88:93:e2:f0:63.
Are you sure you want to continue connecting (yes/no)? <– yes (you will see this only if this is the first time you connect to server2)
Warning: Permanently added ’192.168.0.101′ (ECDSA) to the list of known hosts.
root@192.168.0.101′s password: <– server2 root password
Now try logging into the machine, with ”ssh ’root@192.168.0.101′”, and check in:

~/.ssh/authorized_keys

to make sure we haven’t added extra keys that you weren’t expecting.

root@server1:~#

Ahora debemos verificar en server2.example.com que la clave publica de server1 ha sido correctamente transferida:

 cat $HOME/.ssh/authorized_keys

ssh-dss AAA....+UjQ== root@server1.example.com

Ejecutando Unison

Ahora vamos a ejecutar Unison por primera vez para sincronizar el directorio /var/www en ambos servidores. En server1.example.com ejecutamos:

unison /var/www ssh://192.168.0.101//var/www

La salida será similar a esta – Es posible que tengas que responder algunas preguntas al ser esta la primera ejecucion:

root@server1:~# unison /var/www ssh://192.168.0.101//var/www
Contacting server…
Connected [//server1.example.com//var/www -> //server2.example.com//var/www]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
/var/www
//server2.example.com//var/www
This can happen either because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different archive format.

Update detection may take a while on this run if the replicas are large.

Unison will assume that the ’last synchronized state’ of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.

If you see this message repeatedly, it may be because one of your machines
is getting its address from DHCP, which is causing its host name to change
between synchronizations.  See the documentation for the UNISONLOCALHOSTNAME
environment variable for advice on how to correct this.

Donations to the Unison project are gratefully accepted:

http://www.cis.upenn.edu/~bcpierce/unison

Waiting for changes from server| webalizer
Reconciling changes

local          server2.e…
dir      —->            apps  [f] <– ENTER
file     —->            index.html  [f] <– ENTER
link     —->            ispconfig  [f] <– ENTER
dir      —->            php-fcgi-scripts/apps  [f] <– ENTER
dir      —->            webalizer  [f] <– ENTER
link     —->            webmail  [f] <– ENTER

Proceed with propagating updates? [] <– y
Propagating updates

UNISON 2.32.52 started propagating changes at 14:25:02 on 09 Dec 2011
[BGN] Copying apps from /var/www to //server2.example.com//var/www
[BGN] Copying index.html from /var/www to //server2.example.com//var/www
[BGN] Copying ispconfig from /var/www to //server2.example.com//var/www
[BGN] Copying php-fcgi-scripts/apps from /var/www to //server2.example.com//var/www
[BGN] Copying webalizer from /var/www to //server2.example.com//var/www
[BGN] Copying webmail from /var/www to //server2.example.com//var/www
[END] Copying ispconfig
[END] Copying webmail
[END] Copying apps
[END] Copying webalizer
[END] Copying index.html
[END] Copying php-fcgi-scripts/apps
UNISON 2.32.52 finished propagating changes at 14:25:03 on 09 Dec 2011

Saving synchronizer state
Synchronization complete at 14:25:03  (6 items transferred, 0 skipped, 0 failed)
root@server1:~#

Ahora procedamos a verificar el directorio /var/www tanto en server1 como en server2, y debiéramos ver que se encuentran a nivel.

Por supuesto, que si no queremos ejecutar Unison de forma interactiva, podremos crear un fichero de preferencias (/root/.unison/default.prf) que contendrá la configuración que de otra forma debemos proporcionar a traves de la linea de comandos:

vi /root/.unison/default.prf

# Unison preferences file
# Roots of the synchronization
root = /var/www
root = ssh://192.168.0.101//var/www

# Paths to synchronize
#path = current
#path = common
#path = .netscape/bookmarks.html

# Some regexps specifying names and paths to ignore
#ignore = Path stats    ## ignores /var/www/stats
#ignore = Path stats/*  ## ignores /var/www/stats/*
#ignore = Path */stats  ## ignores /var/www/somedir/stats, but not /var/www/a/b/c/stats
#ignore = Name *stats   ## ignores all files/directories that end with "stats"
#ignore = Name stats*   ## ignores all files/directories that begin with "stats"
#ignore = Name *.tmp    ## ignores all files with the extension .tmp

#When set to true, this flag causes the user interface to skip
#asking for confirmations on non-conflicting changes. (More
#precisely, when the user interface is done setting the
#propagation direction for one entry and is about to move to the
#next, it will skip over all non-conflicting entries and go
#directly to the next conflict.)
auto=true

# When this is set to true, the user interface will ask no
# questions at all. Non-conflicting changes will be propagated;
# conflicts will be skipped.
batch=true

# !When this is set to true, Unison will request an extra
# confirmation if it appears that the entire replica has been
# deleted, before propagating the change. If the batch flag is
# also set, synchronization will be aborted. When the path
# preference is used, the same confirmation will be requested for
# top-level paths. (At the moment, this flag only affects the
# text user interface.) See also the mountpoint preference.
confirmbigdel=true

# When this preference is set to true, Unison will use the
# modification time and length of a file as a `pseudo inode
# number' when scanning replicas for updates, instead of reading
# the full contents of every file. Under Windows, this may cause
# Unison to miss propagating an update if the modification time
# and length of the file are both unchanged by the update.
# However, Unison will never overwrite such an update with a
# change from the other replica, since it always does a safe
# check for updates just before propagating a change. Thus, it is
# reasonable to use this switch under Windows most of the time
# and occasionally run Unison once with fastcheck set to false,
# if you are worried that Unison may have overlooked an update.
# The default value of the preference is auto, which causes
# Unison to use fast checking on Unix replicas (where it is safe)
# and slow checking on Windows replicas. For backward
# compatibility, yes, no, and default can be used in place of
# true, false, and auto. See the section "Fast Checking" for more
# information.
fastcheck=true

# When this flag is set to true, the group attributes of the
# files are synchronized. Whether the group names or the group
# identifiers are synchronizeddepends on the preference numerids.
group=true

# When this flag is set to true, the owner attributes of the
# files are synchronized. Whether the owner names or the owner
# identifiers are synchronizeddepends on the preference
# extttnumerids.
owner=true

# Including the preference -prefer root causes Unison always to
# resolve conflicts in favor of root, rather than asking for
# guidance from the user. (The syntax of root is the same as for
# the root preference, plus the special values newer and older.)
# This preference is overridden by the preferpartial preference.
# This preference should be used only if you are sure you know
# what you are doing!
prefer=newer

# When this preference is set to true, the textual user interface
# will print nothing at all, except in the case of errors.
# Setting silent to true automatically sets the batch preference
# to true.
silent=true

# When this flag is set to true, file modification times (but not
# directory modtimes) are propagated.
times=true

Los comentarios en el fichero son auto explicativos a excepción de las directivas path. Si no se especifican directivas path, se sincronizarán los directorios especificados en las directivas root. Si se especifican directivas path, entonces las rutas pasan a ser relativas a los directorios especificados por la directiva root (ej. root=/var/www y path=current se traduce en /var/www/current) y solo esos subdirectorios son sincronizados, y no lo es la ruta completa especificada por la directiva root.

Para obtener mas informacion sobre las opciones disponibles para Unison puedes consultar su página de man:

man unison

Ahora que ya hemos escrito todas las preferencias en el fichero correspondiente de Unison, ahora podemos usar Unison sin argumentos:

unison

Programando Unison mediante cron

Si queremos automatizar la sincronización, podemos hacerlo usando cron del sistema definiendo para ello una tarea. Recuerdo a los lectores el articulo que hace no mucho tiempo escribí en parte sobre el asunto de cron y que podéis encontrar aquí.

Para la edicion del fichero de tareas de cron:

crontab -e

Agregamos la ejecucion de nuestro comando (revisad el articulo indicado anteriormente para mas detalle del mismo):

*/5 * * * * /usr/bin/unison &> /dev/null

El comando anterior ejecutará Unison cada 5 minutos; ajustalo a tus necesidades. En el comando se puede apreciar el uso de la ruta completa al comando Unison, simplemente para asegurar que cron sabe donde localizar dicho comando. La ubicación de Unison podria varia de un sistema a otro. Para saber donde tienes ubicado el comando:

which unison

Enlaces

Nota: Recuerda de vez en cuando pinchar en la publicidad por favor.