2011 un año de cambios

Este 2011 inicia con un CES (Consumer Electronics Show) lleno de novedades, primero Microsoft ha dejado luego de mucho tiempo de actuar a la defensiva (ha reconocido que el monopolio que ejercía sobre el mercado ha terminado) y ha pasado a la ofensiva para recuperar todo el terreno perdido, un buen ejemplo ha sido Kinect, pero por otro lado tenemos el anuncio oficial de que la próxima versión de Windows correrá sobre procesadores ARM, con lo cual acepta que la era PC está llegando a su fin y la nueva forma que tomarán las computadoras será la de una tablet o un teléfono celular. Pero las novedades no termina alli, Facebook romperá la barrerá de los 500 accionistas este año 2011 y a más tardar el 1 de mayo del 2012 tendrá que presentar de manera pública su balance contable, todo esto independientemente de que el trato realizado con Goldman Sachs sea observado por la SEC (Securities and Exchange Commission) o no, según me he enterado por Business Insiders. Ojo, el que tenga que presentar sus balances contables de manera pública no significa que tendrá que inciar una oferta pública de acciones en la bolsa de valores, de forma que cualquier pequeño inversionista pueda comprarlas, sólo significa que por fin sabremos realmente cuánto es el monto de dinero que le reporta a Mark Zuckerberg el colectar y vender a anunciantes nuestra información privada.

En el mismo CES, Google nos ha presentado a Honeycomb (aka Android 3.0), el primer sistema operativo orientado a tables y Motorola aprovechando la atención generada nos ha mostrado el primer supertablet con procesador de dos núcleos y la nueva versión de Android llamado Xoom. Amazon prepara el lanzamiento de su propio App Store, y ya está invitando a los desarrolladores a que se unan al mismo a través de una suscripción de $99 anuales (el primer año es gratis). Me pregunto por qué tendría que pagar $99 al año para que mis aplicaciones aparezcan en el Amazon App Store, si pagando $35 por única vez, se pueden publicar aplicaciones en el Android Market de Google y mis aplicaciones aparecerían tambien en Amazon, además no tendrían que pasar por el proceso de aprobación de Amazon, sino que inmediatamente estarían disponibles. En fin veamos que se les ocurre a los marketeros de Amazon para convencernos que que compartir nuestra ganacias con ellos es mejor.

Lo único malo de este 2011 para mi por lo menos, es que aún los usuarios de Nexus One no tenemos el Android 2.3 en nuestros celulares, parce que Google está prestando más atención a quitarle el mercado de las tablets a Apple que a seguir actualizando su propio celular introducido hace apenas 1 año.

Aquí les dejo un videito que encontré sobre como luce Gmail en Android 3.0, realmente sorprendente:

 

 

El ascenso del Programador Ciudadano

Con la llegada de los blogs y el nacimiento de la web 2.0 llegó lo que muchos han llamado el "periodismo ciudadano", es decir cualquiera con acceso a Internet puede crear un blog y comentar algún tema de actualidad o hacer una denuncia, sea esta fundada o no. Lógicamente los periodistas en un principio ignoraron todo este movimiento y lo llamaron chime 2.0, siete años después todo medio de prensa que se respete tiene ahora una sección de blogs, que suele ser la más leída de sus secciones web.

Muy bien desarrolladores de aplicaciones, ya sean estas de escritorio, web o de móviles, preparence que el "programador ciudadano" (en inglés Citizen Developer) ha llegado y amenaza con crear el mismo tipo de caos que crearon los peiodistas ciudadanos. Según un informe de Gartner Group publicado hace un año, se espera que para el 2014, el 25% (una de cada cuatro) aplicaciones habrá sido escrita por un programador ciudadano. Vista la actual aparición de herramientas que permiten crear aplicaciones completamente funcionales y casi sin escribir una sóla línea de código como pueden ser App Inventor, Application Craft o Appcelerator Titanium, alguien podría pensar que Gartner es muy conservativa en sus proyecciones y ese número podría ser alcanzado antes.

 Pero que es un programar ciudadano o como entiende Garnet el término, pues del documento presentado por ellos extraigo esto:

"Future citizen-developed applications will leverage IT investments below the surface, allowing IT to focus on deeper architectural concerns, while end users focus on wiring together services into business processes and workflows,” said Eric Knipp, senior research analyst at Gartner. “Furthermore, citizen development introduces the opportunity for end users to address projects that IT has never had time to get to — a vast expanse of departmental and situational projects that have lain beneath the surface"

Es decir en teoría el programador ciudadano es el usuario elevado a la categoría de desarrollador, para ello debe contar con herramientas 100% gráficas que le permitan abordar el desarrollo de aquellas aplicaciones que necesita para automatizar su labor diaria y dejar al departamento TIC a cargo sólo de la infraestructura, liberandolo del desarrollo de apliaciones pequeñas que por lo general nunca son atendidas.

Esta no es la primera vez que escucho este tipo de pronosticos, recuerdo que cuando apareción dBase II y luego dBase III, una nueva generación de "desarrolladores" apareció en las empresas, claro todos ellos con muy poca formación en los fundamentos de la programación y que dejaban mucho que desear tanto en el diseño de las aplicaciones, como en la seguridad de las mismas. Pero la masa de programadores aumentó.

Luego con la llegada de Windows y VisualBasic, otro gran número de "desarrolladores" se sumo a la mezcla. Otra vez, los mismos problemas de falta de criterios en el diseño de las estructuras internas de las aplicaciones y de los datos que daban sustento a las aplicaciones, así como muy pobres estándares de seguridad.

En fin en cierta forma, los problemas de este tipo de aplicaciones desarrolladas por usuarios con herramientas de programación fáciles de usar, estaban circunscritos a un entorno local. El desarrollador ciudadano ahora aspira a crear aplicaciones web accesibles por casi todo el mundo, así que cuando esto llegue ya me imagino explicandole a un programador ciudadano que significa "escalabilidad".

Lo que es inevitable es que el programador ciudadano llegue y lo cambie todo, los factores que lo traeran al mundo TIC, son cuatro:

  • Personalización en masa: El programador ciudadano sabe cómo personalizar una solución a sus propias necesidades y preferencias. Piense en su cuenta de facebook, lo más probable es que usted ha tomado todos los componentes de Facebook (o sus partners) y ha compuesto una página que ofrezca una solución que satisfaga sus necesidades e intereses personales. En una sola plataforma hay 500 millones de soluciones facebook diferentes – ¡todos creados por los programadores de los ciudadanos!
  • Computación en la nube: En los viejos tiempos que se necesitan para instalar y configurar tus propios servidores y bases de datos, así como la infraestructura de red, incluso antes de que pudiera empezar a pensar en la aplicación real que se va a construir. Con la disponibilidad de recursos en todas partes de la nube que hay hoy en día, un programador ciudadano se pueda concentrarse en la funcionalidad empresarial que desee para la aplicación que planea desarrollar y no tener que preocuparce acerca de la versión de la base de datos es necesario instalar. Un gran libro que ayuda a comprender el impacto de la computación en la nube antes de que fuera llamada computación en nube fue  "The Big Switch" por Nicalas Carr.
  • Los cambios en la demografía: Como resultado de la jubilación de los baby boomers, y la maduración de los "nativos digitales" significa que la fuerza de trabajo  espera una tecnología para el consumismo de la misma tecnología, por lo tanto no es una tendencia de estas personas a "es sólo trabajo", es su forma de vida.
  • La evolución de herramientas: Como consecuencia de la mejora continua de las herramientas de desarrollo y su facilidad de uso, los programadores ciudadanos pueden crear aplicaciones de negocio cada vez más complejas sin tener que depender de los siempre escasos recursos del departamento TIC.

Así que si eres programador o tienes una empresa que se dedica sólo al desarrollo de aplicaciones, preparate porque vas a descubrir que sintieron los periodistas y los periódicos con la llegada de la web 2.0. Y los que son cyberdelincuentes, estarán de plácemes con la proliferación de aplicaciones de pobre diseño y peor seguridad.

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.

La guerra por la supremacía en la web

En las últimas semanas nos han querido vender la idea de una guerra entre Apple y Google, que el blog Gigaom resume en una infografía bastante interesante o la rivalidad entre Microsoft y Google por dominar el mercado de los buscadores, que también ha llenado las líneas de innumerables posts. Son las batallas que la gran mayoría piensa definirán al nuevo rey del sector TIC. Es sin embargo la furiosa rivalidad entre Google y Facebook, la que durante los próximos años, según mi criterio, cambiará el panorama de las TIC de manera irreversible.

