Un website cristiano hecho en Django

Tabo me envió por mail (¡gracias!) este post de Luke Plant sobre sus apreciaciones de tiempo y velocidad de desarrollo ilustradas con un proyecto suyo hecho en Django, que es un website para campamentos cristianos.
Es realmente interesante y me he descargado el código fuente para leerlo, ya que siempre se puede aprender muchas cosas de otra persona.

Aparte de Retrazos, otro conejillo de indias para mi aprendizaje de Ruby on Rails es Via7, un website que hice hace tiempo para jóvenes creyentes. Originalmente en PHP, Via7 era un gran hack a un phpBB que quedó en el descuido al expirar el dominio.

Espero que sea muy pronto poder tener el mismo gusto de Luke de anunciarles la finalización del proyecto. Aunque todos sabemos que la web de una comunidad nunca termina. ;)

Mejorando mi carrera

Una de las metas más relevantes que me he trazado para este año 2006 es “He mejorado en mi carrera, soy más veloz, más eficiente.” A principios de año me sentí estancado, como si hubiese llegado a cierto punto donde mis conocimientos me son suficientes para mi trabajo y todos los proyectos que veía eran más de lo mismo y nada nuevo, ningún reto, a menos que yo mismo me imponga uno para mejorar procesos. Eso es algo que me ha venido preocupando.
He estado intentando aprender cosas nuevas (PEAR DataObjects, AJAX), pero sentía, como le contaba a mis padres, que todos alrededor mío siguen avanzando y yo me estoy quedando atrás.

He tenido muchas sorpresas con lo que el Señor me ha estado enseñando con esta meta trazada, todo por diversos factores como, por ejemplo, mis ideas prehistóricas de cómo debo hacer las cosas o la falta de interactuar más con otras personas, colegas, amis linuxeros.
Voy a darles una vista general de las cosas que me han venido aconteciendo últimamente. Todo esto ha venido sucedido desde Enero y entre punto y punto hay a veces varias semanas o meses de separación. Algunas se solapan entre sí. Bueno, empecemos:

– Primeramente como mencioné ambiguamente en un post atrás, Tabo me habló de Python y Django y ese solo consejo me abrió muchas posibilidades. Ya entendí que PHP no es el futuro, a menos que reescriban todo el lenguaje desde cero y reinventen Python o Ruby.

– Luego encontré este fabuloso blog de Kathy Sierra junto con este todavía más fabuloso post acerca de la neurogénesis y una interesante conclusión: “Aprender cura el cerebro.”

– Me puse a aprender Python y Django simultáneamente.

– Hablando con Antonio acerca de PHP5, Ruby y un poco de Python, llegué a una conclusión importante que me dio mucha confianza: que puedo aprender cualquier cosa. Al descubrir esto me dí cuenta que una parte de mí dejó de creer que tengo la capacidad de aprender, un tipo de “ya estoy muy viejo para aprender tantas cosas,” lo cual me parece absurdo. ¿Desde cuándo he empezado a pensar así y por qué?

– Cuando regresé de Lima volví a visitar el blog de Kathy (tengo mi lector RSS desactivado por motivos productivescos) y me encontré con este post acerca de cómo volverse un experto en cualquier rama. Menciona la diferencia entre expertos, novatos y mediocres, pero lo más interesante es este párrafo que se los traduzco:
“Oh si, acerca de esa cosa de que nunca es tarde… la mayoría de nosotros puede despedirse de la medalla Olímpica de patinaje sobre hielo. Y a mis 5′ 4”, mi carrera de basketball no tiene probablemente esperanzas. Pero piensa en esto… la actriz Geena Davis casi calificó para el equipo Olímpico de tiro con arco de Estados Unidos en un deporte que ella tomó a la edad de 40, menos de tres años antes de las calificaciones Olímpicas.

– Luego Droper compartió este post que me gustó mucho sobre Matemáticas para Programadores.

