Deja que el servidor trabaje por tí con GNU Screen

Ya somos avispados usuarios de la línea de comandos y hacemos nuestros pinitos administrando un servidor: movemos, bajamos y hasta compilamos directamente en una maquina remota, muchas veces más potente y con más ancho de banda que la nuestra.

Nuestra terminal cliente sólo ejecuta OpenSSH (o Putty en Windows)

Pero cuando se trata de ejecutar un proceso largo y de nula interactividad no tiene mucho sentido seguir conectados ¿Para qué gastar tiempo y recursos (dejar la PC cliente prendida, por ejemplo) si el trabajo sólo se hace en el servidor?

Este caso se da muchas veces, sobre todo (y aquí lo que me interesa) cuando bajamos archivos muy pesados o hacer un mirror de un repositorio completo.

Y aquí cómo resolverlo: usa GNU Screen.

Screen es un multiplexor/virtualizador de terminales, y entre sus muchas e interesantes características incluye el desacople de su proceso padre.

Esto significa que se puede ejecutar una terminal virtual con screen (en una terminal remota por ssh, por ejemplo), ejecutar cualquier proceso en ese entorno y desacoplarlo, pudiendo entonces desloguearse y cerrar la conexión remota dejando el proceso en curso.

Receta paso a paso

  • ejecuta una consola virtual con screen

    $ screen
  • Ejecuta tu proceso largo. Por ejemplo, bajar la beta de Ubuntu Karmic Koala en DVD

    $ wget http://mirror.mcs.anl.gov/pub/ubuntu-iso/DVDs/ubuntu/9.10/beta/ubuntu-9.10-beta-dvd-i386.iso
  • Desacoplar el proceso con la combinación de teclas Control+A D

  • Desconectarse, tomar unos mates y volver cuando quieras

Para retomar el proceso

  • Conectarnos de nuevo al servidor mediante SSH

  • Listar las consolas virtuales para averiguar el PID

    $ screen -list
  • Traer a primer plano el proceso en cuestión con

    $ screen -r PID

y allí estará el proceso que dejamos corriendo (o al menos los rastros que dejó en su paso).

Digitalizando recuerdos con mencoder

Para el Mundial del 2006, compré, como tantos otros que no tenían televisor pero sí computadora, una plaquita sintonizadora de TV: una Kozumi con el chip sintonizador BT878, uno de los más genéricos y bastante bien soportado en linux.

Tuvo poca utilidad en aquel 2006, primero porque argentina no duró demasiado y segundo y principal porque un vecino reclamó potestad sobre la señal del cable coaxil que alimentaba mi chip y mis ilusiones mundialistas.

Quedó cajoneada en algun rincón, hasta que rescaté del olvido la videofilmadora de la familia, una vieja y noble JVC , con un montón de casetitos Compact VHS (que es el formato con el que funciona).

Así que después de mucho patear la tarea, decidí conectar los cables y encontrar la forma de convertir en bytes los recuerdos archivados en esos casettes polvorientos.

Lo que hice

Primero, configurar la placa. El chip bt878 se usa en muchísimas sintonizadoras que tienen configuraciones diferentes. Para asignarle los correctos, se pasa un código card que se obtiene de esta lista. En mi caso, para una Kozumi ktv-01c, el código es 151. El comando completo con el que configuro el módulo es:

sudo modprobe bttv card=151 pll=1 tuner=38 radio=1 bttv_verbose=1 gbuffers=4

Luego, el supercomando mencoder:

mencoder tv:// -tv driver=v4l2:device=/dev/video0:input=1:width=480:height=360:norm=ntsc:alsa:adevice=hw.0:amode=1:audiorate=44100:forceaudio:forcechan=1:buffersize=300 -oac mp3lame -lameopts cbr:br=96:mode=3 -af volume=-6:0,channels=1 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=5000:keyint=125:mbd=2 -vf yadif,crop=464:352:8:2  -o salida.avi

Algunos detalles:

