September 2007 Archives

Béisbol

| | Comments () | TrackBacks (0)

Ayer fuimos al béisbol. De hecho, nos invitaron algunos de los jefes de la oficina, que tienen palco y asientos exclusivísimos. Para Raquel y para mí fue algo completamente nuevo y diferente, nuestro primer partido de béisbol de Grandes Ligas: Muchas veces soñé con ese momento desde que era pequeño y mi papá me hacía jugar béisbol en la Liga Anáhuac y luego en otra liga perdida en Ciudad del Carmen, cuando vivíamos en Campeche. Pero no, mi papá no estuvo ahí, pero sí Raquel; afortunadamente pude hablarle a mi jefe y contarle, se emocionó.

Vimos el juego entre los New York Mets y los Washington Nationals (que eran los Montreal Expos), en el Shea Stadium, que se encuentra en el norte de Queens. Hay que tomar toda la línea #7, para llegar ahí desde Port Authority, en el corazón de Manhattan.

Los asientos eran espectaculares, estábamos en unos palcos/suites con bebida y comida. Adicionalmente, tenían asientos de primera fila, entre tercera y home. Fue espectacular.

Mañana, por cierto, firmaremos el contrato para nuestro departamento en el norte de Manhattan, en Harlem, cerquita del Río Harlem.

Fotos de esto, aquello y lo otro, en http://fotos.raquelydavid.net.

On Ahmadinejad's visit to the US

| | Comments () | TrackBacks (0)

 

Shamelessly stolen from Metroblogging NYC.

Like mommy...

| | Comments () | TrackBacks (0)

RockBox / NYC PM / Long walk / Pics

| | Comments () | TrackBacks (0)

So, I have just installed RockBox on my iPod and I have liberated it :) It’s nice to see people amazed on an iPod running something that’s different from the usual firmware. Now, both my iPod and PowerBook are not running Apple software, muahaha!


Since we are in NYC now, and even before, we’ve been looking for interesting activities in the area. Tomorrow, the New York City Perl Mongers will handle their monthly meeting. At 6:30 PM at d.b.a, 41 First Avenue (between 2nd and 3rd Streets), map: http://tinyurl.com/2yqg4d. Tomorrow, we were supposed to go see a prospective apartment in Bushwick, Brooklyn in the afternoon; I’ll see if we can still make it. Otherwise, if you are in the area, feel free to attend!


Yesterday, we went to the Yankee Stadium. Actually we only went outside it, since we didn’t carry any tickets, we just wanted to see the neighborhood. It was amazing, since there was a game and we witnessed thounds of people commuting to it to watch the game. It was a nice experience only watching the people and all the buzz around the stadium. After that, we got back to Manhattan on the subway and dropped off on the 57th and Madison Ave: From there, we walked around sixty freaking blocks to get to our apartment near Essex & Delancey St. After checking on Google maps, it was a ~6 kms walk! It only took us 2:30 hrs. Heh. On the good side, we happened to see lots of nice places of Lexington and other avenues.Tonight, we’ll be walking to Little Italy and Chinatown, although we already know those neighborhoods, since Alex took us there when were here last June.


So, we are uploading our pics to the NYC photo set of our flickr account, raquelydavid.

Puto Metrobús

| | Comments () | TrackBacks (0)

Este post tenía ya varios días que me lo estaba guardando.

Resulta que quedé de ir con Lurkan a su oficina en la Nápoles a filosofar un poco sobre la mierda en la que se ha vuelto la élite del CONSOL, algunos proyectos personales y sobre mi partida al vecino del norte. Como vivo en la Roma y él estaba en la Nápoles, opté por irme en transporte público, en lugar de sacar mi automóvil para luego sufrir para encontrar estacionamiento en su oficina y sufrir para encontrar estacionamiento al regresar a casa.

