domingo, 5 de octubre de 2008

Domando monos salvajes usando source control

Es pleno siglo XXI y todos estamos de acuerdo que el control de versiones es una práctica fundamental para el desarrollo de software, verdad?

"Sí" dicen algunos por reflejo pavloviano, "pero en este proyecto no es necesario porque..."

"...no hay tiempo."
"...tenemos que aprender cómo se usa."
"...porque es un relajo darle acceso a cada quién."
"...alguna vez la usamos, pero ya no."
"...no tenemos red."
"...daría lo mismo." (esta es genial)
"...porque NO." (esta es la más razonable)

Y así ad infinitum.

Estos días me ha tocado estar de consultor de sistemas en varios proyectos en varios tipos de empresas (bancos asquerosamente grandes y empresitas donde el papá es el gerente y la mamá la "directora de operaciones") y encuentro sumamente alarmante que managers y ciertas especies de developers hagan todo tipo de racionalizaciones pintorescas para no usar ni siquiera SourceSafe.

Y ni hablemos de cómo retuercen las caras con CVS o SubVersion.

Pero lo más hermoso es cómo brincan como monos cuando pierden los cambios, pierden los fuentes, arruinan los únicos originales, no pueden compilar por conflictos de versiones o mejor aún, se hacen un relajo pantagruélico para integrar los cambios de varios developers a un mismo fuente.

Lo que sí no es muy hermoso es cuando te hacen brincar a vos como mono por algo perfectamente evitable.

Por qué nos hacemos esto a nosotros mismos? Por qué chingamos así a nuestros semejantes?

Sencillo: No nos gusta seguir el principio de "invertir 10 hoy para ahorrar 50 mañana."

Y sufrimos. A lo grande.

Lo queremos todo ya y vivimos apresurados no porque no haya tiempo, sino porque no sabemos administrarlo.

Eso me recuerda aquel día en que ya casi le vendía la idea a un manager de que usáramos SourceSafe...

* * *

Batfink: "Será que después de almuerzo me podrías pasar los cambios para que los subamos al SourceSafe?"

Manager: "Subámoslos de una vez, lo malo es que no me acuerdo donde están."

*relajo general para buscar en su laptop con Windows Vista los últimos archivos modificados*

*al fin los encuentra*

Manager: "Cómo los subo?"

Batfink: "Abrís el proyecto, te conectás a la db de SourceSafe, después hacés el checkout y..."

Manager: "Y no se puede hacer más rápido?"

Batfink: "Si querés los subo yo."

Manager: "No, yo los quiero subir pero sin tanta cosa. No puedo borrar el proyecto en el SourceSafe y volverlo a subir todo otra vez?"

Batfink: "Pues... sí, pero la idea del SourceSafe es ir guardando las modificaciones que vas haciendo en los archiv..."

Manager: "Aquí sólo le doy delete."

*le da delete y borra todo el proyecto de 350 megas*

*SourceSafe se bloquea mientras borra*

Batfink: "Ignoro cuantos archivos había ahí."

Manager: "Parece que había bastantes... Hijuela! Yo me tengo que ir a una reunión!"

Batfink: *disimulando el encabronamiento* "Si querés déjame los archivos y yo los subo."

*no era eso lo que había dicho al principio?*

Manager: "Te los voy a dejar en el desktop de esta máquina."

Vuelvo de almuerzo, los archivos no están en ningún desktop y el proyecto que contenía los programas con los que debía trabajar esta tarde/noche están en el éter de la opción "destroy permanently" del SourceSafe. Y del manager, ni señas.

Brinco como mono.

Backups? Ese es tema de otro post.

sábado, 12 de julio de 2008

La evolución del programador

Este chiste ya tiene algo de tiempo de estar circulando por la internet y sin embargo no ha dejado de ser verdad…

Enjoy…

* * *

En bachillerato

  10 PRINT "HELLO WORLD"
20 END


Primeros años en la Universidad

  program Hello(input, output)
begin
writeln('Hello World')
end.


Con pensum cerrado en la Universidad

  (defun hello
(print
(cons 'Hello (list 'World))))


Nuevo profesional

  #include <stdio.h>
void main(void)
{
char *message[] = {"Hello ", "World"};
int i;

for(i = 0; i < 2; ++i)
printf("%s", message[i]);
printf("\n");
}


