lunes, octubre 21, 2013

Compartir una carpeta entre equipos GNU/Linux

Instalar el sshfs:
S1> sudo apt-get install sshfs

Desde el equipo origen (S1) generamos clave y la transferimos al equipo que comparte la carpeta:
S1> ssh-keygen -b 4096 -t rsa
S1> ssh-copy-id “usuariodestino@<S2-ip> -p22”

Montar la carpeta del destino:
sshfs usuariodestino@S2:/directorio_remoto /directorio_local 

 
Para que sea permanente añadimos en el rc.local:
su - usuario -c "sshfs -o nonempty usuariodestino@S2:/directorio_remoto /directorio_local "

Para no perder conexión añadir al fichero /etc/ssh/ssh_config del cliente (S1):
ServerAliveInterval 120

jueves, septiembre 19, 2013

Reducir el consumo de recursos de KDE

Logo KDE
KDE es un escritorio altamente configurable e inicialmente vienen activadas algunas funcionalidades que pueden ser muy interesantes pero para equipos con pocos recursos pueden ser una carga innecesaria.


A continuación tenemos una lista de  acciones a realizar para lograr que KDE sea más ligero:


  1. Detener Akonadi:
    cd
    nano .config/akonadi/akonadiserverrc

    Cambiar StartServer a false.
  2. Desactivar Nepomuk:
    En el menú de KDE selecciona “Preferencias del sistema”.
    En la sección “Apariencia y comportamiento del espacio de trabajo” selecciona “Búsqueda de escritorio”.
    Deselecciona "Habilitar el escritorio semántico Nepomuk".
  3. Eliminar los efectos de escritorio:
    En el menú de KDE selecciona “Preferencias del sistema”.
    En la sección “Apariencia y comportamiento del espacio de trabajo” selecciona "Efectos del escritorio" y en la solapa "General" desactivar:
    • Activar los efectos del escritorio al inicio
    • Gestión de ventanas mejorado
    • Diversas animaciones
  4. Eliminar servicios del arranque.
    En el menú de KDE selecciona “Preferencias del sistema”.
    En la sección "Administración del sistema" seleccionar "Arranque y apagado". Dentro de "Gestor de servicios" desmarcar los que no sean de utilidad como: BlueDevil (para bluetooth), Módulo de búsqueda de Nepomuk, Tablet Wacom, etc.
  5. Cambiar el tema oxigeno por plastik.
    En el menú de KDE selecciona “Preferencias del sistema”.
    • En la sección “Apariencia y comportamiento del espacio de trabajo
    selecciona "Apariencia del espacio de trabajo" en "Decoración de ventanas" selecciona "Plastik".
    • En la sección "Apariencia y comportamiento comunes" selecciona "Apariencia de las aplicaciones" y en "Estilo" selecciona Plastique.
  6. Reduciendo las notificaciones de las aplicaciones y del sistemas:
    En el menú de KDE selecciona “Preferencias del sistema”.
    En la sección “Apariencia y comportamiento del espacio de trabajo”
    selecciona "Notificaciones de las aplicaciones y del sistemas".
    1. Opción "Gestionar notificaciones", solapa "Opciones del reproductor" marcar "Sin salida de audio"
    2.  Opción "Notificación de lanzamiento", seleccionamos "sin cursor ocupado" y desactivamos notificación de la barra de tareas.
     
Otra opción puede ser instalar el paquete Kubuntu-Low-Fat-Settings, proporciona una configuración para la reducción de recursos:

sudo apt-get install kubuntu-low-fat-settings

Extracción de pistas de audio sin perdida (FLAC) desde la consola de GNU/Linux

Si tratamos de preservar una colección de CDs de Audio lo mejor será volcar las pistas en un formato sin perdida para su futura utilización. Vamos a utilizar FLAC (Free Lossless Audio Codec) pues se trata de un formato abierto que nos permitirá ahorrar algo de espacio. También trataremos de hacerlo de la forma más automática posible y para ello utilizaremos el programa abcde (A Better CD Encoder).

