Archive for the ‘GNU/Linux’ Category

Autocompletado en bash personalizado (para tus programas!)

Posted on the abril 9th, 2009 under GNU/Linux,Probando herramientas,Software Libre by

Bash incorpora una característica que permite el autocompletado en una terminal de los parámetros que acepta un programa. Para esto utiliza un script con diversas funciones, y permite que incorporando un archivo y ciertos comandos, podamos definir como se autcompletarán los programas que querramos.

Por ejemplo, tenemos hecho un programa con Milton y Daiana, que acepta varios parámetros. Hay algunos que no los usamos hace tiempo, y para no estar consultando la ayuda, pensamos que estaría bueno que se autocompletara.

El programa está hecho en mono, y se ejecuta haciendo

$ ./programa.exe

o bien

$ mono programa.exe

Aquí el archivo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Author: Nacho
# /etc/bash_completion.d/programa
# copy it there and enjoy magic, compadre!
#
_programa() 
{
    local cur prev opts
 
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="-h -? --help -r --reemp -e -f --extrae-flex -c -g -d --vft"
 
    if [[ "${cur}" == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    else
        _filedir  '@(xml|sql)'
    fi
}
complete -F _programa $filenames programa.exe
complete -F _command $filenames mono

La línea 12 indica las opciones que acepta el programa.
La línea 17 indica que se listen (si no es que estoy intentando poner alguna opción) los directorios y archivos pero los XML y SQL únicamente.
La línea 20 indica bajo que nombre de ejecutable se completará y qué función es la encargada de tal tarea.
La línea 21 es la que indica que «mono» es un «command» al igual que otros definidos (sudo, fakeroot, nohup) que requieren autocompletado luego para el programa que le sigue.

En vez de listar la línea 12, se podría haber hecho que el programa en cuestión devuelva por defecto la lista de los parámetros que acepta. La forma de hacer esto sería reemplazar esa línea por:

12
    opts=`mono programa.exe -p`

Python tiene un módulo para realizar esto en forma más sencilla: optcomplete.

Espero les sea de utilidad!

Retornando arrays con PlPython

Posted on the abril 9th, 2009 under GNU/Linux,Probando herramientas,Software Libre by

PlPython es un lenguaje procedural (PL) que permite utilizar Python en una base de datos PostreSQL para poder escribir los procedimientos almacenados. En realidad actualmente es un lenguaje no confiado (untrusted). Se puede leer más aquí: PlPythonu.

Si bien Python maneja listas, diccionarios y otras estructuras de datos con bastante simpleza, no encontramos una manera de hacer casting a un array o vector de PostgreSQL. Particularmente, en el ejemplo debajo, se puede ver que implementamos un wrapper para poder utilizar el motor de expresiones regulares de Python, dentro de la DB, ya que tiene algunas cuestiones más avanzadas que el que trae PgSQL por defecto.

Lo que hicimos fue crear una cadena, con la representación serializada de un Array y dejar que haga el casting PgSQL. Les dejo el código para que lo adapten a sus necesidades. En este caso devuelve un vector de TEXT (TEXT[]) con la idea de emular el resultado devuelto por regexp_matches() en plsql. la signatura de la función es esta:

regexp_python(text,text)  RETURNS text[]
-- Function: regexp_python(text, text)
 
-- DROP FUNCTION regexp_python(text, text);
 
CREATE OR REPLACE FUNCTION regexp_python(p_str text, p_ereg text)
  RETURNS TEXT[] AS
$BODY$import re
import string
m = re.search(p_ereg, p_str,re.I)
IF m IS None:
    RETURN None
ELSE:
    RETURN ('{"'+'","'.join([re.escape(x) FOR x IN m.groups('NULL')])+'"}').REPLACE('"NULL"','NULL')$BODY$
  LANGUAGE 'plpythonu' VOLATILE
  COST 100;
ALTER FUNCTION regexp_python(text, text) OWNER TO postgres;

Los arrays en PgSQL son serializados como una colección de datos entre llaves:
{‘text1′,’text2’}.

Gracias Milton y Daiana por investigar y aplicar todas estas cosas conmigo 😉

Convirtiendo de rm a mp3 usando ffmpeg

Posted on the abril 9th, 2009 under GNU/Linux,Probando herramientas by

En realidad se puede utilizar para convertir a cualquier formato que soporte ffmpeg. Lo cómodo es que no necesite un archivo fifo y pude hacerlo bastante sencillo y con una sola línea en la consola.

find ./ -iname *.rm -exec ffmpeg -i "{}" -acodec libmp3lame -aq 9 "{}.mp3" -y ';'

El comando find encuentra los archivos, y por cada uno ejecuta ffmpeg…. Los «{}» se reemplazan por el nombre del archivo.

Dividir líneas: Plugin para Gedit

Posted on the mayo 17th, 2008 under GNU/Linux,Probando herramientas,Software Libre by

Existe un plugin o complemento para Gedit (el editor por defecto en Gnome) que permite unir/dividir líneas en un texto. Esto permite que si tenemos un texto con líneas demasiado largas, podamos dividirlas en líneas de por ejemplo 80 caracteres. Este plugin me estaba siendo muy útil para manejar los textos en LATEX. Sin embargo, debía ir haciendo la separación de líneas párrafo a párrafo, ya que el plugin sino mezclaba todos los parrafos en uno sólo. Para comprender lo que les digo, inténten usarlo.

Lo que hice fue hacer un parche para el plugin para que soporte párrafos. No es que haya tenido algún error ni nada, sino que esta funcionalidad me resulta más útil. Les dejo el parche, y adjunto además, un nuevo plugin igual al Unir/Dividir líneas pero con el parche aplicado para los que no quieran parchear el original. Éste tiene las mismas combinaciones de teclas, por lo que no será compatible a la vez con el otro (le cambie apenas el nombre para que no haya conflictos). Para utilizarlo cópienlo en su $HOME/.gnome2/gedit/plugins/

El plugin si se selecciona todo (CTRL+A), y se presiona la combinación de teclas (CTRL+SHIFT+J) funcionando logra lo siguiente (espero que las imagenes expliquen más que las palabras)

(CTRL+A)

(CTRL+SHIFT+J)

El parche a aplicar sobre /usr/lib/gedit-2/plugins/joinlines.py

220c220,221
<     while ord(char) and (not (char in (' ', '\t', '\n', '\r'))):
---
>     twoBL = False
>     while ord(char) and (not twoBL) and (not (char in (' ', '\t'))):           
222a224,233
>         if (char in ('\n', '\r')):
>             text_iter.forward_char()
>             char = text_iter.get_char()
>             if (char in ('\n', '\r')):
>                 while (char in ('\n', '\r')):
>                     text_iter.forward_char()
>                     char = text_iter.get_char()
>             else:
>                 text_iter.backward_char()
>             twoBL = True

Archivos del complemento modificados. Además el patch.
joinlines2.tar.gz

Actualización:
El que subí tenía un error (además que el parche era reverso). Ahora joinlines2.tar.gz apunta al script corregido. El parche anteriormente publicado se puede aplicar sobre el joinlines.py que trae Gedit. Debajo dejo un parche para corregir el error sobre mi script si ya lo están utilizando (o sea sobre joinlines2.py)

231d230
<                 twoBL = True
234c233
< 
---
>             twoBL = True

Terco Downloader

Posted on the abril 24th, 2008 under GNU/Linux by

¿Necesitás que alguien insista en bajar una archivo por vos, del cuál supones la URL pero que actualmente tiene un terrible 404? Pensemos un ejemplo… mmm.. ya sé! La imagen ISO de UBUNTU Hardy Heron 8.04 Long Term Support Edtion (nombre apellido paterno y materno)

Esta noche queda corriendo esto:

#!/bin/bash
while [ 1 ]; do
wget -c $1
sleep 1800
done;

Con parámetros así

# ./bajar.sh http://cdimages.ubuntu.com/releases/8.04/release/ubuntu-8.04-dvd-i386.iso

Un reintento cada 1/2 hora no me parece mucho, además cuando empieza a bajar.. listo!
Copien, usen, cambien, compartan el código, acá mismo le decreto licencia BSD jajaja

Para los que les gusta el artwork, el afiche de Ubuntu de algún fanático.
http://www.vivalinux.com.ar/distros/poster-ubuntu-8.04-hardy-heron.html