Total que decidí irme en Metrobús, el cual, lo digo con orgullo o pena, da igual, era la primera vez que me trepaba a él. Como no tenía un quinto, fui antes al cajero a sacar un billetito de cien pesos. Entré a la estación Campeche y vi la máquina automática expedidora de tarjetas y de recarga. Leí escuetamente las instrucciones, metí mi billete de cien pesos y me dió la tarjeta. ¿Qué simple, no? Al intentar pasar la tarjeta por la banda magnética, me decía que no tenía crédito. Le pregunté a la policía que estaba en la estación y me dijo: “Uy, joven es que no metió la tarjeta otra vez a la máquina después de que se la dió”. ¿Eh? “A ver, déjeme ver, présteme su tarjeta”. Y fue a meter la tarjeta a la máquina. “No, joven, es que cuando compra una tarjeta nueva, tiene que volver a meter la tarjeta a la máquina para que se recarga”. ¿En qué puto país del mundo eso tiene sentido? Compras tu tarjeta con un billete de 100 pesos. La tarjeta cuesta menos de 20, y el pase cuesta 3.50, ¿pa’ qué vergas hay que meter la tarjeta otra vez a la máquina?

El gobierno del DF me robó mis 100 pesos. “Pos si quiere ir a reclamar, vaya a la otra estación, ahí hay un módulo de quejas”. Donde seguramente lo mandan olímpicamente a uno a chingar a su madre. “Si quiere lo dejo pasar”. Pues ya qué, luego de hacer mi rabieta, me subí a regañadientes al Metrobús. Al puto Metrobús. Un taxi me hubiera cobrado 20 pesos por ir de un lado a otro, y por pendejo, fui tranzado con 100 lanas.

Moraleja: Nunca viajes en transporte público.

Paco Ignacio Taibo II

| | Comments () | TrackBacks (0)
La foto con Paco Ignacio Taibo II Originally uploaded by raquelydavid
Ayer, gracias a la invitación de Julio, tío de Raquel, nos lanzamos al Museo de Antropología, al cual creo que tenía alrededor de una década sin ir, a la presentación del libro El Cuaderno Verde del Che, compilación hecha por el fantástico Paco Ignacio Taibo II. Paco Ignacio es mi escritor favorito. Cualquier persona que le guste ese tipo de narración chilanga, grosera, fina, sencilla, de comer pan con café en una cafetería en Bucareli, la coca cola, el misterio y el suspenso que sólo la Ciudad de México puede dar, debe leerlo. Y no tanto a él, debe leer las aventuras de Belascoarán Shayne, su otro-yo, uno de sus personajes más famosos. PITII es famoso por ser el escritor de la biografía del Che más leída del mundo y por otras muchas obras. Recientemente escribió una biografía de Pancho Villa. Fue muy bonito poder conocerlo luego de haber leído varios de sus libros y sentirme a veces tan identificado con su estilo. El libro presentado, El Cuaderno Verde del Che, es una recopilación de poemas de Neruda, León Felipe, Nicolás Guillén y César Vallejo que acompañaron al Che en su peregrinar por el mundo. Aún cuando no soy muy asiduo a la poesía, sí quiero leer el prólogo de Paco Ignacio y cada uno de los poemas. Fue una experiencia muy bonita poder conocer a tu escritor, quizás, favorito.

Para la gente en Costa Rica, interesada:

World Peace Through Beer

| | Comments () | TrackBacks (0)

La Columna.pl #4

| | Comments () | TrackBacks (0)

Por fin me di algo de tiempo entra tanta cosa para sacar la cuarta columna. La Columna.pl #4 trata sobre WWW::Mechanize, un muy buen módulo disponible en CPAN que nos permite automatizar algunas cosas para web desde nuestras aplicaciones. Léanlo y díganme qué les parece. La columna guía al lector en cómo loguearse automáticamente al wiki de Debian y obtener el valor de una de sus páginas. Disfrútenlo.

Automatización en web con WWW::Mechanize

| | Comments () | TrackBacks (0)

La Columna.pl #4

Automatización en web con WWW::Mechanize

Introducción

WWW::Mechanize

