viernes, 8 de octubre de 2010

Moose acelerando

El más reciente y exitoso sistema de OOP para Perl, se esta haciendo cada vez más veloz.

En el blog de Moose podemos apreciar que se trabaja continuamente en perfilar el consumo de recursos y mejorar el rendimiento de este sistema, que en su última versión (1.15) es un poquito más lento compilando, mientras incluye más código "en linea" acelerando la ejecución de los programas.

martes, 5 de octubre de 2010

Aplicaciones no tradicionales en Perl

Acabo de ver una aplicación de esas que tal vez inicialmente no se me hubiera ocurrido hacer en Perl: "The Lacuna Expanse", esta aplicación es un juego y es masivamente paralelo, así que yo hubiera investigado como hacerla en Erlang o Haskell, sin embargo hicieron el servidor 100% en Perl, el cliente genérico esta en Javascript y luego hay otros clientes para telefonos hechos en variedad de lenguajes.

Se explota el uso de JSON RPC, y el CPAN les permitió utilizar Plack, Moose, DBIx::Class y la estrella de la fiesta: JSON::RPC::Dispatcher.

Si quieren más información pueden leer el artículo de Ovid y el de JT Smith.

Aquí les dejo el trailer para que alucinen.

Mi proveedor favorito

Hoy entrevisté a un proveedor que pudiera convertirse en uno de mis favoritos, voy a hacer una interpretación libre de la conversación y a lo mejor se imaginan porque quede gratamente impresionado:

Yo: los llamé porque estoy abrumado con tantas cosas por hacer y necesito alguien que ayude a migrar bases de datos Oracle y aplicaciones de Power Builder.

Proveedor: Nosotros somos especialistas en Oracle y Power Builder entre otros, pero estamos trabajando mucho con PostgreSQL, Perl, Python.

Yo: Y si les pido ayuda para migrar aplicaciones Power Builder a la Web que tecnologías me recomiendan.

Proveedor: Bueno nosotros trabajábamos principalmente con Python usando Django, que es un ambiente excelente, sin embargo nos hemos dado cuenta de que aunque Perl no se ve tan bonito, nos rinde más para nuestro trabajo, así que últimamente estamos trabajando más con Catalyst y Perl en general.

Necesito más proveedores así, porque donde yo trabajo si vamos a migrar a software libre.

domingo, 15 de agosto de 2010

La nueva trampa de Java

[ Este artículo es una copia del que se encuentra en Radar Libre ]

La demanda iniciada por ORACLE contra Google donde se argumenta que el sistema operativo Android viola patentes propiedad de ORACLE, muestra una debilidad de lo que usualmente muchos en la comunidad (incluyendome) consideramos software libre.

Desde que Sun Microsystems liberó la mayor parte del código de la plataforma Java, este asunto ha pasado por debajo de la mesa, pues las implementaciones que se utilizan son: la original, y alguna que otra licenciada directamente del propietario.

En un debate ocurrido hace un lustro, sobre El uso de Java en el Plan Nacional de Migración a Software Libre, Simon Phipps argumentaba que Sun Microsystems era una compañía amigable, que había prometido liberar el código y que estaba trabajando para ello.

En aquel momento mi argumento fue que las corporaciones no tienen alma, sentimientos o lealdad, que son básicamente actores de guerras que solo obedecen a motivos económicos y que verlas de cualquier otra manera era un riesgo que que el Estado no debería correr.

Después de un lustro y luego de la desaparición Sun, al ser adquirida por ORACLE, quedó demostrado que Simon Phipps probablemente tenía razón, Sun finalmente liberó lo que pudo de Java y nunca aplicó tarifas al licenciamiento de la plataforma, sin embargo yo también tenía razón: las corporaciones no tienen alma y ahora que Sun fue tragada por ORACLE se lanza al ataque en contra de quien pueda rendirle beneficios.

Este ataque es hoy posible gracias a un arma secreta que Sun mantenía en su arsenal: "Patentes de Software", para evitar suspicacias como las que siempre han rodeado a Mono, Sun emitió una liberación de uso de dichas patentes para cualquier implementación de  Java, siempre y cuando la implementación incluyera todas las características y servicios de la plataforma y no se incluyera ninguna característica o servicio adicional, es decir que para evitar una demanda de propiedad intelectual por patentes el distribuidor debía asegurarse de:

implementar toda la plataforma y solo la plataforma

Aquí es donde Google cayó en la trampa porque al parecer no incluyó AWT y Swing que son parte integral de la especificación.

Sin embargo lo peligroso de todo este asunto no es la demanda de ORACLE a Google, que puede presentar una buena pelea judicial al estilo SCO, Novel e IBM, sino que la trampa ahora es mucho más sutil (pero no menos potente), ya no basta que un código sea GPL versión 2 para que sea realmente libre.

En los términos establecidos por la liberación de derechos de uso de las patentes de Sun se coarta la libertad 3, que da el derecho a modificar el código y redistribuir el resultado de la modificación, porque Oracle va a demandar por violación de patente al quedar fuera de la protección de la liberación de derechos de uso de patentes, independientemente de lo que diga la GPLv2.

Así que en realidad aunque la mayoría del código de la plataforma Java sea libre por derecho, de hecho no es libre porque ORACLE puede utilizar otros instrumentos para ejercer coacción sobre cualquiera que intente modificar la plataforma, y por lo tanto no cumple con el espíritu del decreto 3390, por ello debe prohibirse nuevamente el uso de esta plataforma en el Estado hasta que se aclare esta situación o se libere Java bajo la licencia GPL versión 3 que incluye protección legal contra las patentes.

Finalmente en un tono más personal deberíamos hacer un esfuerzo coordinado por dejar de consumir productos ORACLE para que la corporación aprenda por la única vía posible: su cuenta bancaria, que jugar con la libertad puede resultar peligroso y dañino.

Dejar de consumir productos de esta infame comañía no es difícil, casi cualquier cosa que se esté haciendo con su manejador de base de datos, se puede hacer con PostgerSQL y todo el resto de sus productos son bastante malos, incluyendo el lenguaje de programación Java (no la plataforma) así que en general, dejar de usar productos ORACLE se puede considerar de entrada como una ventaja competitiva.

miércoles, 17 de marzo de 2010

Un tutorial de catalyst en español

Como ando colapsado sin poder escribir, les dejo el blog de un amigo que va a escribir una serie de artículos sobre Catalyst.

domingo, 31 de enero de 2010

Moose de dieta

[English translation]

¿Te parece que Moose es demasiado pesado para tus aplicaciones?

La compilación de los objetos de Moose puede tomar un tiempo considerable durante el arranque de una aplicación, esto podría dar la impresión de que los programas que utilizan Moose son lentos, sin embargo la compilación solamente ocurre al cargar el programa, y dependiendo de la aplicación pude ser que Moose no sea tan pesado como parece.

Un ejemplo de ello es una aplicación en Catalyst (en versiones mayores a la 5.8), cuando arranca se deben compilar todos los objetos hechos en Moose y se siente la diferencia con las versiones anteriores, pero como Catalyst se va a ejecutar durante dias o meses, no importa mucho el tiempo de arranque.

Si la aplicación que quieres desarrollar es un comando que ejecuta una tarea rápida y termina tal vez Moose es muy pesado para tí, sobre todo cuando ejecutas los comandos repetidamente a través de otros comandos como xargs(1) o find(1).

Para los casos donde el tiempo de arranque de la aplicación no se amortiza bien con la ejecución, hay una solución en el CPAN: Mouse.

Mouse es un reemplazo de Moose muy optimizado que permite utilizar la gran mayoría de las características de Moose, pero es mucho más ligero porque esta desarrollado en XS (es decir en C) y se omiten algunas características para aligerar la ejecución.

Según la página del manual de Mouse, Moose solamente falla en el 1% de los tests de  Mouse, haciendo al último muy compatible con el primero, pero la batería de pruebas se ejecuta 400% más rápido y en mi experiencia yo no puedo notar la diferencia entre utilizar Mouse y cosas como Class::Accessor::Fast, y aunque la segunda pudiera ser algo más rápida (algo que no he probado formalmente), tener a disposición un sistema de OOP como Moose definitivamente vale la pena.

Usar Mouse es muy simple, solo hay que cambiar Moose por Mouse, todo lo demás sigue igual.

Las características presentes en Mouse permiten hacer la mayoría de los programas y objetos que necesitas para aplicaciones y herramientas sencillas, y si llegas a necesitar las características adicionales de Moose, como la metaprogramación, Moose es la única opción razonable y no queda otra que pagar el precio de la compilación inicial.

