Convertir un vídeo a formato GIF

Animación de un gato hecha con
Pygame

Hay muchas formas y programas útiles para hacer esto. Aquí os cuento mi método:

  1. Si no tienes ffmpeg, instálalo (en distribuciones de GNU/Linux basadas en Debian con sudo apt-get install ffmpeg).
  2. Separa el vídeo en fotogramas: mkdir fotogramas && ffmpeg -i tuvideo fotogramas/fotograma%04d.png (los fotogramas se guardarán en la carpeta fotogramas).
  3. Borra los fotogramas que no necesites (paso opcional).
  4. Une los fotogramas extraídos creando un gif con el programa adecuado. Puedes usar animate (animate fotograma*.png anim.gif) para hacerlo rápido, pero si buscas controlar mejor el espacio de tiempo entre fotogramas utiliza convert (convert -delay 0 -loop 0 fotograma*.png anim.gif). -delay num indica el tiempo entre los fotogramas y -loop 0 quiere decir que cuando acabe de reproducir las imagenes empezará de nuevo. Estas herramientas suelen estar ya instaladas en muchas distribuciones de GNU/Linux, forman parte de ImageMagick (http://imagemagick.org/script/index.php).

Resumen de atajos de teclado para la Terminal (Bash)

Este resumen lo he elaborado a partir del manual de referencia de Bash.

C-b
Se mueve atrás un carácter.
C-f
Se mueve adelante un carácter.
SUPR o Retroceso
Borra el carácter a la izquierda del cursor.
C-d
Borra el carácter debajo del cursor.
Caracteres imprimibles
Inserta un carácter en la posición del cursor.
C-_ o C-u
Deshace la última instrucción de edición. Puedes desahacer hasta dejar la línea vacía.
C-a
Se mueve al principio de la línea.
C-e
Se mueve al final de la línea.
M-f
Se mueve una palabra adelante, donde la palabra está compuesta de letras y números.
M-b
Se mueve atrás una palabra
C-l
Limpia la pantalla, volviendo a imprimir la línea actual arriba.
C-k
Mata (matar texto significa borrar texto de la línea, pero guardándolo para su uso posterior) el texto desde la posición actual del cursor hasta el final de la línea.
M-d
Mata desde la posición actual del cursor hasta el final de la línea
M-d
Mata hasta el final de una palabra.
M-SUPR
Mata desde el cursor hasta el final de la palabra actual, o, si entre palabras, hasta el principio de la palabra anterior. Los límites de las palabras son los mismos que usa M-f
M-DEL
Mata desde la posición del cursor hasta el inicio de la palabra actual, o, si entre palabras, hasta el principio de la palabra anterior. Los límites de las palabras son los mismos que los usados por M-b
C-w
Mata desde el cursor hasta el espacio en blanco anterior. Esto es diferente que M-SUPR porque los límites de las palabras difieren.
C-y
Pega el texto recientemente matado de nuevo al buffer del donde se encuentra el cursor.
M-y
Rota el kill-ring, y pega lo que está al tope. Solo puedes hacer esto si la instrucción anterior es C-y o M-y

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.