viernes, 16 de abril de 2021

Gestión de paquetes en Arch Linux.

Seguramente usted está familiarizado con la instalación de programas en Windows. El proceso básicamente consiste en ejecutar un archivo con extensión .exe y seguir un conjunto de instrucciones bastante sencillas e intuitivas. En el sistema Arch Linux la instalación de programas y otras herramientas útiles para nuestro sistema como temas (en algunos casos), documentación, idiomas, plugins, extensiones, etc. es distinta. En lugar de los archivos con extensión .exe, en Arch Linux los programas vienen empaquetados con el programa tar y comprimidos desde diciembre del 2019 con el programa zstd, de modo que sus extensiones son .tar.zst. Anteriormente se usaba el programa gzip para comprimir, así que es posible aún en nuestros días ver algunos paquetes con la extensión .tar.gz. Con el tiempo, estos irán desapareciendo. Si el lector no está familiarizado con los conceptos de empaquetar y comprimir archivos, una búsqueda en Google será suficiente para entender estos sencillos conceptos.

Un paquete .tar.zst destinado a la instalación en Arch, sigue un estricto protocolo en su elaboración que garantiza una homogeneidad en todo el sistema. El paquete no es solo un archivo de archivos. Es parte de un todo más grande y describe, como veremos más adelante, su relación con otros paquetes. De aquí en adelante llamaremos a estos paquetes "paquetes Arch".

Librerías y dependencias.

Antes de profundizar en los paquetes Arch, conviene conocer los conceptos de "librerías" y "dependencias" en los sistemas GNU/Linux.

Para que un programa funcione en nuestra computadora, se necesitan ciertos archivos especiales que tienen como propósito cumplir una tarea específica en el funcionamiento dicho programa. A dichos archivos se les conoce como librerías. Así, se dice que el programa X "depende" de cierta librería para funcionar. En consecuencia, decimos que la librería en cuestión es una dependencia del programa X. Si dicha librería no se encuentra instalada en el sistema, el programa que la necesita no podrá funcionar correctamente, y decimos entonces que hay "problemas de dependencias". Sin embargo, no todas las dependencias de un programa son librerías, con frecuencia sucede que un programa X precisa que en el sistema se encuentre ya instalado otro programa Y para su correcto funcionamiento, de modo que un programa puede ser también una dependencia. La cuestión importante a tratar es que en los sistemas GNU/Linux existen dos tipos de librerías; las librerías estáticas y las librerías dinámicas. Veamos las diferencias.

Librerías estáticas: Estás librerías son usadas exclusivamente por el programa al que pertenecen. En Windows tienen la extensión .lib y en GNU/Linux la extensión .a.

Librerías dinámicas: Estás librerías, a diferencia de las estáticas, son compartidas por distintos programas. En Windows tienen la extensión .dll mientras que en GNU/Linux .so.

La ventaja de las librerías dinámicas reside en que solamente es necesario una copia de la librería, la cual es compartida por todas las aplicaciones que la necesitan, ahorrando espacio en disco duro y optimizando el funcionamiento del sistema. La librería estática, en cambio, requiere que cada programa disponga de su propia copia y la incluya como parte del programa en sí, de manera que al usar dos programas que usan una misma librería, ésta estará en ejecución dos veces demandando más trabajo por parte del hardware. Sin embargo, el uso de librerías dinámicas puede traer problemas. Por ejemplo, distintos programas pueden necesitar de una misma librería pero en versiones distintas; es decir, un programa precisa que la librería en cuestión esté en su versión 2.0 mientras que otro programa la necesita en su versión 2.3. Lo mismo puede ocurrir con los programas que son dependencias de otros programas. Esto puede ocasionar un conflicto y hacer que los programas no funcionen correctamente, ya que Arch Linux no permite que un mismo programa o librería esté instalado varias veces, aún cuando sea en versiones diferentes. Por lo tanto, se requiere un sistema eficiente que gestione las relaciones entre programas y dependencias de forma que haya un equilibrio evitando conflictos entre los diferentes programas. El programa pacman es el encargado de solucionar estos problemas, pero antes de ver su funcionamiento, conviene conocer el contenido de un paquete Arch.

Anatomía de un paquete Arch.

