Cada vez menos trabajo para humanos

Hace poco escribí un post bajo el título "Desempleo mal endémico del mundo" en el cual comentaba como el desempleo ha pasado a ser algo estructural en los países desarrollados como Estados Unidos, Japón o Europa; esto es debido en parte a la automatización de casi todos los trabajos imaginables, como acostumbra a decir Niño Becerra, cada vez se necesitará menos factor trabajo.

Hasta hace poco uno de los reductos en los cuales la mano de obra poco calificada era necesaria en grandes números era en los grandes almacenes que despachaban productos, por ejemplo grandes tiendas virtuales como Amazon, Tigeridrect o Newegg no poseen tiendas de ladrillo y cemento, sino que una página web ha reemplazado a una inversión millonaria en locales comerciales y a miles de vendedores de carne y hueso con un salario mensual. Sin embargo aún estas tiendas online necesitan de grandes almacenes donde guardar la mercadería y procesar las ordenes para su despacho a los clientes, este proceso hasta ahora era intensivo en mano de obra debido a que requería que un humano se desplazara a lo largo de los anaqueles colectando los productos de cada orden, con lo cual procesar un pedido tomaba tiempo. Eso era hasta ahora, Kiva System acaba de presentar un revolucionario sistema de robot anaquel que multiplica por tres la productividad, lo que en términos menos diplomáticos quiere decir las empresas podrán reducir su pesonal en 2/3 o lo que es lo mismo en un 67%.

La idea es simple en lugar de que los obreros vayan hacia los anaqueles, los anaqueles van hacia los obreros en función al tipo de orden que deben de llenar permitiendo un sistema de flujo contínuo de las ordenes. Parece de ciencia ficción verdad, pero lamentablemente para miles más que iran a la calle producto de este avance tecnológico es más pavoroso que maravilloso. Ojo no quiero decir que este en contra de que las empresas quieran ser más eficientes y despliguen nuevas tecnologías, sólo digo que este avance tiene consecuencias sociales que no debemos pasar por alto.

Aquí les dejo el video de demostración del producto que ha lanzado Kiva System para promocionar su producto:

 

 

iPad y el salto al pasado

El iPad fue anunciado a finales de enero, cuando Apple hacia frente a una contínua caída en las ventas de iPods, las ventas de Macs estaban estancadas y la rápida adopción de Android entre los operadores celulares de U.S.A. amenazaba su único producto que aún se vendía bien el iPhone. Luego del anuncio oficial de iPad escribí un post titulado "¿iPad? No gracias", en el cual criticaba muchos de los grandes errores de diseño que Apple había cometido con este producto, más fruto de la necesidad de presentar "algo nuevo", que de una genuina vocación de innovación.

Lo lamentable es que el producto final presentó más problemas que lo que cualquiera hubiera previsto, muy aparte de las fallas técnicas como los problemas con wifi que se han reportado en los foros de apple y que los medios masivos simplementen han ignorado, durante su alavanza al nuevo producto que cambiará las reglas de juedo del sector. Sin embargo hay otro problema aún mayor del cual muy pocos están hablando y que está relacionado con la filosofía del iPad como un producto para el "consumo" de contenidos pero no para la producción de los mismos. Desde esa perspectiva funcionalmente un iPad sería el paso siguiente a un televisor, pero un paso hacia atras de una computadora personal como la conocemos.

Dejenme explicarme con mayor detalle, el iPad es en el fondo un TV que permite cierta interacción al usuario respecto al contenido que quiere consumir, pero al igual que con la TV convencional el poder está del lado del productor de contenidos que puede cobrar lo que desea por sus contenidos debido a que no enfrenta ninguna competencia del contenido generado por los usuarios. Es decir este producto pretende llevarnos de vuelta a los ochenta. Es debido a eso en mi punto de vista y no a sus bondades técnicas que todos los medios convencionales están dispuestos a apoyar incondicionalmente a Apple en esta aventura de convencer a los consumidores que se puede ser feliz dentro de un redil.

Una de las estrategias de Apple para llevar a los usuarios de vuelta al pasado, es el modelo de aplicaciones a medida para acceder a algún contenido, en lugar de jugar bajo las reglas de los estándares para distribuir contenidos en la web que han sido producto de la decisión de los consumidores y no impuesta a fuerza de publicidad y de control de plataforma como ocurre con Apple. Claro que desde el punto de vista de los colosos de los medios, la estrategia de Apple en la cual les otorga la posibilidad de cerrar todo el consumo de los contenidos producidos por ellos a una aplicación que ellos mismos pueden crear para asegurarce de que no exite manera de copiar y redistribuir contenido suena como la panacea para una industria que está en fase terminal.

