30/8/2009

Empaquetado con PAR

Durante mucho tiempo, el uso de los diferentes módulos que tenemos a nuestra disposición a través del CPAN nos creaba un pequeños handicap: cuando tenemos que distribuir nuestro programa, es necesario asegurar que todas las dependencias están disponibles para poder ser empleadas. Esto, que a priori debería ser algo sencillo, no ha quedado bien resuelto hasta la aparición del Perl Archiver (PAR). En resumidas cuentas, PAR nos permite agrupar todos los módulos, ficheros de configuración, recursos y otras dependencias en un único fichero comprimido, para facilitar su distribución.
Imagino que a los que trabajen con Java les resultará familiar este concepto, incluso el nombre que se utiliza es similar (JAR, Java Archiver), que se inspira obviamente en el archiconocido TAR.

En este artículo trataré de resumir las opciones más importantes de cara al uso de esta estupenda herramienta, que pasa por ser un tanto desconocida pese a que tiene sus orígenes por el año 2003.

Crear un fichero PAR


(a) El caso sencillo
Un fichero PAR está comprimido en un formato ZIP, por tanto podremos utilizar nuestra herramienta preferida que maneja este tipo de formatos (por ejemplo, el comando "zip" en Linux, o 7-zip en Windows). Imaginemos que deseamos crear el fichero "prueba.par", con un par de módulos de contenido
%> zip prueba.par Modulo1.pm Prueba/Modulo2.pm
Como vemos, podemos (y debemos) incluir las estructuras de directorios que estemos utilizando.

(b) Algo más habitual...
Aunque crear un fichero de esta forma es muy sencillo, en aquellos casos en los cuales tengamos un programa complejo que requiera localizar las dependencias de módulos que tiene, puede llegar a ser tedioso, sobre todo cuando además realizamos cambios en el programa que afectan a esas dependencias. Para estos casos disponemos de una utilidad, el PAR Packager (pp) que se encarga de realizar este tipo de tareas, y que obviamente sólo hay que tener instalado en el equipo de desarrollo, no en los usuarios del fichero PAR que construyamos.
Imagina que partimos del "programa.pl" y que deseamos encontrar todas sus dependencias y empaquetarlas en un fichero PAR; simplemente hacemos:

%> pp -p -o programa.par programa.pl

Con "-o" especificamos el fichero PAR de salida que se genera, y "-p" indicamos que deseamos generar un fichero PAR. En este ejemplo, el fichero "programa.par" contiene por tanto, todas las dependencias que se han encontrado. Este fichero se puede utilizar así:
  1. Para visualizarlo, con nuestra herramienta ZIP favorita
  2. Para utilizar los recursos que contiene desde otro programa, como se mostrará más adelante
  3. Para ejecutarlo directamente, ya que el fichero PAR creado de la forma anterior ha incluido el fichero "programa.pl" dentro del mismo, si tenemos instalado el PAR Packager, podemos probarlo sin más que escribir:

  4. parl programa.par

  5. Si queremos distribuirlo a un equipo en el cual no tenemos PAR PAckager, pero sí PAR, podemos usar la opción "-P" cuando lo creamos
  6. %> pp -P -o programa_empaquetado.pl programa.pl
    %> perl programa_empaquetado.pl
(c) Crear un fichero ejecutable "stand-alone"
Una posibilidad muy interesante que nos proporciona el uso de PAR es la capacidad de crear ejecutables que puedan ser utilizados en plataformas donde ni siquiera se ha instalado Perl. Esto es un concepto bastante interesante cuando queremos asegurarnos de que nuestro programa funciona en cualquier sitio, aunque un pequeño detalle es que sólo funcionará en la misma arquitectura en la que fue construido. La herramienta que utilizamos para esto sigue siendo obviamente, "pp".
Siguiendo con los ejemplos anteriores, podemos hacer esto:

pp -o programa programa.pl       # en Linux
pp -o programa.exe programa.pl # en Windows

Usar un fichero PAR

Una ver que disponemos del fichero PAR con un conjunto de módulos, si lo queremos emplear desde nuestro programa, debemos tener instalado en nuestro sistema el módulo PAR, que lo podemos realizar a través del CPAN, como otro módulo normal.

En nuestro programa debemos hacer entonces (siguiendo con el ejemplo "prueba.par"):
use PAR "ejemplo.par";
use Prueba::Modulo2;
#...
Como vemos, todo lo necesario está en el fichero ".par", y si queremos ubicarlo en una ubicación específica lo podemos hacer sin más que especificarlo a la hora de utilizarlo:

use PAR "/la/ruta/del/fichero/par/ejemplo.par";
use Prueba::Modulo2;
#...

Referencias

Si deseas profundizar, te recomiendo una serie de lecturas:

¿Cuáles son tus experiencias en la distribución de tu código Perl?

28/8/2009

El sentido común

Una de mis aficiones consiste en jugar al ajedrez, y hace unos cuantos años, cayó en mis manos un manual titulado "El sentido común en ajedrez", de Emanuel Lasker, probablemente uno de los mejores (quizás el número uno) de entre todos los campones de este deporte. Este libro era sencillo, directo y servía para hacer fácil aquellas cosas que podían parecer complicadas en un principio.