Profesional veterano

  #include <iostream.h>
#include <string.h>

class string
{
private:
int size;
char *ptr;

string() : size(0), ptr(new char[1]) { ptr[0] = 0; }

string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}

~string()
{
delete [] ptr;
}

friend ostream &operator <<(ostream &, const string &);
string &operator=(const char *);
};

ostream &operator<<(ostream &stream, const string &s)
{
return(stream << s.ptr);
}

string &string::operator=(const char *chrs)
{
if (this != &chrs)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chrs);
}
return(*this);
}

int main()
{
string str;

str = "Hello World";
cout << str << endl;

return(0);
}


Programador Master

  [
uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
]
library LHello
{
// llamar la librería maestra
importlib("actimp.tlb");
importlib("actexp.tlb");

// llamar mis interfaces
#include "pshlo.idl"

[
uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
]
cotype THello
{
interface IHello;
interface IPersistFile;
};
};

[
exe,
uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
]
module CHelloLib
{

// algunos headers que se necesitan
importheader(<windows.h>);
importheader(<ole2.h>);
importheader(<except.hxx>);
importheader("pshlo.h");
importheader("shlo.hxx");
importheader("mycls.hxx");

// typelibs que se necesitan
importlib("actimp.tlb");
importlib("actexp.tlb");
importlib("thlo.tlb");

[
uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
aggregatable
]
coclass CHello
{
cotype THello;
};
};


#include "ipfix.hxx"

extern HANDLE hEvent;

class CHello : public CHelloBase
{
public:
IPFIX(CLSID_CHello);

CHello(IUnknown *pUnk);
~CHello();

HRESULT __stdcall PrintSz(LPWSTR pwszString);

private:
static int cObjRef;
};


#include <windows.h>
#include <ole2.h>
#include <stdio.h>
#include <stdlib.h>
#include "thlo.h"
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"

int CHello::cObjRef = 0;

CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
{
cObjRef++;
return;
}

HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
{
printf("%ws
", pwszString);
return(ResultFromScode(S_OK));
}


CHello::~CHello(void)
{

// cuando la cuenta de los objetos sea cero, detener el servidor
cObjRef--;
if( cObjRef == 0 )
PulseEvent(hEvent);

return;
}

#include <windows.h>
#include <ole2.h>
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"

HANDLE hEvent;

int _cdecl main(
int argc,
char * argv[]
) {
ULONG ulRef;
DWORD dwRegistration;
CHelloCF *pCF = new CHelloCF();

hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// Inicializar las librerias OLE
CoInitializeEx(NULL, COINIT_MULTITHREADED);

CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE, &dwRegistration);

// esperar un evento para parar
WaitForSingleObject(hEvent, INFINITE);

// revocar y liberar el objeto
CoRevokeClassObject(dwRegistration);
ulRef = pCF->Release();

// decirle a OLE que ya terminamos
CoUninitialize();

return(0); }

extern CLSID CLSID_CHello;
extern UUID LIBID_CHelloLib;

CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
0x2573F891,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
0x2573F890,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

#include <windows.h>
#include <ole2.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "pshlo.h"
#include "shlo.hxx"
#include "clsid.h"

int _cdecl main(
int argc,
char * argv[]
) {
HRESULT hRslt;
IHello *pHello;
ULONG ulCnt;
IMoniker * pmk;
WCHAR wcsT[_MAX_PATH];
WCHAR wcsPath[2 * _MAX_PATH];

// obtiene la ruta del objeto
wcsPath[0] = '\0';
wcsT[0] = '\0';
if( argc > 1) {
mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
wcsupr(wcsPath);
}
else {
fprintf(stderr, "Debe especificar el path del objeto\n");
return(1);
}

// obtener cadena de impresión
if(argc > 2)
mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
else
wcscpy(wcsT, L"Hello World");

printf("Enlazando con el objeto %ws\n", wcsPath);
printf("Cadena de texto %ws\n", wcsT);

// Inicializar las librerias OLE
hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

if(SUCCEEDED(hRslt)) {


hRslt = CreateFileMoniker(wcsPath, &pmk);
if(SUCCEEDED(hRslt))
hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

if(SUCCEEDED(hRslt)) {

// imprimir una cadena
pHello->PrintSz(wcsT);

Sleep(2000);
ulCnt = pHello->Release();
}
else
printf("Error al conectar, estado: %lx", hRslt);

// Decirle a OLE que ya terminamos
CoUninitialize();
}

return(0);
}


