//barrabarra

JAVIER ROMERO
Programación web y escritorio
 

Our blog, keeping you up-to-date on our latest news.

 

Capturando imágenes desde un DVD y eliminando bordes

abril 28, 2013 at 1:04 pm | Blog | No comment

 

Hoy que me encuentro con un poco de tiempo he decido pasar algunos dvds premontados con presentaciones de fotos a las carpetas de fotos.
Como los dvds vienen montados como videos hay que extraer las fotos haciendo capturas y posteriormente tendremos que eliminar las bandas.

Para esto vamos a utilizar dos herramientas, ffmpeg e ImageMagick.

Primero extraemos las fotos haciendo capturas cada x segundos con:
ffmpeg -i [input file] -r .05 -y [output name]%%03d.jpg

Cuando hemos extraído las capturas les damos un repaso y quitamos las que se hayan tomado en mitad de transiciones, cabeceras y similares y una vez limpias vamos a eliminar los bordes.

Con ImageMagick podemos utilizar la opción -trim, pero veremos que por el propio ruido del archivo de video no elimina correctamente todos los bordes y nos deja unas barras bien grandes a los lados, así que vamos a incluir un paso intermedio que “suavice” las fotos para que los bordes queden homogéneos y poder eliminarlos posteriormente con más precisión.

La orden es tan simple como:
for i in `ls *.jpg`; do convert $i -crop `convert $i -virtual-pixel edge -fuzz 25% -trim -format '%wx%h%O' info:` +repage noborder-`basename $i .jpg`.jpg; done

 

Ejecutar Selenium WebDriver con Firefox en un servidor remoto sin interfaz gráfica

abril 12, 2013 at 10:05 am | Blog, Sistemas | 1 comment

 

Si queremos aprovechar nuestro hosting en una máquina remota para ejecutar pruebas mediante Selenium WebDriver nos encontraremos con el inconveniente de que estas máquinas por lo general carecen de un entorno gráfico, necesario para que se lance el navegador y se puedan realizar los tests. Esto puede resolverse con la ayuda de Xvfb, un servidor gráfico “de pega” que nos va a permitir lanzar nuestro navegador sin necesidad de ejecutar todo el entorno X.

Para ello, instalaremos los paquetes necesarios, en Ubuntu esto será con:

apt-get install xvfb firefox firefox-locale-es

Cuando instalemos los paquetes y sus correspondientes dependencias podemos ejecutar:

startx -- `which Xvfb` :1 -screen 0 1024x768x24 &

lo que nos lanzará un servidor gráfico utilizando Xvfb y lo dejara ejecutándose de fondo. Para continuar sólo tenemos que lanzar una instancia de Firefox y comprobar que efectivamente se ejecuta. El único detalle a tener en cuenta es que hay que indicarle qué display utilizar, lo haremos de la siguiente forma:

DISPLAY=:1 firefox &

Si quieres asegurarte de que se está ejecutando y tienes instalado el paquete imagemagick puedes hacer una captura de pantalla :D, lo haríamos con:

DISPLAY=:1 import -window root capturafirefox.png

Para evitar tener que ejecutar estas líneas cada vez que el servidor arranque y se detenga, y por comodidad para gestionarlo, podemos crear un script de Upstart, primero con un archivo de configuración en /etc/init/xvfb.conf con el contenido:


description "XVFB fake x server instance"
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec startx -- `which Xvfb` :1 -screen 0 1024x768x24

con lo que podremos lanzar el servicio con service xvfb start, aunque para que se lance automáticamente al inicio del sistema haremos:

ln -s /lib/init/upstart-job /etc/init.d/xvfb

Una última cosa, igual que al lanzar nuestra instancia de Firefox había que indicarle el display a utilizar, cuando se vaya a lanzar algún comando que tenga que hacer uso del servidor gráfico habrá que indicarlo, podemos poner la variable en el entorno mediante nuestro archivo de configuración del intérprete de órdenes, o simplemente poner delante de cada tarea de cron, script y similar la línea DISPLAY=:1 antes de la orden.

 

Configurar Ubuntu 12.10 en Linode para servir aplicaciones de Django

abril 11, 2013 at 12:14 pm | Blog, Django, Programación, virtualenv | No comment

 

