martes, 13 de enero de 2009

Cómo estás, HAL

Resueltas las urgentes preguntas existenciales ( secciones [3] y [4] de esta serie ), es momento de ser más educados y empezar por donde siempre empezamos cuando nos encontramos con alguien al que ya conocemos o acabamos de conocer, con el consabido ¿Cómo estás?

Pero como HAL no es de los que responden con la evasiva "bien, gracias" ---para HAL estas expresiones son demasiado vagas y poco comprometidas---, conviene que limitemos la extensión de nuestras preguntas, si es que no queremos vernos desbordados por una cantidad de información que todavía no estamos preparados para asimilar.

Si a pesar de esta evidencia, alguien se atreve a solicitar una respuesta vasta y dispone, además, de una distribución Debian o que, basada en Debian, contenga el paquete installation-report, se podría pedir a HAL que nos dé un informe ---a su modo de ver, conciso--- de su propia anatomía, es decir, de su hardware. La pregunta que habría que hacerle en tal caso es ---y que nadie me venga luego con que no avisé:

report-hw

Respiremos con tranquilidad y hagamos consultas mucho menos comprometedoras, las primeras que se le podrían ocurrir a cualquier usuario, una, sobre su estado digestivo y otra sobre su salud psíquica: ¿cómo vas de disco duro? y ¿qué tal estás de memoria?

Estas preguntas elementales nos permitirán, de paso, aprender nuevas estructuras sintácticas y empezar a ver la sofisticación de la lengua de HAL.

Vayamos, pues, a ello.

"¿Cómo vas de disco duro?" se puede expresar también de una forma más directa, con la frase "¿Cuánto disco libre te queda?", o, más concisamente, "disco libre" (disk free), y, en abreviatura:

df

En mi HAL particular, donde las particiones fueron configuradas manualmente, la respuesta es la siguiente:


Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 3099260 511224 2430604 18% /
tmpfs 1031820 0 1031820 0% /lib/init/rw
udev 10240 112 10128 2% /dev
tmpfs 1031820 0 1031820 0% /dev/shm
/dev/sda5 103210940 66861592 31106540 69% /home
/dev/sda8 10317828 131308 9662404 2% /tmp
/dev/sda6 10317828 5906404 3887308 61% /usr
/dev/sda7 20644348 2706108 16889664 14% /var


[ En un sistema donde se hubiese elegido el particionamiento automático más simple posible, el resultado sería más breve: normalmente, no aparecería más que una fila que empezase por /dev/sda ].

Si hacemos, por el momento caso omiso, de la segunda, tercera y cuarta filas de la tabla anterior ---que pueden ser diferentes según la configuración de nuestra distribución---, nos quedarán una o varias filas con el susodicho /dev/sda.

Esto nos suena, parece una ruta en el árbol de directorios. Pero ¿qué clase de directorio es /dev?, ¿qué ficheros contiene?

dev es una abreviatura de device (dispositivo, en inglés). Una de las peculiaridades más renombradas de HAL (de los sistemas tipo Unix) es que prácticamente todo se considera un fichero, también los dispositivos de hardware se comportan para lo que interesa como ficheros, y el directorio dev es aquel en el que residen estos curiosos ficheros (los dispositivos), de ahí su nombre.

El disco duro de mi HAL particular se llama sda, que es una abreviatura de "Disco SCSI a", el primero de una serie de discos SCSI posibles. Es decir, que si hubiera tenido un segundo disco duro del mismo tipo, se habría llamado el disco SCSI b; si un tercero, el c, etc.; y, si mi disco duro hubiese sido IDE, su nombre habría sido hda, en lugar de sda.

Está claro. Pero ¿qué hace ahí un número después de cada sda? ¿O es que, a pesar de todo, dispongo de más discos duros del que compré en la tienda? ¿Acaso HAL se ha vuelto loco?

No, no está loco. Lo que sucede es justamente que HAL pone en juego una "triquiñuela lógica" para que en lugar de un único sitio de almacenamiento, de un disco duro, dispongamos de varios, lo que, sin duda, es un magnífico truco de benéfica magia.

Cada uno de estos "distintos" discos duros se denomina técnicamente una partición. Y el sistema de ficheros que contenga esa partición se puede, por así decir, adjuntar a una rama diferente del árbol de directorios, algo ciertamente interesante, porque con ello logramos una independencia entre distintos conjuntos de ficheros.

Cualquier persona medianamente inteligente habrá deducido ya que a cada una de estas particiones se le asigna un número y que el número de la partición se añade al nombre genérico del tipo de dispositivo físico de la que procede. O sea, que una partición de mi disco SCSI se llamará sda1; otra, sda2, etc.

Tampoco hay que ser un Einstein para deducir que la última columna de cada fila de la tabla anterior alude a la sección de mis ficheros accesible en la partición que consta en la correspondiente primera columna. Así, por ejemplo, el contenido del directorio /home está a mi disposición en la partición sda5. ( Con mayor precisión técnica se dice que el sistema de ficheros que hay en la partición sda5 está montado en /home, en esa rama del árbol de directorios ).

¿Por qué no aparecen en la tabla nombres tales como sda2, sda3, etc.? Bien, esta es una cuestión interesante, pero que nos llevaría a un nuevo excursus, dentro de éste ya demasiado largo.

Volvamos a la tabla. Comprendido en lo fundamental el significado de sus columnas primera y última, lo único que queda son los números.

Esos números nos dicen qué cantidad de espacio hay disponible en las particiones del disco donde residen las correspondientes secciones de nuestros ficheros. Se trata de cuatro cantidades que miden el espacio existente, el espacio ya ocupado, el espacio aún libre y el porcentaje actual de espacio usado.

Pero a ningún humano le gustan números tan grandes e ininteligibles como, por ejemplo, 103210940 bloques de 1K, que es lo que significa concretamente la segunda columna de la quinta fila.

Necesitamos pedir a HAL que nos dé una respuesta a nuestra pregunta "¿cómo vas de disco duro?", pero una respuesta hecha a la medida del hombre.

Es decir, queremos que HAL nos responda a nuestro inicial "disco libre" (disk free = df), pero añadiendo ahora un matiz, una opción, la opción: "que sea fácil de leer para un humano" (human readable).

Nótese que la pregunta básica es la misma. Lo que queremos es matizar esa pregunta de la forma indicada. Y bien es posible que hubiese otras formas de matizarla. No tiene sentido, pues, crear una nueva orden para lo que es una matización, una opción entre otras posibles, de una orden ya existente.

Cuando se quiere añadir un matiz, una opción a nuestras órdenes, se utiliza un constructo sintáctico especial, el guión, después de un espacio. Nótese que el espacio sirve precisamente para indicar a HAL el final de la orden en cuanto tal y el comienzo de otra cosa (especificaciones o matices que se le van a añadir) y que la opción se destaca justo por el guión que la precede.

