Archivo por meses: abril 2015

OCR usando GNU/Linux

En la actual «era digital», todo resulta mucho más sencillo -la mayoría de las veces-, trabajando con los archivos en formato electrónico en lugar de en papel.

Además, para archivarlos es mucho más cómodo, no ocupan espacio físico en el despacho y además es todo más versátil (por ejemplo, puedes hacer búsquedas rápidamente en grandes cantidades de ficheros).

Dicho esto, está claro que además de tener archivos en formato electrónico, también nos encontramos con archivos en formato impreso (en papel, vaya). Estos últimos podemos escanearlos para guardarlos en el ordenador.

La «pega» es que si necesitamos editarlos esto no es posible porque, una vez escaneados, son una imagen -no son texto-. En cualquier caso, a estas alturas esto es algo que se soluciona fácilmente, existiendo aplicaciones que además de escanear realizan un reconocimiento óptico de caracteres (lo que se conoce como «OCR», por sus siglas en inglés: Optic Character Recognition).

Estas aplicaciones analizan la imagen en cuestión en busca de patrones que puedan parecerse a las letras de un idioma y signos de puntuación.

Si el documento tiene imágenes entre el texto y/o el formato no es sencillo (tiene tablas, columnas, etc.), el OCR no será todo lo preciso que podría, pero para la mayoría de documentos, cartas, informes, etc., nos hará un buen trabajo (quitándonos muchas horas de pasarlo de nuevo a ordenador tecleándolo entero).

Interesa que la imagen escaneada esté en una calidad aceptable. Cuando mayor contraste mejor (es decir, mejor escanear en blanco y negro que en escala de grises o color normalmente).

Lo que nos interesa a nosotros es, por tanto, encontrar un software que realice ocr en nuestro sistema operativo (GNU/Linux, claro). Yo os recomiendo la aplicación tesseract, la cuál fue desarrollada en su momento por HP y ahora es continuada por Google. Existe para la mayoría de las distros y es gratuita bajo la licencia Apache 2.0. Si vuestra distro no la trae en los repositorios oficiales (no será una distro muy conocida entonces), Podéis descargarla aquí:

Usar la aplicación es sencillo:

tesseract IMAGEN.png SALIDA -l spa

donde:

  • IMAGEN.png es nuestra imagen escaneada (acepta varios formatos, entre ellos png)
  • SALIDA es el fichero de salida que se genera con el texto
  • con -l spa indicamos que el texto está en español (admite muchos más idiomas (*))

(*) Para ver qué idiomas tenemos instalados escribimos: tesseract –list-langs.

 

Paralelizando tareas en la línea de comandos

Los procesadores actuales, como bien sabéis, tienen varios cores. Esto significa que en teoría pueden ejecutar varias cosas en paralelo. Así, si tienen 4 cores, podrían ejecutar 4 procesos al mismo tiempo.

El problema es que normalmente las aplicaciones no están diseñadas para sacar todo el rendimiento a nuestros procesadores con todos sus cores, de forma que a veces está trabajando un core mientras los otros apenas hacen nada.

En GNU/Linux tenemos un comando (desarrollado por la propia fundación GNU) que permite ejecutar varias tareas en paralelo. Se llama parallelSe encuentra disponible para todas las distros más importantes directamente desde los repositorios.

El ejemplo más sencillo es el de comprimir varios archivos. Veamos cómo lo haríamos normalmente:

gzip *

Vamos a ejecutar este comando con el comando time delante para que al finalizar nos diga cuánto ha tardado (así podremos luego comparar más fácilmente). Además, le pondremos la opción -1, que hará que comprima más y tardará un poquito más:

[ user ] [~/a] > time gzip -1 * 
gzip -1 * 10,80s user 0,40s system 96% cpu 11,622 total

En mi PC obtengo un uso de sistema del 96% y 11,6 segundos de tiempo en ejecutarlo.

Se obtiene un 96% de uso de CPU porque para el comando time, 100% es el máximo uso de un core. Como tenemos 4 cores (en el caso de mi CPU), el total sería 400%, por lo que se están desperdiciando aproximadamente(*) 3/4 partes de procesador.

Para llevar a cabo esta tarea con parallel tendríamos que hacerlo así:

[ user ] [~/a] > ls | time parallel gzip -1
[... información sobre parallel ...]

parallel gzip -1 10,93s user 0,53s system 317% cpu 3,605 total

Lo que da como resultado un 317% de uso de CPU y un total de 3,6 segundos de ejecución.

El hecho de que se obtenga 317% de uso de CPU se explica por lo que decíamos antes. time tiene en cuenta 100% por cada core. Por tanto, aquí se está aprovechando mucho mejor la CPU. En nuestro ejemplo hemos comprimido sólo 4 archivos de 66 megas cada uno. Si comprimiéramos más y durara más el proceso, poco a poco el % de uso aumentaría aprovechando aún más todos los cores, es decir, cuanto más dure el proceso más partido sacará.

Si queréis comprobar de una manera más visual qué porcentaje de cada core se está usando en cada momento podéis usar la utilidad htop.

Parallel tiene muchas más opciones. Podéis incluso usarlo para usar no sólo los cores de un equipo, sino las cpus de varios equipos en red. Un parámetro interesante es el que permite especificar qué capacidad de cpu queremos usar para la tarea. Es el parámetro -j. Siguiendo con el ejemplo anterior, podríamos poner esto:

[ user ] [~/a] > ls | time parallel -j 50% gzip -1
[ ... información sobre parallel ... ]

parallel -j 50% gzip -1 10,84s user 0,46s system 188% cpu 6,005 total

Con esto indicamos que se use la mitad de la CPU. En este caso el resultado ha sido 164% de ocupación de CPU y unos 6 segundos, es decir, como usamos la mitad, tardamos el doble -aproximadamente- que antes.

Aquí tenéis el tutorial de GNU por si le queréis sacar todo el pringue a este comando.

Más info aquí.

(*) Decimos aproximadamente porque el sistema operativo está ejecutando más cosas aparte de nuestro comando gzip.

Obteniendo información del hardware con dmidecode

A veces uno necesita (o simplemente quiere) saber qué componentes tiene su PC exactamente. Una forma de saberlo es abrir el equipo y observar estos datos viendo los componentes directamente.

Sin embargo, si queremos saber esto sin necesidad de abrir el equipo podemos usar dmidecode.

dmidecode es una aplicación para GNU/Linux que permite obtener información sobre el hardware y que está almacenada en la BIOS. Hace uso de DMI (Desktop Management Interface), que no es más que un framework para obtener información sobre los componentes de un ordenador.

Así pues, con dmidecode podemos conocer, entre otros, la marca de la placa base, el modelo, la revisión, la cantidad de memoria RAM instalada, bancos de memoria ocupados y libres, etc., etc.

Lo primero que necesitamos es instalar el paquete dmidecode usando el sistema de paquetería de la propia distribución. En el caso de openSUSE:

zypper in dmidecode

En el caso de ubuntu

aptitude install dmidecode

y así sucesivamente.

Aunque tiene varios parámetros (ya que la información que se puede recopilar es bastante completa), la forma más sencilla de usarla es pasándole una cadena que especifica qué parámetro queremos saber. Por ejemplo, para saber el fabricante de la placa base ejecutaremos esto:

dmidecode -s baseboard-manufacturer

En el caso de mi portátil, el resultado es: Dell Inc.

Para ver todos los parámetros de este tipo ejecutamos esto:

dmidecode -s

Ahí se listan todos, pero podemos obtener aún más información usando otros parámetros.

Si queremos obtener toda la información referente a la memoria, por ejemplo, usaríamos el parámetro -t:

dmidecode -t memory

Esto ofrece mucha información. Si buscamos algo más concreto, como por ejemplo, saber cuál es la capacidad máxima de memoria que admite nuestro equipo pondremos:

dmidecode t16 | grep -i "maximum capacity"

Como siempre, con man podéis obtener toda la información que podéis necesitar para sacarle más partido al comando.

Personalizando zsh: antigen

En una entrada anterior hablaba de oh-my-zsh, que es una forma de personalizar zsh.

Aunque con oh-my-zsh se pueden conseguir cosas bastante interesantes como vimos, con antigen se puede realizar esto con más facilidad.

Antigen es realmente un gestor de plugins para zsh, que actúa de intermediario entre nosotros y el fichero de configuración .zshrc (con antigen es mucho más fácil su gestión).

Para instalar antigen haremos esto:

curl -L https://raw.githubusercontent.com/zsh-users/antigen/master/antigen.zsh > antigen.zsh

source antigen.zsh

A partir de ahora ya podemos probarlo. Como ejemplo vamos a ver cómo activar el plugin que activa el resaltado de la sintaxis en zsh:

antigen bundle zsh-users/zsh-syntax-highlighting

Con esto activamos dicho plugin.

Si queremos probar con un tema para el prompt, nada más fácil:

antigen theme agnoster

Como ya os indiqué en la entrada de oh-my-zsh, tenéis todos los temas aquí.

Si queremos que estos cambios estén siempre activos cuando arranquemos nuestra sesión en el terminal, meteremos estos cambios en .zsh, pero de esta forma:

antigen bundles <<EOBUNDLES
  command-not-found
  gem
  npm
  sublime
  python
EOBUNDLES

De esta forma, podemos meter todos los plugins que queramos aplicar en nuestro zsh metiendo una línea nueva entre los dos EOBUNDLES.

Si queremos aplicar un tema pondremos esto:

antigen theme jdavis/zsh-files themes/jdavis

Y, por último, introducimos la línea que aplica todos los cambios:

antigen apply

Esto último es necesario al usar antigen bundles en lugar de una lista de antigen bundle. La diferencia es que con antigen bundles y luego antigen apply la carga de los plugins es mucho más rápida.

Muy interesante es la opción de actualizar todos los bundles (plugins) que tenéis en vuestro .zshrc. Se hace automática y sencillamente con este comando:

antigen update

Para actualizar el propio antigen usaremos este comando:

antigen selfupdate

Con esto ya deberíais tener vuestro zsh personalizado con plugins y temas chulos usando antigen. Si queréis más información, podéis mirar aquí pero, sobre todo, aquí.