Mi primera sesión de Biodanza

El domingo 8 de marzo a las seis de la tarde en la sala de la Fundación Pueblos Hermanos (calle Laurel 6 de Madrid) facilité mi primera sesión de Biodanza, acompañado por mi querida amiga Alphonsine y supervisados por David Díez, el director de nuestra escuela, la Escuela de Biodanza Madrid Centro.

Fue una sesión de presentación de la Biodanza a personas interesadas en conocer o saber más de esta técnica de desarrollo personal, varias de las cuales no habían tenido aún ningún contacto con la Biodanza. Estuvo enfocada en danzas y ejercicios para el disfrute del propio ser, buscando recuperar la sana sensación de estar a gusto con lo que somos y hacemos.

Creo que fue una experiencia interesante y agradable, tanto para mí como para todas las personas presentes.

Instalar VirtualBox en Windows fuera del directorio por defecto

Si queremos instalar VirtualBox (versión 7.2.4) en un directorio que no sea el que muestra por defecto (C:\\Program Files\Oracle\VirtualBox) veremos que al hacerlo nos muestra un error:

Esto sucede porque Oracle ha decidido que solamente se pueda instalar VirtualBox en un directorio en el que solo tengan acceso de escritura los administradores, por lo que instalarlo en otra partición o en un disco externo no está permitido.

Para solucionarlo, podemos crear un enlace desde Program Files al directorio en el que queramos instalar VirtualBox, de la manera siguiente:

  1. Abrimos un terminal (no PowerShell, solo nos sirve el cmd) en modo administrador.
  2. Creamos un enlace desde el directorio Program Files hacia la carpeta donde queremos instalarlo (en mi caso, en D:\\)
cd "C:\\Program Files"
mklink /J VirtualBoxLink D:\\VirtualBox

Ahora lanzamos el instalador, y cuando nos solicite el directorio de instalación, seleccionamos C:\\Program Files\VirtualBoxLink.

La instalación, ahora, finalizará sin problemas de permisos.

Convertir m4a a mp3

Un par de comandos en bash nos convierten todos los archivos de un directorio en formato m4a al formato mp3. Nos situamos dentro de la carpeta que contiene las canciones en m4a y ejecutamos:

mkdir ../music_mp3
for f in *.m4a; do ffmpeg -i "$f" -codec:v copy -codec:a libmp3lame -q:a 2 ../music_mp3/"${f%.m4a}.mp3"; done

Solución que me encontré en: https://stackovercoder.es/superuser/704493/ffmpeg-convert-m4a-files-to-mp3-without-significant-loss-of-information-quality-automated-bitrate

Eliminar las entradas antiguas de arranque en el UEFI

Los que solemos instalar habitualmente distribuciones Linux para probar o simplemente por cambiar de entorno hay algo que debemos hacer periódicamente: limpiar las entradas que se han grabado en el boot del UEFI y que siguen ahí aunque la distribución que las incluyó ya no existe en el disco. No es que hagan mucho daño, pero si mantenemos limpito nuestro sistema de arranque, mejor que mejor.

Para ello tenemos que tener instalada la utilidad «efibootmgr», la cual está presente en todas las distribuciones principales de Linux, por lo que se podrá instalar directamente del sistema de paquetes que corresponda, por ejemplo en Fedora/Red Hat sería:

sudo dnf install efibootmgr

Una vez instalada, la ejecutamos abriendo un terminal y lanzando el comando:

efibootmgr

El cual nos dará un listado de las entradas que tenemos grabadas en este momento. Por ejemplo, en mi caso me listó lo siguiente:

Terminal Linux en el que se observa la salida de pantalla del comando efibootmgr

Información interesante que aparece:

En la primera línea tenemos el BootCurrent, que nos dice cuál de las entadas listadas a continuación es la actualmente seleccionada para arrancar en primer lugar.

En segundo lugar aparece el Timeout, que es el tiempo en segundos que el boot espera antes de arrancar. En mi caso, como solo tengo un sistema operativo instalado, la tengo a 0 segundos.

En tercer lugar se muestra el BootOrder, que es el orden en el que se va a arrancar el sistema. En el ejemplo solo aparece el boot 0001 porque no hay más orden de arranque, solo tengo un sistema operativo instalado y disponible. Si tuviera más, me aparecería el número correspondiente a cada uno a continuación (0008, 0004….) en el orden en el que se hubieran seleccionado para arrancar.

