Sin Límites, sin Barreras

No recuerdo exactamente las especificaciones exactas, mas basta decir que mientras la computadora de mi primo Oscar tenía una tarjeta y monitor VGA (256 colores), Oliver tenía una CGA (4 colores). Mi primo tenía una 386 y Oliver una 286. Oscar tenía un disco duro (40 Mb?), Oliver sólo diskettes. Oscar tenía una Soundblaster, Oliver no.
Con todas esas cosas en contra, Oliver siempre nos superaba.

Aparte de los juegos, a los tres nos fascinaba programar. En ese tiempo carecíamos de Internet. Nuestro conocimiento era limitado y nuestros tanteos a ciegas para entender cómo funcionaban las cosas eran muy raramente fructíferos. No fue hasta que Oliver leyó en el manual de ayuda de QuickBASIC cómo redefinir la paleta de colores de la VGA hasta que entendimos por qué cada vez que lo intentábamos solamente podíamos obtener tonos de rojo (hint: sólo usábamos el primer byte, la «R» de «RGB»).
Por supuesto, no puedes aprender a ciegas cómo usar el mouse, o la Soundblaster.

Así que programábamos cosas con el poco conocimiento que teníamos, nuestro sueño siempre hacer un juego. La diferencia fundamental entre el equipo de primo y yo versus Oliver era precisamente los límites que Oliver tenía impuestos sobre sí mismo. Los juegos que él podía jugar eran muy pocos, ya que los juegos nuevos ya no corrían en la CGA. Así que Oliver se veía limitado y obligado en cierta forma a programar. Mi primo y yo, en contraste, jugábamos más en lugar de programar más.
Mi primo y yo teníamos recursos para hacer cosas impresionantes, pero las cosas más impresionantes las hacía Oliver. Y eran impresionantes precisamente por sus límites.

Oliver es, de los tres, el que teclea más rápido. «Endiabladamente veloz» sería una descripción adecuada. Cuando nos enseñaban computación en el colegio San Vicente con unas viejas 386 (y monitores CGA monocromáticos!) Oliver levantaba el QBASIC y escribía todo un juego que ya se sabía de memoria: un shooter al estilo Sonic Wings o Xenon 2 con power-ups y todo.
Recuerdo que me impresionó cuando hizo un juego de lucha al estilo Street Fighter. Sólo eran dos esferas que le salían brazos o patas cuando golpeaban. Lo impresionante era que podías hacer el movimiento del hadouken y lanzaban su bola de fuego! Y podías jugarlo de dos personas en mismo teclado, y las pulsaciones de teclas para hacer el hadouken podían hacerse simultáneamente y funcionaba. Le insistí que me explicase cómo hacía eso, porque me parecía algo completamente complicado. [1]

Muchas veces usamos nuestras limitaciones como excusas para no hacer algo grande con lo pequeño que tenemos. Nuestra mente empieza a pensar y busca una justificación racional a nuestro miedo o flojera: «Si tuviese una computadora,» «Si me fuera al extranjero,» «Si mis hijos fuesen más grandes,» «Si tuviera un mejor sueldo,» «Si terminara ya la universidad,» «Si tuviera más tiempo,» y un largo etcétera. A algunos nos ha tocado mucho, a otros poco, lo importante es lo que hacemos con ello; eso es lo que vale.

Digamos que quieres estudiar inglés. «Oh, pero hay un problema,» dices. «No tengo dinero para ir un instituto de inglés.» Con eso justificas tu deseo y allí quedó el esfuerzo, como una meta futura de «Cuando tenga dinero, me meteré a un curso de inglés.»
Si de verdad quieres estudiar inglés, por qué no estás leyendo cosas en inglés, escuchando música en inglés, viendo películas sin subtítulos [2], ahorrando para comprarte un diccionario? Una amiga pegaba los nombres en inglés de las cosas de su cuarto («Door,» «Bed,» etc.). Por qué no fotocopias un curso de inglés de alguien? Por qué no vas donde están los que estudian inglés y te haces sus amigos? Por qué no hacer algo con lo poco que tienes?

Si quieres tanto una computadora y no tienes dinero, por qué no ahorras? «Ridículo,» dices tú. «Una computadora es carísima, con las justas me dan propinas.» Pero piensa un instante en este diálogo:

