2008/12/13

MDB en Linux

A pesar de que se vive mucho mejor sin Windows, el uso extendido de ciertas aplicaciones dependientes de este sistema operativo hacen que los usuarios se encuentren a merced de los antojos comerciales de Microsoft. Un caso bien conocido son las herramientas de CAD que no acaban de encontrar su competidor en el mundo FLOSS (Free Libre Open Software Libre). Pero quizás, es la suite ofimática Microsoft Office la que más impide el paso de los usuarios al uso de Linux.
OpenOffice es una alternativa plena para substituir a la suite ofimática de Microsoft, pero a veces la conversión de formatos no es satisfactoria y si hay macros de por medio menos. De todos modos, yo me resisto a volver a Windows y existen formas de lograr trabajar a gusto sobre Linux a pesar de la traba de los formatos propietarios.
En mi caso actual me encuentro con una "base de datos" Access mdb con muchísimas tablas que quería poder manejar desde Linux. Para ello existe mdbtools que es un conjunto de herramientas para leer mdb. Se puede instalar mediante el comando:
$sudo aptitude install mdbtools
Para listar las tablas de un mdb podemos usar el comando:
$mdb-table -1 nombrefichero.mdb
Para exportar a CSV sin comillas y separado por comas he usado la siguiente sentencia:
$mdb-export -S -q '' -d ';' -D '%Y-%m-%d' nombrefichero.mdb nombretabla > nombretable.csv
Y para exportar todas las tablas a la vez...

IFS=$'\n'
for table in `mdb-tables -1 nombrefichero.mdb`; do
echo '**** Exporting table: '$table '****'
mdb-export -S -q '' -d ';' -D '%Y-%m-%d' nombrefichero.mdb $table > $table'.csv'
echo 'Done.'
done
***** Actualización *****
Se puede abrir un MDB desde openoffice conectándose mediante ODBC. La receta:
http://wiki.services.openoffice.org/wiki/Connecting_to_Microsoft_Access
       
   

2008/10/25

Cómo instalar OpenOffice 3.0

El pasado 13 Oct 2008 se anunció la release de OpenOffice 3.0. Ésta incluye interesantes mejoras entre ellas me llamaron la atención las siguientes:
  • Importación y edición de archivos PDF
  • Una extensión de publicación en WikiMedia
  • Mejoras en gráficos estadísticos
Para instalarlo en Ubuntu 8.04 hice lo siguiente:
  1. Desinstalar la versión antigua (creo que no es estrictamente necesario).
    $apt-get remove openoffice.org-core
  2. Bajar el tar.gz de la página oficial de OpenOffice y descomprimirlo en /tmp

  3. Entrar en la nueva carpeta y en el directorio DEBS

  4. Instalar los paquetes debian con la instrucción:
    $sudo dpkg -i *.deb
  5. Entrar en la carpeta desktop-integration y repetir el comando del punto 4.

La prueba de que me funcionó :)
       
   

2008/09/11

Corrección ortográfica en Latex

Estoy "entregado a la entrega" de mi proyecto fin de carrera cuya memoria estoy redactando en galego usando Latex. Las ventajas de escribir textos y documentación con Latex o Docbook son muy altas (sobre todo en calidad y rapidez de escritura de contenido), pero tienen pequeñas incomodidades frente a los procesadores de texto más habituales. Una de ellas es la falta de corrección ortográfica automática que suele ser de gran ayuda.

La alternativa es GNU Aspell. Este corrector permite, entre otros formator, trabajar directamente con ficheros Tex. Se puede integrar con otras aplicaciones [1].

Un uso básico sería:
$aspell -d es -encoding\=iso-8859-15 -c fichero.tex
Para correción ortográfica del gallego en Debian y Ubuntu, existe sólo el paquete aspell-gl-minimos. Esto es un problema dado que en galego exiten diferentes convenciones: oficial, de minimos y reintegracionista.