-tv:// indica que se va a capturar video, y se le pasan paramétros luego del flag -tv: driver v4l2, un tamaño de 480x360 (aunque después se recorta), preconfigurado para ntsc (29.97 fps). image1 Un aspecto importante son los flags referidos al audio: se captura el audio alsa, indicando la placa de sonido, el modo y la calidad (mono a 44100hz de ancho de banda) image2 El audio se comprime con lame a mp3 de 96kps constante. image3 con -af volume le bajo el volumen 6db, porque de otra manera me salía saturado (estoy capturando desde el microfono). El parametro forceraudio fuerza la captura aunque la entrada esté silenciada en la mezcladora. También se fuerza a grabar un solo canal con forcechan=1. image4 Con -ovc lavc se usa libavcodec (ffmpeg), comprimiendo en mpeg4 a un bitrate de 5000. image5 Se aplican 2 filtros de video al vuelo: yadif que es el mejor filtro desentralazador (necesario para captura analógica) y un crop que recorta 8 pixeles de los costados, 2 de arriba y 6 de abajo, para evitar la distorción que producen los cabezales con las cintas viejas.

El resultado es un video de unos 250kb/s de calidad más que aceptable.

Por ejemplo, el casamiento de mi hermano Juan, en 1998:

Learning python, 4th Edition

image0Learning Python de Mark Lutz, ha sido, desde su primera versión en 1999, uno de los libros de cabecera para aprender Python.

Hace unos días salió la 4ta edición, adaptada a las versiones 2.6 y 3.1 de Python y ampliada en varios capítulos.

Lamentablemente, tardará mucho en llegar a la librerías argentinas, pero podés ir leyendo la versión en PDF.

Project Euler, Problema #2

El problema nº 2 pide obtener la suma de todos los números impares pertenencientes a la sucesión de Fibonacci menores a 4 millones.

El código con el que lo resolví es este:

def fibo(max):
        a, b = 0, 1
           n = a + b
           while n < max:
                yield n
                a, b = b, n
                n = a + b

sum([i for i in fibo(4000000) if i%2 == 0])

El resultado es 4613732.

Explicación

Fibonacci es el "hola mundo matemático" y Python luce su elegancia con este problema.

El aspecto interesante de la función fibo() definida en el código de arriba es que no se trata de una función común sino de un generador. Sintácticamente la diferencia está en que no utiliza la sentencia return sino `yield <http://docs.python.org/reference/simple_stmts.html#the-yield-statement>`_ .

La definición de `yield <http://www.wordreference.com/definition/yield>`_. en su acepción de verbo, dice «end resistance, especially under pressure or force;». Ceder, no oponer resistencia.

La diferencia sustancial entre un yield y un return es que el yield devuelve el resultado parcial de cada iteración y hace una "marca de entrada" desde donde se comenzará a ejecutar la próxima vez que la función (el generador) sea invocado.

Esto permite una recursividad con "evaluación perezosa", mucho más eficiente en términos computacionales.

Resolviendo Project Euler con python

A través del blog de Juanjo Conti descubrí Project Euler, una serie de desafíos matemáticos de enunciación sencilla para resolver con computadoras.

Juanjo estuvo resolviendo los primeros problemas, y yo quise hacer mi intento. El primero plantea obtener la suma de todos los multiplos de 3 o de 5 menores a 1000.

Lo resolví con esta pythonica (lo es?) línea:

sum([i for i in range(1000) if (i % 3 == 0 or i % 5==0)])

El resultado es 233168.

Breve explicación

Se basa en el uso de list comprehensions, una de las "joyas de la corona" de las características de Python.

Es una manera de generar listas de una manera concisa, compuesta por una expresión seguida de uno a más for y una condicionalidad al final

La lista ** [i for i in range(1000) if (i % 3 == 0 or i % 5==0)]** se lee así: crear una lista con todos los elementos (expresión i) en el rango de 0 a 999 (for) cuyo resto de dividirlo por 3 o 5 sea 0 (if).