Comencemos por la instalación del software necesario, en el caso de Ubuntu sería:

sudo apt-get install flac abcde

Luego creamos un fichero llamado por ejemplo abcde.conf donde indicaremos lo siguiente:

INTERACTIVE=n
FLACOPTS='--verify --best' 
OUTPUTTYPE="flac"
OUTPUTFORMAT='Pista${TRACKNUM}'
VAOUTPUTFORMAT='Pista${TRACKNUM}'
PADTRACKS=y                             # Enumera las pista como 01 02 en lugar de 1 2
MAXPROCS=2
 
Para los nombre de los ficheros resultantes podemos utilizar las siguientes variables:
${ARTISTFILE}
${ALBUMFILE}
${TRACKNUM}
${TRACKFILE} 
 
Finalmente sólo tendremos que llamar a abcde indicándole el fichero de configuración:
abcde -c /home/usuario/abcde.conf 

 
En algunas ocasiones nos puede interesar cambiar el formato del audio o simplemente tener un fragmento del mismo en otro formato como mp3, para ello podemos realizar:
 
ffmpeg -i audio-original.flac -t 30 fragmento-30-segundos.mp3
 

Instalación de ffmpeg en Ubuntu 14.04

sudo add-apt-respository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg gstreamer0.10-ffmpeg


viernes, septiembre 13, 2013

Unión de imagenes digitalizadas sobre un documento mediante Hugin Panorama Stitcher

Instalación en Ubuntu 13.04:

sudo apt-get install hugin enblend


Ahora es el momento de abrir Hugin Panorama Stitcher y cargar las imágenes que tengamos de la digitalización. Pulsar el botón 1. Cargar Imágenes de la solapa Asistente y seleccionamos todas las imágenes.


Obtendremos un dialogo donde tenemos que indicar el campo de visión horizontal (CdVH) donde indicaremos 10 (un valor entre 5 y 40 grados será lo correcto dependiendo del tipo de escáner que tengamos) y pulsamos Aceptar:


Cambiamos a la solapa Imágenes y en el apartado Feature Matching Setting seleccionamos "Cpfind (multirow/stacked)" y pulsamos el botón Crear puntos de control.



Cambiamos a la solapa Optimizador y seleccionamos optimizar con los siguientes parámetros personalizados, desmarcamos Usar sólo puntos de control entre imágenes elegidas en la ventana de vista previa, desmarcamos todos los campos de Orientación de la imagen y marcamos solamente los de rotación(r), X, Y y Z. Pulsamos ¡Optimizar ahora!



Finalmente cambiamos a la solapa Empalmador y seleccionamos en Projection Equirectangular y luego vamos pulsando los botones: Calcular campos de visión, Calcular tamaño óptimo, Fit Crop to images y Stich!

lunes, septiembre 02, 2013

Instalación de OpenERP 7 en Ubuntu Server 12.04 desde launchpad

OpenERP
Comenzaremos instalando el software necesario para poder instalar OpenERP:

sudo apt-get install graphviz ghostscript postgresql-client \
python-dateutil python-feedparser python-matplotlib \
python-ldap python-libxslt1 python-lxml python-mako \
python-openid python-psycopg2 python-pybabel python-pychart \
python-pydot python-pyparsing python-reportlab python-simplejson \
python-tz python-vatnumber python-vobject python-webdav \
python-werkzeug python-xlwt python-yaml python-imaging postgresql bzr
 
sudo apt-get install python-dev mc python-setuptools python-babel \
python-feedparser python-reportlab-accel python-zsi python-openssl \
python-egenix-mxdatetime python-jinja2 python-unittest2 python-mock \
python-docutils lptools python-psutil python-paramiko poppler-utils \
python-pdftools antiword  