Este guión, que señala el inicio de la opción, puede ser simple o doble. Es simple cuando la opción se presenta en forma totalmente abreviada, como una sola letra; es doble en caso contrario, cuando en lugar de una letra el matiz se representa con una palabra o una expresión completa. En este último caso, el de una expresión completa, hay que tener cuidado de no introducir espacios entre sus palabras (convencionalmente se suelen usar guiones internos para facilitar la lectura). Veamos el caso concreto y todo resultará meridianamente claro.

Con la opción larga, human readable, nuestra orden debería ser la siguiente ( con guión doble inicial y sin espacio entre las dos palabras que la componen ):

df --human-readable

Con la opción corta, de una letra, la letra h de human, la orden sería ( con guión simple inicial ):

df -h

En ambos casos, la respuesta de HAL es la misma. O sea, que de haber ambas posibilidades de expresión ---con opción corta o larga---, la elección de una u otra queda al gusto del usuario.

Tras introducir la pregunta matizada, tenemos finalmente una respuesta numéricamente inteligible [ la K esta por kilobyte (= 1024 bytes), la M por megabyte y la G por gigabyte ]:


Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3,0G 500M 2,4G 18% /
tmpfs 1008M 0 1008M 0% /lib/init/rw
udev 10M 112K 9,9M 2% /dev
tmpfs 1008M 0 1008M 0% /dev/shm
/dev/sda5 99G 64G 30G 69% /home
/dev/sda8 9,9G 129M 9,3G 2% /tmp
/dev/sda6 9,9G 5,7G 3,8G 61% /usr
/dev/sda7 20G 2,6G 17G 14% /var


Podría ser, no obstante, que nuestro interés se dirigiera exclusivamente al espacio libre que hay para /home y que no nos apetezca saber ninguna otra cosa. En ese caso, nos molestaría tener que buscar la fila relativa a /home en la tabla anterior. ¿Podemos hacer que HAL nos presente la parte de la tabla que nos interesa?

¿Cómo no? HAL siempre hará lo que nosotros le digamos, por enrevesado que nos parezca. En este caso concreto es muy fácil conseguirlo.

Acabamos de ver que una orden se puede matizar con opciones. Igualmente podemos con frecuencia, dependiendo del tipo de orden, especificar su ámbito de aplicación. Incluso, en ocasiones ---como quizá veamos otro día--- será necesario especificarlo para que HAL entienda la orden.

df permite especificar el ámbito de su aplicación. Algo totalmente lógico, pues es perfectamente concebible que la consulta sobre el espacio libre en disco se refiera a la totalidad de los discos o a uno o ciertos discos en particular. Como las particiones, a todos los efectos que interesan, son "discos" independientes, podemos referir nuestra consulta general a una o alguna de ellas. ( Si no lo hacemos, HAL entenderá que nos interesa saber de todas ellas, de ahí los resultados anteriores ).

Para ello necesitamos aprender un nuevo recurso sintáctico de la lengua de HAL, pero éste es incluso más simple que el relativo a las opciones.

Las expresiones que especifican el ámbito de aplicación de una orden se denominan argumentos y se colocan después de las opciones y separados por un espacio de tales opciones. En caso de haber varios argumentos, cada uno va separado por un espacio de su antecesor.

Por tanto, la estructura sintáctica general sería ésta:

ORDEN OPCIONES ARGUMENTO1 ARGUMENTO2 ...

Ahora podemos realizar nuestra pregunta sin problemas. Conviene formularla tal como alguien la pensaría sin recurrir a ninguno de los conceptos introducidos en estos artículos:

¿Cómo vas de espacio en el disco que hay dedicado para guardar la información privada de todos los usuarios ---y, por favor, respóndeme para que yo, un humano, lo entienda?

Primero, separamos los ingredientes para recordar mejor lo visto hoy y los días pasados:

La orden

"¿Cómo vas de espacio en disco?" = df

El argumento

"la información privada de todos los usuarios" = /home

La opción

"respóndeme para que yo, un humano, lo entienda" = -h


Finalmente, el enunciado completo, de acuerdo con el orden de cada parte de la frase que prescribe la lengua de HAL:

df -h /home

Y la respuesta es todo lo concisa y clara que deseábamos:


Filesystem Size Used Avail Use% Mounted on
/dev/sda5 99G 64G 30G 69% /home


Nada impide que nuestra consulta se refiera a varios casos, pero no a todos. Por ejemplo, a dos de los más importantes, /home y /.

Entonces la pregunta sería:

df -h /home /

y la respuesta:


Filesystem Size Used Avail Use% Mounted on
/dev/sda5 99G 64G 30G 69% /home
/dev/sda1 3,0G 500M 2,4G 18% /


Como todos los días y para finalizar he aquí un resumen de lo tratado.

  • HAL puede dividir lógicamente un único dispositivo de almacenamiento en varios. Cada división o partición funciona como un dispositivo de almacenamiento independiente.

  • Los sistemas de ficheros de las distintas particiones se pueden montar sobre ramas particulares del árbol de directorios, de forma que el contenido de cada rama sea independiente de las restantes.

  • Se pueden matizar las órdenes que damos a HAL mediante opciones.

  • Se puede especificar el ámbito de aplicación de una orden mediante argumentos.

  • La órden df nos permite conocer el espacio libre e índice de ocupación de las particiones asociadas a tales o cuales ramas del árbol de directorios.

sábado, 10 de enero de 2009

Quién eres y mi lugar de trabajo

En la última entrega de esta serie logramos que HAL nos resolviera nuestra primera duda cartesiana.

Quedan por resolver las otras dos cuestiones existenciales que nos planteamos: "¿Quién eres tú?" y "¿Dónde estoy?"

Aunque sabemos que el nombre de HAL es el que es, vamos, por si acaso, a preguntárselo. No vaya a ser que su conciencia esté tan perturbada que ni siquiera se reconozca a sí mismo. No sería divertido dialogar con una máquina que no sabe cómo se llama. Además, interesa que podamos hacer la misma pregunta a otras máquinas cuyo nombre desconozcamos de entrada.

A las computadoras conectadas a una red se las suele llamar también huéspedes (host, en inglés). Como prácticamente toda computadora es potencialmente miembro de una red, se suele aplicar el término host a todas ellas. Dicho término procede de los inicios de Internet y lo hemos heredado, como otros muchos, de aquella época gloriosa.

O sea, que preguntar a HAL, o a cualquier otra máquina, cómo se llama, es preguntarle por su nombre de huésped, su hostname.

Es improbable que una frase tan larga como "¿cuál es tu nombre de huésped?" sea aceptable para HAL. HAL odia, al contrario que nosotros ;-), perder el tiempo en chácharas innecesarias. Irá mucho mejor algo como "tu nombre de huésped" o, directamente, "nombre de huésped" ---el "tu" es innecesario, dado que sólo tenemos un "tú" delante, nuestra máquina.

Probemos, pues:

hostname

Y HAL confirma nuestra lógica y demuestra, de paso, su buen estado de salud mental:

hal

