2011/06/28

Liberando los sitios dinámicos

Imagine que le hicieran una página web y, un tiempo después, usted quiere modificar el documento HTML.

Imagine que puede abrirla en cualquier editor de texto, modificarla y volverla a grabar. Sin importar si se hizo en Dreamweaver, Geany, Notepad, o cualquier otro. Qué libertad.

Claro que no sólo lo podemos imaginar, de hecho podemos hacerlo.

Entonces, ¿por qué hemos permitido que esta libertad y conveniencia sea recortada por los frameworks? Porque eso es lo que ocurre.

Cuando hacemos un sitio dinámico, digamos en CakePHP, y, un tiempo después, usted quiere modificarlo, tiene que usar no sólo CakePHP, sino la misma versión de CakePHP. Del mismo modo si hubiera usado Zend, CodeIgniter o Drupal.

Es como si le dijeran que para abrir un HTML tiene que usar Notepad 4 y no otro, porque no es compatible. Que si quiere el mismo site para Notepad 5 hay que volverlo a hacer.

Sí, un site dinámico es más complejo que un documento HTML, pero la razón es similar. Es importante que el producto sea independiente de la herramienta usada para fabricarla. No sólo porque es un gran ahorro de esfuerzo y duplicidad. Sino también para que tengamos la libertad de elegir cualquier herramienta que queramos.

En el desarrollo web han aparecido islas, o silos. Al comienzo fue entre lenguajes, como ASP, JSP, PHP, Python, Ruby. Luego entre frameworks dentro de esos lenguajes. Y entre versiones de un mismo framework.

Muchos desarrolladores se amarran a cierta plataforma porque sus productos no pueden ser modificados con otra. Expresar un sitio dinámico en otro framework (o versión de framework) puede ser tanto trabajo como hacerlo de nuevo.