Aprendíz de Hacker

  #!/usr/local/bin/perl
$msg="Hello, world.\n";
if ($#ARGV >= 0) {
while(defined($arg=shift(@ARGV))) {
$outfilename = $arg;
open(FILE, ">" . $outfilename) || die "No se puede escribir $arg: $!\n";
print (FILE $msg);
close(FILE) || die "No se puede cerrar $arg: $!\n";
}
} else {
print ($msg);
}
1;


Hacker experimentado

  #include <stdio.h>
#define S "Hello, World\n"
main(){exit(printf(S) == strlen(S) ? 0 : 1);}


Hacker veterano

  % cc -o a.out ~/src/misc/hw/hw.c
% a.out


Hacker Gurú

  % echo "Hello, world."


* * *

Nuevo gerente

  10 PRINT "HELLO WORLD"
20 END


Gerente de rango medio

  mail -s "Hello, world." beto@compañia.com
Beto, podrías por favor escribirme un programa que imprima "Hello, world."?
Lo necesito para mañana.
^D


Gerente Senior

  % zmail beto
Necesito un programa "Hello, world." para hoy en la tarde.


CIO

  % letter
letter: Command not found.
% mail
To: ^X ^F ^C
% help mail
help: Command not found.
% mierda!
!: Event unrecognized
% logout

(Por el intercomunicador:)

Rocío! Dígale a Beto que necesito un programa "Hello world" y que lo necesito para ayer!!

lunes, 14 de abril de 2008

Bill Gates, ya no seré tu amante

Las 4 P.M. La puerta del café estaba frente a mí. La crucé y dejé atrás la tarde lluviosa. Todavía cerrando mi paraguas, me interné en el tibio ambiente del café en busca de Bill. A esas horas él debería estar por ahí.

Lo encontré sentado en la mesa junto al enorme ventanal, picando furiosamente su pocket pc y maldiciendo en voz baja.

- "...colgado otra vez!! Maldito pedazo de porqueri-..."

Bill se cortó cuando notó que yo estaba cerca. Levantó la vista, me sonrió, me examinó de arriba abajo a través de sus no muy delgados lentes y con la expresión de alguien que acaba de hacer otro millón de dólares en los últimos 15 segundos me dijo:

- "Hola... te estaba esperando."

- "Hola... Bill" le dije secamente, mientras jalaba la silla y me sentaba frente a él.

- "Por qué tan lejos? Ven aquí..." me dijo en tono recriminatorio, "por qué estás tan arisco?"

- "Bill, tú y yo tenemos que hablar."

Bill levantó la mirada al techo y después de un suspiro que parecía un estirón dijo:

- "Sí, sí, sí... ya sé: me vas a reclamar que Windows Vista se tarda mucho, que se queda colgado, que arruinó tu data, que no puede ejecutar tus tristes programitas... no? Yo ya te dije que hasta que no compres una computadora con un performance decente no vas a sentir el wow. Y no me vengas con que esas computadoras son carísimas. El hecho de que sean más caras que tu carro quiere decir que TU carro es un pedazo de lata con ruedas. Lo siento."

Bill se cruzó de brazos y se puso a ver la ventana con aire de ofendido. En ese momento llegó una camarera portando una bandeja y anunciando su contenido:

-"Aquí le traigo su té helado y su pastel de manzana don Bill, y para usted" dijo dirigiéndose a mí, "el sandwich de oreja de vaca con aceitunas, alcaparras y moras y el café negro con canela, chile cobanero y pimienta". A continuación, derramó el té, botó el pastel, desarmó el sandwich y dejó caer estrepitosamente la taza de café. Luego se alejó como si nada.

- "Te pedí tu sandwich favorito. Espero que lo disfrutes" dijo Bill secando con servilletas el reguero de té y aún indignado conmigo.

Contemplé el sandwich. Mi favorito?

- "Ves Bill, tantos años juntos y todavía no sabes mis preferencias en cuanto a sandwiches. No me conoces... nunca me has conocido de verdad."

- "Claro que sí" protestó, "sé que eso te gusta! de otra manera no me habría salido en mi SQL Server... pero ya no peleemos más, mejor dime cómo te pareció el service pack de Vista."

