01 mayo 2009

Script para mandar noticias irrelevantes a meneame.net

Supongo que muchos de los que me leen saben el barullo que se ha montado en meneame.net.

Si no lo sabeis, no voy a ser yo el que lo explique :P

El caso es que acabo de encontrarme con un código muy curioso por internet:

#!/usr/bin/perl -w
# Irrelebot v1.0

use LWP::UserAgent;

# Configuration
my $user = 'PON AQUI TU NOMBRE DE USUARIO';
my $password = 'PON AQUI TU CONTRASEÑA';
my $query = 'prensa+rosa';

# Code
my $userAgent = LWP::UserAgent->new(
    'agent' => 'Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.7) Gecko/2009021906 Firefox/3.0.7',
    'timeout' => 10
);

$userAgent->cookie_jar({});

# Logging to meneame.net
print "Loggeandose...\n";
$userAgent->get('http://meneame.net/login.php?return=%2F');
sleep(10);
my $meneameResponse = $userAgent->post('http://meneame.net/login.php', {
    'username' => $user,
    'password' => $password,
    'persistent' => 'on',
    'processlogin' => '1',
    'return' => '/'
});
sleep(10);

my $meneameContent = $meneameResponse->content;

if ($meneameContent =~ m/error/) {
    die "Error al loggearse\n";
}

print "Loggeado.\n";

while (1) {
    my $googleResponse = $userAgent->get('http://www.google.com/search?q=' . $query . '&hl=es&lr=&safe=off&start=' . (int(rand(65)) * 10) . '&sa=N');
    
    if (!$googleResponse->is_success) {
        die "Error al conectar a www.google.com\n";
    }
    
    my $googleContent = $googleResponse->decoded_content;

    # Parte cutre-salchichera hecha rapidamente
    while ($googleContent =~ /<h3 class=r><a href="([^"]*)" class=l onmousedown=/) {
        my $irrelevanteURL = $1;
        my $irrelevanteResponse = $userAgent->get($irrelevanteURL);
        
        if ($irrelevanteResponse->is_success) {
            my $irrelevanteContent = $irrelevanteResponse->content;
            
            if ($irrelevanteContent =~ m/<title>(.*?)<\/title>/) {
                my $description = $1;
                $description =~ s/&([^;]*?);//g;
                my $title = $description;
                
                if (length($title) > 120) {
                    $title = substr($title, 120);
                }
                
                print 'Enviando ' . $title . "...\n";
                
                $meneameResponse = $userAgent->get('http://meneame.net/submit.php');
                sleep(10);
                
                $meneameContent = $meneameResponse->content;
                    
                $meneameContent =~ /<input type="hidden" name="key" value="([^"]*)" \/>/;
                my $key = $1;
                
                $meneameContent =~ /<input type="hidden" name="randkey" value="([^"]*)" \/>/;
                my $randkey = $1;
                
                $meneameResponse = $userAgent->post('http://meneame.net/submit.php', {
                    'url' => $irrelevanteURL,
                    'phase' => '1',
                    'key' => $key,
                    'randkey' => $randkey,
                    'id' => 'c_1'
                });
                sleep(10);
                
                $meneameContent = $meneameResponse->content;
                
                if (!($meneameContent =~ m/error/)) {
                    $meneameContent =~ /<input type="hidden" name="randkey" value="([^"]*)" \/>/;
                    $randkey = $1;
                    
                    $meneameContent =~ /<input type="hidden" name="id" value="([^"]*)" \/>/;
                    my $id = $1;
                    
                    $meneameResponse = $userAgent->post('http://meneame.net/submit.php', {
                        'url' => $irrelevanteURL,
                        'phase' => '2',
                        'key' => $key,
                        'randkey' => $randkey,
                        'type' => 'image',
                        'id' => $id,
                        'title' => $title,
                        'tags' => 'meneame, prensa, rosa, porcina',
                        'bodycounter' => 550 - length($title),
                        'bodytext' => $description,
                        'category' => 29
                    });
                    sleep(10);
                    
                    $meneameContent = $meneameResponse->content;
                    
                    if (!($meneameContent =~ m/error/)) {
                        $meneameContent =~ /<input type="hidden" name="randkey" value="([^"]*)" \/>/;
                        $randkey = $1;
                        
                        $meneameContent =~ /<input type="hidden" name="id" value="([^"]*)" \/>/;
                        $id = $1;
                        
                        $meneameResponse = $userAgent->post('http://meneame.net/submit.php', {
                            'phase' => '3',
                            'key' => $key,
                            'randkey' => $randkey,
                            'id' => $id,
                            'trackback' => ''
                        });
                        sleep(10);
                        
                        $meneameContent = $meneameResponse->content;
                        
                        if (!($meneameContent =~ m/error/)) {
                            print "Enviada...\n";
                        }
                        else {
                            print "Error al confirmar el envio\n";
                        }
                    }
                    else {
                        print "Error al escribir titulo/entradilla\n";
                    }
                }
                else {
                    print "Error de verificación\n";
                }
            }
        }
    
        $googleContent =~ s/<h3 class=r><a href="[^"]*" class=l onmousedown=//;
    }
    
    sleep(30);
}

