Apuntes mientras aprendo sobre software y computadoras.

programación

Cómo usar la técnica Pomodoro en Linux usando Bash

En este apunte práctico voy a crear un programa. Mi objetivo es aprovechar la técnica Pomodoro en Linux, sin usar software o aplicaciones externas.

Entonces voy a crear un programa para la técnica Pomodoro usando solamente la terminal con un código escrito en Bash.

Pero una buena pregunta antes de continuar es ¿Qué es la técnica Pomodoro?

Bueno, en un resumen rápido, esa técnica sirve para utilizar mejor el tiempo que voy a dedicarle a una tarea. El asunto es poder concentrarme en algo por intervalos fijos de tiempo, separando cada intervalo por una pequeña pausa de descanso.

Básicamente la idea es esa.

Empiezo a hacer algo, por ejemplo empiezo a escribir este texto. Me concentro en eso por quince minutos con dedicación completa . Luego tomo cinco minutos de descanso, y terminada la pausa vuelvo a trabajar por otros veinte minutos. Y repito esto hasta completar mi objetivo, agregando en el medio algunos periodos de descanso más largos.

El código que sigue a continuación va a ayudarme a conseguir eso.

Una última cosa a tener en cuenta antes de empezar es que existen hay muchas formas de conseguir el mismo resultado. Y es posible que utilizando inteligencia artificial, consigamos muchas versiones de esta misma herramienta en Bash o en otros lenguajes.

A fin de cuentas todo esto es un ejercicio de aprendizaje práctico. Me interesa crear herramientas con código, pero al mismo tiempo quiero entender como funcionan.

Acompañame en esto y aprendamos en que forma podemos desarrollar este código.

¿Qué necesita este programa para ser efectivo?

Bueno, como ya dije, lo que necesito es poder concentrarme en una tarea por pequeños intervalos de tiempo.

Si bien para poder estar enfocado necesito aplicar fuerza de voluntad, hay algo para lo que usar solamente fuerza de voluntad pocas veces alcanza. Y ese algo es la internet.

Para que este programa funcione, necesito desconectarme de la red por al menos quince minutos. Y luego el programa tiene que volver a conectarme. Más todavía, es importante que el programa sea difícil de “apagar” para que no pierda la concentración antes de que los quince minutos terminen.

Lo verdaderamente complicado es que en Linux no existe nada que yo conozca que no pueda ser contrarrestado, si cuento con los permisos suficientes. Lo que quiero entonces es que se vuelva muy molesto interrumpir el programa antes de que el mismo termine.

Una primera versión del código

Con esta combinación de comandos puedo conseguir, al menos en principio, lo que estoy buscando:

nmcli networking off & sleep 900; nmcli networking on

Lo bueno de esa cadena de comandos es que no necesito crear un script de Bash para usarla. Puedo copiarlo y pegarlo en la terminal directamente para que funcione.

Pensado más detenidamente, es muy sencillo. Primero hay dos comandos que se activan en conjunto (por medio del conector “&”). Por un lado tengo el comando:

nmcli networking off

Según su manual:

NAME
nmcli – command-line tool for controlling NetworkManager

manual de nmcli

Esto es, nmcli es una herramienta de la terminal que sirve para controlar el manager de conexiones.

Al apagar y prender nmcli con “on/off” desactivo todas las interfaces que manejan la conexión a la red. Al desactivar el modem, pierdo conexión a internet.

Puede que esta no sea la mejor opción para desconectarme, pero cumple con lo que estoy buscando. No puedo navegar mientras esta herramienta se encuentra apagado.

Lo siguiente es el comando:

sleep 900

Sobre este comando, el manual me dice:

NAME
sleep – delay for a specified amount of time

Manual de sleep

Y lo que hace es dejar la terminal pausada por la cantidad de tiempo especificada. En este caso ese tiempo es 900 segundos o lo que es lo mismo, 15 minutos. Es verdad que se le puede especificar el tiempo en minutos con la opción “-m”… pero es más fácil de este modo, quiero agregar la menor cantidad de cosas extra.

Entonces con esa cadena de comandos: me desconecto de internet, la terminal espera quince minutos y luego vuelvo a re conectarme.

Bastante bien, pero puedo mejorar esto un poco más.

Segunda versión: Ahora con más molestias

Un problema del código anterior es que puedo des hacerlo fácilmente.

Si en cualquier momento lo cancelo y vuelvo a activar “nmcli”, voy a volverme a conectar a internet. Acto seguido voy a estar navegando redes sociales en lugar de completar mi objetivo y la técnica Pomodoro no va a servir de nada.

Para esta nueva versión lo que voy a tener que hacer es crear un nuevo documento. Este documento lo voy a llamar “pomodoro.sh” y lo voy a guardar en una carpeta creada para ese efecto.

El código que voy a usar es el siguiente:

#!/bin/bash

# Pomodoro rápido para la terminal
# Este código deshabilita la interfaz de red por un intervalo de 15 minutos.

# Reviso si el archivo de bloqueo existe o voy a crearlo.
archivo_bloqueo="/tmp/deshabilitar_red.lock"
if [ -f "$archivo_bloqueo" ]; then
  echo "El archivo de bloqueo ya existe."
  exit 1
else
  touch "$archivo_bloqueo"  