Hemos creado una nueva máquina virtual usando Linode y vamos a ver cómo configurar un entorno virtual y servir webs con django.

Lo primero que haremos será loguearnos mediante ssh a nuestra cuenta, una vez echo esto, ponemos al día los paquetes:

apt-get update && apt-get upgrade

A continuación instalamos los programas que vamos a necesitar:

apt-get install git python2.7 virtualenvwrapper

Aceptamos las dependencias y los dejamos instalados. Como puede que hay descargado nuevas versiones de la imagen del kernel reiniciamos y de paso aprovechamos ese reinicio para que virtualenvwrapper añada algunas líneas de configuración a nuestro archivo de configuración del intérprete de comandos. Esperamos unos segundos y volvemos a conectar vía ssh.

Cuando ya hemos conectado de nuevo vamos a crear el proyecto y su entorno virtual:

mkvirtualenv -p /usr/bin/python2.7 mi-proyecto-django

(usamos la opción -p para indicar el ejecutable de Python 2, ya que la última versión de Ubuntu llega de fábrica con Python 3.
Cuando hemos creado el entorno automáticamente estaremos dentro, como se puede observar porque el prompt de la terminal ha cambiado a (mi-proyecto-django)usuario@localhost:…

Nos vamos a /var/www/ (que será el directorio en el que contengamos nuestros proyectos de django) y clonamos desde nuestro repositorio/subimos via ftp/similar el código. Lo recomendable es usar un sistema de control de versiones, github o bitbucket ofrecen ambas servicio gratuito de alojamiento. Cuando lo tenemos descargado podemos seguir con la configuración del proyecto. Al usar entornos virtuales es muy sencillo replicar las condiciones de las máquinas de desarrollo en el entorno de producción con la ayuda del programa pip. Mientras vamos desarrollando e instalando programas y dependencias en el entorno virtual no tenemos que ir apuntando cada programa y cada versión, podemos obtenerlos todos de una vez ejecutando

pip freeze

pip freeze > requirements.txt es una forma de volcar la salida de los resultados de paquetes y versiones a un único archivo de requisitos, que debería ir acompañando al código fuente en el control de versiones para que al subirlo al hosting de producción estuviera preparado para instalarlas.

Contando con que tenemos ese archivo con los nombres y versiones de paquetes, podemos instalarlos fácilmente con la ejecución en el hosting de:

pip install -r requirements.txt

Vigila los mensajes que devuelve la ejecución ya que por ejemplo en una de mis dependencias (django-chronograph) la versión de “distribute” es demasiado antigua y tengo que actualizarla antes de poder completar la intalación de todos los requisitos. El propio mensaje te informa de que eso se resuelve ejecutando

easy_install -U distribute

Como ya le hemos indicado al virtualenv que la versión de python a usar es la 2.7 no hace falta que indiquemos que queremos usar “easy_install 2.7 -U distribute” ya que son equivalentes. Cuando hemos actualizado distribute volvemos a instalar los requisitos de requirements.txt, terminará de descargar e instalar los paquetes que quedaron pendientes y tendremos el entorno correctamente preparado. Si vas a instalar PIL date una vuelta por esta entrada en la que comentan cómo habilitar el soporte para varios formatos: http://askubuntu.com/questions/156484/how-do-i-install-python-imaging-library-pil

Vamos con el resto de programas que vamos a utilizar: necesitaremos un servidor de bases de datos, un servidor web y para facilitarnos la vida con la gestión de la base de datos una interfaz gráfica, para ello instalamos los paquetes:

apt-get install mysql-server phpmyadmin nginx php5-fpm

y sus dependencias.

Vamos con la configuración del software. Lo primero que te preguntará el sistema al instalar el servidor MySQL es que le proporciones una clave para el usuario root, hazlo y termina de configurarlo. Tras eso, el asistente de instalación de phpmyadmin te indicará que deben instalarse ciertas tablas de configuración, acepta, indícale la clave de root que anteriormente habías elegido y por último deja que se elija una clave aleatoria para el acceso de phpmyadmin a la base de datos.

En el siguiente paso vamos a comprobar si el servidor NGINX está funcionando, primero nos aseguramos de que se esté ejecutando con la orden:

service nginx start

y posteriormente vamos a la ip de nuestro hosting, en la que deberíamos ver un mensaje similar a: Welcome to nginx!
Si lo vemos, continuaremos creando la configuración para servir phpmyadmin. Crearemos un archivo phpmyadmin en la ruta /etc/nginx/sites-available/ con el contenido siguiente:


server {
listen 81; ## listen for ipv4; this line is default and implied
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6

root /usr/share/;
index index.php index.html index.htm;

# Make site accessible from http://localhost/
server_name localhost;

# Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
deny all;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}

location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires max;
log_not_found off;
}