Nota: recordemos que en los sistemas GNU/Linux los archivos cuyo nombre empieza por un punto son archivos que están ocultos, de modo que para verlos hay que especificarlo en el explorador de archivos que estemos usando. Si se está usando la terminal, el comando ls -a los mostrará.

Por el momento no discutiremos el proceso de elaboración de un paquete Arch ni la manera de descargarlos, simplemente mostraremos el contenido de uno. Supongamos que tenemos un paquete Arch llamado Paquete1.pkg.tar.zst. Para ver su contenido, lo primero que hay que hacer es descomprimirlo con el programa zstd, para ello ejecutamos el comando 

unzst Paquete1.pkg.tar.zst

Como consecuencia aparecerá otro archivo llamado Paquete1.pkg.tar, el cual podemos desempaquetar con el programa tar usando el comando

tar -xvf Paquete1.pkg.tar

Así, obtendremos el contenido del paquete Arch, el cual consiste en:

-Los archivos binarios para instalar. Estos archivos corresponden a la aplicación en sí.

-El archivo .PKGINFO: contiene toda la información que pacman necesita para manejar paquetes, dependencias, etc. Más adelante, cuando veamos el funcionamiento de pacman profundizaremos en dicha información.

-El archivo .BUILDINFO: este archivo cumple una función un poco técnica, así que no le prestaremos mucha atención. Contiene la información necesaria para compilaciones reproducibles. Este archivo está presente solo si el paquete está construido con pacman 5.1 o más reciente. Consulte BUILDINFO (5) para más detalles.

-El archivo .MTREE: La función de este archivo es la de revisar que el paquete cumpla con ciertos aspectos de seguridad. Para los entendidos en la materia, contiene hashes y marcas de tiempo de los archivos, que se incluyen en la base de datos local para que pacman pueda verificar la integridad del paquete.

-El archivo .INSTALL: un archivo opcional que se utiliza para ejecutar comandos después de la etapa de instalación / actualización / eliminación del paquete. (Este archivo solo está presente si se especifica en PKGBUILD durante la creación del paquete).

-El archivo .Changelog: un archivo opcional guardado por el mantenedor del paquete que documenta los cambios del paquete. (No está presente en todos los paquetes).

Instalación manual de un paquete Arch.

Como ya se ha mencionado, los paquetes Arch están diseñados para que su contenido pueda extraerse en cualquier sistema que tenga los programas tar y zstd. Esta propiedad aparentemente trivial es importante para la portabilidad y la recuperación ante posibles desastres. Por el momento no nos ocuparemos de mostrar qué es y cómo se usa el programa pacman, solo es importante saber que una de sus funciones es la de instalar paquetes de forma automática. Supongamos ahora que por alguna razón, pacman se eliminó de nuestro sistema y que por lo tanto, no puede más instalar paquetes Arch. Podría descargar el paquete Arch de pacman, pero no podría instalarlo porque irónicamente precisa de pacman para hacerlo. Ahora supongamos que afortunadamente, conoce la estructura de un paquete Arch y, por lo tanto, puede descargar el paquete de pacman e instalarlo manualmente (más adelante veremos cómo). De esta manera recuperaría la instalación del programa pacman y podría con normalidad instalar otros paquetes Arch a través de este. Si por alguna desgracia además el programa tar ha desaparecido, solo será necesario copiarlo desde otra computadora (ya que tar opera de manera completamente autónoma, sin dependencias, así una copia simple será suficiente). Esto último no se mostrará cómo hacerlo, pero es importante saber que se puede hacer.

Volvamos a nuestro caso hipotético donde se ha eliminado pacman y no podemos instalar paquetes Arch. La solución a este problema sería entonces, descargar el paquete de pacman (más adelante veremos de dónde se descargan los paquetes) y extraer su contenido en la raíz / del sistema, de manera que cada archivo vaya a donde tenga que ir, pues recordemos que el empaquetado .tar preserva las ubicaciones relativas entre las carpetas. De esta forma pacman quedaría instalado nuevamente en nuestro equipo. Sin embargo, no es recomendable instalar paquetes Arch de esta manera, salvo en casos extremos como el descrito anteriormente. Si lo hacemos, muchos procesos importantes no se llevan acabo de manera correcta. La instalación de paquetes a través de pacman u otro gestor de paquetes es lo que debemos procurar para mantener a nuestros programas funcionando de manera correcta. Por lo tanto, en lo que sigue nos ocuparemos en el análisis del funcionamiento de pacman, pero antes, vale la pena saber que son los repositorios.