OTRO: «Y tienes una computadora?»
TU: «No, pero estoy ahorrando.»
OTRO: «Ah si? Cuánto te falta?»
TU: «Un montón. Voy ocho soles.»
(Risas, y luego efecto del tiempo que pasa. Hojas de calendario volando, esas cosas.)
OTRO: «Oye, y Fulano se compró su máquina.»
TU: «Ah, qué bacán.»
OTRO: «Tú estabas ahorrando, no?»
TU: «Sí. Ya voy 52 soles.»

Qué crees que pensaría la otra persona? «Este pata de verdad quiere una computadora.» No quise escribir «Ya voy 900 soles» o «700 soles» para que entiendan que por más limitantes que tengas no debes dejar de lado aquellos sueños que te inspiran.

En el libro «Starship Troopers» de Robert A. Heinlein, entrevistan al protagonista viendo en qué área del ejército sería apto. El protagonista había elegido toda una lista larga, y al final el cuerpo K-9 (el cuerpo canino) y la Infantería Móvil. Le indagaron un poco acerca de su elección del K-9. No recuerdo el diálogo exacto, pero era algo así:
– «Te gustan los perros?»
– «Sí, teníamos uno en la casa.»
– «Alguna vez dormiste con tu perro?»
– «No señor, a mi Mamá no le gustaba.»
– «Mmm, ok. Si ni siquiera puedes engañar a tu Mamá para meter a tu perro a tu cuarto, dudo que seas apto para el Cuerpo K-9. Qué opinas de la Infantería Móvil?»

Todos nos hemos enamorado alguna vez, verdad? Aunque sea un pequeño interés en el colegio, donde haces un millón de cosas que hoy te sacan una sonrisa para que te toque sentarte al lado de ella o tomar coincidentemente su ruta a casa. [3] Haces esas cosas porque a pesar de todas tus limitantes quieres decirle una palabra o dos y no dejas que nada te detenga.

Muchas barreras están en nuestra cabeza y solamente en nuestra cabeza. No dejes que tus limitaciones te detengan. Las personas que más han logrado cosas en la vida son aquellas que han visto sus limitaciones y han sabido aprovecharlas al máximo. No necesitas ser un genio, o tener mucho dinero, o conocer personas clave, o ser hábil, conversador, gracioso o tener buena pinta para cumplir tus metas.
Debes conocer a un ciego en persona y vivir con él un día entero para que entiendas con lágrimas lo precioso que es la vista. Cuánto más dos brazos, dos piernas, una voz y cinco dedos? «No puedo bailar,» dices — pero tienes dos piernas y lo puedes intentar cuantas veces quieras. Hay personas que no pueden andar, o tienen una sola pierna y que te darían una paliza por decir «No puedo bailar» cuando no lo has intentado con el corazón, con furia, hasta que te salen callos. Qué darían los inválidos por siquiera tener una oportunidad de intentarlo.
No digas «No puedo bailar,» porque sí puedes. Ellos no pueden. [4]

Notas
[1] Es sencillo, cada pulsación de tecla para cada jugador se guarda en un buffer. Analizas el buffer y ya.
[2] Mi hermano y yo solíamos alquilar películas en VHS y pegábamos una tira de papel encima de los subtítulos, algo que Oliver encontraba hilarante.
[3] Las mujeres tienen un olfato increíble cada vez que los hombres hacemos estas cosas. Y que eso no te detenga a hacerlas.
[4] Binario me comenta de este post que niega y complementa fabulosamente los límites que podemos romper. Es inspirador. Gracias!

Amores platónicos

Estoy enamorado de TextMate, un editor para programadores sólo disponible para MacOS X. Gosh, ahora que Apple está migrando a procesadores x86 espero que haya alguna oportunidad remota de poder usarlo.

Voy a darle otra oportunidad a Emacs en estos días, y luego pienso probar Cream.

Avril Lavigne vs. The Blue Nile

Estaba trabajando hoy con la música en modo al azar cuando empezó una canción de Avril Lavigne, «He wasn’t.» Cuando vi el nombre de la artista pasé de frente a la siguiente canción, pero luego me dije «Hmmm… a ver, veámos qué dice la canción.»

