27/01/12

pdftk: la navaja suiza para ficheros PDF

Para la mayoría de nosotros los ficheros PDF son unos documentos habituales, en un formato útil, pero difíciles de manipular. La idea es que sean documentos de sólo lectura. Sin embargo muchas veces seria útil poder realizar algunas manipulaciones sobre documentos PDF generales, como mover páginas, extraer partes, re-ordenar, combinar documentos...

La herramienta pdftk nos proporciona la mayoría de estas opciones. El nombre proviene de PDF Toolkit, conjunto de herramientas para PDFs. A modo de ejemplo os explico como, utilizando un escaner automático que no dispone de doble cara, podemos escanear un documento a doble cara de manera fácil.

Partimos de dos ficheros: impares.pdf y pares_inv.pdf.

En el primero tenemos las páginas impares escaneadas en el orden correcto. Luego hemos girado el bloque de hojas y hemos escaneado las páginas pares que por supuesto han quedado invertidas.

Primero giramos las páginas pares:
pdftk pares_inv.pdf cat end-1 output pares.pdf

Ahora aprovechamos la nueva opción 'shuffle' del pdftk para coger una página de cada:
pdftk impares.pdf pares.pdf shuffle output out.pdf

Para más información: Pdftk Man Page 

21/01/12

[BASE] Introducción

Este es el primer post de una serie que, espero, sea larga. Lo espero porque el tema da para mucho y si no es larga significa que habré colgado la toalla antes de acabar. Hoy de momento sólo la introducción.

Durante muchos años me he dedicado al desarrollo de aplicaciones web sobre Java. Cuando hice mi primera aplicación Java no existían ni los JSP, sólo Servlets, lo cual era bastante duro. Por suerte enseguida llegaron los JSPs para ayudar a poner orden. Los años fueron pasando, aparecieron multitud de frameworks que prometían las mil maravillas para el desarrollador, pero nunca me acabaron de convencer. Mientras tanto yo seguía con mis sencillos Servlets + JSP aplicando el patrón MVC. Y claro, uno va escribiendo algunas clases auxiliares para tareas repetitivas. Esas clases se convierten en más y más clases, interconectadas, ampliadas... mezcladas con componentes JSP y, sobre todo, con componentes JavaScript, Ajax...

Tras muchos años al final le puse nombre al invento, sólo para saber de qué hablaba, y le llamé Base ya que lo trataba como un seedwork de base, y no un framework más. Siguiendo el enlace se entra en más detalle de la diferencia entre un seedwork y un framework pero básicamente un seedwork es el conjunto de componentes más o menos generales que muchas veces copiamos para no iniciar un proyecto nuevo totalmente desde cero. Pero luego no hay un concepto de versión del seedwork, ni se mantiene actualizado o enlazado como una librería. Bueno, si se hace sería de manera totalmente manual.

El objetivo de esta serie de artículos es ir mostrando todos estos componentes mientras los voy revisando, documentando y publicando bajo la licencia GPL. El código lo publicaré y actualizaré bajo un repositorio en GitHub, aunque soy novato tanto usando Git como GitHub así que cualquier ayuda es bienvenida.

Dudo que en el momento tecnológico en el que nos encontremos alguien decida iniciar un proyecto nuevo utilizando tecnologías que ya son muy antiguas. Creo que actualmente existen alternativas ya suficientemente maduras en el entorno Java para desarrollar aplicaciones web y olvidarse prácticamente del todo de los Servlets y los JSP (ver JavaEE 6 en general). En todo caso este código puedo servir como ejemplo desde un punto de vista académico o quizás sí pueda utilizarse en entornos en los que hay restricciones de versiones, librerías, etcétera.

Respecto al código que voy a publicar querría hacer dos comentarios y pedir opinión de aquellos que sigáis la serie.

Primera una reflexión sobre el estilo del código. Todo el mundo tiene un estilo para el código: unos saltos de linea por aquí, una indentación especial, unos márgenes... Yo tengo mi estilo, muy personal. Busco la máxima compacidad. Inicialmente me había planteado publicar el código adaptándolo al estilo estándar y oficial de Java. Pero después de una sola clase modificada ¡ya me duelen los ojos! Así que teniendo que cuenta que dudo mucho que alguien vaya a utilizar esto, y que... ¡qué demonios!, es mi código y lo publico como quiero, publicaré el código con mi estilo particular. Las principales diferencias respecto el estándar son las siguiente:

  • La indentación es con espacios únicamente, no con tabulaciones ni combinaciones de ambas. Cada nivel de indentación es de 2 espacios, no de 4 como marca el estándar. Cuatro me parece una pérdida de espacio!
  • No utilizo llaves { } en bloques de una sola sentencia. Además, si se puede, pongo esa sentencia en la misma linea que el bloque de control en el caso de los if, pero no de los for o while.
  • Utilización de un margen de 100 caracteres. De hecho habitualmente utilizo margenes mayores, pero me ha parecido que 100 es un buen valor, muy conservador. El estándar marca 80 caracteres, y entiendo que muchas veces va bien, pero la mayor parte del tiempo que se trabajo con el código se hace en un entorno gráfico y yo, personalmente, con el editor maximizado. Con las pantallas y resoluciones de hoy en día, especialmente con los formatos panorámicos, 80 caracteres me parece desperdiciar bastante pantalla y área de trabajo. Como nota curiosa, yo utilizo 150 caracteres normalmente. Trabajo a 2560 píxels de ancho de escritorio.
