- new look and content in http://www.perl.org
- new blogging system at http://blogs.perl.org
22 nov 2009
a picture is worth a thousand words
17 nov 2009
choosing a bad module name... Modern::Perl?
11 nov 2009
perl story
31 oct 2009
Why should I choose Perl over PHP?
25 oct 2009
Choosing a worker with Perl background
- We use Perl in many places
- If we don't use Perl, I have experimented that people with Perl skills can make a good work in a short period of time
- Their mind handles different concepts in a simple and consistent way, and designs they provided are good.
- They can work without problems in more than one project at the same time.
- In general, their projects are cheaper to maintain (beacuse of 3).
22 oct 2009
Perl6 - Rakudo #22
19 oct 2009
Perl QT
12 oct 2009
CPAN download counter
9 oct 2009
Should Perl5 "stole" other languages features?
5 oct 2009
SQL::Template 0.1.0 released
Imagine this situation: you know DBI and you like it, because you can make use of your SQL knowledge. But you are not happy having the SQL code into the Perl code. You can use other CPAN modules, which let us to abstract SQL code. But we want to write SQL code, we feel confortable with it.
The SQL::Template module manages this ideas:
- decoupling SQL sentences from Perl code, writting sentences in a XML file, that you can use in different parts of your code.
- Dynamic test of expressions.
- Reuse of SQL fragments.
- Simple API (very close to DBI).
I invite you to see and use this module (it's production ready). Comments are welcome.
2 oct 2009
Why Perl6 won't replace Perl5?
29 sept 2009
Why PHP is not my favourite language?
24 sept 2009
Why Perl is my favourite language?
18 sept 2009
21 - Perl 6
11 sept 2009
I have an idea (2)
5 sept 2009
I have an idea (1)
With this "I have an idea" series, I try to explain some ideas that cross my mind. Sometimes they will be crazy, or boring, or interesting.
- Organizative, in order to identify the specification areas, the specification propossal procedure, the interfaces between specifications, the work plan and scheduled tasks
- Technical, with two levels: first the specification group, which makes the interface definition, defines the funcionality and build the test suite. Second, the workgroup that implements the specification
3 sept 2009
Proxy object
Probablemente te preguntes para qué te sirve esto, la verdad es que cuando se conoce bien, uno se pregunta como es posible no haber conocido de su existencia previamente. En resumidas cuentas, siempre que tengamos que hacer algo adicional a una simple llamada a un método de un objeto, el Proxy es un buen candidato a cubrir esta necesidad.
Una razón para controlar el acceso a un objeto, es precisamente aplazar la creación e inicialización del mismo hasta que realmente lo necesitamos (obviamente en aquellos casos en los cuales esto tenga un coste significativo). Un ejemplo puede ser la carga de un documento que contiene además de texto, multitud de imágenes incrustadas. Obviamente no es necesario cargar todas las imágenes al principio, ya que con un alto grado de probabilidad no serán utilizadas inmediatamente. En este caso, conviene realizar la carga bajo demanda, y es donde entra el Proxy ya que a todos los efectos se puede considerar como un objeto del tipo que enmascara (Imagen) pero con capacidad de programar e interceptar la llamada al método que deseemos. Imaginemos que el método es "draw", en este caso aprovechamos en el proxy para crear el objeto Imagen y a continuación invocar a "draw".
Según el tipo de uso, hay gente que clasifica los objetos Proxy en alguna de las siguientes categorías:
- Remote proxy, que se encarga de codificar la petición y sus argumentos para enviar la solicitud y recibir la respuesta del objeto real. Un ejemplo de esto suelen ser las llamadas a Web Services, que nos aislan de toda la complejidad de tratar con las peticiones sobre la capa de transporte elegida (http, smtp, ...)
- Virtual proxy, para dotar de un nivel de cache al objeto que se está llamado. Imagina aquellas situaciones en las cuales la respuesta del objeto real es la misma ante la misma entrada, el proxy puede cachear las respuestas e invalidar las mismas en base a determinados criterios
- Protection proxy, para verificar si la llamada tiene suficientes privilegios como para poder realizarse
package Proxy;
use strict;
use Carp;
use UNIVERSAL qw/can/;
our $AUTOLOAD;
sub new {
my ($class, $target) = @_;
return bless {TARGET=>$target}, $class;
}
sub isa {
my $self = shift;
return $self->{TARGET}->isa(@_);
}
sub AUTOLOAD {
my $self = shift;
my @params = @_;
my $method = substr($AUTOLOAD,7);
return if( $method eq 'DESTROY' );
my $target = $self->{TARGET};
if( defined $target ) {
if( UNIVERSAL::can($target, $method) ) {
return $target->$method(@params);
}
else {
croak "Proxy target doesn't support $method method";
}
}
else {
croak "Proxy target hasn't been set $target";
}
}
1;
Como puedes observar, se trata de la definición de un módulo Proxy que hace uso del método especial AUTOLOAD de Perl. Recuerda, esta función (si existe) se llama cada vez que no se encuentra un método que se está intentando llamar. En AUTOLOAD, simplemente se verifica que el método existe en el objeto destino, y si es así, se llama.
Para probar esto, imaginemos que tenemos otra clase Persona, muy sencilla (con ayuda de Class::Accessor):
package Persona;
use base qw(Class::Accessor);
Persona->mk_accessors(qw(name role salary));
1;
Bueno, hasta ahora nada del otro mundo. Imaginemos ahora que nos piden que la propiedad "salary", cada vez que sea consultada, debe quedar constancia en un fichero de quien lo hizo. Nuestra primera intención podría ser ir a tocar la clase Persona y meter el código donde corresponda. Sin embargo, a mi juicio, eso "ensuciaría" la clase con cuestiones que no le son propias. Y además para algo tengo que utilizar el tema del Proxy, que para eso lo he explicado...
En primer lugar, creamos una clase que hereda de la anterior y que hace el trabajo de log en el fichero:
package Proxy::Persona;
use base 'Proxy';
use strict;
use autodie;
sub salary {
my $self = shift;
my @params = @_;
if( @params ) {
$self->{TARGET}->salary($params[0]);
}
else {
open my $fh, ">>person.txt";
my @now = localtime(time);
printf $fh "[%02d-%02d-%d] %10s %s\n", $now[3], 1+$now[4], 1900+$now[5], getlogin, $self->{TARGET}->salary;
close $fh;
return $self->{TARGET}->salary;
}
}
1;
Y a continucación creamos un fichero para probar que esto ha funcionado:
use Persona;
use Proxy::Persona;
$p = new Persona;
$p->name('JOSE');
$p->role('MANAGER');
$p->salary(2000);
$x = Proxy::Persona->new($p);
print "Salario: ", $x->salary(), "\n";
Precisamente el último print, es el que sirve para llamar al método proxetizado y hacer el log. Cualquier otra llamada a cualquier otro método de la clase Persona, se llama sin mayor actuación. Es de destacar:
- La clase target (Persona) no se ha modificado para nada
- El script que utiliza la clase proxy debe ser modificado ligeramente para crear un objeto de la clase Proxy::Persona
- Toda la funcionalidad que deseemos añadir, figura en la clase Proxy::Persona, con lo cual queda mucho más limpio el resto del código que empleamos.
30 ago 2009
Empaquetado con PAR
Crear un fichero PAR
%> zip prueba.par Modulo1.pm Prueba/Modulo2.pm
%> pp -p -o programa.par programa.pl
- Para visualizarlo, con nuestra herramienta ZIP favorita
- Para utilizar los recursos que contiene desde otro programa, como se mostrará más adelante
- 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:
- 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
parl programa.par
%> pp -P -o programa_empaquetado.pl programa.pl
%> perl programa_empaquetado.pl
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.use PAR "ejemplo.par";
use Prueba::Modulo2;
#...
use PAR "/la/ruta/del/fichero/par/ejemplo.par";
use Prueba::Modulo2;
#...
Referencias
Si deseas profundizar, te recomiendo una serie de lecturas:- Página principal PAR
- Tutorial PAR
- CPAN, PAR y pp.
28 ago 2009
El sentido común
use common::sense;
# Es lo mismo que:
#
# use strict qw(vars subs);
# use feature qw(say state switch);
# no warnings;
- 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.
- 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 ago 2009
Renacimiento
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?