lunes, 18 de agosto de 2008

Receta milenaria para preparar lupines.

El simpático nombre que elegí para este blog hace que mucha gente inocente se encuentre con código Python cuando en realidad está buscando cómo hacer los lupines como los hacía la abuela.
Para orientar a estos internautas, les traigo su pedido al pie de la letra.

A continuación, mi abuela Titina les explica como preparar lupines (para acompañar con cerveza, como este blog recomienda)



Paso 1: Poner los porotos lupines en una olla con agua y abundante sal gruesa (un pocillito de café, como muestra la foto), y dejarlos remojar por una noche.


(la censura era solo para probar el efecto. Muy profesional, jeje)


Paso 2: Poner a hervir y dejar a fuego lento por 2 horas.



Paso 3: Esperar a que enfríe, retirar el agua removiéndolos para que se se limpien y agregar nuevamente agua con sal. Esto ya puede hacerse en el envase que se quiera utilizar para almacenarlos en la heladera.


Paso 4: Poner el envase en la heladera, y 2 veces al día renovar el agua y la sal, durante 3 días.


Luego ya se los puede consumir. Se los puede ir probando para ver si están en el punto justo, y no están amargos.
Si no se los consume, se deben guardar en la heladera y cambiar el agua con sal una vez al día.


Si tienen dudas o quieren comentar cómo les fue, escriban un comentario. Titina lee y agradece todos los mensajes.

sábado, 16 de agosto de 2008

tuvo o tubo

El desfotologueador fue un buen intento por tratar de salvar a nuestro castellano, pero no está dando resultado. Los servicios de mensajería instantánea nos exigen comunicarnos mediante texto a la misma velocidad a la que lo haríamos hablando y esto lleva a que no pensemos cómo se escribe lo que queremos decir. En estos casos muchas palabras se suelen escribir "como suena", la 'h' no importa, 'b', o 'v', da lo mismo, etc.

Para intentar cambiar esto, les voy a pasar una regla nemotécnica que me enseñó mi vieja de chiquito y nunca falló.
Me dijo:
Hijo, cuando dudes entre escribir tuvo o tubo, piensa:
Las tuberías, cañerías, etc. son por lo general conductos largos, que sirven para transportar algo desde un lugar a otro, ubicados en sitios geográficamente distantes.
Piensa por ejemplo en las distancias que debe recorrer tu caca para salir del núcleo urbano donde fue concebida.
Ergo, cuando se trate de un tubo como objeto, referido a una cañería por ejemplo, es "b" larga, larga como la cañería, idiota.
En el resto de los casos, es con "v" corta. Y así como se conjuga tuvo, del verbo tener, también es como se escriben los verbos que se conjungan de la misma manera, como obtener, estar, etc. Es obtuvo, y no obtubo, estuvo y no estubo.
También se lo ve mal escrito en conjugaciones donde ni siquiera puede confundirse con el tubo de la cañería. Como estube, en lugar de estuve. Esto puede deberse a la existencia de Youtube, pero en ese caso de nuevo, piensa que está hablando de un tubo. El tubo de rayos catódicos que tiene el tele. O sea que quiere decir "Tu tubo" (de rayos catódicos) o "Tu tele".

Pensarán que mi vieja era visionaria, pero se refería al service de TV y cassetteras llamado Youtube que estaba a la vuelta de mi casa y que ahora está iniciando un juicio millonario contra el popular sitio de internet.

En resumen:
'b', para "tubo" ('b' larga, caño largo)
para el resto, 'v'

Espero que os haya iluminado.
Gracias, vuelvas prontos.

miércoles, 6 de agosto de 2008

Referencias a caracteres en XML de vuelta a unicode

Los caracteres que no son son representables en algún encoding pueden representarse con su codificación en XML. Si c es un caracter, la expresión Python para generar esta representación es:
"&#%d;" % ord(c)

Cuando codificamos un texto, podemos especificar qué hacer con los caracteres que no se pueden representar en el encoding usado. Con el argumento 'ignore', simplemente no se incluyen, con 'replace' son reemplazados por un '?' y usando 'xmlcharrefreplace' obtenemos la mencionada codificación. Por ejemplo:
codificado = texto.encode(encoding, "xmlcharrefreplace")

Para recuperar la cadena original, no encontré nada haciendo una simple búsqueda, así que lo solucioné de la siguiente manera, usando una expresión regular y asumiendo que la cadena puede ser representada en el encoding por defecto (en mi caso UTF-8).

La expresión regular simplemente matchea con la forma de la representación XML, el objeto match es pasado una función que toma la parte que corresponde al número, la convierte a entero y devuelve el resultado de aplicarle unichr a ese valor. La función unichr devuelve el caracter unicode correspondiente a un número.
def unicodechar(match):
return(unichr(int(match.group(1))))

def replace_xmlrefs(string):
return re.sub("&#(\d+);",unicodechar,string)


Nada complejo, y se lo puede ver en funcionamiento:

>>> encoded = "財団 基金会"
>>> import re
>>> replace_xmlrefs(encoded)
u'\u8ca1\u56e3 \u57fa\u91d1\u4f1a'
>>> print replace_xmlrefs(encoded)
財団 基金会

La última línea, donde se imprimen los caracteres representados puede fallar si la consola no soporta esos caracteres, o no estamos usando un encoding que cubra todo unicode. Lo recomendable es usar UTF8.
Se puede iniciar el intérprete python especificando que use otro locale (vemos los disponibles con locale -a).
Por ejemplo:
LC_ALL=es_AR.utf8 python


Obviamente siempre hay gente que hace mejor las cosas, y acá encontré una forma de hacer esto que considera también los casos en que la referencia tiene un número hexadecimal.

Update 15-08-2008:
Este snippet también reemplaza las entidades HTML.