Archivo de la categoría: Nueva versión

Nuevas versiones de programas

Cronopete, ahora más accesible y con soporte SSH

Hace unos días saqué una nueva versión de Cronopete con dos importantes cambios: para empezar, he mejorado la accesibilidad, de manera que las personas que necesiten utilizar un lector de pantalla puedan usar Cronopete para sus copias de seguridad; y la segunda es soporte para guardar las copias en un servidor SSH/SFTP remoto.

En el caso de la accesibilidad, tengo que decir que no es perfecta por culpa de que Cronopete aún utiliza Gtk3, y mientras no haya soporte de libappindicator en Gtk4 no puedo hacer el port. A pesar de todo, ahora por lo menos es utilizable (antes era imposible).

Respecto al soporte de SSH/SFTP, puede parecer que al utilizar RSync por debajo la implementación sería sencilla. Nada más lejos de la realidad.

Para empezar, está la cuestión de que RSync sólo se utiliza para la copia en sí, pero es mi propio código el que necesita una lista de las copias actuales para decidir contra cual se deben hacer los enlaces duros en la nueva copia, cuanto espacio libre hay en el servidor, y acceder a los contenidos para la interfaz de recuperación de ficheros. Todo ello requiere acceso por SFTP.

La primera solución (que, de hecho, llegué a implementar en origen) fue utilizar directamente GVFS para acceder al sistema de ficheros remoto donde se almacenaban las copias. Esto funcionaba realmente bien, pero tenía un problema que, en mi opinión, era muy serio: cualquier acceso obliga a permitir que GVFS monte en local el sistema de archivos remotos mediante FUSE. Esto es un riesgo porque eso significa que cualquier aplicación tendría acceso a las copias de seguridad, y además con permisos de lectura y de escritura, por lo que un accidente (o peor, un ransomware) podría hacer que perdiésemos nuestras copias de seguridad.

Ante esto decidí ir a la solución compleja pero más segura, que consistió en implementar una clase que implemente la interfaz GFile y, específicamente, las llamadas que necesito tener en Cronopete para acceder a un sistema SFTP remoto, usando por debajo libssh2. Esta biblioteca permite trabajar directamente contra un servidor SSH/SFTP sin necesidad de montarlo, lo que significa que las copias de seguridad pueden estar almacenadas en una partición diferente, y acceder a ellas mediante un usuario específico, de manera que aunque GIO/GVFS se vean comprometidos, nuestras copias de seguridad no lo estén.

Al usar la interfaz GFile, todo el código de Cronopete se conserva prácticamente inalterado, y sólo hace falta cambiar la inicialización del objeto concreto que se va a usar, de manera que apunte bien al disco duro USB, a una carpeta local, o al servidor SSH/SFTP.

¡¡Que lo disfrutéis!!

Terminus llega a la versión 2.0

Después de muchos años, Terminus acaba de llegar a la versión 2.0. Y no ha sido «porque sí», sino porque ahora incorpora una nueva funcionalidad que creo que lo convierte en aún más útil: Drag’n’Drop.

Ahora es posible arrastrar un terminal agarrándolo por la barra superior (la que se pone roja cuando el terminal tiene el foco), y cambiarlo de sitio, bien dentro de la misma pestaña, en otra pestaña de la misma ventana o de otra ventana, en una nueva pestaña de la misma ventana o de otra ventana, o incluso en una nueva ventana. Esta característica permitirá evitar el «arrepentirse» de estar ejecutando algo en otra pestaña cuando ahora vendría mejor tenerlo junto a ese otro terminal; o si tenemos algo en la ventana tipo «Guake» y nos interesaría tenerlo en una ventana independiente, etc.

A mayores incorpora alguna que otra característica nueva, como permitir configurar el auto-ocultamiento del cursor. Así, si está activo, al teclear cualquier cosa, el cursor del ratón desaparecerá (y así no molesta), apareciendo de nuevo tan pronto se mueva el ratón.

Como de costumbre, se puede descargar en mi página web.

Lanzado ZXSpriter

