Archive for 2007
Tip Perl del día: chr y oct en un loop map
La función map de Perl es muy poderosa. O como diría entre cuates, mucho muy poderosa. Básicamente lo que hace es evaluar en un bloque, cada uno de los elementos de una lista.
El día de hoy, en uno de los blogs que mi chava y yo (y otra bola de nacos por ahí de quienes estamos al pendiente) solemos visitar a menudo (porque es muy pendejo y nos gusta reírnos de vez en cuando), la escritora publicó un post con cadenas en binario (típico entre personas que quieren parecer interesantes usando truquitos que siempre han existido). Como buen chismoso que soy, me di a la tarea de descifrar aquella maraña, pues suponía era un mensaje oculto. Como el resultado de dicha cadena es irrelevante aquí, crearé otra diferente que servirá para ejemplificar el tip del día.
my $string = "10100001 01001000 01101111 01101100 01100001 00101100 00100000 01110011 01101111 01111001 00100000 01110101 01101110 00100000 01101101 01100101 01101110 01110011 01100001 01101010 01100101 00100000 01101111 01100011 01110101 01101100 01110100 01101111 00100000 01100101 01101110 00100000 01100011 01100101 01110010 01101111 01110011 00100000 01111001 00100000 01110101 01101110 01101111 01110011 00100001";
Ahora, con un poco de magia de map, podríamos iterar en cada uno de esos octales. Nos ayudaremos de split, para que haga la chamba:
map {
print chr oct '0b'.$_;
} split /\s/, $string;
A map, le pasamos un arreglo. ¿Qué arreglo? El producido por split, que nos devuelve uno, precisamente, a partir de la cadena $string y el delimitador para separar cada uno de los elementos es /\s/, whitespace. Ya obtenido el arreglo, es pasado a map que toma cada uno de los elementos, les agrega el prefijo '0b', para que Perl entienda que la cadena pasada es en realidad un dato binario. Luego oct toma esa cadena y la interpreta como una cadena octal y le pasa a chr el valor correspondiente. Éste último toma ese valor, representado por el número obtenido por oct y lo traduce a su caracter correspondiente en ASCII o Unicode. Ese valor, finalmente, se lo pasa a print que lo imprime en pantalla, desde luego
Le queda de tarea al lector descifrar lo que $string contenía.
Próximo tip, relacionado con map: Divirtiéndonos con grep.
Tip Perl del día: 0E0
Empezaré escribiendo algunos tipcitos que me voy encontrando a mi paso al cabalgar sobre el felpudo lomo del dromedario de Perl durante mi camino por la vida. Las Columnas.pl, tips y otras cosas perlosas podrán revisarse en la categoría 'perl' de este blog.
Estoy trabajando con algunos contadores. Tengo que agregar un nuevo contador por hora e ir sumando el contador principal durante la hora actual, sin mucho problema, ¿no? Sin embargo, si la hora actual no existe en la base de datos, tengo que crear un nuevo registro. Debido a mi pésima capacidad bajo cualquier cosa que contenga las siglas SQL, tuve que platicar con alguien más para que diera una idea simple y clara de qué hacer.
Intento sumar el contador dada la hora actual, pero si no afectó a ninguna fila, entonces creo la fila. Ese concepto es mucho mejor que hacer un count(*) primero, validar si existe la fila, crearla si no, actualizarla si sí. Para verificar si mi primer query (el "UPDATE") afectó a alguna columna, podemos usar el método do() que provee DBI y que hereda tu DBD favorito, en mi caso, pues no tengo otra alternativa y a final de cuentas me termina valiendo un pepino por el momento, uso DBD::mysql.
do() regresa, en contexto escalar, el número de filas afectadas por el query que se le haya pasado. Sin embargo, y aquí viene lo interesante y el tip del día, utiliza un valor llamado "0E0", una cadena. Si fueron afectadas, digamos, 3 filas por el query, do() regresará ese número, pero si no fue afectada ninguna fila, es decir, cero filas, regresa el valor "0E0", que es básicamente "cero, pero cierto".
Como bien se sabe (y si no sabes, deberías saber), valores como cadenas vacías o ceros, se evalúan como falsas en las operaciones binarias en Perl. Sin embargo, "0E0" se traduce a cero, pero con un valor verdadero, lo cual es muy útil para muchos otros casos en los que obtener un cero podamos usar como valor verdadero.
En mi ejemplo, usé:
my $aff_rows = $sth->do($query);
if($arr_rows == 0) { # Este bloque se ejecuta }
Que es diferente a usar:
my $aff_rows = $sth->do($query);
if(!$arr_rows){ # Este bloque no }
El if evalúa si el valor de $arr_rows es cero, que en muchos casos sería validar si es cierto o falso, pero como $aff_rows es en realidad "cero pero cierto", entonces la condición resulta verdadera. En el segundo if, se valida si el valor de $arr_rows no es verdadero, que en casos comunes sería lo mismo que el primer if, pero la validación resulta falsa y no se ejecuta el bloque. Chido, ¿no?
Amiguito…
Spectacularly beautiful woman seeking non-douchebag man
So this is New York. Or not.
New York, NY

New York, NY
Originally uploaded by Richard-
Ahí vivimos. La parte predominante de la izquierda es Manhattan. En el centro se ve un gran rectángulo, eso es Central Park. Para arriba de Central Park se ve un río en diagonal, es el Río Harlem. Vivimos cerca de él, en la 8va Avenida y la 154th. El pedazo de tierra que se ve pegado en el borde izquierdo es una parte de New Jersey.
Hermosísima foto. Aparecen cuatro boroughs de Nueva York: Manhattan, el Bronx, Queens y Brooklyn. Sólo falta Staten Island.
Hermosa foto. En Manhattan se ven dos grandes zonas con rascacielos, los de abajo son del Financial District, los del centro, son la parte medular comercial de Manhattan alrededor de Times Square, Broadway y muchas otras calles famosas.
Dirty Mind

Béisbol
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

Shamelessly stolen from Metroblogging NYC.
Like mommy…

RockBox / NYC PM / Long walk / Pics
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.