– De ese post salté a este otro enlace que me pareció todavía más fascinante y, a mitad del artículo pensé “¿Desde cuándo las matemáticas me parecen fascinantes?” Siempre le he tenido miedo a las matemáticas y he tenido muchas dificultades toda mi vida.

– Recordé entonces a mi hermano que nunca fue bueno en matemáticas en el colegio. Cuando ingresó a Ingeniería Civil no se rindió ante la idea de tener que masticar matemáticas. Hoy le gustan las matemáticas y daba clases a los hijos de algunos creyentes en Covida. Creo que una de las cosas que lo inspiró fue Johnny Rico, el protagonista de Starship Troopers (el libro, la película no existe).
Al principio a Johnny le hacen un examen del cual los resultados son: “insuficiente entendimiento intuitivo de relaciones espaciales… insuficiente talento matemático… preparación matemática deficiente… tiempo de reacción adecuado… buena vista.” Como algo paralelo a toda la historia, uno ve a Johnny estudiando duro matemáticas, recibiendo tutoría de diversas personas y preocupándose por haber dejado sus libros en otra nave espacial.
Johnny dice “Matemáticas es trabajo duro y ocupa tu mente — y no duele aprender todo lo que puedas de ello, no importa en qué rango estés; todo lo que sea de importancia está fundado en matemáticas.”
He aprendido que esa última frase es muy cierta. Von Neumann se levantaría de su tumba y te comería el cerebro personalmente si te atreves siquiera a cuestionar eso.

– Mirando en el mismo website de Math a Day, llegué a este artículo y mientras lo leía pensaba, “Esta persona ha trabajado en Amazon, haciendo cosas realmente interesantes — ¿por qué yo no hago esas cosas?” y llegué a muchas conclusiones que todavía quiero terminar de meditar. Mas una de ellas es firme: Amazon usa mucha matemática brillante para funcionar.
El artículo trata acerca de practicar programación, como cuando uno practica pesas. No es algo que haces en tu trabajo diario, sino algo que debes hacer de manera separada, dedicada, aparte.
Si aprecias tu carrera, por favor lee ese artículo. La parte que más me llamó la atención es la siguiente:
De todas tus habilidades como programador, ¿cuáles de ellas podrían ser consideradas “intemporales”? Encáralo: la mayoría de tu conocimiento técnico tiene un tiempo de vida, una fecha de expiración.
[…]
Lo que yo creo que encontrarás es que matemáticas, ciencias de la computación, escritura, y habilidades sociales son en su mayor parte intemporales, habilidades universales. Las tecnologías más específicas, lenguajes y protocolos eventualmente expiran, para ser reemplazadas por mejores alternativas.”

– En un momento dado me dí cuenta que, sin querer, estaba logrando cumplir esta meta que me había trazado. A diferencia de otras metas donde le pongo bastante empeño conciente, esta meta cayó por sí sola y las cosas se movieron “sin esfuerzo” de parte mía. Me dí cuenta que es el Señor quien estaba moviendo las circunstancias.

– Pasaron varias semanas y una noche decidí mirar Ruby y Rails y cambié mi rumbo. Quedé fascinado con el lenguaje Ruby y sigo aprendiendo desde entonces más de Ruby y Rails.

– De un momento a otro me dí cuenta que había crecido. Fue progresivo, y en un tiempo relativamente corto, pero mi vida ha dado muchos giros comparado a lo que “tenía” a principio de año.

– Una vez que estuve en Peruserver cogí por segunda vez un libro de matemáticas que hay en la biblioteca y Antonio me dijo, “Ya que tanto quieres aprender, ¿por qué no te metes a la universidad?”

– Sigo aprendiendo Ruby y Rails. He meditado seriamente la idea de meterme a la universidad, mas por ahora no siento la Voluntad del Señor por esa ruta; otras puertas se han estado abriendo por otra ruta que espero comentar en otro post. Eso no descarta que siga aprendiendo y creciendo por mi cuenta.
Gracias a Savre, voy a hacer averiguaciones para tomar cursos y llenar esas lagunas que tengo.

