Emacs y line wrapping

Ya que ahora estoy en dos planets, pregunto a los usuarios de Emacs:

Cómo rayos puedo tener verdadero line wrapping?

Al decir line wrapping me refiero al hecho de poder escribir y leer líneas largas que excedan el margen y continúen visualmente en la línea siguiente. He visto hacks en elisp para hacer eso, y «hacks» es la palabra correcta para describirlo porque ninguno hace el trabajo bien.

Me parece increíble que, con tantos años de existencia, Emacs no pueda hacer eso.

Y Vim tampoco puede.

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.

Planeta Linux

Planeta Linux es un planet latinoamericano que busca integrar blogs de geeks^H^H^H^H^Husuarios de Linux hispanohablantes.

Hay un Planet Linux Perú, así que si tienes un blog, usas Linux y eres peruano, agrégate al agregador. :)

Recontrabacán?

jgwong: Estás aprendiendo Perl?
drmad: mm?
drmad: en realidad, estuve descubriendo el perl que llevo en mi :)
jgwong: :O
jgwong: Larry Wall lives inside you! :)
drmad: :-)
drmad: perl 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.

Cómo aprender PHP

Como saben, me gano el pan haciendo aplicaciones web en PHP. Frecuentemente recibo preguntas de muchos tipos, así que intentaré contestar algunas.

Empezaremos con ésta: ¿Cómo puedo aprender PHP?

La respuesta más precisa es a la vez la más genérica: Tal como aprenderías cualquier otra nueva habilidad. Leyendo, investigando y practicando, practicando, practicando. Como en toda cosa valiosa, esto toma trabajo y esfuerzo duro. Como podrás leer a continuación, no todo es tan fácil como parece.

En primer lugar, hay una distinción importante que hacer: aprender PHP no es lo mismo que aprender a programar, así como aprender a escribir el abecedario no es lo mismo que aprender a escribir poesía.

– «Aprender PHP» es aprender la sintaxis del lenguaje, cómo se escribe un programa, cuáles son las funciones, sus estructuras de control, bucles, etc.
– «Aprender a programar» es aprender a resolver problemas usando un lenguaje de programación.

Muchas personas confunden ambas cosas, y cuando piensan en «aprender PHP» están metiendo ambos conceptos en la misma bolsa, y no es así. Tu primer paso es diferenciar ambas cosas.

Probablemente habrás sentido curiosidad por PHP al ver lo fácil que es, y es muy cierto. PHP es un lenguaje muy fácil de aprender. Pero ojo, eso no significa que aprender a programar sea igual de fácil.
Es por este motivo que muchos diseñadores web intentan hacer programas con PHP y el resultado no es una aplicación robusta, ni segura, ni escalable. [1] Es por ello que vemos muchos websites hackeados porque sus autores no saben programar. Saben PHP y no es lo mismo.

Entonces vamos a reformular nuestra pregunta: «¿Cómo puedo aprender a programar y aprender PHP?»

Eso está mejor, pero todavía está incompleto.

Verás, PHP es un lenguaje para programar aplicaciones web. Es cierto, se puede usar fuera del contexto de la web (cosa que personalmente hago a menudo), pero cuando nos referimos a «programar en PHP» estamos hablando de «programar una aplicación web.»

Entonces lo segundo que tenemos que aprender es cómo funciona la web. Debes ser capaz de entender los siguientes conceptos:

1) El concepto de cliente/servidor.
2) El protocolo «http».
3) Métodos GET y POST — cómo funcionan y cómo se diferencian.
4) El lenguaje HTML.
5) Cómo funciona a grandes rasgos un navegador web.
6) Cómo funciona a grandes rasgos un servidor web.

Ya puedo ver sus caras de «TODO ESO TENGO QUE APRENDER!?» Como les dije en un principio, aprender PHP requiere trabajo y esfuerzo duro. Ok, pasemos a una pregunta más sensible: «¿Pero Jaime, es realmente necesario que conozca todo esto?» La respuesta es «No.»
Entonces, ¿por qué razón hago esta lista? Porque tarde o temprano la falta de estos conceptos te va a traer problemas. [2]

Depende mucho de hasta dónde quieres llegar. ¿Quieres hacer un par de cosillas con PHP, un contador por aquí, un gráfico al azar en la portada y nada más? Perfecto, no es necesario que te tragues esa lista.
¿O quieres ser un buen programador? ¿De aquellos que buscan la excelencia y definen el futuro? Oh, entonces coge tu taza de café y vamos a aprender lo que es necesario aprender. De tí depende.

Una vez que tengas los conceptos de la web bien aprendidos, el siguiente paso es aprender poco a poco PHP y poco a poco programar. Hay tutoriales regados por la web, varios en español inclusive. Te recomiendo que busques un tutorial que te enseñe primero lo básico del lenguaje. Aquí unos tips en tu aprendizaje:

1) No copies y pegues. Escribe cada uno de los ejemplos a mano. Debes ser capaz de poder escribir cientos de líneas de código a mano. Debes ser capaz de recordar la sintaxis de PHP. No quiero decir que debas saberte de memoria cada una de las funciones de PHP, llevo cerca de cinco años en esto y todavía tengo que consultar la sintaxis de str_replace. Lo que quiero es que te familiarices con la forma del lenguaje, de cada comando.

2) Lee todo el manual. Si, todo. O para ser más literales, échale un vistazo a todo el manual. Un desliz frecuente es implementar todo un programa y luego descubrir que había una función en PHP que hacía eso. La idea de echarle un vistazo a toda la librería de funciones es que sepas qué cosas hay disponibles, de modo que más adelante al menos puedas pensar: «Hmmm… me parece haber visto una función que hacía eso.»

3) Elige un pequeño proyecto. Piensa en algo que te sea útil y te gustaría tener, que sea sencillo y simple. Por ejemplo: una lista de direcciones web, una tabla de colores HTML, una lista de tus gastos, etc. Luego mira qué es lo que te falta saber para poder implementarlo y averigua cada cosa, un paso a la vez. «Ah, necesito saber cómo guardar cosas en un fichero,» entonces lee el manual de PHP sobre ello o busca en Google tutoriales. «Ok, necesito saber cómo guardar lo que escribí en esta caja de texto,» entonces mira el manual de PHP o busca en Google por algún tutorial.

Se me acabó el tiempo. Este post no pretende ser ninguna guía exhaustiva, a este paso creo que voy a terminar escribiendo un libro. Si tienen alguna pregunta o duda, escriban un comentario o un mail a j@jgwong.org. Les aviso que soy tardo para contestar, así que no desesperen.

Espero que esto les sea útil. La programación es fascinante.

Notas
[1] Debo aclarar que no tengo nada en contra de los diseñadores que deciden aprender PHP; todo lo contrario, les animo a que aprendan a programar lo cual les puede abrir innumerables puertas para competir con la mejor de las ventajas: la diferenciación.

[2] Las personas que carecen de estos conceptos fundamentales son los que más tarde tienen confusión entre el cliente y el servidor. Muchos se confunden pensando que PHP puede hacer lo mismo que Javascript, que PHP puede imprimir, etcétera. Esta es la sencilla razón.