inicio mail me! sindicaci;ón

Archive for Shell scripting

Comparando utilidades de compresión

Hoy ha tocado colocar un poco el disco duro, y en estas que me da por mirar cuánto ocupa el directorio

.thunderbird/

donde guardo todo el correo que recibo (desde hace años, incluído spam). 1.8G suman todos los correos. Casi nada, teniendo en cuenta que es texto plano.

Buceando en ese directorio llego al fichero

Inbox

de una de mis cuentas de correo. Todo lo que almacena está en formato mbox, que es lo que habitualmente usan los lectores de correo (o MUAs, Mail User Agent). Los MTAs (Mail Transport Agent) suelen usar el formato Maildir ya que evita el cuello de botella que impone mbox ante la concurrencia.

El caso es que me da por mirar a ver qué tal comprimen los diferentes algoritmos de compresión que tengo en Linux, que son básicamente cuatro: bzip2, LZMA (7zip y versiones nuevas del tar), el tradicional Zip (herramientas zip y gzip) y RAR.

Me he centrado sólo en el ratio de compresión de cada programa, no me he preocupado por cuánto tardan en comprimir, ni cuánto se tarda en listar el contenido de un fichero, o en descomprimir un sólo fichero. De hecho es que no he diferenciado entre formatos que comprimen y archivan a la vez, y los que sólo comprimen (p.ej.

bzip2

). He comprimido un sólo fichero, y era un fichero de texto (en formato

mbox

).

Los resultados para un solo fichero

mbox

de 118M:

Programa Algoritmo Tamaño ¿Libre?
gzip -9 LZ77 modificado 65M
zip -v9 LZ77 modificado 65M
bzip2 Burrous-Wheeler/Huffman 63M
rar LZSS 56M No
7-zip LZMA 54M
tar –lzma LZMA 54M

Con ¿Libre? me refiero a si yo conozco implementaciones libres del algoritmo tanto para comprimir como para descomprimir.

El LZ77 modificado también se conoce como DEFLATE.

Se concluye lo que más o menos ya habíamos observado a base bajarnos discos:

LZMA

es el que más comprime (y es libre),

RAR

no se queda muy lejos (pero no es libre, aunque es bastante multiplataforma),

bzip2

mejora un poco lo del tradicional

Zip

, pero éstos dos ya van teniendo que jubilarse.

Las únicas ventajas que tienen

zip/gzip/bzip2

son a) que aparentemente tardan menos en comprimir (lógico) y b) que están mucho más difundidos: es difícil encontrar un sistema que no tenga alguno de los tres.

LZMA

en cambio, es más difícil de encontrar.

Update (2009-02-17): Hoy en barrapunto.com han publicado Comparación entre diferentes algoritmos de compresión en Linux . Una noticia que enlaza a tres sitios donde han hecho comparativas similares, pero mucho más extensas:

Un cd mejorado

A menudo echaba en falta poder hacer

pablo@golgi:~$ cd dir1/dir2/

sin preocuparme de si

dir1/

y/o

dir2/

estaban creados, confiando en que

cd

los crearía.

Si bien se puede hacerle un hack al fuente de bash, es más laborioso que crear una función para la shell y añadirla a

.bashrc

:

ccd () {
if [ $# == 1 ]; then
if [ -d $1 ]; then
cd $1;
else
mkdir -p $1 && cd $1;
fi;
else
if [ $# == 0 ]; then
cd $HOME;
else
printf “Too many arguments\n”;
fi;
fi;
}

Por ejemplo:

pablo@golgi:~/md$ ccd d1/d2

(no existen ni d1/ ni d2/, así que los crea)

pablo@golgi:~/md/d1/d2$ cd ../..
pablo@golgi:~/md$ ccd d1/d2

(ya existen d1/ y d2/, así que no los crea)

pablo@golgi:~/md/d1/d2$ cd ../..
pablo@golgi:~/md$ ccd d1 d2
Too many arguments
pablo@golgi:~/md$ ccd
pablo@golgi:~$

Y ahora lo que hecho en falta es un plugin para wordpress que represente código adecuadamente.

Añadiendo una firma a los correos que envíe

Una de las cosas que se pueden hacer por la tarde:

#!/bin/bash

ruta=/home/fulano/firmas-correo

firmar()
{

echo -n “” > $1;
#echo “–” >> $1; Esto ya lo pone el thunderbird él solo
#Sacar la frase aqui
cat $1.0 >> $1;

}

for fichero in $ruta/*@*[^0];

do firmar $fichero ;

done;

Mozilla Thunderbird, por cada correo que envía se puede configurar para incluya al final del mismo, él sólo, el contenido de un fichero, precediendo el contenido por dos guiones ‘–’ .

Al abrir el cuadro de escribir mensaje, ya directamente aparece en el widget para escribir el cuerpo del mensaje:

< contenido del fichero>

Bien, mi idea es que cada una de las direcciones de correo que uso tenga su propio fichero con su contenido, llamado $ruta/, p.ej.: /home/fulano/firmas-correo/perki_pat3@yahoo.es. Ese fichero será el que usará Thunderbird.

Lo que me interesa es que el contenido de ese fichero cambie. Para empezar el script de arriba lo que hace es, por cada fichero del directorio /home/fulano/firmas-correo/ cuyo nombre no acabe en 0, escribe en él el contenido de un fichero de igual nombre, pero acabado en .0, y contenido en el mismo directorio. La intención es que justo antes de incluir lo de este último fichero, se incluya una cita, o alguna frase ingeniosa o algo de ascii-art. Una posibilidad es tirar de fortunes. Para que el fichero que incluye Thunderbird cambie, o bien se ejecuta manualmente, o bien, con un cron: 07 * * * * ruta_al_script (en el minuto 07 de cada hora de cada día lo ejecuta, cambiando una vez a la hora).

Pero lo que me gustaría de verdad es montar (o encontrar) una base de datos, que vía web me supla de frases, de forma que un `wget < ...> -O -` arregle el asunto. Bash.org no me hace la faena, y wikiquotes tampoco. Así que tendré que hacer una base de datos que guarde las quotes clasificadas de alguna forma, y un CGI que las lea y las devuelva en distintos formatos (para esto me interesaría texto plano, pero en una aplicación web a lo mejor interesa XML). Y además que permita incluir nuevas quotes. Si sacara algo de tiempo para leer y practicar algo de desarrollo web pues… estaría bien.

Contador de fisgonas

Me intrigaba saber cuánta gente accedía a la fisgona según la hora que fuera y el día, ya que supuse que no sería lo mismo a las 4 de la mañana que a las 10, ni sería lo mismo un domingo o un día de agosto, que un miércoles o un día de febrero. Así que en una madrugada de ahce 15 días aproximadamente escribí una chapucilla en shell script que me permitía dibujar unas gráficas representando número de usuarios respecto a la hora dada. Pese a que debía de haberlo publicado antes, ya que desde entonces ha estado cogiendo polvo, lo he publicado hoy, donde le he dado algún que otro retoque que le faltaba. Of course, sigue siendo cutre a más no poder, pero su función la acomete con eficacia y sin chistar, salvo por un problema: que alguien (o algo) de dreamhost debió matar el proceso allá por el día 23. Así que algo habrá que inventar que permita que se esté ejecutando de continuo el proceso de sondeo, p.ej. programar un cron cada minuto para sondear, y otro cada 10 o 20 minutos para dibujar.

Como ahora mismo tengo mejores cosas que hacer, y no tengo noticias de que a nadie le interese seguir mejorando esto, lo dejo paralizado (freeze).

El contador de fisgonas se puede acceder aquí, y el código fuente del contador de fisgonas acá, y el resto lo sabréis leyendo el código fuente, que es muy reducido.

Creo que respecto a este tema nada más, y si no, pues a los comentarios. Y si a alguien le interesa el contador éste y quiere que se siga mejorando o bien lo mejora él/ella, o bien que pida y [a lo mejor] se le dará.

Actualización (20060820): Aviso que esto de los resultados del siguiente párrafo son elucubraciones mías, así que no tomárselo muy en serio. Lo digo por que esta noticia ha sido meneada, y alguien en los comentarios rebatía, posiblemente con toda la razón, lo que yo escribí.

Bueno, los resultados: se aprecia que de lunes a viernes, y especialmente de martes a jueves, hay unas grandes subidas de usuarios algo después de las 8 de la mañana –hora de entrar a trabajar– y bajadas algo antes de las 12 de la noche –hora de irse al saco. Los lunes la subida es más discreta, al igual que la bajada el viernes. Durante el fin de semana se ve que se alcanza el mismo número de usuarios pico, pero cuesta más y se mantiene por menos tiempo, la subida es más relajada. Ese jueves de esa semana (porque los datos son de sólo una semana) se inicia la subida de usuarios algo antes de las 8 de la mañana, por lo que hubo gente que llegó antes a trabajar ese día.

Acutalización (20060817): Hoy le he hecho algunas mejoras al sistema, por ejemplo, ahora funicona mediante cron. Ya no es un script que tiene que estar permanentemente ejecutándose (los de DreamHost además lo mataban), si no que cada minuto toma una muestra del número de fisgonas que hay (antes era cada 20 segundos, pero cron no permite más definición). Ahora hay 2 resoluciones para las imágenes que se generen desde hoy: 640×480 y la anterior de 2048×1024. El código fuente además, en vez de estar desperdigado en tres ficheros, lo he reunido en uno sólo, que para las pocas líneas de códgio que son, no merece ese jaleo de tres ficheros.