Repositorios.

Hasta el momento hemos estudiado lo que son los paquetes Arch y su contenido, pero no hemos dicho de dónde se descargan. Para ello debemos explicar lo que son los repositorios, para finalmente mostrar cómo se usa pacman en la instalación de programas.

Seguramente está familiarizado con la instalación de aplicaciones en su teléfono desde tiendas como Apple App Store o Google Play Store. Lo que sucede en estos casos es que nosotros buscamos la aplicación en la tienda, la descargamos y la instalamos, así de sencillo. Algo parecido pasa en Arch Linux y muchas otras distribuciones de Linux. Un repositorio no es más que una computadora que aloja un montón de paquetes Arch. Nosotros desde nuestra computadora nos conectamos a dicho repositorio para buscar los programas que queremos y posteriormente descargarlos e instalarlos. En la actualidad Arch Linux cuenta con 7 repositorios oficiales. Veamos un poco de historia.

Originalmente, cuando Arch Linux era usada por muy pocos usuarios, solo había un repositorio conocido como [official] (ahora [core]). Este repositorio contenía básicamente las aplicaciones preferidas de Judd Vinet. En aquel entonces existían algunos usuarios a los que no les gustaba las selecciones de Judd, así que comenzaron a crear sus propios paquetes. Estos paquetes fueron incorporados a un repositorio llamado [unofficial] y fueron mantenidos por algunos desarrolladores de Judd. Con el tiempo estos dos repositorios consiguieron apoyo por parte de todos los desarrolladores. Como los nombres [oficial] y [unoficial] ya no reflejaban su verdadero propósito fueron renombrados a [current] y [extra].

Poco tiempo después, [current] fue renombrado a [core] para prevenir confusiones sobre lo que contenía. Los repositorios ahora se encuentran atendidos por igual por los desarrolladores y la comunidad, pero [core] tiene algunas diferencias, la principal es que los paquetes para el CD de instalación y las liberaciones de instantáneas (“snapshots”) son tomados solo de [core].

En algún momento se descubrió que existían muchos paquetes que los desarrolladores no querían mantener. Así, uno de los desarrolladores (Xentac) creó el “Repositorio de Usuarios de Confianza” (Trusted User Repositories) que era básicamente un repositorio no oficial en el cual los llamados "usuarios de onfianza" podían colocar paquetes que ellos hubieran creado. Este sistema funcionó por un tiempo, pero luego los usuarios de confianza comenzaron a descuidar su repositorio. Posteriormente los usuarios de confianza fueron congregados en un grupo más unido y ahora mantienen colectivamente el repositorio [community]. Los usuarios de confianza aun son un grupo separado de los desarrolladores de Arch Linux y no existe mucha comunicación entre ambos grupos. Sin embargo, los paquetes que son muy populares aun siguen pasando desde [community] a [extra], en ocasiones.

Por otra parte, y dado a numerosos problemas causados por un kernel introducido en [core] , fue presentada la norma “política del visto bueno del núcleo” (core signoff policy). Desde entonces, todas las actualizaciones de los paquetes depositados en [core] tienen que ser presentados primero a través del repositorio [testing] , y únicamente después de varios vistos buenos (“signoffs”) de otros desarrolladores se les permite moverse a core.

En resumen, tenemos que los repositorios oficiales en la actualidad son:

1. core

2. extra

3. community

4. multilib

5. testing

6. community-testing

7. multilib-testing 

Para ver en detalle qué tipos de paquetes hay en cada uno consulta https://wiki.archlinux.org/index.php/Official_repositories_(Español)

Con la información dada hasta el momento, puede parecer que la descarga e instalación de paquetes Arch es muy complicada. Lo que sigue es ver cómo pacman facilita la tarea de búsqueda, descarga, instalación y desinstalación de un programa. Más aún, pacman nos ayuda a obtener información específica de un paquete así como resolver conflictos con dependencias. Es pacman, en resumen, una herramienta muy poderosa que debemos aprender a utilizar.

Pacman.