Es más por está posición de plataforma cerrada que creo que Apple no crecerá más alla de su grupo de fanáticos, aquellos que compraban Macs incluso cuando Jobs no estaba en Apple y que permitieron que la compañía sobreviviera durante sus peores años. Los nuevos, aquellos que usan PC’s con iPods o iPhones, no seguiran a Apple en este despropósito de volver a un pasado lleno de limitaciones.

Cómo configurar un repositorio Mercurial con Apache

Una de las herramientas de control de versiones más fáciles de aprender y utilizar, a la vez que nos ofrece flexibilidad y potencia es Mercurial, que es un software Open Source con lo cual nos ofrece los beneficios de un costo bajo de implementación y la posibilidad de modificarlo en caso de que necesitemos cambios.

Para aquellos que no saben que es un sistema de control de versiones pueden leer este estupendo tutorial de Joel Spolsky HgInit, en el cual de paso aprenderan como utilizar Mercurial a nivel de usuario.

Si tiene planeado seguir este howto, debe considerar que lo he escrito teniendo en mente Debian Lenny, aunque en teoría puede ser usado con cualquier distribución de Linux, asumo además de que está familiarizado con apache y sabe como editar archivos de texto.

Pues bien, comencemos. Lo primero que debemos hacer es instalar Mercurial, para ello como usuario root debemos ejecutar este comando:

# apt-get install python python-dev mercurial

Con este sencillo paso ya tenemos instalado Mercurial en nuestro sistema, pero no nos permite exportar los repositorios a través del apache, para ello necesitamos un script llamado hgwebdir.cgi que ya está en nuestro sistema pero escondido dentro de la documentación de Mercurial que instaló Debian.

Comencemos pues a configurar nuestro apache para que exporte los repositorios a través de una conexión SSL, a la vez que nos permita hacer un "push" directamente al repositorio a través del apache.

Debemos crear un directorio donde estarán nuestros repositorios (todo esto como usuario root):

# mkdir -p /var/hg/repos
# touch /var/hg/hgweb.config
# chown -R www-data:www-data /var/hg

Ahora debemos de editar el archivo /var/hg/hgweb.config y poner dentro de él lo siguiente:

[collections]
repos/ = repos/

[web]
style = gitweb

Ahora necesitamos copiar el script que hará la magia de administrar los repositorios a través del apache:

# cd /var/hg/
# cp /usr/share/doc/mercurial/examples/hgwebdir.cgi ./
# chown www-data:www-data ./hgwebdir.cgi
# chmod +x ./hgwebdir.cgi

Lo siguiente que haremos será crear el archivo /etc/apache2/hg/main.conf

# mkdir /etc/apache2/hg
# touch /etc/apache2/hg/main.conf

En el interior de dicho archivo debemos de poner las siguiente líneas:

AddHandler cgi-script .cgi
ScriptAliasMatch      ^/hg(.*) /var/hg/hgwebdir.cgi$1
<Directory "/var/hg">
  Options FollowSymLinks +ExecCGI
  AllowOverride All
  Order allow,deny
  Allow from all
</Directory>

Asumiendo de que tiene apache2 con soporte para SSL exitosamente instalado (si no lo tiene aún puede usar este tutorial), sólo debemos de editar el archivo /etc/apache/sites-available/default-ssl y agregar la siguiente línea antes de las directivas que habilitan el SSL:

Include /etc/apache2/hg/main.conf         <– Linea que debe añadir

#   SSL Engine Switch:                    <– Referencia de donde debe insertar
#   Enable/Disable SSL for this virtual host.
SSLEngine on

Estamos listos para comenzar a utilizar nuestro repositorio, sólo necesitamos reiniciar el apache, para ello usamos el comando:

# /etc/init.d/apache2 force-reload

Desde este comento podemos comenzar a utilizar nuestro repositorio de Mercurial.

Para crear un nuevo repositorio, sólo debemos de utilizar el comando:

# su – www-data -c "hg init /var/hg/repos/<nuevo repositorio>"

Si deseamos configurar quieres pueden hacer "push" en el directorio debemos de crear el archivo /var/hg/repos/<nuevo repositorio>/.hg/hgrc y en el podemos configurar de acuerdo a nuestra conveniencia lo siguiente:

[web]
contact = Volkan Rivera
description = mi primer repositorio de Mercurial
allow_push = user1, user2, user3

# Habilita la descarga de último snapshot en forma comprimida
allow_archive = gz zip bz2