- "No lo he instalado" le contesté fríamente.

- "Pero sí has instalado Vista... verdad?" dijo dudoso, mientras sacaba su pocket pc y se disponía a encenderla para consultar el dato.

- "Apaga eso. No he instalado Vista tampoco. Y no lo voy a instalar."

- "Si claro,” dijo Bill en tono sarcástico, “ahora resulta que te vas a quedar con XP hasta que ya no le demos soporte. Por el resto de qué? seis meses? un año? Hahaha!!"

Yo seguí inmutable. Bill cambió de pronto y su risa se volvió silenció. Con gravedad añadió:

- "No pensarás instalar... algo... Apple... o sí?"

- "Apple? No. Apple no. Caería en lo mismo, o tal vez peor."

Bill puso las manos sobre la mesa, se inclinó hacía adelante, apretó los dientes y susurro:

- "No habrás instalado..."

- "Sí Bill. Eso he venido a decirte. Ahora estoy con el pingüino."

- “Como pudiste...?” chilló Bill, “Después de tantos años... Cómo??!!! Desgraciado... Malhombre...!!”

- “Lo siento Bill, pero ya no seré tu amante.”

- “Por qué? Qué tiene ese que no tenga yo? Qué te ha dado ese pingüino que no te haya dado yo?? Qué? QUÉ???”

- “Es que tú eres muy posesivo, Bill. Siempre me has tenido encerrado en tu mundo. Tu mundo está vacío, y tu no entiendes nada del mío.”

- “No cites a Luis Enrique. Sabes que odio la salsa.”

- “Pero es cierto. Siempre todo tiene que girar alrededor tuyo. Decides cambiar de tecnologías cuando se te da la gana y uno tiene que actualizarse como pueda. Me limitas con tus licencias, pones DRM en mis mp3, te metes a mi máquina y me acosas... No Bill. Te aprovechas de mí y no puedo permitir eso.”

- “Pero serás amante del pingüino... eres un shuco!!!” dijo Bill mientras clavaba el tenedor en su pastel.

- “No te metas con el pingüino, porque él sí sabe cómo satisfacerme.”

- “Pero acaso te has olvidado... de todas aquellas noches...”

- “No... Bill. No caeré otra vez...”

Pero Bill siguió:

“... aquellas noches que pasaste con Windows 3.1... y todas las horas en que pedías más y MÁS Windows 95... o Visual Basic? Dime... ya te olvidaste de todas aquellas noches y madrugadas locas llenas de placer y éxtasis? ... de todos aquellos orgasmos!!!”

Una viejita que estaba en la mesa de al lado exclamó "Padre celestial!" y empezó a toser incontrolablemente. Bill se volvió hacía ella.

- “Qué? Acaso nunca ha programado?”

La viejita negó con la cabeza .

- “No sabe los placeres carnales que se pierde!”

A la viejita le dio el patatus y llegaron varios meseros a levantarla.

- “Suficiente, Bill.” dije mientras me levantaba de la mesa, “No permitiré que me hagas otra de tus escenitas.”

- “No, espera... no te vayas...”

- “Lo siento Bill, este es nuestro adiós.” Me di la vuelta y me encaminé hacía la puerta.

- “Espera, espera...” Bill se levantó presuroso y tomó mi mano entre las suyas.

- "Sin mariconadas pues..."

Me soltó ruborizado y dijo con mirada suplicante:

- "Por lo menos, dime una cosa, antes de partir."

Me detuve. Aquello era el adiós. Y en este momento final nos diríamos las frases memorables que resumirían nuestra relación. Revelaríamos la esencia de lo que fue lo nuestro.

- "Qué cosa?"

- "No vas a pagar por el sandwich que te pedí??"

- "Eres un hijo de puta, Bill."

miércoles, 9 de abril de 2008

Hermano Conejo cae en el pozo



(Contado por S. E. Schlosser)

Un día, Hermano Conejo, Hermano Zorro, Hermano Mapache y Hermano Oso y otro montón de animales, decidieron trabajar juntos y plantar un jardín lleno de maíz para tostar. Empezaron temprano en la mañana y rastrillaron y cavaron y rastrillaron otro poco más, rompiendo la dura tierra y alistándola para sembrar. Era un día caliente y Hermano Conejo se cansó pronto. Pero él siguió sacudiendo el rastrillo y limpiando los escombros porque no quería que nadie dijera que era un haragán.