Bien, la canción habla acerca de una muchacha frustrada de un chico que «no era» (ése es el título de la canción, «He wasn’t»). Dice el coro:

Sentada en la cama sola, mirando el teléfono.
El no era lo que quería, lo que pensé, no.
Ni siquiera abriría la puerta.
Nunca me hizo sentir como que soy especial.
El no era realmente lo que estaba buscando.

Lo primero que se me vino a la mente fue «egoísmo.» Pero vamos a darle chances a la letra. El problema con esta canción es el efecto secundario que puede producir. Es decir, meterles en la cabeza a las niñas (y niños) que tu chico ideal tiene que abrirte la puerta, tiene que hacerte sentir especial. Ok, obviemos lo de abrir la puerta — por supuesto que representa que sea alguien atento, sigamos con «El no era realmente lo que estaba buscando.» Pero, ¿qué estaba buscando? No lo sabemos, no es obvio en ningún lado, sólo hay engreímiento y queja en la canción.
Lo peor que puede pasar es que te convenzas que las cosas son así. Que tu acercamiento a una relación se convierta en «Venga, ¿qué tienes para darme? ¿Vas a hacerme sentir especial?» y no es así. Al final te conviertes en precisamente la persona que la letra repudia: alguien que no hace sentir especial a la otra persona, sino que busca satisfacerse a sí misma.

Ergo, egoísmo.

La única frase profunda de la letra es «Este punto de vista se está volviendo rancio,» y le doy toda la razón. Sería más rescatable si fuesen consejos más de mujer a mujer del tipo «Búscate a un chico que te quiera por lo que eres,» o «No le entregues tu corazón a alguien descuidado. No seas descuidada con el corazón de otros.» Pero no, el resto de la canción se la pasa quejándose de su mal día, que ahora va a limpiar su cuarto y um, otras cosas sin mayor productividad.

Me dije «Waj, que asco de letra,» y luego pensé «¿Qué canción tendría buena letra?» y busqué una canción al azar de los Blue Nile. La canción que salió fue «Broken Loves» que no es precisamente mi favorita, pero los Blue Nile nunca me fallan.

La canción es a veces ambigua, lo cual la hace precisamente profunda, porque se presta a mil interpretaciones y puntos de vista — y esa es la diferencia fundamental entre ambas canciones. Mientras que Avril Lavigne dice: «¿Qué pasó con mi Sábado?» los Blue Nile preguntan «¿Alguna vez te preguntas a dónde se fue el verano?»
Por el contexto, su pregunta de ellos es retórica, donde el verano representa días de alegría, de sol, de brillo y felicidad. Por el contexto, Avril sólo se queja que su Sábado pasó y, um, la pasó sola. ¡La culpa es del chico! ¡Hay que hacer bulla!

Ok, «Broken Loves» trata acerca de un hombre cuyo matrimonio se hace pedazos. El coro dice:

Navega lejos, navega lejos de mí, oh hijo,
Cuento tus palos y todos tus juguetes,
tu risa en el ruido de fondo.
No nos rendiremos,
te voy a prometer algo más;
no algún tipo de amores rotos.

Ahora, eso es poesía. «No nos rendiremos,» es algo realmente precioso, allí está el espíritu de lucha, de querer volver a reunir a su familia, de recapacitar y querer una segunda oportunidad, de ofrecer amor verdadero, que los una y no los lastime, «no algún tipo de amores rotos.»

La primera frase de «He wasn’t» dice: «No sucede mucho hoy. Estoy realmente aburrida, se hace tarde.»

La primera frase de «Broken Loves» dice: «Me siento exactamente como un fósforo en relación a tí.» La analogía del fósforo es bacán. Uno puede pensar, ok, fósforo… lo usas una vez y luego se extingue. Ya no te sirve. O que es algo tan mundano o insignificante para la otra persona. Etcétera.

Sí, ya sé, estoy comparando papas y camotes.

«It’s great to be back!»