wget http://gdata-python-client.googlecode.com/files/gdata-2.0.17.tar.gz 
tar zxvf gdata-2.0.17.tar.gz 
cd gdata-2.0.17/
sudo python setup.py install
 
Creamos el usuario de openerp:
sudo adduser openerp  --home=/opt/openerp 

Creamos la base de datos y usuario de openerp en postgresql:

sudo passwd postgres
su - postgres
createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt openerp
exit

Instalamos el servidor de openERP: 
su - openerp 
mkdir v7
cd v7
bzr branch lp:openerp-web/7.0 web
bzr branch lp:openobject-server/7.0 server
bzr branch lp:openobject-addons/7.0 addons
bzr branch lp:openerp-spain/7.0    
exit
 

Configuración del servidor openERP:
sudo cp /opt/openerp/v7/server/install/openerp-server.conf /etc/openerp-server.conf
sudo chown openerp.openerp /etc/openerp-server.conf
sudo chmod 640 /etc/openerp-server.conf 
sudo nano /etc/openerp-server.conf
 
En el fichero de configuración /etc/openerp-server.conf lo dejamos así:
[options]
; This is the password that allows database operations:
admin_passwd = <clave-administrador>
db_host = False
db_port = False
db_user = openerp
db_list = False
db_password = <nuestra-clave-de-base-datos-postgresql>
addons_path = /opt/openerp/v7/addons,/opt/openerp/v7/web/addons,/opt/openerp/v7/7.0
;Log settings
logfile = /var/log/openerp/openerp-server.log
log_level = error 

Configurando el sistema para el correcto funcionamiento del log:


sudo mkdir /var/log/openerp
sudo chown openerp.root /var/log/openerp
sudo cp /opt/openerp/v7/server/install/openerp-server.logrotate /etc/logrotate.d/openerp-server
sudo chmod 755 /etc/logrotate.d/openerp-server

Inicio automático del servidor de openERP, para ello: 
sudo touch  /etc/init.d/openerp-server
sudo chmod 755 /etc/init.d/openerp-server
sudo chown root: /etc/init.d/openerp-server
sudo update-rc.d openerp-server defaults
sudo nano /etc/init.d/openerp-server
Contenido del fichero /etc/init.d/openerp-server : 
#!/bin/sh

### BEGIN INIT INFO
# Provides:             openerp-server
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Should-Start:         $network
# Should-Stop:          $network
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Enterprise Resource Management software
# Description:          Open ERP is a complete ERP and CRM software.
### END INIT INFO

PATH=/bin:/sbin:/usr/bin
DAEMON=/opt/openerp/v7/server/openerp-server
NAME=openerp-server
DESC=openerp-server

# Specify the user name (Default: openerp).
USER=openerp

# Specify an alternate config file (Default: /etc/openerp-server.conf).
CONFIGFILE="/etc/openerp-server.conf"

# pidfile
PIDFILE=/var/run/$NAME.pid

# Additional options that are passed to the Daemon.
DAEMON_OPTS="-c $CONFIGFILE"

[ -x $DAEMON ] || exit 0
[ -f $CONFIGFILE ] || exit 0

checkpid() {
    [ -f $PIDFILE ] || return 1
    pid=`cat $PIDFILE`
    [ -d /proc/$pid ] && return 0
    return 1
}

case "${1}" in
        start)
                echo -n "Starting ${DESC}: "

                start-stop-daemon --start --quiet --pidfile ${PIDFILE} \
                        --chuid ${USER} --background --make-pidfile \
                        --exec ${DAEMON} -- ${DAEMON_OPTS}

                echo "${NAME}."
                ;;

        stop)
                echo -n "Stopping ${DESC}: "

                start-stop-daemon --stop --quiet --pidfile ${PIDFILE} \
                        --oknodo

                echo "${NAME}."
                ;;

        restart|force-reload)
                echo -n "Restarting ${DESC}: "

                start-stop-daemon --stop --quiet --pidfile ${PIDFILE} \
                        --oknodo
      
                sleep 1

                start-stop-daemon --start --quiet --pidfile ${PIDFILE} \
                        --chuid ${USER} --background --make-pidfile \
                        --exec ${DAEMON} -- ${DAEMON_OPTS}

                echo "${NAME}."
                ;;

        *)
                N=/etc/init.d/${NAME}
                echo "Usage: ${NAME} {start|stop|restart|force-reload}" >&2
                exit 1
                ;;