Hermano Conejo tuvo una idea. “Ow!” gritó tan fuerte como pudo. “Me clavé una espina en la mano!”. Sacudió una pata y se la metió en la boca. Los otros animales le dijeron que mejor se fuera a sacar la espina y se lavara la mano antes de que se infectara. Eso era justo lo que Hermano Conejo quería escuchar. Se fue apresurado a buscar un lugar con sombra para tomar una siesta. Un poco más allá en el camino, encontró un pozo viejo con un par de cubetas colgando dentro, una hasta arriba y la otra hasta el fondo.

“Este parece un buen lugar para tomar una siesta”, dijo Hermano Conejo y brincó dentro de la cubeta.

Pues bien, Hermano Conejo era bastante pesado, más pesado que la cubeta llena de agua que yacía en el fondo. Cuando saltó dentro de la cubeta vacía, esta se precipitó hasta el fondo del pozo. Hermano Conejo se aferró al borde desesperadamente mientras la segunda cubeta pasaba zumbando, derramando agua sobre él en su camino hacía arriba. Él nunca había estado tan asustado en toda su vida

La cubeta de Hermano Conejo aterrizó con un golpe en el agua y se agitaba de arriba abajo. Hermano Conejo temía moverse, que la cubeta se volteara y que él cayera al agua. Se quedó quieto en el fondo de la cubeta y se sacudía y temblaba de miedo, preguntándose qué iría a pasar.

Ahora bien, Hermano Zorro había estado observando a Hermano Conejo toda la mañana. Él supo inmediatamente que Hermano Conejo no tenía una espina en la pata y se preguntaba en qué andaría ese pícaro. Cuando Hermano Conejo se marchó, Hermano Zorro lo siguió y lo vio saltar dentro de la cubeta y desaparecer dentro del pozo.

Hermano Zorro estaba intrigado. Por qué Hermano Conejo se metió al pozo? Entonces pensó: “Seguro que tiene dinero escondido allá abajo y fue a ver cómo está”. Hermano Zorro se acercó sigilosamente al pozo, levantando sus orejas para oír mejor. No escuchó nada. Dio una ojeada dentro del pozo, pero todo estaba oscuro y quieto, dado que Hermano Conejo estaba completamente petrificado para que la cubeta no lo botara al agua.

Finalmente, Hermano Zorro gritó dentro del pozo: “Hermano Conejo, qué estás haciendo allá abajo?”

Hermano Conejo se animó de pronto, dándose cuenta que esta podría ser su oportunidad para salir del pozo.

“Estoy pescando aquí abajo, Hermano Zorro” dijo. “Pensé que sorprendería a todos con un montón de pescado fresco para el almuerzo. Hay buenos pescados aquí abajo”

“Cuántos peces hay?” preguntó Hermano Zorro escépticamente, seguro de que el pícaro conejo estaba realmente contando su oro.

“Docenas y docenas!” lloró Hermano Conejo. “Por qué no vienes aquí abajo y me ayudas a sacarlos?”

Esa era la invitación que Hermano Zorro estaba esperando. Él iba a bajar dentro de ese pozo e iba a embolsarse el oro de Hermano Conejo.

“Cómo bajo hasta ahí?” preguntó Hermano Zorro.

Hermano Conejo se sonrió. Hermano Zorro era más pesado que él. Si Hermano Zorro saltara dentro de la cubeta vacía de arriba, entonces la cubeta de Hermano Conejo subiría y la cubeta de Hermano Zorro bajaría!. Así que dijo: “Sólo salta dentro de la cubeta, Hermano Zorro.”

Pues bien, Hermano Zorro saltó dentro de la cubeta vacía y hacía abajo se precipitó dentro del pozo oscuro. Iba por la mitad de su caída cuando pasó al Hermano Conejo, el cual iba aferrado a los lados de la cubeta con todas su fuerzas porque se estaba moviendo muy rápido. “Adiós Hermano Zorro,” gritó mientras subía. “Como dice el refrán, algunos suben y otros bajan! Vas a llegar al fondo sano y salvo.”