Para habilitar las contraseñas que permiten a los usuarios acceder al repositorio y publicar (push) código al repositorio, debemos usar el móduco mod_auth de apache y su configuración a través de .htaccess, aquí los detalles.

Y es todo, con estos sencillos pasos ya tenemos funcionando nuestro repositorio de Mercurial a través del apache (accesible a través de https://server.name.com/hg), para que todo nuestro equipo de desarrollo pueda utilizarlo a tavés de internet y de forma segura. Espero que les haya sido de utilidad a la vez que agradezco anticipadamente sus críticas y comentarios.

Usando Google Spreadsheet como base de datos

Google ofrece un API para poder manipular directamente el contenido de sus hojas de cálculo en Google Docs, si reparamos en los detalles y la posibilidad de que pueden ser grabas, actualizadas, borradas y recuperadas filas específicas de una hoja de cálculo en particular, pues resulta evidente de que sería posible utilizar dicho API para usar las hojas de cálculo de Google Docs como un sencillo motor de base de datos.

Buscando encontré en el blog "farinspace web" una librería de PHP que permite manipular fácilmente hojas de cálculo de Google Docs, el nombre es Google_Spreadsheet, aunque no es muy imaginativo refleja claramente su finalidad. Luego se me ocurrió usarlo para una aplicación de ejemplo el clásico guessbook, pero eso requeriría la administración de login y perfiles, entonces se me ocurrió mezclarlo (hacer un mushup) con Facebook Connect. De esa forma la administración de la identidad se hace con el Facebook Connect y el registro de los comentarios se haría usando Google SpreadSheet. En pocas palabras lo único que se tiene localmente es el programa, todo los datos estarían en la red.

He preparado un pequeño server virtual con el ejemplo, que puede ser accedido en este URL. El código listo para desempaquetar y usar puede ser descargado desde este otro URL. Lo único que necesita hacer para probarlo es decargarlo en un server con soporte de PHP 5.2 o superior, tener una cuenta en Google Docs y registrar su aplicación en Facebook (más detalles sobre como registrar una aplicación en Facebook pueden ser contradas aquí). Con las credenciales del caso debe editar el archivo "config.php" de la siguiente manera:

<?

  $api_key  = "abcdefghijklmnopqrstuv0987654321"; <- API Key de Facebook
  $secret   = "1234567890abcdefghijklmnopqrstuv"; <- Secret word de FB
  $username = "user@gmail.com";             <- Usuario Google Docs
  $password = "123456";                      <- Password usuario Google Docs

?>

Con esos sencillos cambios debería de funcionar el script que pongo a disposición. Ojo esto es una prueba de concepto, no está cuidada la estética, y todo el código son dos scripts PHP monolíticos. Es decir este script tiene propósito educativo y no recomiendo su uso en entornos de producción.

Los detalles sobre Facebook Connect pueden ser revisados en la wiki de Facebook, por simplicidad en este post me limitaré a enfocarme en el uso de la librería Google Spreadsheet, en caso de que alguien esté interesado en un tutorial detallado sobre Facebook Connect, pues haganmelo saber en los comentarios, si veo que hay suficiente interés dedicaré un tiempo a escribir uno.

A revisar entonces el código de "index.php" que nos permite leer datos desde una hoja de cálculo de Google Docs.

En esta parte inicializamos el objeto $ss (spreadsheet), e indicamos que deseamos usar la hoja de cálculo "comentarios" y la página "Sheet1", es importante tener presente que los nombres son case-sensitive:

(…)
    $ss = new Google_Spreadsheet($username,$password);
    $ss->useSpreadsheet("comentarios");
    $ss->useWorksheet("Sheet1");

(…)

En esta parte asignamos a la variable $rows, todas las filas que tengan un campo "id" mayor que cero, dado que usaremos la función time() para general el campo "id", este es un número entero mayor que cero siempre. Luego con la función sizeof() obtenemos el número de filas que han sido leídas y usaremos la variable $start para acceder a ellos desde el último insertado:

(…)
    $rows = $ss->getRows("id>0");
    $size = sizeof($rows);
    $start = $size – 1;
    $count = 0;

(…)

Usamos el bucle while() para leer los diez últimos elementos del array que la función getRows() nos provee y los representamos a través de una tabla:

(…)
    echo '<hr>Diez &uacute;ltimos comentarios:<br /><br />';
    echo '<table>';
    while(($start>=0) && ($count<10)) {
         $row = $rows[$start];
        
         $nombre = $row[‘nombre’];
         $apellido = $row[‘apellido’];
         $avatar = $row[‘avatar’];
         $comment = $row[‘comment’];
         echo '<tr><td valign="top">' . '<img src="' . $avatar . '"><br />' . $nombre . '<br />' . $apellido . '<br /></td>';
         echo '<td valign="top" width="300">' . $comment . '</td></tr>';
          –$start;
          ++$count;
    }
    echo '</table>';

(…)

Como veran el algoritomo es bastante sencillo y sólo nos muestra los últimos 10 comentarios dejados en el guessbook. Ahora si queremos dejar comentarios debemos estar logueados, para ello se debe disponer de una cuenta válida en Facebook.

El script que agrega una fila a la hoja de cálculo de Facebook se llama "addrow.php" y para asegurarnos de que no puede ser usado directamente por alguien, lo primero que hace dicho script es ver si el usuario está logueado en Facebook, de estarlo lee los siguientes datos de su perfil: $nombre, $apellido, $avatar (la foto). Si no está logueado es redirigido a "index.php".

Finalmente si el usuario esta logueado y ha enviado un comentario, entonces el siguiente código se ejecuta:

(…)
      $ss = new Google_Spreadsheet($username,$password);
      $ss->useSpreadsheet("comentarios");
      $row = array (
                  "id" => time(),
                  "nombre" => $nombre,
                  "apellido" => $apellido,
                  "avatar" => $avatar,
                  "comment" => $comment
             );

      if ($ss->addRow($row)) {
         /* Si se puede agregar la fila exitosamente regresa a la pagina principal */
         $url = 'http://' . $_SERVER[‘SERVER_NAME’] . "/index.php";
         header("Location: $url") ;
      } else {
         /* Si se produce un error, nos alerta del mismo */
         echo "Error, lo sentimos pero su comentario no ha podido ser grabado.n";
      }     

(…)

Es decir creamos un objeto $ss, especificamos con que hoja de cálculo deseamos trabajar con la función userSpreadsheet() y con la función addRow() podemos escribir el contenido del array $row en la hoja de cálculo llamada "comentarios", de ser exitosa dicha operación somos redirigidos a "index.php", caso contrario se nos presenta un mensaje de error para darnos a saber de que por alguna razón el registro no pudo ser grabado en la hoja de cálculo.

Este tipo de solución es útil por ejemplo si deseamos utilizar Google App Engine con PHP. Como comenté el año pasado es posible usar PHP en App Engine a través del servlet Quercus. Sin embargo no se puede acceder directamente a BigTable desde una aplicación PHP implementada de esta manera, pero la libreria "Google SpreadSheet", debería de funcionar sin problemas en Quercus. Existen varias otros posibles escenarios en donde este tipo de soluciones serían utiles como por ejemplo hosting gratuitos o sencillamente formularios web que llenan directamente una hoja de cálculo que luego puede ser compartida por los empleados de la compañía.

Si alguien utiliza este tipo de solución en algún proyecto le agradecería que nos lo haga saber en los comentarios.

¿Más problemas con vboxdrv y Ubuntu 8.04?

UPDATE: Ubuntu 8.04 hoy (14 de diciembre de 2009) ya ha actualizado apropiadamente el paquete de módulos y aplicar este truco no es necesario.

Hace ya casi un mes publiqué un post titulado "¿Problemas con vboxdrven Ubuntu 8.04?" y en el describía como solucionar el problema generado luego de actualizar al último kernel en ese entonces el 2.6.24-25; sin embargo el martes pasado otra vez el sistema actualizó a un nuevo kernel, esta vez a la versión 2.6.24-26. Tras lo cual nuevamente se presentó el mismo problema con VirtualBox.

Busque si alguien había subido el parche en Launchpad, pero al parecer nadie lo ha hecho aún. Razón por la cual tuve que aplicar un parche rápido que detallo líneas más abajo. Todo el truco se basa en que los kernels son casi los mismos, y no se ha desinstalado el kernel anterior. Por lo tanto todas las librerías dinámicas deberían de aún continuar alli. La idea es simplemente agregar el módulo de la version antigua a mano e iniciarlo manualmente.

Estos son los pasos que necesita seguir:

$ cd /lib/modules/2.6.24-26-generic/
$ sudo mkdir misc
$ cd misc
$ sudo cp /lib/modules/2.6.24-25-generic/misc/vbox* ./
$ sudo insmod vboxdrv.ko

Esto es para asegurarnos que el módulo ha sido cargado a memoria:

$ lsmod | grep vbox

Esto es para reiniciar el vboxdrv en VritualBox:

$ sudo /etc/init.d/vboxdrv start

Ahora ya deberíamos de poder iniciar nuestras máquinas virtuales. Espero que este pequeño tip les sea de utilidad.