La segunda reflexión es sobre el código de ejemplo. O la ausencia del mismo, más bien. No tengo previsto incluir ningún código de ejemplo concreto. Quizás adapte algunos juegos de pruebas. Pero no cierro la puerta si veo que hay demanda e interés, se aceptan de buen grado sugerencias al respecto.

16/01/12

Sesión gráfica (X) en un servidor sin pantalla ni teclado (headless)

La manera más habitual de gestionar y administrar un servidor Linux es mediante un acceso SSH y la linea de comandos. No solo es lo más habitual sino posiblemente lo más recomendado y, con algo de práctica, más cómodo y eficiente. Además nos evita cargar en el servidor todo el subsistema gráfico con el coste en recursos asociado. Y por último también mejoramos la seguridad al eliminar componentes.

Sin embargo podemos encontrarnos a veces que hay alguna aplicación que requiere una interfaz gráfica y, por las razones anteriores, no queremos instalar todo el entorno X y dejarlo corriendo. ¿Hay alguna alternativa?

La hay, y además es muy sencilla de implementar y utilizar. Algo tan sencillo como un servidor X basado en VNC. En Debian el paquete vnc4server nos permite instalar este servidor, al cual podemos añadir un par de paquetes más (un gestor de ventanas y las fuentes básicas) y ya tenemos listo un servidor X. No acaban ahí las ventajas: no necesitamos un gestor de sesiones (gdm, kdm...) porque cada usuario se puede ejecutar su servidor, no tiene que hacer "login". Y esto mismo es una ventaja, porque todo se ejecuta como un usuario, nunca como "root".

Los paquetes a instalar son, por ejemplo, los siguientes: vnc4server, xfce4 y xfonts-base. Por supuesto se instalaran múltiples dependencias ya que hay que instalar buena parte de las librerías gráficas de base. Una vez instalado todo solo nos falta ejecutar un simple comando: 

vncserver -geometry 1024x768 -depth 24

Como cualquier usuario. de hecho cualquier usuario puede tener una o más sesiones VNC, utilizando diferentes puertos. La especificación de la resolución y profundidad de color es, por supuesto, a gusto del usuario aunque conviene moderarse si vamos a utilizar la sesión de manera remota para mejorar el rendimiento.

Con la primera ejecución se nos preguntará una contraseña para el servicio, con un máximo de 8 caracteres. El protocolo RFB de VNC no es que sea especialmente seguro así que es quizás buena idea no publicar el puerto de comunicación y utilizar un túnel SSH. La ejecución primera también nos informará de la creación de un script de arranque para lanzar diversos servicios en la sesión X, básicamente el gestor de ventanas y un terminal. Por supuesto podemos editar dicho script para ajustarlo a nuestros gustos y necesidades.

Definitivamente este es un mecanismo para disponer de una interfaz gráfica en un servidor remoto que además podemos activar y desactivar fácilmente para gestionar adecuadamente los recursos sin sacrificar esa funcionalidad adicional que puede proporcionarnos un entorno gráfico.

09/01/12

Java y Active Directory (y VI): cambio de contraseñas caducadas o forzadas

En el anterior artículo vimos un par de opciones para poder cambiar la contraseña de un usuario de Active Directory a través de LDAP. El procedimiento más útil, es, probablemente, el del cambio de la propia contraseña pues evita que la aplicación tenga que utilizar (y por tanto guardar) unas credenciales de administrador del dominio.

Sin embargo, pese a que el mecanismo funciona en la mayoría de los casos, requiere que podamos conectar inicialmente mediante LDAP con las credenciales del propio usuario. Se puede pensar que es un requerimiento obvio ya que vamos a cambiar la propia contraseña y necesitamos igualmente conocerla previamente. El problema viene cuando las credenciales son correctas pero no podemos establecer una sesión. Dos casos muy habituales son cuando la contraseña está caducada y cuando está marcada la cuenta como pendiente de un cambio obligatorio de la contraseña en el siguiente inicio (típico cuando se fija una contraseña por parte de un administrador para obligar a que el usuario ponga una propia).

En este caso, lamentablemente, no podemos hacer el cambio de contraseña conectando con la cuenta del propio usuario. Por suerte tampoco necesitamos conectar como el usuario administrador sino que podemos utilizar un término medio. Utilizando exactamente el mismo código que en el caso del cambio de contraseña propio, pero conectando como otro usuario, podemos cambiar la contraseña igualmente. El punto interesante es que el usuario de conexión no necesita ningún privilegio especial, puede ser un usuario sin absolutamente ningún permiso más allá de conectar al dominio.

Y con esto termino la serie de artículos donde hemos visto algunos trucos para utilizar Active Directory a través de LDAP mediante código Java estándar.

Entradas relacionadas:


27/12/11

Gráficas de latencia y disponibilidad de red

Utilizo con frecuencia MRTG para pintar gráficas de tráfico por las interfaces de red. Sin embargo, esas gráficas sólo cuentan parte de la historia. A través de esta entrada he podido montar un mecanismo para consultar la latencia y paquetes perdidos de salida a través de una ADSL.