Te preguntarás ¿que tiene que ver esto con Perl? Bueno, la verdad que me apetecía contarlo, porque esta tarde encontré en mi estantería este libro, y me ha hecho recordar lo bien que me lo pasé cuando lo leí, hará unos 20 años (!). E inmediatamente, he recordado un módulo curioso y más que recomendable: common::sense. Por tanto el nexo de unión entre el ajedrez y Perl en este artículo reside precisamente en el uso del menos común de todos los sentidos.

Pero, ¿en qué consiste el sentido común en Perl? Llevamos ya un tiempecito con la versión 5.10 del lenguaje, y muchos no hacemos uso de una serie de características nuevas (no presentes anteriormentem y que por tanto harían que los scripts no funcionasen en plataformas antiguas).

use common::sense;

# Es lo mismo que:
#
# use strict qw(vars subs);
# use feature qw(say state switch);
# no warnings;

como podemos observar, hay un par de curiosidades en el módulo:
  1. no warnings, parece contrario a lo que uno inicialmente puede pensar, pero tiene su lógica. La activación de warnings debería afectar únicamente a aquellas partes del código que el programador tiene bajo su control, no a aquellas pertenecientes a los módulos que está utilizando. Por tanto, si se activa el flag "-w", hay que asegurar que no va a tener implicaciones en nuestro módulo para que no aporte mensajes que no deberían preocupar al programador que lo use.
  2. use feature, para poder emplear las nuevas características de la versión 5.10 (las cuales no están disponibles si no se las activa de esta manera). Son las siguientes:
  • say: es lo mismo que hacer un print añadiendo un "\n" al final de forma implícita.
  • state: viene a ser un equivalente de las variables de tipo static en C o en Java, es decir se crea e inicializa una única vez
  • switch: el tan debatido largamente control de flujo de tipo switch, que tiene eso sí una implementación avanzada, donde podemos incluso utilizar expresiones regulares
Cabe recordar que la versión 5.10 trae unas cuantas cosas más, y si las queremos activar todas, basta con hacer esto:

use feature qw(:5.10);

¿y tú, haces uso del sentido común que te propongo?


26/8/2009

Renacimiento

Al igual que la humanidad vivió su época de revitalización cultural en la etapa del Renacimiento, podemos decir que estamos experimentando algo similar en el mundo Perl.
Durante unos cuantos años, hemos podido observar una lenta pero progresiva pérdida de importancia o notoriedad de nuestro viejo y querido lenguaje. Quizás vivimos un mundo en el cual nos hemos acostumbrado a versiones frecuentes en las herramientas que usamos, y en el momento que no se producen nos surgen dudas sobre su viabilidad, y en seguida se oyen los cantos de sirena "... is dead".

Si bien es cierto que no hemos experimentado un crecimiento significativo en estos años, podemos afirmar que el lenguaje se ha ido dotando de una serie de elementos que lo mantienen muy vivo y en buena forma para afrontar los problemas presentes y futuros. Algunos de estos elementos que comento son los siguientes:
  • CPAN, el pozo de la sabiduría donde uno puede encontrar un módulo para prácticamente cualquier cosa que se le ocurra. Algunos argumentan con razón, que se trata de la killer-app de Perl, en el sentido de que la mayor parte del esfuerzo de la gente se ha centrado en enriquecer CPAN. De hecho, todas aquellas características que se añaden en el core del intérprete, han sido previamente probadas a través de algún módulo publicado en el CPAN.
  • Moose, por fin una forma de programar orientado a objetos que ha sido muy bien diseñada e implementada
  • Padre, un IDE para Perl. Esto sí que es algo que sabrán apreciar todos los programadores acostumbrados a las facilidades que nos da un entorno de este tipo. Aunque está en sus etapas iniciales, ya se puede utilizar y comprobar su potencial
  • Devel::Declare, una forma de modificar el comportamiento de Perl en tiempo de compilación sin necesidad de utilizar filtros de código fuente (que por cierto es otra técnica muy potente, si quieres profundizar, mira el módulo Filter::Simple). Permite tomar el control del parser, con lo cual es posible crear nuevas sintaxis... imagina el potencial de esto
  • Perl 6. Bueno, esto será motivo de una serie de artículos... En cualquier caso, hay que estar preparados para la nueva versión de Perl anunciada para Abril del 2010. En realidad no es un sustituto de Perl 5, ya que éste seguirá su progresión (acaba de salir la versión 5.10.1). Se trata de un nuevo concepto, un nuevo diseño y una nueva implementación que se basa en una máquina virtual Parrot especializada en la ejecución de lenguajes dinámicos. Cuando salga la versión 1.0 de Rakudo (así es como se ha denominado la implementación de referencia de Perl6) habrán transcurrido 10 años desde su concepción original.

A mí particularmente hay una razón de tipo sentimental que me refuerza en el pensamiento que da título al artículo. Creo que toda la gente que trabaja con Perl siente algo especial por este lenguaje, algo que no he percibido en los entornos de otros lenguajes (y conozco unos cuantos). Por eso estoy seguro que Perl está vivo, incluso más vivo que nunca. Dentro de 20 años no sé como se programará o cuales serán las técnicas al uso, pero se que se podrá hacer fácilmente en Perl.

Hay muchas otras razones que sirven para reforzar el mensaje del renacimiento de Perl. Si quieres profundizar en ellas, te recomiendo la lectura de este artículo (escrito por chromatic, un referente de Perl).

¿Cuáles son las tuyas?