Se supone que este código salchichero busca en google noticias irrelevantes sobre la prensa rosa y las publica en meneame.net cada pocos segundos.

No he visto código más feo y más inútil en toda mi vida ;)

Está hecho en PERL (que ironía) y para ejecutarlo es bastante simple: desde una consola unix sólo hay que lanzar "perl nombre_del_archivo_que_contenga_el_codigo.pl"

Yo no lo he usado, pero si alguien lo usa puede contarme en los comentarios qué tal le ha ido :P

25 marzo 2009

Hello world en iPhone usando sprites en OpenGL

Al final no funcionó el experimento de usar un VMWare para desarrollar cosas para el iphone. El Xcode arrancó un par de veces, después empezó a petar siempre en el arranque. Ahora uso un ibook por VNC, pero eso es otro tema.

Únicamente queria escribir post para mencionar el blog iDev 4 touch.

Se trata de un blog destinado a desarrollar juegos para el iphone usando OpenGL. Tiene un par de tutoriales, pero son los únicos que he encontrado que me han permitido enterarme un poco de qué va esto. Están en español y llenos de detalles (screenshots, ejemplos de código, explicaciones muy concretas, no deja ningún cabo sin atar...).

No hay nada como un buen hello world para aprender un lenguaje.

04 marzo 2009

¿Qué significa "quick launch" para Apple?

Sé que no son horas, pero estoy leyendo la documentación de desarrollo del SDK del iPhone y de repente me encuentro con esto:

The file for the application’s launch image is named Default.png. This image should closely resemble the application’s initial user interface; the system displays the launch image before an application is ready to display its user interface, giving users the impression of a quick launch.

 Traducción:
El archivo de la imagen de arranque de la aplicación se llama Default.png. Esta imagen se debería parecer a la interfaz inicial de la aplicación. El systema la muestra antes de que la aplicación esté del todo lista, dando a los usuarios la sensación de un "arranque rápido".

Me he quedado de piedra al leerlo en la documentación oficial.

Resulta que cuando desarrollas una aplicación para el iPhone, puedes poner un Default.png en la raíz de la aplicación. De este modo, cuando la vayas a ejecutar, lo primero que se mostrará será dicha imagen. En Apple proponen hacer que sea una screenshot guarra de tu aplicación para darle la sensación al usuario de que todo carga fantabulosamente rápido.

Ahora me explico por qué por mucho que intentara usar la aplicación al acabar de iniciarse, esta no respondiera...

Por cierto, esto me recuerda a esta comparación entre la velocidad de un iPhone en un anuncio de Apple y la velocidad real:

03 marzo 2009

VMWare + Hackintosh 10.5.5

Pequeña tira cómica de mi webcomic :)

El otro día estuve echando un vistazo al panorama de desarrollo de aplicaciones del iPhone. Al parecer, existe un conjunto de utilidades para Mac OS X que te permite programar aplicaciones para el iPhone.

Entre estas utilidades podemos encontrar un compilador que te permite hacer compilación cruzada, un conjunto de headers para poder crear aplicaciones que utilicen su framework y un emulador para poder testear las aplicaciones sin tener que subir los cambios a un iPhone cada vez que quieras probar tu código.

Ya sea por aburrimiento o por ganas de aprender algo nuevo, me he propuesto hacer algun proyecto chorra en ese framework. Lamentablemente, el primer problema con el que me encontrado es que tengo que disponer de un ordenador Mac con OS X 10.5.3 (mínimo). Pero bueno, no pasa nada. Esto es muy propio de los sistemas cerrados.

Hasta hace poco, los Macs que había probado habían sido los de amigos, los de las Apple Stores, etc. Sí, son bonitos y tal... se pueden usar, sí... Son cerrados...