Después de todos los discursos que nos dan sobre la reinvención de la rueda, KISS (Keep It Simple, Stupid: Mantenlo Simple, Estúpido), DRY (Don't Repeat Yourself: No te Repitas), etc ¿no le parece poco razonable?

Hay razones por las que se prefirió que los protocolos web usaran texto simple. Para que cualquiera pudiera entrar a manejarlos. Quizás debemos recordarlo más seguido.


Imagine que le hicieran un sitio dinámico y, un tiempo después, usted quiere modificar el site.

Imagine que puede usar cualquier framework, modificarlo y guardarlo. Sin importar si se hizo en Drupal 6 o Drupal 7. O si se hizo en Zend o CodeIgniter. Incluso sin importar si se hizo en PHP, Ruby, Python o ASP. Qué libertad.

Claro que sólo lo podemos imaginar, pero podemos hacerlo.

2011/06/19

Proyectos como sistemas biológicos

Los proyectos de software no salen tan bien como se quisiera.

Un programador solitario, con talento, puede hacer código muy bonito, hasta cierto punto.
Cuando el proyecto llega a cierto tamaño o complejidad, es cada vez más difícil continuar.

Varios programadores, con talento, formando un equipo, pueden hacer algo muy bueno, muy por encima de lo que serían capaces con sus talentos individuales, hasta cierto punto.
Cuando el proyecto llega a cierto tamaño o complejidad, es cada vez más difícil continuar.

Los proyectos exitosos son aquellos que alcanzan ese punto límite no tan lejos de la meta que se proponían.

Pero la mayoría lo alcanza mucho antes.

Tratando de explicarse esto, hay quienes culpan a la gente. Pero sucede incluso en equipos compuestos de gente talentosa.

Parece que la respuesta es la organización.

La forma en cómo se organiza a las personas, las reglas o normas que siguen, de algún modo, van tejiendo una trama que, eventualmente, ahoga el proyecto.

Quizás haya un modo de lograr una organización sostenible.

Por lo pronto, se ha visto algunas cosas que funcionan mejor que otras.

Algo visible es más fácil de corregir. Algo simple es más fácil de ver. Algo modular es más simple de hacer. Algo descentralizado es más modular. Algo libre es más descentralizado. Algo que podemos corregir es más libre.

Cada ser vivo puede considerarse un tipo de sistema. Cada ser vivo tiene una vida, corta o larga, con un patrón de nacimiento, desarrollo, apogeo y remisión. Quizás sea propio de cada sistema. Quizás cada sistema está condenado por la complejidad que es capaz de alcanzar. El apogeo sería el aviso de la remisión inminente. Y la remisión el preámbulo de un nuevo nacimiento.

Quizás debamos dejar de comportarnos como si pudiéramos diseñar proyectos eternos, que muchas veces conducen a intentos efímeros, y diseñar proyectos con ciclos de ascenso y remisión, que inspiren y exhalen, que corran y duerman. Y todo eso, mientras evolucionan.

2011/06/17

Ubuntu menú de aplicaciones con iconos

En Ubuntu Natty Narwhal, no me agrada mucho que Unity, el nuevo sistema de escritorio de Ubuntu, requiera que uno descienda varios niveles para encontrar el menú de aplicaciones (Ubuntu logo, More Apps, All Applications).

Así que he instalado Cairo, que provee un docker similar al que se usa en Mac, o al que provee también RocketDock en Windows. Lo bueno de Cairo es que provee un acceso directo al menú de aplicaciones.

Sin embargo, noto que el menú de aplicaciones no muestra los iconos sino sólo la etiqueta de cada opción.

Encontré en tips4linux.com una manera de solucionarlo. Ejecutar en la consola de comandos:

gconftool-2 --type Boolean --set /desktop/gnome/interface/menus_have_icons True

Referencias

2011/06/16

Resolviendo inicio MySQL con Xampp en Ubuntu

Instalé Lampp (Xampp para Linux, xampp-linux-1.7.4.tar.gz) en Ubuntu (Natty Narwhal).

La ruta de instalación es /opt/lampp

Para iniciar lampp:

sudo /opt/lampp/lampp start

Obtuve un mensaje de error, indicando que MySQL no podía iniciar.

Parece que el problema tiene que ver con los derechos de escritura. La solución que me funcionó fue:

sudo -s
cd /opt
chmod -R 777 lampp
chmod 755 lampp/etc/my.cnf

Espero le sea de ayuda. Quizás alguien encuentre una mejor solución.

2011/06/14

Copia en Linux convirtiendo symlinks

En Linux, para copiar un directorio completo, se puede usar algo como:

cp -a origen destino

Si origen tuviera symlinks (enlaces simbólicos), estos se copiarían tal cual.

Si se desea que los symlinks se conviertan en los archivos a los cuales apuntan:

cp -aL origen destino

Esto parece que no esta muy documentado. Ojalá le sea de ayuda.

2011/06/11

Acceder a Nokia 3220 usando Gammu

El Nokia 3220 es un teléfono celular que vengo usando varios años. Ahora, quizás se puede considerar un modelo antiguo, pero puede tomar fotos de 640x480 px que se ven bien.

Para descargar las fotos, uso un cable tipo DKU5 que va del puerto serial del teléfono a un puerto USB de la computadora.

En el lado de la computadora, con Windows, se puede usar el Nokia PC Suite. Me ha funcionado bien con Windows XP. Con Windows 7 parecía no conectar bien, así que lo que hice fue correr Windows XP en un vmware para correr allí el Nokia PC Suite.

Muchas veces he tenido problemas para lograr la conexión. El teléfono suele decir 'Data enhancement not support', aún cuando finalmente la conexión se logre.

Ahora que estoy usando Ubuntu Linux (Natty Narwhal), encontré que se puede usar Gammu/Wammu para acceder al celular.

Instalé Wammu y lo probé. Tiene un wizard que permite identificar el celular conectado. Se logra hacer la conexión, pero no logré encontrar en la interfaz del programa el modo de descargar las fotos.

Entonces encontré el artículo COMO: Archivos de Nokia 3220 ( u otro ) a Ubuntu que me mostró el camino por la consola de comandos.

Primero instale Gammu (yo pensaba que Wammu lo había instalado pero no era así):

sudo apt-get install gammu

Luego, verifico que en ~/.gammurc esté lo siguiente (generado previamente por el wizard de Wammu):

[gammu]
port = /dev/ttyUSB0
connection = dku5fbus
name = Nokia 3220

Para comprobar la conexión, ejecuto:

gammu --identify

Obtengo:

Device               : /dev/ttyUSB0
Manufacturer         : Nokia
Model                : 3220 (RH-49)
Firmware             : 05.10 I (07-09-05)
Hardware             : 6203
...
Old simlock          : TIM Peru (716 10)
UEM                  : 400

Se puede obtener un listado de los archivos (en un formato tipo árbol):

gammu --getfilesystem

O también un listado plano:

gammu --getfilesystem -flatall

Con el listado plano, veo que los archivos de las fotos están en d:/predefgallery/predefphotos. Entonces, ejecuto:

gammu --getfilefolder d:/predefgallery/predefphotos

Y logré descargar mis fotos.

Para más ayuda sobre el comando gammu:

gammu --help
gammu --help filesystem

Al querer eliminar los archivos Image*.jpg, encontré que no funcionaba gammu --deletefiles d:/predefgallery/predefphotos/Image*.

Entonces, ubicado en el directorio donde descargué las fotos, ejecuté este comando:

for p in $(ls Image*); do echo $p; gammu --deletefiles d:/predefgallery/predefphotos/$p; done

Quizás les sirva de ayuda.

Referencias

2011/06/07

Acceder a un Server en Virtualbox desde el Host

Virtualbox es una aplicación que permite instalar un sistema operativo dentro de otro. Por ejemplo, puedo instalar Ubuntu Linux dentro de Windows 7. En el caso que describo a continuación, está instalado Windows XP dentro de Ubuntu Linux (Natty Narwhal).

Por qué
Al requerir un entorno de desarrollo Drupal que sea portable, la solución que encontré fue usar XamppLite portable (disponible para Windows) en un USB.

Como trabajar directamente en el USB me parece muy lento, copio el directorio de xampplite al disco duro y trabajo allí. Luego, al final del día, sincronizo esa copia con el USB.

Como todo el estado de la base de datos MySQL está en los archivos generados, al copiarlos todas las bases de datos, tablas y cambios se reflejan idénticamente.

Al volver a trabajar en Linux, me interesó encontrar un modo de levantar el xampplite. Intenté con Wine y, aunque arranca el panel de control de xampp, no se puede iniciar el servidor apache. Entonces, lo hice con Virtualbox.

Instalé Virtualbox 4.0.8 para Ubuntu y allí instalé Windows XP.

De modo que, en la jerga de la virtualización, Ubuntu es el Host y Windows XP es el Guest.

Pude correr xampplite y funcionaba apache. Pero no encontraba el modo de acceder al servicio web del Guest desde el Host.

Usando VBoxManage
No logré encontrar en la interfaz de Virtualbox un modo de configurar eso.

Después de navegar un poco en Internet, encontré en Sitepoint el artículo Build Your Own Dev Server with VirtualBox. Allí, la solución consiste en editar a mano el archivo XML de la configuración de la máquina virtual.

Si uno revisa ese archivo (VirtualBox.xml) puede encontrar la advertencia de no editarlo a mano. Así que indagué un poco más para ver si había otro modo y lo encontré en el artículo How to access a server running in a VirtualBox guest, que indica cómo hacer los cambios usando el comando VBoxManage.

Primero hay que apagar la máquina virtual. Los cambios se harán efectivos al reiniciarla.

Para listar las máquinas virtuales:

VBoxManage list vms

Hay que establecer varios extradata en el Guest "Windows XP":

VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/HostPort" 8888
VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/GuestPort" 80
VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/Protocol" TCP

Para verificar:

VBoxManage getextradata "Windows XP" enumerate

Si hubiera que eliminar alguno, bastaría con darle un valor en blanco. Por ejemplo:

VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/HostPort" 8888

A continuación inicié el Guest, y el servidor apache que contiene.

En el Host pude acceder al servicio web entrando a:

http://localhost:8888

Referencias

2011/06/03

XAMPP en Ubuntu

XAMPP empaqueta Apache, MySQL, PHP y otros programas que se suelen usar en programación web.

Instalar y usar XAMPP para desarrollo me ha venido resultando una alternativa más práctica que buscar/instalar/configurar cada uno de sus componentes por separado.

Para instalar XAMPP en Ubuntu se pueden seguir las instrucciones para el caso Linux, que aparecen en el sitio de ApacheFriends: http://www.apachefriends.org/en/xampp-linux.html.

Básicamente, consiste en descargar el tar.gz de la versión que se desea y extraer el contenido a /opt.

En mi caso, se trata de instalar XAMPP 1.7.1, que es la versión compatible con Drupal 6.
  • Descargo xampp-linux-1.7.1.tar.gz (http://sourceforge.net/projects/xampp/files/XAMPP%20Linux/1.7.1/).
  • Abro una consola de comandos y cambio a usuario root:
    sudo -s
  • Extraigo el contenido del tar.gz a /opt:
    tar -xvzf xampp-linux-1.7.1.tar.gz -C /opt
  • Para iniciar xampp:
    /opt/lampp/lampp start
  • Para detener xampp:
    /opt/lampp/lampp stop
  • Para establecer contraseñas (que se recomienda por seguridad):
    /opt/lampp/lampp security
Se puede observar que el comando es lampp. Ese era el nombre que ApacheFriends le había puesto. Sin embargo, es xampp para Linux.

Panel de Control
Para tener un panel de control similar al que estaba disponible en Windows:
  • En la consola de comandos:
    sudo gedit ~/.local/share/applications/xampp-control-panel.desktop
    En este caso uso gedit, pero también se pudo haber invocado otro editor de texto, como nano o vi.
  • En el editor de texto:

    [Desktop Entry]
    Comment=Start and Stop XAMPP
    Name=XAMPP Control Panel
    Exec=gksudo python /opt/lampp/share/xampp-control-panel/xampp-control-panel.py
    Icon[en_CA]=/usr/share/icons/Humanity/devices/24/network-wired.svg
    Encoding=UTF-8
    Terminal=false
    Name[en_CA]=XAMPP Control Panel
    Comment[en_CA]=Start and Stop XAMPP
    Type=Application
    Icon=/usr/share/icons/Humanity/devices/24/network-wired.svg
    

Después de eso, podrá encontrar una nueva opción en el menú: Applications/Other/XAMPP Control Panel.

Moviendo Dropbox

Hace algún tiempo que vengo usando Dropbox, el programa que facilita la sincronización de una carpeta en nuestro disco con otra en dropbox.com

De ese modo, los archivos que tenga en el dropbox de la computadora de la casa se sincronizan con el de dropbox de Internet y luego con el dropbox de la computadora de la oficina. Es como la idea del USB, pero automático.

Ahora que estoy empezando a trabajar con Ubuntu Linux, noté que Dropbox ha cambiado el nombre de su directorio por default. Antes se llamaba "My Dropbox" y había muchas quejas por eso en los foros. Ahora se llama simplemente "Dropbox". Es decir, que si elige que su directorio para dropbox esté en /home/rulo, por ejemplo, entonces el directorio de dropbox será  /home/rulo/Dropbox.

Como uso Linux al lado de Windows, y el disco de Windows es visible desde Linux, me parece buena idea que el dropbox que instale en Linux apunte al mismo directorio que el que tengo instalado en Windows.

Pero alli el directorio es "My Dropbox". Pensé que podría usarlo pero no, dropbox insiste en que el directorio se llame "Dropbox". Entonces, entré a Windows, fui a la configuración de dropbox e indiqué mover el directorio a una nueva ubicación. En micaso, elegí el directorio C:\Users\compaq, de modo que el nuevo directorio de dropbox es C:\Users\compaq\Dropbox.


Advertencia
Luego de esto fui a Linux e indiqué a dropbox que use la misma carpeta que Windows. Empezó por eliminar todo el contenido (!!!) y luego procedió a descargar lo que tenia en Internet.

Tome sus precauciones. Una mejor alternativa sería tener una copia del dropbox en otra carpeta y, luego de instalar dropbox, pausar la sincronización, pasar a mano los archivos, y reiniciar la sincronización. Quizás así se ahorraría tiempo en la sincronización inicial.

2011/06/01

Ubuntu Natty Narwhal con Windows 7

Hoy he instalado Ubuntu Natty Narwhal (ubuntu-11.04-desktop-i386.iso) junto a Windows 7, que ya estaba instalado. Aunque no ha sido tan fácil como parecía.

Intro
La PC de la oficina es una Compaq Presario CQ5310LA PC, con Windows 7 instalado de fábrica. Hace muchos años, en otra oficina, habitualmente usaba RedHat o Suse, pero recientemente la he pasado más con Windows XP y Windows 7.

Cuando necesito hacer alguna tarea en el servidor Linux, abro un terminal con Putty. Si quiero experimentar alguna aplicación Linux, puedo usar VMWare o VirtualBox para instalar allí alguna distribución.

Me gusta mucho la opción de la virtualización con VMWare o VirtualBox pero, si no hay mucha memoria,  todo el sistema se vuelve bastante lento.

Viendo a los amigos de la comunidad Drupal Perú usando Linux y, considerando los temas que me gusta investigar, me animé a dar el salto para volver a usarlo más intensivamente.

Sin embargo, hay algunas cosas de desarrollo web para las que tengo herramientas habituales en Windows. Así que lo tengo a la vuelta para cuando lo necesite, mientras voy desarrollando alternativas.

No tan fácil como parecía
No es la primera vez que instalo Ubuntu. Incluso antes he hecho una instalación dual con Windows XP. En aquella ocasión aprendí que a veces el sistema de arranque de Windows y el de Linux se cruzan y hay que hacer algunas correcciones luego del proceso.

Esta vez, vi con agrado que había una interfaz incluida en el proceso de instalación para cambiar el tamaño de la partición Windows existente para hacer espacio a la nueva partición para Ubuntu. Además, no requería de ninguna operación previa de defragmentación. Supuese que era una señal de que el proceso sería más facil ahora, pero no fue así.

Puse el instalador en un USB (usando Lili USB Creator) y reinicié el sistema para arrancar desde ahí.

En el proceso de instalación, el reparticionamiento fue casi automático. Indiqué 50 GB para la nueva partición Linux. Luego continuó bien pero, casi al final, falló por alguna razón. Un mensaje de error irrecuperable. Reinicié el proceso.

La segunda vez hice el proceso desde el escritorio del Live CD. Ya no ocurrió el error irrecuperable y la instalación se completó, pero tardó bastante tiempo la descarga de los archivos de actualización y otros. Quizás hubiera dejado esa opción para después. Sin embargo, como estaba en el escritorio, podía navegar mientras esperaba :)

Cuando reinicié, esperaba que apareciera el menú de inicio de Grub (usado para iniciar Linux), pero la pantalla se quedó en negro, con el rectángulo que muestra el monitor cuando no recibe ninguna señal.

Probé reiniciar varias veces, sin resultado. Felizmente hice backup, pensé.

Por si acaso, repetí el proceso de instalación. Para no descargar las actualizaciones, desconecté el cable de red y así fue un poco menos el tiempo. Pero el resultado fue el mismo.

Felizmente, usando el navegador de archivos del Live CD podía comprobar que los archivos de Windows estaban allí. El problema era que se había perdido el arranque.

Hice un disco de rescate en otra máquina que también tiene Windows 7 y seguí el procedimiento de reparar el sector de inicio. Reinicié, pero seguía igual.

Una esperanza
Entonces, cruzado de brazos, vi como después de casi un minuto, en la pantalla apareció Ubuntu. Al parecer, el sistema si iniciaba, pero con un Grub silente. Sin Grub, ¿cómo escoger la opción de iniciar con Windows?

Investigando, encontré una solución para corregir el inicio perdido de Windows. Consiste en usar el disco de rescate para iniciar una consola y desde allí ejecutar:

bootrec /fixmbr
bootrec /fixboot

Funcionó y se inició Windows 7 normalmente.

Más o menos
Ahora, para tener un acceso a Ubuntu iba a intentar tratar con Grub, pero antes probé bajar el utilitario EasyBCD, que había visto mencionaban en los foros.

Allí, modifiqué el menú de inicio, agregando un nuevo item para sistema operativo Linux, tipo de inicio Grub2 (el usado por Ubuntu 11). Salve los cambios y reinicié.

Esta vez, apareció un menú de inicio provisto por Windows. Elegí Ubuntu. La pantalla se puso negra y, luego de un rato, apareció Ubuntu.

Corrigiendo el menú de Grub
Encontré una solución al problema de la pantalla negra antes de Ubuntu. Al parecer, no se estaba presentando bien el menú de grub. En la consola ejecuté:

sudo gedit /etc/default/grub.conf

Para editar el archivo de configuración de grub. En lugar de gedit también se puede usar otro editor, como nano.

En grub.conf, localizar la línea #GFX640x480 y descomentarla, de modo que queda:

GFX640x480

A continuación:

sudo update-grub

Al reiniciar la máquina, aparece primero el menú de inicio de Windows (el que configuré con ayuda de EasyBCD). Si elijo Ubuntu, aparece el menú de inicio de Grub. Bien.

Restableciendo el arranque de Grub
Quizás se podría simplificar el pasar primero del menú de inicio de Windows al menú de inicio de Grub.

Se puede conseguir reinstalando el menú de inicio Grub:

sudo grub-install /dev/sda

En mi caso, /dev/sda es el disco donde se coloca el inicio.

Al reiniciar la máquina, aparece primero el menú de inicio de Grub. Si elijo Windows, aparece el menú de inicio de Windows. Tiene sentido.

Para que no aparezca el menú de inicio de Windows, uso EasyBCD para quitar la opcion Ubuntu y además indicar que omita el menú de inicio.

Una vez hecho esto, al reiniciar la máquina, aparece sólamente el menú de inicio de Grub, desde donde se puede elegir Linux o Windows.

En resumen
Para instalar Ubuntu (11, Natty Narwhal) junto a un Windows 7, ya instalado:

  • No es necesario reparticionar el disco antes de correr el instalador de Ubuntu. Tampoco es necesario defragmentarlo.
  • Ejecutar el instalador de Ubuntu, eligiendo la instalación lado a lado, junto al Windows 7 existente e indicando el tamaño de la partición destinada a Ubuntu. Un mínimo recomendable suele ser 20 GB. Yo elegí 40 GB, pero puede ser tanto como se quiera.
  • Sí, luego de ejecutar la instalación, no se ve ningún menú que permita elegir qué sistema iniciar, aguardar un poco. En mi caso, me parece que luego de 30 segundos, se iniciaba Ubuntu.
  • Para corregir la falta de visualización del menú de inicio de Grub, editar el archivo /etc/default/grub.conf y descomentar la linea #GFX640x480.

Referencias