Microsoft, Apple, Intel, Nokia o Motorola, son todas corporaciones preparadas para luchar en un entorno industrial, donde la idea es producir en grandes volúmenes. Sin embargo grandes volúmenes de producción requieren grandes volúmenes de consumo, de no ser así el dinero invertido en la producción no puede ser recuperado. Un fenómeno externo al sector TIC como lo ha sido el credit crunch de finales del 2008, ha transformado la mentalidad y ahora menos significa más. El éxito en ventas de las netbooks y de las laptops de menos de $500 son una expresión de que el mercado se ha vuelto bastante sensible al precio. Es esa la razón por la cual el Nexus One, no se ha vendido tan bien como el iPhone o el Droid, básicamente porque a $530 cada unidad sin contrato, está muy lejos del bolsillo del consumidor promedio americano en estos momentos.

En este nuevo mundo de escaso crédito, donde la maximización del poder de compra de cada dólar es la regla para sobrevivir, computadoras con múltiples núcleos o inmensas pantallas, son el equivalente a los SUV. Representan una elevada inversión incial y un alto costo de operación, para satisfacer una elemental necesidad de transporte. Pero cuando se trata de reducir costos, los CIO están ahora también evaluando no sólo el costo de los PCs en los escritorios, sino también los software que estos utilizan. Ya se cuestiona la necesidad de procesadores de texto, debido al hecho de que la mayor cantidad de veces se utilizan para producir documentos que son atachados a correos electrónicos, esto debido a las políticas de ahorro en suministros como papel y tinta para impresora.

El que viene será un mundo diferente al que conocemos, un lugar donde la busqueda de la eficiencia en cada eslabón de la cadena será un requisito para sobrevir, por lo tanto y como consecuencia de lo anterior, la tercerización de servicios jugará un rol central en las estrategias de reducción de costos. ¿Por qué Google y Facebook iniciaran una batalla para determinar quien se quedará con un mercado así?

En los últimos días una serie de noticias han removido las bases de lo que pensábamos eran las redes sociales, primero fue Facebook que anunció que crearía un servicio de correo eletrónico, luego Google presentó Buzz, que añadía capacidades sociales a Gmail, a costa se crear mucha ansieadad en sus usuarios respecto a la privacidad. Casi inmediatamente Google activó Webfinger para sus cuentas de gmail, que también son las cuentas que tienen Buzz. Webfinger es un protocolo que permite usar direcciones de correo para acceder a nuestros perfiles y servir de identidades digitales.

¿Por qué todo lo anterior es importante?, la respuesta es sencilla, aquel que controle las identidades digitales en la web será el nuevo rey del sector. Es por ello que Facebook ha firmado un acuerdo con AOL para permitir que los usuarios de Facebook y del mensajero instantáneo de AOL puedan chatear juntos. Es por ello que que Google está decididamente apoyando oAuth. En un mundo en donde todo servicio relacionado a las TIC se accederá a través de la web y de forma pay-as-you-go (pre-pago), la importancia de una identidad única e interoperatividad entre servicios será el factor clave. Es decir el proceso de login en todo servicio ofrecido en la web se volverá un commodity.

Permitanme explicarles el problema con un ejemplo, supongan que Uds. que son el CIO de una gran empresa con miles de PCs, ¿por qué sería complicado una migración a Google Docs?, pues si se consigue o se programa la herramienta para mover toda la "legacy data" de manera automática al nuevo servicio o se contrata a alguien para que haga eso, no debería revestir mayores inconvenientes. Sin embargo el gran problema de ese tipo de migraciones es la administración de contraseñas (identidades) a dicha escala. El otro problema es que una vez dentro de la red de Google, sería también otra inversión millonaria moverse hacia otra alternativa, digamos Zoho, y el costo estaría también en la administración de las contraseñas (identidades). Por el contrario, si los sysadmin no tienen que lidiar con la administración de las contraseñas y sólo necesitaran saber los "usernames", que se convertirian en las identidades digitales de los usuarios, el trabajo se simplificaría enormemente.