El programa pacman se usa por medio de la línea de comandos. Todo usuario experimentado en Linux sabe que la mejor forma de aprender a usar un programa de terminal es leyendo el manual del programa. Podemos acceder al manual de pacman ejecutando pacman -h en nuestra terminal. Sin embargo, el propósito de esta guía es mostrar de forma didáctica la gestión de paquetes en Arch Linux, de manera que a continuación se mostrará un caso donde se exponga el proceso de instalación y desinstalación de un paquete partiendo desde la búsqueda del mismo en los repositorios. 

Supongamos que estamos interesados en instalar un programa para editar videos pero no sabemos que opciones existen. El primer paso, es sincronizar nuestra computadora con los repositorios para tener una lista actualizada de los paquetes disponibles. Los repositorios están en constante cambio, así que es importante esta sincronizacion. Para ello ejecutamos en nuestra terminal pacman -Sy. Una vez hecho esto, pacman conocerá el estado actual de los repositorios y su contenido, de manera que podemos proceder a buscar nuestro programa.

El segundo paso es buscar en los repositorios aquellos programas cuyas características sean la edición de video, para ello ejecutamos pacman -Ss video editor (aclaremos que las palabras "video" y "editor" corresponden a patrones de búsqueda para pacman). Nos aparecen entonces varios paquetes que cumplen con nuestra búsqueda "video editor" (notemos también que se específica el repositorio al que pertenece el paquete). Supongamos que nos llama la atención el programa kdenlive, así que nos gustaría obtener información sobre él. Para ello ejecutamos pacman -Si kdenlive. En consecuencia obtenemos información del paquete, tal como su versión, sus dependencias, su mantenedor, etc. Al parecer cumple con lo que buscamos, así que lo siguiente es instalarlo, y para ello ejecutamos pacman -S kdenlive. El proceso de descarga e instalación del paquete comenzará, instalandose de ser necesario dependencias requeridas. Durante el proceso pacman nos podrá hacer una seríe de preguntas a las que deberemos responder. Una vez finalizada la instalación, podemos proceder a usar el programa.

Supongamos que pasa el tiempo y sale una nueva versión de kdenlive. Lo que sigue entonces sería actualizar el programa, y para ello pacman también nos ayuda. El comando pacman -Syu sincroniza nuestra computadora con los repositorios y en caso de haber actualizaciones pacman las instalará. Es importante aclarar que la actualización será sobre todos los paquetes que puedan actualizarse, actualizándose también las dependencias de ser necesario.

Finalmente, supongamos que deseamos desinstalar kdenlive porque ya no lo utilizamos. Para ello ejecutamos pacman -Rns kdenlive, con lo que se procederá con la eliminación de kdenlive. El proceso anterior, desde la sincronización con los repositorios hasta la instalación del paquete es lo que usualmente se hace para instalar paquetes Arch. Una recomendación es que antes de instalar algún programa se sincronicen los repositorios y se actualice el sistema. Para ello siempre es recomendable instalar un paquete mediante el comando pacman -Syu nombre_del_paquete.

Comandos de pacman.

pacman cuenta con muchas funciones de gran utilidad. A continuación se listan las órdenes más importantes que pueden ejecutarse.

Operación -Q.

pacman -Q [paquete] revisa si el paquete especificado está instalado en el sistema.

pacman -Qs [búsqueda] revisa si hay un paquete instalado con las características de búsqueda que se ponen (usualmente se debe escribir en inglés). Ejemplo; pacman -Qs video editor.

pacman -Qi [paquete] muestra información del paquete instalado (su versión, dependencias, etc.). De hecho, la información desplegada por este comando es precisamente el contenido del archivo .PKGINFO.

pacman -Qm muestra todos los paquetes instalados de fuentes externas a los repositorios oficiales.

pacman -Qd muestra los paquetes instalados como dependencias.

pacman -Qt muestra solo paquetes que no son requeridos (ni opcionalmente) por ningún otro paquete instalado. La orden -Qtt muestra los paquetes que son requeridos opcionalmente por otros paquetes.

pacman -Qdt muestra paquetes huérfanos; esto es, paquetes que se instalaron como dependencias pero que ya no son requeridos por ningún paquete instalado.

Operación -S.

pacman -Sy sincroniza los repositorios.

pacman -Su actualiza todos los programas y sus dependencias de ser necesario.

pacman -Syu primero sincroniza los repositorios y luego actualiza todos los programas.