Hermano Conejo saltó fuera del pozo y corrió de regreso al jardín para decirles a los otros animales que Hermano Zorro estaba en el fondo del pozo enturbiando las aguas. Luego regresó bailando al pozo y le gritó a Hermano Zorro: “Ahí viene un cazador a beber agua, Hermano Zorro. Cuando te suba, mejor si sales corriendo lo más rápido que puedas!”

Entonces Hermano Conejo regresó al jardín. Cuando el sediento cazador subió la cubeta llena de agua, un mojado y tembloroso Hermano Zorro brincó fuera y corrió y corrió lejos antes de que el cazador pudiera agarrar su rifle.

Una hora después, Hermano Zorro y Hermano Conejo estaban de regreso en el jardín, cavando y quitando los escombros y actuando como si nada hubiera pasado. Excepto que, ocasionalmente, Hermano Zorro miraría de reojo a Hermano Conejo y sonreiría, y el conejo pícaro se empezaría a reír porque ambos se vieron muy ridículos subiendo y bajando por ese viejo y oscuro pozo.

* * *

Esta pequeña gema tiene la belleza de las cosas simples y sencillas. Me lo encontré en American Folklore y me tomé la libertad de traducirla. Este sitio está lleno de cuentos, historias tradicionales, trabalenguas etc. de los Estados Unidos y otros países de América. Desde Pecos Bill hasta Hunahpú e Ixbalanqué, hay material para pasar entretenido un buen rato. Se los recomiendo. Y como dice el autor:

“This site is best viewed while eating marshmallows around a campfire under a starry sky.”

Vayan pue’!!!

martes, 1 de abril de 2008

Gracias, John Rambo

El domingo pasado en Pasos y Pedales, el Tigrito se cayó de la bicicleta y se raspó el codo. Al ver sangre, se puso a llorar a mares. Fuimos a McDonalds a lavar la herida con agua y jabón (más lágrimas todavía) y luego a la farmacia a comprar algodón y agua oxigenada.

Era prácticamente imposible acercar el algodón con agua oxigenada y que se dejara curar, así que no me quedó más remedio que usar el “poder del padre”:

- Y eso que no has visto cómo es que se curó Rambo la otra vez que fue a rescatar a su amigo y le tiraron una granada y se le quedó un pedazo metido en el cuerpo.

- Quién es Rambo?

- No conocés a Rambo? Es uno de los mejores soldados del mundo. Es un boina negra, entrenado para usar cualquier tipo arma: cuchillo, pistola, bazuca, granada, helicóptero con ametralladora, misiles...

- Tira misiles como Halo??

- Mejor que Halo porque no usa armadura. Por eso es que a veces resulta herido, pero él sabe cómo curarse.

- Y qué más usa?

- Tira flechas, usa escopeta, se monta en caballos, maneja jeep, tanque, bicicleta...

La curiosidad de mi hijo aumentaba y me miraba con ojitos perplejos y morados de llorar. Parecía un mapache sorprendido.

- ...pues le tiraron la granada y un pedazo de metal le quedo cabal aquí en la costilla... *le agarro la panza y se ríe*. Entonces se echó agua oxigenada, agarró el pedazo de metal y se lo sacó de un sólo tirón. Y echaba la sangre por todos lados, pero él sólo dijo "uf" porque Rambo no llora.

- Ala, qué masacre.

El Tigrito estaba fascinado, así que proseguí con la historia:

- Y eso no es nada porque después, como no tenía algodón ni curitas para que ya no le saliera más sangre, agarró una bala y le sacó la pólvora, se la puso en la herida, agarró un fósforo y le prendió fuego... FUM!! Le salieron todas las chispas, parecía volcancito.

- Ala, qué masacre!

- Y hacía todo eso y sólo decía "uf". Y ahorita que te cure como Rambo tenés que decir "uf".

Acerqué el botecito de agua oxigenada y la derrame sobre su raspón. Empezó a salir espuma blanca y vi como mi hijo arrugaba el ceño y decía "uf".

- Aquí está el algodón. Ponételo sobre el raspón para quitarte la espumita.

Se puso el algodón y lo presionó mientras decía otra vez "uf".

- Así se cura Rambo?

- Si m'ijito lindo, así cabal se cura Rambo.

Se examinó la herida y se sonrió.

- Poneme más agua oxigenada, me estoy curando como Rambo!

Así que esa tarde, la curada del raspón ante los ojos de mi hijo fue algo así como esto:



Gracias, Rambo.