domingo, 25 de enero de 2009

Los paquetes de HAL

En la entrada pasada nos quedamos con la miel en los labios. La necesidad de un diccionario bilingüe nos llevó a descubrir que tenemos que instalar un paquete nuevo en nuestro HAL. Conseguimos saber, además, que HAL cuenta para la gestión de paquetes con ayudantes especializados, de entre los cuales aptitude destaca como uno de los candidatos más firmes. Pero no sabemos nada de aptitude, más allá de su supuesto "talento" (que es lo que el término inglés aptitude significa en castellano).

Hoy vamos a aprender, por fin, lo que este talentoso ayudante puede hacer por HAL y alguna de las órdenes fundamentales que entiende.

No viene mal empezar con una breve consideración sobre su sorprendente nombre. En realidad, es chocante que una, entre tantísimas herramientas excelentes, tenga la desfachatez de acaparar para sí tan presuntuoso calificativo. Sin embargo, las sospechas sobre su inmoderado afán de protagonismo se desvanecen si atendemos a su verdadero origen. Y la verdad es que el nombre aptitude no es otra cosa que un juego de palabras con la sigla apt. Apt es una abreviatura de advanced package tool (herramienta avanzada de paquetes) y es, además, el nombre del precursor de aptitude en la gestión de paquetes de distribuciones basadas en Debian. De hecho, apt se sigue usando hoy en día para esta tarea, si bien aptitude, al añadir o simplificar funcionalidades que ya poseía apt, es, con frecuencia, la opción recomendada por los expertos.

Conviene extraer de esta curiosa consideración una pequeña idea. Ya hemos comprobado el abundante uso de abreviaturas o siglas en la lengua de HAL. No deberá sorprendernos a partir de ahora encontrar también términos que proceden de juegos de palabras. Y es que, contra lo que parece, la lengua de HAL está llena de guiños, de ironías y, en último término, de sentido del humor.

Fin de los devaneos y entrada en materia.

¿Qué puede hacer este gracioso aptitude por HAL y por nosotros? Puede hacer bastantes cosas, comunes, por cierto, a todos los gestores de paquetes. Pero lo que a nosotros nos interesa ahora es que haga, al menos, estas tres:

  • Buscar entre los paquetes disponibles en los almacenes de paquetes aquellos que, según el caso, nos interesan.

  • Mostrar información sobre los candidatos seleccionados en esa búsqueda para definir mejor nuestra decisión.

  • Instalar el paquete o paquetes que le indiquemos.



Las órdenes que entiende aptitude para ejecutar estos tres cometidos no podían ser más intuitivas: search (= buscar), show (= mostrar) e install (= instalar).

¿Y la sintaxis? La sintaxis varía ligeramente dependiendo de la orden que aptitude reciba. Sin pretender ser exhaustivo, lo más sencillo es asimilar unos cuantos ejemplos básicos.

aptitude install moreutils

Instala el paquete cuyo nombre es moreutils.

aptitude show moreutils

Muestra información sobre el paquete cuyo nombre es moreutils.

aptitude search utils

Busca paquetes relacionados con la palabra utils. (El segundo argumento es una expresión o patrón de búsqueda).


Los dos primeros ejemplos no requieren mayor explicación, salvo la de que puede haber más argumentos, cada uno de los cuales sería, de nuevo, un nombre de paquete que se quiere instalar o sobre el se solicita información; p. e., aptitude show kde gnome mostraría información sobre los paquetes kde y gnome. El tercer ejemplo sí que exige un estudio aparte.

¡Pues, vaya!, la búsqueda de paquetes, que es lo primero que evidentemente hay que dominar ---porque si no, a ver cómo vamos a conocer el nombre del paquete o paquetes que nos conciernen---, ¡resulta que es lo más raro! ¿Qué es eso de un patrón de búsqueda? En el ejemplo propuesto no parece nada complicado, utils es una palabra como otra cualquiera. ¿Por qué calificar esa palabra con el enrevesado apodo de patrón de búsqueda? ¿O es que ese segundo argumento para
aptitude search puede ser algo diferente de una palabra pura y simple?