pacman -Ss [búsqueda] revisa los paquetes de los repositorios con las características de búsqueda que se ponen (usualmente se debe escribir en inglés). Ejemplo; pacman -Qs video editor.

pacman -Si [paquete] muestra información del paquete (su versión, dependencias, etc.). La informacion desplegada es la que contiene el archivo .PKGINFO.

pacman -S [paquete 1] [paquete 2] ... [paquete n] instala los n paquetes especificados. Además instalará los paquetes incluyendo sus dependencias obligatorias. También ofrecerá instalar dependencias opcionales.

pacman -Sw [paquete 1] [paquete 2] ... [paquete n] descarga los n paquetes especificados pero no los instala. Los paquetes y las dependencias requeridas se descargarán en la carpeta de caché de pacman ubicado en /var/cache/pacman/pkg.

pacman -Sc Elimina los paquetes de la caché que ya no están instalados, así como las bases de datos de sincronización que no se utilizan actualmente para liberar espacio en el disco. Cuando pacman descarga paquetes, los guarda en un directorio de caché ubicado en /var/cache/pacman/pkg. Además, cada que actualizamos los repositorios, cada sincronización se guarda y no se eliminan incluso si se eliminan del archivo de configuración pacman.conf. La instrucción -Sc elimina solo los paquetes que ya no están instalados; mientras que -Scc elimina todos los archivos de la caché. En ambos casos, tendrá una opción de sí o no para eliminar paquetes y / o bases de datos descargadas no utilizadas.

Operación -R.

pacman -R [paquete] elimina el paquete especificado, pero no borra sus dependencias.

pacman -Rs [paquete] elimina el paquete especificado y sus dependencias. Una dependencia no se eliminará si es que otro paquete requiere de ella. Además, si una dependencia fue instalada explícitamente tampoco se eliminará con esta orden. Esta orden es recursiva, en el sentido de que de ser posible, se eliminarán dependencias de dependencias.

pacman -Rns [paquete] hace lo mismo que el comando anterior pero elimina además los archivos de configuración.

pacman -Rc [paquete] elimina el paquete especificado y sus dependencias. Esta orden es peligrosa pues puede eliminar una dependencia requerida por otro paquete. También es recursiva.

Operación -D.

pacman -Dk compruebe que la base de datos de paquetes local no sea inconsistente. Esto es, verificará que todos los archivos requeridos estén presentes y que los paquetes instalados tengan las dependencias requeridas, no entren en conflicto y que varios paquetes no posean el mismo archivo. La instrucción -Dkk, comprobará además la sincronización de las bases de datos para garantizar que todas las dependencias especificadas estén disponibles.

Operación -U.

pacman -U [paquete] instala el paquete especificado. Este comando se usa para instalar paquetes que ya hemos descargado. Recordemos que el comando pacman -Sw nos permite descargar paquetes pero no instalarlos, y estos se guardan en /var/cache/pacman/pkg. Así, podemos instalar un paquete previamente descargado con el comando pacman -U /var/cache/pacman/pkg/nombre_del_paquete.


viernes, 8 de mayo de 2020

Las fantasías

Debemos tener cuidado con lo que fantaseamos. Para aquellas quimeras intensas y vehementes que nos entristecen porque las consideramos difíciles o imposibles de conseguir, no debemos tomar como guía las imágenes que nos dan nuestras fantasías. Pues la mente es una inagotable narradora de ilusiones, una aliciente fuente de sueños inconclusos, que nos hace planear y proyectar sobre un incierto devenir. Son torturadores engaños que nos construyen un mundo al que jamas perteneceremos. Y no me refiero a fantasías que perturban a las mentes de los estúpidos, como la posesión de extravagantes riquezas, fama y mujeres, sino a aquellas ilusiones que se nos muestran en nuestro horizonte de posibilidad, y que sabemos que por cuestiones coyunturales no se pueden alcanzar. O peor aún, aquellas que sabemos que pueden ser obtenidas, pero que por nuestra propia idiosincrasia no lo hacemos, ya sea por inseguridades o miedos con un fundamento en el pasado. Lo que debemos tomar de las fantasías, no son las imágenes sino los conceptos, pues estos son los mejores consejeros, y a partir de ahí dirigir nuestros pensamientos hacia una profunda introspección.