Y la vida continúa… :) No hay conclusión, no hay punch line. Esta es mi vida y siguen apareciendo oportunidades y puertas que se abren, puertas que se cierran, todo siempre interesante.

Belleza de código

La primera vez que leí acerca de “belleza” en programación fue en un escrito de Paul Graham. La segunda vez fue a Tabo haciendo referencia al evangelismo de belleza de David Heinemeier Hansson sobre Ruby y programación en general en el video de Snakes and Rubies.
Tengo otra idea muy familiar que, personalmente, conozco bajo el nombre de “elegancia.” Código que es “elegante” y soluciones “elegantes” a problemas complejos. En mi cerebro he catalogado “elegancia” y “belleza” como dos ideas no intercambiables. Ojo que esta es mi categorización personal, nada canónico:

“Belleza” de código es la diferencia motivacional que existe entre:

inicio = Time.now.beginning_of_day

y

$inicio = mktime (0, 0, 0, date (“m”), date (“d”), date (“Y”));

El primer código, en Ruby, es a todas luces guapísimo. :)

“Elegancia” es, en mi diccionario, algo que no tiene que ver mucho con cómo se ve el lenguaje, sino pasos ingeniosamente elaborados para la resolución de un problema de la mejor forma posible. El código no será necesariamente bello, pero la solución puede ser elegante.

PHP es, definitivamente, no bello — por decirlo de una manera agradable. Sin embargo, eso no le quita que podamos escribir código elegante en él.

Vamos con un ejemplo real.

Estoy actualmente trabajando en un proyecto sujeto a bastantes cambios estructurales. Escribí una función de búsqueda para cada uno de los tipos de registros que manejamos en base a ciertos criterios. Estas funciones devuelven un array con los resultados. Por ejemplo:

function actividades_buscar ($db, $vista, $localidad, $linea, $mes, $anyo, $pagina)

Esta función se llamaba desde un solo lugar inicialmente, luego conforme vinieron los cambios empecé a usarla en algo de cuatro lugares distintos del sistema. En el lugar original no había mucho problema en entender el código, ya que le alimentaba con variables recibidas por GET.
Sin embargo, en los otros lugares donde hacía búsquedas predefinidas (hardcoded) como que ya no era tan legible:

$resultados = actividades_buscar ($db, “general”, “0000000000”, -1, -1, -1, $pagina);

(Ough!)

Pero lo peor fue cuando el cliente decidió añadir más criterios de búsqueda… así que añadí un par de parámetros más a mi función y actualizar en todos los lados, pero oops! se me escapó en una parte y el cliente detectó el bug. Ok, a corregir.

Luego el cliente decidió añadir otro criterio más de búsqueda y ya me estaba doliendo (podría decir físicamente) cambiar en N-lados lo mismo y tener un código que era horrible. La gota que derramó el vaso fue cuando el cliente pidió que también se pudiesen ordenar los resultados por columnas y tenía que pasar un parámetro de ordenamiento a mi función de búsqueda quedandome con una definición de:

function actividades_buscar ($db, $vista, $localidad, $linea, $acciones, $mes, $anyo, $criteria, $mes_inicio, $anyo_inicio, $mes_fin, $anyo_fin,$sort, $pagina)

(Oh, la humanidad.)

Obviamente no iba a entender ni papa de qué cosa es qué aquí:

function actividades_buscar ($db, “regional”, “0000000000”, -1, -1, -1, -1, ”, -1, -1, -1, -1, ”, $pagina)

Este código era tan horrible que me dije “Es un asco. No puedo creer que esto exista.” No tenía tiempo para corregir eso, pero era tan horrible y tenía tanto miedo que me pidiesen otro cambio en esa parte que decidí dejar de lado todo y sentarme a reescribir todo eso.

La solución final fue pasar cada uno de los criterios de búsqueda en un array, y si no mencionamos un criterio, éste obtiene un valor por defecto sensible. Eso significó reducir la declaración de mi función a:

function actividades_buscar ($db, $params)

y llamar la función con solamente los parámetros necesarios de la siguiente manera mucho más legible y elegante:

$resultados = actividades_buscar ($db, array (
        ‘vista’ => ‘general’,
        ‘pagina’ => $pagina_actual,
   )
);

Ahora sí tengo paz. :)

Quiero conocer tus hacks

Mail enviado a la Lista del PLUG:

“Quiero conocer tus…” qué!?

“Hacks.” Ok, vamos a aclarar eso. Estamos hablando de programación, si tu rama no es la programación, puedes saltar al siguiente mail. Me refiero a “hack” a cualquier programa chico o mediano, mayormente escrito en un lenguaje de scripts (Per l, Python, Ruby, PHP, etc) que hace alguna tarea no necesariamente gloriosa, pero sí interesante.
No me refiero a que hayas penetrado la seguridad de ningún sistema ni que hayas conseguido la contraseña de Hotmail de tu ex.

Ejemplos concretos: tengo un script en Pe rl que monta en mi wallpaper gráficos para mostrar el clima, la fecha y la agenda de mi Palm.
Solía tener un conjunto de scripts en Python con los que podía asignar puntajes a canciones y me armaba playlists para el XMMS en base a las canciones que me gustaban (repitiendo a manera de radio las de más alto puntaje).

Hablo de esos scripts del tipo “Oh, los pondría en mi página web pero quiero limpiarlos/documentarlos antes de blah blah” y demás excusas de siempre. Hablo de esos scripts que usas en tu empresa pero que no puedes compartir porque es código de la empresa. Hablo de esos scripts que hiciste una vez, salvaron el día heroicamente, y luego se perdieron cuando quisieron enchufar la cafetera.

Lo que quiero es que me hables de ellos. “Hice un script que hace esto,” “En el trabajo teníamos que crear 3,000 usuarios y generarles passwords para el día siguiente, entonces…” “Estaba aburrido y me hice un Quake con awk…”

No es ninguna tarea académica ni estoy escribiendo ningún artículo (aunque no es mala idea). Es solo mera curiosidad mía por conocerlos y conocer lo que han hecho. Sólo eso. Pasen la voz a todos los que les pueda interesar.

!!! POR FAVOR RESPONDAN A MI CORREO PERSONAL Y NO A LA LISTA !!!

j@jgwong.org <-- make me, spambots. Y gracias por compartirme sus historias y tiempo. No les exijo nada, no están obligados a pasarme ningún código fuente, aunque sería interesante para mí, y siempre bien recibido. Los scripts que son de su empresa, son de su empresa y punto. Sólo quiero que me cuenten sus anécdotas, etc. PS: Soy un completo flojo para contestar mails, lamento que a veces tarde tanto (Record actual: 5 meses). Mucha gente me odia por eso. Por favor únanse al club. :) La versión web es: “POR FAVOR RESPONDAN A MI CORREO PERSONAL Y NO PUBLIQUEN UN COMENTARIO!!!” Es más, voy a cerrar los comentarios. Gracias. :)

PHP poster guy

Lisp: Paul Graham
Ruby: David H. Hansson
PHP: ???

¿Quién es el poster guy de PHP?

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.

Ayuda: Cómo educar a una futura hacker?

Mis estimados amis y lectores de este blog, tengo una amiga a quien quiero adoptar como Padawan y enseñarle “computación.” Tiene dormitantes tendencias hacker y rasgos de geek, así que va a ser relativamente sencillo, por no decir interesante.

El punto es que no sé por dónde empezar.

Eché un ojo al índice del “How to become a hacker” de ESR, pero no es lo que busco; ya que quiero enseñarle computación en sí. Estaba pensando tomar paralelamente cosas básicas como bits y bytes y por otro lado (para que no se aburra) cosas básicas de más alto nivel y hardware.

Podrían recomendarme ideas? Ya después yo las ordeno, o si me pueden dar pautas en cierto orden, sería mejor. Quiero dejar claro que no quiero enseñarle “Windows,” ni “Linux,” ni “a programar,” ni a “ensamblar” sino a entender y a moverse por sí misma, para que llegue a ser independiente en el menor tiempo posible.