fi

# Establezco permisos más restrictivos en el archivo de bloqueo.
chmod 400 "$archivo_bloqueo"

# Deshabilito la interfaz de red.
nmcli networking off

# Muestra una cuenta regresiva de 15 minutos en la terminal.
for i in {900..1}; do
  printf "\rLa interfaz de red se volverá a habilitar en %d segundos..." "$i"
  sleep 1
done

# Vuelvo a habilitar la interfaz de red.
nmcli networking on

if [ -f "$archivo_bloqueo" ]; then
  # modifica el nombre del archivo creado al principio para borrarlo.
  chmod 600 "$archivo_bloqueo"
else
  echo "El archivo de bloqueo no existe."
fi

# Elimino el archivo de bloqueo.
rm "$archivo_bloqueo"

Y puedo cambiar los permisos para usarlo con el código:

chmod +rx pomodoro.sh

Para ejecutar el programa escribo:

./pomodoro.sh

Pero para usarlo de este modo tengo que encontrarme con la terminal en el directorio donde se encuentra el archivo. Para saber como ejecutar el comando desde cualquier directorio, te recomiendo leer esta entrada.

Hay algunas diferencias importantes con el código anterior. Para empezar esto es un script completo con varios lujos, no es una rápida cadena de comandos.

El programa tiene dos diferencias principales:

1- Solamente puedo usarlo una vez y tengo que esperar hasta que termine.

Cuando comienza el script, tengo el siguiente bloque de código:

#Reviso si el archivo de bloqueo existe o voy a crearlo.
archivo_bloqueo="/tmp/networking_disabled.lock"
if [ -f "$archivo_bloqueo" ]; then
echo "El archivo de bloqueo ya existe."
exit 1
else
touch "$archivo_bloqueo"
fi

Esto revisa si el archivo “deshabilitar_red.lock” existe en la carpeta “/tmp/”.

Si el archivo no existe lo crea y continua. Pero si el archivo existe, el programa termina.

La idea es que este archivo impide utilizar el programa varias veces seguidas, mientras el archivo “deshabilitar_red.lock” no puedo tratar de volver a conectar la red usando de nuevo el código.

Al mismo tiempo, transforma en una molestia el acto de cancelar el código mientras funciona, porque de hacerlo tendría que ir hasta el directorio “tmp” para buscar el archivo generado y borrarlo manualmente.

Y los permisos del archivo son modificados con:

chmod 400 "$archivo_bloqueo"

Para que borrarlo necesito si o si de permisos extra. Doblemente molesto.

Al terminar el programa, otra función se encarga de borrar el documento para empezar desde cero cuando vuelva a invocar al programa.

2- Ahora el programa me dice cuanto tiempo me queda para enfocarme en mi objetivo:

Ahora la función encargada en volver a reactivar la red es:

for i in {900..1}; do
printf "\rLa interfaz de red se volverá a habilitar en %d segundos…" "$i"
sleep 1
done

Por esto, en la terminal me aparece un mensaje que me indica en cuantos segundos voy a volver a tener internet.

Este recordatorio hace que se me vuelva más fácil concentrarse, porque nos recuerda que es un intervalo corto y nos ayuda a mantenernos enfocados.

¿Cómo se puede mejorar el código?

Creo que el verdadero problema que tiene el programa es que puede deshabilitarse por medio del comando:

nmcli networking on

Si utilizo ese comando desde otra terminal, vuelvo a “prender” internet.

Eso se podría resolver cambiando el nombre del comando “nmcli”, para que no pueda saber cómo invocarlo.

Antes de continuar, tengo que conocer donde se encuentra el directorio con el comando “nmcli”. Eso lo hago con el comando “which” que enseña el camino al directorio:

which nmcli
/usr/bin/nmcli

Entonces si cambio el nombre del directorio por algo compilado, de esta forma:

sudo mv /usr/bin/nmcli /usr/bin/sfsfirjjjkxoyuojir5rehtg

Al hacer eso necesitaría escribir “sfsfirjjjkxoyuojir5rehtg” para invocar al comando “nmcli”, lo que convertir la actividad en algo ultra molesto.

Luego podría deshacer el cambio con:

sudo mv /usr/bin/sfsfirjjjkxoyuojir5rehtg /usr/bin/nmcli

¿Por qué no agrego esto al programa completo?

Aunque puede funcionar para que se vuelva más fácil de cumplir el intervalo de quince minutos, también modifica un directorio importante del sistema.

Además necesito interrumpir el flujo del programa para agregar mi contraseña al invocar “sudo” lo que lo hace menos automático.

Por eso aunque creo que puede funcionar, prefiero no hacerlo y confiar al menos en un grado en mi autocontrol para no reiniciar el contador y volver a activar internet.

Conclusión:

Este es mi primer intento para crear un programa Pomodoro en la terminal de Linux.

Tal vez puedas usar el código como base para crear algo mejor. Incluso probar agregarle mejoras con una inteligencia artificial permite construir algo complejo de una forma bastante rápida.

En lo que a mi respecta, aprendí mucho creando todo. Espero que te sirva de utilidad, y si te interesa decir algo sobre esto espero tus comentarios o mensajes por correo electrónico.

La seguimos en el siguiente apunte.

Leave a Reply