es un módulo muy interesante. Básicamente nos permite automatizar o mecanizar una conversación a través de una página web. Es decir, poder automatizar el procesamiento de enlaces, imágenes, formas, etc. En realidad WWW::Mechanize actúa como una subclase de LWP::UserAgent, que es el mítico LWP en Perl. Hay que entender que todo lo que hacemos en un navegador web, o casi todo, es posible automatizarlo por medio de scripts, debido a que lo que en realidad sucede es que trabajamos con cabeceras y cuerpo HTTP, tanto en petición como en respuesta. Todo es a través del protocolo HTTP. Mi trabajo actual requiere mucha interacción automatizada con páginas web y WWW::Mechanize me ha permitido hacer desarrollos muchos más rápidos, mucho mejor encapsulados y con un nivel de abstracción menor. En esta cuarta columna, quiero hacer algo para mostrar de qué es capaz WWW::Mechanize y que ustedes, amables lectores, vean su utilidad real. Lo que haré será un proceso de autenticación en el wiki del proyecto Debian y la obtención de una de sus páginas. Básicamente es loguearme en el wiki y obtener el valor de uno de los campos de una forma. Lo interesante en este asunto viene al automatizar el login en un sistema basado en web, escribir en una forma y enviar forma, obtener campos, etc: WWW::Mechanize lo hace muy simple. Manos a la obra.

Script

Vamos a empezar por invocar a nuestro intérprete de Perl activando warnings, así como el pragma strict.

 #!/usr/bin/perl -w

 use strict;

Como necesitaremos un nombre de usuario y contraseña para acceder el wiki en Debian (es necesario para editar páginas), vamos a tomarlos como argumentos:

 my $username = $ARGV[0] || die "ERR: Es necesario especificar un nombre de usuario", "\n";

 my $password = $ARGV[1] || die "ERR: Es necesario especificiar una contraseña", "\n";

Los argumentos vienen en el arreglo @ARGV: El primer argumento de nuestro programa será el nombre de usuario y el segundo será la contraseña. Si no existen, entonces nuestro programa morirá. A continuación llamamos al módulo WWW::Mechanize y creamos un objeto de ese tipo.

 use WWW::Mechanize;

 my $mech = WWW::Mechanize->new;

Bastante simple. Ahora tenemos que ver qué es lo que haríamos desde un navegador convencional para hacer lo que queremos. Lo más lógico es que entráramos a la página del wiki de Debian, cuya URL es http://wiki.debian.org/. Vamos a hacerlo de la misma manera en el script.

 $mech->get('http://wiki.debian.org/');

 unless($mech->success) {

  die "Tuvimos problemas al acceder la página de Debian", "\n";

 }

Básicamente estamos utilizando dos métodos disponibles en Mechanize: get() y success(). El primero hará que nuestro objeto viaje hasta la página que le indiquemos. En cualquier caso, el método success() nos indica por medio de un valor booleano si la última operación que se realizó en Mechanize, fue exitosa o algo falló, lo cual nos sirve para tener más control del flujo de nuestra aplicación. Si no tenemos problemas con get(), entonces el programa no morirá con el mensaje especificado; sin embargo si sí hubo problema, es decir, success() regresa falso, entonces entrará en acción el die(). Continuemos. Una vez que estamos en Firefox (u Opera, o Internet Explorer, no sé) en la página http://wiki.debian.org/, ¿qué es lo siguiente? Bueno, lo normal, que es al no estar logueados, nos aparezca un link que dice “Login”. En un proceso común tendríamos que dar clic en él para continuar con el proceso de autenticación. Eso mismo haremos:

 $mech->follow_link(text => 'Login') or die "ERR: No pude dar clic en login", "\n";

