Linux para principiantes o novatos

Linux para principiantes o novatos (17)

Utiliza toda la potencia de tu ordenador y ejecuta tareas en paralelo

Gaspar Fernández

Written by

Hace muchos años, la programación multihilo solo servía para darnos a los usuarios la sensación de multitarea y que el ordenador pudiera respondeer cuando interactuábamos con él. Normalmente sólo teníamos un único núcleo de CPU y solo podía ejecutar una cosa en un momento del tiempo determinado. Aunque el sistema operativo se encargaba de ir cambiando las tareas que iba ejecutando varias veces por segundo, y por eso podíamos estar viendo una página web y al mismo tiempo chateando con otro programa, copiando un archivo, etc. Esta multitarea también nos ayudaba mucho cuando una aplicación estaba esperando un dato del disco o de un dispositivo (ratón, teclado, red...), ya que estos dispositivos son mucho más lentos que la CPU del ordenador. Es decir, mientras la CPU puede procesar millones de operaciones por segundo, pedir un dato a un disco duro, puede tardar lo mismo que tardarían varios miles de operaciones, y si el dato viene de Internet, puede tardar mucho más. Así que los sistemas operativos multitarea, suspenden la ejecución de dicha aplicación hasta que el dato esté listo, y así aprovechan los ciclos de procesador que podían haberse perdido para hacer cosas más productivas como la descompresión de fotogramas de un vídeo de gatitos.

Eso sí, si en una CPU monohilo ejecutamos dos tareas que requieren CPU de forma intensiva como la compresión de vídeo, renderizado 3D o aplicación de filtros sobre imágenes, nos daremos cuenta de que el tiempo total de la ejecución de las tres tareas es aproximadamente el mismo que ejecutar una tarea detrás de otra.

Pero en los tiempos que corren, es muy común encontrar procesadores con varios núcleos, incluso con varios hilos por núcleo. Al tener varios núcleos, podremos ejecutar varios programas y normalmente el sistema operativo se encarga de colocarlos en uno u otro núcleo, de forma que, ya que nuestro procesador puede ejecutar varias cosas a la vez, aprovechemos esa potencia para terminar las tareas antes.
Aunque ahora el problema suele ser que las aplicaciones no están pensadas para ejecutarse en varios hilos. Bueno, actualmente muchas aplicaciones pueden aprovechar la potencia de los procesadores modernos, como compresores de vídeo, software de minería de criptomonedas, tratamiento de imágenes etc. Pero, muchos programas comunes de búsqueda de datos en ficheros, compresión/descompresión, y muchos de nuestros scripts en Bash o Python no están preparados. 


Ejecución de tareas en paralelo en Bash

Cuando, en Bash queremos ejecutar dos tareas a la vez, siempre podemos ejecutarlo con un & al final, volveremos a nuestro shell para ejecutar más cosas mientras el programa inicial se está ejecutando:

$ programa &
19238
$ … ejecuto más cosas …


O también podemos ejecutarlo normalmente, pulsar Control+Z (^Z). El programa se detendrá, si escribimos en la consola "fg" el programa seguirá en primer plano (foreground), pero si ponemos "bg" el programa seguirá en segundo plano (background), y mientras éste está corriendo, podremos ejecutar más cosas:

$ programa
…
^Z
[1]+ Stopped   programa
… ejecuto más cosas …
$ fg
programa
… programa sigue ejecutándose …
^Z
[1]+ Stopped    programa
$ bg
[1]+ programa &
… puedo ejecutar lo que quiera …


GNU Parallel

Con esto puede ser suficiente para muchos de nosotros pero, ¿y si queremos utilizar más hilos? Es un poco pesado ejecutar varios programas con sus argumentos y una & al final. ¿O queremos que los argumentos vayan cambiando según la ejecución? ¿O incluso queremos ejecutar cientos de tareas pero que se vayan repartiendo la CPU de 2 en 2, de 4 en 4 o más dependiendo del número de núcleos que tengamos? Para eso, y mucho más, tenemos la utilidad GNU Parallel.
Un ejemplo típico es crear un programa que calcule dígitos del número PI con un hilo de CPU, es muy fácil con bc:

#!/bin/bash
echo "scale=4000; a(1)*4" | bc -l

Lo salvamos como pi.sh y le damos permiso de ejecución con:

$ chmod +x pi.sh


Este programa, ejecutado en mi ordenador tarda unos 11 segundos en terminar. Suponiendo que nuestro equipo tenga 2 núcleos, podemos hacer:

$ time ./pi.sh & time ./pi.sh


Veremos que tarda también 11 segundos (más o menos). Esto lo podemos hacer con GNU Parallel de esta forma:

$ time seq 2 | parallel -n0 ./pi.sh

Donde se ejecutará el comando pi.sh dos veces y de forma simultánea. Pero, aunque esta orden pueda parecer complicada, podemos jugar un poco con ella, para ejecutar pi 4 veces de forma simultánea:

$ time seq 4 | parallel -n0 ./pi.sh

Si nuestra CPU tiene 4 núcleos, seguirá tardando 11 segundos, en realizar cuatro tareas, pero si nuestra CPU tiene 2 núcleos, tardará más de 22 segundos. Ya que las tareas utilizan mucho la CPU y es un trabajo extra para el sistema operativo intercalarlas para que se ejecuten a la vez. Pero, imaginémonos que queremos ejecutar 4 veces pi, pero que se repartan de 2 en 2, para ello podemos hacer:

$ time seq 4 | parallel -n0 -j2 ./pi.sh

Si queremos, podemos ejecutar un gestor de tareas o el comando "top" con el que veremos qué tareas están en ejecución cada vez.


Varias tareas con argumentos

Ahora vamos a modificar pi.sh así:

#!/bin/bash
DECIMALES=$1
echo "scale=$1; a(1)*4" | bc -l

De modo que tengamos que introducir el número de dígitos que queremos de Pi. Así ejecutaremos pi.sh de forma concurrente pero con parámetros diferentes en cada ejecución. Podemos jacer lo siguiente:

$ time echo "1000 2000 3000 4000" | tr ' ' '\n' | parallel ./pi.sh

O si queremos que solo haya dos ejecuciones de pi.sh simultáneas:

$ time echo "1000 2000 3000 4000" | tr ' ' '\n' | parallel -j2 ./pi.sh

Nota: El uso de tr es porque parallel necesita que los argumentos vayan uno por línea. Si los argumentos los tenemos en un archivo y uno por línea podríamos hacer:

$ cat argumentos | parallel -j2 ./pi.sh


Combinaciones de argumentos

Con GNU Parallel podemos incluso combinar argumentos. En este ejemplo, cambiamos de base varios números binarios a base 10

$ parallel echo -n {1}{2}{3}{4} = \;'echo "ibase=2;{1}{2}{3}{4}" | bc' ::: 0 1 ::: 0 1 ::: 0 1 ::: 0 1
0000 =0
0001 =1
0010 =2
0011 =3
0100 =4
0101 =5
0110 =6
0111 =7
1000 =8
1001 =9
1010 =10
1011 =11
1100 =12
1101 =13
1110 =14
1111 =15

Y como vemos, GNU Parallel, además de proporcionarnos una forma sencilla de ejecutar programas simultáneamente, nos proporciona también una forma de combinar argumentos y generar resultados muy potente. Utilizando {1}, {2},...{n} dependiendo del número de argumento que estemos tratando

Convirtiendo masivamente archivos de JPG a PNG

Uno de mis usos preferidos, es la conversión automática de archivos, o tratamiento de imágenes con ImageMagick. Además, podemos automatizar esta conversión para realizarla en cientos de archivos y despreocuparnos del ordenador ya que él se encarga de hacer el trabajo. Una tarea muy sencilla es convertir un archivo de JPG a PNG con convert. Pero, ¿si tenemos una carpeta llena de archivos? Podemos ejecutar convert en todos ellos, y hacerlo uno detrás de otro, pero podríamos hacerlo, por ejemplo de 2 en 2 o de 4 en 4 dependiendo dee nuestra CPU, incluso podríamos subir a 3 o 5 porque la conversión de archivos implica lecturas y escrituras y es tiempo que podemos estar procesando datos (los archivos convertidos entrarán en el directorio convertidas):

$ find -maxdepth 1 -name*.jpg’ | parallel --progress -j3 convert -verbose {} convertidas/{/.}.png

Fijaos cómo en el segundo argumento le quito la extensión para llamarla png. Podría variar el número del argumento -j según mis preferencias. Además, he introducido --progress que nos indicará el progreso de la tarea.
Como último ejemplo, nos basaremos en el anterior. Pero esta vez, utilizaremos zenity para presentar una barra de progreso de manera gráfica. ¡Porque, que sea terminal no significa que no sea visual!

$ find -maxdepth 1 -name*.jpg’ | parallel --bar convert {} convertidas/{/.}.png 2> >(zenity --progress --auto-kill)

¡Espero que les haya resultado útil!

Leer más ...

¿Dónde se encuentra el diccionario de mi idioma en GNU/Linux?

Cuando usando una aplicación nos autocompleta el texto, nos subraya una palabra o nos dice que algo está incorrectamente escrito, no es magia, es que esa aplicación hace uso de un diccionario.

Aunque hay aplicaciones que tienen diccionarios propios, el sistema también tiene al menos uno genérico del que podemos hacer uso o podemos usarlo como base para añadirle nuevas palabras.

En Ubuntu, este diccionario está en:

/usr/share/dict/spanish

Pero no necesariamente todas las distribuciones tienen por qué guardar el diccionario de español en esa dirección, por lo que podemos buscar en nuestro sistema con:

find /usr -iname spanish | grep dict

Y nos dirá la dirección en el arbol de directorios del sistema de nuestro diccionario.

diccionario.png

Leer más ...

Crear un gif animado con ImageMagick y los parámetros -loop y -delay

Ya hemos visto cómo unir imágenes con -delay para crear un gif animado. Pero -delay, que es muy sencillo de usar, no permite definir cuántas veces queremos que se repita el bucle ni la velocidad a la que queremos que se muestren las imágenes que forman la animación.

Para estas dos funcionalidades tenemos:

-loop que permite definir el número de veces que queremos que se repita una determinada animación. Le indicamos el número de veces que queremos que se repita. Y si queremos que se repita infinitas veces, se lo indicamos con 0.

-delay que establece la velocidad a la que se mostararán las imágenes en centésimas de segundo. Es decir, si queremos que entre imagen e imagen pase un segundo, le indicaremos 100.

Así:
convert -delay 10 -loop 0 param* param.gif

Si quieren ver diversas fórmulas para crear imágenes que van mutando y luego unirlas en ficheros gif, pueden leer este hilo de Twitter:

https://twitter.com/hacemoswebserie/status/1037884393430429699

Leer más ...

Envío de parámetros en funciones en shell script

Cuando hacemos funciones en shell script, el siguiente paso es poder interactuar con las funciones. Poder enviarle datos y que nos devuelva resultados. 

Una vez definida una función, esta actuará siempre como un si fuera un comando. Tanto internamente, que recogerá en $1 el parámetro le pasemos en primer lugar, $2, el parámetro que le pasemos en segundo lugar... como para pasarle parámetros a la hora de invocar la función, que lo haremos como si fuera el parámetro de un comando normal. 

Veamos un ejemplo:

#!/bin/bash
function saludo()
{
   echo "Soy una función que saluda: Hola, "$1 
}
saludo Pepe

Nos devolverá al ejecutar el script:

Soy una función que saluda: Hola, Pepe

Leer más ...

Activar y desactivar el ratón de un portátil (touchpad)

Si eres de los que teclea con las muñecas apoyadas en la mesa, cuando trabajas con un portátil seguramente el ratón táctil te hará cosas raras en la pantalla ya que, aunque no toques la superficie destinada a manejar el puntero, son bastante sensibles y mueven el puntero simplemente con apoyar algo cerca. 

Para evitar esa molestia, podemos desactivar el teclado del ratón y trabajar con uno externo. La instrucción para eso es:

sudo modprobe -r psmouse

Y si luego queremos volverlo a activar:

sudo modprobe psmouse

Leer más ...

Cómo girar un vídeo en VLC y hacer permanente ese cambio

Rubén Abad

Written by

He aquí un videotutorial. He intentado hacerlo lo mejor posible, pero se mejorará la técnica en futuras producciones de este estilo, que vengan de mi firma. Se trata, básicamente, de cómo girar un vídeo y hacer que ese cambio sea permanente a partir de la codificación del mismo con el VLC. Dentro vídeo:

Leer más ...

Cómo hacer screencasts en Linux