Editado: ya había un programa llamado ZXEditor, así que he renombrado mi editor a ZXSpriter

Después de mis tres entradas anteriores, llegó el momento de empezar a pintar cosas en el Spectrum, pero me encontré con que no había ninguna herramienta que me convenciese para hacer gráficos compatibles, así que me lié la manta a la cabeza y he escrito ZXSpriter. Se trata de un editor de Sprites que se adapta a mis necesidades, pues no sólo permite crear un número ilimitado de sprites y exportarlos a formato ensamblador, listos para integrarse con mi código, sino que permite que cada sprite sea de diferente tamaño, que tenga o no máscara de transparencia, o incluso datos de atributos de color.

Ahora que tengo este editor, en un par de días espero publicar una nueva entrada explicando cómo pintar sprites.

A ritmo de conga (15)

Hoy hice algunos cambios extra en el repositorio de OpenDoñita. Para empezar, dado que han actualizado OSMC y ya trae Python 3.7, ahora ya es posible instalar mi servidor directamente en una Raspberry Pi con él. Así lo hice, así que aproveché para añadir un nuevo instalador que sea más sencillo. Ahora, al ejecutar install.sh, se bajarán los paquetes necesarios (tanto de python como del sistema operativo), se instalará todo en el sitio correspondiente, y se lanzarán los servicios necesarios.

Por otro lado, he escrito un nuevo programa para emparejar la aspiradora. Tiene esta pinta:

Gracias a ella, ahora es un poco más sencillo realizar el emparejado desde cualquier ordenador, con la única condición de que éste tenga WiFi.

Crust y protothreads

Hace tiempo había descubierto un curioso mecanismo denominado protothreads. Se trata de una manera de añadir capacidades asíncronas a C. El truco es bastante curioso, pues se basa en una característica poco conocida de C, que consiste en que un switch puede saltar a la mitad de un bucle, ya sea for, while o do…while. Esto es, este código es legal:

switch (a) {
default:
    while(1) {
        do something
        return;
case XXXX:
        do more things
    }
}

Esto funciona perfectamente en C, y además es perfectamente legal, gracias a la definición explícita de cómo funcionan los bucles en este lenguaje.

La idea detrás de esto es generar a mayores una serie de macros y definiciones que permitan embellecer el código, y hacer que se parezca más a programación asíncrona.

La cuestión es que llevo unas semanas trabajando en un proyectillo en C que utiliza eventos y programación asíncrona, y para simplificar y mejorar el código decidí implementar protothreads. Por supuesto, también utilizaba mi viejo analizador estático crust para analizar el código y detectar errores, y justo aquí me encontré con el problema: no era capaz de analizar correctamente estas estructuras.

Así que aquí tenía dos opciones: o pasar de crust, o actualizarlo para que lo soporte. Y obviamente me decidí por lo segundo.

Multipackager, Fedora y Debian

Desde hace tiempo puedo generar paquetes fácilmente para varias distribuciones gracias a un pequeño programa que me hice, multipackager, que a partir de las fuentes, me hace paquetes para Debian estable y SID, Ubuntu LTS y actual, Fedora y Arch. Para ello genera un contenedor con la distribución concreta, añade los paquetes necesarios y ejecuta el programa que genera el paquete.

Por desgracia, ya llevaba una temporada con problemas con Fedora: no tenía manera de generar una imagen para Fedora 31. Afortunadamente, echando un vistazo a cómo lo hacía LXC pude encontrar una manera, algo chapucera, para qué negarlo.

Por desgracia, hace unos días terminó de romper del todo: hasta ahora, para generar las imágenes de contenedores utilizaba yum, la herramienta de paquetería de Fedora/Red Hat, que, afortunadamente, estaba disponible en Debian SID. Pero por desgracia, hace unos días fue eliminada de los repositorios. Algunos dirán que esa herramienta está obsoleta, y que hoy en día se utiliza dnf, y es verdad, pero por desgracia esa nunca estuvo disponible en Debian, y no fui capaz de instalarla a partir de las fuentes.

