Subprocesos en Python

Los subprocesos o hilos de ejecución nos permiten realizar tareas concurrentemente. En Python podemos utilizar el módulo threading, aunque hay muchos otros.

Vamos a crear varios subprocesos (threads) sencillos.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
import random

def sleeper(name, s_time):
    print('{} iniciado a las {}.'.format(
        name, time.strftime('%H:%M:%S', time.gmtime())))

    time.sleep(s_time)

    print('{} finalizado a las {}.'.format(
        name, time.strftime('%H:%M:%S', time.gmtime())))


for i in range(5):
    thread = threading.Thread(target=sleeper, args=(
        'Proceso ' + str(i + 1), random.randint(1, 9)))

    thread.start()

print('Yo he terminado, pero los otros subprocesos no.')

Primero, hemos importado los modulos necesarios: time, random y threading. Para crear threads solo necesitamos el último. time lo hemos utilizado para simular una tarea y obtener su tiempo de inicio y fin; random, para hacer que nuestro proceso tenga una duración aleatoria.

La función sleeper «duerme» (no hace nada) durante el tiempo que le especifiquemos, nos dice cuándo ha empezado a «dormir» y cuando ha terminado de «dormir». Como parámetros le pasamos el nombre que le queremos dar al subproceso y el tiempo que va a «dormir» la función.