Michael Abrash es uno de mis héroes de programación. Es el gurú indiscutible de la programación a bajo nivel, de la más original y extraordinaria optimización, el descubridor del Modo X, autor de excelentes artículos para la Dr. Dobbs Journal (de él aprendí a escribir, expresarme y predicar usando analogías), autor del Graphics Programming Black Book (Disponible gratis en la web) y programador junto con John Carmack de Quake.
Siempre he querido saber qué es de su vida actualmente, pero no hay información actualizada de su persona en la web.

«It’s great to be back» es un artículo que me gusta leer de cuando en cuando y siempre lo encuentro refrescante y energizante. De allí viene mi mantra «No asumas,» que es crítico para todo programador.

No importa si no programas; mi hermano, que es Ingeniero Civil, me comentó una vez que le gusta bastante ese artículo. Les recomiendo altamente una leída.

Megamix de sucesos

No voy al Campamento! :(
Por motivos de trabajo este año, contra todo pronóstico, no podré ir al Campamento. :( Tengo una reunión hoy, una revisión el viernes y varios cambios por presentar de manera definitiva y bug-free para el Lunes. No tienes que repetírmelo, no me voy a estresar, no me voy a estresar, no me voy a estresar…

Juampa reloaded
Mi hermano se compró un Palm Tungsten T5 y está pero jueliz. Yo sigo dándole duro a mi viejo Palm IIIx.

Ensayo sobre la ceguera
Mi papá entró a mi oficina, se puso sus gafas y leyó los títulos de ciertos libros que tengo allí por falta de espacio en mi cuarto.

– «Buscas algo para leer?» le pregunté.
– «Sí.»
– «Te recomiendo uno.»

Le entregué «Ensayo sobre la ceguera» de José Saramago, que me prestó Oscar. Espero que lo termine de leer para intercambiar opiniones. Sería la primera persona cristiana con quien podría discutir esto, así que de verdad espero que lo termine de leer. :)

Cambios importantes
Y mi vida sigue cambiando. Tengo una canción sin terminar que empieza diciendo «Se abren frente a tí bifurcaciones infinitas» y es exactamente como me siento ahora. Alguien me dijo algo y ahora me encuentro exactamente así, con «bifurcaciones infinitas» delante mío y todo un abanico inmenso de posibilidades.
Estamos finalizando Febrero y este año ya se ve fenomenal.

Recontrabacán?

jgwong: Estás aprendiendo Per&#108?
drmad: mm?
drmad: en realidad, estuve descubriendo el per&#108 que llevo en mi :)
jgwong: :O
jgwong: Larry Wall lives inside you! :)
drmad: :-)
drmad: per&#108 es recontrabacan
drmad: en un programa que estuve haciendo, me di cuenta que habia hecho nua fucion recontraofuscada :)
drmad:
# Ahora convertimos las exclusiones en expresiones regulares
# – Los asteriscos los reemplazamos por .*
# – Las interrogaciones por .
# – Lo anclamos al final de la liena con $
# – Los puntos los escapamos.

foreach(@excl){s/\*/\.\*/;s/\?/\./;s/\./\\\./;$_.=’$’;}

# Ahora vomitamos de las nauseas por leer eso.

jgwong: Y eso te parece recontrabacán?
drmad: si :-)
jgwong: Es tan sucio como pecar :)
drmad: jajajajajaja :-D

Algunos dibujos

Gosh, hace días que no posteo nada, así que de relleno les muestro algunos dibujos hechos con mi tableta Wacom.



«Dizque Mechwarrior» – Aún por terminar, hecho con Painter Essentials mientras me amanecía con Savre. :) «MechTV» debería ser… :D


Una rosa, jugando con las acuarelas del Painter Essentials. Me incomoda la interface del Painter, pero su acabado natural es increíble.


«Polly quiere cantar,» mientras jugaba con las brochas del Photoshop Elements.


«Mokona,» mientras aprendía el chiste de multiplicar layers con Photoshop Elements.

Y todavía sigue funcionando!

Hay una historia interesante en la web, en algún foro, de una laptop que se cayó en una autopista y un motociclista la encontró y funcionaba igual de bien. La historia más se centraba en el motociclista descubriendo la vida de la otra persona a través de la laptop y buscarla para devolvérsela (a pesar que anhelaba quedarse con la máquina).
Como esa, hay otras historias de computadoras y aparatos que han sufrido caídas o golpes espectaculares y, contrariamente a lo que uno piensa, siguen funcionando.

