miércoles, 23 de diciembre de 2020

Felicitación navideña

Leí hace unos días, en dos estupendos Blog sobre Linux, y por tanto de visita obligada, sendas entradas sobre cómo tener un bonito árbol de Navidad, animado, a través de la consola. Primero lo vi en Un Bruto con Debian y al día siguiente, en Linux Adictos. Ambos se referían a una misma fuente, compartida a través de github, así que, quizás por aquello de que ‘no hay dos sin tres’ me apetece incluirlo en mi Blog, dando mi particular ‘visión’ al tema.

Como digo, usando esa fuente, partimos de un script bastante complejo, llamado ‘tree-EN.sh’ que se puede descargar a tu ordenador, con la orden…
wget https://raw.githubusercontent.com/sergiolepore/ChristBASHTree/master/tree-EN.sh
(Simplemente abres la consola en la ruta que quieras (yo, personalmente, porque me resulta muy cómodo encontrar, ahí, el archivo descargado, y luego moverlo donde quiera), lo suelo hacer en propio Escritorio, con botón derecho ratón- abrir en un terminal)
Y a partir de aquí, basta...
a) seleccionar el archivo, y con botón derecho ratón-Propiedades-pestaña ‘Permisos’ marcar ‘Permitir ejecutar el archivo como un programa’. Los ortodoxos lo harían con la orden, por consola…
chmod +x tree-EN.sh
b) ejecutarlo, con la orden (en esa misma ruta)
./tree-EN.sh
(por cierto, un atajo interesante: también se puede hacer abriendo una consola (en cualquier ruta) y, simplemente, arrastrando a ella el archivo descargado y ‘ya autorizado’)
 

Bien pues con esto ya tendríamos un bonito árbol de navidad aunque, eso si, en inglés. Pero yo quiero ponerlo en español, y además me apetece poner lo que yo quiera. En particular, quiero que el arbolito diga…

FELIZ NAVIDAD
y buen ánimo en 2021

y (como se verá) esto ya requiere hurgar un poco en las tripas del script

Así que si lo editamos (clic de ratón en el archivo y ‘Visualizar’), aparte de lo dicho de ver su complejidad (al menos para los que solo somos ‘aficionadillos’) de momento vamos a identificar, hacia la mitad de las líneas del código, estas...
new_year=$(date +'%Y')
let new_year++
tput setaf 1; tput bold
tput cup $lin $((c - 6)); echo MERRY CHRISTMAS
tput cup $((lin + 1)) $((c - 10)); echo And lots of CODE in $new_year  

...donde vamos a cambiar cosas. 