Un lector puntilloso estará presto a soltar: "¡Eh!, y ¿por qué no haber escrito un simple "Quién", en lugar del "Quién soy yo" (whoami) que tecleamos en el artículo anterior de la serie? ¿Acaso no somos cada uno de nosotros el único "yo" al habla con su máquina? ¿No bastaría, pues, en aquel caso, con un simple who?

El reparo no es baladí, pero la deducción es equivocada. Yerra porque, aunque no lo sepamos, HAL puede estar dialogando simultáneamente con varias personas conectadas desde distintos terminales. Lo que técnicamente se expresa diciendo que HAL es un sistema multiusuario. Podemos hacer una verificación de este hecho sin necesidad de que nuestros amigos o familiares se conecten desde otro terminal a nuestra máquina. Basta con que nosotros mismos volvamos a entrar en el sistema desde distintas consolas virtuales. ( Normalmente, valdría también abrir varias ventanas o pestañas de emulador de terminal ).

Aunque esta operación es algo más compleja de lo que hemos visto hasta ahora, merece la pena comprobarlo:

  1. Tecleamos Ctrl+Alt+F2 (todas las teclas a la vez). Nos saldrá entonces, normalmente, un mensaje con la palabra [nombre_de_mi_maquina] login:.

  2. Nos identificamos en el sistema con nuestro nombre de usuario y nuestra contraseña (la que se elegió al instalar el sistema o la que venga documentada en el sitio web desde el que se descargó el LiveCD, en caso de haber seguido esta opción).

  3. Realizamos la misma operación con Ctrl+Alt+F3.

  4. Volvemos al escritorio con Ctrl+Alt+F7 (o con Alt+[flecha derecha], después de pulsar varias veces dicha flecha con el Alt pulsado).



Y, ahora, le volvemos a plantear a HAL la pregunta sobre nuestra identidad, pero en la forma simplificada, es decir: "¿Quién?", en lugar del "¿Quién soy yo?" de antes. O, expresado en su idioma:

who

HAL nos mostrará algo parecido a esto:

luis tty2 2009-01-10 15:32
luis tty3 2009-01-10 15:33
luis :0 2009-01-10 11:25


Cada columna de esta tabla tiene un significado: la primera indica el nombre del usuario que está conectado ---en este caso yo mismo por triplicado :-)---; la segunda es la forma que tiene HAL de designar el terminal desde el que el usuario se conecta; la tercera presenta la fecha ---el formato de fecha puede variar según la configuración de nuestra distribución--- y la hora en la que se inició la conexión.

Luego, para HAL, soy como el agente Smith de Matrix Reloaded: me puedo multiplicar virtualmente para charlar con él. ¡Estupendo! Lo importante, sin embargo, es darse cuenta de que lo mismo da que sea un yo multiplicado o varios sujetos, en cualquiera de los casos HAL puede hablar con todos nosotros a la vez.

Con esta aclaración es posible comprender por qué en la traducción del mensaje de bienvenida de HAL que propuse en la entrada pasada, constase aquello de:

... Aquí, en el lugar de trabajo que te tengo reservado ...

Claro, del mismo modo que HAL puede hablar con varios usuarios, es lógico pensar que tenga reservado para cada uno de ellos un lugar propio, independiente del de los demás.

¿Estamos ahora en ese lugar privado o nos encontramos en otra parte?

Vamos a preguntárselo a HAL, que para eso está, para resolver nuestras dudas y cumplir nuestras órdenes.

Ahora bien, para poder formular la pregunta adecuadamente, necesitamos dar un pequeño rodeo. Es necesario comprender qué significa exactamente para HAL eso de "un lugar".

Para empezar, es relativamente fácil de adivinar que nuestro lugar privado debe formar parte, en cierto modo, del propio HAL o, como mínimo, debe pertenecerle en alguna medida. Difícilmente podrá reservarnos tal lugar si no tiene control completo sobre el "sitio" que contiene todos los lugares, el nuestro y el del resto de los usuarios.

Todo el mundo sabe que ese sitio que contiene todos los lugares privados de los usuarios no puede ser sino una zona de almacenamiento controlada por HAL: el disco duro o un dispositivo semejante.

Si HAL es capaz de identificar zonas diferentes dentro de ese sitio común de almacenamiento ---lo cual es necesario para poder reservar a cada usuario una distinta---, es que dispone de alguna manera de organizar las cosas dentro de él.

Sin entrar en detalles técnicos, basta saber que dicha forma de organización consiste en una jerarquía, que metafóricamente podría describirse con la imagen de un árbol. De una raíz común, denominado directorio raíz, partirían distintas ramas, denominadas también directorios, que pueden o bien contener a su vez otras ramas (esto es, otros directorios), o bien simples hojas, denominadas ficheros, que serían los objetos últimos de la jerarquía. Se trata de una estructura lógicamente muy simple. Sólo hay dos tipos de entidades: directorios y ficheros. Y el directorio base, a pesar de recibir un nombre especial ---por eso de ser el primero--- no se diferencia en nada ---por lo que ahora respecta---
del resto de directorios.

Pues bien, "un lugar" para HAL no es otra cosa que un directorio.

Con estos conocimientos recién adquiridos podemos retornar sin miedo a nuestro propósito principal.

Íbamos a preguntarle a HAL por el lugar donde nos encontramos. Ahora sabemos que esto es lo mismo que preguntarle por el directorio en el que nos hallamos ahora. Lo que significa, entre otras cosas, que todo usuario, está, por el hecho de iniciar un diálogo con HAL, en un lugar, en un directorio.

Por otro lado, intuimos que para HAL ese lugar o directorio no es un lugar cualquiera, tiene que ser, a la fuerza, un lugar o directorio de trabajo. Es fácil llegar a esta conclusión. Se trata del clásico fenómeno psicológico de proyección. Si el servicial de HAL interpreta nuestras tímidas preguntas como auténticas órdenes, no es raro que nos tome por gente tan seria o más que él y que una cordial y afable charla tenga, desde su punto de vista, el carácter de un arduo trabajo.

Dicho lo cual, la pregunta que queremos hacerle debería sonar de un modo semejante a esto: "¿Cuál es nuestro directorio de trabajo actual?". O en versión más breve y vertida al inglés: present working directory. Hagamos la consulta:

presentworkingdirectory

No hace falta regodearse escribiendo la terrible respuesta. ¡Vaya calamidad, otra vez, el apestoso command not found!

Conviene mantener la calma ante la adversidad y pararse a pensar un poquito más. Una cosa que salta a primera vista en la frase fallida es su desmesurada longitud. Resulta difícil leerla hasta para un humano y la posibilidad de meter un gazapo tipográfico al escribirla es bastante alta. En este tipo de situaciones, HAL hace uso de un recurso que también nosotros empleamos, la abreviatura.

Una forma de abreviar el "present working directory" es construir una palabra de tres letras con la inicial de cada palabra. O sea:

pwd

Y, ¡sí!, HAL lo entiende perfectamente:

/home/luis

¿Cómo interpretar esta respuesta? Podemos inferirlo a partir de la noción del árbol de directorios.

