martes, septiembre 29, 2009

Un rayo de luz en la cueva de los primos gigantes

Hola,
Alguno recordará un tema que quedó pendiente respecto a los primos gigantes.

No pude explicar el funcionamiento de un algoritmo que básicamente convertía un número binario gigante (que se sabía que era primo) en decimal. Lo extraño era que lo hacía terriblemente rápido. Todo gracias a la transformada rápida de Fourier.

Hace unos meses fui a una biblioteca universitaria y encontré un libro sobre aplicaciones de la transformada de Fourier pero en ningún sitio ponía que se pudiera utilizar para una conversión de este tipo. Sobre todo se utiliza en temas como conversión analógica-digital de señales.

Hoy me he pasado un buen rato buscando entre mis libros de matemáticas de la uni, e internet a partes iguales. Al final he encontrado en Internet la explicación de todo el misterio. La utilidad de la transformada para la conversión se la debemos a un trabajo de los año 70 de Arnold Schonage de la Universidad de Bonn.

Ahora ya es tarde y no me da tiempo a explicarlo.

En el próximo post el destripe del programa C más curioso: http://aitoreus.blogspot.com/2009/05/programas-c-curiosos.html

Por cierto, que el premio se lo deberían dar a Arnold Schonage, o como mínimo debería ser compartido. O ya que no es compartido lo podían haber incluido como comentario en el programa. Trabajar con la mejor máquina no es tan meritorio como encontrar el algoritmo más rápido.

Saludos.

sábado, septiembre 26, 2009

Búsquedas por la web con PERL

El otro día quise ayudar a mi colega Castrol con un tema. Concretamente escribió un post sobre bibliotecas clásicas, y cómo el uso de Google parecía sustituirlo todo.

También contó alguna anécdota como un problema que tuvo al deletrear una palabra inglesa. No sabía si se escribía de una forma o de otra. Al final abrió Google y supuso que la versión con más respuestas era la correcta y la otra era la mala.

Como yo sabía que utiliza un portátil mac pensé en un pequeñito script Perl para facilitar este tipo de dudas. Mac OS X, como la mayoría de GNU/Linux, UNIX, etc. trae el interprete PERL incorporado.

La forma de ejecución es $buscar palabra1 palabra2 y el resultado:

palabra1: 1.200.000 resultados.
palabra2: 10.000 resultados.

El programa Perl es éste, pero lo más importante es que NO FUNCIONA.


Ahora bien, ¿POR QUÉ NO FUNCIONA?

Me he vuelto un poco loco hasta darme cuenta. No es que las sentencias estén mal ni nada de eso. Si en lugar de Google buscáramos en un documento de nuestro PC, en un blog, en un diario, etc. funcionaría sin problemas, pero no en GOOGLE, ni en YAHOO, y me imagino que tampoco funciona en otros muchos buscadores.

Hace años habría funcionado pero hoy en día ya no.

El problema es que estos buscadores están bloqueado la utilización de LWP.

Cuando accedemos al servidor de Google con nuestro programita PERL utilizando LWP, se le informa también de cual es la librería y versión con la que accedemos.

En mi instalación, el "UserAgent" se pasa por defecto con el valor "libwww-perl/5.805". A los buscadores no les gusta que accedamos (LWP) de esta forma y simplemente nos ignoran.

De esta forma podemos ver cómo accedemos:
use LWP::UserAgent;
my $ua=LWP::UserAgent->new;
print $ua->_agent;

¿UNA SOLUCIÓN RÁPIDA?

Bueno, podemos modificar el "default agent identifier" para que ponga que accedemos con Mozilla por ejemplo y asunto solucionado.

Para eso hay que utilizar el módulo LWP::UserAgent en lugar de LWP::Simple. En la imagen siguiente está el código fuente:



Ahora sí, si ejecutamos:

perl buscar.pl aciendo haciendo

Nos da la siguiente respuesta:

aciendo: 778.000 encontrados
haciendo: 51.000.000 encontrados

pd1: Utilizar este programa de esta forma incumple la condición 5.3 que Google establece para el acceso a su servicio (Condiciones de servicio de Google). Para evitar incumplir nada, en el próximo post explicaré la forma de acceso a través del interfaz (API) de Google.

pd2: No se si te será muy útil Castrol, pero espero que tengas suficiente curiosidad para probarlo e incluso que te conviertas en un PERL HACKER.

viernes, septiembre 18, 2009

Utiliza perl para controlar tus sitios preferidos


Hola,

