Output

Convertir ficheros CBR a PDF

El formato CBR (Comic Book Archive file) es habitual a la hora de guardar cómics escaneados. Hay varios lectores y dispositivos que leen este formato, pero hay otros que no, por lo que deberemos convertirlo, p.ej. a PDF, que es un formato bastante estándar.

Simplemente se trata de las imágenes de cada página empaquetadas en un fichero comprimido en formato RAR. Además, las imágenes están nombradas de manera que ordenadas alfabéticamente en orden ascendente, la primera de ellas se corresponde con la portada, la segunda, con la página siguiente a la portada, etc.

Así pues, lo primero sería descomprimir el fichero:

pablo@babuino:~/tmp$ unrar x comic.cbr

UNRAR 3.90 beta 2 freeware Copyright (c) 1993-2009 Alexander Roshal

Extracting from comic.cbr

Extracting Escanear0140.jpg OK
Extracting Escanear0141.jpg OK
Extracting Escanear0142.jpg OK
Extracting Escanear0143.jpg OK
Extracting Escanear0002.jpg OK
[...]
All OK
pablo@babuino:~/tmp$

Y ahora, gracias a la librería ImageMagick, disponemos del programa convert, que hace la conversión de todas las imágenes en un único PDF, tomándose su tiempo y su CPU:

pablo@babuino:~/tmp$ time convert *.jpg comic.pdf

real 1m27.699s
user 1m51.987s
sys 0m3.904s
pablo@babuino:~/tmp$

Así pues, ya tenemos un fichero comic.pdf, con las mismas páginas que comic.cbr, y en este caso, con un tamaño casi idéntico.

Similares a los CBR son los ficheros CBZ, CB7, CBT y CBA, sólo que en vez de utlizar RAR, usan, respectivamente, ZIP, 7z, TAR y ACE.

Fuentes:

Output

Comments (0)

Permalink

Creando accesores en Python

Python tiene una característica que son las propiedades, pero al no conocerlas bien y ser particulares de este lenguaje, he creado una minúscula aplicación que genera el código para iniciar y acceder (get y set) a las propiedades de un objeto.

Esencialmente, es una función a la que le pasamos el nombre de las propiedades y su valor inicial, por ejemplo:

buildAccessor([
        (‘configfile’,\’/etc/foo.conf\’),
        ])

Y esto nos genera el código que debemos incluir en el constructor, así como los métodos get y set:

self.__configfile = ‘/etc/foo.conf’

        def getConfigfile(self):
                return self.__configfile

        def setConfigfile(self, value):
                self.__configfile=value

Con lo que si hacemos una prueba:

class objectFoo:
        def __init__(self):
                self.__configfile = ‘/etc/foo.conf’

        def getConfigfile(self):
                return self.__configfile

        def setConfigfile(self, value):
                self.__configfile=value

if __name__==‘__main__’:
        test=objectFoo()
        print(‘test.getConfigfile() says \’ + test.getConfigfile() + \’)
        test.setConfigfile(‘/home/linz/.foo’)
        print(‘Now, test.getConfigfile() says \’ + test.getConfigfile() + \’)

Resulta esto:

pablo@golgi:~/Desktop/py-pwgen$ python test_buildAccessor.py
test.getConfigfile() says ‘/etc/foo.conf’
Now test.getConfigfile() says ‘/home/linz/.foo’
pablo@golgi:~/Desktop/py-pwgen$

He decidido ponerle una página estática, por que puede ser que en el futuro amplíe el trabajo, o incluso que lo suba un SVN.

Output
Python

Comments (0)

Permalink

Comenzando con Aleli

Fue ya hace casi un mes, el 24 de octubre, cuando recibí el comunicado de Forja-RedIRIS de que se había aprobado el proyecto con el que participo en el I Concurso Universitario de Software Libre. Y desde entonces, entre asignaturas, cursos y compromisos apenas he conseguido tiempo para rebañar un poco de documentación sobre lex y yacc, que son unos de los recursos que pienso emplear para desarrollar este proyecto.

Aleli es un proyecto orientado a obtener estadísticas sobre una lista de correo, de forma que a partir de su histórico en formato mbox (p.ej. este) se pueda ver cuántos mensajes se han enviado por día del mes, día de la semana, semana, mes, usuario, etc. La salida sería en el formato de gnuplot para representarla fácilmente.
El primer objetivo será ser capaz de parsear una entrada en formato mbox y abstraerla en una estructura de datos (aparte de verificar si la entrada es correcta). Precisamente para esto es para lo que voy a recurrir a lex y yacc.
Los siguientes objetivos poco a poco los voy perfilando, y mejor ir poco a poco: más vale pájaro en mano que ciento volando, ¿no? Además de que ir maleando los objetivos “en caliente” permite ajustarse mucho mejor a las necesidades reales.

Aleli

Comments (2)

Permalink

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.

Output
Shell scripting

Comments (0)

Permalink

Recopilando los Bruce Schneier Facts

Anoche, tras ver la noticia en meneame hice un script en perl, que con un poquito de bash scripting sirveron para recopilar los más de 100 facts sobre Bruce Schneier, que había en ese momento. Aquí va todo el material:

Orden para ejecutarlo:

pepito@grillo ~$ while [ 1 ]; do wget http://geekz.co.uk/schneierfacts/ -O – 2>/dev/null| ./doo.pl; sleep 10; done;

(se deja un rato, y Ctrl-C)

pepito@grillo ~$

Script en perl (¡guardadlo con permisos de ejecución!) y todas las frases.
Si abrís el archivo y os fijáis, todas acaban en #. De todas las peticiones que se hicieron, es el número de ellas en la que la frase ya estaba en la base de datos. Así, #12 indica que de todas las peticiones se recibieron 12 con esa frase, #1 que se recibió esa frase sólo una vez (creo que no hay ninguna de 1, de 2 hay una, de 3 hay tres, apañaos con grep \#$ frases.txt para saber cuántas líneas acaban en #) . Guardé ese dato para rayarme con el generador de números aleatorios que usa el servidor (la implementación de php). Si lo hago ya lo contaré. Se elimina con sed s/\#[0-9][0-9]//g bruce.db | sed s/\#[0-9]//g -, igualmente las entidades XML tal como ” se reemplazan por su versión texto con secuencias como sed s/\&quot\;/\”/g bruce.db
Por ahora nada más, cuando tenga algo más interesante que contar lo pondré por aquí

Output
Perl

Comments (0)

Permalink