Otra alternativa es MySpell utilizado en la suite OpenOffice y ahora sustituído por HunsPell. En mancomun.org fixeron o paquete para galego[2]. El uso básico sería:
$hunspell -t -d gl fichero.tex

[1]: http://aspell.net/man-html/Using-Aspell-with-other-Applications.html
[2]: http://wiki.mancomun.org/index.php/Corrector_ortogr%C3%A1fico_para_OpenOffice.org
       
   

2008/07/14

Ejecutar un script en R

R (the R Project for Statistical Computing) es un potente programa de software libre de estadística y gráficos. La cantidad de funciones que ofrece es inmensa: en el momento de escribir este post cuenta con 1493 paquetes adicionales. Es muy probable que cualquier cosa que necesites de estadística, gráficos, etc. esté ya implementada en R. Me gustaría destacar que existen muchas funciones relacionadas con la geomática, como acceso a datos espaciales, geoestadística, etc.

Su uso está principalmente orientado a la línea de comando, pero permite también la ejecución de scripts de comandos R.

Si tenemos el fichero "/home/foo/myRscript.R" existen 2 alternativas para ejecutarlo:

  • Desde consola:
  • R CMD BATCH /home/foo/myRscript.R

  • Desde el propio R:

  • R> source("/home/foo/myRscript.R")

           
       

    2008/06/17

    Dividir ficheros en trozos

    Trabajando con datos geográficos referentes a grandes extensiones de terreno es normal encontrarse con la necesidad de guardar ficheros de gran tamaño en un disco externo. Si este disco está formateado con FAT, sistema de ficheros que no admite ficheros de un mayores de 4GB de tamaño, tenemos un pequeño problema. Es común encontrarse con errores del tipo:
    cp: writing `/media/EXT-HDD/mdt.asc': File too large
    Lo mismo puede pasar al mandar un fichero grande a través de una cuenta de correo con restricciones en el peso de los adjuntos.

    La solución que dividir el fichero, por ejemplo usando el comando, split:
    $split -b1500m archivo.ext archivo.@

    Con esta simple sentencia tengo mi archivo cortado en trozos de 1500 MB.
    Para restituir el archivo original bastaría con hacer un cat:
    $cat archivo.* > archivo.ext
           
       

    2008/06/12

    Descomprimir archivos ZIP

    Normalmente descomprimir un zip en Ubuntu es muy sencillo; se pincha sobre el archivo comprimido, se abre automáticamente el programa File-Roller (que viene por defecto en los escritorios GNOME), selecciona el directorio de destino y listo.

    Para descomprimir desde línea de comandos lo normal es usar el programa unzip.

    Ejemplo de uso:
    $unzip fichecho.zip -d destino
    Otra alternativa es usar File-Roller directamente desde linea de comandos. Para el mismo caso que antes escribiríamos:
    $file-roller -e destino -f fichecho.zip
    Usar file-roller tiene la ventaja de que ofrece soporte para muchos formatos de compresión con la misma forma de comprimirlos/descomprimirlos. Además, mi experiencia personal es que file-roller es más fiable que unzip descomprimiendo grandes ficheros.

    Formatos soportados a día de hoy por file-roller:
    • Zip (.zip)
    • Jar (.jar , .ear , .war)
    • Lha (.lzh)
    • Rar (.rar)
    • Zoo (.zoo)
    • Arj (.arj)
    • AR (.ar)
    • Paquetes Debian (.deb) (Read-only mode)
    • Paquetes RPM (.rpm) (Read-only mode)
    • 7-zip (.7z)
    • ISO (.iso) (Read-only mode)
    • Stuffit (.bin, .sit)
    • Ficheros gzip, bzip, bzip2, compress, lzo
    • ...y por supuesto, maneja ficheros tar
           
       

    2008/06/10

    Ejecutar programas externos desde python

    ACTUALIZACIÓN: Si estás ejecutando muchas acciones interaccionando con otros programas en python puede ser interesante Fabric. Super recomendado!!!!


    Existen muchas alternativas para ejecutar programas desde python.
    Aquí dejo unos ejemplos:

    import os
    os.system('ls /home/')
    

    Existen multiples variantes del comando os.exec(). Por ejemplo, ejecutar el programa indicado reemplazando el proceso actual:
    os.execl('/bin/ls')
    

    Lo mismo que antes, pero con un listado de parámetros (atención: recordad que la lista de argumentos empieza en 0, no en 1):
    os.execl('/bin/ls', '/bin/ls', '-l', '-i')
    

    Ejecuta el comando buscando en $PATH y reemplazando el proceso actual:
    os.execlp('ls', 'ls', '-lisa')
    

    Si lo que necesitas es crear un nuevo proceso primero:
    if os.fork()==0:
        os.execlp('ls')
    else:
        print 'Fork has failed!'
    

    Y si queremos ver la salida del programa ejecutado:
    import commands
    
    a = commands.getstatusoutput('ls')
    
    aList = a.split('\n')
    

    En lugar de usar la opción de hacer un fork() y obtener un nuevo proceso que controlaremos con su PID, es recomendable usar el módulo subprocess y su clase Popen. Más sobre esto y otros temas relacionados en el aquí.
           
       

    2008/06/06

    Selección vertical en emacs

    Emacs es un super editor para programadores. Es un poco complejo, al principio, y yo confieso que lo intenté usar en 2 ocasiones y decidí volver a editores "menos sofisticados". A día de hoy, soy un entusiasta de Emacs, pero no me enzarzaré en la guerra entre editores... Con los editores me pasa como con los GIS, uso muchos diferentes, según para qué cosa... aunque Emacs apunta a ser el "EDITOR" para todo. ¿Cuál será el GIS definitivo...?

    Emacs tiene innumerables características y funciones. Hoy voy a comentar una bastante curiosa (no exclusiva de emacs): la selección vertical también llamada, block-selection, o rectangle selection.

    En emacs, los rectángulos son zonas rectangulares definidas por dos columnas y dos filas cualesquiera. Esto permite, por ejemplo, copiar, pegar, borrar o insertar columnas de texto en cualquier parte, o realizar ciertas operaciones sobre el texto dentro del rectángulo.

    Para definir la región o rectángulo sobre el que se va a aplicar el comando se pone una marca (C-space) en una esquina y el cursor en la esquina diagonalmente opuesta.


    Una vez seleccionado se pueden realizar las acciones típicas sobre la región seleccionada intercalando 'r' en el comando:












    Cortar (kill)C-x r k
    Pegar (yank)C-x r y
    Borrar (delete)C-x r d
    Insertar espacio (open)C-x r o
    Limpiar (clear)C-x r c
    Insertar texto (string)C-x r t string RET

    En el ejemplo, he usado un rectangle para copiar unas cotas de un MDE con formato xyz de manera muy rápida y visual:

           
       

    2008/05/30

    Distintas formas de listar ficheros en linux

    Trabajando en consola es muy común listar los contenidos de los directorios.
    Lo típico es usar el comando ls que tiene muchisimas opciones, pero su uso normal es:


    Otra manera es usar el comando find sin parámetros:


    Hoy he aprendido una nueva: tree. ¿Quién necesita entorno gráfico? jejeje

           
       

    2008/05/27

    Diccionario de English-Español para Firefox

    Hace años usaba el programa Babylon que pinchando sobre cualquier palabra (en una web, en un editor de texto, incluso en una fotografía) te ofrecía su traducción en una ventanita. Este software incluso buscaba las preposiciones en caso de que fuera un phrasal verb... El programa era muy útil, pero de pago y dejé de usarlo.

    Googleando un poco, descubrí que existe un free-babylon en source-forge, pero parece que no tiene mucha actividad actualmente.




    Sin embargo, firefox ofrece muchos addons relacionados con traducción de palabras, páginas web, etc. Existe uno en concreto, que me resulta especialmente útil y que recuerda al funcionamiento de Babylon. Se trata de SpanishTrans. Esta extensión te permite seleccionar una determinada palabra y pulsando botón derecho de ratón y clickando en English->Spanish te abre una ventana con la definición extraída de wordreference.

           
       

    2008/05/26

    Ejecutar un script externo en consola de Python, IDLE, Jython y BeanShell

    Jython y BeanShell son muy útiles para ejecturar comandos de forma interactiva. Sin embargo, cuando se quieren ejecutar directamente scripts escritos la opción de cortar y pegar no es muy cómoda. Por eso en ocasiones, puede ser útil usar lo siguiente:
    En BeanShell:
    filepath = "/usr/local/scripts/bsh/myscript.bsh";
    source(filepath);
    En Jython:
    filepath = '/usr/local/scripts/py/myscript.py'
    execfile(filepath)
    Este modo de lanzar scripts tiene también la ventaja de que, en caso de fallos en el script, los mensajes de error dan una información más completa aportando por ejemplo la línea donde se ha producido el error.

    UPDATE: Ejecutar un script externo en IDLE o en la consola interactiva de python

    En la consola de IDLE se podría ejecutar un script externo con:
    filepath = '/usr/local/scripts/py/myscript.py'
    execfile(filepath)

    En python3 sería:

    exec(open("/usr/local/scripts/py/myscript.py").read())

    UPDATE2: Ejecutar un script externo en ipython 

    En ipython existe la posibilidad de usar el comando "run" directamente (sin comillas en el path) para ejecutar un script externo, es decir:
    run /usr/local/scripts/py/myscript.py


           
       

    2008/05/24

    Definición Programación Orientada a Eventos

    Andrés, Pablo y yo hemos comprendido por fin un término difícil de entender para aquellos programadores nutridos de otros paradigmas de programación. La "programación orientada a eventos" puede ser resumida, tras varios congresos, charlas, conferencias, etc. a los que he asistido con mi portátil, con la siguiente fotografía:


    Indispensable la acreditación colgada del cuello... :-)
    Para los que prefieran la definición tradicional, consultar wikipedia.
           
       

    2008/05/23

    Bajar automáticamente archivos de un FTP con python

    A menudo hay que acceder a un ftp y bajarse gran número de ficheros con un determinado nombre de diferentes directorios. Automatizar este proceso puede ser bastante útil en muchos casos. Usar un cliente FTP gráfico no suele ser de ayuda en estos casos. Los clientes FTP en línea de comandos son interactivos por lo que no se pueden realizar scripts con ellos, más allá de ejecutar una lista de comandos predefinida.

    Este simple script se conecta a un servidor, se posiciona en la carpeta 'CATASTRO', y se accede a todos los directorios con profundidad '1' guardando los ficheros que interesan, en este caso shapefiles llamados MASA, en una carpeta local.

    #!/usr/bin/python
    # DESCRIPTION: Python script that connects to a FTP server and 
    #              gets some Shapefiles from 'CATASTRO' folder and subfolders
    # AUTHOR: Nacho Uve
    # DATE  : May 2008
    # LICENSE: GPL2 or greater
    from ftplib import FTP
    
    ftp = FTP('server.com');
    ftp.login(user='myuser', passwd='mypassword')
    ftp.cwd("CATASTRO");
    
    # OPTION: To get a 'ls -l' list                                                                                                                                                                 
    # dirs = []                                                                                                                                                                                     
    # # Used a callback to 'dirs'                                                                                                                                                                   
    # ftp.dir(dirs.append)                                                                                                                                                                          
    
    dirs = ftp.nlst()
    for row in dirs:
        print row
        ftp.cwd(row)
        # Save shapefiles in the local machine with the first word of the folder as filename
        ftp.retrbinary('RETR MASA.SHP', open(row.split()[0]+'.shp','wb').write)
        ftp.retrbinary('RETR MASA.SHX', open(row.split()[0]+'.shx','wb').write)
        ftp.retrbinary('RETR MASA.DBF', open(row.split()[0]+'.dbf','wb').write)
        ftp.cwd('..')
    ftp.quit()