esac

exit 0
 
Para iniciar el servidor:
sudo /etc/init.d/openerp-server start 

 

OpenERP en el puerto 80 y 443

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8069
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8070
iptables-save 

Aplicar actualizaciones

sudo /etc/init.d/openerp-server stop
sudo su openerp
cd /opt/openerp/v7/addons/
bzr pull
cd /opt/openerp/v7/web/
bzr pull
cd /opt/openerp/v7/7.0/
bzr pull
cd /opt/openerp/v7/server/
bzr pull

./openerp-server -c /etc/openerp-server.conf -u all -d <base-de-datos>

Aplicar parches

cd /opt/openerp/v7/addons/
bzr patch <url-al-parche>

 
Fuentes de información:
http://help.openerp.com/question/2562/how-to-install-openerp-v70-on-ubuntu-1204-from-launchpad-repository/ 
http://www.theopensourcerer.com/2012/12/how-to-install-openerp-7-0-on-ubuntu-12-04-lts/ 
http://huber.salazarcarlos.com/?p=23


miércoles, agosto 28, 2013

Desplegando aplicaciones django en Ubuntu 12.04 con un servidor web Apache y el módulo mod_wsgi

Empezaremos por la instalación del software necesario, posiblemente alguno ya se encuentre instalado en nuestro equipo:


sudo apt-get install python
sudo apt-get install python-mysqldb 
sudo apt-get install apache2 libapache2-mod-wsgi
sudo apt-get install mysql-server  
sudo easy_install -U distribute
sudo pip install django 

Verificamos la correcta instalación de django, para ello vemos la versión instalada (actualmente la 1.5.2):
 
django-admin --version


Crear la base de datos y el usuario de mysql que utiliza nuestro proyecto. Una vez conectados a mysql como administrador (root) indicaremos las siguientes ordenes:

mysql>CREATE DATABASE mi_base_de_datos;
mysql>CREATE USER 'mi_usuario'@'localhost' IDENTIFIED BY 'mi_clave';
mysql>GRANT ALL PRIVILEGES ON mi_base_de_datos.* TO 'mi_usuario'@'localhost';
mysql>FLUSH PRIVILEGES;

Copiamos o creamos el proyecto Django, en el caso que sea un proyecto nuevo:

$django-admin startproject mi_proyecto
$cd mi_proyecto
$python manage.py startapp mi_aplicacion

Editamos el fichero de configuración del proyecto (mi_proyecto/settings.py) para adaptar los valores al nuevo equipo, quedaría así:


DEBUG = False
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'mi_base_de_datos',                      # Or path to database file if using sqlite3.
        'USER': 'mi_usuario',                      # Not used with sqlite3.
        'PASSWORD': 'mi_clave',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

ALLOWED_HOSTS = ['midominio.es']

TIME_ZONE = 'Europe/Madrid'

LANGUAGE_CODE = 'es-es'

SITE_ID = 1

USE_I18N = True

USE_L10N = True

SE_TZ = True

MEDIA_ROOT = ''

MEDIA_URL = ''

STATIC_ROOT = ''

STATIC_URL = '/static/' 
 
ADMIN_MEDIA_PREFIX ='/static/admin/'
 
STATICFILES_DIRS = (
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
)

ROOT_URLCONF = 'mi_proyecto.urls'

WSGI_APPLICATION = 'mi_proyecto.wsgi.application'

TEMPLATE_DIRS = (
    '/home/usuario/mi_proyecto/mi_aplicacion/templates' 
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
     'django.contrib.admin',
     'mi_aplicacion',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)
                  
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}
                  
