Dicen que quien no conoce la historia está condenado a repetirla. Es importante registrar las cosas.
Sin embargo, tiene que haber una forma de visualizar fácilmente aquello que se ha registrado. Para comprenderla. Quizás se debería decir, en realidad, que quien no comprende la historia es quien está condenado a repetirla.
Por ejemplo, uno puede tener un log con el tráfico de un website, o los mensajes de depuración de un programa, pero si no logra visualizar fácilmente la información contenida en esos registros, no la comprenderá, y se perderá en el papeleo.
En general, no se trata sólo de la historia. Para comprender algo es importante visualizarlo fácilmente, de alguna manera. La evolución de los lenguajes de programación pueden ser una manifestación de la necesidad de los programadores de comprender más fácilmente un programa. Assembler en lugar de binario. Cobol en lugar de Assembler. O C, Pascal, Basic, Smalltalk, Java, Ruby. Y, dentro de cada uno, algún framework o manera de organizar el código. Diagramas de flujo. UML. Herramientas visuales. Generadores de código. Vamos buscando una manera simple de ver el programa.
Es tan facil introducir complejidades en la organización del código que los hackers acuñaron la frase KISS ('Keep It Simple, Stupid', 'Mantenlo simple, estúpido'), para recordárnoslo, en tono de broma, pero muy en serio.
Del mismo modo que es difícil hacer reparaciones en una casa donde las tuberías están ocultas, es difícil reparar código que no está organizado convenientemente.
Cuando un programa falla, no suele ser una tarea fácil encontrar la causa. Esta no es inmediatamente visible. Hay que bucear en el código. Por eso los buenos programadores tratan que esté limpio y claro. El código que se optimiza y compacta para que quepa en un hardware económico, es uno que ha sido muy probado, porque es demasiado costoso de depurar en esa forma. Es mejor que haya una versión más amplia y clara, donde ocurra el desarrollo, y se haga el empaque de versiones seguras sólamente.
Es la misma idea que con los programas compilados. Programamos en texto, pero se usa el compilado binario, para que quepa mejor en el hardware. Imagínese tener que depurar diréctamente en el compilado. Por eso la mayoría depura en el texto fuente.
Quizás lo ideal sería que un programa pudiera ser visualizado como una caja transparente, con el flujo ocurriendo de manera obvia, de modo que fuera fácil encontrar la causa de cierto comportamiento. Quizás lo más importante sería que, al ver con más claridad lo que hay, imaginaríamos con más facilidad lo que podría haber.
2010/05/18
2010/04/30
La falacia de optimizar a cada paso
De buenas intenciones está empedrado el camino al infierno.-- refrán popular
La optimización prematura es la raíz de todo lo maligno.-- Donald Knuth
Primero que funcione, luego se mejora.-- refrán hacker
Hay cierta forma de pensar, cierta filosofía, que convence a las personas de que es bueno optimizar cada paso antes de dar el siguiente. Programar, limpiar, programar, limpiar lo nuevo y lo anterior, programar... y así sucesivamente. Como si dar cada paso marcado perfecto fuera garantía de un buen trabajo.
Y no es así. Uno podría empeñarse, dando lo mejor de sí, su mejor esfuerzo, para ir derechito al abismo. Es un ejemplo algo extremo, pero ilustra la idea.
Hacer algo y limpiar, hacer algo y limpiar, es una muestra de ese tipo de pensamiento del que hablo. Obsesionado en el control. Imaginando la peor de las posibilidades. Sin confiar. Arrastrándose como esclavo.
Es algo que está presente no solo en la programación, sino en muchas otras actividades humanas. Hay supervisores que necesitan convencerse de que cada persona esta enfocada en su trabajo para poder estar tranquilos. Parejas que necesitan conocer cada movimiento diario de la otra persona. Padres que no dejan respirar a sus hijos. Es un estilo de pensar desafortunado que muchos heredan y transmiten sin reflexionar mucho en eso. O hasta pensando que es la mejor de las opciones.
Alguien criado de ese modo, que haya crecido de esa forma, y que viva aún así, puede extrañarse un poco al considerar la valía de las cosas en las que siempre ha creído. Dar cada paso de la mejor manera no asegura un destino correcto; es importante que la ruta sea correcta.
No puedes estar en medio de la nube y contemplar la forma de la nube al mismo tiempo. No puedes estar adentro y afuera a la vez. Es como tratar de servir a dos amos distintos al mismo tiempo.
Para que sea posible esmerarse en la correcta ejecución de un paso mientras se contempla el panorama, se requiere de dos conciencias. Como cuando un bailarín contempla a su amada sin pensar en los pasos de baile. La parte subconciente se encarga de mover los pies y del ritmo, mientras la parte consciente lo disfruta.
Para dibujar, pintar, o esculpir mejor, la conciencia debe estar elevada, para sentir aquello que se quiere representar, mientras las manos y los sentidos entrenados se ocupan de los detalles.
Para ir bien por una ruta, hay que visualizarla, sentirla, mientras nuestros pasos la recorren.
Es necesario ambas conciencias. Pero muchas personas han descuidado esa noción y se encuentran haciendo las cosas sin sentir lo que hacen ni a donde los lleva. Pienso que es porque no han experimentado esa conciencia elevada de la que hablo. No usan sino una solo conciencia, y se afanan en alcanzar la perfección de un trazo, de una pincelada, de un golpe de cincel, sin sentir la obra que están realizando. Y lo triste, a veces, es que se encuentra con otro igual que lo premia ante el mundo, santificando el extravío.
Programar y optimizar a cada paso es actuar así. Porque, ¿qué sentido tiene la optimización en cada paso?, ¿acaso contribuye a programar mejor o hace más fácil e interesante el camino?. Al contrario, lastra el viaje, y hace que uno vaya a la velocidad de quien camina con lodo hasta las rodillas.
Digamos que tienes mucho código abierto, explícito, pero lo entiendes y eso te ayuda a avanzar, te da ideas, te inspira. ¿No es mejor eso que código cerrado, que ya no se puede analizar porque está optimizado, que es un rompecabezas depurar, y cuyo sentido se ha perdido entre técnicas para reducir el consumo de memoria o de disco?.
En un viaje lo más importante no es ahorrar comida y caminar poco. Es más importante encontrar cosas que te permitan avanzar, que te inspiren, que hagan que la comida no importe ni el camino recorrido, sino lo que vives y a dónde te permite llegar.
Si encontraras un framework que te permitiera comunicarte con la computadora de una manera en que tus ideas fluyeran con soltura, que sintieras la sinergía, la esperanza, las posibilidades surgiendo, eso sería maravilloso. Después ya se podría optimizar.
2010/04/18
Un esquema para desarrollo
Lo empírico y lo convencional
He observado que, cuando hay una solicitud para hacer un sistema, mucha gente se esmera por seguir lo mejor posible cierto modelo de desarrollo. Pero se suele perder en el bosque, porque caminar con ahinco no garantiza que la dirección sea la correcta.Cuando algo va mal, casi siempre es posible culpar a la gente. Que no se aplicó el modelo como debía ser. Cómo rebatir eso. Sin embargo, algo hay que hacer. Consideremos que el modelo de desarrollo pueda no ser tan bueno como pensamos. Y probemos.
En la forma empírica, uno empezaba directamente programando, y adaptando el código poco a poco. Se siente bien recibir el feedback de la computadora con cada paso.
Cuando uno estudia, le enseñan que es mejor determinar cuál es el problema y modelar cuál es la solución, antes de empezar a programar.
Si le preguntan a un desarrollador profesional típico, dirá que es mejor la segunda forma, la forma convencional. Yo no estoy completamente de acuerdo. Ni tampoco completamente en desacuerdo.
La forma convencional está bastante influenciada por la necesidad académica de poder evaluar a los estudiantes. Es más fácil hacerlo cuando explicas de antemano qué es lo que pretendes hacer antes de hacerlo. La solución se puede documentar, evaluar, optimizar, etc.
Esto también le es util al mundo. Cuando una empresa solicita un sistema, la forma convencional permite estimar el costo de antemano. Con esta venia, la forma convencional queda santificada en la currícula. Después de algunos años de ser condicionados haciéndolo de ese modo, también acabamos santificándolo nosotros.
Es un poco difícil cambiar las cosas santificadas, pero a veces hay que considerar los hechos.
En el mundo real, la conocida frase 'el cliente no sabe lo que quiere' refleja el hecho de que a menudo es muy difícil precisar el problema de antemano. Y, debido a eso, aún cuando el modelado fuera perfecto, nada garantiza que el producto final sea satisfactorio.
La mayoría de proyectos de desarrollo de software fallan. Se exceden en el tiempo, no satisfacen al cliente, o ambas cosas. Si la forma convencional estuviera en lo cierto, eso significaría que la mayoría de la gente no lo aplica bien, y no creo que ese sea el caso.
Pienso que no es culpa del cliente, ni de quien reune sus requerimientos. Sino que la causa es que no tenemos aún un método que permita precisar de antemano problemas que excedan cierta complejidad.
Cuando los problemas son relativamente sencillos, o han sido ampliamente recorridos, puede funcionar la forma convencional, pero no cuando los requerimientos son imprecisos y deban descubrirse sobre la marcha. Lo cual ocurre en prácticamente todos los desarrollos (quizás deberíamos reflexionar en el desfase académico sobre esta cuestión).
La prueba que guía
Cuando uno programa, hace pruebas para estar seguro que lo que se acaba de hacer hace lo que se espera. Es relativamente sencillo probar una función o módulo y más complicado probar un caso y aún toda la aplicación. Sin embargo, es necesario, si se quiere minimizar el número de errores que puedan llegar a la versión que probará el usuario.Las pruebas unitarias permiten usar la computadora para probar una función. Diseñando y agrupando convenientemente las pruebas se pueden probar módulos, casos y hasta la aplicación completa. Esto hace más llevadero el proceso, hasta el punto en que se pueden usar como guía para el desarrollo.
Usar las pruebas como guía para el desarrollo, o Test Driven Development (TDD), es desarrollar primero la prueba que debe pasar el producto, y recién después el producto.
Las pruebas se van implementando según se van determinando los casos de uso.
La primera vez que se corra la prueba, sin ningún producto desarrollado, aparecerá una señal roja. Entonces el desarrollo se convierte en el juego de descubrir el camino más corto, lo mínimo necesario, para que la señal se vuelva verde. Así, el producto reflejará lo que la prueba requiera. La prueba sirve como guía para el desarrollo.
Modelar es optimizar
Con TDD, la optimización se posterga todo lo que sea posible, ya que la optimización prematura fácilmente conduce a compromisos y enredos innecesarios.Cuando un producto pasa las pruebas, se puede refactorizar con seguridad. Es decir, se puede intentar ya sea cambiar el nombre de una función, extraer un fragmento de código para formar una función, reagrupar funciones en nuevas clases, etc. Si todo va bien, las pruebas continuarán mostrando la señal verde. Y si la señal es roja, no hay problema, podemos usar un sistema de control de versiones para deshacer los cambios y volver al último punto donde todo era verde.
Así, es más natural que el modelado vaya apareciendo en este punto. Si el modelado está bien, las pruebas lo dirán. En TDD, la principal guía del modelado es evitar las repeticiones y los acoples de código. Las repeticiones son código que se nota se puede factorizar (una idea similar al del álgebra, que extrae aparte los términos comunes), usando funciones, clases, o herencia. Los acoples ocurren cuando hay una dependencia innecesaria entre dos fragmentos de código. Es mejor cuando cada fragmento de código se pueda reemplazar sin peligro de efectos inesperados en otra parte.
Un esquema para desarrollo
En la forma de desarrollo empírica se sentía bien el feedback que daba la computadora en cada paso. TDD tiene algo de eso.El modelado previo de la solución, aunque quizás correcto académicamente, no funciona demasiado bien en el mundo real. Y tiene, además, el efecto de contenernos las ganas. No soltamos el corcel hasta que tenemos listo el arado. Pero, entonces, ya no es divertido salir a correr si hay que arrastrar un arado al mismo tiempo. Es mejor ir ligeros desde el principio, aceptar los hechos, ser prácticos, y actuar en consecuencia.
Parece que desarrollar un sistema con requerimientos imprecisos es algo que necesariamente debe resolverse sobre la marcha, en un proceso de prueba y ajuste.
El siguiente es un esquema que toma varias ideas de Scrum y otras metodologías:
- El proceso es de prueba y ajuste. El equipo de desarrollo y el cliente deben estar abiertos al cambio, a probar, equivocarse y corregir. El ambiente debe aceptar los errores como parte del proceso.
- El punto de vista del cliente debe estar presente en el desarrollo. Como a menudo es difícil que pueda participar, se designa un intermediario. Puede ser una persona o un conjunto de personas, pero con una sola cabeza para la comunicación y la asignación de responsabilidades.
- Se elije cuanto tiempo debe durar la etapa. Es más o menos al azar la primera vez. Entre 2 y 4 semanas.
- Basado en el punto de vista del cliente, se obtiene un conjunto de requerimientos que podría esperarse estuvieran listos en esa etapa. Es más o menos al azar en la primera etapa. Los requerimientos parten de deseos del cliente. Finalmente cada uno se expresa como algo que cierto rol usa para realizar cierta tarea.
Cada requerimiento tiene un por qué, que a su vez tiene una justificación, y así sucesivamente. La cadena se puede seguir hasta un conjunto de principios más o menos estables que constituyen la necesidad que justifica el desarrollo.
Conforme avance el desarrollo estos principios y la jerarquía de justificaciones se irá haciendo más clara.
Luego, habrán requerimientos que no se admitirán porque no encajan en ese orden y, del mismo modo, podrán descubrirse requerimientos que inicialmente no se consideraron pero que son necesarios. - Basado en los requerimientos, el equipo hace una lista general de las tareas que estos requerimientos implicaría. Es una lista libre, donde cada uno puede anotar sin censura. Es además una lista abierta, que admitirá nuevos ingresos en cualquier lugar de la etapa. La lista debe ser visible, de libre acceso y fácil de mantener.
- Antes de procesar la lista, el equipo reunido hace una lectura rápida de todas las tareas, simplemente para informarse de cuales son, y las agrupa en páginas de cierto tamaño. Esto es más o menos arbitrario. Puede ser un número entre 10 y 30 items por página.
- Para procesar la lista, se hace un repaso tarea por tarea. Cuando uno o más miembros del equipo sienten que pueden atender una tarea, se pone a trabajar en ella durante el tiempo que consideren conveniente.
Si la tarea se completa, se tacha de la lista y se continúa el repaso hasta interesarse en alguna tarea. Si la tarea no se completa, se la vuelve a anotar al final de la última página, luego se tacha la anotación original y se continúa el repaso de tareas a partir de esa posición.
Al llegar al final de la página, se vuelve al comienzo.
Si se hace un repaso y ninguna tarea pendiente parece interesante de atender, todas ellas se resaltan y se coloca una X en una esquina de la página, antes de pasar a la siguiente página.
Al llegar al final de todas las páginas, se vuelve a la primera.
Puede ser ninguna de las tareas pendientes, que ahora estan resaltadas, sea interesante, porque no son realmente necesarias en ese momento. Si es así, la X se encierra en un círculo, para facilitar saltearse esas páginas la siguiente vez.
Las tareas urgentes se anotan al final de la lista y se procesan en dirección inversa, empezando desde el final.

