Falso polimorfismo en Perl5

Publicado el Mayo 30, 2009

Estoy descubriendo este nuevo lenguaje y me resulta apasionante en muchas cosas. Tiene una sintaxis violentamente simplificadora -y a veces inentendible- y excepcionales herramientas para comparar strings y asignar variables.

Pero estoy chocando con una simplifación y necesito ayuda… al parecer, en ningún ejemplo que esté mirando encuentro algo que me desmienta: el polimorfismo en Perl5 es un pegote. No sé qué se estará preparando para Perl6, pero la razón fundamental por la que uno va a buscar polimorfismo en un lenguaje está viciada: no se puede escribir una clase que descienda de otra para corregir la original.

Pongamos un ejemplo: En la clase Weather::Google la definición de la URL para conectar con el servicio es una constante. Es un error porque este tipo de propiedades no está escrito en piedra. Si queremos agregarle la propiedad de lenguaje a la dirección -hay que agregarle “hl=es&” para que devuelva los resultados en español- estamos en un problema. Pero aparentemente, Perl viene al rescate dejándonos escribir cosas directamente en la clase, o admitiendo el polimorfismo para que reescribamos un método que nosotros objetamos.

Pues no. Todos los métodos que intenté -incluídos los mamarrachos- me dejan a las claras un comportamiento simple del Perl: todo lo que sobreescriba es como un copy-paste que se pegotea sobre la clase original, pero no la modifica. Veamos este código:

package a;

use constant PIE => This is a PIE\n;
$self->{myproperty} = We are in A\n;

sub new {
	my $class = shift;
	my $self = {};
	bless ($self,$class);
	assignProperty();
	return $self;
}

sub assignProperty{
	$self->{myproperty} = We are in A, but something changed\n;
};

sub EatMy{
	print PIE;
}

sub printProperty{
	print $self->{myproperty};
}

return 1;

Ahora, la clase que intenta sobreescribir al paquete A:

package b;
BEGIN { @ISA = a}	;

use constant PIE => We are in B\n;
$self->{myproperty} = We are in B\n;

sub assignProperty{
	$self->{myproperty} = We are in B, changing things\n;
};

1;

Ahora, veamos que pasa:

use a;
use b;

$s = new a;
$s->EatMy();
$s->printProperty();

$s = new b;
$s->EatMy;
$s->printProperty();

Ok, el resultado de todo esto siempre es el mismo:

This is a PIE
We are in A, but something changed
This is a PIE
We are in A, but something changed

Nunca podemos cambiar cosas en la clase original. Para que funcione, tendríamos que reescribir el método printProperty, que es lo que hacen todos los ejemplos y que definitivamente no es lo que queremos cuando hablamos de polimorfismo.

Repasemos qué estamos tratando de hacer:

Clase A

Tiene una propiedad y una constante. En el caso de la constante, nunca tuve mucha fe en poder cambiarla, porque es una constante, bien. Pero tiene una propiedad myproperty que podría aflojar un poco. La asignamos al arranque y la cambiamos en el método new para que diga otra cosa usando el método changeproperty.

En la clase B reasignamos el método changeproperty para que diga otra cosa. Ahora creamos un una variable de la clase B. El método new no está en la clase B, por lo que el Perl va a buscarla en la clase A. Pero una vez que lo buscó, las referencias a otros métodos deberían reubicarse. Si existe un método en la clase B que fue cambiado, la ejecución del método new en la clase A debería ir a buscar al método changeporperty de la nueva clase, y sin embargo se queda en la clase A para olvidarse de que la variable que inicializamos es de la clase B.

Es como si el Perl inicializara otra variable de clase A para emparchar lo que le falta a la clase B. Si llamamos expresamente al método changeproperty de la clase B tampoco arreglamos las cosas: Perl tiene una copia de la variable para la clase A y otra para la clase B. La única forma que le estoy encontrando por ahora es hacer que llamar a un método de la clase madre para que asigne la variable de la otra clase. Tengo que ver si puedo acceder a las variables de la clase madre, pero hasta ahora me da error de sintaxis. Si en la clase madre no tengo un método que asigne la variable, por ahora estoy frito.

Por ahora, la arregalaría haciendo esto:

package b;
BEGIN { @ISA = a}	;

use constant PIE => We are in B\n;
$self->{myproperty} = We are in B\n;

sub assignProperty{
	a::assignProperty(We are in B);
	#$self->{’myproperty’}) = “We are in B, changing things\n”;
};

1;

Por supuesto, en el paquete A cambié el método assignProperty para que diga esto

sub assignProperty{
	$self->{myproperty} =  shift || We are in A, but something changed\n;
};

y pueda tomar por como opción un parámetro y lo asigne… me pregunto si existe un $parent o algo así, en lugar de $self… con eso manoteo la variable de la clase que estoy derivando… probemos. Nop! $parent no existe. Googliemos… nada aparente. Parent no es. Super parece hecho para métodos y no para variables o cosas así… sigo mirando.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como UltimateGeek | Tu comentario

Vivir en la penumbra

Publicado el Mayo 8, 2009