Si se trata de un proyecto nuevo, creamos las tablas de la base de datos y el usuario administrador mediante:


python manage.py syncdb

Podemos verificar el correcto funcionamiento del proyecto lanzando el servidor web de desarrollo de django. Para que funcione correctamente el servidor de desarrollo en el fichero de configuración tendremos que indicar Debug=True, en caso contrario obtendremos '500 server error':


python manage.py runserver 192.168.0.1:8001


Editamos el fichero de configuración de Apache  /etc/apache2/sites-available/default para indicar dentro del <VirtualHost *:80> la configuración del módulo mod_wsgi.

El fichero quedaría así:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        WSGIDaemonProcess miproyecto python-path=/home/usuario/mi_proyecto/
        WSGIProcessGroup miproyecto
        WSGIScriptAlias / /home/usuario/mi_proyecto/mi_proyecto/wsgi.py
 
        Alias /static/admin/ /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/
               
        <Directory /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin>
            Order allow,deny
            Allow from all
        </Directory>
 
        <Directory /home/usuario/mi_proyecto/mi_proyecto>
        <Files wsgi.py>
        Order deny,allow
        Allow from all
        </Files>
        </Directory> 
 
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
 
</VirtualHost> 
 
Reiniciamos el servidor apache y ya estaría listo:

 sudo service apache2 restart

domingo, agosto 25, 2013

Instalar la herramienta de musicología music21en ubuntu 13.04

music21

music21 está desarrollado en python así que tendremos que confirmar que  Ubuntu tenga instalado python, para ello podemos ver la versión instalada mediante:

python -V

obtendremos que la versión instalada es la 2.7.4 de python.

Ahora instalaremos algunos aplicaciones y paquetes de python adicionales que son utilizados por music21:

sudo apt-get install lilypond
sudo apt-get install musescore 
sudo apt-get install ipython
sudo apt-get install ipython-notebook
sudo apt-get install python-matplotlib
sudo apt-get install python-scipy 
sudo apt-get install python-pandas python-sympy python-nose

Instalamos music21:

sudo pip install music21


Ahora toca probar que todo se ha instalado correctamente, desde ipython de forma interactiva podemos recuperar una partitura de ejemplo y mostrarla mediante musescore:

from music21 import *
sBach = corpus.parse('bach/bwv7.7')
us = environment.UserSettings()
us['musicxmlPath'] = '/usr/bin/musescore'
sBach.show()

miércoles, julio 17, 2013

Editando vídeos desde la consola de GNU/Linux

Supongamos que partimos de un vídeo en formato DV (formato sin compresión habitual en las cámaras de vídeo) con la grabación completa y deseamos un fragmento. Por lo tanto, lo primero será reproducirlo para ver en que instantes de tiempo vamos a realizar los cortes. Tendremos que anotar el tiempo en que se inicia y la duración del fragmento que deseamos, todo en segundos.

Para extraer el fragmento se puede utilizar la herramienta avconv  de audio y vídeo del proyecto Libav, es un proyecto de software libre para la manipulación de datos multimedia.

Su instalación en Ubuntu es muy sencilla:
sudo apt-get install libav-tools


Para trocear un vídeo utilizaremos:

avconv -i video.dv -vcodec copy --ss <inicio-en-segundos> -t <duración-en-segundos> -acodec copy trozo.dv


Probablemente el fragmento de vídeo en formato DV ocupe mucho espacio, puede ser interesante reducir su peso y perder la menor calidad posible, para ello una buena opción puede ser el codec de vídeo H.264/MPEG-4 AVC.

Convertir un vídeo a ffv1 y pcm_s16le para preservación:
avconv -vsync passthrough -i trozo.dv -vcodec ffv1 -g 1 -acodec pcm_s16le -map 0:v -map 0:a trozo.mkv


Convertir un vídeo a H.264/MPEG-4 AVC:

avconv -i trozo.dv -vcodec libx264 trozo.mp4

También nos puede interesar convertir el video a WebM, un formato de audio y vídeo diseñado libre de royaltis para su utilización en HTML5,  el proyecto está respaldado por Google.

Convertir un vídeo a WebM:

avconv -i trozo.dv trozo.webm

En algunas ocasiones nos podemos encontrar que el vídeo sólo tiene un canal de audio grabado, es decir, sólo escuchamos el sonido por uno de nuestros altavoces. Para poder solucionarlo podemos utilizar la herramienta Sound eXchange (SoX), un editor de audio desde la línea de comandos publicado con licencia GNU por Chris Bagwell.

Primero habrá que extraer el audio del fragmento de vídeo, para ello haremos uso nuevamente de la herramienta avconv y lo pasaremos al formato FLAC (Free Lossless Audio Codec), FLAC es un codec de audio de baja compresión sin perdida de información, a diferencia de MP3.
FLAC es un formato abierto y libre de royaltis, soporta metadatos, posicionamiento rápido y almacenar la imagen de portada.

Extraer el audio de un vídeo:
avconv -i trozo.mp4 -f flac audio.flac

Unir varios vídeos en uno:mencoder -oac copy -ovc copy -o final.VOB trozo1.VOB trozo2.VOB

Duplicar el audio de un canal en el otro y aumentar el volumen al doble:
sox -v 2.0  audio.flac audio-completo.flac channels 1