El signo / indica una bifurcación en el árbol, salvo que se trate del primero de ellos, que simplemente está por el directorio raíz, pues es desde él desde donde comienzan las demás bifurcaciones. O sea, que podríamos dibujar el siguiente corte de árbol invertido (con la raíz en la parte superior) como otra forma de presentar la respuesta de HAL:

/ [=directorio raíz]
___|
|
home
___|
|
luis


Es incluso más intuitivo pensar la respuesta como la indicación de una "ruta" (path, en inglés) dentro del árbol de directorios. O sea, que la respuesta de HAL es algo similar a decir, en forma sucinta, lo siguiente:


Si se empieza por el directorio raíz, se toma la bifurcación 'home' y de ahí se coge la bifurcación 'luis', se encuentra uno en el directorio de trabajo en el que ahora tú estás.


¡Vaya!, y resulta que este directorio va a tener que ser mi directorio privado: dentro del "hogar", un espacio para mí solo. Mejor no se puede estar.

Por cierto, conviene saber que hay una forma abreviada de llamar al directorio privado del usuario: el carácter de la tilde (~).

¿No nos suena haberlo visto antes? Claro, era ese signo incomprensible en el mensaje de invitación al diálogo, después de los dos puntos:

luis@hal:~$

Un mensaje que cada vez nos resulta más expresivo. Todo es ponerse.

Repasemos, para terminar, lo aprendido en esta entrada:

  • HAL es un sistema multiusuario: puede entablar diálogos con varios usuarios simultáneamente.

  • HAL organiza el espacio de almacenamiento mediante una estructura recursiva de directorios, el árbol de directorios.

  • Un lugar en el árbol de directorios se determina mediante su ruta, teniendo en cuenta, de momento, que el comienzo de la ruta es el directorio raíz.

  • El directorio privado de cada usuario tiene la ruta /home/[nombre_usuario], que también se indica mediante el signo ~.

  • HAL gusta de órdenes no sólo breves, sino también de puras abreviaturas.

  • Entre las órdenes que pertenecen al vocabulario de HAL, se encuentran las tres siguientes:

    • hostname, que permite conocer el nombre de la máquina con la que estamos dialogando.

    • who, que permite saber la identidad de los usuarios conectados a todos los terminales.

    • pwd, (= present working directory), que nos dice en qué lugar dentro del árbol de directorios nos encontramos actualmente.

jueves, 8 de enero de 2009

Quién soy, HAL

Digerido ya el inevitable aperitivo ([1], [2]), y con el emulador de terminal abierto en nuestro escritorio, es hora de echar el diente al meollo del asunto.

Pero, ¿podemos realmente hacerlo ya? Sin duda. Una vez que entendamos lo que en primer lugar está presente en la consola. Por cierto, recomiendo maximizar la ventana del emulador del terminal y olvidarse por completo de sus, todavía presentes, objetos gráficos (barra de menús, iconos, pestañas, etc.). Nuestra atención se va a concentrar exclusivamente en el espacio de trabajo. Incluso este concepto, espacio de trabajo, debería ser suprimido de nuestra interpretación de lo que tenemos ante nosotros, por tratarse tan sólo de un último residuo de la metáfora visual. Al fin y al cabo, el emulador de terminal es tan sólo el dispositivo habitual para introducir preguntas u órdenes a través del teclado y para que la máquina nos devuelva sus respuestas sobre la pantalla, pero podría sustituirse perfectamente por un puro sistema de comunicación por voz, donde la idea de espacio no tiene sentido. Por tanto, sólo debemos fijarnos en la secuencia lingüística que iremos introduciendo y en la que produzca nuestra computadora como consecuencia de nuestras intervenciones.

La primera secuencia de texto que encontramos es algo parecido a esto:

luis@hal:~$

( donde la palabra que precede a @ será nuestro nombre de usuario y la palabra que le sigue el nombre de nuestro ordenador. )

Se trata de una invitación de la máquina a iniciar el diálogo. Una invitación que incluye cierta información que nuestra máquina desea proporcionarnos incluso antes de que empecemos a hablar.

La máquina viene a decirnos algo así:

Hola, Luis. Soy HAL y estoy a tu disposición. Aquí, en el lugar de trabajo que te tengo reservado. ¿Quieres que haga algo por ti?

Entre el mensaje sucinto de HAL ---a partir de ahora, llamaré HAL a mi máquina--- y la "traducción" que he dado de él parece haber una gran diferencia. En realidad, no la hay. Como ya dije antes, HAL habla en una lengua especial, que se caracteriza, entre otras cosas, por ser extremadamente económica. El usuario debe acostumbrarse a esta forma de hablar, a esta lengua. No es muy distinto de aprender un idioma nuevo, aunque ciertamente es bastante más fácil, puesto que cualquier lenguaje artificial, como el que habla HAL, carece de ambigüedades, de significados múltiples o dobles sentidos, y consta de un léxico reducido y de un conjunto bastante simple de construcciones sintácticas. El usuario paciente será capaz, sin demasiado esfuerzo, de aprender lo bastante de esa lengua como para que su HAL particular le ayude a realizar sus tareas cotidianas.

Conviene advertir que, en teoría, podríamos configurar buena parte de la lengua de HAL a nuestra medida. Podríamos, en concreto, modificar todo su léxico para que se asemejase al que habitualmente empleamos. Esto, de hecho, suele hacerse en algunos pocos casos, aunque no tengo noticia de que nadie lo haya intentado para todos o casi todos los elementos de ese léxico.

Un ejemplo de mensaje hecho a medida es, justamente, este primero que estamos comentando. En realidad, los creadores de nuestra distribución GNU/Linux son los que han decidido que la bienvenida de HAL tenga esa forma, y puede ser diferente según la distribución con la que operemos.

Nosotros mismos podemos modificar ese mensaje con relativa facilidad y poner en su lugar nuestra "traducción". Sin embargo, no lo recomiendo. No sólo porque lo bueno, si breve, dos veces bueno, sino porque cada vez que HAL responda a nuestras intervenciones, volverá a presentarnos la larga retahíla ---HAL en esto es muy educado---, algo que hace gracia al principio, pero que harta a los pocos minutos.


N.B. Pero para que nadie se quede con las ganas, he aquí cómo se hace. [ Salte este párrafo cualquier usuario que no quiera complicarse innecesariamente la vida ;-) ]:

  1. Editar el fichero .bashrc o crearlo, si no existe (con el punto, como primera letra del nombre). De momento, como no sabemos hacerlo desde la consola, hagámoslo con un editor del sistema gráfico.

  2. Añadir el texto siguiente (en una única línea):

    export PS1="Hola, \u. Soy \H y estoy a tu disposición. Aquí, en el lugar de trabajo que te tengo reservado. ¿Quieres que haga algo por ti?\n"

  3. Guardar el fichero dentro de nuestra carpeta (directorio) personal (/home/[nombre_usuario]).

  4. Cerrar la ventana del emulador de terminal y volver a abrirla. [ Si el cambio realizado se mantiene, este paso no será necesario la siguiente vez que entremos en la máquina ].

  5. Para deshacer esta configuración, habrá que eliminar el fichero recién .bashrc, o quitar de él la línea introducida, y repetir el paso inmediatamente anterior.