Lo de $new_year se puede dejar tal cual, porque llama a la función $(date + ‘%Y’), y de esta forma sirve para cualquier año. Pero vamos a cambiar el primer texto, lo de MERRY CHRISTMAS que, si ponemos ‘FELICES FIESTAS’, no hay problemas (ambas frases tienen 15 espacios). Pero si, en la línea siguiente, sustituimos la frase ‘And lots of CODE in $new_year por otra, algo distinta… posiblemente nos encontraremos con algún problema. Un problema, que nos da una cosa rara… y que, por ejemplo, descubro que solo si inmediatamente antes, cambiamos el número en la función que pone eso de '$((c – 10));’... nos quedará bien.
No voy a destripar el código (ni se hacerlo) pero parece claro que esa función ‘$((c – #))' tiene bastante protagonismo en el script. Y también tiene especial protagonismo la palabra definida para parpadear cambiando de color (en el original esta palabra es ‘CODE’) que se ve en las últimas líneas del script, en el apartado final ‘# Flashing text
Así que, "echando mano a mi experiencia en los métodos heurísticos" (o sea, aplicando la conocida técnica de ‘ensayo-error’) anduve probando cosas.

Por ejemplo, ya dije que, en la línea del ‘MERRY CHRISTMAS si lo sustituyo por ‘FELICES FIESTAS’ (que también tiene 15 espacios) con el $((c – 6)) original sale centrado. Pero si cambio la frase por otra, distinta, descubro que, para mantenerla centrada, por cada dos espacios de más, o de menos, que tenga la nueva frase de esa línea, deberé subir o bajar (respectivamente) una unidad a la función $((c – 6)) que hay (originalmente) en esa línea. O sea que para ‘FELIZ NAVIDAD’ (13 espacios, o sea 2 menos) hay que poner $((c – 5))

Pero el problema está en la siguiente línea. Vale, compruebo que con una frase de 24 espacios (‘And lots of CODE in $new_year', teniendo en cuenta que $new_year son 4 espacios) si pongo, en esta otra línea del código, $((c – 10))… queda centrado. Y si fuese de 22 espacios (como ‘Y mucho CODIGO en $new_year',) habría que poner $((c – 9)).

Por tanto, si pongo ‘Y buen ánimo en $new_year’ (20 espacios) para que quede centrado tengo que poner… $((c – 8))… pero me queda horrible. ¿Por qué? Pues por lo que decía de la palabra que aparece en las últimas lineas del código (donde el ‘# Flashing text’ del script original que comentaba) exactamente en …
# Flashing text
sh=1
for l in CODE
do
tput cup $((lin+1)) $((c+sh))
echo $l

porque si en vez de ser CODE (ahí el script (original) define que esa palabra debe parpadear y cambiar de color), es otra palabra con distinto número de letras, hay que cambiar algo.
Por ejemplo, si ponemos CODIGO ('for l in CODIGO') hay que poner $((c–3+sh)). Y si ponemos ‘ánimo’ (y la frase ‘Y buen ánimo en $new_year’ de solo 20 espacios)… tendremos que poner (también) $((c-3+sh)) para que quede bien. No se si considera el acento como una pulsación más...

Así que en menudo 'jardín' me he metido… Como conclusión, para no expertos, que puedes poner lo que quieras, pero estas son las teclas que hay que tocar (y probar resultados) según las frases que quieras poner.
Por tanto... lo dicho: los que quieran crear un arbolito personalizado, y no sean expertos en 'destripar' scripts… a la prueba de ‘Ensayo y Error’


Pero bueno, dicho todo esto, quiero es terminar de forma más elegante, con un bonito ejercicio: hacer un GIF de este arbolito de navidad.
Y, a ver, puede que haya soluciones más elegantes, pero para mi lo más sencillo es...
a) Lanzar el script, y capturar su reproducción en la consola (seleccionando el área). Yo lo hago, muy fácilmente, con Vokoscreen (por cierto, si no lo usas mucho ni sería necesario instalarlo,  porque se se puede encontrar 'portable' (como AppImage), por ejemplo aquí, que funciona muy bien (es como yo lo tengo).
b) Extraer unos cuantos ‘frames’ del video creado, por ejemplo con
 
ffmpeg -i arbolnavidad.mkv -r 20 -t 3 -ss 00:00:00 fotograma-%3d.png 
(es mejor hacerlo en una carpeta específica, para no amontonar archivos) que, en el caso, se estipula capturar 20 frames por segundo, durante 3 segundos, desde el instante ‘cero’, lo que nos dará unos cuantos fotogramas, numerados ordenadamente, 001,002...), que guardaremos en esa carpeta 
c) Y crear el GIF (seguimos con la consola abierta en esa carpeta) con
convert -delay 50 -loop 0 fotograma-*.png navidad.gif …
 
o similar (se pueden probar otros 'delay', que son los milisegundos entre frames)
et voilà…


 

1 comentario:

  1. Dice un dicho que no hay dos sin tres y otro que a la tercera, va la vencida. Amigo, tu artículo es el tercero y por lo tanto es el bueno...
    ¡Te lo has currado mucho!
    Feliz Año

    ResponderEliminar