Imprimir archivos en orden con lpr y Ruby

ordenamiento alfanúmerico vs natural o númerico

El otro día me llegó un problema interesante, tenía una colección de archivos en formato PDF que se tenían que imprimir en orden.

Bueno, al principio no sabía que tenía que ser en orden y para imprimir todos los archivos de una capeta sólo use el comando:

lpr *.pdf

Y cumplía con el objetivo de imprimir todos los archivos PDF de la carpeta, pero luego resultó que el orden de impresión era importante (para buscarlos posteriormente) y es donde el problema se complicó un poco, porque hacerlo a mano simplemente no era una opción ¡Son demasiados!.

Orden alfábetico o númerico.

El problema es que una cosa es el orden alfabético y otro muy distinto el orden numérico.

Por ejemplo, tengo esta colección de archivos:

  • 1.pdf
  • 521.pdf
  • 002.pdf
  • 11.pdf
  • 0850.pdf

El resultado de un ordenamiento estándar sería el siguiente:

archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]    
puts archivos.sort
  • 002.pdf
  • 0850.pdf
  • 1.pdf
  • 11.pdf
  • 521.pdf
orden alfanumerico en ruby
Fig.1 Ejemplo de un ordenamiento estándar en Ruby.

Como pueden ver, están bien ordenados, pero de manera alfanúmerica. Es una cuestión de interpretación de los datos y generalmente el nombre de un archivo se considera un dato alfanúmerico.

Y el caso se complica aún más porque la longitud del nombre del archivo no es la misma.

Aunque es correcto no es el efecto que deseo.

La solución: Naturally

Buscando en Google dí con Naturally una gema de Ruby que se encarga de interpretar de una forma más humana este tipo de ordenamientos númericos.

Para usar Naturally primero hay que instalarlo.

gem install naturally

Y este es un ejemplo de su uso:

El resultado del ordenamiento es:

  • 1.pdf
  • 002.pdf
  • 11.pdf
  • 521.pdf
  • 0850.pdf
Resultado del ordenamiento usando Naturally.
Fig. 2. Resultado del ordenamiento usando Naturally.

Y ahora si, el orden es el que precisamente estoy buscando ¡Yeeeeeei!

A imprimir.

A estas alturas ya estaba muy cerca de la solución, ahora solo tenía que desarrollar un programa en Ruby que leyera todos los archivos PDF de una carpeta, los ordenara de forma natural y mandar imprimir cada archivo.

Al ejecutar el script empieza la impresión de los archivos PDF en la impresora predeterminada uno por uno, pero ahora en el orden que quiero.

Espero que este artículo les sea de utilidad. Todavía intuyo que es posible hacerlo en bash, pero como ya lo resolví este problema utilizando Ruby y funciona tan bien que voy a dar por cerrado el tema.

Ahora con Bash

Gracias a este comentario en google plus de Rodolfo Zola que me aclaró como resolver el mismo problema usando bash y el comando sort.

Y funciona perfectamente, sólo lo modifiqué un poco para que solamente imprimiera archivos pdf.

Actualización.

Al final me decanté por usar el script en bash, le agregué una pausa de 8 segundos (sleep 8) para no saturar la cola de impresión de la impresora de red a la que mando el trabajo y como cereza del pastel, se pueden fijar que ahora el comando lpr especifica que la impresión será en hoja tamaño carta y además hiciera un ajuste en el tamaño de la impresión con la opción fit-to-page.

Para finalizar copié el archivo printsort.sh a la carpeta /usr/bin para que lo pueda llamar a ejecución desde cualquier ubicación de mi sistema.

Filtros de Instagram en Gimp

Gracias a este artículo Usando los efectos de Instagram en GIMP me enteré de este interesante juego de scripts que permiten aplicar fácilmente filtros de Instagram en Gimp.

Para ser sincero no uso Instagram, pero se que una buena parte del éxito de esta red social son los filtros que aplica a las imágenes así que la posibilidad de usar estos filtros en Gimp llamó mi atención.

El articulo de Tannhausser es muy completo, pero no muestra los filtros en todo su esplendor, tampoco en la web de Marco Crippa el autor de los scripts. Por eso me tomé un tiempo para aplicarle a una foto sin retoques el efecto de cada uno de los filtros sin ajustes adicionales.

Imagen Original

Les presento a Romeo el modelo que tan amablemente se prestó para el experimento.

original

Con los efectos de Instagram

Como pueden ver los efectos son muy variados, en algunos se resaltan algunos aspectos, en otros se ocultan, bien usados estos filtros pueden realzar mucho una imagen o adaptarla a un contexto.

Si les interesa descargar los scripts Instagram para Gimp lo pueden hacer desde la página del autor Instagram effects (Gimp 2.8.6), lo único que tienen que hacer es descomprimir los archivos en la carpeta .gimp-2.8/plugins , esta carpeta esta oculta en tu carpeta home de usuario si estas usando Linux. En windows 7 encontré la carpeta en Users/nombre de usuario/.gimp-2.8.

Ruby Ping un script para monitorear equipos de red

ruby ping

 

Ruby Ping es un programa que hace ping a una lista de servidores de un archivo y si existe un error de conexión manda un correo electrónico al administrador.

Anteriormente ya había desarrollado algo similar en bash, pero ahora quise hacerlo en Ruby y añadirle algunas mejoras.

La primera es que este script toma los datos de un archivo en formato CSV, es decir, separado por comas. Un archivo como este se puede generar muy fácilmente usando LibreOffice o Excel.

Primero el nombre del equipo y luego la dirección IP del mismo. Esto sirve para que sean más claros los mensajes que manda el script.

En el caso de que Ruby Ping llegara a encontrar algún error de conexión, manda un correo electrónico al administrador avisándole de la falla.

mensaje de correo rubyping

Parámetros del script

Configurar el script es muy sencillo, solo tiene 4 parámetros:

  • ARCHIVO Que es la ruta al archivo que contiene el listado de servidores en formato CSV.
  • CORREO_ORIGEN El correo de origen, lo puse como parámetro por si quieren aplicar alguna especie de filtro personalizado en su programa de correo electrónico.
  • CORREO_DESTINO El correo a donde quieren que lleguen las alertas.
  • SERVIDOR_SMTP Y por último el servidor SMTP que van a utilizar para mandar los correos.

El código lo pueden descargar, guardar en un archivo, darle permisos de ejecución y eso es todo. Y bueno, claro que deben de tener Ruby instalado.

Estoy considerando agregarlo en una tarea cron, pero por el momento sólo lo ejecuto cuando tengo algunos problemas en mi red. Me es muy útil porque puedo localizar rápidamente donde se podrían localizar algunos problemas (tengo mis sospechosos comunes).

El programa es software libre, así que lo pueden personalizar, copiar, modificar y hacer lo que quieran con él.

Espero que les sea de utilidad.