miércoles, 18 de abril de 2012

Automatiza como puedas

No me considero informático.

Aunque hacer uso avanzado de ordenadores te convierte en emigrante al que los paisanos toman por extranjero al encontrarse con ellos.  Nadie se cree ya que sigas siendo de "la tierra". Y tampoco los informáticos te consideran uno de los suyos. Lo triste es que hay informáticos que carecen de los conocimientos generales que yo sí tengo.

Eso no significa que yo sepa programar igual, ni (mucho menos) mejor que un informático. De modo que si estás pensando en aprender técnicas de mí, mejor búsca en otro sitio de la WWW.

Entre mis malas prácitcas están no practicar a menudo olvidando frecuentemente cosas básicas, no programar de forma modular, hacerlo casi siempre desde cero y para unas necesidades específicas del momento, sin pensar en usos futuros o ajenos, y sin usar apenas comentarios para revisar errores en el código posteriormente. Tampoco soy capaz de programar en lenguajes serios, como C o Java. Y, si veo Código Máquina me pasa como a investigadores de los años 30 cuando ven a Cthulhu, locura total.

Haber sido usuario de ordenadores Amiga, donde cualquier programa puede controlarse mediante puerto ARexx, dándole al Script una potencia inimaginable, es quizás la mayor base que tengo para programar lo que necesito.

No conozco nada que se le parezca a la potencia que ofrecía ARexx. En Windows he probado DCOM o DDE, timidamente. Mi experiencia en "scripting" me vino muy bien para programar webs en PHP. Y actualmente me peleo con DBus en Linux.

¿Programar? ¿Para qué?

Si algo me atrae del mundo de los ordenadores y, por extensión, la red de redes que es Internet, es por la sensación de ser un mundo infinito. Inabarcable. Lleno de posibilidades. Lo cual ofrece una sensación de libertad extrema.

Pero tanta libertad, como encontrarse en un mundo vacío sin suelo ni techo, puede ser angustiosa para mucha gente. De ahí que tener una filosofía de que Todo es posible y ser muy Tozudos es imprescindible para sacar provecho de los ordenadores.

Usar aplicaciones corrientes y una pequeña parte de sus opciones con menús y clicks de ratón no es lo más eficiente; y en ocasiones se vuelve aburrido.

Mis razones para programar scripts son lograr hacer tareas con más agilidad que de otro modo son tediosas a costa de trabajar quizás más que en el uso de la aplicacion con procedimientos normales.

En el post de hoy comentaré un pequeño script que quizás a alguien le sea de utilidad. Aunque ahora mismo vamos a descubrir otro de mis defectos en este mundillo: Hacer cosas que ya existen de otra manera. Reinventar la rueda.

Atajo para redimensionar una ventana.


Con Compiz Fusion bien configurado es posible redimensionar y reubicar una ventana pulsando atajos de teclado. Por ejemplo puede definirse Ctrl-Alt-8_de_teclado_numerico para dividir la ventana a la mitad vertical y colocarla arriba... y las demás teclas para redistribuirla en otras disposiciones.

Pero al probar Gnome 3 tuve problemas con la instalación de Compiz y de momento decidí no instalarlo. Pero esa función me parecía irrenunciable, así que me programé un sencillo script bash haciendo uso del comando wmctrl para hacer lo que se ve en el vídeo.


Desafortundamente un bug en mi versión de Gnome 3 en Debian Testing no me permite configurar las mismas teclas y debo alternar el botón Bloq-num del teclado númerico para que la sensación sea la misma que tengo con Compiz Fusion bajo Ubuntu 11.04.

Estudiando la sintaxis de wmctrl se podría modificar este script para mover ventanas a otro escritorio o monitor en caso de usar multiples.

En este caso he programado un único script llamado wincon.sh para las distintas opciones de ubicación de la ventana de acuerdo con mi resolución de pantalla actual (1920x1080) y he añadido los atajos en la parte de "Combinación personal" de la pestaña "Atajos" de la aplicación de configuración de "Teclado" (Keyboard, en inglés).



Programar en mi caso, y creo que en el de la mayoría, rara vez es algo inmediato que progresivamente se complete desde cero a estar completado sin desviarse del objetivo final y sin errores. El proceso es prueba-error, prueba-error, hasta que finalmente da un prueba-funciona. Lo que suele implicar que hay otros errores que en ese preciso momento no se detectan y han de ser corregidos tras haber dado el script por bueno.

~/scripts/wincon.sh (descargar)
#!/bin/bash
# $1 ... top | bottom | left | right | full | topleft | topright | bottomleft | bottomright


if [ "$1" == "top" ]
then
x=0; y=20; w=1920; h=510;
fi

if [ "$1" == "bottom" ]
then
x=0; y=530; w=1920; h=530;
fi

if [ "$1" == "left" ]
then
((x=0));((y=20));((w=940));((h=1020));
fi

if [ "$1" == "right" ]
then
x=950; y=20; w=970; h=1020;
fi

if [ "$1" == "full" ]
then
((x=0));((y=20));((w=1920));((h=1020));
fi

if [ "$1" == "topleft" ]
then
((x=0));((y=20));((w=940));((h=530));
fi

if [ "$1" == "bottomleft" ]
then
((x=0));((y=550));((w=940));((h=510));
fi

if [ "$1" == "topright" ]
then
((x=950));((y=20));((w=970));((h=510));
fi

if [ "$1" == "bottomright" ]
then
((x=950));((y=550));((w=970));((h=510));
fi

arg="0, "$x", "$y", "$w", "$h

wmctrl -r :ACTIVE: -e "$arg"


Tras guardar el script con tu editor de textos favorito (nano, gedit, vim, kate,...) ya está. Si la carpeta donde lo hemos guardado está en la variable de entorno $PATH bastará con llamarlo desde cualquier ventana de terminal o con el atajo de teclado apropiado, con wincon.sh más un argumento; Y si no está en $PATH incluyendo la trayectoria completa. Sin olvidar hacerlo ejecutable para el usuario con:

$ chmod +x wincon.sh


El $1 en Bash Scripting se traduce por el primer argumento pasado al script, de modo que $2 sería el segundo, $3 el tercero y así sucesivamente. Si deseamos obtener toda la cadena de argumentos se define en el script como $@. y para saber el número de argumentos introducidos podemos mirar en la variable del script $#.

Como es un script poco depurado, puede observarse distintas formas de definir variables en una misma línea.

Los condicionales "if then ... fi" y el comando final para ejecutar el programa wmctrl sobre la ventana activa son casi las únicas líneas del script.

En caso de no disponer del programa wmctrl seguramente podremos instalarlo con un

$ sudo apt-get install wmctrl

o con yum u otras aplicaciones del sistema similares.

En un próximo post explicaré algo más complejo que estoy programando para cambiar el wallpaper / fondo de pantalla periodicamente, vigilando si está en marcha el programa de música Banshee en cuyo caso usa su fondo de pantalla (según lo que está sonando) y otro script que permite modificarlo para casos en los que la imagen Cover-art que proporciona Banshee tenga poca definición; reemplazándola con otra de Google Imágenes. Y preguntando al usuario mediante el uso de YAD (yet another dialog), un "requester" muy versátil que permite hacer preguntas con botones, barras de progreso, imágenes, selectores de archivos y mil y una posibilidades.