Muy linda la onda de cambiar las lamparitas a bajo consumo, pero para ser directos: iluminan menos. Ya probé las lámparas fluorecentes más modernas y las de LED de última generación: iluminan menos. La nueva modalidad de verde se viene en un color apenas perceptible entre los titilantes destellos de las lámparas fluorescentes y los intrigantes tonos de las lámparas de led.

Y todo eso para que las computadoras más nuevas necesiten cada vez más potencia. Acabo de instalar una computadora quad core de Amd con 8 gigas que requiere nada más y nada menos que una fuente de 600 watts. Con una de 400w levanta, pero cuando alguno de los discos de 500gb se pone muy demandante, empiezan a aparecer los más extraños errores. Una pesadilla si no fuera porque se me ocurrió preguntar a mi proveedor de hardware: estará bien esta fuente de 400? NOOOOOOOOO!!! Ponele una de 600 por lo menos!!!!! Ok. muy verde lo veo a todo esto. Como detalle, la computadora no es mucho más rápida que una que había instalado antes, como un año antes, pero tiene el doble de procesadores… y así morfa… una locura.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Random | Tu comentario

Morbo

Publicado el Abril 19, 2009

De alguna manera, la morbosidad se ha vuelto una fuerza poderosa en nuestros días. El desenfado del destape dejó al desnudo que no se trata de gustar, si no más bien de atraer. Un poco de atención es lo que reclaman todos, aunque sea, a los golpes.

Leer más

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Ser Geek | 1 Comentario

Quién está usando mi ancho de banda? iftop tiene la respuesta!

Publicado el Marzo 29, 2009

Al fin! Estuve buscando esta herramienta durante mucho tiempo y la encontré un poco por casualidad. Tuve que cambiar la forma de hacer la pregunta, porque cuando uno busca en google justamante: “quién usa mi ancho de banda?”  o su equivalente en inglés, francés o alemán, las respuestas apuntan para otro lado.

Aparecen herramientas como Zabbix, o Cacti que son complejas de instalar y apuntan a tener toda la red administrada y tabulada. Y después de mucho gráfico y estudio, no dan una respuesta contundente al momento.

Cómo finalmente me incliné por desestimar las capacidades de resolver problemas de los que buscan herramientas web, empecé a buscar add-ons del IP-Cop en modo consola. Lo siento mucho esa descalificación, pero funcionó inmediatamente: dentro de la apretada lista de herramientas del ipcop encontré varias joyitas dentro de la que destaco el iftop.

Qué hace el iftop? Es como el commando top, que muestra la lista de procesos por orden de consumo -o de lo que uno quiera también-, pero muestra la lista de los destinos que más consumen nuestro ancho de banda en una interfaz.

La sintaxis es así:

user@server:~$ sudo iftop -i eth0

nos muestra

                25.0Kb          50.0Kb          75.0Kb          100Kb      125Kb
└───────────────┴───────────────┴───────────────┴───────────────┴───────────────
nexus.local:721            => argos.local:nfs            0.98Kb  25.4Kb  6.67Kb
                           <=                             608b   19.2Kb  5.02Kb
nexus.local:57828          => 71.Red-79-153-95.dyn:57633    0b   1.17Kb  1.80Kb
                           <=                               0b   23.7Kb  33.2Kb
nexus.local:53984          => 105.Red-83-56-199.dy:11562 3.83Kb  4.53Kb  4.81Kb
                           <=                            6.72Kb  11.7Kb  10.4Kb
nexus.local:41218          => 71.Red-79-153-95.dyn:57633    0b    644b   1.11Kb
                           <=                               0b   12.8Kb  20.5Kb
nexus.local:60069          => 83.173.187.14.dyn.us:53793 5.48Kb  5.36Kb  4.85Kb
                           <=                             320b    320b    301b
nexus.local:44273          => 201-255-232-67.mrse.:22246  208b    166b    201b
                           <=                            6.11Kb  4.89Kb  5.51Kb
nexus.local:52139          => 128.Red-79-147-135.dy:6935 3.56Kb  3.94Kb  2.31Kb
                           <=                             832b    790b    492b
nexus.local:48458          => 128.Red-79-147-135.dy:6935 3.21Kb  3.89Kb  4.31Kb
                           <=                             624b    666b    636b
nexus.local:49058          => 105.Red-83-56-199.dy:11562    0b    250b    242b
                           <=                               0b   3.67Kb  3.08Kb
nexus.local:47962          => 81.184.53.206.dyn.us:44636 1.16Kb  1.72Kb  3.79Kb
                           <=                               0b    250b    345b
nexus.local:4444           => 91.191.138.9:www              0b    136b     34b
                           <=                               0b     88b     22b
nexus.local:mdns           => 224.0.0.251:mdns              0b    177b    442b
                           <=                               0b      0b      0b

────────────────────────────────────────────────────────────────────────────────
TX:             cumm:   934KB   peak:    146Kb  rates:   18.4Kb  48.7Kb  34.9Kb
RX:                    3.25MB            146Kb           15.2Kb  78.9Kb  83.7Kb
TOTAL:                 4.16MB            292Kb           33.6Kb   128Kb   119Kb                                                                                                  33.6Kb   128Kb   119Kb