Rubén Abad

Written by

En este tutorial os voy a explicar una forma sencilla de grabar la pantalla de cualquier distribución Linux, con el fin que sea preciso. Para ello, usaremos la herramienta recordMyDesktop (http://recordmydesktop.sourceforge.net/about.php), la cual, permite hacer esta tarea. Esta aplicación está disponible en todas las distribuciones Linux, por lo que no hay mayor problema en su instalación. En mi caso (entorno Debian/Ubuntu, etc.), se instalaría así:

sudo apt-get install gtk-recordmydesktop

Encontrarás la aplicación en el apartado Multimedia de la lista de aplicaciones de tu distribución Linux favorita. Cuando la arranques, verás algo como esto:

2018 07 14 200449 1024x600 scrot

Con el botón "Seleccionar Ventana" podrás señalar el área a grabar, arrastrando el cuadrado rojo de la imagen pequeña, tal y como se ve aquí:

2018 07 14 201336 1024x600 scrot

Cuando hayas realizado esto, dale a "Grabar". El sistema empezará a grabar la pantalla, tal y como se ve en este vídeo (de mi autoría):

Finalmente, te saldrá una pantalla de codificación, tal y como se ve aquí. Cuando termine la codificación, podrás ver el vídeo hecho en /home/"tu usuario" bajo el formato OGG (.ogv). Con la opción "Convertir" de VLC podrás convertirlo a algún formato más amigable para su compartición.

2018 07 14 201232 1024x600 scrot

Leer más ...

Como Instalar Steam en Linux

Ainumortis

Written by

¿Que es Steam?
Steam es una plataforma creada por Valve para centralizar y distribuir videojuegos de forma digital, estos juegos pueden funcionar en Windows, Mac o GNU/Linux siempre que sean compatible.

Steam tiene la ventaja de que compras el juego una sola vez, y si sacan una versión para tu sistema no necesitas comprarlo de nuevo.

¿Que distribución elijo para Jugar?
Steam esta disponible para casi todas las distribuciones, pero su compatibilidad esta centrada en Ubuntu ya que es la plataforma elegida por la mayoría de desarrolladores.

Instalación
Para instalarlo bastará con buscarlo en el centro de software de nuestra distribución, pero como buenos GNU/Linuxeros que somos usaremos la terminal.

Ubuntu | Debian | Linux Mint

$ sudo apt update
$ sudo apt install steam


Arch

$ sudo pacman -S steam steam-native-runtime


Tarjetas Gráficas Soportadas:
Nvidia: Para poder jugar nos hará falta los drivers privativos.
Ati: Con los drivers libres son suficientes para poder jugar.
Intel: Las Intel HD no son lo mas recomendado para jugar, ya que habrá juegos que no lleguen ni a arrancar.

Xorg o Wayland: Desconozco si actualmente se puede jugar bien con Wayland, en su momento me daba problemas con el ratón y he usado Xorg desde entonces, si sufris los mismos problemas en algunos juegos, bastará con elegir XORG en el login de nuestro sistema en lugar de wayland.

Nota del Autor: estoy abierto a correcciones, sugerencias incluso si queréis aportar otras distribuciones como Fedora u OpenSuse, indicadmelo para poder añadirlo. se agradece el feedback.

Leer más ...

Concatenar ficheros PDF en un único documento

Antonio Varilla

Written by

Usando el programa pdftk:

    $ pdftk archivo-1.pdf archivo-2.pdf [archivo-n.pdf] cat output archivo-final.pdf

Leer más ...

Convertir y unir imágenes en archivos PDF

Antonio Varilla

Written by

Debemos tener instalado el paquete "imagemagick".

Para unir varias imágenes en un único documento PDF basta con que las vayamos añadiendo separadas por un espacio con el siguiente comando:

    $ convert imagen1.jpg imagen2.jpg documentoresultante.pdf

Así obtendríamos un documento PDF llamado "documentoresultante.pdf" que contendría ambas imágenes.

NOTA: Sirve tanto para imágenes JPG, como PNG, etc.

Leer más ...
Página 1 de 2

¡Atención! Este sitio usa cookies y tecnologías similares.

Si no cambia la configuración de su navegador, usted acepta su uso. Saber más

Acepto

Vea nuestra política de cookies y enlaces de interés aquí