Ante esto, necesitaba una solución. Decidí echar un vistazo de nuevo a ver qué hacía LXC, y me encontré con que partía de la imagen Live ISO de Fedora, montándola, extrayendo el fichero con la imagen squashfs, extrayendo de ella el sistema de archivos, y configurando un sistema nuevo con ellos. Lo veía bastante lioso, pero no veía otra opción, así que empecé a ver cómo automatizar la descarga de la ISO… y de pronto encontré un interesante directorio en el servidor web llamado Containers… y efectivamente, contenía imágenes del sistema de archivos básicas, listas para ser utilizadas. Lo único que tenía que hacer era procesar la página web que listaba el contenido de la carpeta para obtener el nombre del fichero correcto, y a correr.

Y gracias a eso, multipackager ya vuelve a funcionar a pleno rendimiento, y he podido sacar un nuevo paquete de Cronopete que funciona en Fedora 32.

Nueva versión de ActivityAppLauncher

Acabo de subir una nueva versión de ActivityAppLauncher, la extensión de Gnome Shell que muestra un menú de categorías en el modo Overview. El motivo de actualizarla, después de años sin tener que tocarla prácticamente, es que en Gnome Shell 3.36.0 han hecho varios cambios internos que rompen las cosas que tuve que hacer para que funcionase.

Sin embargo, aproveché para echar un vistazo más en detalle al viejo código (a fin de cuentas, fue una de las primeras extensiones que escribí), y encontré una manera más elegante y, sobre todo, fiable, de añadir la vista con las aplicaciones: ahora es una página «con todas las de la ley» dentro del modo Overview, y no un pegote metido con calzador. Esto tiene la ventaja de que hay una animación al pasar de la lista de ventanas al de aplicaciones y viceversa, pero a cambio no me ha sido posible conservar la lista de escritorios cuando se muestra la lista de aplicaciones.

También aproveché para cambiar el sistema de instalación por uno basado en meson, vilmente fusilado del utilizado en desktop-icons.

En breve estará disponible en la página de extensiones de Gnome Shell, pero mientras tanto, se puede bajar del repositorio GIT.

Un pasito p’alante María, y uno p’atrás

Hace cosa de un mes se publicó la versión 3.34 de Gnome Shell, la cual incorporaba muchas mejoras internas de rendimiento. Por desgracia, también incorporaba tantos cambios internos que un amplio porcentaje de extensiones no funcionan con ella. Esto era algo de lo que ya nos habíamos olvidado, pues desde hace unas cuantas versiones no había cambios de arquitectura internos tan grandes que afectasen de esta manera a las extensiones. Aunque tuve suerte con ActivityAppLauncher y con Desktop Icons NG (pues ambas funcionan perfectamente sin ningún cambio), no la hubo con la extensión Desktop Icons original, principalmente por culpa del nuevo sistema de herencia en clases Javascript, que, al permitir heredar desde clases de GObject, ya no obliga a meter un actor St en una propiedad de una clase, sino que la clase en sí puede heredar directamente de ella.

Afortunadamente, Marco Trevisan se encargó de subir un parche que corregía este problema; sin embargo, para poder garantizar que funcionaba correctamente tuve que esperar a que Debian Sid actualizase Gnome Shell desde 3.30 a 3.34, cosa que ocurrió hace casi dos semanas. Tras unas cuantas pruebas del código procedí a empaquetarlo y subirlo. Alegría, alboroto, labor cumplida, bla bla bla…

Hasta que empiezan a llegar los avisos de bugs. En concreto, había uno muy grave, que rompía completamente el escritorio cada vez que se intentaba renombrar un icono. Ante semejante problema, tuve que poner en cuarentena rápidamente la nueva versión de la extensión y empezar a trabajar en el parche. Desgraciadamente, no conseguía avanzar: todo lo que intentaba seguía fallando de manera misteriosa. Afortunadamente, una vez más Marco Trevisan se puso manos a la obra y subió otro parche que corregía este problema y, de paso, actualizaba la forma del cuadro de diálogo para renombrar ficheros, haciéndola más consistente con Nautilus (nunca le podré estar lo suficientemente agradecido).