El lenguaje del camello es un lenguaje que siempre me ha gustado (por cierto, en los libros suelen poner un dromedario en lugar de un camello).

Posiblemente PERL no esté en su mejor momento, pero tiene unas ventajas claras:


  • Está por defecto en la mayoría de los UNIX.
  • Disponible con licencia GPL (software libre).
  • Disponible para Windows.
  • Preinstalado en la mayoría de las distribuciones GNU/Linux.
  • Preinstalado en Mac OSX como buen UNIX que es.
  • Es un lenguaje moderno y muy actualizado. Me refiero a que tiene cientos de módulos para hacer cualquier cosa (conexión a bases de datos, encriptación, web, etc. etc.). Este es el motivo por el cual lo he elegido hoy, en lugar del querido Pascal.
¿Por qué digo que no está en su mejor momento?

Bueno, Perl nace en 1987 como lenguaje de generación de informes. O sea, se trataba de un animal de carga no demasiado bonito pero que hacía maravillas en la Administración de hosts con gran capacidad para manejo de strings.

Luego evolucionó con la incorporación de múltiples mejoras. Conoció el boom de Internet con las CGI y finalmente llegó el declive por el crecimiento de Java, .NET, Python, PHP, etc. etc.

Perl nació y creció de una forma algo desordenada. Se le añadió la orientación a objetos con calzador, así como otras muchas historias. Al final resulta un lenguaje muy especial. Casi críptico, y eso en sí mismo también es bonito.

Desde 1994 la versión utilizada ha sido la 5. Sobre el año 2000 hubo calientes debates sobre cómo debería ser Perl 6. El caso es que todavía hoy creo que la versión estable es la 5.8.9. Como curiosidad, el Perl instalado en mi Mac OS X Leopard 10.5 es el 5.8.8

Vale ya de charletas, ¿Por qué se dice que Perl es tan potente?

Es por la gran cantidad de módulos que tiene. Hay módulos PARA TODO lo que se os pueda ocurrir y están disponibles en CPAN.

UN EJEMPLO

Supongamos que queremos hacer un programita Perl que nos diga si en alguno de los periódicos se habla de un determinado tema. Son por ejemplo 20 periódicos, y lo queremos mirar todos los días por lo que de alguna forma hay que automatizar el trabajo.

O supongamos que en nuestra empresa nos han encargado leer unos cuantos boletines oficiales para buscar subvenciones o algo así.

Un trabajo así de pesado es lo ideal para Perl.

Editamos el siguiente programa (en mi caso con el TextEdit de mac):



El que no haya visto nunca Perl creo que me entiende ahora cuando digo que es un poco críptico.


LA EXPLICACIÓN DEL PROGRAMITA

use LWP::Simple;
indica que utilice el módulo LWP::Simple (The World Wide Web module for Perl).
cuando se instala un módulo (en mi caso ya estaba instalado), también se instala la documentación.
Podemos hacer perldoc LWP para verla.

use strict;
es una directiva que es bastante recomendable para forzarnos a inicializar variables, etc.

my $contenido = get('http://aitoreus.blogspot.com');
inicializamos la variable "contenido" con la captura de la web que nos interese.

die "no consigo ver el sitio" unless defined $contenido;
esto es un poco enrevesado. Le pide al programa que "muera" escribiendo "no consigo ver el sitio", a no ser que la variable $contenido esté definida.

print "Hola chavalote. Estoy analizando http://aitoreus.blogspot.com";
escribe el texto sin más.

foreach my $palabrita (qw( pascal programacion program begin end))
El comando qw símplemente sirve para crear una lista con las palabras.
El foreach es una de las construcciones más divertidas de Perl.
Es un bucle for que además del bucle va asignando a la variable $palabrita cada término de la lista.
Lo que está entre llaves es lo que se ejecuta en cada iteración del bucle.

print "$palabrita\n" if $contenido=~ m/\b\Q$palabrita/;
Esto es otra muestra de la potencia de Perl. Son los patrones de búsqueda. Escribe la palabrita con un retorno de carro, si se cumple que la palabrita está en el contenido.

print "\n[Escaneo terminado el", scalar( localtime ), "]\n";
Escribe que ha terminado y pone la fecha y hora.

exit;
Y con esto yo también me despido.

Saludos.

martes, septiembre 15, 2009

Cosas de bancos...

Hace más de un año, hice un pequeño programita que utilizaba el interés simple.

Recordad que el interés simple es el que se calcula sobre la cantidad inicialmente prestada, mientras que el interés compuesto se calcula sobre el capital pendiente de pago.

