Newbies
-
Activar diferentes versiones de PHP en CentOS { Notas de Laboratorio }
Problema
- Por temas de desarrollo se requiere temporalmente activar una versión de php diferente a nivel global en un sistema CentOS
Solución Utilizada
DNF es el sistema de gestión de paquetes en Fedora (instalar/remover software del sistema), soporta la activación de módulos de paquetes con versiones específicas, permitiendo (p.ejp) usar distintas versiones de un lenguaje de programación sin tener problemas de dependencias:
- abrimos una terminal de comandos y revisamos las versiones disponibles de php:
- dnf module list php
- dnf module list php
- como es posible que se tenga otra versión seleccionada, primero se hace un reset:
- dnf module reset php
- dnf module reset php
- se especifíca la version requerida (p.ejp 7.4) y se instala:
- dnf module install php:7.4/common
- dnf module install php:7.4/common
- se puede confirmar la versión
- php --version
- php --version
- si se desea volver a la versión anterior por defecto, se puede repetir el procedimiento para la versión específica requerida.
Este procedimiento es muy útil para trabajar con versiones distintas de herramientas como nodejs, ruby, httpd, mariadb, maven, perl, python, postgresql y es una alternativa práctica a las SCL (Software Collections)
Imagen Original (CC Atribución)//man dnf: Module Command, server-world.info
-
git fetch vs. git pull {Notas de Laboratorio}
Problema
- ...no recuerdo si hago
git fetch
ogit pull
sobre mi repositorio 😵 (nota para mi subconsciente ooome!)
Solución Utilizada
- El objetivo es actualizar mi repositorio local con los cambios de nuestro repositorio remoto, ambas opciones cumplen esa función pero hay diferencias:
git fetch
descarga los nuevos commits del repositorio remoto pero NO hace un merge en nuestra rama local de trabajo (más seguro)git pull
descarga los nuevos commits del repositorio remoto y AUTOMÁTICAMENTE hace un merge sobre nuestra rama local de trabajo, puede causar conflictos si no estamos seguros de lo que hacemos (tenemos sueño o nos encontramos en algún estado alterado de consciencia)
- Un flujo de trabajo normal sería:
git fetch origin
...revisa cambios remotosgit diff origin/main
...¿qué ha cambiado?git merge origin/main
...cuando estemos seguros hacemos el correspondiente merge
Imagen Original (CC Atribución): https://flic.kr/p/91DVuV
- ...no recuerdo si hago
-
Nómadas Digitales: Termux ...varias sesiones en una misma terminal { Notas de Laboratorio }
Termux es uno de los mejores emuladores de terminal para android, por si mismo se merecería una serie completa de publicaciones.
Con las resoluciones de pantalla, prestaciones y conectividad de los smartphones actuales, realmente permite llevar una estación de trabajo en el bolsillo...bueno, al menos para quienes se sienten cómodos trabajando desde consola y desde luego atendiendo temas que no requieran gran sofisticación (los clásicos incendios...mover palancas para que la cosa siga andando).
Es un proyecto estable, muy bien documentado, pero es normal que aparezcan detalles que...de primera mano no son evidentes. Lo reconozco, el manual se lee al final, después de perder minutos valiosos, literalmente con el incendio en la mano (eso sí: ¡se puede acabar el mundo, pero la música de la primera sesión debe continuar!).
Problema:
- ¿Cómo se tienen varias sesiones abiertas en la misma terminal?
Solución utilizada:
- ...arrastre la pantalla de izquierda a derecha y escoja "NEW SESSION" 🙃🙃🙃
No me siento orgulloso al reconocerlo, pero esa característica estaba documentada y perdí varios minutos valiosos detectando su uso.
Pensándolo bien, evidencia que la aplicación esta muy bien lograda, ya que el manual sólo se lee cuando las cosas no son evidentes (al menos para un newbie).
Me recuerda una historia que alguna vez escuche por ahi...alguien, tal vez no muy amable, o mejor, con la calidez humana tipo IT Crowd, le hizo un comentario, a una madre entusiasmada por las capacidades de expresión digital de su pequeño cuando este jugaba con una tablet:
Señora, no es que su hijo sea un genio, lo que pasa es que los ingenieros hicieron tan bien su trabajo que cualquier imbécil puede usarla como un maestro.
...no quiero saber que les respondió la señora, lo que sí se, es que no fué un comentario mal intencionado. Traduciendo desde lenguaje nerd a-social antiguo: me alegra mucho que tu hijo disfrute la tablet, los ingenieros de esa marca son unos genios, ustedes hicieron una buena compra, ¡mire cómo su hijo sin ser un doctor en ciencias de la computación hace cosas tan sorprendentes! 😁.
Creo que seguiremos hablando de truquitos usando Termux (al menos para que no se me olviden 😎).
-
Pomodoro en Bash en menos de 100 líneas (newbies)
Cuando se tienen muchas cosas que hacer, a veces no se sabe por donde empezar, se arma un interbloqueo y hasta aparece la procrastinación. Una técnica de trabajo que apoya esa situación es la del Pomodoro. Se fraccionan las tareas en ciclos de al menos 25 minutos (divide y vencerás), donde se ejecuta sólo una tarea, con toda la concentración del mundo (está demostrado que el multitasking en los seres humanos es puro cuento...bueno las mujeres pueden hacerlo, pero no es la norma 😜😇). Al finalizar el día si se hace responsablemente la labor, el nudo comenzará a simplificarse, desde luego conviene llevar un registro, lo que en sistemas de software sería un log.
Hay una infinidad de aplicaciones para trabajar Pomodoro, sin embargo, por puro placer y como ejercicio práctico para el aprendizaje de Bash y conceptos básicos de programación, publicamos un Pomodoro en menos de 100 líneas de código en Bash. Quién aprenda a manejar realmente este sistema de scripting y una Terminal Linux, tendrá una ventaja competitiva en los sistema industriales de software actuales.
Todo arranca con un comando básico y sencillito:
sleep 1
El comando sleep es nativo de la consola de Linux que nos detiene la ejecución de un script, en este caso precisamente por un segundo. Si se puede hacer eso podemos organizar un loop (ciclo repetitivo) que nos cuente hasta un minuto:
for (( SECSCount=1; SECSCount<=60; SECSCount++ ))
do
tput clear
print_timer " $(($MINS-$MINSCount)) Minutes " "$((60-$SECSCount)) Seconds to rest... " "$(tput lines)" "$(tput cols)"
sleep 1
doneSe tiene un ciclo para 60 segundos, en cada paso se limpia la pantalla, se imprimen los minutos, segundos, no hay que dejarse despistar por tput que es un comando que permite manejar los parámetros de comportamiento de la terminal:
tput lines retorna el número de líneas disponiblesn en la terminal actual tput cols retorna el número de columnas disponibles en la terminal actual tput clear limpia la pantalla tput bold coloca los caracteres de la terminal en negrilla tput cut Y X posiciona el cursor de la pantalla en la coordenada X, Y (filas, columnas) tput setaf cambia color del fondo del texto tput rev invierte el coloreado de los caracteres (color en fondo y no en las letras) tput sgr0 reinicia los parámetros de la terminal (si no se usa al terminar la ejecución, la terminal queda con otros colores...) tput civis oculta el cursor de la terminal tput cnorm muestra de nuevo el cursor y print_timer es una función creada al inicio del script para imprimir el reloj (el letrero en pantalla con los minutos y segundos...después la miramos), esta función recibe como parámetros encerrados en comillas dobles, el contador de los minutos, el contador de los segundos, el tamaño en filas y en columnas de la terminal. El objetivo es que el reloj siempre se presente en el centro de la pantalla.
Cómo estámos contando el tiempo en reversa (si tenemos 25 minutos para el pomodoro, vamos hacia atrás hasta llegar a cero...), a 60 le restamos los segundos del contador y a los minutos totales, le restamos los minutos del contador de minutos de nuestro script (...así se hace un ciclo repetitivo for en bash...¡vamos! quién sepa programar en Bash no estaría leyendo este contenido, por eso lo aclaramos).
Bueno, pero un minuto tiene 60 segundos, luego el anterior ciclo debería estar en otro externo para contar minutos y segundos:
for (( MINSCount=1; MINSCount<=$MINS; MINSCount++))
do
for (( SECSCount=1; SECSCount<=60; SECSCount++))
do
tput clear
print_timer " $(($MINS-$MINSCount)) Minutes " "$((60-$SECSCount)) Seconds to rest... " "$(tput lines)" "$(tput cols)"
sleep 1
done
doneEl ciclo externo cuenta los minutos, el interno los segundos. $MINS es una variable que guarda el primer parámetro recibido desde la consola de Linux por nuestro script.
Hay que aclarar que en la terminal del sistema, nuestro script se ejecuta asi:
./chontoBash.sh NumMinutesToWork "My Task to work in double quotes..."
el ./ le indica al sistema Linux que ejecute el script chontoBash.sh del directorio actual, NumMinutesToWork...simplemente es un número de minutos a contar, "My Task to work in double quotes..." es la tarea que se registrará como ejecutada. Entonces se reciben dos parámetros, que dentro del script se validan asi:
if [[ $# != 2 ]]; then
tput bold; echo Error in arguments...; tput sgr0;
echo
print_help
exit 1
fiif ! [[ $1 =~ ^[0-9]+$ ]]; then
tput bold; echo...how many minutes do you like to work?; tput sgr0;
echo
print_help
exit 1
fiTenemos dos comparaciones, el primer if valida que desde la terminal de linux nos entreguen (2) dos parámetros, el segundo if valida que el primer parámetro sea un número entero. Son validaciones básicas, obviamente se pueden mejorar. Si ocurre alguna de las dos exepciones el programa termina con exit 1 (programa o script aquí son sinónimos...ya ves tú, estás programando en Bash).
Una función en Bash se crea así:
print_help (){
echo USAGE FROM TERMINAL:
echo ./chontoBash.sh NumMinutesToWork \"My Task to work in double quotes...\"
echo If not exist, chonto will create the log file log.chonto, csv file to make data analytics:
echo "TimeStamp, TotalMinutes, Task worked..., status: completed (FULL) or incomplete task (BREAK)"
echo "TimeStamp, TotalMinutes, Task worked..., status: completed (FULL) or incomplete task (BREAK)"
echo "TimeStamp, TotalMinutes, Task worked..., status: completed (FULL) or incomplete task (BREAK)"
echo .
echo .
echo .
}La ventaja es que para imprimir en pantalla todas estas líneas con el comando echo, una vez creada la función, sólo tengo que llamarla: print_helpcuántas veces quiera (el nombre de la función tu te lo inventas), esto ahorra trabajo, y mejora la organización del script.
Las otras funciones del script son:
log_chonto_break (){
end_time=$( date '+%s' )
echo $(date +"%F %H:%M:%S"), $((($end_time - $1) / 60)) Mins, "$2", BREAK >> log.chonto
mplayer glass.ogg > /dev/null 2>&1
tput clear
echo "Unfinished task logged :("
tput cnorm
exit 1
}log_chonto (){
end_time=$( date '+%s' )
echo $(date +"%F %H:%M:%S"), $((($end_time - $1) / 60)) Mins, "$2", FULL >> log.chonto
mplayer glass.ogg > /dev/null 2>&1
tput clear
echo "Task finished logged :)"
}print_timer (){
#center the timer text, centering the cursor in Y/2:X/2-((text length)/2)
tput cup $(($3/2)) $((($4/2)-($(expr length "$1 $2")/2)))
tput bold; tput setaf $((1 + RANDOM % 10)); tput rev; echo "$1$2"; tput sgr0;
}print_timer se encarga de centrar el cursor calculando primero el tamaño del reloj (cuántas letras tiene nuestro reloj para que quede centrada, verticalmente y horizontalmente), el RANDOM con el módulo es para jugar los colores de impresión en pantalla, hace que cada segundo estos cambien.
log_chonto detiene el reloj y registra en el archivo log.chonto la tarea terminada. La magia de los dos >> actúa como una redirección de los datos, permite que si el archivo log.chonto no existe se cree, y si existe agregue la linea de registro al final del mismo. Registrando en esa línea, la marca de tiempo, el tiempo ejecutado en minutos, el texto descriptivo de la tarea, la palabra FULL indica que la tarea se ejecutó en su totalidad...que no se oprimió CTRL + C.
¿Qué pasa con el CTRL+C? que hay que capturarlo y asociarle una función que se ejecutará cuando ocurra. Esa función es log_chonto_break, hace lo mismo que log_chonto, pero registra en log.chonto la palabra BREAK para indicar que NO se terminó la tarea, junto con el tiempo parcial ejecutado. El programa termina con el correspondiente aviso en terminal de carita triste: echo "Unfinished task logged :("...log_chonto por el contrario SI imprime carita feliz.
La interrupción de CTRL+C se captura así:
trap 'log_chonto_break "$start_time" "$2"' SIGINT
¡Ahhh bueno!...hay que tener mplayer instalado (búscalo en tu distribución de Linux preferida), para reproducir la campanita al terminar, para eso es el archivo de sonido glass.ogg
trap (comando nativo de Bash) recibe como parámetro el nombre de la función a ejecutar (log_chonto_break), pero esta función a su vez recibe como parámetros el tiempo de inicio registrado y el nombre de la tarea que se le envío por consola a nuestro script...almacenado en la variable $2.
Para anotar: si un script recibe tres parámetros estarían internamente guardados en $1 $2 $3. A su vez cuando una función como las que mostramos, recibe parámetros, para ella quedarían guardados en $1, $2, $3...etc. y sólo existirían en su espacio de función, por eso los corchetes. Es como una caja negra, un script, dentro de un script.
Al ejecutar un script, estas funciones no se ejecutarían automáticamente, sólo lo harían cuando se llamen explícitamente, entonces, las primeras líneas reales de ejecución de nuestro programa (obviando los if de validación), serían:
MINS=$1
start_time=$( date '+%s' )En $MINS queda guardado nuestro primer parámetro recibido desde la terminal Linux, los minutos a ejecutar (hay que usar el símbolo $ cuando se quiera llamar su contenido), y start_time arranca nuestro reloj. Si todo sale bien, la última línea de ejecución es:
log_chonto "$start_time" "$2"
Es un llamado a la función de guardado en log.chonto, que recibe como parámetros el tiempo de inicio y el nombre de la tarea. El archivo log.chonto es un archivo separado por comas, que puede usarse en otros sistemas (hasta en el mismo office...bueno, mejor LibreOffice) para generar analíticas.
El script completo sería el siguiente:
#!/bin/bash
print_help (){
echo USAGE FROM TERMINAL:
echo ./chontoBash.sh NumMinutesToWork \"My Task to work in double quotes...\"
echo If not exist, chonto will create the log file log.chonto, csv file to make data analytics:
echo "TimeStamp, TotalMinutes, Task worked..., status: completed (FULL) or incomplete task (BREAK)"
echo "TimeStamp, TotalMinutes, Task worked..., status: completed (FULL) or incomplete task (BREAK)"
echo "TimeStamp, TotalMinutes, Task worked..., status: completed (FULL) or incomplete task (BREAK)"
echo .
echo .
echo .
}log_chonto_break (){
end_time=$( date '+%s' )
echo $(date +"%F %H:%M:%S"), $((($end_time - $1) / 60)) Mins, "$2", BREAK >> log.chonto
mplayer glass.ogg > /dev/null 2>&1
tput clear
echo "Unfinished task logged :("
tput cnorm
exit 1
}log_chonto (){
end_time=$( date '+%s' )
echo $(date +"%F %H:%M:%S"), $((($end_time - $1) / 60)) Mins, "$2", FULL >> log.chonto
mplayer glass.ogg > /dev/null 2>&1
tput clear
echo "Task finished logged :)"
tput cnorm
}print_timer (){
#center the timer text, centering the cursor in Y/2:X/2-((text length)/2)
tput cup $(($3/2)) $((($4/2)-($(expr length "$1 $2")/2)))
tput bold; tput setaf $((1 + RANDOM % 10)); tput rev; echo "$1$2"; tput sgr0;
}if [[ $# != 2 ]]; then
tput bold; echo Error in arguments...; tput sgr0;
echo
print_help
exit 1
fiif ! [[ $1 =~ ^[0-9]+$ ]]; then
tput bold; echo...how many minutes do you like to work?; tput sgr0;
echo
print_help
exit 1
fiMINS=$1
start_time=$( date '+%s' )tput civis
trap 'log_chonto_break "$start_time" "$2"' SIGINT
for (( MINSCount=1; MINSCount<=$MINS; MINSCount++))
do
for (( SECSCount=1; SECSCount<=60; SECSCount++))
do
tput clear
print_timer " $(($MINS-$MINSCount)) Minutes " "$((60-$SECSCount)) Seconds to rest... " "$(tput lines)" "$(tput cols)"
sleep 1
done
donelog_chonto "$start_time" "$2"
Todo el script se encuentra en https://github.com/Open-SAI/ChonToPom obviamente es libre, más que libre esta bajo una licencia MIT.
El nombre de Chonto...ya se imaginarán por qué es. Pomodoro en italiano es tomate, en estas tierras hay tomate...chonto, el software libre da la libertad de crear tecnología y cuando se hace, uno le pone el nombre que quiera, así también se exporta cultura.
-
Reset Moodle Contraseña de Administración vía CLI {Notas de Laboratorio}
Problema
- Tengo una instalación de Moodle y no encuentro la clave de administración...la he olvidado 😵
Solución Utilizada
- Moodle tiene varias utilidades administrativas que funcionan desde la terminal linux de lado del servidor
- accedemos a la instancia que aloja nuestro Moodle (...se recomienda NO olvidar también esas credenciales 😁)
- nos dirijimos a la ruta de la carpeta específica donde se encuentra instalado Moodle (para sistemas CentOS generalmente un directorio bajo /var/www/html)
- la raíz de archivos de Moodle incluye una carpeta llamada "admin" y dentro de ella otra "cli", entramos hasta esta última
- allí encontramos varios scripts administrativos, entre ellos uno que nos permite reiniciar la clave de usuarios, lo ejecutamos desde la consola:
- php reset_password.php
- nos preguntará el usuario que queremos afectar y la nueva contraseña
Imagen Original (CC Atribución): https://flic.kr/p/2EDZXp
-
VIM - Guía de supervivencia para humanos
Vim es un editor clásico en sistemas tipo Unix/Linux, realmente es una herramienta muy potente, no necesita recursos de computo sofisticados, aunque evidentemente tiene un estilo de operación muy vieja guardia ...full años 80, simplemente utiliza otro paradigma que ha demostrado vigencia hasta nuestros días, no es fortuito que aparezca bien posicionado en la conocida encuesta anual de StackOverflow:
Desde la consola abrimos el editor con el comando
vim
ovim NOMBRE_DE_ARCHIVO
. En términos simples, lo primero es comprender que existe un modo de edición y un modo comandos, el modo de edición se activa oprimiendo la teclai
y el modo comandos se activa oprimiendo la tecla deESC
, luego para enviar un comando se oprime:
, seguido del comando, luegoENTER
.El modo edición se reconoce porque aparece
-- INSERT --
en la barra inferior de estado, también podemos ver allí, en la parte derecha, la posición (línea, columna) del cursor para el archivo que editamos.En resumen, para una operación de supervivencia tenemos:
- ¿Cómo salir?
Modo comandos :q! ENTER
...se sale sin salvar cambiosModo comandos :wq
...se sale salvando los cambiosENTER
- Vim soporta la edición de múltiples archivos, ¿cómo abrir un nuevo archivo?
Modo comandos :edit NOMBRE_ARCHIVO ENTER
...si no recuerdas el nombre del archivo, usaTAB
para completar el nombre del archivo o navegar los disponibles en el directorio de trabajo (flechas izquierda, derecha + ENTER
), si por casualidad escoges una carpeta, saldrá el contenido del directorio de trabajo, lo podrás navegar (flechas arriba, abajo
), al encontrar tu archivo deseado dasENTER
y listo.
- OK, veo el nuevo archivo ¿donde quedó mi anterior archivo?
Modo comandos :ls ENTER
...verás un listado de archivos abiertos, se llaman buffersModo comandos :bNÚMERO_DEL_BUFFER ENTER
...b1, b5, b9 etc, así saltas a otro archivo abierto- en cualquier momento puedes cerrar el buffer actual como se explica en el primer item
- Quiero ejecutar un comando en la shell sin tener que cerrar todo y perder mi flujo de trabajo...
Modo comandos :! COMANDO_SHELL ENTER
...ejecutarás el COMANDO_SHELL, verás su salida y luego un aviso de confirmación para volver al editor, también soporta autocompletado oprimiendoTAB
- ¿cuál es el equivalente al famoso
CTRL-Z
de cualquier editor?Modo comandos u
...no hay necesidad de oprimir:
Modo comandos CTRL + r
...para aplicar de nuevo el cambio (redo)
- ¿y para cortar y pegar?
Modo comandos v
...modo VISUAL, se selecciona un bloque de texto (flechas arriba, abajo
), verás el bloque seleccionado,ESC
para cancelar- con el bloque seleccionado oprimes la tecla
y
...tendrás ese bloque listo para jalarlo(yank) a otra sección del archivo - navegas a la posición de destino para hacer put. Oprimiendo
p
se insertará el bloque desde el caracter inmediatamente siguiente a la posición del cursor. También puedes volver al modo edición, hacer espacio, organizar, vuelves a modo comandos conESC
y luego pegar conp
Vim más que un editor, puede convertirse en un entorno completo de programación, soporta edición por tabs, autocompletado, resaltado de sintaxis, ventanas (divisiones horizontales/verticales de la pantalla, útil para editar archivos en paralelo, se cambia entre ellas con
Modo comandos CTRL w w
, se cierra la ventana actual conModo comandos CTRL w c
, para esto último tiene que salvarse el archivo previamente).Esta sólo es una introducción, la documentación completa se accede vía
Modo comandos :help user-manual
. Lleva un tiempo acostumbrarse, pero vale la pena, es como una navaja suiza de edición en un entorno Linux.Enlaces interesantes:
- ¿Cómo salir?