Así de simple. Con el método follow_link() y el parámetro ‘text’, podemos indicarle a Mechanize que donde estamos actualmente, que sería la página frontal del wiki, siga el enlace cuyo texto es ‘Login’. Mechanize nos permite incluso acomodar regex en estos campos, lo cual nos facilitaría aún más al lidiar con contenido dinámico o situaciones más complejas. Como follow_link() regresa realmente un objeto HTTP::Response en caso de éxito, también provee un retorno en caso de falla, que es undef. Así que si hubo una falla al intentar seguir el enlace, moriremos con el mensaje de error especificado. Una vez que dimos clic en ‘Login’, podemos ver en nuestro navegador convencional que la página donde nos encontramos es aquella con la URL ‘http://wiki.debian.org/UserPreferences’. En realidad pudimos habernos evitado algo de código al empezar nuestro primer get() con esta URL pero intentaba mostrar un poco de las bondades de Mechanize. ¿Qué tal si en tu script no sabes en qué URL se encuentra tu navegador de Mechanize? Puedes usar el método uri() e incluso el método response(). Eso te ayudará a analizar bien el flujo de tu programa. En fin, en esa página de UserPreferences podemos ver que tenemos una forma para introducir “Name”, “Password”, etc. En realidad esos dos campos son los que realmente nos interesan. Para ésto, nos puede servir mucho la extensión WebDeveloper de Firefox, pues con ella podemos ver la información detallada de las formas en las páginas. Lo que queremos saber es cuál es nombre de la forma para ingresar el nombre de usuario y la contraseña, y además, el nombre de estos dos campos (hay que recordar que comúnmente las formas en HTML llevan un parámetro “name”). O incluso puedes intentar buscar estos parámetros viendo el código HTML directo desde la página. Luego de ver el HTML (o de usar la extensión de Firefox) nos damos cuenta que en la página de autenticación de Debian hay tres formas, sin embargo, la forma donde se introducen el nombre de usuario y la contraseña, ¡no tiene nombre! Mechanize sabe que algunos webmasters no colocan esta información, así que provee otra forma en que puedes usar esas formas: Por número. Puedes especificar si trabajarás con la primera, segunda, tercera o enésima forma. En nuestro ejemplo, la forma de autenticación es la tercera:

 eval {

  $mech->form(3);

  $mech->submit_form('username' => $username, 'password' => $password);

 };
 die "ERR: Problemas al enviar la forma: $@", "\n" if $@;

Un bonito pedazo de código aquí. Lo primero que notamos es que usamos un bloque eval{} para encapsular dos métodos, form() y submit_form(). form() selecciona la forma con la que trabajaremos, en este caso la tercera y submit_form() envía esa forma con los campos indicados. Es bastante intuitivo, ¿no crees? Y ya, básicamente eso es lo único que necesitamos para autenticarnos. En caso de falla con submit_form(), la aplicación muere, sin embargo, eso lo intentamos evitar usando eval{}. Si algo dentro del bloque de eval fallara y muriera, eval{} llena una variable especial, $@ con el mensaje de error y ya después nosotros podemos morir o hacer lo que queramos. Bonito, ¿no es así? Una vez que mandamos la forma, tenemos que asegurarnos que no nos haya mandado mensaje de password erróneo o algo así. Una cosa es que el envío de la forma con sus parámetros sea exitoso o no, y otra diferente que la información de usuario y contraseña sean incorrectos. ¿Cómo saber lo que necesitamos para identificar ésto? Podemos intentar en nuestro Firefox poniendo información errónea en estos campos e intentar loguearse. Al hacer pruebas de este tipo veo que es diferente si el usuario no existe o si la contraseña es errónea. Si el usuario no existe, la página nos manda un error que dice: “Unknown user name: ”sdfsdfsdf“. Please enter user name and password.”. Si la contraseña está mal (o sea, el usuario existe, pero la contraseña es errónea), la página despliega: “Sorry, wrong password.”. Vamos a ver cómo controlaríamos dichos mensajes:

 die "Unknown user name!", "\n" if $mech->content =~ /Unknown user name/;

 die "Wrong password!", "\n" if $mech->content =~ /Sorry, wrong password/;