Normalmente las cantidades fuertes a pagar durante muchos años (la típica hipoteca) va con interés compuesto, mientras que las pequeñas cantidades (coche, moto, ordenador, etc.) se calculan con interés simple.

Aquel programita sólo permitía responder a una pregunta de este tipo:

Unai ha pedido al banco un préstamo de 30.000 euros para pagar un coche nuevo.
El banco se lo ha concedido aplicando un "interés simple" del 6,5% anual.
Lo va a pagar en 5 años.
¿Cuanto paga en total intereses incluidos?

Metiendo en el programa:

c0 = 30000
i = 0.065
n = 5

Nos devuelve que:

cn = 39750

Lo primero que ocurre es que es muy poco intuitivo tener que meter el interés como 0.065 (6.5/100). La mayoría de la gente (incluido yo mismo) introducirá 6.5 y el resultado será incorrecto. Además si el préstamo se calcula tomando como base meses habría que hacer 6.5/1200 (por haber 12 meses en un año) y si es un prestamo en días 6.5/36000 (por haber 360 días en un año comercial).

El siguiente problema es que no sirve de mucho saber lo que vas a pagar en total. La gente prefiere saber por ejemplo la cuota mensual de ese préstamo.

Y es mejor incluso que el programa nos devuelva la cuota a pagar dependiendo de diferentes tipos de interés, ya que en la realidad tendremos ofertas de varias entidades bancarias.

Pues eso es lo que hace este nuevo programita:


Código fuente:








program interessimple;
uses Crt; //necesario para el clrscr y el readkey.
var c0,cn,i,b:real;
n:integer;
a:char;
begin
clrscr;
textcolor(4);
textbackground(7);
clrscr;
writeln('Interes simple');
writeln('--------------');
writeln;
writeln('por aitoreus');
writeln;writeln;writeln;
readkey;
//c0 es el capital inicial.
//i es el interes anual.
//n es el numero de periodos.
//cn es el capital final.
writeln;
c0:= 0;
i:= 0;
n:= 0;
b:= 0;
repeat
clrscr;
textcolor(2);
write('UNIDAD DE TIEMPO: ');
if b = 100 then write('A¥O');
if b = 1200 then write('MES');
if b = 36000 then write('DIA');
write(' CAPITAL PRESTADO: ');write(c0:8:2);
write(' INTERES: ');write(i:2:2);
write(' ',n);
if b = 100 then writeln(' A¥OS');
if b = 1200 then writeln(' MESES');
if b = 36000 then writeln(' DIAS');
textcolor(4);
writeln;
writeln;
writeln('1-ESTABLECER EL DIA COMO UNIDAD DE TIEMPO');
writeln('2-ESTABLECER EL MES COMO UNIDAD DE TIEMPO');
writeln('3-ESTABLECER EL A¥O COMO UNIDAD DE TIEMPO');
writeln('-------------------------------------------------');
writeln;
writeln('4-INTRODUCIR LA CANTIDAD QUE VAS A PEDIR PRESTADA');
writeln('5-INTRODUCIR EL TIPO DE INTERES');
write('6-INTRODUCIR LOS ');
if b = 100 then write('A¥OS ');
if b = 1200 then write('MESES ');
if b = 36000 then write('DIAS ');
writeln('PARA DEVOLVER EL PRESTAMO');
writeln('-------------------------------------------------');
writeln;
writeln('7-RESULTADOS GENERALES');
writeln('9-Salir');
writeln;
writeln('-------------------------------------------------'); writeln;
writeln;
a:=ReadKey;
case a of
'1':
begin
//si la unidad de tiempo es el d¡a,
// se divide entre 36000
//(360 d¡as en el a¤o comercial).
b:= 36000;
end;
'2':
begin
//si la unidad de tiempo es el mes,
//se divide entre 1200
//(12 meses al a¤o).
b:=1200;
end;
'3':
begin
//si la unidad de tiempo es el a¤o,
//entonces hay que dividir entre 100.
b:= 100;
end;
'4':
begin
write('CANTIDAD A PEDIR? ');readln(c0);
end;
'5':
begin
write('TIPO DE INTERES? ');readln(i);
end;
'6':
begin
write('NUMERO DE ');
if b = 100 then write('A¥OS? ');
if b = 1200 then write('MESES? ');
if b = 36000 then write('DIAS? ');
readln(n);
end;
'7':
begin
if (c0 = 0) or (n = 0) or (i = 0) or (b = 0) then
begin
writeln('POR LO MENOS TIENES QUE INTRODUCIR');
writeln('LA CANTIDAD A TOMAR EN PRESTAMO,');
writeln('EL TIEMPO DE PRESTAMO Y EL TIPO DE INTERES');
readkey;
end
else
begin
cn:=c0*(1+(n*i/b));
writeln('CANTIDAD PEDIDA = ',c0:8:2);
writeln('CANTIDAD TOTAL A DEVOLVER= ',cn:8:2);
write('CANTIDAD A PAGAR CADA ');
if b = 100 then write('A¥O = ');
if b = 1200 then write('MES = ');
if b = 36000 then write('DIA = ');
writeln(cn/n:8:2);
writeln('TOTAL INTERESES A PAGAR = ',cn-c0:8:2);
readkey;
end;
end;
end;
until a='9';
end.