Las entradas que aparecen con un «*» a continuación de su etiqueta es porque aún están activas, aunque no sea posible utilizarlas. Esto es así porque la desinstalación de un sistema operativo ni elimina lo que tiene el boot UEFI ni lo modifica. Es por eso por lo que conviene de vez en cuando revisar que no se nos van quedando cosas obsoletas en él.

Para eliminar una entrada, por ejemplo en mi caso las distribuciones Linux que usé pero que ya no existen, lanzamos como root el comando:

efibootmgr -b 0008 -B

El cual elimina la entrada etiquetada como Boot0008, que corresponde a un antiguo OpenSUSE que estuve probando. Para el resto de entradas que no queramos mantener, se haría exactamente igual.

 

Error: mysql_secure_installation command not found

Cuando se instala el gestor de bases de datos MariaDB, una de las primeras cosas que se suele hacer es ejecutar el script mysql_secure_insallation, que permite aumentar la seguridad de la instalación de varias formas, como podemos leer en la página correspondiente de la documentación de MySQL.

Como dicho script tiene su origen en MySQL, como es evidente por su nombre, los desarrolladores de MariaDB decidieron a partir de la versión 10.5 que mejor creaban su propio script, que es mariadb-secure-installation. Aunque en su página de documentación dicen que aún puede ejecutarse dicho script usando el nombre original, porque hay un enlace simbólico que relaciona ambos scripts, lo cierto es que si, por ejemplo, instalas Debian 12 de la rama testing, dicho enlace no existe, por lo que es posible que nos surja cierto desconcierto al no encontrar un script tan conocido y usado. Que al renombrar dicho script no solo se haya cambiado el nombre mysql por el de mariadb, sino que también se hayan sustituido los guiones bajos por guiones normales, no ayuda mucho a la hora de encontrar este nuevo script.

Así que habrá que acostumbrarse al nuevo nombre y ejecutar mariadb-secure-installation cada vez que instalemos una nueva inistancia de MariaDB.

Esqueleto de aplicación web con Codigniter 4 y Shield

Caso todos los framework de PHP, al menos los más populares, tienen una forma más o menos automatizada de comenzar una aplicación web desde cero formando un esqueleto de código utilizable para, a partir de él, comenzar a programar el resto de la aplicación.

En el caso del framework Codeigniter, suponiendo que ya tenemos montado un entorno LAMP donde trabajar, en el cual tengamos además instalado el programa Composer para la gestión de dependencias, el proceso para hacerlo sería el siguiente:

En el directorio raíz de nuestro servidor web, creamos el esqueleto básico de la aplicación usando Composer, con el siguiente comando:

composer create-project codeigniter4/appstarter shield

Esto nos genera una carpeta de nombre shield en la que se ha instalado el código base de Codeigniter 4.

A continuación modificamos el nombre del archivo env, que se encuentra en el primer nivel de directorios de dicha carpeta, llamándole .env

Abrimos ese archivo y modificamos la línea donde se especifica la url base de la aplicación, poniendo la que corresponda a la nuestra. Es muy recomendable crear un host virtual en nuestro servidor web, que en este caso podría llamarse shield.local. La línea quedaría entonces:

app.baseURL = 'http://shield.local'