¡Qué sencillo! Morimos en caso de que el método content(), que nos regresa la cadena con todo el HTML de la página actual, contiene alguna de ambas cadenas. Código simple para regexs simples. Si no tenemos ninguno de ambos, asumimos que estaremos ya bien logueados. Ahora, ¿qué es lo que queremos hacer? Digamos que queremos obtener lo que nuestra propia página tiene escrito. Las páginas de los usuarios son simples páginas del wiki con nuestro nombre de usuario, en mi caso, “http://wiki.debian.org/DavidMorenoGarza”, o lo que es lo mismo “http://wiki.debian.org/$username”:

 $mech->get("http://wiki.debian.org/$username");

Estando en dicha página hay en enlace que dice “Edit”, ese es en el que tendríamos que dar clic para entrar a la forma directa de nuestra página:

 $mech->follow_link(text => 'Edit');

Y una vez en la página de edición, nos encontramos con una forma nuevamente, que es básicamente la caja de edición de la página. Al leer el HTML o usando WebDeveloper, nos encontramos con que la forma sí tiene nombre y la caja con el texto de la página se encuentra en un campo llamado “editor-textarea”. Pues vamos a obtener ese texto:

 $mech->form_name('editor');

 my $pagetext = $mech->value("editor-textarea");

Con eso seleccionamos la forma cuyo nombre es “editor” y con value(), seleccionamos el valor de “editor-textarea” y lo guardamos en la variable $pagetext. ¿Qué más podemos hacer? Lo que queramos, quizás queremos usar ese valor y escribirlo en un archivo, modificarlo y volverlo a guardar, obtener el preview luego de modificarlo, etc, etc. En realidad desde aquí la imaginación es el límite.

Fin

Una regla de oro que he aprendido luego de usar mucho WWW::Mechanize es que casi todo lo que puedas hacer en un navegador convencional, lo puedes hacer también con este módulo. No, no puedes interpretar JavaScript, pero muchas veces no lo necesitas si saber leer bien el HTML de una página y entiendes lo que estás realmente haciendo. A final de cuentas si entiendes perfectamente lo que pasa en una conversación por HTTP quizás ni siquiera necesites Mechanize, pues como un amigo me comentaba, Mechanize es simplemente una rompecabezas armado de muchos módulos alrededor de LWP. Hazme llegar tus preguntas o comentarios a mi correo, damog@espiral.org.mx. Estaré encantado de saber qué usos le das a Mechanize.

Referencias Útiles

Autor

Durante el día, David Moreno Garza (http://www.damog.net/) desarrolla aplicaciones, sistemas y proyectos para una incipiente empresa norteamericana;; adicionalmente es consultor independiente en empresas mexicanas y extranjeras utilizando Perl. Durante la noche intenta salvar al mundo del mal usando expresiones regulares y netiquette.

Licencia de uso

Copyright © 2007 David Moreno Garza. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/).


Sobre La Columna.pl

La Columna.pl

es una columna quincenal que escribe el autor alrededor de Perl. Está inspirada en las columnas que Randal L. Schwartz ha escrito desde hace varios años. Por medio de recetas, consejos, instructivos y guías, el autor pretende propiciar interés en la gente para que conozca un poco más a fondo este apasionante lenguaje de programación y así fomentar una comunidad más sólida alrededor de él. Visite http://www.damog.net/la-columnapl.

Moving to NYC

| | Comments () | TrackBacks (0)

So, we will be moving to New York City, starting next week. We hope to spend a year there, but who knows, we might be there for only a few months, weeks, or more than a year! Life changes, that’s why we are moving now, right? :) Only constant is change, isn’t it?

Anyway, we are pretty excited about this. This has been something we have been expecting since May/June and we are finally ready to go, we’ll see how it goes, hopefully good. School from my side will have to get stalled, again. I’ll be able to study there, but don’t know for sure now, we are trying to settle first, and then see possibilities.

So, if you know/have contact with, a good place in Manhattan, Brooklyn or perhaps Queens, please let me know, that’d be highly appreciated.

Bummer, yet another two Mexicans in the States :-D

UPDATE: Of course, I’m looking for a good place to live (apartment in rent, or similar). Everything else has already been covered. :)