Luego, creamos un bucle for que crea 5 subprocesos que ejecutan la función sleeper. En el constructor (threading.Thread), debemos indicar la función a ejecutar (target=sleeper) y los parámetros que queremos pasarle (args=('Proceso ' + str(i + 1), random.randint(1, 9)).

Proceso 1 iniciado a las 21:19:23.
Proceso 2 iniciado a las 21:19:23.
Proceso 3 iniciado a las 21:19:23.
Proceso 4 iniciado a las 21:19:23.
Proceso 5 iniciado a las 21:19:23.
Yo he terminado, pero los otros subprocesos no.
Proceso 1 finalizado a las 21:19:25.
Proceso 5 finalizado a las 21:19:26.
Proceso 4 finalizado a las 21:19:27.
Proceso 2 finalizado a las 21:19:32.
Proceso 3 finalizado a las 21:19:32.

El resultado de la ejecución es aleatorio: no sabemos cuál proceso finalizará primero.

Esteganografía sencilla

¿Alguna vez has querido ocultar un mensaje o un archivo en una imagen? Se puede hacer muy fácilmente en menos de treinta segundos.

Instrucciones para ocultar texto en una imagen (demostración práctica)
Ocultando texto en una imagen

En la imagen de arriba lo veis. Realmente, solo hace falta usar la instrucción echo 'Tu mensaje' >> tu_imagen, lo demás es solo para demostraros que funciona y para enseñaros a después el mensaje. La imagen se puede abrir posteriormente sin problema; tiene la misma apariencia. La única diferencia es que ocupa más espacio. En el ejemplo que os he mostrado, la imagen ocupa 15 bytes más que antes, después de haber escrito el mensaje.

¿No entendéis todo el código que he escrito? Tranquilos, ahora lo explico. file favicon.png, me dice el tipo del archivo. ls -l muestra información detallada de todos los archivos del directorio en el que me encuentro. Como solo hay uno, solo aparece la imagen. El número 2588 que aparece tras ejecutarlo es tamaño en bytes de la imagen. Con ls -lh puedo ver el tamaño en un formato más legible, en kilobytes en vez de en bytes. Como solo me interesa el tamaño, paso ls -lh a cut -d" " -f5 por una tubería para que solo me aparezca la columna 5, cada columna está separada por un espacio (" "). Por último, leo el mensaje oculto con strings, que extrae todos los caracteres alfanuméricos encontrados en la imagen.

Si vuelvo a ejecutar la instrucción file favicon.png, encontraré el mismo formato que antes: PNG.

Podemos aplicar este método no solo a texto, sino también a archivos de distinto tipo.

Screenshot from 2016-07-26 23-49-26

gksudo en vez de sudo para aplicaciones gráficas

¿Que diferencia hay entre sudo y gksudo? La principal es que sudo está hecho para aplicaciones de texto que ejecutas en la Terminal y gksudo o gksu (son equivalentes), para aplicaciones gráficas.

Si eres un usuario de GNU/Linux, probablemente alguna vez habrás utilizado sudo para abrir una aplicación gráfica. También te habrás dado cuenta de que la mayoría de las veces no da ningún problema. Entonces, ¿por qué deberías usar gksu?

Cuando lanzas un programa con sudo, estás utilizando la configuración del usuario y ejecutando el programa siendo el superusuario. Pero si utilizas, gksudo estás utilizando el programa como superusuario y cargando la configuración de superusuario (root). La mayoría de las veces no supone ningún problema utilizar sudo para abrir programas gráficos con privilegios, pero otras veces sí.

Si vas a realizar tareas administrativas, recomiendo hacerlo todo desde la Terminal con sudo, porque es más rápido y más seguro. Para encontrar más información, lee la página de manual de gksu.

¿Cómo montar un dispositivo USB desde la Terminal?

Como todo en GNU/Linux es un fichero, necesitamos una ubicación en el sistema de ficheros para nuestro dispositivo USB. Normalmente se suelen crear en /media, /mnt o en un directorio similiar diseñado para tal propósito. En el sistema operativo que yo utilizo (Trisquel), se utiliza la carpeta /media. La ubicación para mi USB la creo con esta instrucción: sudo mkdir /media/usb.

Una vez creado el punto de montaje, necesitamos decirle al sistema operativo el dispositivo que queremos montar. Con la instrucción lsblk podemos listar los dispositivos disponibles. Ahora solo nos queda montar con la instrucción mount el que queramos en el directorio que hemos creado: sudo mount /dev/sdc1 /media/usb (en mi caso). Cuando esté desmontado el dispositivo USB, el directorio donde lo hemos montado quedará vacío. Puedes borrar el directorio creado con la instrucción sudo rmdir /media/usb.

Instalación de un servidor GLAMP

Introducción

GLAMP es un acrónimo que define un sistema infraestructura de internet que incluye las siguientes herramientas: GNU, Linux, Apache, MySQL y PHP o Python o Perl. Realmente GNU y Linux ya están instalados, se utiliza esa notación para distinguir GLAMP de MAMP (de Mac OS) y WAMP (de Windows). Se suele usar GLAMP para realizar tareas relacionadas con la programación de aplicaciones web o para tareas que necesiten de un servidor HTTP como del de Apache.

La instalación la voy a realizar en una distribución de GNU/Linux llamada Trisquel, pero el proceso es similar en otras distribuciones. Trisquel está basada en Ubuntu, así que los pasos son idénticos o casi idénticos en ambas.

Instalación

Abrimos tasksel (instálalo si tu distribución no lo trae instalado) con permisos de superusuario (sudo tasksel). Encontraremos una pantalla que pone «Selección de programas».

tasksel (Trisquel)

Veréis que la opción sobre la que estáis situados se marca con un color diferente; quizá tengáis algunas opciones marcadas con un asterisco. Tenéis que seleccionar GLAMP web server (puede que no tenga exactamente el mismo nombre dependiendo de la distribución. Como regla general, si pone LAMP es lo que buscas). Ahora pulsáis la barra espaciadora (veréis aparece un asterisco) y después Enter. Enseguida se iniciará el instalador.

Durante la instalación os preguntará por la contraseña que queréis que tenga MySQL, escoged la de vuestra elección y continuará la instalación.

Comprobad ahora si se puede acceder a localhost con vuestro navegador. Deberá aparecer esta página web o una similar:

Apache localhost on Trisquel

Podéis comprobar también si MySQL se ha instalado correctamente intentando acceder a MySQL con la contraseña especificada durante la instalación: mysql -u root -p (tras introducir esto en la Terminal, os preguntará la contraseña para acceder).

Ahora vamos a instalar phpMyAdmin con la instrucción sudo apt-get install phpmyadmin. Nos preguntará por el servidor que queremos elegir para configurar phpMyAdmin, elegimos apache2. También debemos decir que sí queremos que nos configure la base de datos automáticamente con «dbconfig-common» . Luego nos pedirá la contraseña de la base de datos.

Captura de pantalla de 2016-07-15 14:17:06

instalando phpmyadmin

Ahora podemos probar si phpMyAdmin se ha instalado, yendo a localhost/phpmyadmin con nuestro navegador. Nos deberá aparecer una pantalla que nos permita iniciar sesión. Aquí debemos introducir root (o nuestro usuario de MySQL si habéis creado ya uno) y su contraseña.

main screen phpMyAdmin
La pantalla que aparece al iniciar sesión en phpMyAdmin

login phpMyAdmin

Ahora debéis cambiarle el nombre al archivo HTML que aparece cuando vamos a http://localhost con en el navegador (sudo mv /var/www/html/index.html /var/www/html/index_de_apache.html). Esto lo hago para no ver el molesto mensaje de bienvenida cada vez que voy a localhost con el navegador. En vez de eso, veremos los archivos del directorio raíz de nuestro servidor GLAMP: var/www/html.

Se verá algo como esto cuando estemos en localhost
Se verá algo como esto cuando estemos en localhost

Ahora debemos cambiar el usuario y el grupo de la carpeta html. El grupo que debemos especificar es www-data, que es el que utiliza Apache. Lo debemos hacer de forma recursiva para que todo el contenido de la carpeta también cambie de propietario y de grupo. La instrucción es la siguiente:

sudo chown -R $USER:www-data /var/www/html

Puede que quieras modificar también los permisos de esta carpeta según tus necesidades.

Captura de pantalla de 2016-07-15 14:44:55