- La optimización se retrasa todo lo que sea posible. El código optimizado frecuentemente se hace más difícil de entender y reutilizar. Es conveniente que las abstracciones, simplificaciones, y generalizaciones se hagan lo más tarde posible. Y es en la optimización del modelo donde recién entraría a participar el arquitecto. Viendolo bien, un modelado apriori, como en la forma convencional, en realidad "contamina" la lista de requerimientos del cliente con la lista de requerimientos del arquitecto. En cambio, al hacerlo durante la refactorización del código, se hace sobre cosas que realmente se necesitan.
- Para saber quién atiende cada tarea, y cuál es el estado actual del proceso, se pueden colocar marcadores removibles sobre los items de la lista.
- Al inicio de cada semana, el responsable del equipo de desarrollo se reune en privado con cada persona para tener una visión de cómo está cada una y qué está haciendo. Hay cosas que se expresan mejor sin la presión del grupo.
- Al inicio de cada día, el equipo dedida unos minutos en contar a todos que hicieron ayer, que harán hoy, y si tienen alguna dificultad. Hay cosas que es necesario que todos conozcan.
- Al final de cada etapa se hace una evaluación de ese periodo. Ver qué cosas funcionaron bien y qué cosas podrían mejorarse.
- En cada nueva etapa, se ajusta la duración del periodo y el tamaño de las páginas de la lista de tareas. También se borran todas X de las páginas con tareas pendientes, para incorporarlas nuevamente al proceso.
Cómo funciona
La forma de procesar la lista de tareas está basada en el sistema Autofocus, de Mark Foster.La idea de dejar que el equipo atienda las tareas que les resultan interesantes es permitir que se desarrolle un inconsciente colectivo que ayude a determinar cuáles son realmente necesarias.
El sistema funciona como un ambiente que sólo deja sobrevivir aquellas tareas realmente necesarias para determinar el sistema. Es decir, el sistema se determina de modo evolutivo. Por eso, se da la libertad de anotar en la lista lo que sea, porque si no vale la pena hacerlo nadie lo hará, y si es necesario, tarde o temprano sucederá.
No es necesario gastar tiempo discutiendo cuales son las tareas, en qué orden hacerlas y quién las atenderá. El sistema facilita que estas cosas se resuelvan espontáneamente.
Ahora, a probar.
Enlaces:
2010/03/24
Gmail para leer Hotmail y Yahoo Mail
Gmail permite descargar el correo de otras cuentas (actualmente hasta un máximo de 5 cuentas), que tengan el servicio POP3 habilitado.
Por ejemplo, si alguien tienen más de una cuenta Gmail, puede configurar una de ellas para que todos los demás correos lleguen allí.
Lo mismo se puede hacer para una cuenta Hotmail.
Para que los correos de Yahoo Mail también puedan llegar, hay que habilitarle el servicio POP3.
Gmail leyendo Gmail
Normalmente, cada cuenta Gmail tiene habilitado el servicio POP3.
Entonces, elija primero la cuenta desde donde desea ver todas las otras e ingrese. Allí puede entrar a Settings (Opciones), Accounts and Import (Cuentas e Importar), Check mail using POP3 (Revisar correo usando POP3) y pulsar el botón Add POP3 email account (Agregar cuenta email POP3) para agregar los datos de cada una de las otras cuentas.
Para verificar que tiene la propiedad de la cuenta que quiere asociar, Gmail le enviará un mensaje a dicha cuenta un mensaje con un código de verificación, un enlace e instrucciones para hacer la validación. Es conveniente usar otro navegador para entrar a la otra cuenta Gmail, abrir el mensaje y copiar el código que se ingresará en la ventana que dejamos abierta en el primer navegador. Por ejemplo, entrar a una cuenta A con Firefox y a la cuenta B con Chrome o IE.
Entre las opciones de una cuenta asociada, si gusta puede marcar la automáticamente aplica una etiqueta a los mensajes de esta cuenta para que pueda distinguirlos fácilmente de los demás.
Gmail leyendo Hotmail
Puede asociar de modo similar una cuenta Hotmail.
Gmail leyendo Yahoo Mail
Si tienen una cuenta en Latinoamérica, tal vez habrá notado que desde hace algunos años el servicio POP3 está deshabilitado, a menos que adquiera Yahoo Mail Plus, que es un servicio pagado. Sin embargo, por alguna razón, las cuentas de Asia sí tienen el servicio POP3 habilitado en las cuentas gratuitas. Afortunadamente, es posible hacer el cambio.
Ingresando a su cuenta Yahoo Mail, puede entrar los datos de su cuenta. Puede ser que le tome un tiempo encontrar el enlace adecuado, pero es uno de los que aparece en la parte de arriba. Tal vez como un desplegable bajo su nombre de usuario (Edit My Account, Editar mi cuenta), o como un enlace simple (My Account, Mi cuenta).
Allí, por seguridad, le pedirá otra vez la contraseña, antes de conducirle al Account Info (Datos de la cuenta).
En la sección Accounts Settings (Opciones de la cuenta), entre a Set Language... (Establecer lenguaje...). Allí, podrá cambiar el Preferred Content (Contenido preferido) a Yahoo Asia.
Después de grabar los cambios, puede volver a mail.yahoo.com y entrar en Options (Opciones), POP & Forwarding (POP y Reenvíos), Set up or Edit... (Establecer o editar...), y marcar Web & POP Access (Acceso Web y POP). Además hay una opción que permite elegir entre recibir absolutamente todos los mensajes, o sólo aquellos que Yahoo no considere spam. Gmail tiene un filtro antismpam, así que parece buena idea pasarle todos los mensajes.
Luego de guardar la configuración en Yahoo Mail, se puede ir a Gmail y asociarla como en el caso anterior.
Referencias:
Por ejemplo, si alguien tienen más de una cuenta Gmail, puede configurar una de ellas para que todos los demás correos lleguen allí.
Lo mismo se puede hacer para una cuenta Hotmail.
Para que los correos de Yahoo Mail también puedan llegar, hay que habilitarle el servicio POP3.
Gmail leyendo GmailNormalmente, cada cuenta Gmail tiene habilitado el servicio POP3.
Entonces, elija primero la cuenta desde donde desea ver todas las otras e ingrese. Allí puede entrar a Settings (Opciones), Accounts and Import (Cuentas e Importar), Check mail using POP3 (Revisar correo usando POP3) y pulsar el botón Add POP3 email account (Agregar cuenta email POP3) para agregar los datos de cada una de las otras cuentas.
Para verificar que tiene la propiedad de la cuenta que quiere asociar, Gmail le enviará un mensaje a dicha cuenta un mensaje con un código de verificación, un enlace e instrucciones para hacer la validación. Es conveniente usar otro navegador para entrar a la otra cuenta Gmail, abrir el mensaje y copiar el código que se ingresará en la ventana que dejamos abierta en el primer navegador. Por ejemplo, entrar a una cuenta A con Firefox y a la cuenta B con Chrome o IE.
Entre las opciones de una cuenta asociada, si gusta puede marcar la automáticamente aplica una etiqueta a los mensajes de esta cuenta para que pueda distinguirlos fácilmente de los demás.
Gmail leyendo HotmailPuede asociar de modo similar una cuenta Hotmail.
Gmail leyendo Yahoo Mail
Si tienen una cuenta en Latinoamérica, tal vez habrá notado que desde hace algunos años el servicio POP3 está deshabilitado, a menos que adquiera Yahoo Mail Plus, que es un servicio pagado. Sin embargo, por alguna razón, las cuentas de Asia sí tienen el servicio POP3 habilitado en las cuentas gratuitas. Afortunadamente, es posible hacer el cambio.Ingresando a su cuenta Yahoo Mail, puede entrar los datos de su cuenta. Puede ser que le tome un tiempo encontrar el enlace adecuado, pero es uno de los que aparece en la parte de arriba. Tal vez como un desplegable bajo su nombre de usuario (Edit My Account, Editar mi cuenta), o como un enlace simple (My Account, Mi cuenta).
Allí, por seguridad, le pedirá otra vez la contraseña, antes de conducirle al Account Info (Datos de la cuenta).
En la sección Accounts Settings (Opciones de la cuenta), entre a Set Language... (Establecer lenguaje...). Allí, podrá cambiar el Preferred Content (Contenido preferido) a Yahoo Asia.
Después de grabar los cambios, puede volver a mail.yahoo.com y entrar en Options (Opciones), POP & Forwarding (POP y Reenvíos), Set up or Edit... (Establecer o editar...), y marcar Web & POP Access (Acceso Web y POP). Además hay una opción que permite elegir entre recibir absolutamente todos los mensajes, o sólo aquellos que Yahoo no considere spam. Gmail tiene un filtro antismpam, así que parece buena idea pasarle todos los mensajes.
Luego de guardar la configuración en Yahoo Mail, se puede ir a Gmail y asociarla como en el caso anterior.
Referencias:
2010/03/12
Resolviendo Drupal multisite
Aunque la instalación y configuración inicial de Drupal es relativamente sencilla y directa, configurarlo para que varios sites compartan el mismo motor fue, para mí, casi un dolor de cabeza.
Drupal
Drupal es un CMS (Sistema administrador de contenidos) open source escrito en PHP. Es muy popular y, debido a su arquitectura especialmente extensible, que permite construir aplicaciones más allá del CMS, es considerado también como framework.
La instalación es simple. Se descomprime el archivo que se descarga de drupal.org en algún lugar del directorio web. Luego se accede a la dirección correspondiente y se siguen los pasos, que incluye indicar los parámetros de acceso a una base de datos MySQL (o PostgreSQL) y definir un usuario administrador.
Drupal Multi-Site
En el árbol drupal instalado hay un directorio sites. Allí, en el directorio default podemos colocar los archivos, módulos y temas del site. Además hay un directorio all, donde el manual, los tutoriales y los libros colocan los módulos y temas para que 'estén disponibles para todos los otros sites'.
Así que uno se imagina que puede tener más sites bajo ese mismo árbol, funcionando con el mismo motor. De hecho, esa configuración se denomina multi-site.
Pareciera que es algo que no se usa mucho, porque no lo mencionan en ningún material introductorio. En la documentación hay varios casos para leer. Si antes de hacerlo uno se imagina que bastará con crear otros subdirectorios con la misma estructura, encontrará que no es así.
Entonces, lógicamente, se lee un poco el manual... luego en los foros... blogs... googleando en la búsqueda de una explicación que quién iba a pensar sería tan difícil de encontrar. Es un problema algo frustrante. Al menos para mí; me tomó todo el día dar con una solución.
Mi ambiente
En un sistema con Windows 7, desarrollo usando XAMPP 1.7.1.
XAMPP es un paquete que facilita el desarrollo PHP/MySQL. Viene con Apache, PHP, MySQL y Mercury Mail preconfigurados para trabajar juntos, lo que es realmente un gran ahorro de tiempo, respecto a realizar manualmente cada instalación/configuración. Uso la versión 1.7.1 porque usa PHP 5.2, que no emite una alarma cada vez que un parámetro es pasado por referencia (lo cual en PHP 5.3 se ha vuelto deprecated). Y como muchos módulos que corren con Drupal 6.x tienen funciones con parámetros pasados por referencia me parece mejor ser un poco prácticos y usar una versión menos que la ultimita :)
XAMPP 1.7.1 viene con Apache 2.2.11, PHP 5.2.9, MySQL 5.1.33-community, entre otros paquetes (ver Old Version of XAMPP para más detalles).
Se supondrá que XAMPP está instalado en C:\bin\dev\xampp\. Eso significa que el directorio web es C:\bin\dev\xampp\htdocs\. Allí, Drupal 6.16 está instalado en test\drupal_101\. Es decir que, para acceder a mi drupal, el url es http://localhost/test/drupal_101/.
Podría ser más sencillo, pero no es demasiado complicado y creo que tener el drupal un poco metido en el árbol ayudará a ilustrar mejor el punto.
Practicamente nadie se detiene a explicar el por qué la necesidad de estas complicaciones, o cuál es la idea básica del proceso. Y me parece que deberian hacerlo, porque aclara algo muy importante del funcionamiento de Drupal.
Cuando accedo a http://localhost/test/drupal_101/, Drupal eventualmente buscará un archivo settings.php. En una instalación típica lo encuentra en sites/default/settings.php.
Lo que no se nos dice con claridad es que, en realidad, Drupal usa el url como parámetro para determinar dónde buscar el archivo settings.php. De hecho, parece que default es el último lugar donde busca. Antes ha buscado en localhost.test.drupal_101. Puede hacer la prueba renombrando sites/default como sites/localhost.test.drupal_101 y ver que funciona igual. Sorprendente ¿no?
Si yo quisiera un nuevo site, digamos http://localhost/test/drupal_202/, lo que tendría que hacer es correr la misma aplicación pero bajo ese nuevo nombre. Es decir, lograr que al entrar a ese url se corra exactamente el mismo php que antes. Eso haría que Drupal busque el archivo sites/localhost.test.drupal_202/settings.php correspondiente. Y si existiera y estuviera bien configurado, listo, ¡tendríamos Drupal multi-site!
Pero ¿cómo hacer eso?. Ahí es donde la mayoría mete en el juego las complicaciones de los dominios, subdominios, hosts, virtualhosts, .htaccess, etc. Son soluciones válidas pero, en mi humilde opinión, hay un modo más sencillo, que está al alcance tanto de los usuarios Windows como Linux, y además ilustra bastante más cláramente lo que ocurre.
Abro una consola de comandos en el directorio que contiene a mi arbol drupal_101, htdocs/test/ (SHIFT+clic derecho, Open command window here), para ejecutar el comando mklink:
Eso crea un enlace simbólico (una especie de directorio ficticio) que permite apuntar al directorio drupal_101 con un nombre nuevo adicional drupal_202.
mklink está disponible en Windows 7 y WIndows Vista. Para Windows XP puede usar el comando Junction (puede ver más información sobre esto en el post Enlaces simbólicos en Windows). En Linux usaría un comando similar a ln -s drupal_101 drupal_202 (allí primero se indica el destino y luego el link).
Hecho esto, al entrar a http://localhost/test/drupal_202/ uno esperaría ver lo mismo que si se entrara a http://localhost/test/drupal_101/. Después de todo se trata del mismo directorio, aunque tenga dos etiquetas. Pero, como Drupal usa el url como parámetro para determinar el lugar dónde debe estar el archivo settings.php, encontrará uno diferente en sites/localhost.test.drupal_202/ y así veremos un site también diferente.
En el fondo, esta técnica aparece en la documentación cuando habla del uso de subdominios, pero la idea escencial está tan opacada por las otras dificultades que cuesta distinguirla. Ojalá este artículo sea de ayuda.
El nombre localhost.test.drupal_202 sigue un patrón que se explica mejor en el comentario contenido en el archivo default.settings.php
Drupal
Drupal es un CMS (Sistema administrador de contenidos) open source escrito en PHP. Es muy popular y, debido a su arquitectura especialmente extensible, que permite construir aplicaciones más allá del CMS, es considerado también como framework.
La instalación es simple. Se descomprime el archivo que se descarga de drupal.org en algún lugar del directorio web. Luego se accede a la dirección correspondiente y se siguen los pasos, que incluye indicar los parámetros de acceso a una base de datos MySQL (o PostgreSQL) y definir un usuario administrador.
Drupal Multi-Site
En el árbol drupal instalado hay un directorio sites. Allí, en el directorio default podemos colocar los archivos, módulos y temas del site. Además hay un directorio all, donde el manual, los tutoriales y los libros colocan los módulos y temas para que 'estén disponibles para todos los otros sites'.
Así que uno se imagina que puede tener más sites bajo ese mismo árbol, funcionando con el mismo motor. De hecho, esa configuración se denomina multi-site.
Pareciera que es algo que no se usa mucho, porque no lo mencionan en ningún material introductorio. En la documentación hay varios casos para leer. Si antes de hacerlo uno se imagina que bastará con crear otros subdirectorios con la misma estructura, encontrará que no es así.
Entonces, lógicamente, se lee un poco el manual... luego en los foros... blogs... googleando en la búsqueda de una explicación que quién iba a pensar sería tan difícil de encontrar. Es un problema algo frustrante. Al menos para mí; me tomó todo el día dar con una solución.
Mi ambiente
En un sistema con Windows 7, desarrollo usando XAMPP 1.7.1.
XAMPP es un paquete que facilita el desarrollo PHP/MySQL. Viene con Apache, PHP, MySQL y Mercury Mail preconfigurados para trabajar juntos, lo que es realmente un gran ahorro de tiempo, respecto a realizar manualmente cada instalación/configuración. Uso la versión 1.7.1 porque usa PHP 5.2, que no emite una alarma cada vez que un parámetro es pasado por referencia (lo cual en PHP 5.3 se ha vuelto deprecated). Y como muchos módulos que corren con Drupal 6.x tienen funciones con parámetros pasados por referencia me parece mejor ser un poco prácticos y usar una versión menos que la ultimita :)
XAMPP 1.7.1 viene con Apache 2.2.11, PHP 5.2.9, MySQL 5.1.33-community, entre otros paquetes (ver Old Version of XAMPP para más detalles).
Se supondrá que XAMPP está instalado en C:\bin\dev\xampp\. Eso significa que el directorio web es C:\bin\dev\xampp\htdocs\. Allí, Drupal 6.16 está instalado en test\drupal_101\. Es decir que, para acceder a mi drupal, el url es http://localhost/test/drupal_101/.
Podría ser más sencillo, pero no es demasiado complicado y creo que tener el drupal un poco metido en el árbol ayudará a ilustrar mejor el punto.
Mi solución
Los pasos que suelen aparecer en la mayoría de la documentación, foros, blogs y otras fuentes de internet mencionan virtualhosts o aliases en apache, .htaccess, hosts, subdominios y otras cosas complicadas.Practicamente nadie se detiene a explicar el por qué la necesidad de estas complicaciones, o cuál es la idea básica del proceso. Y me parece que deberian hacerlo, porque aclara algo muy importante del funcionamiento de Drupal.
Cuando accedo a http://localhost/test/drupal_101/, Drupal eventualmente buscará un archivo settings.php. En una instalación típica lo encuentra en sites/default/settings.php.
Lo que no se nos dice con claridad es que, en realidad, Drupal usa el url como parámetro para determinar dónde buscar el archivo settings.php. De hecho, parece que default es el último lugar donde busca. Antes ha buscado en localhost.test.drupal_101. Puede hacer la prueba renombrando sites/default como sites/localhost.test.drupal_101 y ver que funciona igual. Sorprendente ¿no?
Si yo quisiera un nuevo site, digamos http://localhost/test/drupal_202/, lo que tendría que hacer es correr la misma aplicación pero bajo ese nuevo nombre. Es decir, lograr que al entrar a ese url se corra exactamente el mismo php que antes. Eso haría que Drupal busque el archivo sites/localhost.test.drupal_202/settings.php correspondiente. Y si existiera y estuviera bien configurado, listo, ¡tendríamos Drupal multi-site!
Pero ¿cómo hacer eso?. Ahí es donde la mayoría mete en el juego las complicaciones de los dominios, subdominios, hosts, virtualhosts, .htaccess, etc. Son soluciones válidas pero, en mi humilde opinión, hay un modo más sencillo, que está al alcance tanto de los usuarios Windows como Linux, y además ilustra bastante más cláramente lo que ocurre.
Abro una consola de comandos en el directorio que contiene a mi arbol drupal_101, htdocs/test/ (SHIFT+clic derecho, Open command window here), para ejecutar el comando mklink:
mklink /J drupal_202 drupal_101
Eso crea un enlace simbólico (una especie de directorio ficticio) que permite apuntar al directorio drupal_101 con un nombre nuevo adicional drupal_202.
mklink está disponible en Windows 7 y WIndows Vista. Para Windows XP puede usar el comando Junction (puede ver más información sobre esto en el post Enlaces simbólicos en Windows). En Linux usaría un comando similar a ln -s drupal_101 drupal_202 (allí primero se indica el destino y luego el link).
Hecho esto, al entrar a http://localhost/test/drupal_202/ uno esperaría ver lo mismo que si se entrara a http://localhost/test/drupal_101/. Después de todo se trata del mismo directorio, aunque tenga dos etiquetas. Pero, como Drupal usa el url como parámetro para determinar el lugar dónde debe estar el archivo settings.php, encontrará uno diferente en sites/localhost.test.drupal_202/ y así veremos un site también diferente.
En resúmen
Drupal usa el url como parámetro para determinar que settings.php usar. Y el settings.php determina el site que se carga. De ese modo podemos tener varios sites, si logramos entrar al mismo drupal usando diferentes nombres. Una manera sencilla de lograr eso es usando enlaces simbólicos. Eso me parece menos complicado que la alternativa de los aliases, y virtualhosts.En el fondo, esta técnica aparece en la documentación cuando habla del uso de subdominios, pero la idea escencial está tan opacada por las otras dificultades que cuesta distinguirla. Ojalá este artículo sea de ayuda.
Posibilidades
Basta cambiar la configuración de la base de datos que aparece en el settings.php para que el site se transforme en algo completamente diferente. Jugar con esto me ayudó a entender un poco mejor la naturaleza de una aplicación drupal respecto de otras opciones.El nombre localhost.test.drupal_202 sigue un patrón que se explica mejor en el comentario contenido en el archivo default.settings.php
Suscribirse a:
Entradas (Atom)