Sox nos avisará en el caso que el aumento del volumen produzca saturación del canal, indicando el número de ondas que se han recortado en la operación. Un ejemplo de esta situación: sox WARN sox: `audio.flac' balancing clipped 638 samples; decrease volume?

Ahora toca incorporar el nuevo audio al trozo del vídeo del cual lo obtuvimos. Para ello utilizaremos avconv, donde le facilitaremos como flujo de vídeo (-i trozo.mp4) el trozo de vídeo del que partíamos y como flujo de audio (-i audio-completo.flac) el audio con el canal duplicado. También hay que indicarle a avconv que el codec de vídeo sea H.264/MPEG-4 AVC (-vcodec libx264):

avconv -i trozo.mp4 -i audio-completo.flac -map 0:0 -map 1:0 -vcodec libx264  trozo-final.mp4

En algunas ocasiones nos puede solicitar avconv un bit rate, en ese caso se lo podemos indicar de la siguiente forma para uno de 640kb/s:


avconv -i trozo.mp4 -i audio-completo.flac -map 0:0 -map 1:0 -vcodec libx264 -ab 640k trozo-final.mp4



Para duplicar el audio de varios vídeos se puede utilizar el siguiente script en python:


#!/usr/bin/python
import sys, os
 
for i in range(1,len(sys.argv)):
    fichero= str(sys.argv[i])
    fichero_salida="%s-st.%s" % (fichero.rsplit(".",1)[0],fichero.rsplit(".",1)[1])
    os.system("avconv -i %s -f flac kk.flac" % fichero)
    os.system("sox -v 2.0  kk.flac kk2.flac channels 1")
    os.system("avconv -i %s -i kk2.flac -map 0:0 -map 1:0 -vcodec libx264  %s" % (fichero,fichero_salida))
    if os.path.exists("kk.flac"):
      os.remove("kk.flac")
    if os.path.exists("kk2.flac"):
      os.remove("kk2.flac"
 
 
El script espera que le facilitemos los vídeos a procesar como argumentos, y los convertirá a vídeos con el codec H.264/MPEG-4 AVC, el sonido en los dos canales y con el volumen duplicado.

Rotar un vídeo 

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4
  

Capturar la pantalla en vídeo (screencast)
Tenemos que indicarle a avconv que tome la fuente del servidor Xorg (-f x11grab): avconv -f x11grab -s 1366x768 -r 25 -i :0.0 -same_quant video.mp4

viernes, julio 12, 2013

Creando y manipulando PDFs desde la consola de Linux

Para reducir el peso de un documento PDF podemos utilizar Ghostscript:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=final.pdf inicial.pdf


en lugar de /ebook podemos utilizar también:
  • /screen una resolución más baja.
  • /printer una resolución de calidad para impresión.
  • /prepress  una resolución de calidad para pre-impresión.
  • /default la resolución original.

También se puede utilizar la siguiente combinación de ordenes, pero no respeta el texto seleccionable en sengundo plano resultante de aplicar OCR sobre una imagen digitalizada:

pdf2ps inicial.pdf kk.ps
ps2pdf kk.ps final.pdf



Conversión de imágenes a PDF mediante la aplicación ImageMagick, partimos de imágenes en formato jpeg enumeradas consecutivamente, el tamaño del documento será de 1000x1374 pixeles por página:

convert *.jpg -page 1000x1374 -adjoin fichero.pdf


Conversión de un fichero PDF de texto a PDF de imágenes:

pdf2djvu -i salida.djvu mifichero.pdf
djvups salida.djvu temporal.ps
ps2pdf temporal.ps mificherodeimagenes.pdf

Conversión de imágenes TIFF a un documento PDF:

tiff2ps *.tiff | ps2pdf -sPAPERSIZE=a4  salida.pdf

Extraer imágenes de un PDF, (-j en formato jpg, -f   página inicial, -l página final):


pdfimages -f 1 -l 1 -j fichero.pdf imagenes

jueves, julio 11, 2013

Evitar la selección de texto en las páginas web

Mediante la hoja de estilos podemos desactivar la selección de texto de una sección de nuestra página web, por ejemplo para el siguiente fragmento de una página web:

<div id="mitexto" class="sinseleccion"> texto no seleccionable</div>

en la hoja de estilos correspondiente a esta página web indicaremos:

.sinseleccion{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
  -o-user-select:none;
  -ms-user-select:none;

}

jueves, julio 04, 2013

Configuración de un punto de Información o kiosko con Ubuntu Linux.

Partiremos de una instalación de Ubuntu 13.04 y será necesario instalar los siguientes paquetes:

sudo apt-get install openssh-server 
sudo apt-get install lxde

Configurar la red, editar el fichero /etc/network/interfaces y añadir la siguiente información con los datos de nuestra red:

auto eth0
iface eth0 inet static
address 192.168.0.162
netmask 255.255.255.0
gateway 192.168.0.1

dns-nameserver 8.8.8.8


Esta configuración de red nos permitirá acceder al punto de información mediante el servidor sshd para gestionar el equipo.

Establecer lxde por defecto:

sudo update-alternatives --config x-session-manager

Ahora creamos el usuario kiosko:

sudo adduser kiosko

Crear el fichero .xinitrc de sólo lectura en la carpeta personal del usuario kiosko, para evitar la activación del salva pantallas y además se lance lxde:


xset s off &
xset -dpms &

exec startlxde

 
Editar el fichero /etc/xdg/lxsession/LXDE/autostart  y desactivar todas las aplicaciones que se inician automáticamente, mi fichero ha quedado así:

#@xscreensaver -no-splash
#@lxpanel --profile LXDE
#@pcmanfm --desktop --profile LXDE
#@/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1


Instalar el complemento R-kiosk para firefox, disponible en https://addons.mozilla.org/en-US/firefox/addon/r-kiosk/

Crear el fichero /home/kiosko/.config/lxsession/LXDE/autostart que lanzará de forma automática el navegador web con la información que deseamos mostrar en nuestro punto de información:

@firefox file:///home/kiosko/index.html


Desactivar las combinaciones de teclas, editando el fichero /home/kiosko/.config/openbox/lxde-rc.xml y cambiar los permisos a sólo lectura para el usuario kiosko.


Desactivar los terminales de texto. La mayoría de las distribuciones de GNU/Linux traen activos varios terminales de texto que se pueden acceder con la combinación de teclas ctr+alt+F1 hasta ctr+alt+F6. Por lo que editaremos como root los ficheros  /etc/init/ttyX.conf, donde X corresponde al número del terminal (1 al 6) y comentaremos las líneas (ejemplo del tty1.conf):

# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.

#start on stopped rc RUNLEVEL=[2345] and (
#            not-container or
#            container CONTAINER=lxc or
#            container CONTAINER=lxc-libvirt)

#stop on runlevel [!2345]

#respawn
#exec /sbin/getty -8 38400 tty1


Activar el acceso automático al entorno gráfico para el usuario kiosko, por lo que tendremos que editar el fichero /etc/lightdm/lightdm.conf y establecer la siguiente configuración:

[SeatDefaults]
autologin-user=kiosko
autologin-user-timeout=0




¿Cómo renombrar documentos obtenidos de digitalizar a una cara documentos a doble cara?

En algunas ocasiones necesitamos digitalizar documentos que están a doble cara pero nuestro escaner no tiene la posibilidad de voltear la página para digitalizar simultáneamente las dos caras, aunque si dispone de alimentador de páginas.

Por lo que podemos digitalizar en una primera etapa las caras impares y en una segunda etapa las caras pares empezando por el final (para no tener que reordenar todas las hojas).

Mediante el siguiente script en Python podemos renombrar todos los ficheros para que estén ordenador y poder procesarlos posteriormente:


import os 
ficheroImpar="caraA" #nombre del fichero de la digitalizacion de las caras impares
inicioFicheroImpar=1 #numero por el que comienza el fichero
finFicheroImpar=157 #numero por el que termina

ficheroParInverso="caraB"
inicioFicheroParInverso=157 #los documentos estan digitalizados empezando por el final
finFicheroParInverso=1

nuevoFichero="vcongreso"
extension=".tiff" #extension de los ficheros
digitos=3 #numero de digitos para completar con ceros

for numeroImpar in range (inicioFicheroImpar, finFicheroImpar+1):
  nombreImpar=ficheroImpar+str(numeroImpar).zfill(digitos)+extension
  nuevoNombreImpar=nuevoFichero+str(numeroImpar*2-1).zfill(digitos+2)+extension
  
  numeroPar=inicioFicheroParInverso-numeroImpar+1
  nombrePar=ficheroParInverso+str(numeroPar).zfill(digitos)+extension
  nuevoNombrePar=nuevoFichero+str(numeroImpar*2).zfill(digitos+2)+extension
  
  print "Renombrar: "+nombreImpar+" "+nuevoNombreImpar
  if os.path.exists(nombreImpar):
    os.rename(nombreImpar,nuevoNombreImpar)
  else:
    print "No existe: "+nombreImpar
    
  print "Renombrar: "+nombrePar+" "+nuevoNombrePar
  if os.path.exists(nombrePar):
    os.rename(nombrePar,nuevoNombrePar)
  else:
    print "No existe: "+nombrePar
 
 
Otra situación habitual es tener todas las páginas digitalizadas pero la numeración no sea consecutiva, por lo que el script anterior no funcionará. Primero renombramos todos los ficheros de forma consecutiva mediante el siguiente programa en python:



import os

fichero="cara B" #nombre del fichero de la digitalización de las caras impares
inicioFichero=1 #numero por el que comienza el fichero
finFichero=190

extension=".tiff" #extension de los ficheros
digitos=3 #numero de digitos para completar con ceros
nuevaSecuencia=1

for numero in range (inicioFichero, finFichero+1):
  nombre=fichero+str(numero).zfill(digitos)+extension
  nuevoNombre=fichero+str(nuevaSecuencia).zfill(digitos)+extension
  if os.path.exists(nombre):
    nuevaSecuencia=nuevaSecuencia+1
    print "Renombrar: "+nombre+" "+nuevoNombre
    os.rename(nombre,nuevoNombre)