Como decía, los creadores de nuestra distribución, siguiendo la forma típica de hablar de HAL, nos han configurado un mensaje de bienvenida relativamente amigable. De no haber sido por ellos no hubiésemos encontrado nada ahí, salvo el silencio de la pantalla vacía. Tendríamos que ser nosotros los que tomásemos la iniciativa ante este aparente silencio. HAL estaría escuchando, pero sin menor advertencia por su parte de que lo está haciendo.

En ese silencioso caso, en el que podemos encontrarnos en alguna ocasión ---por ejemplo, si accedemos a la consola de una máquina remota más reservada en su trato---, lo normal es que nos preguntásemos cosas como ¿quién soy yo?, ¿quién eres tú?, ¿dónde estoy?, o sea, ese tipo de cuestiones que uno se plantea cuando está totalmente desorientado.

Probemos a plantear a HAL estas clásicas preguntas existenciales. Empecemos por la primera de ellas: "¿Quién soy yo?".

Por lo pronto, y ya prevenidos sobre el desinterés de HAL hacia toda ocurrencia lingüística que no sea absolutamente necesaria, prescindiremos de los signos de interrogación, de las mayúsculas y de los acentos. Tecleamos, pues, lo siguiente:

quien soy yo

HAL no responde. "!Qué es esto!", se preguntará el lector. Resulta que, ahora, la máquina supuestamente parlanchina y servicial, es más muda que mi tostadora".

No cunda el pánico. HAL no ha respondido, porque tenemos que buscar algún medio de transmitirle que ya hemos terminado de hacer nuestra pregunta. Si no, ¿cómo se las va a apañar el pobre para saber si vamos a seguir escribiendo más cosas, si vamos a añadir más palabras a la pregunta? HAL es bastante listo, pero todavía no llega a poseer el don de la adivinación y, en consecuencia, no puede inferir de nuestra expresión facial ---puesto que no la ve--- nuestra impaciente espera; ni nuestro texto contiene una entonación de la que él pueda deducir que hemos finalizado la frase. ¿No valdría el signo de interrogación para marcar ese final? Podría haber sido así, si lo único que le planteásemos a HAL fuesen preguntas. Como también construiremos enunciados de otras clases, es necesario hacer que él sepa, en todas las situaciones posibles, que le toca responder. Es decir, debemos elegir un signo más genérico que el de interrogación. Algo parecido a lo que hacíamos cuando jugábamos de niños con los walkie-talkies y articulábamos el diálogo con el famoso "cambio", fuese lo que fuese lo que dijésemos.

Ese "Cambio. Te toca hablar a ti" que le enviamos a HAL, se genera de manera simple y universal pulsando la tecla Enter.
O sea, que la tecla Enter significa exactamente para HAL que responda o ejecute lo que le acabamos de decir.

Probemos de nuevo ---y doy por hecho que a partir de este momento terminaremos nuestras intervenciones siempre con esa tecla---.

quien soy yo [Enter]

HAL ahora sí que responde, pero lo hace con esta críptica sentencia:

bash: quien: orden no encontrada

O, también, según la configuración por defecto de nuestra distribución, la última parte podrá estar en inglés:

bash: quien: command not found

Tranquilidad. Los primeros pasos en una lengua extraña, son siempre los más costosos. Veamos con calma la respuesta de HAL.

Por el momento, vamos a prescindir de tratar de comprender la enigmática primera palabra de su frase:

bash:

Lo que queda es esto [ en versión inglesa ]:

quien: command not found

Si nos fijamos con detenimiento podemos deducir unas cuantas cosas interesantes y nuevas sobre la lengua de HAL y su manera de expresarse.

La primera de todas es que HAL habla básicamente en inglés, una variante artificial del inglés, como veremos en detalle. El inglés es la lengua científica universal y, en general, la lengua que todos conocemos en alguna medida. A la larga, para hablar con HAL, hay que pensar principalmente en inglés, aunque la mayoría de las distribuciones GNU/Linux hacen un esfuerzo por aliviar en lo posible la carga añadida para los usuarios no anglo-parlantes y suelen traducir a otras lenguas muchas de las respuestas típicas de HAL. De ahí que la contestación de HAL pueda aparecer también en castellano. Mi recomendación, no obstante, es la de que nos habituemos al inglés, en la medida de lo posible. No sólo será más natural nuestra charla con HAL, sino que, de paso, aumentaremos nuestro conocimiento de la lengua de Shakespeare.

Por otra parte, observamos que HAL nos devuelve la primera palabra de nuestra pregunta, "quien", y viene a decir de ella algo así como que es una orden que no ha encontrado.

O sea, que, en primer lugar, nuestra pregunta la entendió como una orden; lo que no deja de chocar, siendo como era sólo una pregunta. Pero es que para el servicial de HAL todo lo que sale por nuestra boca son órdenes, órdenes que trata de cumplir rápida y escrupulosamente.

En segundo lugar, parece que no entendió la orden que le dimos, quizá porque se quedo sólo con la primera parte de ella: el "quien" del "quien soy yo", que es la única palabra que nos ha devuelto de nuestra frase original. ¿No será porque el espacio entre las palabras le ha confundido? Veremos más tarde cómo efectivamente el espacio tiene un significado especial para HAL. De momento, volvemos a probar sin espacio, a ver qué pasa:

quiensoyyo

¡Menudo fiasco. La respuesta es casi la misma!:

bash: quiensoyyo: command not found

¡Hombre! tampoco hay que ponerse así, impaciente usuario. Un pequeño avance sí hemos logrado. Al menos, HAL ahora sí ha captado la totalidad de la pregunta. No íbamos, pues, descaminados en nuestra deducción sobre el significado especial del espacio. En todo caso sigue sin entender la pregunta.

¿Qué hacemos? ¿Desistir y mandar todo este galimatías al cuerno? ¡Un momento, aún queda por probar una cosa!: decírselo en inglés, en lugar de en castellano. O sea, "Who am I?", probemos ---de nuevo sin espacios, ni mayúsculas, de una tirada:

whoami

Y la respuesta es ...

luis

¡Acertamos! Ya se ve que, aunque los mensajes de respuesta de HAL pueden estar traducidos, las preguntas que nosotros le hagamos deben realizarse en inglés.

Más de un lector se preguntará si no es posible configurar también a medida estas preguntas u ordenes que se le pueden transmitir a HAL. Por ejemplo, para verterlas al castellano. Efectivamente es posible, aunque poco aconsejable. Esta vez por la razón de que nos llevaría probablemente más trabajo que aprender las versiones ingleses y las expresiones típicas de HAL. Si, a pesar del consejo, se quiere saber cómo hacerlo, léase la siguiente receta:


N.B. Es posible crear sinónimos para las ordenes nativas que entiende HAL, estos sinónimos se llaman, técnicamente, alias. Por ejemplo, si queremos hacer que la orden quiensoy sea un alias de whoami, habría que proceder de un modo parecido al que seguimos cuando personalizamos el mensaje de bienvenida:

  1. Editar el fichero .bashrc o crearlo, si no existe o lo eliminamos antes.

  2. Añadir la siguiente línea:

    alias quiensoy="whoami"

  3. Guardar el fichero dentro de nuestro directorio personal (/home/[nombre_usuario]).

  4. Cerrar la ventana del emulador de terminal y volver a abrirla.




Seguro que alguien se pregunta qué hubiese pasado si, en lugar de minúsculas, hubiésemos usado mayúsculas.

Nada, nada, a probarlo:

WHOAMI

Y la respuesta:

bash: WHOAMI: command not found

Interesante. Para HAL no es lo mismo mayúscula que minúscula. Conviene recordarlo para la próxima.

Vaya, no está mal para un primer mordisco. Hemos aprendido a interpretar la invitación de HAL al diálogo, su mensaje de bienvenida, y hemos logrado plantearle una pregunta que entendió y que nos respondió adecuadamente. Por el camino ---y esto nos servirá para nuestras futuras conversaciones--- hemos deducido unas cuantas cosas fundamentales sobre su lengua, que bien conviene repasar como colofón de esta sesión:

  • HAL habla en una variante artificial y lacónica del inglés.

  • Todas nuestras intervenciones son para él ordenes.

  • Para determinar el fin de nuestras órdenes y para invitarle a que las ejecute terminamos nuestras órdenes con la tecla Enter.

  • El espacio tiene un significado especial para HAL.

  • A HAL no le da igual si una letra es mayúscula o minúscula. Y, de momento, parece que sólo entiende las minúsculas.

  • La orden whoami nos dice nuestro nombre de usuario.

Acceso a la consola

Para poder mantener una conversación con nuestra computadora, necesitamos un medio de comunicación. Este medio es normalmente la consola o el terminal. Asumo además a partir de ahora que nuestra consola no será una cualquiera, sino, en concreto, una consola Unix ---la que proporcionan los sistemas basados en Unix o afines a él--- y preferentemente una consola GNU/Linux.

¿Por qué una consola Unix? Por la sencilla razón de que el diálogo será mucho más versátil y eficaz si hacemos caso omiso de variantes simplonas. Queremos hablar con un ente capaz de entender un número suficientemente amplio de construcciones lingüísticas. Los sistemas Unix nos proporcionan este medio.

¿Por qué una consola GNU/Linux? Sencillamente para partir de una base común. Aunque la mayor parte de las conversaciones que puedan mantenerse desde otros terminales Unix funcionarán de la misma manera que en terminales GNU/Linux, puede haber, en algún caso concreto, diferencias sintácticas o semánticas que me obliguen a entrar en matizaciones técnicas y me desvíen del propósito principal de estos artículos. Por otro lado, es realmente fácil para cualquier usuario inexperto de cualquier sistema operativo probar o instalar una distribución de GNU/Linux en su máquina, cosa que no resulta tan clara en el caso de otros sistemas Unix.

La cuestión es ahora la siguiente: ¿cómo accedo a esa dichosa consola?

Lo primero de todo es disponer de una distribución GNU/Linux. Si todavía no se tiene ninguna, existen diferentes opciones. Cada uno debe elegir la que más le convenga según sus conocimientos e intereses. Hay tanta documentación como se quiera en la Web sobre el tema. Hoy por hoy, cualquier usuario, incluso el inexperto, debería ser capaz de acceder a una distribución de Linux sin demasiados problemas, salvo que su máquina sea poco corriente. Hace diez años, por ejemplo, esto estaba al alcance únicamente de usuarios con un alto nivel de cualificación técnica. Las cosas, afortunadamente, han cambiado. Hoy por hoy, no probar un sistema GNU/Linux, es o fruto del desconocimiento o del desinterés, pero ya no de la falta de aptitud.

No quiero extenderme en cómo obtener una distribución GNU/Linux, no es el objeto de estas entradas. Algo diré, sin embargo, para que no se me pueda tachar de perezoso ;-) y para que el usuario de Windows o Mac tenga, al menos, un punto de partida aquí mismo.

Por orden de mayor a menor dificultad, se me ocurren las siguientes posibilidades:


  1. Utilizar una máquina virtual para un cliente GNU/Linux. Para ello hay que instalar un sistema de virtualización, como VirtualBox (gratuito y GPL), Parallels o VMWare, entre otros, y aprender a utilizarlos correctamente.

  2. Utilizar un Live-CD. Basta con descargar el que corresponda a la arquitectura de nuestra máquina (normalmente, i386 o amd64), grabar el fichero descargado en un CD, configurar la BIOS para que arranque en primer lugar desde el CD (por lo general, no es necesario) y reiniciar el ordenador con el CD grabado inserto. Hay muchas distribuciones excelentes, cito sólo tres, que comparten la misma forma de empaquetamiento del software, lo cual puede ser útil en futuros artículos de esta serie:

    • la más popular, según DistroWatch: Ubuntu

    • una de las más conocidas entre las absolutamente libres según la FSF (aunque sólo para i386): gNewSense

    • la que yo uso, y en la que se basan las dos anteriores: debian


  3. Instalar directamente desde el navegador. Esta es la opción más sencilla para usuarios de Windows. No hace falta más que seguir alguno de estos enlaces que propongo entre otros posibles y pinchar en instalar o descargar:



Por fin, Linux corre en nuestra máquina, ya sea en una ventana como una máquina dentro de nuestro escritorio (opción 1 de la lista anterior) o tras reiniciar el ordenador desde el Live-CD (opción 2 de la lista anterior) o habiendo seleccionado arrancar Linux en el menú del cargador de arranque que aparecerá en primer lugar (opción 3 de la lista anterior).

Nos encontramos seguramente con un bonito escritorio ---salvo que la versión de Linux usada no contenga sistema alguno de escritorio ni servidor gráfico, algo improbable hoy en día--- pero ¿dónde está la querida consola? Normalmente, tenemos dos caminos para acceder a ella:


  • Usar lo que se llama un emulador de terminal, al que se accede siguiendo el menú de aplicaciones. El sitio concreto donde esté situada la línea o icono de acceso dentro de ese menú puede ser diferente según el entorno de escritorio instalado. No obstante, ningún usuario debería tener problemas en encontrarlo fácilmente. Si seguimos este camino nos aparece la consola como una ventana más dentro del escritorio. Es la solución que elijo como punto de partida para los próximos artículos de la serie, por tratarse de la opción menos extraña para el usuario inexperto:



  • Entrar directamente en un terminal virtual o consola virtual, a través de la combinación de teclas Ctrl+Alt+Fn (se pulsan todas a la vez), donde Fn es una de las teclas de función en la parte superior del teclado ---habitualmente cualquiera desde la F1 a la F6---. Si hacemos esto (¡no lo hagas hasta terminar de leer el párrafo!), salimos del entorno de escritorio y nos hallamos en una interfaz textual pura. Para retornar de nuevo al escritorio gráfico, habrá que pulsar normalmente Ctrl+Alt+F7, o Alt+[flecha-derecha] sucesivas veces hasta topar de nuevo con la interfaz gráfica.



Hemos dado nuestro primer paso. Los usuarios de Linux conocen ya de sobra todo lo dicho hasta ahora; los usuarios de Windows o Mac dispondrán desde este momento de un sistema GNU/Linux completo con el que experimentar y habrán sido capaces de ver por primera vez el dispositivo de comunicación con la máquina que emplearemos a partir de ahora, el emulador de terminal o el terminal virtual, la consola, para abreviar.

miércoles, 7 de enero de 2009

Conversaciones con HAL

En la actualidad, la gran mayoría de los usuarios de ordenadores no concibe otro medio de interacción con el computador que no sea la interfaz gráfica visual. Encendemos la máquina y nos encontramos, a los pocos segundos, con un bonito "escritorio" poblado de "iconos". Si "pinchamos" sobre ellos, accedemos a diversas aplicaciones, las cuales se nos muestran como "ventanas", que a su vez, contienen más iconos agrupados en "barras de herramientas". Y, aunque sigue habiendo fragmentos de texto ---incorporados en "menús", "pestañas", "cuadros de diálogo", etc.--- a los que debemos recurrir cuando los objetos puramente figurativos y visuales no son suficientes, se procura, cada vez con mayor conciencia, diseñar interfaces de aplicación limpias y sencillas donde el recurso a lo textual se limite lo más posible. Idealmente, la presencia de texto en los objetos de la interfaz gráfica debería reducirse al máximo, hasta llegar al paraíso de su total desaparición.

Así pues, tanto las interacciones propiamente dichas con los objetos de la interfaz de usuario, es decir, el tipo de acciones que el usuario realiza sobre tales objetos ---"pincharlos", "moverlos" "arrastrarlos", etc.---, como los objetos mismos que, en su mayor parte, contribuyen a la construcción de esa interfaz, pueden calificarse de visuales, espaciales, táctiles, o cualquier otra palabra que se quiera elegir por contraposición a textuales, verbales o lingüísticos.

La metáfora se ha impuesto. A través del movimiento de nuestros ojos ---y de nuestras manos--- por la pantalla del ordenador, nos incorporamos a un mundo de entidades físicas virtuales sobre el que operamos de un modo no esencialmente diferente al del niño que manipula sus juguetes o al del artesano que con sus herramientas da forma a la materia sobre la que trabaja. Desde este punto de vista, el propio teclado, pensado básicamente para introducir texto, ---y, por extensión, cualquier otro dispositivo exótico del mismo tipo como un sintetizador de voz--- tendría que convertirse en un instrumento completamente secundario, del que finalmente se debería prescindir. Una idea que puede hacerse realidad de cuajar propuestas como las pantallas táctiles, los recientemente anunciados MacBook Wheel o las interfaces a lo Minority Report, ahora menos ciencia ficción de lo que se podría suponer.

Sin embargo, las cosas nos parecerían muy diferentes si atravesáramos la barrera mental de la interfaz del usuario y, buceando en su interior, nos parásemos a contemplar qué es lo que hace que dicha interfaz funcione. Lo que veríamos serían larguísimas líneas de puro texto ---el código del programa--- que, básicamente, consiste en un complejo entramado de instrucciones dadas a la máquina para que genere lo que luego vemos y para que eso que vemos se comporte como esperamos. Es secundario que ese conjunto de instrucciones se organice en torno a funciones independientes o como funciones miembros de ciertas estructuras de datos. Lo significativo es atender al hecho de que el ordenador se limita a ejecutar las instrucciones que el programador le indica a través del código.

Resulta, pues, evidente que, por detrás ---o por debajo--- de la metáfora visual, la interacción con la máquina es esencialmente lingüística: al programar, hablamos, literalmente, con la máquina, mediante un lenguaje artificial que ella pueda comprender, pero, en último extremo, no de un modo muy diferente a como se habla con alguien al que se le instruye para que haga lo que queremos hacer.

No es de extrañar que la primera interfaz de usuario fuera también de orden lingüístico. De hecho, los primeros usuarios de ordenadores fueron los programadores mismos, y para ellos lo más natural tenía que ser pensar su interacción con la computadora como una relación lingüística, la misma que sostenían con ella cuando la programaban.

Como ya he comentado en otras entradas de este blog, los sistemas Unix y afines ---GNU/Linux, MacOS X, BSDs, Solaris, etc.--- siguen disponiendo de esta interfaz textual, que es, en lo fundamental, la misma que imaginaron y desarrollaron los creadores de la informática.

En mi opinión, se pierde mucho si, movidos por el atractivo de la interfaz visual y por su omnipresencia, acabamos abandonando esa interacción lingüística directa con la máquina ---la indirecta o profunda, sigue estando ahí, en el código, como acabo de comentar.

Se pueden esgrimir varios argumentos para defender esta opinión. Me abstengo, no obstante, de ofrecerlos ahora. Me interesa bastante más plantear explicaciones concretas del uso de la interfaz textual, que ayuden a los no familiarizados con ella a comprender por qué unos cuantos seguimos prefiriendo "hablar" con la máquina en lugar de sucumbir por completo al encanto del universo virtual de ventanas, iconos y widgets de todas las clases que se nos propone como sustituto de ese diálogo. Quizá el ejemplo concreto tenga, al cabo, una fuerza mayor que cualquier argumento abstracto y haga que algunos curiosos se atrevan también a "conversar" con su computadora.

Con este fin me he propuesto escribir algunas entradas, que etiquetaré bajo el epígrafe "Conversaciones con HAL", a modo de introducción, probablemente poco convencional, al terminal de Unix.

Que haya elegido semejante título ---"Conversaciones con HAL"--- como etiqueta de la serie es, claro está, en recuerdo de esa celebérrima aparición de una interacción hombre-máquina en las pantallas de cine: 2001 de Kubrick, en donde tal relación fue concebida igualmente en forma de diálogo.

Y aquí termina la necesaria introducción, no sin antes aclarar que, como esto es un blog personal, y como en él sólo escribo de tarde en tarde ;-), no puedo determinar ni la frecuencia con que aparecerán los artículos previstos ni el número posible de ellos. Puede que me canse pronto y quede todo en agua de borrajas. De momento, se trata sólo de un proyecto. Cuál vaya a ser su destino es tan desconocido para el que esto firma como para sus potenciales lectores. Ventajas e inconvenientes de escribir sólo por placer y sin presión externa de ninguna clase.

lunes, 1 de diciembre de 2008

Releer a Dostoyevski

No sé si por la educación recibida, por el carácter o, simplemente, porque algo haya de objetivamente vinculante en el asunto, el hecho es que sigo prefiriendo a los clásicos. No sólo me siguen gustando como antes ---esas primeras e inolvidables lecturas que uno acomete en la adolescencia--- sino que me siguen sorprendiendo con nuevas facetas, para mí casi impensadas.

Por ejemplo, ahora que ando releyendo a Dostoyevski, Los demonios hace unos meses y El idiota en estos momentos, descubro, casi con estupor, hasta qué punto me era necesaria una relectura para empezar a comprender el alcance de su "narrativa".

Porque es algo más que literatura lo que ahí se encuentra. Y no se trata ---como muchas veces se ha resaltado--- de la indiscutible finura psicológica. Lo sorprendente para mí es que Dostoyevski se me está presentando como un verdadero filósofo. No el tratadista o el ensayista al que estamos acostumbrados, sino como un filósofo a la antigua usanza, es decir, como uno de aquellos, frecuente en las historias legendarias de las diversas tradiciones, que plantea sus reflexiones y sus enigmas a través de ejemplos.

Todo el entramado narrativo se me muestran ahora tan sólo como un artificio adecuado para comunicar la urgencia extrema del problema moral y su enigmaticidad. Un problema inseparable de la propia complejidad de los personajes y de las intrincadas relaciones entre ellos y el trasfondo histórico e ideológico en el que se desenvuelven. ¿Puede acaso este problema, o, en general, cualquier problema real, ser vertido en un tratado o en un ensayo convencional? ¿No será que comienza a ser más inteligible precisamente bajo las formas que los filósofos académicos suelen menospreciar?

Es seguro que más de un estudioso habrá reflexionado ya sobre esta faceta del novelista ruso. Como no tengo conocimiento de los análisis eruditos sobre su obra, un descubrimiento así supone para mí una revelación no muy distinta de la que sentí en mis primeras lecturas y, en cierto modo, de mayor alcance.

Alguien dijo que había que releer a los clásicos. No era ese pesado profesor de literatura del colegio. Era el maestro al que sólo muchos años después estamos empezando a comprender.

Por lo pronto, esta noche no pasará sin un nuevo capítulo de Dostoyevski.

domingo, 30 de noviembre de 2008

RTFM o de los malos hábitos

[ Advertencia: Esta es una entrada técnica. Absténganse de leerla los no interesados en los entresijos de Unix y sistemas afines. ]

Casi todo usuario de Linux o sistemas semejantes tiene que ser a la vez y en alguna medida ---lo quiera o no--- administrador de sus propias máquinas. Lo malo es que empieza a ser demasiado común emprender tales tareas administrativas con la mente idiotizada del luser, y así nos va, hasta que nos damos cuenta de nuestro pecado.

Os cuento un ejemplo de esto mismo que me acaba de suceder. Yo, convertido en luser, y perdiendo horas sin tino, por no darme cuenta, de que, cuando hay que ser admin, no hay coartadas que valgan.

Todo empezó con mi cortafuegos ...

El caso es que tengo una máquina independiente funcionando desde hace unas semanas como cortafuegos.

Una de las primeras cosas que quería hacer era que los logs del cortafuegos me llegasen a mi estación de trabajo, no sólo por razones de seguridad, sino también de comodidad. [ Sí, ya sé, lo mejor es que estén en un único servidor de logging, pero mi presupuesto no da para tanto, de momento ]. Además de eso quería utilizar logcheck ---por razones que omito--- como analizador de los registros.

El asunto no parecía difícil ---y no lo es, si uno se conforma con las configuraciones estándar. Pero a mí me interesaba una opción poco convencional.

logcheck envía mensajes de correo al administrador cada cierto tiempo (via cron), sobre los registros almacenados en los /var/log/* que uno desee analizar. En debian ---que es mi distro--- los ficheros de registro que se quiere que logcheck analice se definen en /etc/logcheck/logcheck.logfiles. Ahora bien, lo que a mí me interesaba es que logcheck me enviase mensajes diferentes para cada máquina, o sea, uno para la máquina local y otro distinto para el cortafuegos o cualquier otra máquina remota.

El problema empezaba con que los registros del cortafuegos iban al mismo fichero que el de mi máquina local. Lo primero que pensé fue en sustituir syslog por syslog-ng, el cual permite una definición más versátil de los ficheros de destino, por ejemplo, permite (gracias a la variable $HOST) crear ficheros de logs diferentes para distintas máquinas. Así lo hice, y tras configurar adecuadamente syslog-ng tenía un fichero de registro independiente para los logs procedentes de mi cortafuegos. Ya sólo faltaba que logcheck analizara también ese fichero y quedase configurado para que me enviase, además de un mail sobre mi máquina local, otro distinto sobre mi cortafuegos.

Hasta aquí los preliminares. Y ahora empieza la anécdota propiamente dicha. Busqué rápidamente en la documentación de mi distribución del paquete logcheck ---esto es lo primero que leo cuando instalo un paquete que no conozco--- por si existía alguna información para lograr mi objetivo. No encontré nada ahí, y me fui directamente a google. Y ya se sabe que googlear puede consumir mucho tiempo. El caso es que tampoco encontré nada en google. O sí, encontré un programa newlogcheck, que envía cada cierto tiempo un único mensaje con un sumario del análisis realizado, dividido en tantas secciones como máquinas emisoras de registros se quieran controlar; algo parecido, pues, a lo que yo pretendía.

Pensé para mis adentros que si alguien se había tomado la molestia de escribir esto, había pocas esperanzas de que logcheck, por sí mismo y sin modificaciones del código, pudiera hacer lo que yo deseaba. Parece que tenía sólo dos opciones: adoptar newlogcheck o desisitir. No me apetecía introducir un nuevo programa en la jerarquía de mi distribución, pero tampoco desistí. Porque, de repente, algo en mi interior se sublevó: "pero, chaval, si ni siquiera te has leído con atención la página de manual de logcheck. Quién te ha visto y quién te ve". Era mi propia conciencia BOFH irritada, con razón, contra la pereza y desidia de mi personalidad luser. Hice caso a mi BOFH y me leí con atención la página logcheck(8). Y ahí estaba la respuesta a golpe de vista. Con un poco más de trabajo, que consistió en pasar por las páginas cron(8) y crontab(5), tenía el problema resuelto. Algo que, si lo hubiese hecho desde el principio, me habría llevado no más de media hora de investigación y ese algo menos de un minuto que cuesta añadir esta línea a /etc/crontab [ Debe ser una única línea, aunque puede aparecer dividida en los navegadores. El nombre/IP real de la interfaz de red local del cortafuegos ha sido omitido ]:

4 * * * * logcheck if [ -x /usr/sbin/logcheck ]; then nice -n10 /usr/sbin/logcheck -l /var/log/[mi-firewall]/kern.log -H firewall; fi


La anécdota concreta es lo de menos, pero sí importa ---y mucho--- la moraleja: "el luser es el único ser que tropieza siempre en la misma piedra: no dejes que tu estúpido Jekyll se apodere de tu 'buen' Hyde". O, dicho de modo más lacónico, pero no menos expresivo: RTFM!!