Mis puestos de trabajo

Mucho tiempo rodando, muchas horas sentado en una silla. Revisando el blog he visto que tenía algunas entradas enseñando los que han sido mis puestos de trabajo a lo largo de los años. Desgraciadamente sólo había un par de ellas y he pasado por muchos, muchos sitios distintos en mi carrera profesional.

Picado el amor propio he dado una batida por Flickr, por Google+ y por mis otros repositorios de fotos intentando recopilar todas las que muestran sitios en los que he trabajado. Algunas más he encontrado, pero muchas otras faltan. Seguiré buscando porque creo que alguna más tiene que haber escondida en algún sitio y seguiré documentando los nuevos cubículos que tenga la suerte de ocupar.

¿Importa el caché?

Si, desde luego que si.

Ayer, 28 de Agosto, instalé y configuré el plugin W3 Total Cache en mi blog. Este plugin no sólo proporciona una multitud de parámetros para controlar el cacheo de los contenidos de tu blog, sino que también proporciona funcionalidades tan importantes como la combinación, minimización y compresión de las hojas de estilo, ficheros de JavaScript y objetos de tu web.

En mi caso activé la mayor parte de las opciones de optimización y el resultado es el que podéis ver en el gráfico adjunto extraído del servicio de monitorización que uso desde hace ¡¡7 años!!, Site24x7.

Monitorización

How to install a LAMP environment in a Ubuntu Server 13.04 in one line

Andy, Apache WarriorAnd in this case with the ‘P’ I am referring to PHP and not to Perl.

There are a lot of options (this is Linux), first one is using the tasksel tool.

For example, you can use tasksel to see the list of available tasks to install.

jtome@ubuntu:~$ sudo tasksel --list
i server        Basic Ubuntu server
i openssh-server        OpenSSH server
u dns-server    DNS server
u lamp-server   LAMP server
u mail-server   Mail server
u postgresql-server     PostgreSQL database
u print-server  Print server
u samba-server  Samba file server
u tomcat-server Tomcat Java server
u cloud-image   Ubuntu Cloud Image (instance)
u virt-host     Virtual Machine host
u ubuntustudio-graphics 2D/3D creation and editing suite
u ubuntustudio-audio    Audio recording and editing suite
u edubuntu-desktop-gnome        Edubuntu desktop
u kubuntu-active        Kubuntu Active
u kubuntu-desktop       Kubuntu desktop
u kubuntu-full  Kubuntu full
u ubuntustudio-font-meta        Large selection of font packages
u lubuntu-desktop       Lubuntu Desktop
u lubuntu-core  Lubuntu minimal installation
u mythbuntu-desktop     Mythbuntu additional roles
u mythbuntu-frontend    Mythbuntu frontend
u mythbuntu-backend-master      Mythbuntu master backend
u mythbuntu-backend-slave       Mythbuntu slave backend
u ubuntustudio-photography      Photograph touchup and editing suite
u ubuntustudio-publishing       Publishing applications
u ubuntu-desktop        Ubuntu desktop
u ubuntu-usb    Ubuntu desktop USB
u ubuntu-touch  Ubuntu touch
u ubuntustudio-video    Video creation and editing suite
u xubuntu-desktop       Xubuntu desktop
u edubuntu-dvd-live     Edubuntu live DVD
u kubuntu-active-live   Kubuntu Active Remix live CD
u kubuntu-live  Kubuntu live CD
u kubuntu-dvd-live      Kubuntu live DVD
u lubuntu-live  Lubuntu live CD
u ubuntustudio-dvd-live Ubuntu Studio live DVD
u ubuntu-live   Ubuntu live CD
u ubuntu-usb-live       Ubuntu live USB
u xubuntu-live  Xubuntu live CD
u manual        Manual package selection

As you can see there are two of them already installed: Basic Ubuntu server and OpenSSH server. And a lot more that you can install in a single line.

For example to install a complete LAMP server you could execute the following command

jtome@ubuntu:~$ sudo tasksel install lamp-server
The following NEW packages will be installed:
  apache2 apache2-mpm-worker{a} apache2-utils{a} apache2.2-bin{a} apache2.2-common{a} 
  libaio1{a} libapr1{a} libaprutil1{a} libaprutil1-dbd-sqlite3{a} libaprutil1-ldap{a} 
  libdbd-mysql-perl{a} libdbi-perl{a} libhtml-template-perl{a} libmysqlclient18{a} 
  libnet-daemon-perl{a} libplrpc-perl{a} libterm-readkey-perl{a} mysql-client 
  mysql-client-5.5{a} mysql-client-core-5.5{a} mysql-common{a} mysql-server 
  mysql-server-5.5{a} mysql-server-core-5.5{a} php5-cli php5-common{a} php5-mysql ssl-cert{a} 
0 packages upgraded, 28 newly installed, 0 to remove and 0 not upgraded.
Need to get 33.2 MB of archives. After unpacking 111 MB will be used.
Do you want to continue? [Y/n/?]

This command installs a complete LAMP environment with PHP5 and Perl. Good, but not good enough for me. I don’t need Perl and I prefer not to install it.

Therefore I am going to use aptitude to install only the packages I need

jtome@ubuntu:~$ sudo aptitude install apache2 apache2-mpm-prefork mysql-client mysql-server php5-cli php5-mysql libapache2-mod-php5
The following NEW packages will be installed:
  apache2 apache2-mpm-prefork apache2-utils{a} apache2.2-bin{a} apache2.2-common{a} libaio1{a} 
  libapache2-mod-php5 libapr1{a} libaprutil1{a} libaprutil1-dbd-sqlite3{a} libaprutil1-ldap{a} 
  libdbd-mysql-perl{a} libdbi-perl{a} libmysqlclient18{a} libnet-daemon-perl{a} 
  libplrpc-perl{a} libterm-readkey-perl{a} mysql-client mysql-client-5.5{a} 
  mysql-client-core-5.5{a} mysql-common{a} mysql-server mysql-server-5.5{a} 
  mysql-server-core-5.5{a} php5-cli php5-common{a} php5-mysql ssl-cert{a} 
