Mostrando entradas con la etiqueta Aplicaciones de consola. Mostrar todas las entradas
Mostrando entradas con la etiqueta Aplicaciones de consola. Mostrar todas las entradas

jueves, 2 de abril de 2009

HAL y crip (II)

Después de la información sobre el proceso de instalación, el README de crip nos proporciona unas muy breves instrucciones de uso que se completan con un tutorial en la Web al que se remite. No dice nada de las opciones en la línea de órdenes ni de las variables del fichero de configuración.

Las opciones de la orden crip se obtienen, a falta de una página de manual, que sí incluye Debian, ejecutando:

crip --help

lo que da la siguiente lista:

Options:
-h, --help Print this help then exit
-i, --info Print crip variable information then exit
-v, --version Print version of crip then exit
-e codec Encode to vorbis or flac (default = vorbis)
-s media Specify the source media (default = CD)
-g genre Specify the music genre (default = classical)
-q [on/off] Classical-style questioning (default = off)
-m [on/off] Map European to American-only chars (default = off)
-t [on/off] Trim leading/trailing silence (default = off)
-n [on/off] Normalize the audio (default = off)
-V volthresh Volume threshold for normalizing (default = 1.078)
(only used when normalizing is enabled)
-r [on/off] Remove files after encoding (default = on)
-E editor Editor to use (default = vim)
-u [on/off/both] Use editor to name the files (default = on)
(as opposed to the command-line)
-o " flags" Flags to pass to oggenc (default = '-q 5')
-f " flags" Flags to pass to flac (default = '--best --replay-gain')
-c " flags" Flags to pass to cdparanoia (default = '-v -z')
-d device CDrom device to read from (default = /dev/cdrom)
-w [on/off] Skip the ripping (makes empty .wav files) (default = off)
(useful if you already have the .wav files to encode)
-p [on/off] Prompt to continue after ripping (default = off)
(useful pause to edit .wav files before encoding)
-x [on/off] Eject CD when done ripping (default = off)
-P proxyserver Pass an http proxy to CDDB_get if necessary

Las más interesantes para nosotros ahora son estas dos:

-e
Determina el formato del fichero de audio que vamos a generar. Recibe como argumento vorbis, que producirá un fichero OGG (opción activada por defecto) o flac, que producirá un fichero FLAC)

-m
Convierte los caracteres europeos (letras acentuadas, letras con diéresis, etc) en caracteres sin acentos, diéresis, etc.


En cuanto a las opciones de configuración, el fichero de ejemplo que viene con las fuentes y que copiamos como nuestro .criprc contiene comentarios que describen cada una de ellas con suficiente precisión.

A partir de ahora, solo queda probar el funcionamiento de crip. El tutorial al que se refiere el README no es otra cosa que un ejemplo de un caso de uso. Pero conviene referir aquí un par de ejemplos más y comprobar con explicaciones en castellano el proceder de crip.

El CD elegido contiene dos piezas del compositor contemporáneo Helmut Lachenmann, una para cuarteto de cuerda, interpretada por el Berner Streichquartett y un dúo de guitarras, interpretado por Wilhelm Bruck y Theodor Ross.

En el primer ejemplo, el formato de salida será OGG y utilizaremos la opción -m para convertir los caracteres con umlaut (el mismo signo de nuestro diéresis, que en alemán tiene otra función) en vocales sin umlaut. Ello parece, en principio, necesario, habida cuenta de que el fichero que contiene el nombre de las pistas aparecerá codificado en latin-1 por crip y no en utf-8, con el consiguiente problema que implica en casi todos los sistemas operativos modernos, que están preparados para utf-8, donde tales caracteres aparecerán deformados. Precisamente, la opción -m es la que no funciona en la versión empaquetada con Debian, pero sí en la versión actual. Recuérdese que éste fue el pretexto por el que instalamos crip desde las fuentes.

El primer paso es moverse al directorio donde queremos que se produzca la generación de los ficheros temporales y los ficheros finales de audio. Como disponemos de espacio suficiente en nuestro home, nos desplazaremos al sitio donde acabarán residiendo los ficheros resultantes del proceso:

cd ~/musica/CDs

Y ahora, tras introducir el CD en el lector de CDs, conversaremos con crip:

crip -m

Lo primero que hace crip es devolvernos un mensaje inicial y una información general sobre nuestras actuales opciones de configuración:

crip v3.9 (http://bach.dynet.com/crip)

Please report all bugs, feature requests, or
general difficulties to charlton@dynet.com.

Options currently set to:
contact =
sourcemedia = CD
encodeto = vorbis
cddevice = /dev/cdrom
settitle = filename
editnames = on
editor = vim
askclassical (default) = off
skipalbumabv set only for: classical
mapeurochars = on
normalize = off
trimsilence = off
delfiles = on
skiprip = off
stopgap = off
ejectcd = off

Ripper: cdparanoia III release 10.2 (September 11, 2008) -v -z
Encoder: oggenc from vorbis-tools 1.2.0 -q 5

Inmediatamente a continuación, y si ya hay ficheros de audio en este directorio, crip nos avisará de ello y nos exigirá que confirmemos el proceso, para evitar sobrescribir ficheros existentes:

You currently have *.wav, *.ogg, *.flac, or *.tag files in the current
working directory. These are subject to being overwritten.

Press <enter> to proceed (or ctrl-C to abort):

Tras pulsar 'Enter', crip devuelve el resultado de buscar en FreeDB [Nótense los carácteres con umlaut que no han sido correctamente convertidos]:

DiscID: 100b1802
cddbID: 100b1802
artist: Helmut Lachenmann
title: Gran Torso - Salut f�r Caudwell
category: classical

total number of tracks: 2
track 1: 182 - 96276 [21:21.25]: Gran Torso (Musik f�r Streichquartett - 1971)
track 2: 96277 - 213184 [25:58.76]: Salut f�r Caudwell (Musik f�r 2 Gitarristen - 1977)

A continuación, crip solicita que introduzcamos, si queremos, los números de pista para cada grupo. Distinguir grupos de pistas hace posible etiquetar cada uno de ellos de forma distinta y aplicarles, uno a uno, ciertas operaciones de manipulación del audio. Esta función es evidentemente interesante en CDs como el nuestro, donde cada obra será ejecutada por intérpretes diferentes. Si no queremos grupos y queremos ripear todas las pistas, respondemos all. Si queremos que cada pista constituya un grupo, respondemos each, pero no podremos etiquetar ciertos campos de cada grupo de forma separada, como el de los intérpretes. En los casos no genéricos, definimos el primer grupo por el número de las pistas que lo constituirán, separados por espacios; el segundo, pulsando 'Enter' y añadiendo en él, de la misma forma, las pistas que le correspondan, etc. Para terminar la generación de grupos se escribe end. Éste es también el camino que se ha de seguir cuando se desea extraer sólo un cierto número de pistas en un solo grupo:

Enter the track numbers for each group (each group will be
replaygained/vorbisgained/normalized, trimmed, and tagged
as if it were one piece of music).

Delimit the track numbers on each line by a space.
Type "end" to go on to the next section.

Note that only the tracks you specify will be ripped.
Also note that if you list a track more than once, it will be
unnecessarily ripped more than once (so don't do it).
You can also enter "all" or "each" for grouping all tracks as
one group, or each track as a separate group respectively.
If input is "all" or "each" then the entire CD is ripped.

En nuestro caso, vamos a crear dos grupos, uno por cada pista [Nuestras respuestas a crip se muestran en azul en lo que sigue]:

> 1

> 2

> end


crip nos pida ahora que introduzcamos el género del CD:

Please enter the genre for this album.
Recommended genres are (from freedb.org):
blues (self explanatory)
classical (self explanatory)
country (self explanatory)
folk (self explanatory)
jazz (self explanatory)
newage (self explanatory)
reggae (self explanatory)
rock (including funk, soul, rap, pop, industrial, metal, etc.)
soundtrack (movies, shows)
data (ISO9660 and other data CDs)
misc (others that do not fit in the above categories)
Enter the genre for this album (single space = null): [classical]:

Pulsamos 'Enter', lo que significa que el género será 'classical'. Téngase en cuenta que se podría poner cualquier género aparte de los sugeridos, aunque no conviene en el caso de que el resultado se vaya a enviar a FreeDB.

La siguiente pregunta es relativa al compositor de la obra:

Since this is classical, there should be a composer.
If the composer is different for each group/list, just set the
value to null and add the composer tag manually with each list.
Enter composer (single space = null): [Helmut Lachenmann]:

El compositor es el mismo para los dos grupos, luego pulsamos 'Enter' y dejamos el que crip ha deducido por nosotros.

A partir de este momento podemos etiquetar por separado cada grupo:

Would you like to set the artist and miscellaneous labeling info for
the whole CD right now, or would you prefer to set it for each list?
(list/cd) [list]:

Pulsamos 'Enter', de forma que la opción list se aplique.

El título del album lo modificaremos para evitar el umlaut no reconocido:

Enter album name (single space = null): [Gran Torso - Salut f�r Caudwell ]: Gran Torso - Salut für Caudwell

Sí interesa consignar el sello discográfico:
Enter label name (single space = null): []: Aurophon

También podemos anotar el número de catálogo del disco. Nosotros lo dejaremos vacío. Esto es pulsaremos 'Enter' a esta pregunta:
Enter label catalog number (single space = null): []:

Con toda esta información básica, crip construye un fichero que contiene los títulos de las dos pistas. Nótese cómo aquí la opción -m ha hecho su efecto y las letras con umlaut han sido sustituidas por letras sin umlaut:

Track/filename labeling section...
Here are the computer-chosen filenames for the tracks that you've picked:
-------------------------------------------------------------------------------
Lachenmann_-_Gran_Torso_(Musik_fur_Streichquartett_-_1971)

Lachenmann_-_Salut_fur_Caudwell_(Musik_fur_2_Gitarristen_-_1977)

Edit the above filenames? [yes]:

Adviértase también que crip nos obliga a editar el fichero, aunque no vayamos a cambiar nada. Pulsamos 'Enter', que abrirá vim y en vim tecleamos :q para salir, y, de nuevo 'Enter' a esta nueva pregunta de confirmación:

Edit the above filenames? [no]:

La siguiente pregunta se refiere al director del primer grupo de pistas:

Enter conductor. If there isn't one, enter null.
(single space = null): [Helmut Lachenmann]:

Puesto que el CD es de música de cámara, no tiene director. Luego debemos pulsar espacio seguido de 'Enter'.

En la pregunta sobre los intérpretes sí tenemos que intervenir:

Since there is no conductor, there's probably a (main) performer.
Enter this performer (single space = null): [Helmut Lachenmann]:Berner Streichquartett

También anotaremos la fecha de producción del CD:

Enter the date of recording (single space = null): [don't put one]: (P) 1991

Ahora, crip nos ofrece la posibilidad de seguir añadiendo etiquetas. Nosotros pulsaremos 'Enter' y seguiremos adelante:

Type the name of a field tag that you'd like to add to
all these music files (or make up your own field tag name).
You can enter the fieldname then enter the data for that fieldname,
or you can enter fieldname=data all on one line.

Possible tag recommendations:
conductor ensemble opus
location performer copyright license

Just press <enter> (with nothing on the line) to finish:

A continuación, crip nos vuelve a repetir las mismas preguntas sobre director e intérpretes del grupo siguiente. Pulsamos 'Enter' en la primera y cumplimentamos adecuadamente la segunda:

Enter conductor. If there isn't one, enter null.
(single space = null): []:
Since there is no conductor, there's probably a (main) performer.
If this is true, enter this performer (single space = null): [Berner Streichquartett]: W. Bruck - Th. Ross

Las preguntas subsiguientes sobre fecha de producción y creación de más etiquetas se responden como antes.

Por fin, llegamos al final:

Just press <enter> (with nothing on the line) to finish:

Tras pulsar 'Enter', crip nos da un sumario del resultado y nos pregunta si queremos reeditar lo ya anotado para alguna de las pistas, enviar la información cumplimentada a FreeDB o comenzar a ripear:

01: Lachenmann_-_Gran_Torso_(Musik_fur_Streichquartett_-_1971)
title=Gran Torso (Musik fur Streichquartett - 1971)
artist=Berner Streichquartett
composer=Helmut Lachenmann
performer=Berner Streichquartett
date=(P) 1991
album=Gran Torso - Salut für Caudwell
tracknumber=01
genre=classical


02: Lachenmann_-_Salut_fur_Caudwell_(Musik_fur_2_Gitarristen_-_1977)
title=Salut fur Caudwell (Musik fur 2 Gitarristen - 1977)
artist=W. Bruck - Th. Ross
composer=Helmut Lachenmann
performer=W. Bruck - Th. Ross
date=(P) 1991
album=Gran Torso - Salut für Caudwell
tracknumber=02
genre=classical



Look at the above tags and make sure they are all okay.
You can edit any of these tag files by entering the track number.
You can also enter "submit" to submit this data to the freedb
CDDB database or just press <enter> by itself to go directly to
the ripping process! (or press ctrl-C to abort everything).
Enter track number, submit, or just press to Rip! :

Aquí pulsaremos 'Enter', nos tomamos un café y esperamos a que crip realice la extracción y codificación del los ficheros de audio.

El siguiente ejemplo sobre el mismo disco no conlleva ninguna novedad, salvo por el hecho de que los ficheros resultantes se codificarán como FLAC y que nos la jugaremos con los caracteres europeos:

crip -e flac

¿Cómo evitar el problema de crip con utf-8? Existe un truco. A la hora editar el fichero de los nombres de pistas con vim, ejecutamos desde dentro de vim la orden :set fileencoding=utf-8 y luego guardamos el fichero y salimos con :wq. Sí, es un hack rápido, pero es el único medio que hemos descubierto para salvar las apariencias, preservando los carácteres europeos y sin tratar de tocar el código de crip. Este truco funciona también con la versión empaquetada en Debian. Luego, quien no quiera pasar por la instalación desde las fuentes, podrá usar crip, y sin el problema de los caracteres europeos, instalando el paquete de Debian del mismo nombre.

Tengan feliz escucha.

miércoles, 1 de abril de 2009

HAL y crip (I - Instalar las fuentes)

abcde es más que suficiente para la mayoría de los usuarios y la mayoría de las funciones. No obstante, los acérrimos de la música clásica pueden preferir etiquetar sus CDs de un modo más flexible, pero de forma sencilla y sin necesidad de recurrir a herramientas externas, aunque tengan que consumir para ello algo más de tiempo en la línea de órdenes. crip quiere cubrir esa laguna. Se trata de un guión escrito en el lenguaje Perl, menos elaborado, quizá, y con menos opciones globales que abcde, pero especialmente indicado para el caso que comentamos.

Nos va a servir además para enfrentarnos por primera vez ---si bien en un ejemplo muy simple--- a la instalación de un programa desde las fuentes, es decir, para acometer la instalación del código tal cual ha sido distribuido por el programador, sin acudir al paquete que nuestra distribución ha creado para ese código. Que escojamos este procedimiento tiene, claro está, fines didácticos , pero también obedece al hecho de que la versión de crip empaquetada a día de hoy por Debian (la 3.7) contiene un error que ya ha sido resuelto en la versión original más reciente. Lo normal es que nunca acudamos a esta vía. Es más, lo normal es que cuando la instalación directa a partir del código fuente es la única vía posible ---no es el caso aquí, como veremos más tarde---, nos decidamos por otro programa alternativo. En este momento, como de lo que se trata es de aprender, seguiremos la "senda escarpada".

Lo primero que hay que hacer para instalar un programa desde la fuente es, obviamente, conseguir el código fuente y guardarlo en nuestro ordenador. La última versión de crip se puede obtener visitando la página siguiente:

http://bach.dynet.com/crip/download.html

La versión más reciente a día de hoy es la 3.9. Podemos descargarla directamente acudiendo a HAL, por ejemplo, dentro de un directorio, src (de source, fuente) que crearemos expresamente para guardar todos los archivos fuentes de los programas que instalemos a mano. Construiremos ese directorio, ingresaremos en él y descargaremos ahí el archivo que contiene el código fuente, las tres operaciones en un solo paso:

mkdir src ; cd src ; wget http://bach.dynet.com/crip/src/crip-3.9.tar.gz

Los puntos y comas (;) entre cada orden indican a HAL que las procese una tras otra. El resultado es el mismo que ejecutarlas por separado.

El fichero guardado, crip-3.9.tar.gz es un fichero comprimido. Pero no es un fichero cualquiera. Se trata de un archivo que engloba un directorio completo con sus correspondientes ficheros. Un fichero tar es uno de los más frecuentes tipos de ficheros de esta clase, comunes para archivar y distribuir fácilmente directorios completos. Para crear ficheros tar o para desarchivarlos (extraer su contenido) se utiliza la orden del mismo nombre tar. Por ejemplo, podemos pedirle a HAL que extraiga (--extract) y a la vez descomprima con gunzip (--gunzip) el fichero (--file) crip-3.9.tar.gz, y que se explaye sin miedo para informarnos de cómo transcurre la operación (--verbose):

tar --extract --gunzip --verbose --file crip-3.9.tar.gz

Pero nunca se ha visto a nadie dirigirse tan ceremoniosamente a HAL. En lugar de ello, se utilizan las respectivas opciones abreviadas:

tar -x -z -v -f crip-3.9.tar.gz

Y ni siquiera eso, porque cuando hay varias opciones abreviadas, se prefiere unirlas en un solo taco:

tar -xzvf crip-3.9.tar.gz

HAL nos informa como hemos solicitado:

crip-3.9/
crip-3.9/TODO
crip-3.9/crip
crip-3.9/LICENSE
crip-3.9/README
crip-3.9/editcomment
crip-3.9/CDDB_get.pm
crip-3.9/criprc_example
crip-3.9/editfilenames
crip-3.9/Changelog

¿Qué son todos estos ficheros contenidos en el archivo que el desarrollador de crip tiene la amabilidad de poner a nuestra disposición? El primero es, evidentemente, el propio directorio crip-3.9. ¿Y los ficheros de los que consta? Nada más fácil que preguntárselo a HAL:

file crip-3.9/*

que devuelve la información que buscamos:

crip-3.9/CDDB_get.pm: Perl5 module source text
crip-3.9/Changelog: UTF-8 Unicode English text
crip-3.9/crip: a /usr/bin/perl script text executable
crip-3.9/criprc_example: ASCII English text
crip-3.9/editcomment: a /usr/bin/perl script text executable
crip-3.9/editfilenames: a /usr/bin/perl script text executable
crip-3.9/LICENSE: ASCII English text
crip-3.9/README: ASCII English text
crip-3.9/TODO: ASCII English text

El asterisco (*) tras el nombre del directorio en la orden file es un comodín que vale por todos y cada una de los ficheros contenidos en crip-3.9. Probablemente empecemos a usarlo más veces a partir de ahora.

Bien, tenemos unos cuantos ficheros que contienen texto en ingles (en codificación ASCII o UTF-8, eso es secundario aquí) y cuatro más escritos en Perl. Estos últimos son el código fuente propiamente dicho y veremos qué hacer con ellos dentro de un momento. Los ficheros en inglés son documentos informativos sobre el programa. Aun sin leer su contenido, cualquiera que esté familiarizado con archivos de fuentes de programas sabe de qué van, porque sus nombres son convencionalmente usados por los programadores para documentar el código que distribuyen:

README
Proporciona informaciones básicas para manejar el programa. Es el fichero que hay que leer en primer lugar.

LICENSE
Describe la licencia bajo la que se distribuye el código. En este caso es GPL. Lo que significa que el código puede modificarse libremente y distribuirse si se mantiene la misma licencia.

TODO
Una lista de las tareas que el programador considera pendientes y que tal vez cumpla en futuras revisiones del código o espera que cumplan posibles colaboradores.

Changelog
Una lista de las características implementadas en cada versión del código hasta ahora realizada y de los errores (bugs) corregidos

criprc-example
Un ejemplo de fichero de configuración para el programa. Recuérdese que nos hemos encontrado ya con varios ficheros de configuración y que el nombre de muchos de ellos se construye con el sufijo rc (de resource) añadido al nombre del programa.


Leamos el fichero README ---se presupone que el lector hace ahora un less crip-3.9/README--- para conocer de qué va la historia. Vemos que contiene instrucciones de instalación y de uso.

Empecemos por la instalación. Lo primero que se nos indica es el software con el que nuestro sistema debe contar para que crip funcione. Casi todas los programas requeridos son conocidos nuestros, los artesanos del sonido que comentamos hace unos días (cdparanoia, oggenc, flac, vorbiscomment y vorbisgain), de sox, otro experto en sonido, podemos prescindir ahora. perl está instalado a buen seguro. Si instalamos abcde, se instalaron muchos de los programas anteriores. Pero no vamos a dar nada por hecho. Trataremos de ver qué paquetes de Debian contienen el software necesario e instalaremos dichos paquetes ---sí, no procederemos a instalarlos desde las fuentes, el lector puede respirar tranquilo.

Como sabemos, aptitude nos permite buscar paquetes que cumplan ciertas funciones, pero lo que ahora necesitamos es algo sustancialmente distinto, queremos conocer en qué paquete de Debian está contenido un determinado programa. Para ello existe la herramienta apt-file, incluida en el paquete del mismo nombre, que se puede instalar como cualquier otro paquete:

aptitude install apt-file

El funcionamiento básico de apt-file es muy sencillo. Los almacenes de paquetes Debian incluyen un fichero comprimido donde se describe el contenido de todos los paquetes allí almacenados. Éste es el fichero que apt-file procesará. Lo primero, por tanto, es tener en nuestro ordenador una copia actualizada suya. Para ello debemos disfrazarnos de root, es decir que previamente hay que hacer su o prefijar la orden siguiente con sudo, dependiendo de nuestro sistema:

apt-file update

Una vez descargado el fichero de contenidos de los paquetes, podemos buscar en él qué paquete o paquetes contiene cada programa u orden que crip define como requisito previo. Por ejemplo:

apt-file cdparanoia

que devuelve:

cdparanoia: /usr/bin/cdparanoia
cdparanoia: /usr/share/doc/cdparanoia/README.gz
cdparanoia: /usr/share/doc/cdparanoia/changelog.Debian.gz
cdparanoia: /usr/share/doc/cdparanoia/copyright
cdparanoia: /usr/share/man/ja/man1/cdparanoia.1.gz
cdparanoia: /usr/share/man/man1/cdparanoia.1.gz
cdparanoia-dbg: /usr/lib/debug/usr/bin/cdparanoia
cdparanoia-dbg: /usr/share/doc/cdparanoia-dbg/changelog.Debian.gz
cdparanoia-dbg: /usr/share/doc/cdparanoia-dbg/copyright
gstreamer0.10-plugins-base: /usr/lib/gstreamer-0.10/libgstcdparanoia.so
gstreamer0.10-plugins-base-dbg: /usr/lib/debug/usr/lib/gstreamer-0.10/libgstcdparanoia.so
gstreamer0.10-plugins-base-doc: /usr/share/gtk-doc/html/gst-plugins-base-plugins-0.10/gst-plugins-base-plugins-cdparanoiasrc.html
gstreamer0.10-plugins-base-doc: /usr/share/gtk-doc/html/gst-plugins-base-plugins-0.10/gst-plugins-base-plugins-plugin-cdparanoia.html
libcdparanoia-dev: /usr/share/doc/libcdparanoia-dev/changelog.Debian.gz
libcdparanoia-dev: /usr/share/doc/libcdparanoia-dev/copyright
libcdparanoia0: /usr/share/doc/libcdparanoia0/README.gz
libcdparanoia0: /usr/share/doc/libcdparanoia0/changelog.Debian.gz
libcdparanoia0: /usr/share/doc/libcdparanoia0/copyright
libcdparanoia0: /usr/share/lintian/overrides/libcdparanoia0
libk3b-dev: /usr/include/kde/k3bcdparanoialib.h
libtritonus-bin: /usr/lib/jni/libtritonuscdparanoia.so
libtritonus-bin: /usr/lib/jni/libtritonuscdparanoia.so.1
libtritonus-bin: /usr/lib/jni/libtritonuscdparanoia.so.1.0
manpages-ko: /usr/share/man/ko/man1/cdparanoia.1.gz
ripperx: /usr/lib/ripperx/ripperX_plugin-cdparanoia
soundkonverter: /usr/share/apps/soundkonverter/plugins/320.cdparanoia.soundkonverter.xml

Demasiada información. Es preciso filtrarla. Como ya indicamos hace bastante, los programas u órdenes no son sino ficheros ejecutables, lo que significa que se instalarán en un directorio de ejecutables como bin o sbin. Para los artesanos del sonido, podemos descartar la última opción (sbin), dado que, a todas luces, se trata de órdenes o programas de usuario. Y, puesto que son ficheros que no contienen programas para administrar el sistema, debemos suponer que, a buen seguro, formarán parte del directorio /usr/bin. En la descripción del contenido de los paquetes que suministra apt-file aparece, como acabamos de comprobar, el nombre del paquete como primer campo y la ruta del fichero como segundo campo, separados ambos campos por dos puntos y espacio. En consecuencia, podemos realizar una búsqueda con apt-file search y filtrar el resultado con grep:

apt-file search cdparanoia | grep -E ':[[:space:]]+/usr/bin'

La respuesta ahora es unívoca y suficiente:

cdparanoia: /usr/bin/cdparanoia

Si ejecutamos dicha búsqueda para todos las órdenes o programas que requiere crip obtendríamos la siguiente información:

cdparanoia: /usr/bin/cdparanoia
vorbis-tools: /usr/bin/oggenc
flac: /usr/bin/flac
flac: /usr/bin/metaflac
vorbis-tools: /usr/bin/vorbiscomment
vorbisgain: /usr/bin/vorbisgain

Por cierto, no es necesario ejecutar apt-file search nombre_programa para cada uno de los programas en los que estamos interesados, se puede hacer de una sola vez con una orden algo compleja, cuyo sentido no se ha explicado todavía, pero que deberemos considerar despacio en algún otro momento:

for file in cdparanoia oggenc flac vorbiscomment vorbisgain; \
do apt-file search $file | grep -E ':[[:space:]]+/usr/bin'; \
done

Podríamos incluso filtrar el resultado de esta orden para que nos devolviese únicamente el primer campo (el nombre del paquete) y suprimiese las repeticiones:

for file in cdparanoia oggenc flac vorbiscomment vorbisgain; \
do apt-file search $file | grep -E ':[[:space:]]+/usr/bin'; \
done \
| cut -d':' -f1 | uniq

Y ya que estamos, podemos enviar el resultado final como lista de argumentos para aptitude, de forma aptitude proceda automáticamente a la instalación de los paquetes correspondientes:

aptitude -s install \
$(for file in cdparanoia oggenc flac vorbiscomment vorbisgain; \
do apt-file search $file | grep -E ':[[:space:]]+/usr/bin'; \
done \
| cut -d':' -f1 | uniq)

¡Eh! ¿qué tal este inopinado reencuentro con nuestros cachivaches de fontanería?

El lector atento habrá notado en la anterior orden una opción extraña para aptitude, la opción -s. Esta opción hace que aptitude simule su comportamiento habitual, sin provocar ningún cambio en nuestro sistema de paquetes. La puede ejecutar cualquier usuario, no hace falta ser root. Es muy recomendable aplicarla antes de proceder a una instalación real, especialmente en casos como el anterior, donde los paquetes que se instalarán son la salida de una orden compleja.

Si ejecutamos como root, y sin la opción -s, la orden citada, se instalarán todos los programas que crip exige para funcionar y que no existen ya en nuestro sistema.

Preparada la infraestructura para crip, continuamos nuestra lectura de su fichero README. Ahí se nos informa del siguiente paso: copiar CDDB_get.pm a algún sitio donde nuestro intérprete del lenguaje Perl pueda encontrarlo. Se nos propone, como opción, copiarlo bajo /usr/lib/perl5/. No vamos a seguir, sin embargo, esta recomendación. La razón es que no es conveniente mezclar ficheros instalados a mano en los directorios que nuestra distribución utiliza para instalar el contenido de los paquetes. Los directorios /usr/bin, /usr/lib, etc. son directorios que debe manejar exclusivamente nuestra distribución. Todas las distribuciones de Linux ofrecen la posibilidad de directorios semejantes a los anteriores para un caso como el nuestro, es decir, para cuando instalamos software desde las fuentes. El directorio típico que existe con este fin es /usr/local. Es ahí donde debemos ubicar el software instalado a mano.

CDDB_get.pm es, como nos notificó file anteriormente, un módulo de Perl, es decir, un conjunto de funcionalidades que pueden usar distintos programas escritos en Perl. Se almacenan normalmente en el directorio /lib/perl/versión, donde versión es el número de versión de nuestra infraestructura Perl. En mi sistema es el 5.10.0. Por tanto, debemos crear como root ese subdirectorio en nuestro /usr/local y copiar allí el fichero CDDB_get.pm:

mkdir -p /usr/local/lib/perl/5.10.0/

La opción -p de mkdir permite crear no sólo el directorio 5.10.0, sino todos los directorios padre bajo /usr/local que todavía no existan. En nuestro caso, tiene el mismo efecto que estas dos órdenes:

mkdir /usr/local/lib/perl
mkdir /usr/local/lib/perl/5.10.0

Ahora copiamos, también como root el fichero CDDB_get.pm en el directorio recién creado:

cp crip-3.9/CDDB_get.pm /usr/local/lib/perl/5.10.0

Finalmente, y si seguimos las instrucciones del README, sólo falta copiar el fichero de configuración criprc_example como nuestro ~/.criprc:

cp crip-3.9/criprc_example ~/.criprc

Con esto sería suficiente para hacer funcionar crip. Sin embargo, tendríamos que llamar con su ruta completa a crip (~/tmp/crip-3.9/crip) cada vez que quisiéramos ejecutarlo. Como esto es incomodo, es mejor disponer los ficheros ejecutables de las fuentes en un ruta que esté en nuestro PATH. Qué mejor que en /usr/local/bin. Las fuentes constan de varios ejecutables, como nos informó file. Tales ficheros no son sino órdenes escritas en lenguaje Perl y son, para el caso que nos ocupa los siguientes:

crip
editcomment
editfilenames

Copiémoslos en /usr/local/bin

cd crip-3.9 ; cp crip editcomment editfilenames /usr/local/bin

Tarea finalizada. Cabe añadir que, en el caso de que se quiera en el futuro recurrir al paquete crip de Debian, habría que asegurarse de que no queda rastro de los ficheros instalados en /usr/local. Es decir, habría que disfrazarse de root y ejecutar las siguientes órdenes:

rm /usr/local/lib/perl/5.10.0/CDDB_get.pm
rm /usr/local/bin/crip
rm /usr/local/bin/editcomment
rm /usr/local/bin/editfilenames

¿Alguien se atreve a escribir el mini guión desinstalar_crip_local para realizar esta operación de desinstalación? Fácil, ¿no?

Si el lector ha llegado hasta aquí sin tropiezos se puede considerar afortunado. Acaba de ingresar en el reducido grupo de usuarios de a pie que todavía tiene el coraje de instalar un programa desde la fuente misma. En los gloriosos y aguerridos días en que las distribuciones de GNU/Linux no eran tantas ni tan bien pertrechadas, era una práctica habitual. Hoy en día sólo los usuarios avanzados y, por supuesto, los programadores, se atreven con estos retos, que, por lo que se ha visto, no son tan duros como los pintan, al menos para casos tan simples como el de crip.


Resumen

  • Los puntos y coma (;) como separadores de órdenes en la línea de órdenes, permiten ejecutar secuencialmente las órdenes separadas por ellos.

  • El asterisco (*), cuando está fuera de una expresión regular, funciona como un comodín que está por cualquier cadena de caracteres. Es frecuente su uso como abreviatura de nombres de ficheros.

  • Un fichero tar es un tipo de fichero que sirve para archivar varios ficheros, incluidos subdirectorios. La orden tar permite crear tales clases de ficheros o extraer el contenido de dichos ficheros.

  • Cuando una orden recibe varias opciones es frecuente agruparlas en un único bloque. Por ejemplo, tar -x -z -v -f fichero se abrevia habitualmente con tar -xzvf fichero

  • Las fuentes de un programa suelen incluir ficheros de documentación con nombres convencionales: README, que proporciona información importante que hay que leer en primer lugar; LICENSE, que indica la licencia bajo la que se distribuye; TODO, que lista las tareas pendientes; Changelog, que informa de los cambios realizados en cada versión.

  • Los ficheros de configuración de un programa suelen terminar con el sufijo rc añadido al nombre del programa. Por ejemplo, bashrc, vimrc, criprc.

  • La orden apt-file permite buscar ficheros en el contenido de los paquetes Debian.

  • Por defecto, la orden uniq devuelve su entrada omitiendo las líneas repetidas.

  • La opción -s de aptitude permite simular el comportamiento de aptitude sin producir ninguna modificación en el sistema.

  • /usr/local es el directorio recomendado para ubicar software instalado manualmente por el usuario.

martes, 31 de marzo de 2009

HAL y abcde

abcde no es otra cosa que un guión escrito en lengua de HAL para establecer comunicación con los expertos del estilo de los citados el día pasado, sin necesidad de que nosotros mismos tengamos que tratar personalmente con cada uno de ellos.

El uso básico de abcde es tan simple que da casi apuro referirlo:

  • Instalar abcde, que instalará de paso todos los expertos a los va a recurrir y que no estén ya integrados en nuestro sistema:

        aptitude install abcde

  • Introducir el CD de audio en el lector de CDs.

  • Teclear en el terminal simplemente:

        abcde

Por defecto, abcde se ejecutará en modo interactivo. Es decir, nos hará ciertas preguntas sobre el contenido del CD. Veamos cómo funciona sobre un disco del célebre saxofonista Ben Webster.

Tras introducir el CD en el lector de CDs y ejecutar abcde veremos el siguiente mensaje, en el que se muestra información sobre el número de pistas del CD que se grabarán:

Grabbing entire CD - tracks: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

Inmediatamente después, abcde realiza una búsqueda sobre la base de datos de FreeDB y devuelve la información allí contenida sobre nuestro CD:

Retrieving 1 CDDB match...done.
---- Ben Webster / Jazz & Blues 26 ----
1: Randle's Island
2: Old Folks
3: King's Riff
4: You're my Thrill
5: Jive at Six
6: Tenderly
7: Don't get around much any more
8: Pennies from heaven
9: That's all
10: Cotton tail
11: Danny boy
12: Bouce blues
13: Hoot
14: Pouting
15: The iron Man
16: Honeysuckle rose
17: Blue skies
18: Kat's fur

Tras ello nos pregunta si queremos editar dicha información o nos basta con la que FreeDB proporciona:

Edit selected CDDB data? [y/n] (n):

Como no hace falta editar nada, respondemos "no", esto es, pulsamos 'Enter' o 'n' y seguimos adelante.

abcde nos pregunta a continuación si son varios los artistas (en este caso, intérpretes) de la música grabada:

Is the CD multi-artist? [y/n] (n):

El artista principal es Ben Webster y así lo dejaremos, luego seguimos adelante, pulsando 'Enter' o 'n'.

A partir de este momento comienza el proceso de extracción de las pistas por medio de cdparanoia. Para cada pista extraída abcde nos devuelve un mensaje de este tipo:

Grabbing track 01: Randle's Island...
cdparanoia III release 10.2 (September 11, 2008)

Ripping from sector 0 (track 1 [0:00.00])
to sector 14534 (track 1 [3:13.59])

outputting to /home/luis/abcde.170dd912/track01.wav

(== PROGRESS == [ | 014534 00 ] == :^D * ==)

Done.

Aquí, simplemente, abcde nos notifica la extracción de la primera pista que se guardará temporalmente en disco en formato WAV en el directorio /home/luis/abcde.170dd912. Este directorio se crea bajo nuestro home y será eliminado al terminar el proceso. Para la operación de extracción, abcde recurre a cdparanoia. De hecho, los mensajes relativos a la extracción los produce cdparanoia. Especialmente interesante es el mensaje de progreso. A la derecha de dicho mensaje van apareciendo indicaciones semejantes a los smileys o emoticones que se usan en comunicaciones electrónicas. La lista de los smylies que utiliza cdparanoia y de sus significados se puede consultar en la sección 'Output Smilies' de la página de manual de cdparanoia. Puede ser necesario acudir a ella en el caso infrecuente de que surjan problemas en el proceso.

Simultáneamente y para cada pista, abcde codifica, por defecto en formato OGG vía oggenc, los ficheros WAV extraídos, los etiqueta y los guarda en un directorio con un nombre adecuado, en el caso presente Ben_Webster-Jazz_&_Blues_26. El nombre de los ficheros OGG coincide con el nombre de cada pista en la información obtenida por FreeDB. Por ejemplo, el primer fichero, que corresponde a la primera pista del CD de Ben Webster, quedó guardado con el nombre 01.Randles_Island.ogg.

El mensaje final es el informe que devuelve oggenc sobre el proceso de codificación, encubierto hasta ese momento por los mensajes devueltos por cdparanoia, donde consta la calidad, por defecto 3.00 ---a mayor número, mayor calidad y menor compresión---, del fichero OGG resultante y algunos datos estadísticos sobre el proceso de codificación. A ello se añade la notificación de la operación de etiquetado:

Encoding track 18 of 18: Kat's fur...
Opening with wav module: WAV file reader
Encoding "/home/luis/abcde.170dd912/track18.wav" to
"/home/luis/abcde.170dd912/track18.ogg"
at quality 3,00
[ 99,8%] [ 0m00s remaining] -

Done encoding file "/home/luis/abcde.170dd912/track18.ogg"

File length: 2m 59,0s
Elapsed time: 0m 09,6s
Rate: 18,7143
Average bitrate: 97,3 kb/s

Tagging track 18 of 18: Kat's fur...

La ventaja de una sesión interactiva como la descrita es que podemos intervenir en la edición de las etiquetas del CD y sus pistas. Si queremos lo contrario, es decir, que abcde acepte las respuestas por defecto (los "no" anteriores) y actúe sin nuestra intervención, basta añadir la opción -N:

abcde -N

Si en lugar de un fichero OGG, deseamos un fichero FLAC como resultado del proceso, se utiliza la opción -o:

abcde -o flac

Si queremos grabar sólo algunas pistas y no todas, por ejemplo las tres primeras y la última:

abcde 1-3,18

En general, abcde, como casi toda orden de HAL, permite modificar su comportamiento por defecto o especificar más claramente nuestros intereses del momento a través de una amplia gama de opciones. Cuando estas opciones van a ser siempre las mismas, también permite definir variables de configuración a nivel de todo el sistema o para cada usuario en particular. En el primer caso el valor de las variables afectadas se especifica en el fichero de configuración /etc/abcde.conf; en el segundo, en el fichero de configuración de usuario ~/.abcde.conf. Tanto las opciones de línea de órdenes como las variables de configuración vienen suficientemente explicadas en la página de manual de abcde.

Pongamos, para terminar, un ejemplo de fichero de configuración de usuario (~/.abcde.conf), donde consten unas pocas de esas variables. El lector puede indagar y experimentar por su cuenta con otras.

# El formato de recuperación de la información de FreeDB sera UTF-8
CDDBPROTO=6

# Los números de las pistas serán 01, 02, ..., en lugar de 1, 2, ...
PADTRACKS="y"

# La calidad del fichero ogg resultante será de 4 (ver man oggenc)
OGGENCOPTS="-q 4"

# La compresión del fichero flac será la máxima posible (ver man flac)
FLACOPTS="--best"

# El resultado de la extracción se guardará en mi directorio de musica de CDs
# [Cada usuario debe poner aquí su nombre de usuario después de home]
OUTPUTDIR="/home/luis/musica/CDs/abcde"

# El CD se expulsará automáticamente cuando el proceso termine
EJECTCD="y"

lunes, 30 de marzo de 2009

HAL y mis CDs

Si tuviéramos que citar los ámbitos donde el uso de los ordenadores ha transformado nuestro paisaje cotidiano, no podríamos dejar de mencionar el de las aplicaciones de audio y, en concreto, la disponibilidad en formatos de tamaño reducido de la información que anteriormente se distribuía en CDs y que ha permitido la eclosión de los reproductores portátiles de audio, ésos que el lego conoce con el equívoco nombre de "Mp3".

HAL cuenta con un vasto equipo de colaboradores dispuestos a devorar nuestros CDs y convertir la información musical allí guardada en otra más manejable y transportable, así como para reproducirla a nuestro antojo. Durante unos días vamos a dedicarnos a descubrir alguno de ellos. No vaya a ser que luego nos recriminen que HAL está bien para las cosas de la Edad de Piedra, pero no para las innovaciones que el pegadizo ritmo del presente impone. De hecho, alguno de tales colaboradores, en particular, los que bregan en la zona más profunda e ingrata de la fábrica musical, son los auténticos responsables de que nuestras aplicaciones, también las del entorno gráfico, funcionen como lo hacen.

¿Por dónde empezar? Quizá lo primero de todo es aclararse con algunos términos y algunos conceptos en boga, que están en boca de todos y que no pocas veces se utilizan sin saber lo que significan, aunque sea aproximadamente. Los procesos implicados en el procesamiento del audio digital son complejos y es absurdo tratar de comprenderlos sin poseer un bagaje técnico y científico importante. Pero sí es posible, al menos, descender hasta un nivel de abstracción suficientemente alto como para no tener que detenerse en las minucias.

Las típicas aplicaciones para guardar el contenido de un CD de audio en la zona de almacenamiento de un dispositivo como un ordenador personal o un reproductor de audio portátil se denominan aplicaciones de ripping, palabra inglesa que popularmente se ha españolizado como "ripeo". En este proceso están implicadas normalmente varias operaciones diferentes:

  • La extracción del contenido del CD (el "ripeo" en sentido estricto).

    Este contenido, que en el CD se distribuye en bloques de datos, las conocidas "pistas" (tracks), se convierte en un formato lo más fiel posible al del propio CD, esto es, sin pérdida de datos y sin compresión. El formato habitual en la actualidad es WAV.

  • La codificación de la información extraída.

    Puesto que WAV o similares ocupan mucho espacio, se han creado sistemas (algoritmos) para comprimir la información contenida en ellos. La reducción del tamaño puede o no implicar pérdida de datos respecto del original. Cuando no hay pérdida, la reconstrucción de la información original es exacta; cuando la hay, es sólo aproximada, lo suficientemente aproximada como para que el oyente no profesional apenas perciba diferencia. Los formatos que suponen pérdida tienen la ventaja de ocupar menos espacio y por eso se han impuesto a gran escala con la llegada de los reproductores de audio portátiles. MP3 es uno de estos formatos comprimidos con pérdida de datos, pero no es ni el único ni el mejor. En el universo de HAL se deberían usar formatos abiertos y libres de patentes, como Ogg Vorbis (OGG, para abreviar), que, además y en general, se considera, de mayor calidad que MP3. En el mundo profesional, o cuando el oyente es muy exigente y goza de espacio suficiente en disco, se suelen preferir formatos comprimidos sin pérdida de datos, como FLAC.

  • El etiquetado de la información extraída y codificada.

    Sería muy pesado reconstruir la información del CD al transferir su contenido al ordenador, es decir, restablecer los títulos de las pistas, el intérprete, etc. Con ese fin se han desarrollado, entre otras opciones, bases de datos que contienen esa información y que son accesibles por Internet. Cuando la información no está disponible, el usuario puede rellenarla y enviarla al sitio web que aloja la base de datos para su recuperación posterior por parte de otros usuarios. Hoy en día, las bases de datos que utilizan los usuarios de GNU/Linux ---y deben utilizar, por razones de libertad de la licencia--- son FreeDB y MusicBrainz.


Dando por sentado que el lector va a codificar sus CDs con OGG o FLAC podemos referir algunos de los más conocidos colaboradores de HAL responsables en la actualidad de realizar las tareas antes descritas:

cdparanoia
Extracción de audio

oggenc
Codificación a formato OGG

flac
Codificación a formato FLAC

vorbiscomment
Etiquetado de ficheros OGG

metaflac
Etiquetado de ficheros FLAC

sox, vorbisgain
Otras herramientas para manipulación especializada de ficheros de audio.


No vamos a pararnos a dialogar con estos esforzados expertos, y no por falta de interés ---el autor se ha tenido que morder los labios para no hacerlo---, sino por falta de tiempo, del tiempo del lector que, seguramente, querrá entrar en materia cuanto antes de la mano de interfaces menos austeras o, si se quiere, de mecanismos de comunicación que nos permitan enviar una solicitud única para que los artesanos del sonido intervengan por turnos cuando corresponda. Estas interfaces son lo que popularmente se tiene en mente cuando se habla de aplicaciones de extracción o "ripeo" de CDs.

Tras esta introducción inicial podremos empezar a hablar con alguna de ellas. Comenzaremos por abcde (a better CD encoder = un mejor codificador de CDs) y seguiremos con crip. Eso será el próximo día.

martes, 24 de marzo de 2009

HAL y las marcas (Markdown y Pandoc)

No es improbable que el lector impaciente se canse de tanta marca y decida seguir trabajando con los medios que ya conoce, que no son otros que los omnipresentes procesadores de textos. Dirá que ya le costó lo suyo desenvolverse en los complejos menús del procesador como para ponerse ahora a cambiar toda su forma de escritura por unos enigmáticos "códigos" más que difíciles de teclear y peores de aprender. Insistirá en que para la Web le bastan los formularios de su plataforma de blogging, con sus perfectas barras de herramientas, tan estupendamente semejantes a las de los procesadores de texto. Concederá, finalmente, con inconfesada ironía, que el resultado con LaTeX es sorprendentemente bonito, pero total, para la cuatro cosas que va a escribir...

Estos son los argumentos habituales que esgrimen los usuarios que podríamos calificar propiamente y sin intención ofensiva alguna como usuarios "esclavos", pues es esclavo quien permanece completamente atado a la tecnología que, de un modo un otro, le es impuesta, ya porque constituye la corriente dominante, ya porque es la primera que aprendió o, tal vez con mayor probabilidad, por ambas cosas juntas. Tales argumentos no son, en el fondo, más que racionalizaciones pergeñadas con el único fin de continuar encastillado en una posición inamovible.

Ni HTML ni LaTeX son más difíciles de aprender que las innumerables opciones de menú de los procesadores de textos. En realidad, es mucho más natural plantear la tarea de escribir un documento electrónico cuando se establece de antemano una separación clara entre la estructura de su contenido y su forma de presentación.

Podríamos llegar a aceptar que la introducción de las marcas, particularmente en el caso de HTML, mucho más prolijo en esto que LaTeX, puede llegar a ser bastante pesada, si no se dispone de las herramientas que para esta tarea proporcionan editores como Vim o Emacs. Pero, como vamos a ver hoy, hasta este último baluarte de la recalcitrante defensa del procesador de textos, cae ante la presencia de los lenguajes de marcas "ligeros" como Markdown, que es el representante que hemos escogido de entre los muchos existentes.

No hay forma de sostener racionalmente la indiferencia displicente ante los lenguajes de marcas cuando nos hallamos ante caso tan natural como el siguiente:

% Un ejemplo de Markdown
% átopos
% 25 de Marzo de 2009

# Navegación gráfica
Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:

1. Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).
2. Crear en _Vim_ una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden `:new ruta_fichero`.

# Navegación desde consola
Si navegamos con _w3m_, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio _Vim_, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.

Con _w3m_ el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción `-dump`. Por ejemplo:

    w3m -dump http://www.w3.org/TR/html401/struct/lists.html

nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.

Esto ya parece dar gato por libre. ¿Dónde están las marcas? ¿No es éste el texto tal cual lo hubiéramos escrito, de no existir el maravilloso procesador de textos? ¡Menudo avance! ¡Un regreso a las cavernas!

Fíjese bien el lector incrédulo, porque las marcas siguen estando, pero reducidas a su más mínima expresión [El signo indica un espacio]:

% Un ejemplo de Markdown
% átopos
% 25 de Marzo de 2009

# Navegación gráfica
Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:

1.¶Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).
2.¶Crear en _Vim_ una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden `:new ruta_fichero`.

# Navegación desde consola
Si navegamos con _w3m_, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio _Vim_, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.

Con _w3m_ el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción `-dump`. Por ejemplo:

¶¶¶¶w3m -dump http://www.w3.org/TR/html401/struct/lists.html

nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.

Las equivalencias con nuestras marcas informales, (incluidos los añadidos de los últimos días), que frente a tal simplicidad resultan terriblemente embarazosas, son transparentes como la luz de un día radiante. Hagásmolas explícitas, por si alguien sigue todavía encerrado entre cuatro paredes:

TÍTULO, AUTOR y FECHA:
%

INICIO TÍTULO SECCIÓN:
#

FIN TÍTULO SECCIÓN
[No necesario]

INICIO SECCIÓN
[No necesario]

FIN SECCIÓN
[No necesario]

INICIO PÁRRAFO
Línea en blanco

FIN PÁRRAFO
[No necesario]

INICIO LISTA NUMERADA
[No necesario]

FIN LISTA NUMERADA
[No necesario]

INICIO ELEMENTO LISTA
1.¶ [y 2. , etc, para los siguientes elementos]

FIN ELEMENTO LISTA
[No necesario]

INICIO NOMBRE PROGRAMA
_ [guión bajo]

FIN NOMBRE PROGRAMA
_

INICIO OPCIÓN
` [acento grave]

FIN OPCIÓN
`

INICIO ORDEN
`

FIN ORDEN
`

INICIO BLOQUE ORDEN
¶¶¶¶

FIN BLOQUE ORDEN
[No necesario]


Estas marcas, excepto la primera, pertenecen al lenguaje de marcas ligero conocido como Markdown. Su sintaxis completa se explica aquí. La única precaución que hay que tomar es, como cabe esperar, la de escapar las marcas de Markdown cuando se van a introducir como caracteres literales en el texto corriente. Por ejemplo, para introducir literalmente un asterisco (*) tendremos que escribir \*. Quedan excluidos los casos en que esos signos aparecen dentro de un fragmento de código (entre acentos graves) o en los bloques de código (que se identifican, como hemos visto, por su sangría de cuatro espacios). A las marcas de Markdown se pueden añadir algunas otras, por ejemplo, la barra (|) para señalar una celda de una tabla. Este conjunto de extensiones se conoce como Markdown Extra.

Bien, las marcas fáciles, facilísimas, están ahí. ¿Qué podemos hacer con ellas? Los enterados saben que son la base, por ejemplo, de muchos sistemas de wikis. Pero nosotros no tenemos un wiki, todavía. No hace falta pensar, sin embargo, en aplicaciones especializadas. Los lenguajes de marcas ligeros pueden servir para escribir nuestros documentos y para que ayudantes especiales de HAL nos los devuelvan en un formato apto para su presentación, ya sea en la web o, incluso, en bella versión imprimible.

Pandoc es uno de estos eficientes colaboradores de HAL. Se trata de un conversor universal de un lenguaje de marcas a otro. Emplea las mismas marcas de Markdown y Markdown Extra con algunas extensiones y mejoras, como la marca % para elementos del encabezado. Las variantes de Pandoc en relación con Markdown / Markdown Extra se pueden consultar aquí.

Pandoc está disponible en Debian y se puede instalar como cualquier paquete:

aptitude install pandoc

Con Pandoc la conversión de nuestro texto a HTML, LaTeX y otros muchos lenguajes de marcas es cosa de niños, basta con pedírselo a HAL.

Supongamos que el texto anterior lo guardamos en el fichero texto_etiquetado-pandoc.mdml (la extensión mdml, que es opcional, es una abreviatura de MarkDown Markup Language). En tal caso, podríamos solicitar a HAL lo siguiente:

HAL, llama a tu ayudante en conversión de marcas para que convierta 'texto_etiquetado-pandoc.mdml' de [from] Markdown a [to] HTML.

Que se puede expresar así:

pandoc -f markdown -t html texto_etiquetado-pandoc.mdml

HAL nos devolverá el texto marcado con HTML, un HTML muy parecido al que obtuvimos hace unos días, aunque con un formato distinto, que en ningún caso afecta a la interpretación que un navegador hará de él. De hecho, la salida de pandoc se puede enviar directamente a w3m mediante una tubería:

pandoc -f markdown -t html texto_etiquetado-pandoc.mdml | w3m -T text/html

Se advertirá que en el HTML resultante no hay rastro de lo marcado con %, esto es, título, autor y fecha. Esta información se debería integrar en la cabecera de HTML (la etiqueta HEAD), pero pandoc la descarta por defecto, a menos que le indiquemos lo contrario con la opción --standalone (= autónomo), o -s, en versión abreviada. Con esta opción activada, pandoc crea un documento autónomo, un HTML completo con su declaración de documento y su oportuna cabecera. Podemos volver a ejecutar la orden, redirigir el resultado a w3m y, por medio de la orden v de w3m, inspeccionar el HTML.

pandoc -s -f markdown -t html texto_etiquetado-pandoc.mdml | w3m -T text/html

La conversión a LaTeX sigue los mismos derroteros:

pandoc -f markdown -t latex texto_etiquetado-pandoc.mdml

Y la versión autónoma se obtiene mediante el mismo procedimiento:

pandoc -s -f markdown -t latex texto_etiquetado-pandoc.mdml

El resultado es prácticamente idéntico a uno de los nuestros. La única diferencia reseñable está en el preámbulo del documento, una diferencia que sí afectaría al resultado final del procesamiento con pdflatex. La razón es que pandoc no tiene en cuenta, porque no puede saberlo de antemano, que nuestro texto está escrito en castellano. Tenemos que decírselo explícitamente. La forma de hacerlo es bien simple. Creamos, para empezar, un fichero, llamémoslo preambulo-latex, que contenga nuestro preámbulo, por ejemplo, éste:

\documentclass[a4paper]{article}
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{bera}

Después, se informa a pandoc de nuestro preámbulo para que lo aplique en lugar del que él utliza por defecto. Para ello recurrimos a la opción --custom-header (= cabecera personalizada) o, su versión abreviada, -C:

pandoc -s -C preamulo_latex -f markdown -t latex texto_etiquetado-pandoc.mdml

El resultado se podría redirigir a un fichero para procesarlo más tarde con pdflatex.

Con el fin de evitarnos los pasos intermedios en la generación del PDF, Pandoc proporciona como alternativa rápida el guión markdown2pdf, que generaría un fichero con extensión pdf y el mismo nombre de nuestro fichero original:

markdown2pdf -C preambulo_latex texto_etiquetado-pandoc.mdml

Pandoc, aparte de su facultad para convertir a otros muchos formatos, permite usos más sofisticados, como, por ejemplo, introducir directamente marcas LaTeX en el documento marcado con Markdown que se mantendrán literalmente en el documento resultante, lo que facilita la construcción de documentos LaTeX más elaborados. Todo esta documentado en la página web citada y en el fichero README, que se encuentra en la documentación del paquete Debian: /usr/share/doc/pandoc/README.gz.

Con Markdown y Pandoc finalizamos, de momento, este primer contacto con los lenguajes de marcas. Mucho queda en el tintero. Es casi vergonzoso no haber presentado, en particular, el metalenguaje XML y algunos de los lenguajes de marcas construidos a partir de él. Otra vez será.


Resumen

  • Los lenguajes de marcas ligeros facilitan el tecleado de las marcas y pueden aprenderse en pocos minutos.

  • Markdown es un lenguaje ligero de marcas.

  • Pandoc es un sistema de conversión de lenguajes de marcas, especialmente apropiado para producir documentos LaTeX sencillos a partir de lenguajes de marcas ligeros. Ofrece una interfaz de línea de comandos a través de la orden pandoc y de algún guión, como markdown2pdf, para facilitar la generación de documentos típicos.

sábado, 21 de marzo de 2009

HAL y las marcas (LaTeX - IV)

Vale. Hemos marcado nuestro texto como LaTeX prescribe. Pero ¿cómo podemos ver el resultado?

Para un texto marcado con marcas HTML el navegador hace las veces del experto que lo procesa y del soporte para su visualización. Para un texto marcado con LaTeX, las dos acciones, la de procesar el documento y la de visualizarlo, son, sin embargo, competencia de dos agentes diferentes: el tipógrafo y el "lector" o "visualizador" del documento resultante, normalmente, en nuestros días, un fichero PDF.

El tipógrafo más recomendable en la actualidad para documentos LaTeX se llama pdfTeX, un descendiente del original TeX, que todavía se sigue usando, y mucho. LuaTeX, nieto de TeX e hijo de pdfTeX, podría consolidarse como el noble heredero de ambos en los próximos años.

pdfTeX y todo lo que se requiere para procesar un documento LaTeX viene incluido en todas las distribuciones modernas de GNU/Linux. En Debian, por ejemplo, se empaqueta dentro de los paquetes que incluyen el prefijo texlive-. TeX Live, que es la distribución más completa que existe para procesar documentos con LaTeX, es realmente grande y por eso Debian ofrece la posibilidad de instalar todo TeX Live, mediante el paquete texlive-full, o sólo una parte básica, mediante el paquete texlive y otros posibles añadidos.

Si el lector dispone de una gran cantidad de disco duro puede proceder a instalar texlive-full:

aptitude install texlive-full

En caso de que quiera ahorrar espacio, bastará con que instale, por lo pronto, tres paquetes (de los cuales sólo los dos primeros son imprescindibles):

aptitude install texlive texlive-lang-spanish texlive-doc-es

Tenemos ya a nuestros expertos ahí disponibles para todo lo que les ordenemos. No perdamos más tiempo y hagamos que pongan su imprenta en marcha sobre nuestro documento. Llamaremos a pdflatex que es el ayudante de pdfTeX encargado de procesar los documentos LaTeX:

pdflatex texto_etiquetado.tex

Si no hay ningún error sintáctico en nuestras marcas LaTeX, pdflatex terminará su trabajo rápidamente tras expulsar algunos mensajes sobre el procesamiento. El resultado quedará guardado en el fichero texto_etiquetado.pdf. Cualquier lector de PDF nos mostrará el resultado:



Pero, ¿y si hemos cometido un error sintáctico en las marcas? Lo que sucederá es que pdflatex se detendrá y nos mostrará un mensaje de error. Los mensajes de error de pdflatex pueden ser difícilmente comprensibles; lo peor, sin embargo, es que tendremos que aprender algunos atajos de teclado para salir del procesamiento detenido y, sobre todo, nos veremos obligados a volver a ejecutar pdflatex cuantas veces sea necesario hasta corregir todos los errores. Una opción para evitar, al menos, esto último, es utilizar un corrector de la sintaxis de LaTeX antes de procesar el documento con pdflatex. Podemos recurrir a lacheck, que viene incluido en TeX Live.

Imaginemos, por ejemplo, que nos comimos ---un hambre descuidada produce estos males--- la llave de cierre en la primera sección y el \end{enumerate} al final de la lista. O sea:

...
6 \begin{document}
7 \section{Navegación gráfica <== Falta llave de cierre
8 Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:
9
10 \begin{enumerate}
11 \item Ir al menú <<Archivo>> del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).
12 \item Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta\_fichero.
13 <== Falta \end{enumerate}
14
15 \section{Navegación desde consola}
16 Si navegamos con w3m, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio Vim, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.
17
18 Con w3m el proceso de convertir una página web entexto es absolutamente elemental: añadir la opción -dump. Por ejemplo:
19
20 w3m -dump http://www.w3.org/TR/html401/struct/lists.html
21
22 nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.
23
24 \end{document}

Sobre este texto, que guardamos como el nombre texto_erroneo.tex, ejecutamos ahora lacheck:

lacheck texto_erroneo.tex

Aparecerán los siguientes mensajes:

"texto_erroneo.tex", line 24: <- unmatched "\end{document}"
"texto_erroneo.tex", line 10: -> unmatched "\begin{enumerate}"
"texto_erroneo.tex", line 25: <- unmatched "end of file texto_erroneo.tex"
"texto_erroneo.tex", line 7: -> unmatched "{"
"texto_erroneo.tex", line 25: <- unmatched "end of file texto_erroneo.tex"
"texto_erroneo.tex", line 6: -> unmatched "\begin{document}"

El analizador sintáctico, aunque emite mensajes que no son absolutamente claros, ayuda a localizar rápida y exactamente la línea o líneas que contiene los errores cometidos. Nótese que se muestran mensajes de error para las últimas líneas del fichero, la 24 y la 25, así como para la primera del fragmento, la línea 6. Estos mensajes de error son provocados por nuestros verdaderos errores, los que afectan a las líneas 7 y 13, que, como un efecto en cadena, disparan los mensajes relativos al resto de líneas. Una vez corregidas las líneas defectuosas (la 7 y la 13), el resto de mensajes de error desaparecerá.

La moraleja es que hay que ser cuidadoso a la hora de marcar textos (los buenos editores como Vim o Emacs suelen ayudar ya de entrada en esta tarea) y que conviene utilizar un analizador sintáctico como lacheck antes de procesar el documento con pdflatex.


Resumen:

  • pdflatex es el tipógrafo de documentos LaTeX recomendado en la actualidad. pdflatex forma parte de la máquina tipográfica pdfTeX.

  • pdfTeX es heredero de TeX. LuaTeX, por su parte, es heredero de pdfTeX y se perfila como su futuro sucesor.

  • La distribución actualmente más completa para procesar documentos LaTeX es TeX Live. TeX Live viene empaquetada por Debian en el paquete texlive (que contiene lo básico) y otros paquetes con el prefijo texlive-.

  • lacheck es un analizador de la sintaxis de marcas LaTeX. Es recomendable analizar la corrección de nuestra sintaxis antes de procesar nuestro documento con pdflatex.

lunes, 16 de marzo de 2009

HAL y w3m (IV)

Para demostrar la versatilidad de la consola, vamos a ver hoy dos ejemplos de interacción entre Vim y w3m.

Imaginemos que estamos editando con Vim un documento sobre el lenguaje de marcas HTML y consultando a la vez en nuestro navegador la especificación que el W3C distribuye sobre ese lenguaje. Al llegar, digamos, a la sección sobre el etiquetado de listas vemos que hay ahí mucha información interesante, dispersa a lo largo de la página, que queremos incluir y comentar en nuestro documento. Sería demasiado pesado y extremadamente lento tener que ir del navegador al editor una y otra vez para copiar y pegar (con ratón) el texto de la referencia del W3C que correspondiese. Lo mejor es traer esa sección de la especificación a nuestro propio Vim. Podemos, por ejemplo, abrirlo en una ventana dentro de este nuestro editor favorito y operar sobre la página del W3C, como si se tratase de un fichero de texto cualquiera, con las órdenes de edición habituales (y mucho más rápidas) que expusimos días pasados. [Entonces no comentamos nada sobre el soporte de ventanas en Vim. El lector puede informarse de este aspecto del editor y de las órdenes relacionadas solicitando información a Vim mediante la orden :help windows .].

Si hubiésemos estado visitando la página con un buen navegador gráfico que disponga de la opción de guardar las páginas web como texto, tendríamos que realizar al menos dos acciones, ambas independientes:

  1. Ir al menú "Archivo" del navegador y guardar como texto la página web. (Lo que además implica seleccionar un nombre de fichero y un directorio).

  2. Crear en Vim una nueva ventana para editar en ella el documento que acabamos de guardar, mediante la orden :new ruta_fichero.


Si navegamos con w3m, y gracias a la interacción entre las aplicaciones de consola, bastaría ejecutar una única acción desde el propio Vim, que, además, podríamos abreviar para reproducirla en situaciones semejantes. Veamos cómo.

Con w3m el proceso de convertir una página web en texto es absolutamente elemental: añadir la opción -dump. Por ejemplo:

w3m -dump http://www.w3.org/TR/html401/struct/lists.html

nos devuelve la página dada como argumento, tal cual se presenta en el navegador, pero como puro texto.

Por otra parte, sabemos que desde Vim podemos solicitar la ejecución de órdenes externas. Podríamos, pues, solicitar la ejecución de w3m con la opción y el argumento anteriores:

:!w3m -dump http://www.w3.org/TR/html401/struct/lists.html

También sabemos que existe una orden de Vim apropiada para leer la salida de cualquier orden externa, esto es, para introducirla en el documento actual. Por tanto, si queremos leer en la ventana actual del editor la salida de la orden anterior, tendríamos que decirle a Vim lo siguiente:

:r !w3m -dump http://www.w3.org/TR/html401/struct/lists.html

Finalmente, la forma de pedir a Vim que abra una nueva ventana y ponga en ella el resultado de una orden cualquiera es éste:

:new | orden

donde la orden :new crea una nueva ventana con un fichero vacío y sin nombre. y el carácter especial '|' sirve para separar esta orden de aquella otra que se ponga a continuación ---y que afectará a la nueva ventana---, de tal manera que en una sola línea dentro de la línea de órdenes puedan ejecutarse dos órdenes diferentes, una tras otra.

Sólo queda unir todas las piezas para que nuestra orden completa reciba su forma final:

:new | :r !w3m -dump http://www.w3.org/TR/html401/struct/lists.html

que es, en resumen, la construcción lingüística que entiende Vim para indicarle algo parecido a la siguiente parrafada:

Vim, abre una nueva ventana y pon en ella la página web, convertida en texto, a la que apunta la dirección 'http://www.w3.org/TR/html401/struct/lists.html'

Puesto que esta orden es demasiado larga y puede que vayamos a utilizarla en distintas ocasiones para URLs diferentes, una abreviatura nos puede ser muy útil. Vim dispone de varias órdenes para crear abreviaturas. Cuando el propósito es que la abreviatura funcione sólo en la línea de órdenes, la orden adecuada es :cabbrev. Así, la orden:

:cabbrev wwd new \| :r !w3m -dump

asocia la abreviatura wwd a la orden larga new | :r !w3m -dump.

¿Por qué hemos puesto el carácter '\' antes del carácter '|' en la orden :cabbrev? La razón es que el carácter '|' tiene un significado especial, como acabamos de ver (el de separar dos órdenes), y no puede formar parte de un argumento de una orden (en este caso el segundo argumento de la orden :cabbrev). Para que se interprete literalmente y no en su especial significado sintáctico debemos "escaparlo", por las mismas razones y mediante el mismo procedimiento que tuvimos que emplear para "escapar" otros caracteres especiales de la lengua de HAL.

Gracias a la anterior abreviatura, cada vez que pulsemos los dos puntos (para abrir la línea de órdenes de Vim) y tecleemos wwd, seguida de espacio, Vim escribirá por nosotros la secuencia new | :r !w3m -dump, que veremos reproducida y que podremos completar con la URL que nos interese.

Para que abreviaturas como ésta estén disponibles en futuras sesiones de edición con Vim se deben guardar en el fichero ~/.vimrc, del mismo modo que las asociaciones de teclado creadas por medio de :map, tal y como se explicó en otro lugar.

Pongámonos ahora en una situación diferente. Estamos escribiendo un texto en Vim, digamos, sobre literatura inglesa, y nos gustaría consultar versiones públicas de las obras citadas accesibles desde la Open Library. Sería ideal poder realizar esas consultas sin necesidad de moverse del editor.

Las URLs de la Open Library para búsqueda de libros escaneados accesibles en su integridad tienen actualmente la siguiente forma (por ejemplo, para la tragedia de Shakespeare King Lear):

http://openlibrary.org/search?King+Lear&ftokens=mhsncqbxgkup

Si en el documento que estamos editando con Vim tenemos escrita una línea con el nombre del drama shakespeariano King Lear podríamos tratar de enviar una orden como ésta:

:!w3m http://openlibrary.org/search?q=King+Lear&ftokens=mhsncqbxgkup

para que Vim abriese w3m en la página correspondiente de la Open Library.

Ahora bien, el contenido de la línea de nuestro documento podría ser cualquier otro en lugar de "King Lear" y perderíamos todas las ventajas de usar Vim si tuviésemos que editar a mano la URL de turno. Lo que nos interesa es que la orden anterior se genere automáticamente, es decir, que las ??? de esta orden:

:!w3m http://openlibrary.org/search?q=???&ftokens=mhsncqbxgkup

sean sustituidas por las palabras de la línea de cada caso, separadas ---nótese el matiz--- por '+', que es la forma que requieren la URLs de la Open Library.

Tratemos de resolver el problema paso a paso.

El primer paso es conseguir que en las palabras de las que consta la línea actual del documento que editamos el espacio sea sustituido por el '+'. Podemos recurrir a una orden de HAL como sed:

:!sed 's/ /+/g'

O de forma más ortodoxa, utilizando expresiones regulares (donde el '+' de la expresión regular debe escaparse en sed):

:!sed 's/[[:space:]]\+/+/g'

Con esto tenemos resuelta la primera parte del problema. La segunda consiste en introducir el resultado de la substitución realizada por sed en el lugar de la URL que corresponde, es decir, el lugar que señalamos anteriormente con las ???. Pensado en términos de la lengua de HAL, que conocemos bien, esta tarea no entraña dificultad especial. Recuérdese que en tales casos la sustitución de órdenes es nuestro aliado. Por ejemplo, en lengua de HAL podríamos decir algo parecido a lo siguiente, para buscar en Google la salida de un echo:

echo "King Lear" | w3m http://google.com/search?q=$(sed 's/[[:space:]]\+/+/g')

Lo que esta orden hace ---recuérdese--- es dirigir la salida de la orden echo a la entrada de la orden w3m. Esta última orden consta de un argumento que incluye una sustitución de órdenes, $(...). Cuando HAL interpreta dicho argumento se encuentra con la sustitución de órdenes y trata de resolverla, antes de ejecutar w3m. En el caso presente, la sustitución de órdenes es más compleja de lo habitual, pues contiene un filtro sed que, como sabemos, toma por defecto como argumento un fichero y, en caso de no haber ninguno, se nutre de la entrada estándar (la "cañería principal", como la llamamos en otra ocasión). La tubería inicial hace que lo que hay tras ella ya no se alimente de la entrada estándar, sino de la salida de echo. Por eso, cuando HAL trata de interpretar la sustitución de órdenes contenida en el argumento de w3m utiliza la salida de echo, en lugar de la entrada estándar, como alimento del sed que aparece allí. Para disipar toda duda sobre el proceso que HAL realiza en este caso, interpretemos la orden como lo haría él (en sus pasos básicos):

  1. Ejecuto echo "King Lear". Su salida es la cadena 'King Lear'.

  2. Veo la tubería. La entrada actual para el resto de la orden dejará de ser la entrada estándar, en su lugar lo será la salida de echo, o sea, la cadena 'King Lear'.

  3. Antes de ejecutar w3m analizo su argumento. Este argumento contiene la sustitución de órdenes $(sed 's/[[:space:]]\+/+/g').

  4. Procedo a sustituir:

    1. sed no tiene argumento, luego su entrada es la entrada actual, esto es, la cadena 'King Lear'.

    2. El resultado de ejecutar sed tomando como entrada la cadena 'King Lear' es la cadena 'King+Lear'.

    3. El argumento de w3m es, pues, http://google.com/search?q=King+Lear

  5. Ejecuto w3m con el argumento anterior.


Ahora bien, nuestro problema reviste una dificultad especial. La entrada de sed no va ser la salida de una orden de HAL como echo, sino justamente el contenido de la línea actual de nuestro documento. Sería una dificultad intratable si Vim no nos proporcionase una forma de hacer que fragmentos de nuestro documento se convirtieran en la fuente de alimentación, la entrada, de las órdenes externas que le ordenamos ejecutar. El recurso que Vim pone a nuestra disposición para esta clase de situaciones especiales es la expresión :

:dirección w !orden_externa

donde direccion es una especificación del ámbito del documento que queremos pasar como entrada a la orden externa, el espacio entre w y ! es obligatorio y el espacio entre dirección y w es opcional y se pone ahora para facilitar la lectura. [Sobre la noción de dirección ya comentamos lo suficiente aquí].

Lo que esta orden viene a decirle a Vim se podría expresar a nuestra manera:

Vim, coge el texto que hay en la dirección indicada y ejecuta la orden_externa suministrándole como entrada dicho texto.

Por ejemplo, si la quinta línea de nuestro documento consistiese en la cadena 'King Lear', podríamos hacer que w3m abriese la página de búsqueda de Google para ese texto con la orden:

:5w !w3m http://google.com/search?q=$(sed 's/[[:space:]]\+/+/g')

En el caso que nos interesa no podemos saber por anticipado el número de línea de la dirección. Debemos, pues, aplicar un medio genérico para referirnos a la línea actual, sea cual sea su número de línea en este momento. Tal especificador genérico de dirección existe en Vim, es el punto ('.'). Por tanto, la orden del ejemplo anterior se debería escribir así:

:.w !w3m http://google.com/search?q=$(sed 's/[[:space:]]\+/+/g')

Llegados a este punto, parece trivial completar la orden de búsqueda en la Open Library que dejamos a medio construir:

:.w !w3m http://openlibrary.org/search?q=$(sed 's/[[:space:]]\+/+/g')&ftokens=mhsncqbxgkup

La solución, no obstante, no funcionará, falta un pequeño detalle. El carácter '&' es otro carácter especial de la lengua de Vim [para más información, consultar la referencia de Vim con :help &]. Como nuestra intención es que se interprete literalmente, en cuanto parte integrante de la URL, debemos "escaparlo". En consecuencia nuestra orden definitiva sería:

:.w !w3m http://openlibrary.org/search?q=$(sed 's/[[:space:]]\+/+/g')\&ftokens=mhsncqbxgkup

Con esta orden ---que podemos abreviar con :cabbrev o que podemos, mediante :map, asociar a una tecla--- logramos nuestro objetivo: abrir w3m desde Vim para que nos muestre la página de la Open Library donde aparecen relacionados los libros escaneados cuyo título coincide con el nombre que consta en la línea actual de nuestro documento, la línea donde está ubicado el cursor.

Resulta obvio que este tipo de estrategia se podría generalizar y refinar. La línea de órdenes de Vim se complicaría en exceso en tales casos y sería necesario recurrir mejor a herramientas aún más versátiles como la creación de funciones para Vim o, incluso, de plugins [Ver :help user-manual]. Se trata de herramientas avanzadas de las que, por lo pronto, no tenemos intención de hablar en nuestras conversaciones.

Puesto que los ejemplos propuestos, son simplemente eso, ejemplos, y contienen material relativamente especializado, omitimos el resumen de siempre. Basta con degustar el sabor peculiar de esta interacción entre las aplicaciones de consola, muchas veces sazonadas con los conocidos ingredientes de la lengua de HAL y de sus característicos aromas.

viernes, 13 de marzo de 2009

HAL y w3m (III)

Hasta ahora nos hemos movido por la interfaz de w3m mediante el ratón. Pero w3m es un navegador de consola, un ayudante de HAL, y en cuanto tal, nos proporciona los mecanismos necesarios para olvidarnos, si queremos, del ratón. Que ello tenga las mismas evidentes ventajas que en Vim puede ser objeto de discusión. Como no se trata ahora de pronunciarse a favor o en contra de uno u otro dispositivo como intermediario en la comunicación de las órdenes de movimiento de w3m, nos limitaremos a exponer algunas de esas órdenes y dejar que el lector seleccione según sus propios criterios y su experiencia la que más le interese.

De la misma manera que el resto de las órdenes internas de w3m podemos indicar las operaciones de movimiento, aparte de con el propio ratón, mediante órdenes largas (a través de su línea de órdenes) o mediante atajos rápidos de teclado asociados a tales órdenes. Lo natural y eficaz es hacerlo de esta segunda manera.

w3m incluye por defecto unas asociaciones de teclado que a las que nos atendremos en lo que sigue. Afortunadamente, muchas de las teclas de movimiento nos resultarán familiares, porque, o bien algunas son convenciones habituales de navegadores o paginadores, o bien muchas son idénticas o similares a las teclas de movimiento de Vim. La lista completa de estas teclas se puede consultar mediante la orden H, que enumera por secciones todas las asociaciones de teclado de w3m. Las relativas al movimiento por la interfaz principal aparecen en la sección inicial titulada Page/Cursor Motion. Veamos sólo unas cuantas [SPC está por la tecla de espacio; MAY por mayúscula; TAB por tabulador y RET por 'Enter'. El resto de designaciones coincide con las presentadas ayer]:

RET
Sigue el enlace, esto es, abre la página a la que apunta, o actúa como corresponda sobre un objeto de la interfaz (por ejemplo, cambia la selección en una casilla de verificación, abre una caja de opciones, etc.) [No es una tecla de movimiento propiamente dicha, pero conviene citarla aquí.]

SPC
Una pantalla hacia delante. [Igual que en el paginador less.]

b
Una pantalla hacia atrás. [Igual que en less.]

h,j,k,l
Mueve el cursor un paso a izquierda, abajo, arriba y derecha, respectivamente [Igual que en Vim].

w
Una palabra hacia delante [Igual que en Vim].

W
Una palabra hacia atrás [Diferente analogía a la de Vim].

^
Principio de la línea actual [Semejante a Vim, pero no citada en los artículos precedentes sobre Vim.]

g
Primera línea. [Parecida a Vim.]

G
Última línea. [Igual que en Vim.]

TAB
Enlace siguiente [Igual que en muchos navegadores.]

MAY+TAB
Enlace anterior [Igual que en muchos navegadores.]

B
Página anterior. Por defecto, elimina de la memoria la página actual, a la que no se podrá acceder de nuevo mediante el menú de páginas visitadas en la sesión actual que se obtiene a través de la orden 's', comentada ayer.

}
Pestaña siguiente

{
Pestaña anterior

/
Abre una línea en la parte inferior de la pantalla para iniciar una búsqueda de un texto. Las teclas n y N continúan la búsqueda hacia delante o hacia atrás, respectivamente. [Igual que en Vim.]



Resumen:

  • w3m proporciona una amplia gama de asociaciones de teclado para moverse mediante él a lo largo de su interfaz. Algunas han sido presentadas en este artículo.