Por orden de consumo, nos muestra la lista de direcciones que tienen mayor importancia. Localizar un comportamiento anómalo es sencillísimo. Otras herramientas muy interesantes han sabido ser: iptraf e ifstatus, que las recomiendo especialmente. Pude instalarlas en IPCop, Debian, Ubuntu, openwrt de sus repositorios más comunes.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Howtos | Tu comentario

La Trampa del Disco Inmenso

Publicado el Marzo 25, 2009

Para cualquiera que tenga la emoción de comprarse uno de los últimos discos rígidos que pueden albergar todo un país de datos va la siguiente pregunta: ¿Para qué sirve un disco rígido? Bueno, para contestar la pregunta obvia con un dato más obvio podemos decir que sirve para poner datos.

Pero los datos que queremos poner también queremos que se preserven. Perderlos genera una gran ausencia, que no se repara mirando fijamente al bendito disco que ha pasado a mejor vida: su espíritu se ha ido.

Leer más

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Ser Geek | 1 Comentario

El KDE 4.2.1

Publicado el Marzo 16, 2009

Incómodo. Esa es la palabra. Estoy incómodo y totalmente podrido de las reviews de KDE4 que dicen qué lindo que es, y que genial es para un usuario de Gnome probar este entorno gráfico durante unas horas y volver al Gnome para escribir un blog flatulento y no tocar más el KDE4 por el resto del año.

Claro, que por lo menos ya no estoy aterrorizado de ver que los desarrolladores de mi entorno favorito estén llevándolo directo al despeñadero. Despeñadero es ese precipicio desde el cual las peñas caen y se rompen. Y la vieja roca del KDE estaba en el fondo, hecha pedazos. Con esta versión la cosa luce un poco más promisoria y puedo volver a respirar.

Leer más

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Howtos, Random, UltimateGeek | Tu comentario

La Línea de Comando

Publicado el Marzo 5, 2009

Lo primero que viene a mi mente cuando pienso en la línea de comando es que puedo administrar una computadora rápidamente y con gran contundencia aún en una conexión muy lenta. Funciona de mil maravillas. Cualquier lego que nos ve aporreando el teclado en un lenguaje totalmente críptico piensa que somos los amos de la matriz y eso le da un toque extra. Pero la línea de comandos es mucho, mucho más que eso.

Leer más

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como UltimateGeek | Tu comentario

Pasar de XEN a KVM

Publicado el Marzo 5, 2009

Por ahora la cosa funciona, pero realmente la parí durante todo el día. Me cansé del XEN. Lo que más me jode es cargar un kernel especial y poner a las máquinas virtuales el kernel mapeado. A mi lo que me pasa con el XEN instalado bajo HARDY es que cuando tengo mucha actividad de disco rígido tengo un kernel panic. No es chiste, es muy incómodo.

Leer más

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Howtos | 2 Comentarios

Compilando el Amarok 2.0 en Hardy

Publicado el Febrero 17, 2009

No encuentro paquetes para Hardy, así que me dije: compilemos y listo!! Ok, hasta ahora voy instalando estos paquetes

apt-get install cmake kdelibs5-dev build-essential libmysqlclient-dev libqt4-opengl-dev libgpod-dev libmp4v2-dev libloudmouth1-dev libmtp-dev libcurl4-dev

puse que me parece que no hacía falta

libphonon-dev libxine-dev

Ahora estoy mirando la guía que aparece en

http://amarok.kde.org/wiki/Compiling:2.0

un detalle curioso: tuve que borrar un archivo CMakeCache.txt porque no me tomaba la instalación del mysql, que fui instalando a medida que me iba pidiendo. Ahora está compilando con el make. Vamos por el 3% y va para largo. Cambié algo de lo que pone en esa página, puse

cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`

en lugar de

cmake ../amarok-x.y.z -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`

porque pusiera lo que pusiera (amarok-2.0.1.1) me decía que no encontraba nada… me parece que estaba mal el instructivo.

cuando termine y compile y disfrute del nuevo amarok armo un instructivo desde cero.

Todavía sigo compilando

instalé
apt-get install libstrigiqtdbusclient-dev

y saqué el libmtp-dev porque me tiraba errores de compilación. La cmake ya me había dicho que el mtp estaba, pero que la versión no era la adecuada. Ok, vamos por el 88% y sigue.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Howtos | Tu comentario

PS3 vs Wii

Publicado el Enero 22, 2009

Pobre Sony. Se durmió soñando que la innovación era lineal. Pensó, como muchos otros, que para hacer algo mejor hay que aumentar lo que salió bien. La gente no siempre quiere más de lo mismo. Y también pensó que con marketing se arreglaba todo. Pobres diablos. Fácil cae cualquiera víctima de estas falacias, sobre todo cuando la maquinaria se enciende y la gran corporación se mueve a todo vapor.

Leer más

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

» Archivado como Ser Geek | Tu comentario

Sigue mirando »