Cuando todavía estaba en primaria de colegio dí una caída a gran velocidad en el recreo, lo cual hizo volar mi reloj Casio y repartirse en partes. Yo tenía la manía de desarmarlo, por eso se abrió fácilmente. Recogí las piezas y volví a armarlo y, efectivamente, seguía funcionando y debería seguir haciéndolo de no ser porque ya no tiene pila y no marca el año 2000.

Tenía un celular Nokia, ya no recuerdo el modelo exacto, era de esos que parecen un jabón. El hecho es que esa cosa era durísima. Había sufrido un par de caídas y no le pasó nada. Era tal la confianza que tenía a ese celular que, mientras le contaba a una amiga lo duro que era, lo dejé caer desde la altura de mi codo. El celular rebotó y la tapa de la batería se salió, pero el celular siguió funcionando feliz.

En 1998, Ica sufrió una inundación. Varias personas me comentaban de sus computadoras, que después de haber flotado en el agua y el lodo trataban de recuperarlas. Algunas personas decían con orgullo, «Y todavía sigue funcionando!»

Lo que notamos en estos objetos, sea del tipo que sean, es la calidad de la construcción. Sea un vehículo, un celular o hasta una persona misma, la calidad o fuerza del diseño se hace claramente visible cuando lo sometes a una prueba no concebida para su uso.
Una vez por tantear a ciegas poner el conector de mi disco duro, con la computadora encendida, hice un mal contacto dándole corriente a un pin que no se supone debía recibir corriente. Hubo un sonoro «poc!» y toda la computadora se apagó. Ya se imaginan mi rostro de pánico, oraciones mil, volver a encender la computadora y probar el disco duro mientras me maldecía a mí mismo por semejante brutalidad.
El disco duro funcionó sin problemas, no pasó absolutamente nada.

Uno no puede evitar una sorpresa en ese instante, ¿verdad?

Ok, ok, ¿Qué quiero decir con esto? Cuando desarrollemos un programa, sea una aplicación web o un script para un firewall (¡Habla chochera!), la calidad de ese desarrollo se hace ver cuando lo sometemos a algo inesperado. Me gusta probar desarrollos webs en PHP de otros moviendo las variables en la URL.
Pongamos de ejemplo un catálogo en línea que reciba el ID del producto de esta forma:

catalogo.php?id=0001826

Entonces lo que hago es quitarle el ID y dejarlo así:

catalogo.php?id=

Refresco la página y miro qué pasa. La reacción de la aplicación en ese instante demuestra el cuidado y diseño del programador o equipo de programadores. El caso más común es que el sistema muestra el supuesto detalle pero con todos los campos vacíos. Es decir, siguió buscando un registro en la base de datos a pesar que no había ningún ID.
En otros casos, sale un error de SQL o PHP. Otras veces, se queda en blanco — al menos tuvieron el cuidado de desactivar el reporte de errores.

La primera ley de Lambeck (sobre diseño de maquinarias) afirma que debemos construir cierto margen en nuestro diseño por posibles desviaciones de manufactura o de uso del cliente. Esta ley puede ser aplicada también en nuestro desarrollo en PHP, sobre todo porque la web es muy vulnerable.

La segunda ley de Lambeck dice que cuando hay un problema, cualquier acción es mejor que ninguna (esto es, ¡No te quedes parado, haz algo!). Lo que yo frecuento hacer cuando no hay un ID, o el ID no es un número o el ID no existe en la base de datos es saltar a otra página. Lo ideal sería mostrar un mensaje de error «No existe ese registro» o «Oops! Hubo un problema» — mas cualquier acción es mejor que ninguna.

Esta segunda ley persigue el mismo fin que la frase dicha por Bobby Knight, un entrenador de basketball, que todos juntos deberíamos aplicar en todo aspecto de nuestras vidas: «Sé un buen líder o un buen seguidor, y, si no puedes ser ninguno, por todos los cielos, quítate del camino.»

Las leyes de Lambeck están reproducidas en su totalidad en esta dirección.