location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location /phpmyadmin {
root /usr/share/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+\.php)$ {
try_files $uri =404;
root /usr/share/;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /usr/share/;
}
}

location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}
}

Con esto tendremos a NGINX sirviendo phpyadmin a través de php-fpm, y vamos a intentar acceder a él para ver si lo hemos configurado correctamente.
Primero arrancamos php5-fpm por si no lo estuviera:

service php5-fpm start

Habilitamos la configuración que hemos creado

ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/

y reiniciamos NGINX para que lea la nueva configuración:

service nginx restart

Por último vamos a probar si está sirviendo en el puerto que hemos configurado (el 81) introduciendo el dominio/ip seguido de :81, algo como 111.222.333.444:81 (esta ip es de pega)
Nos debería dar la bienvenida la página de login de phpmyadmin.

Ahora, si tenéis algunas tablas de la base de datos que queráis importar podéis hacerlo mediante la terminal con

mysql -u username -p database_name < dumpfile.sql

Comprobamos antes de continuar que todo está correctamente ejecutando

./manage.py validate

Y pasamos a configurar el sitio que servirá NGINX en /etc/nginx/sites-available/proyecto y luego hacemos un soft link a él en /sites-enabled/


server {
index index.html index.htm index.php;
#client_max_body_size i8M;

# Make site accessible from http://localhost/
listen 82;
#server_name tu.dominio.com;

location /media/ { # MEDIA_URL
root /var/www/proyecto/ruta/a/carpeta/padre/de/media; # MEDIA_ROOT
autoindex off;
access_log off;
expires 30d;
}

location /static/ { # STATIC_URL
root /var/www/proyecto/ruta/a/carpeta/padre/de/static; # STATIC_ROOT
autoindex off;
access_log off;
expires 30d;
}

location /favicon.ico {
root /var/www/proyecto/ruta/a/carpeta/padre/de/favicon.ico;
try_files $uri $uri/ /static/img/favicon.png;
autoindex off;
access_log off;
expires 30d;
}

# Serve shakingjobs django project at /var/www
location / {
root /var/www/proyecto/ruta/a/manage.py; # Ej /var/www/proyecto/miproyecto , no incluir manage.py
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_pass http://localhost:8000/; # puerto local en el que se lanzará el servidor gunicorn
}
}

Probaremos a lanzar el servidor gunicorn y a reiniciar el servidor NGINX con:


./manage.py run_gunicorn &
service nginx restart

Acudiendo a tu.direccion.ip:82 deberás encontrar tu proyecto ejecutándose. Si va bien podemos adornar un poquito el lanzamiento de gunicorn, controlar logs y similar con un script un poco más detallado como un runserver.sh:


#!/bin/bash
set -e
LOGFILE=/var/log/gunicorn/proyecto.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
cd /var/www/ruta/a/proyecto/
source /home/django/.virtualenvs/proyecto/bin/activate
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn_django -w $NUM_WORKERS \
--log-level=debug --bind=127.0.0.1:8002 \
--log-file=$LOGFILE 2>>$LOGFILE

Bien, sólo queda automatizar el lanzamiento de gunicorn en cada inicio del sistema. Esto se hace creando un archivo de configuración en /etc/init/proyecto.conf con un contenido similar a:


description "My Project gunicorn instance"
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec /var/www/proyecto/runserver.sh

Y tras eso habilitarlo como servicio con la orden:

ln -s /lib/init/upstart-job /etc/init.d/proyecto

Con eso podremos arrancar el servicio con service proyecto start y detenerlo con service proyecto stop, además de que se iniciará en los niveles 2, 3, 4 y 5 del sistema

 

Categorias:

Archivo: