Archivos de la categoría Programacion

Cómo convertir (miles de) archivos pdf a escala de gris, con un solo comando

Existen ocasiones en las que debemos automatizar tareas en nuestras labores diarias, y me ocurrió que debía convertir cerca de 4000 archivos PDF de color a escala de gris.

Utilizando bash (bajo linux, o utilizando la interfaz de Linux que provee Windows 10), podemos crear un par de scripts que nos ayuden a automatizar esta tarea.

Primero debemos crear en la carpeta donde tengamos almacenados los PDFs, un archivo que se va a llamar “conviertegris.sh” que contendrá el siguiente código:

#!/bin/bash
gs -sOutputFile=pdfgris.pdf -sDEVICE=pdfwrite -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dCompatibiltyLevel=1.4 -dNOPAUSE -dBATCH $@

y luego le daremos permisos de ejecución mediante el siguiente comando en la consola

chmod +x conviertegris.sh

Si tuvieramos un solo archivo PDF que quisieramos convertirlo a escala de gris. podríamos utilizar el script de la siguiente manera:

./conviertegris.sh miPDFaColor.pdf

y esto nos generará un nuevo archivo pdf llamado pdfgris.pdf que contendrá la versión en gris de nuestro archivo original.

Ahora, para automatizar este proceso para todos nuestros PDFs, vamos a crear otro script que se va a llamar “conviertelote.sh”, que contendrá el siguiente código:

#!/bin/bash
find ./ -name "*.pdf" | sed 's|./||' > listapdf.txt
mkdir pdfgris
for file in $( < list .txt); do ./conviertegris.sh "$file"; mv pdfgris.pdf ./pdfgris/"$file"; done
rm listapdf.txt

Al ejecutar este script mediante el comando bash conviertelote.sh, empezaremos a ver que el proceso arranca y dentro de la carpeta pdfgris empezaremos a ver nuestros archivos convertidos.

Con esto, y luego de un par de horas, habremos terminado la tarea, sin tener que pasar por el suplicio de abrir cada archivo en un editor de PDFs y guardarlos en escala de gris, ahorrándonos muchisimo tiempo y trabajo.

Descarga música grátis, sin morir en el intento

Antes de continuar, quiero dejar muy claro, que no me hago responsable por el uso (o mal uso) del código presentado en este post. Todo ésto fue desarrollado con un fin puramente académico, sin fines de lucro. Siéntanse libres de usar el código, pero no me responsabilizo de cualquier implicación legal que su uso pudiera acarrear.

Descargár música sin tener el derecho sobre la misma es ilegal!! Nunca olviden eso.

Ahora si, sabiendo a lo que vamos, para una de mis asignaturas del master, una de las tareas era explotar un API de algún sitio web (facebook, twitter, linkedin, etc), para extraer información, analizarla y obtener beneficios de la misma: Por ejemplo, y a breves rasgos, pude realizar un análisis del sentimiento de los tweets generados en determinado momento, en paises donde se habla español, que pueden visualizarlo en este enlace.

Para ir un poco más allá, se me ocurrió la idea de extraer el API de un sitio que no tenga una interfaz de programación documentada. El objetivo: El sitio de música http://music.163.com

Este sitio (chino) no tiene un API documentada, pero mediante el uso de algunas herramientas web, como FireBug, pudimos obtener las llamadas que se realizan para obtener datos de artistas, discos y canciones.

Este script está escrito en Python 2.7, y para ejecutarlo basta con descargar el archivo desde este enlace, descomprimirlo, y ejecutar desde la línea de comandos lo siguiente:

python musica.py

El menú presentará 3 opciones de búsqueda: por autor, por disco o por canción. Bastará con escoger el tipo de búsqueda, seleccionar el item de las posibles opciones encontradas, y descargar el item escogido.

Espero les sea de utilidad 😀 y recuerden! No descarguen música ilegal!

Para más información, pueden ingresar a mi repositorio en GitHub

Interfaces Multitouch: Ejemplos en Android y Windows 8

Como parte de una de las asignaturas que estoy tomando en el master acá en la Politécnica de Valencia, se nos pidió realizar aplicaciones que utilicen la interfaz multitouch de dispositivos android, y con windows 8.

Para android, se realizó una pequeña aplicación que permite manipular objetos (en este caso cuadrados de colores) dentro de la pantalla. Usando los eventos translate, pinch y rotate, además de un array de objetos cuadrado (donde se almacena la posicion, tamaño y rotación de cada uno de los cuadrados dibujados en pantalla), se obtiene algo como lo que muestro en el video a continuación:

El código fuente de este ejemplo, lo pueden descargar desde https://github.com/patolin/multitouch

Para windows 8, hice algo un poco más interactivo, y resultó en un pequeño sintetizador de sonido. Mediante la interfaz, se puede escoger entre 3 tipos de onda (sinusoidal, triangular y cuadrada) y sus respectivas envolventes. El video que les muestro a continuación fué grabado en el emulador de tablet de visual studio, ya que lastimosamente no pude grabar video en la prueba final que se hizo sobre una mesa interactiva real

El código fuente de este ejemplo, lo pueden descargar desde https://github.com/patolin/Win8Synth

La computación del Siglo 21: De donde viene y hacia donde va?

Pues si! sigo vivo! jajajaja

La verdad que no he tenido mucho tiempo para postear desde que me mudé a España para estudiar el master, pero quería aprovechar para compartirles algo de lo que he estado leyendo por acá. Les resumo un par de artículos relacionados con la Computación Ubicua, y los orígenes de toda la tecnología móvil que estamos usando en la actualidad.

Los orígenes de la computación Ubicua: Xerox Parc a finales de los 80s

En 1987, Bod Sprague, Richard Bruce y otros investigadores del Xerox PARC, hicieron la propuesta de fabricar un display del tamaño de una pared, con la idea de que dicho display funcionara también como dispositivo de entrada (para dibujar con lápiz) o incluso como scanner de documentos (que se escanerían al acercarlos al display). Este tipo de display, haría más transparente el uso de pizarrones, extendiendo su poder computacional al usarlo con otros dispositivos externos, conectados en red.

Esta visión de los “computer-walls” fué inspirada desde el modelo actual de computación, donde existía el paradigma de una persona por computador, y motivó a los investigadores a distribuir computadores de una manera ubicua e invisible, distribuidos en el entorno.

Al mismo tiempo, otro grupo de investigadores, del grupo “Work Practices and technology “ dentro del PARC, observaban cómo las personas usaban la tecnología, pero no se enfocaban en el hardware, sino en los detalles situacionales del uso; particularmente el cómo el hardware se incrustaba dentro de las actividades sociales diarias de los individuos, y cómo interactuaba con el medio físico, conocido como “el mundo real”.

A partir de la convergencia de estas investigaciones, a inicios de 1998 se creó el “Ubiquotous Computing Program”, que se encargaría de dar respuesta a lo que se consideraba como erróneo en el modelo de computación actual: demasiado complejo, que requería demasiada atención por parte del usuario, y demasiado aislado del mundo real.

En el año de 1992, fué cuando se presentó el primer sistema ”Ubi-comp”, que redefiniendo para el futuro la relación entre humanos, trabajo y tecnología, y la tecnología para la era post-PC.

A finales de 1988, se iniciaron 3 proyectos dentro del Ubiquitous Computing Program en el PARC: un display del tamaño de una pared, conocido como LiveBoard, el ParcPad, y el ParcTab, que eran dispositivos de computación pequeños, financiados por DARPA. Estos 3 proyectos se planeaban interconectar, mediante una infraestructura de red flexible, que no sólo reconocería el dispositivo, sino su localización, tendencias de uso, y propietario de cada uno. Esto crearía un nuevo concepto de lo que los computadores deberían ser y cómo deberían sentirse. En el año de 1994, se logró obtener la funcionalidad necesaria para que estos dispositivos pudieran usarse a diario en el PARC.

El LiveBoard incluía un sistema de dibujo colaborativo, capacidad de dibujo remoto, interfaces casuales y sistemas de anotación de primera clase, y se vendieron algunos cientos de unidades (mediante la subsidiaria de Xerox LiveWorks) antes de que el proyecto se cerrara en 1998.


Mientras que el LiveBoard se conectaba a las redes de datos de una manera tradicional, el ParcPad mantenía conexión constante a la red mediante un sistema “Near Field Radio” designado por Ed Richley. El pad estaba diseñado para ser usado mediante una interfaz de ventanas y lápiz, donde el hardware y el sistema operativo fueron diseñados por varios investigadores del PARC. El pad probó ser una plataforma importante para pruebas de conexiones por radiofrecuencia, protocolos, redes móviles e interfaces de usuario, y hasta la fecha de publicación del documento (1999), se seguian utilizando ParcPads en el PARC. Además el ParcPad es el precursor del Personal Document Reader, lanzado por Xerox en el año 2000.


El ParcTab, fué ideado para ser utilizado con una sola mano, y se integre con aplicaciones en las estaciones de trabajo, mediante una red de comunicación por señales infrarojas, basada en agentes y sensible a la localización. El Tab tenía utilidades de trabajo en tiempo real, que incluían correo electrónico, calendario, notas, libreta de direcciónes, pager, entre otras. Además, incluía conectividad con el LiveBoard y la famosa cafetera CSL del PARC. El ingreso de información se realizaba mediante el sistema alfanumérico Unistroke ubicado en la pantalla táctil, y por 3 botones ubicados ergonómicamente en el Tab.


 

El computador del siglo 21

Los computadores, a pesar de haber crecido en número en la actualidad, no han podido escapar de su forma tradicional de uso, manteniendo en una u otra manera, el modelo de interacción con el usuario.

El concepto de “Computación Ubicua” no se refiere a que podamos llevar un computador a todas partes, ni que tengamos conectividad a redes en todo momento, ya que por ejemplo, podríamos tener un computador portátil, con conexión a internet en todas partes, pero siempre estaremos supeditados a que debemos centrar nuestra atención en dicho computador para usarlo.

Una analogía interesante, del cómo la tecnología se desvanece en el entorno, son los motores que se usan dentro de las fabricas. A inicios de la revolución industrial, era un solo motor el que se encargaba de mover múltiples máquinas mediante ejes y poleas. En la actualidad, son varios motores los que se encargan de dar movimiento a cada una de las máquinas de las fabricas. Con este ejemplo vemos que los motores como tal, se integran tanto al entorno de la fabrica que su presencia pasa prácticamente desapercibida.

De la misma manera, y sin que nos demos cuenta, los computadores invaden nuestro entorno. Además de nuestros “típicos” equipos de computación (llámense computadores de escritorio/portátiles y teléfonos celulares), interruptores, termostatos, televisores, refrigeradoras y lavadoras inteligentes, por poner unos ejemplos, nos dan la idea de hacia donde vamos. Todos estos dispositivos interconectados, pueden compartir información con los usuarios y entre ellos. Incluso muchos de estos dispositivos conocen su ubicación en el entorno, y cómo reaccionar ante cambios del mismo.

Estamos llegando a un punto donde sin notarlo, podemos tener decenas o centenas de computadores en un solo salón. Tomando como ejemplo los Tabs desarrollados en el PARC a finales de los 90, pudieron aplicarlos creando una identificación digital activa, que permitía llevar un registro de la ubicación de su poseedor, pudiendo brindar aplicaciones como la apertura automática de puertas de acceso según el nivel de autorización, saludar a los investigadores por su nombre después de reconocer su id, e incluso, las estaciones de trabajo que ellos usaban, podían detectar su identificación, y recuperar sus preferencias de uso, notificaciones de alertas y notas que ellos escribían, para brindar una experiencia más personalizada, independiente del computador que utilizaran. Ojo que no se ha usado ningún sistema de inteligencia artificial, sino únicamente pequeños computadores interactuando con el entorno.

Ideas como la de las tabletas electrónicas, cuya función es la de ser “cuadernos electrónicos” que pueden ser llevados a cualquier parte, y usados por cualquiera, independientemente de sus preferencias y configuración, contradicen el esquema clásico de un computador por usuario. Estas tabletas, pueden incluso ser interconectadas para compartir información cuando se las coloca en un escritorio, de la misma manera que en una mesa se colocan hojas de papel para revisar información impresa.
Todo este tipo de hardware y aplicaciones nos lleva a la necesidad de nuevas implementaciones de software. En el caso de los LiveBoards, no se puede implementar un modelo de uso que requiera un teclado o un ratón para interactuar con la misma, más aún, cuando existe la posibilidad de uso mediante un lápiz.

Para la computación ubicua, existen 3 tecnologías que deben ser desarrolladas: Computadores de bajo costo y bajo consumo, que incluyan dispositivo de visualización de información, el software para la interacción con los usuarios y el entorno, y la red que los interconecte a todos. En la actualidad, estamos alcanzando estos 3 objetivos tecnológicos, de tal manera que los dispositivos interconectados están ganando popularidad con los usuarios.

Desde los inicios en la investigación de la computación ubicua, hasta la actualidad, no se ha producido ningún avance excesivamente revolucionario, sino más bien, las tecnologías se dirigirán hacia un punto donde todo se lleve a cabo más rápido, con menos esfuerzo mental y con menos restricciones físicas. Lo más importante de la computación ubicua, será el reducir el problema de la sobrecarga de información hacia el usuario. A esto, la cita “There is more information available at our fingertips during a walk in the woods than in any computer system, yet people find a walk among trees relaxing, and computers frustrating” resume el objetivo de la computación ubicua, es decir, no forzar a los humanos a acoplarse a los computadores, sino que los usuarios, al usar los computadores, lo encuentren tan placentero como una caminata en el bosque.

Problemas de espacio de almacenamiento en Linux, como encontrarlos

Quizás algunos de ustedes se hayan encontrado con este “pequeño” problema:

linux1

Pues si, inesperadamente, y por causas no planificadas, se llenó el espacio de almacenamiento de nuestro servidor Linux. Ahora la pregunta es: Cómo sabemos que archivos o carpetas son los causantes?

Para esto, podemos usar el siguiente comando desde el terminal

sudo du -sx /* 2>/dev/null | sort -n

Este comando revisará el uso de espacio de cada carpeta (en este caso de la raiz /) y nos irá indicando que carpeta tiene el mayor uso de espacio en nuestro disco duro. Así, navegando por las subcarpetas, podremos ver que archivos son los que se han comido nuestro almacenamiento, y sabremos que medidas tomar.

linux2

Carga elevada de CPU con MySQL

Quizás la mayoría de ustedes no hayan tenido este problema, pero en el servidor web de mi trabajo, tenía una elevada carga (60/70%) de cpu al proceso mysqld. No es un sitio con tráfico elevado (unas 300 visitas diarias), y tiene ram y disco suficiente para aguantar eso y más, y muchas veces esta carga elevada, ralentizaba la carga de la página web.

Resulta que el problema estaba en la falta de optimización periódica de las tablas. Para solucionar esto, ejecutamos el siguiente comando:

mysqlcheck -u usuario_mysql -p --auto-repair --check --optimize --all-databases

Y listo! asunto arreglado. El proceso mysqld volvió a la normalidad, y el servidor volvió a ser el de antes

Paginador para custom post types en wordpress > quick fix!

Quizás se hayan topado con el problemita del paginador, al trabajar con custom types en wordpress. Simplemente el paginador no aparece.

Les dejo este código para arreglar esto. El truco es temporalmente mover la variable $wp_query a un temporal, y cargar $wp_query con el query del custom post type

 

< ?php
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query('post_type=custom_post_type' . '&paged=' . $paged . '&posts_per_page=10');
?>
< ?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>

 

< ?php endwhile; ?>
< ?php previous_posts_link(); ?>
< ?php next_posts_link(); ?>
< ?php $wp_query = null; $wp_query = $temp; ?>

Al final, volvemos la variable $wp_query a su lugar, y listo!

Stellaris Launchpad + Energia (pt. 2 – Timers)

En el post anterior, pudimos comprobar lo facil que nos va a resultar usar al Stellaris Launchpad con el IDE Energía, como reemplazo del Arduino.

En este post vamos a revisar como usar las interrupciones del timer, para poder ejecutar eventos periódicamente. El Launchpad que estamos usando (LM4F120XL) tiene 27 timers que pueden ser activados independientemente.

Para poder utilizar el timer, en este caso el Timer 0 del Launchpad, necesitamos implementar 2 rutinas: 1 de inicialización y otra de interrupción. Para nuestro ejemplo, las rutinas son las siguientes:

Inicialización:

void initTimer(unsigned Hz)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
  TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
  unsigned long ulPeriod = (SysCtlClockGet() / Hz) / 2;
  TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod -1);
  IntEnable(INT_TIMER0A);
  TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
  TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
  TimerEnable(TIMER0_BASE, TIMER_A);
  
}

Interrupción:

void Timer0IntHandler()
{
  
  TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
  digitalWrite(RED_LED, j&0x01);  
  j++;

}

Como podemos observar, la rutina de inicialización recibe como parámetro la frecuencia de activación del timer en Hz. Y la rutina de interrupción, simplemente activa o desactiva el led Rojo, para comprobar la funcionalidad del timer.

El sketch completo sería el siguiente:

#include "Energia.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/debug.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"

int j=0;

void setup()
{
  pinMode(RED_LED, OUTPUT);
  initTimer(1); // timer a 1 hz
  
}

void loop()
{
  // put your main code here, to run repeatedly:
  while(1) {} 
}

void initTimer(unsigned Hz)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
  //TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
  TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
  unsigned long ulPeriod = (SysCtlClockGet() / Hz) / 2;
  TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod -1);
  IntEnable(INT_TIMER0A);
  TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
  TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
  TimerEnable(TIMER0_BASE, TIMER_A);
  
}

void Timer0IntHandler()
{
  
  TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
  digitalWrite(RED_LED, j&0x01);  
  j++;

}

Stellaris Launchpad + Energia (pt. 1)

He decidido escribir una serie de posts, acerca del uso del Stellaris Launchpad. Este mini tutorial, vamos a analizar la primera versión del Stellaris Launchpad, que veía con el microcontrolador LM4F120H5QR, pero aplica a las nuevas versiones del board, que tienen el microcontrolador Tiva-C.

Este development board de Texas Instruments, sobresale de otros similares, por que su microcontrolador LM4F120XL tiene las siguientes características:

  • Microcontrolador Stellaris LM4F120H5QR con núcleo ARM® Cortex™-M4 con las siguientes características:
    • Operaciones de punto flotante
    • Velocidad de operación máxima de 80 MHz
    • 256 KB de memoria flash
    • EEPROM interna
    • SRAM de 32 KB
    • 8 UARTs
    • 4 I2C
    • 4 SPI
    • 27 Temporizadores
  • Interfaz ICDI (In-Circuit Debug Interface) USB incluida en la tarjeta.
  • Conexión micro USB-B para depuración.
  • Conexión micro USB-B de dispositivo para aplicaciones de usuario.
  • Switch selector de alimentación de dispositivo/depuración.
  • Pines BoosterPack XL, compatible con muchas tarjetas BoosterPack existentes.
  • 2 botones para aplicaciones de usuario
  • Botón de reset
  • 1 LED RGB
  • Puente (jumper) para medición de corriente
  • Cristal principal de 16 MHz
  • Cristal de 32.768 KHz para hibernación y reloj en tiempo real (RTC – Real Time Clock)

Si lo comparamos con el cásico y conocido Arduino, vemos que tenemos un procesador mucho más poderoso, con muchos mas pines de Entrada y Salida y mas periféficos, lo que permitirá que podamos diseñar aplicaciones embebidas con mayor facilidad. Además de esto, el Stellaris Launchpad, tiene un precio aproximado de USD.12,00  (en su nueva versión, que lleva un microcontrolador TIVA C) lo que lo coloca al nivel de los clones del Arduino Uno, por lo que vale la pena el intento.

Texas Instruments, con el fin de promover el uso de sus microcontroladores, permite descargar de forma gratuita (luego de un pequeño registro) sus herramientas de desarrollo, y son bastante completas. Pero al ser un entorno de desarrollo basado en Eclipse, es bastante lento y pesado, si no tienes un computador bastante potente.

Es aquí cuando aparece Energia. Este entorno de desarrollo, ha sido pensado para facilitar el desarrollo de aplicaciones usando la linea Stellaris de TI, presentando la posibilidad de usar el IDE de Arduino, para los procesadores de TI. Con este entorno, podemos programar fácil y rápidamente aplicaciones con el Launchpad, de la misma manera que lo hacemos con el Arduino, traduciéndose esto en velocidad de desarrollo, y facilidad de uso. Además, Energía es multiplataforma, existiendo versiones para Windows, MacOS y Linux.

En primer lugar, y si estamos trabajando bajo Windows, debemos descargar los Drivers Stellaris ICDI  para USB. esto lo podemos descargar desde este enlace. Si estamos usando Linux o MacOS, podemos saltarnos este paso sin problema.

Una vez descargados los drivers, los descomprimimos en alguna carpeta facil de ubicar, y procedemos a conectar el Launchpad a nuestro puerto USB. Se iniciará el proceso de detección del dispositivo, y deberemos buscar la carpeta donde se descomprimió nuestro Driver, para que windows lo detecte e instale los dispositivos. Si todo sale bien, debemos tener 3 dispositivos nuevos en nuestro computador.


stellaris1

 

Luego descargamos el IDE  Energia desde este enlace, escogiendo la versión que corresponda a nuestro sistema operativo. La descarga es algo grande (alrededor de 200MB) así que tomará algunos minutos. Una vez concluida la descarga, lo descomprimimos en una carpeta (puede ser en Mis Documentos) y listo, podemos empezar.

Al ejecutar Energia, a primera vista, observamos un clon del IDE de Arduino (algo bastante obvio, porque es un fork) pero en color rojo. Además del cambio de color, todas las barras de herramientas y menús, son identicos al IDE de Arduino.

 

Antes de empezar a programar, debemos cerciorarnos de que estamos utilizando la configuración correcta para nuestro Launchpad. Para esto, debemos seleccionar el puerto serie, y tipo de board correctos en el menu Herramientas. En mi caso estoy usando el puerto COM7 y el board LM4F120, que es de la primera serie de los Launchpad con Cortex M4.

stellaris3

Ahora si tenemos todo listo para empezar a programar, y vamos a empezar con el “Hello World!” de los microcontroladores: El blink. Vamos a crear un pequeño sketch que encienda el led Rojo del Launchpad, espere 1 segundo, lo apague, espere 1 segundo, y lo vuelva a encender. Para esto, pegamos el siguiente código en la ventana del editor Energia.

#define LED RED_LED
void setup() {                
  pinMode(LED, OUTPUT);     
}

void loop() {
  digitalWrite(LED, HIGH);   
  delay(1000);               
  digitalWrite(LED, LOW);    
  delay(1000);              
}

Una vez copiado el código, presionamos en boton de descarga, y listo! El Led rojo de nuestro Launchpad empieza a parpadear.

Si queremos jugar un poco, podemos cambiar el color del Led. El launchpad incluye un led RGB, que podemos hacerlo parpadear cambiando esta línea:

#define LED GREEN_LED

O por

#define LED BLUE_LED

En los próximos días, continuaré con la serie, explicando como usar los distintos periféricos, y algunas funciones avanzadas del Launchpad.