Efectivamente, puede ser algo más. En realidad, puede ser mucho más. No es práctico ver todo lo que puede ser ---sería para volvernos locos---, es mejor ceñirnos a unos pocas posibilidades, justamente las que nos van a resultar útiles para obtener nuestro ansiado diccionario.

Por consiguiente, abandonemos las generalidades y pasemos al caso práctico. Sólo entonces, veremos con claridad la cuestión de los patrones de búsqueda y su pertinencia.

Vamos a ello.

HAL, dile a aptitude que me busque un diccionario

que, como acabamos de ver, se expresaría, en principio, de este modo:

aptitude search dictionary

La respuesta de mi HAL es la siguiente [presento sólo las 10 primeras líneas de un total de 59 ---algún día explicaré cómo las he contado, porque no lo he hecho con la cuenta de la vieja]:

v aspell-dictionary -
v aspell6a-dictionary -
v dictd-dictionary -
p dictionary-el - cliente de diccionario para Emacs
p dictionaryreader.app - Dict client for GNUstep
v hunspell-dictionary -
v hunspell-dictionary-ar -
v hunspell-dictionary-da -
v hunspell-dictionary-de -
v hunspell-dictionary-en -


Es digno de mención el hecho de que pedir a aptitude que busque, por ejemplo, algo sobre diccionarios es básicamente lo mismo que hacíamos mediante la orden apropos cuando pedíamos a HAL que buscase algo. La diferencia reside en el ámbito de aplicación de la búsqueda y en el objeto buscado. Mientras que con apropos buscamos dentro del propio HAL ciertas órdenes, con aptitude search buscamos dentro de los almacenes de paquetes residentes en Internet ciertos paquetes. Un proceso, en consecuencia, bastante natural es buscar primero (con apropos) en lo que tengo más cerca de mí y, si no lo encuentro, buscarlo en el exterior (con aptitude search). Lo hace todo hijo de vecino, primero busca el chocolate en la nevera, y si no lo encuentra ---mala suerte--- se tiene que ir a la tienda a por él.

No es, pues, mera coincidencia que el resultado de ejecutar ambas órdenes comparta un cierto aire de familia. Veamos como ejemplo, una línea cualquiera de la respuesta de apropos dictionary y aptitude search dictionary, respectivamente:

apropos:

remove-default-ispell (8) - remove default ispell dictionary

aptitude:

p   dictionaryreader.app  - Dict client for GNUstep



La respuesta a apropos consta del nombre de una orden ---aquí, remove-default-ispell--- y de un resumen de su descripción; la correspondiente a aptitude consta del nombre de un paquete ---dictionaryreader.app--- y de un resumen de su descripción. Sólo hay dos diferencias: el número de sección en la página de manual, asociado a la orden, que falta en el paquete, puesto que un paquete no tiene páginas de manual, y el prefijo que aparece delante del paquete ---en el ejemplo, p---, que no existe en el caso de la orden.

¿Cuál es el significado de este prefijo al nombre de un paquete en la respuesta de aptitude? Se trata, simplemente, de una señal ---técnicamente se llama bandera (flag)---, que indica cuál es el estado actual del paquete. Normalmente sólo veremos tres o cuatro de estos prefijos ---en caso contrario, habrá algo raro en la instalación. En nuestra situación actual, con la instalación de la distribución tal como viene de fábrica, nos podemos con encontrar uno de estos tres:

  • i: el paquete está instalado. [Es muy común encontrar el prefijo i A, que significa que el paquete fue instalado automáticamente, sin intervención del usuario.]

  • p: el paquete no está instalado, no hay rastro de él en el sistema o, lo que es lo mismo, el sistema está completamente limpio (purged) de él.

  • v: el paquete es un paquete virtual. Un paquete virtual es uno que no existe realmente, se trata simplemente de un mero nombre que el sistema de paquetes puede usar para fines internos. De momento, nos olvidaremos de estos "paquetes" virtuales.



Con toda esta información podemos entender exhaustivamente la respuesta que anteriormente dio HAL a nuestra pregunta sobre los paquetes relacionados con el diccionario. La vuelvo a reproducir para facilitar la lectura:

v aspell-dictionary -
v aspell6a-dictionary -
v dictd-dictionary -
p dictionary-el - cliente de diccionario para Emacs
p dictionaryreader.app - Dict client for GNUstep
v hunspell-dictionary -
v hunspell-dictionary-ar -
v hunspell-dictionary-da -
v hunspell-dictionary-de -
v hunspell-dictionary-en -


Si nos fijamos en la respuesta completa ---aquí están reproducidas únicamente las diez primeras líneas---, notaremos una curiosa coincidencia, a saber, todos los nombres de los paquetes contienen la palabra que dimos como patrón de búsqueda a la orden aptitude search, esto es, la palabra dictionary. De ahí podemos deducir que si el patrón de búsqueda es una palabra pura y simple, aptitude va a buscar exclusivamente en el nombre de los paquetes. No es buena cosa o, al menos, no es suficiente, porque, si el nombre del paquete no contiene la palabra que nos interesa, no aparecerá entre las respuestas posibles. Se ve que apropos era más inteligente que aptitude, puesto que buscaba en las descripciones, donde es más probable acertar con lo que buscamos. No parece que aptitude tenga tanto talento como pretende.

Pobre aptitude, no le colguemos el sambenito de fanfarrón sin antes conocerle a fondo. aptitude puede hacer lo que queremos y más, sólo que hay que aprenderse un par de patrones de búsqueda.

Para que aptitude busque dentro de las descripciones de los paquetes el patrón adecuado es:

'~dtérmino_de_búsqueda'

Las comillas son convenientes, como siempre que introducimos esta clase de patrones. Aquí el signo de la tilde señala el comienzo del patrón de búsqueda. La letra siguiente es una abreviatura del tipo de búsqueda que se va a efectuar. En este caso, la d indica que se va a buscar dentro de las descripciones de los paquetes. Lo que se va a buscar es lo que viene a continuación. Asi, por ejemplo, si queremos buscar por "stupid" en las descripciones de los paquetes, el patrón de búsqueda sería:

'~dstupid'

Y, ojo, que salen varios resultados ;-)

Existe también una forma más larga de precisar el patrón de búsqueda. Quizá haya gente que la prefiera, por ser más clara y porque le recuerde el tipo de URLs que salen cuando se hacen búsquedas sobre bases de datos en un navegador:

'?description(stupid)'

Probemos ahora un patrón de búsqueda semejante para lo de nuestro diccionario:

aptitude search '~ddictionary'

¡Brutal!, HAL me devuelve nada menos que 271 paquetes. ¿Cuántos le devuelve al lector?

Está visto que hemos ido mucho más al grano, pero como contrapartida
hemos obtenido demasiadas respuestas. Debemos buscar otro procedimiento. Pero ¿cuál?

Si aptitude search acepta un patrón de búsqueda que le hace buscar dentro de las descripciones de los paquetes, tiene que haber otros patrones de búsqueda y, quizá, también otros lugares donde buscar, aparte del nombre y la descripción del paquete, ¿Hay un lugar donde el dardo de nuestra búsqueda se oriente hacia su blanco de un modo más certero?

Lo hay, en efecto. Ese lugar son las etiquetas (tags) o marcas que algunos usuarios y los propios creadores de las paquetes les adjuntan para caracterizarlos de un modo preciso. Aunque la categorización de los paquetes, como tarea humana que es, no es una obra acabada, una buena parte de los paquetes está etiquetada y bien etiquetada, de modo que podemos confiar en que buscar dentro de las etiquetas nos va a dar resultados fiables.

Para poder realizar este tipo de búsqueda especializada es necesario tener instalado el paquete debtags. Es probable que ya esté instalado ---con lo dicho hoy, el lector debería ser capaz de saber si lo está o no. En caso contrario, bastará con decirle a HAL que llame a aptitude para que lo haga de inmediato. [Eso sí, habrá que ponerse el disfraz de superusuario para que HAL nos permita efectuar esta operación]:

aptitude install debtags

Antes de continuar vamos a aliviar la comezón del lector. Se habla de etiquetas o marcas de paquetes, pero no tenemos ni idea de qué aspecto tienen. Veámoslo con nuestros propios ojos. Escoge, lector, cualquier paquete y mira las líneas finales del informe que te da de él aptitude. Veamos, por ejemplo, las marcas del propio paquete debtags:

aptitude show debtags

Las líneas finales son las siguientes:

Marcas: devel::buildtools, implemented-in::c++, interface::commandline,
role::program, scope::application, suite::debian, use::searching,
works-with::software:package


¡Bonito! El significado es el siguiente: los nombres de las facetas, esto es, los aspectos o puntos de vista desde los que vemos el paquete, vienen antes de los :: ; detrás, aparece el valor o etiqueta para ese paquete dentro de esa faceta. Así, por ejemplo, use::searching quiere decir que el paquete que estamos categorizando, visto desde la perspectiva de su utilidad es un paquete de búsqueda, o en breve, que el paquete sirve para buscar cosas. Como se puede colegir, esta forma de categorización es muy parecida, en esencia, a la que lleva a cabo el bibliotecario cuando etiqueta un libro.

No hace falta detenerse excesivamente en las etiquetas, sus tipos y las palabras claves para describirlas. Es suficiente con saber que están ahí y que podemos buscar dentro de ellas. Quizá sí merezca la pena comentar que los futuros desarrollos de estos sistemas de etiquetas para paquetes Debian harán seguramente más sencilla su integración con gestores de paquetes como aptitude.

Volviendo al asunto que nos ocupa, lo que a nosotros nos interesa buscar son diccionarios y, particularmente, diccionarios que funcionen desde la interfaz con la que hablamos con HAL, o sea, la consola y, más exactamente, desde el lugar donde tecleamos nuestras órdenes, que se denomina también la línea de comandos (commandline).

Lo único que queda por saber es el patrón de búsqueda estipulado para que aptitude sepa que la búsqueda debe efectuarse dentro de las etiquetas de los paquetes. Este patrón tiene esta forma:

'~Gtérmino_de_búsqueda'

Compongamos, pues, la orden para HAL:

HAL, haz que aptitude busque 'diccionario' y 'línea de comandos' en las etiquetas de los paquetes.

que debería decirse [adviértase el doble patrón]:

aptitude search '~Gdictionary ~Gcommandline'

o, en versión larga:

aptitude search '?tag(dictionary) ?tag(commandline)'

No me resisto a reproducir la lista completa, que ha quedado reducida a 36 líneas. [Suprimo de la salida las descripciones de los paquetes, porque no caben aquí]:


p aiksaurus
p anthy
p anthy-el
p brazilian-conjugate
p chasen
p chasen-dictutils
p crack
p crack-md5
p cracklib-runtime
p dict
p dictem
p dictfmt
p dictzip
p duali
p eblook
p epwutil
p glosstex
p gnuvd
p gramadoir
p hspell
p i2e
i libenchant1c2a
p link-grammar
p lookup
p makedic
p mecab-utils
p rmligs-german
p sary
p sdcv
p skktools
p spell
p spellutils
p sufary
p thescoder
p translate
p xjdic


Se trata, sin duda, de un buena selección, sobre todo si consideramos que, sin contar con los paquetes virtuales, aptitude dirigió su búsqueda sobre la friolera de 23.002 paquetes. Un buen punto de partida, desde el que continuar el día que viene.


Y, por fin, tras esta largo merodeo por el fantástico mundo de los gestión de paquetes Debian, el consabido resumen:

  • La lengua de HAL es proclive a los juegos de palabras.

  • aptitude admite diversas órdenes. Alguna de las más frecuentes son search, show e install.

  • aptitude search es comparable a una consulta apropos efectuada sobre almacenes remotos de paquetes, pero mucho más versátil.

  • Si no se especifica ningún patrón de búsqueda, aptitude search buscará por defecto en los nombres de los paquetes.

  • Patrones de búsqueda interesantes para aptitude son los que empiezan con ~d, que busca en las descripciones de los paquetes y con ~G, que busca en las etiquetas de los paquetes.

  • Los paquetes de Debian están etiquetados. Este sistema de etiquetas categoriza el paquete de una forma muy precisa y es la infraestructura ideal para localizar los paquetes que nos interesan.

No hay comentarios:

Publicar un comentario