Gracias a Darwin, en mi empresa compraron recientemente un MacBook y pude "trabajar" realmente sobre uno de ellos. Mi experiencia: una gran mierda.
  • El teclado es parecido al QWERTY, pero no es QWERTY. Los símbolos no están donde toca. A la hora de programar, molesta bastante. ¿Que me acostumbre? ¿Por qué? ¿Por que es más cool ser diferente? ¿Es más cool tener que cambiar de esquema mental cada vez que cojas un PC diferente?
  • Los atajos de teclado básicos: no entiendo a quien se le pudo ocurrir la idea de que teniendo focalizado un icono en el gestor de archivos, al pulsar la tecla ENTER, se te permitiera renombrar el nombre del icono en vez de abrirlo; el hecho de tener que pulsar dos teclas para usar el PageUp, PageDown, End, Home... Si quieres usar estos últimos en conjunción con la tecla "shift" para seleccionar texto (algo que uso muy a menudo a la hora de programar), sufrirás una parálisis temporal en la mano derecha.
  • El hecho de no poder maximizar una ventana me molesta bastante. Aquí parece que la filosofía es "la aplicación decide lo que el usuario quiere ver, y el espacio que necesita para verlo". Por culpa de esta genial idea, me encuentro con el siguiente problema:
    • Abro Safari (se me abre google.es).
    • Pulso "maximizar" y la ventana no se maximiza, sino que se ajusta al contenido de la web.
    • Busco algo en google.
    • Ahora el contenido de google no se ve bien, vuelvo a pulsar "maximizar" y se vuelve a ajustar.
    • Hago click sobre un enlace cualquiera.
    • La nueva web no cabe en la ventana, por lo que vuelvo a pulsar "maximizar" y se vuelve a ajustar.
    • Me canso de todo y pienso que no debería desperdiciar mi preciado tiempo pulsando un mismo botón mil veces y apago la máquina.
  •  El "mazanita" + tab no cambia el foco en las ventanas. Lo cambia en las aplicaciones. Si tienes dos terminales abiertas, debes pulsar "manzanita" + "otra movida que no recuerdo".
  • Etcétera.
Este gran cúmulo de gilipolleces me sacan bastante de quicio. En el momento que el usuario es más rápido que la máquina, es porque algo falla.

Pero bueno, dejando de lado la ineptitud de los que idearon el sistema, hablemos de mi odisea.

Para empezar, me fijé que existía una imagen para VMWare con el sistema operativo Mac OS X 10.5.2 creada por un tal ~pcwiz, así que me dispuse a instalarla. El torrent se llamaba "~pcwiz's VMware Leopard Image". Se puede encontrar por mininova o por thepiratebay.

Una vez iniciado sobre mi VMWare en GNU/Linux, veo que todo va muuuy leeentooo. Tan lento que me cuesta como 5 minutos arrancar el sistema operativo. Pero dejo estos detalles aparte, ya que no aportan nada al hilo principal (acabé usando VMWare sobre Windows, donde al parecer, multiplica la velocidad considerablemente).

Si habeis tenido algún problema, podeis mirar el hilo oficial de ~pcwiz e intentar buscar respuestas.

Nota:
Si no os funciona la red, explico la solución:
  • Configurar la red en modo "Bridged"
  • Después de cada reinicio del OS X, abrir las preferencias del sistema.
  • Ir al apartado "Network".
  • Borrar todas las interfaces ethernet que tengais.
  • Crear una nueva ethernet, poner su nombre y pulsar aceptar.
  • La dejamos tal y como está (en modo DHCP) y pulsamos "Apply".
  • La ventana seguirá diciendo que el cable está desconectado, pero no pasa nada.
  • Cerramos las preferencias y probamos a abrir el Safari.
Bien, una vez llegados a este punto, vereis que tenemos un Mac OS X 10.5.2, donde el SDK del iPhone es imposible de instalar. Para ello necesitamos Mac OS X 10.5.3 (mínimo).
  • Primera regla del club de las amigas: intenta no actualizar nada si no es imprescindible.
  • Segunda regla del club de las amigas: ten siempre a mano un backup de la imagen de ~pcwiz.
  • Tercera regla del club de las amigas: no uses nunca el Apple Software Updater.
Para actualizar a Mac OS X 10.5.5 sin morir en el intento, se puede seguir este tutorial. En resumen, es lo siguiente:
  1. Descargar e instalar el Pacifist.
  2. Descargar y no instalar el update de Apple a 10.5.5.
  3. Abrir un terminal y convertirse en root usando "sudo -s". El password es "pcwiz".
  4. Abrir un terminal y dejar ejecutándose el siguiente comando: while sleep 1; do rm -fR /System/Library/Extensions/AppleIntelCPUPowerManagement.kext; done
  5. Ejecutar el Pacifist y abrir con dicho programa el update que nos hemos descargado antes.
  6. Navegar por los directorios e instalar solo el System/Library/CoreServices.
  7. Voilà, ya tenemos 10.5.5.