lunes, 18 de enero de 2010

Dulce dulce Moose

[English translation]

Uno de los comentarios que recibí por el artículo anterior fue acerca de como se vería utilizando la sintaxis de MooseX::Declare.

Este módulo provee extensiones sintácticas que van mucho más allá del azúcar sintáctico regular de Moose.  Utilizando la magia negra de Devel::Declare, MooseX::Declare crea toda una nueva sintaxis muy similar a la de Perl6, para declarar las clases y roles de Moose, sin embargo, el uso de estas extensiones me genera sentimientos encontrados.

Por un lado está la apariencia y simplicidad de la sintaxis implementada por el módulo, y por otra parte me he dado cuenta que al cambiar la sintaxis de esta manera dejan de funcionar herramientas que doy por sentadas, como perltidy, que da errores en la declaración de prototipos en los métodos, también dejan de funcionar bien módulos como PPI y hasta el coloreo de vim.

Estoy consciente de que todo es cuestión de reparar perltidy, PPI y el coloreo de vim, pero el detalle es que es difícil implementar cuanta sintaxis se le ocurra a cualquiera que introduzca nuevos módulos en el CPAN.

Siempre he argumentado que una de las ventajas de Devel::Declare es que permite evolucionar Perl5 a través del CPAN, módulos como TryCatch y MooseX::Declare muestran extensiones sintácticas que en algún momento podrían agregarse a Perl5 de resultar ampliamente aceptadas.

Pero ¿cómo llegarán a ser ampliamente aceptadas, si no las usamos porque rompen las herramientas que normalmente usamos?

A lo mejor nada de esto importa porque ya en marzo de 2010 llega Rakudo *, y todo el mundo comenzará la gran migración a Perl6.

Como en realidad tengo la misma cantidad de argumentos a favor y en contra, voy a seguir meditando en cuales tienen mas peso que otros. Pero mientras tanto aqui tienen la versión de roles del juego de los animales en MooseX::Declare, para que uds. se hagan una idea propia sobre sus costos y beneficios:

 1 #!/usr/bin/env perl
 2 use MooseX::Declare;
 3 
 4 class QuestionNode {
 5     has pregunta => ( is => "ro", isa => "Str", required => 1 );
 6     has [ "si", "no" ] => ( is => "rw", isa => "Str|QuestionNode", required => 1 );
 7 }
 8 
 9 role AnimalsGame {
10 
11     has tree => (
12         is      => "ro",
13         isa     => "QuestionNode",
14         default => sub {
15             QuestionNode->new(
16                 { pregunta => 'vive en el agua', no => 'tigre', si => 'tiburón' } );
17         }
18     );
19 
20     method play {
21         my $guess = $self->tree;
22         my ( $node, $branch );
23         while ( ref($guess) ) {
24             $node   = $guess;
25             $branch = $self->si( $node->pregunta ) ? "si" : "no";
26             $guess  = $node->$branch;
27         }
28         return if $self->si("Es un(a) $guess");
29         my $animal = $self->prompt("Nombre del animal: ");
30         my $diff   = $self->prompt(
31             "Una pregunta cierta para $animal pero falsa para $guess: ");
32         $node->$branch( QuestionNode->new( { pregunta => $diff, no => $guess, si => $animal } ) );
33     }
34 
35 }
36 
37 role ConsoleGame {
38     use Term::ReadLine;
39     use IO::Handle;
40 
41     has title => ( is => "ro", isa => "Str", default => "El juego de los animales" );
42     has term => (
43         is         => "ro",
44         isa        => "Object",
45         lazy_build => 1,
46         handles    => { prompt => "readline" }
47     );
48 
49     method _build_term {
50         Term::ReadLine->new( $self->title );
51     }
52 
53     method si(Str $prompt) {
54         while (1) {
55             my $answer = $self->prompt("$prompt? (y/n): ");
56             return ( $2 ? 1 : 0 ) if $answer =~ /^\s*((si|s)|(no|n))\s*/i;
57             $self->term->OUT->print("Responde 's' o 'n'\n");
58         }
59     }
60 
61     method run {
62         $self->play;
63         $self->play while $self->si("Quieres jugar de nuevo");
64     }
65 }
66 
67 class Game with AnimalsGame with ConsoleGame {}
68 
69 Game->new->run;