domingo, septiembre 13, 2009

Nunca aconsejes software ilegal

Yo tengo eso por norma. Recomendar no hacer descargas ilegales por lo que pueda pasar. Y no todo el malware se dirige a Windows como se puede ver en las siguientes imágenes:

Aquí parece que una copia ilegal de Photoshop CS4 sirve para ser totalmente vulnerable al atacante:


Ocurre algo similar con alguna copia ilegal de iWork:

Según aseguran 20.000 incautos han descargado este software troyanizado que habilita permisos para la administración remota.

El problema puede ser el coste de los casi 1.000 euros del Photoshop:

Por eso el consejo bueno puede ser el software libre.

Aquí tenemos de forma totalmente gratuita el GIMP para Mac OSX.

Por supuesto está disponible para un montón de plataformas: http://www.gimp.org.es/modules/mydownloads/

Saludos.

miércoles, septiembre 09, 2009

El libro que más he buscado...

Ayer iba a escribir un post sobre un libro muy interesante que leía en la biblioteca municipal hace 15 años.

Digo que lo leía, y no que lo leí, ya que era un libro de consulta que no podías coger en préstamo. Así que cada vez que pasaba por allí, y si no me apetecía leer comics clásicos, u otros libros curiosos, pues leía aquel libro.

El caso es que ayer me pasé más de 2 horas buscando por todos los sitios y no hay forma de encontrarlo. Tampoco lo he visto nunca en ferias de libros, y para más INRI, otro autor, en un libro con la misma temática "utilizó" el mismo título aumentando la confusión.

Me refiero a "Los piratas del chip" (título original: Approaching Zero).

El título era muy bueno, salvo por la coletilla desafortunada que decía "la mafia informática al desnudo".

Sin volverlo a leer no me atrevo a describirlo, pero el recuerdo que tengo de las historias que contaba no era nada parecido a una mafia.

En aquella época Internet no era lo que es hoy en día, las llamadas gratuitas, utilizar un modem sin pagar a la compañía telefónica, y acceder a hosts remotos eran el objetivo, los hackers trabajaban más bien en solitario y en la mayoría de los casos no buscaban el lucro personal.

El caso es que este libro aparece en la mayoría de bibliografías sobre hacking, y eso a su vez dificulta la búsqueda del original.

Aquí están las 235 páginas de la versión inglesa:
http://manybooks.net/pages/mungopother08approaching_zero/0.html

Estos son los datos del libro en su edición en castellano:

Autores: Bryan Clough, Paul Mungo
Editores: Ediciones B
Año de publicación: 1992
ISBN: 84-406-3152-9

Saludos.

viernes, septiembre 04, 2009

ERASER y DBAN

Ya sabemos la importancia de eliminar los datos de los viejos PC-s que retiremos.

No cuesta demasiado esfuerzo dejarlo bien limpito, pero normalmente la gente por ignorancia entrega el PC con los datos con la marca de borrado (papelera de windows vacía) pero sin haber sido eliminados realmente.

O tal vez no sepan que una sola escritura completa a "0" no es suficiente para que alguien con pocos recursos pueda recuperar esa información eliminada.

Imaginad toda la información que tenéis en vuestro PC personal, o en el del trabajo, y lo que un mirón, competidor, enemigo o cyberdelincuente puede hacer con ello.

Para la eliminación física de datos al eliminar yo suelo utilizar el eraser en Windows.

Eraser es software libre y se integra perfectamente en Windows.

Por ejemplo podéis utilizar el botón derecho sobre la papelera de reciclaje para eliminar físicamente datos (escritura de datos). También con el botón derecho sobre un fichero nos da la opción de eliminación física. Y por último, nos permite programar a una hora determinada la escritura física sobre el espacio vacío del disco duro.