Si reiniciamos puede ser que no llegue a arrancar nunca (se queda en la pantalla blanca con la manzana y la animación de debajo dando vueltas indefenidamente, sin dar ningún error), pero no pasa nada. Hacemos un reset y en teoría tendría que arrancar.

En el próximo post quizás comentaré mis primeros pasos con el SDK del iPhone y haré un mini hello world.

PD: No, no se puede instalar sobre VirtualBox ya que no soporta PAE.
PD2: Desde aquí doy las gracias a bad, por aguantarme durante todo el proceso y ayudarme en lo que ha podido... Sí, tiene las tablas del MySQL corruptas, pero dejadlo. Es feliz así :P

28 enero 2009

Simple Environment

Hace unos dias configuré mi joystick para usarlo como si fuera un mouse en las X y lo expliqué en este post. Prometí que haría alguna aplicación para adaptar el PC a la TV (y que sea usable). Aquí teneis la promesa en cuestión:

Haré alguna aplicación en Qt para convertir el PC en algo usable (ver stream, abrir archivos, navegar por internet, emulador de super nintendo...). Ya la publicaré por estos lares ;)

Pues bien, he empezado el proyecto y ya tengo algo "publicable". Se trata de un entorno de escritorio basado en Qt. Se llama Simple Environment (web del proyecto).

Para empezar, he desarrollado un pequeño framework llamado SFramework que provee al programador de herramientas para facilitar el desarrollo de aplicaciones para Simple Environment. Unos ejemplos de estas herramientas son:
  • SDirectoryBoard: pequeño widget que muestra el contenido de un directorio en forma de botones, al estilo del iPhone. Soporta paginación (cuando los archivos no caben en la pantalla, se añaden en la página siguiente). Además, interpreta Desktop Entries (accesos directos, para que nos entendamos) usando el estándar definido por freedesktop.org
  •  SEnvironment: ¿Quién no ha necesitado alguna vez saber dónde se encontraba el home del usuario? ¿O saber en qué directorios se guarda la configuración de las aplicaciones? Esta clase provee de métodos estáticos que informan sobre cosas como: la ruta al home del usuario, los directorios de configuración de las aplicaciones, los directorios de datos de las aplicaciones, los temas de iconos instalados en el sistema, etc. Y además, todo ello respetando el estandar de freedesktop.org
  • SIconProvider: una simple clase que provee al programador de soporte para temas de iconos, incluyendo herencia entre temas. Basado también en el estandar de freedesktop.org
Una vez creado un framework que me permitiera trabajar, me puse a desarrollar un SDesktop, una simple aplicación que, haciendo uso de SDirectoryBoard, mostrase los iconos del escritorio en pantalla completa. Además, tiene una toolbar superior para navegar entre las páginas del escritorio y una pequeña toolbar a su izquierda, que contiene un par de botones: "configurar" y "apagar".

Os dejo una screenshot de ejemplo:



El botón "configurar" ejecuta el proceso "scontrol", otra aplicación que he desarrollado especialmente para configurar Simple Environment. Se parece al panel de configuración de Firefox: tiene tres botones superiores ("Look and feel", "Applications" y "Paths"). Te permite configurar cosas como el tamaño de las fuentes, el tamaño de los iconos, el tema de iconos, el número de filas y columnas del escritorio...

Una screenshot:



Al guardar la configuración, scontrol hace una llamada mediante el sistema DBus (sistema de intercomunicación de aplicaciones desarrollado por freedesktop.org) al método "reload" de org.simple-environment.sdesktop. Así se consigue que el escritorio actualice su configuración.

El proyecto está hosteado en sourceforge.net, y esta es su página.

De momento carece de documentación sobre SFramework, pero en cuanto tenga tiempo subiré algo. Lo que sí que contiene son las instrucciones de instalación a partir del repositorio SVN.

Finalmente, quiero aclarar que esto se trata de un proyecto chorra, para satisfacer mis necesidades, por eso le voy a ir añadiendo funcionabilidades y voy a ir desarrollando aplicaciones según las necesite. Podeis hacer aportaciones y sugerencias, por supuesto.

PD: algunos se preguntarán "¿Por qué este tío es tan matado y no ha cogido uno de los millones centros multimedia que hay ya creados?". Simple: he probado varios y a todos les falta alguna funcionabilidad que tienen los demás.

Por ejemplo, si ahora quiero crear un gestor de archivos, es tan simple como usar SDirectoryBoard, cuatro chorradas más del framework de Qt y un poco de tiempo.

¿Que ahora me hace falta un cliente de IRC? Pues lo mismo. ¿Que le quiero añadir el texto-hablado como ya comenté en este post? Pues en un flis lo hago y puedo jugar a algún emulador mientras oigo lo que dicen por el IRC.