Nuevo Window$ Xp: Le acercamos al holocausto nuclear....

— [ edit | raw ] migrated from node/1077
Pues nada, que me hice eco de ésta noticia en barrapunto. No sé si será una coña, pues está fechada el pasado 28 de Diciembre, pero no he podido evitar sentir un escalofrio recorriendo mis entrañas.... Atentos al comentario sobre el backup de la tripulación, me ha dejado sin palabras ¡¡BUENÍSIMO!!

Gimp: recortar una imagen en línea de órdenes

— [ edit | raw ] migrated from node/1076
A menudo he necesitado este script y por fin me he puesto a implementarlo. Consiste en un script-fu que se le puede pasar a gimp para recortar una imagen de forma automática. Contaré los pasos que he seguido y al final hay un resumen para 'ir más rápido'.

Ingredientes

No os lo vais a creer: gimp.
 # apt-get install gimp
Seguro que en Mindows es más fácil de instalar.

Mi primer script

Lo primero que necesitado ha sido una manera de ejecutar un script. Para ello, he abierto mi imagencilla con Gimp de la forma habitual:
$ gimp tab1.png
Después hay que irse a la ventana principal de Gimp, donde están las herramientas, y acceder a "Exts"->"Script-fu"->"Consola de Script-fu". Se nos abrirá una ventana bastante fea. Antes de avanzar, pulsamos el botón "examinar". Se nos abrirá la ventana de ayuda que podemos tener danzando por ahí mientras nos damos cabezazos contra la pared con nuestro script. Vamos con mi "hola mundo". En esta ocasión, consistió en seleccionar toda la imagen :-D
(gimp-selection-all 1)
Ahora lo explico: estoy llamando a la función "gimp-selection-all" con el parámetro "1", que es el identificador de la imagen (como la acabamos de abrir, debería ser el 1 :D). Para comprobar el resultado, vamos a la ventana de la imagen y debería estar seleccionado todo.

El Script

Ahora que sabemos usar perfectamente script-fu, vamos con el script que recorta una imagen:
(let* \
    ( \
        ( img (gimp-file-load 0 "/ruta_hasta_la_imagen/tab1.png" "tab1.png") ) \
        ( drw (gimp-image-get-active-drawable (car img)) ) \
    )  \
    (plug-in-autocrop 0 (car img)  (car drw)  )\
    (plug-in-colortoalpha 1 (car img) (car drw) '(0 0 0) )  \
    (gimp-file-save 1 (car img) (car drw )   "/ruta_hasta_la_imagen/ejemplo.png" "ejemplo.png") \
)
Lo he separado en líneas para que lo veáis bonito :D. La barra invertida: "\" sólo sirve para indicar que va todo en la misma línea. Ahora explico: "let*" me permite definir variables. Así defino dos: una es "img" y otra "drw". Casi todas las funciones requieren estos parámetros, así que me los guardo "para luego" y así es más fácil todo. Al declarar "img" le asigno el valor devuelto por la función "gimp-file-load", que me ha cargado la imagen, pasándole un "0" ("no interactivo"), la ruta hasta la imagen y "el nombre dado por el usuario", que creo que es el nombre de la imagen sin el path. Igualmente, a "drw" le asigno el resultado de "gimp-image-get-active-drawable", donde " (car img)" es una llamada a una función que me da el primer elemento del vector "img" (no sé explicarlo mejor. No he conseguido quitarme de encima el "car" ése). Con eso ya tengo las dos variables locales que, como locales que son, sólo existirán hasta que cierre el "let*" (por eso lo cierro al final). El primer argumento del resto de funciones siempre es el modo interactivo, el problema es que de homogeneidad nada: unas funciones toman el 0 como "interactivo" y otras como "no-interactivo". En el ejemplo todas están a "no-interactivo". Por orden, hago: Cargar la imagen (como hemos visto), recortar la imagen, transformar el color blanco a alpha (éste es un bonus track) y guardar la imagen. No me enrollo más.

Batch mode

Claro, nada de esto tiene gracia si tengo que estar abriendo el gimp para cada una de mis 159 imágenes que quiero procesar... Así que a currarme la línea de órdenes:
$ gimp -i -b '(let* ( ( img (gimp-file-load 0 "/ruta_hasta_la_imagen/tab1.png" "tab1.png") ) ( drw (gimp-image-get-active-drawable (car img)) ) )  (plug-in-autocrop 0 (car img)  (car drw)  ) (plug-in-colortoalpha 1 (car img) (car drw) '(0 0 0) )   (gimp-file-save 1 (car img) (car drw )   "/ruta_hasta_la_imagen/ejemplo.png" "ejemplo.png") )  (gimp-quit 0)'
A gimp tengo que pasarle la orden "-i" (no interactivo) y "-b" (ejecútame este batch) con la ristra que hemos comentado antes. Tan sólo le he añadido un detallito, que es la orden "gimp-quit" para que no se quede en "modo gimp". Hay una forma de hacer que me procese todas las imágenes de golpe... Pero eso lo dejaré para otra receta, ya que yo voy a utilizar un precioso Makefile que me va a ir transformando todas las imágenes y me las va a actualizar cuando las modifique (mientras que con gimp tendría que volver a procesar todas), así que lo dejaré en el tintero.

Y fin

No sé si esto resultará útil para alguien, pero puedo asegurar que para mí sí, y como no sabía dónde ponerlo y el script-fu es infernal, lo he plantao aquí, que hacía mucho que no saba señales de vida.

Referencias

Pues un poco de aquí y otro de allá:

Suicidios de discos duros...

— [ edit | raw ] migrated from node/1071
En realidad no sé si debo catalogar ésto como una receta o no. A mi me ha sido algo útil buscando formas de hacer análisis de discos duros (el mio últimamente falla mas que una escopetilla de plomo y solo tiene un año).

Pensar en C++: Herencia de interfaces

— [ edit | raw ] migrated from node/1004

Voy a ir publicando como posts partes sueltas -pero con significado autónomo- de los libros Pensar en C++ I y II. La idea es darle un poco de visibilidad al proyecto, y de paso si alguien encuentra algún error o hace algún comentario puede ayudar a la revisión.

babel: ¿cuadro o tabla?

— [ edit | raw ] migrated from node/1070

He encontrado casi por casualidad la página web de Javier Bezos (el maintainer de babel y algunos paquetes más) y me parecido muy interesante una página en la que explica las decisiones en spanish para babel que han tomado. Muy curiosa la explicación de la controversia tabla/cuadro que sé que preocupa a algunos miembros de CRySoL :-)

La consejería de educación y ciencia de CLM apuesta por Windows

— [ edit | raw ] migrated from node/1069
Éste es el título de un artículo que aparece en la web del STE de Castilla-La Mancha.

Encuentro digital con David Bravo

— [ edit | raw ]
migrated from node/1068
David Bravo habla sobre los últimos rumores, amenazas y extorsiones, todos los años, gran ilusión. http://ecodiario.eleconomista.es/encuentro-digital/David-Bravo-2008-12-18

ZeroC Ice: Desarrollo de plugins

— [ edit | raw ] migrated from node/1066

Añadir nueva funcionalidad a ZeroC Ice es fácil: usando plugins. Ice provee una interfaz local, Ice::Plugin, que podemos usar para crearlos. Veamos un ejemplo sencillo. Probado en Ice 3.3.