¿Y cuando retiramos el PC?

Eraser tiene una opción de generación de disquete de arranque para eliminar todo el contenido del disco duro.

El problema que me encontré, es que o bien tenía equipos sin disquetera, o bien no me reconocía discos SATA.

Lo que he tenido que hacer es ir a la web de Darik: www.dban.org y descargarme su DBAN (Darik's Boot And Nuke).

Con la imagen ISO preparamos el CD de arranque y sin más. Arrancas, eliges la opción deseada (por ejemplo el método DoD) y listo.

Se comerá el disco de 160 Gbytes en 4 horas más o menos. Esto es orientativo, ya que todo dependerá del número de pasadas, método utilizado, procesador, revoluciones del disco, procesador, etc. etc.

Cuidado con una cosa: Si tenemos más de un disco, conviene asegurarse de que ha detectado todos los del sistema.

martes, septiembre 01, 2009

¿Hay algo peor que un monopolio?

Nota: En este post hago referencia al euskera, pero puedes hacerlo extensivo a cualquier otro idioma marginado por Apple (unos 6.700 idiomas).

La respuesta al titulo de este post es que Sí. Es el abuso. Todo el mundo conoce las 4 libertades del software, pero es que hay software que además de no darte esas libertades te imponen absurdas prohibiciones.

En las navidades del año pasado entró en mi casa un mac mini. La experiencia ha sido positiva en general. Con software suficiente de serie, programas sencillos pero muy prácticos como el iphoto, el iMovie, etc. todo ello a un precio asequible (unos 450 euros).

Ahora bien, en el trabajo he instalado un equipo de sobremesa Debian en euskera. Mi antiguo Ubuntu de casa estaba en euskera. Mi XP del trabajo también en euskera.
Ahora tenía ganas de poner utilizar el Mac OSX en euskera en lugar de castellano. Sin más. Porque me apetecía.

La sorpresa es que no hay opción de Mac OSX en euskera. Tampoco lo hay si me actualizo al nuevo SnowLeopard 10.6 y seguramente no lo habrá nunca por los siglos de los siglos.

Después de constatar el hecho me puse a buscar. Es habitual que no puedas elegir el idioma que te de la gana, pero puede haber algún grupo de usuarios que haya dedicado su valioso tiempo en hacer ese trabajo que el fabricante no ha realizado.

Pues esos usuarios voluntariosos existieron e hicieron un gran trabajo desarrollando un parche que traducía un programa concreto al euskera. Publicaron en la web su trabajo y ¿Qué ocurrio?

Les llegó una carta de Apple diciendo que no podían hacer eso y que lo quitaran inmediatamente. Después de la primera hubo una segunda y el proyecto se abandonó.


También se retransmitió en ETB1 (está en euskera).


No sólo es el euskera. Mac OSX se distribuye sólo en 15 idiomas. A comunidades de hablantes amplias como el Catalán también se les prohibe hacer labores de localización:

Otros bloggers también han recogido el testigo y explican el tema:

Y respecto al futuro, estos idiomas no entran en los planes de Apple:

¿El Sistema Operativo más avanzado del mundo?

Es lo que dice Apple, pero la realidad es que parece mucho más avanzado cualquier proyecto software libre con su especial habilidad para lograr productos multilingües.

Incluso el software propietario tiende a tener en cuenta lenguas minoritarias como por ejemplo:

Microsoft
Ha desarrollado interfaces en euskera para múltiples paquetes como por ejemplo Windows XP.

Microsoft fue premiado, ya que hizo las localizaciones de forma totalmente gratuita y desinteresada:



Adobe: Ha realizado el esfuerzo de poner el Reader en euskera.

Google:
Tradujo GMAIL al euskera:

Apple tendría que darse cuenta de que todo no se mide en dinero, y que aunque fuera así, y no pudiera asumir un coste tan grande, otra gente le estaba haciendo el trabajo gratis.

Además, la Legislación se va adaptando, como la Ley 11/2007, de acceso electrónico de los ciudadanos a los Servicios Públicos. Este tipo de Leyes pretende garantizar el derecho a los ciudadanos a utilizar entre otras cosas la lengua oficial que le de la gana cuando va a una biblioteca, al colegio, a su trabajo de funcionario, etc.

Les estaría bien empleado que su prohibición supusiera al final perdidas económicas y menor cuota de mercado.

Saludos.