Es por ello que tanto Facebook y Google, desean ser su única solución para su identidad en línea, ya que cotrolando el punto de validación en la web, pueden controlar todo el mercado de SaaS (Software as a Service). Sólo el servir de intermediario de micro-pago reportaría miles de millones de dólares anuales sin tener que asumir casi ningún riesgo. El premio es muy jugoso como para no tomarlo en serio y las únicas dos empresas, por el momento, que están tratando de conseguir el control de ese estratégico punto son Facebook y Google.

Usando el API de bit.ly con CodeIgniter

Como habrán notado soy un fanático de CodeIgniter, un framework ligero, fácil de aprender, seguro y flexible que permite el desarrollo rápido de aplicacione web usando PHP. Esa es la razón por la cual lo uso para implementar muchas de las ideas que expono a lo largo del presente blog.

Pero, la razón de éste mini-tutorial de cómo usar el API de bit.ly, que es un servicio de redución de URL, es justamente por que he visto que Mashable, ahora muestra un numerito sobre el botón para hacer buzz de sus posts. Estuve leyendo la documentación del API de Google Buzz, con la clara intención de duplicar dicha funcionalidad en mi blog y lamentablemente encontré que no es posible encontrar el número de "buzzeadas" que un determinado website ha recibido. Al menos por el momento esa información no es accesible a través del API de Buzz. Entonces, ¿cómo han resuelto el problema la gente de Mashable?, acaso tienen un trato secreto con Google para usar funciones no documentadas que sólo han sido reveladas a ellos, a cambio de buena prensa. Pues la respuesta es menos paranoica. y ciertamente más propensa a errores. Mashable no está contando el número de veces que un artículo ha sido compartido en buzz, sino el número de clicks sobre un link de bit.ly. Una solución simple, aunque de cuestionable eficacia.

Bueno, ahora que ya sabemos el por qué, veamos el cómo.

Para poder usar el API de bit.ly dentro de CodeIgniter debemos de descargar la librería bitly-api-library-codeigniter, que está alojada dentro de los repositorios de proyectos Open Source de Google. Adicionalmente debemos crear una cuenta en bit.ly ya que con ella podremos obtener un API Key, necesaria para usar el API.

Luego de que descompacte el archivo zip que contiene la librería Bitly.php, la debemos colocar en system/application/libraries/,  luego editamos el archivo system/application/config/autoload.php y denemos agregar esta línea:

$autoload[‘libraries’] = array(‘Bitly’);

Ahora ya podemos usar la librería en nuestra aplicación. Supongamos que el nombre de usuario que registró en bit.ly es "usuarioprueba"  y que la clave (key) del API que  obtiene de bit.ly es "R_0da49e0a9118ff35f52f629d2d71bf07", entonces un ejemplo muy sencillo para obtener la estadística de cuantos clicks ha recibido un terminado enlace sería el siguiente:

<?php

class Stat extends Controller {

        function Stat()
        {
                parent::Controller();
        }

        function index()
        {
                $this->bitly->setKey(‘usuarioprueba’,
                                     ‘R_0da49e0a9118ff35f52f629d2d71bf07’);
                $URL = "http://bit.ly/14H1OB";
                list($protocol, $empty, $bitly, $hash)=split("/", $URL);
                $result   = $this->bitly->stats($hash);
                echo "<PRE>";
                print_r($result);
                echo "</PRE>";
        }
}

?>

Observer que estoy usando la función split de PHP para poder obtener sólo la última parte del URL, que es la que necesita el API para retornarnos la estadística del número de clicks que ha recibido el enlace. El resultado de la ejecución exitosa del código anterior sería este:

Array
(
    [clicks] => 6
    [hash] => 3VpSVv
    [referrers] => Array
        (
            [] => Array
                (
                    [direct] => 6
                )

        )

    [userClicks] => 2
    [userHash] => 14H1OB
    [userReferrers] => Array
        (
            [] => Array
                (
                    [direct] => 1
                )

        )

)

Como podrán observar, el valor que nos interesaría para implementar el contador de buzz es "clicks". Sumando esto a lo que ya he comentado en el post  "Si Mashable puede, ¿por qué yo no?" y un poco de JavaScript sería posible hacer un widget como el que está usando actualmente Mashable.