0 packages upgraded, 28 newly installed, 0 to remove and 0 not upgraded.
Need to get 35.8 MB of archives. After unpacking 119 MB will be used.
Do you want to continue? [Y/n/?]

After typing ‘y’ in order to continue and after waiting some seconds in order all the packages been downloaded and installed you will have a fully functional LAMP environment in order to work with it (the only question you will have to answer is the password for the root user of the MySQL server).

References

I have seen the info about the tasksel command in this blog post.

Generador de ruido

NoiseMe he preparado un pequeño script para generar distintos tipos de “ruido”.

Me he basado en esta entrada del blog the unreasonable man.

Es un script muy tonto, pero hace su trabajo.

#!/bin/sh

NOISE='white'         # Opciones: white, tpdf, pink, brown
DURATION='00:20:00'

if [ -n "$1" ]; then
  NOISE=$1
fi

nohup play \
      --no-show-progress \
      --channels 2 \
      --rate 48k \
      --type s16 \
      - \
      synth ${DURATION} ${NOISE}noise create \
      band -n 1200 200 \
      tremolo 20 .1 \
      < /dev/zero \
      2> /dev/null &

Cuando lo ejecutas genera veinte minutos de ruido. Por defecto, si no le pasas ningún parámetro, genera ruido blanco. Se puede invocar con un parámetro (white, tpdf, pink o brown) que define el tipo de ruido que quieres generar.

Lo utilizo para generar bloques de 20 minutos de aislamiento y concentración (o al menos eso intento).

Como usar svnsync para sincronizar dos repositorios Subversion

Código fuenteEl objetivo es crear un “mirror” local de un repositorio Subversion remoto.

El repositorio original, del que queremos hacer la réplica, es svnsource y está ubicado en la URL remota http://server1.ejemplo.com/svn/svnsource.

El nuevo repositorio que queremos que sea una réplica de svnsource lo vamos a denominar svntarget y estará ubicado en el servidor sobre el que estamos trabajando en el directorio /srv/svn/svntarget.

Paso 1. Creación del repositorio svntarget.

El repositorio destino no puede existir previamente (si existe debemos borrarlo) así que el primer paso es crear un nuevo repositorio vacío.

sqcman@sqclab:~$ svnadmin create --fs-type fsfs /srv/svn/svntarget

Paso 2. Ajustar los permisos del repositorio svntarget.

El programa svnsync debe poder modificar todas las propiedades del repositorio destino. Para ello deberemos crear un hook previo a modificaciones en las propiedades del repositorio (pre-revprop-change) que no ponga ninguna limitación.

sqcman@sqclab:~$ echo '#!/bin/sh' > /srv/svn/ecs/hooks/pre-revprop-change
sqcman@sqclab:~$ chmod 755 /srv/svn/ecs/hooks/pre-revprop-change

Paso 3. Inicializar el repositorio svntarget.

El siguiente paso es utilizar el programa svnsync para inicializar el repositorio destino, svntarget, indicando desde qué repositorio remoto se debe replicar (en nuestro ejemplo http://server1.ejemplo.com/svn/svnsource).

sqcman@sqclab:~$ svnsync init file:///srv/svn/svntarget http://server1.ejemplo.com/svn/svnsource
Copied properties for revision 0.

Cuando ejecutemos este comando nos solicitará, si no tenemos las credenciales ya cacheadas, el usuario y contraseña con el que conectarnos al repositorio remoto.

Paso 4. Ejecutar la primera sincronización.

Ya lo tenemos todo listo para ejecutar por primera vez el proceso de sincronización. Para ello utilizamos de nuevo el programa svnsync con el subcomando sync indicándole el repositorio destino (en nuestro ejemplo file:///srv/svn/svntarget).

sqcman@sqclab:~$ svnsync --non-interactive sync file:///srv/svn/svntarget

Después de la ejecución de este comando dispondremos en local de una copia completa del repositorio origen.

Paso 5. Automatizar la sincronización.

Para asegurar que el repositorio destino se mantenga sincronizado con el repositorio origen es necesario que ejecutemos el proceso de sincronización de forma periódica. Hay distintas alternativas, la más inmediata sería introducir un post-commit en el repositorio origen que dispare el proceso de sincronización en el servidor destino. La otra sería ejecutar periódicamente de forma automática el proceso de sincronización en el servidor destino. Este segundo acercamiento es el que vamos a configurar en este ejemplo utilizando una tarea cron.

Debemos analizar y ajustar convenientemente los permisos del repositorio Subversion destino para asegurarnos de que el usuario que va a ejecutar el proceso de sincronización tenga todos los permisos necesarios sobre el repositorio Subversion destino. En mi caso es el usuario www-data quien va a ejecutar el cron para sincronizar el repositorio.

sqcman@sqclab:~$ sudo chmod -R www-data:www-data /srv/svn/svntarget
sqcman@sqclab:~$ sudo crontab -u www-data -l
...
...
# m h  dom mon dow   command
*/5 * * * * /usr/bin/svnsync --non-interactive sync file:///srv/svn/ecs

Por último podemos hacer un seguimiento y control de la ejecución del cron revisando los logs del sistema.

sqcman@sqclab:~$ grep svnsync /var/log/syslog
Nov 15 11:40:01 sqclab CRON[5920]: (www-data) CMD (/usr/bin/svnsync --non-interactive sync file:///srv/svn/svntarget)

Referencias