Sin embargo, he de aceptar lo difícil que es tratar a las fantasías con la capacidad de juicios que operan con conceptos abstractos y la reflexión sobria y fría. Los sentimientos que evocan las fantasías más fuertes nos abrasan y mantienen en un estado de aparente felicidad, que en realidad no hacen más que maquillar una realidad que para nosotros es dura e intolerable. La disputa se centra entonces en saber en qué medida se deben poner riendas a nuestras fantasías. Pues una persona sin fantasías es una persona carente de contenido, y por el contrario, aquellos que deja volar sus ideas con los sucesos más felices, y los hace brillar como estrellas entre espirales de colores y adornadas con dulces versos, no hace más que adquirir una deuda con la realidad, cuyo redimir le mostrará que nada de lo que piensa es suyo, que las fantasías mueren de forma ingenua y que nadie tiene la dicha de conocer todos sus sueños.

Если жизнь тебя обманет,
Не печалься, не сердись!
В день уныния смирись:
День веселья, верь, настанет.

Сердце в будущем живет;
Настоящее уныло:
Все мгновенно, все пройдет;
Что пройдет, то будет мило.

viernes, 9 de noviembre de 2018

Demostración: Si una funcion ƒ tiene inversa, entonces la inversa es única.

Sea ƒ: A→B funcion, y su inversa ƒ1: B→A. Si ƒ1 no es única, entonces ∃ g: B→A tal que ƒ∘g=IdB y gƒ=IdA, donde IdB es la función identidad del conjunto B y IdA la función identidad del conjunto A. Luego
g=g∘IdB
g=g∘(ƒƒ1)
g=(gƒ)ƒ1
g=IdAƒ1
g=ƒ1
Por lo tanto la inversa de ƒ es única.

Demostración: Una funcion ƒ tiene inversa si y solo si es biyectiva.

Teorema: Una función ƒ: A→B tiene inversa ƒ1: B→A si y solo si ƒ es biyectiva.
Se trata de una doble implicacion. Demostramos primeramente la implicacion de izquierda a derecha, que seria: Si ƒ tiene inversa, entonces ƒ es biyectiva.
Se debe demostrar que ƒ es biyectiva, esto es, que es inyectiva y sobreyectiva. Por tanto, demostramos primeramente que ƒ es sobreyectiva.
Si b∈B entonces ƒ(a)=b.
Sea ƒ: A→B función, por hipótesis ƒ1: B→A tal que ƒ1(b)=a, siendo a∈A y b∈B.
 ƒ1(b)=a
Aplicando ƒ en ambos lados 
 ƒ(ƒ1(b))=ƒ(a)
Que por definición de composición de funciones es equivalente a 
 ƒ1)(b)=ƒ(a)
Pero por definición de la función identidad ƒƒ1: B→B, osea ƒƒ1=IdB, donde IdB es la función identidad sobre el conjunto B. Por lo tanto
IdB(b)=ƒ(a) 
Pero IdB(b)=b, así que
 b=ƒ(a)
ƒ(a)=b 
En consecuencia ƒ es sobreyectiva.
Posteriormente demostramos que ƒ es inyectiva.
Si ƒ(x₁)=ƒ(x₂) entonces x₁=x₂.
ƒ(x₁)=ƒ(x₂)
Pero por hipótesis  ƒ1, así que la aplicamos en ambos lados de la igualdad anterior
ƒ1(x₁))=ƒ1(x₂))
Que por definición de composición de funciones es equivalente a
(ƒ1ƒ)(x₁)=(ƒ1ƒ)(x) 
Pero por definición de la función identidad
x₁=x₂ 
En consecuencia ƒ es inyectiva. Por lo tanto ƒ es biyectiva.
Ahora demostramos la doble implicación de derecha a izquierda, la implicación seria: Si ƒ es biyectiva, entonces ƒ tiene inversa.
Sea g: B→A, tal que g(b)=a si ƒ(a)=b. Luego, al ser ƒ sobreyectiva, b∈B a∈A, y por ser inyectiva cada a∈A tiene un único b∈B. En consecuencia
(gƒ)(a)=IdA(a) y (ƒg)(b)=IdB(b)
Que por definición de función inversa, g debe ser la inversa de ƒ, esto es g=ƒ1. Por lo tanto ƒ tiene inversa.