Ya puestos, aproveché para pedirle que revisase un parche mío que llevaba tiempo esperando ser aplicado: uno que corregía el tamaño de los thumbnails. Finalmente se pudo aplicar a tiempo, por lo que es posible que los usuarios de Ubuntu 19.10 puedan disfrutarla «de serie».

Pero los problemas no se acabaron ahí, pues surgieron dos bugs extra que afectaban, esta vez sí, a Desktop Icons NG. El primero es que, por un error en Mutter, el gestor de ventanas de Gnome Shell, el drag and drop desde el escritorio hacia una ventana de Nautilus deja de funcionar, cuando en Gnome Shell 3.30 y 3.32 siempre funcionó perfectamente. Tras mucho esfuerzo conseguí encontrar el parche concreto en el que se introdujo el error, y lo reporté. EDITO: ya lo han corregido. ¡Genial!

El segundo problema era más grave, pues por un bug en Gnome Shell en sí, crear una ventana de tipo DESKTOP con Gnome Shell trabajando en X.org (no se en Wayland, pues actualmente no se puede), rompía el modo de Actividades: era entrar en él y el escritorio se quedaba tonto. Afortunadamente lo resolvieron a tiempo para la versión 3.34.1, que salió hace cuatro días, por lo que ya no es un problema

Por lo tanto, si estás utilizando Gnome Desktop y Gnome Shell 3.34.0, te recomiendo que actualices de inmediato a Gnome Shell 3.34.1, para asegurarse de que mis extensiones trabajen lo mejor posible.

Nueva versión de Cronopete y Terminus

Acabo de lanzar una nueva versión de Términus y de Cronopete.

En el caso de Términus era necesario por un problemilla al usar el modo «Guake» desde Wayland: dado que marca la ventana para que esté encima de todas las demás, los menús contextuales del botón derecho no se pueden ver. Esto es porque un menú va en una ventana independiente, y dado que la ventana principal está situada encima de absolutamente todas, también lo estará encima de la ventana del menú.

La solución consistió en utilizar un Gtk.Popover. Este widget es similar a un menú, pero en lugar de utilizar una ventana independiente se pinta directamente en la misma ventana que el widget padre. El inconveniente es que no se puede hacer aparecer en el punto donde esté el cursor del ratón (o, al menos, yo no he sido capaz de ello).

Por otro lado se supone que es posible construir un menú «de verdad» con un Gtk.Popover, pero yo no he sido capaz, así que no me quedó otra que construirlo con Gtk.Button directamente. El resultado, pese a todo, funciona bien.

A mayores hice algunos cambios pequeños en el código para eliminar algunos warnings por utilizar funciones obsoletas.

Respecto a Cronopete, aproveché para lanzar una nueva versión con un cambio que, aunque pequeño, hace más cómodo su uso: ahora, si se produce un aviso de que un fichero se ha «desvanecido», no aparecerá un popup de aviso. Este mensaje se produce porque Rsync hace primero una lista con los ficheros que va a copiar, y una vez que la tiene es cuando procede a copiarlos de uno en uno, por lo que si, después de haber hecho la lista, uno de los ficheros desaparece (se «desvanece»), emite un aviso. Este aviso no es crítico, por lo que no tiene sentido molestar al usuario.

Otro cambio que incluye es haber eliminado el fork del proceso principal: antes, por seguridad (y por una serie de problemas en las versiones anteriores) había dos procesos de cronopete: el principal, que es el que maneja todo, y un proceso watchdog que comprueba si el principal ha fallado y lo lanza de nuevo. Sin embargo, desde que cambié el sistema de copia para que utilice Rsync, esta precaución no es necesaria, y de hecho da algún que otro problemilla al apagar los equipos, cuando uno de los procesos se queda lanzado y no quiere morirse.

Como de costumbre, se pueden bajar ambos programas en distintos formatos desde mi página web.