A continuación tenemos que incluir la información necesaria para hacer la conexión a nuestra base de datos, editando el archivo app/Config/Database.php en el que modificaremos la definición de la variable $default para que quede:

 public array $default = [
        'DSN'          => '',
        'hostname'     => 'localhost',
        'username'     => '<mi_usuario>',
        'password'     => '<mi_password>',
        'database'     => '<mi_database>',
        'DBDriver'     => 'MySQLi',
        'DBPrefix'     => '',
        'pConnect'     => false,
        'DBDebug'      => true,
        'charset'      => 'utf8mb4',
        'DBCollat'     => 'utf8mb4_general_ci',
        'swapPre'      => '',
        'encrypt'      => false,
        'compress'     => false,
        'strictOn'     => false,
        'failover'     => [],
        'port'         => 3306,
        'numberNative' => false,
        'dateFormat'   => [
            'date'     => 'Y-m-d',
            'datetime' => 'Y-m-d H:i:s',
            'time'     => 'H:i:s',
        ],

Con esto ya tendríamos una aplicación funcionando, a la cual se puede acceder entrando en la dirección que corresponda a nuestra aplicación, por ejemplo http://localhost/shield o http://shield.local si hemos definido un host virtual.

Un complemento muy interesante de Codeigniter es Shield. Con él, podemos dotar a nuestra aplicación de funcionalidades de autenticación y autorización de forma muy sencilla. Podemos instalarla mediante Composer ejecutando dentro del directorio raíz de nuestra aplicación losl comandos:

composer require codeigniter4/shield
php spark shield:setup 

Una vez que se ejecutan estos comandos sin error, podemos visitar la página de login que se nos ha creado en http://appStarter.local/login

Si, por ejemplo, queremos que los que usen la aplicación estén obligados a identificarse antes de usarla, no tenemos más que entrar en el fichero app/Config/Filters.php y en la definición de la variable $globals poner qué páginas se pueden visitar sin estar autenticado, que serían solamente aquellas relacionadas con el proceso de identificarse o darse de alta. El archivo quedaría como vemos a continuación, donde la línea a incluir aparece macada en negrita:

    public array $globals = [
        'before' => [
            // 'honeypot',
            // 'csrf',
            // 'invalidchars',
            'session' => ['except' => ['login*', 'register', 'auth/a/*', 'logout']],
        ],
        'after' => [
            'toolbar',
            // 'honeypot',
            // 'secureheaders',
        ],
    ];

De esta forma, si navegamos de nuevo a la dirección inicial de nuestra aplicación. http://shield.local, veremos que nos dirige automáticamente a la página de login.

En la web de Codeigniter podemos consultar más información sobre el uso de Codeigniter y Shield.

Cómo desinstalar Recall en Windows 11

Recall («Recuerda») es el nuevo explorador de contenidos de Microsoft que se instalará automáticamente en todos los equipos con Windows 11, previsiblemente a finales de año o al menos a partir de la actualización 24H2. La aplicación Recall es un paso más en la utilización de la IA en nuestros equipos personales, recopilando prácticamente todo lo que hacemos, tanto en texto como en imagen, para posteriormente poder utilizarlo para hacer búsquedas más eficaces y utilizando un lenguaje natural, en lo que han venido a llamar «AI Explorer«.

Recall solo puede instalarse en los equipos más modernos, que tengan al menos 16 GB de RAM y un procesador compatible, algo que por ahora tienen muy pocos equipos. Es evidente que un uso tan intensivo de búsqueda en nuestra labor diaria tiene que tener un coste energético y presentar un problema evidente de privacidad, ante lo que Microsoft afirma que Recall solo trabaja en el entorno local y que la información que se recopila no se utiliza fuera de los equipos.

Hay que reconocer que muchas personas pueden ver esta herramienta útil y aceptar los inconvenientes que presenta, pero en el caso de que no te convenza o no le veas utilidad, la posibilidad de desinstalarla en modo gráfico no parece que vaya a estar disponible. Sin embargo, puede desinstalarse usando la terminal en modo administrador de la siguiente manera:

Dism /Online /Get-Featureinfo /Featurename:Recall

El comando anterior nos devuelve si tenemos o no instalado Recall en nuestro ordenador. Si no lo tuviéramos nos mostrará la siguiente información:

Si la tenemos instalada y queremos desinstalarla el comando para hacerlo es:

Dism /Online /Disable-Feature /Featurename:Recall

Como podemos ver en la salida del primer comando, para ver todas las características o «features» que tenemos instaladas, tecleamos:

Dism /Online /Get-Features

La salida es extensa y en ella aparecen todas las «características» instaladas, tanto las habilitadas como las deshabilitadas.

Gracias a @hareldan@mapstodon.space por publicar el truco

Cambiar la resolución en Ubuntu Server

Después de instalar Ubuntu Server 24.04 LTS en mi servidor de pruebas, la resolución del terminal por defecto (no hay entorno gráfico, solo modo terminal) mostraba caracteres demasiado grandes y resultaba incómodo. Para cambiar la resolución por defecto podemos hacerlo modificando el fichero /etc/default/grub descomentando el comando que establece la resolución del terminal. El proceso sería el siguiente:

  1. Abrimos el fichero /etc/default/grub como root con un editor de texto.
  2. Localizamos la línea que pone «GRUB_GFXMODE…»
  3. La descomentamos quitando el carácter «#» al inicio y ponemos la resolución que queremos, por ejemplo en mi caso la línea queda «GRUB_GFXMODE=1024×768»
  4. Guardamos el fichero
  5. Ejecutamos el comando «sudo update-grub»
  6. Reiniciamos el ordenador

Actualizar las conexiones de datos de una serie de hojas Excel con Python

Si tenemos una serie de hojas Excel en las que se han incorporado conexiones a bases de datos, y queremos que se actualice el contenido de las mismas para que aparezca reflejada la última información cuando se aceda a ellas, podemos hacerlo de varias maneras: podemos, por ejemplo, definir esas conexiones de forma que se actualicen cuando se abra la hoja de cálculo, pero si la actualización es lenta porque se accede a muchas tablas o se actualiza mucho contenido, provoca que haya que esperar un buen rato desde que se abre la hoja hasta que se puede empezar a trabajar con ella; podemos también ir entrando en cada una y pulsando en «Actualizar datos», pero esto puede llegar a ser tedioso si son muchas hojas las que hay que actualizar; otra manera sería con macros o VB, pero las primeras son una tecnología a abandonar, y puestos a hacerlo por programa, a mí me gusta más en Python, utilizando la función que muestro a continuación, con comentarios que explican cada uno de los pasos:

# Importamos las librerías necesarias para la ejecución
import os
import win32com.client

# Especificamos el directorio que contiene los archivos Excel
ruta_directorio = "C:\Mis Programas\"

#
# Función para la actualización automática de las conexiones de datos
#
def actualizar_conexiones(directorio):

    # Creamos una instancia de la aplicación Excel
    excel_app = win32com.client.Dispatch("Excel.Application")

    # Hacemos la aplicación invisible para el usuario
    excel_app.Visible = False

    # Recorremos todos los archivos en el directorio especificado
    for filename in os.listdir(directorio):
        # Abrir solo hojas de cálculo, evitando los archivos ocultos
        if (filename.endswith(".xlsx") or filename.endswith(".xlsm")) and not filename.startswith("~"):
            file_path = os.path.join(directorio, filename)
            print(f"Actualizando conexiones de datos en: {file_path}")

            # Creamos un libro excel en memoria con la ruta del archivo
            workbook = excel_app.Workbooks.Open(file_path)

            try:
                # Recorremos todas las conexiones de datos del libro
                for connection in workbook.Connections:
                    print(f"Habilitando contenido: {connection.Name}")
                    connection.Refresh()
                    # Para hacer esperar la ejecución hasta que termine
                    # la actualización de datos:
                    excel_app.CalculateUntilAsyncQueriesDone()
                    # Para evitar que se abran ventanas de diálogo que 
                    # pararían el proceso:
                    excel_app.DisplayAlerts = False

            except Exception as e:
                print(f"Error al actualizar la conexión")

            finally:
                # Guardamos y cerramos el libro
                workbook.Save()
                workbook.Close()

    # Cerramos la aplicación Excel 
    # Ojo, no es lo mismo que cerrar el libro excel creado
    excel_app.Quit()

    print("Actualización de conexiones de datos completada.")


# Llamada a la función para actualizar las conexiones de datos
actualizar_conexiones(ruta_directorio)

Cómo iniciar Linux sin entorno gráfico por defecto con systemd

Si tenemos un ordenador con una distribución Linux que arranca con systemd, podemos muy fácilmente conseguir que el inicio sea en modo gráfico o no, simplemente activando el servicio que corresponda.

Primero buscaremos qué gestor de pantallas se está utilizando, para eso en un terminal lanzamos el comando

cat /etc/X11/default-display-manager

El cual nos mostrará por pantalla si nuestro sistema usa gdm (lo normal en Gnome), kdm (utilizado por KDE) o sddm (usado en KDE Plasma). En mi caso me muestra «/usr/bin/sddm» porque estoy usando Debian 12 con KDE.

Para confirmar que el servicio que tenemos que modificar es el correcto lanzamos en un terminal el comando:

sudo systemctl status | grep sddm

El cual nos mostrará, si tenemos el servicio activado, algo como lo siguiente:

Al estar el servicio «enabled» se arranca automáticamente al iniciar el sistema, que lo hará, por lo tanto, en modo gráfico. Para desactivarlo, solo tenemos que lanzar el comando:

sudo systemctl disable sddm.service

De esta manera cuando arranquemos la próxima vez no se cargará el gestor de pantallas y podremos iniciar sesión directamente en modo consola.

Si en un momento dado queremos volver a estar en modo gráfico, solo tenemos que lanzar el comando:

sudo systemctl start sddm.service

Y nos aparecerá la ventana de inicio de sesión de sddm.

Más información en:

https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units-eshttps://wiki.debian.org/es/GDM