20 años programando

Por estar migrando a Paperclip (Ahora es Paperclip X10 SRL), casi me olvido de este detalle. Hace 20 años, recibí mi primera constancia de programador :)

Programador en Logo Avanzado. Wow. Recuerdo mi primera clase, cuando me senté frente a una IBM PC 5150 de monitor verde, que solo había visto en las revistas que mi padre coleccionaba. Quedé fascinado. Y la fascinación continua hoy, y seguirá en mí hasta el últimos de mis días. Cuando muera, quiero que incineren a Dorothy conmigo :)

Más tarde iré a buscar a mi profesora de Logo :)

Hackeando Jolicloud

Después de poco menos de año y medio con Hellboy, me di cuenta que casi no ejecutaba aplicaciones ahí. Lo que más hago es navegar por la Interweb, y conectarme a Dorothy para trabajar ahí. Entonces pensé que tener todo un Ubuntu 10.10 instalado era demasiado. Quería un Linux que  cargara “al toque”, y que sea liviano, sin tantos programas cargados, que no uso.

Ya había probado el Ubuntu Netbook Edition. Pero cuando lo probé, estaba esperando un Linux más completo… quizás por eso no quise volverlo a probar. Por ahí leí que Kubuntu era amigable a las netbooks. Lo instalé, y lo borré a la media hora, muy bloated.

Y llegué a Jolicloud.

Jolicloud es un nuevo sistema operativo “basado en la nube”, donde las aplicaciones son páginas web, como Google Docs y Facebook. En versiones anteriores, estuvo basado en Mozilla Prism, ahora usa un fork de Google Chromiun, llamado “Nickel” (y esto les suena un tanto irónico a los fans de Chrome OS, pero Jolicloud tiene una visible delantera en esta carrera).

Lo primero que me llamó la atención, era que el desktop está hecho con HTML5. Incluso puedes instalar la app en tu Chrome y darle una probada antes de instalarlo. Hace mucho tiempo que venía buscando cómo hacer eso, así que me animé a instalarlo.

La versión 1.1 está basada en Ubuntu Netbook Edition 10.04 (lo que es muy conveniente, ya que es un entorno familiar y tiene muchas aplicaciones en sus repos) e inicia muy rápido (con una splash screen animado guapo ;) )

Para el login usa SLiM, un login manager muy sencillo, ligero, y bastante configurable. Una vez iniciada la sesión (y registrado en su página web), aparece su dashboard:

Puedes sincronizar tu desktop con otra computadora, y ambos tendrá las mismas aplicaciones (incluso las tradicionales, como pidgin), así como otras aplicaciones.

Googleando un poco, encontré que el script /usr/bin/jolicloud-launcher es el responsable de lanzar el dashboard. En la línea 79 está esto:

my $OFFLINE_URL = "file:///usr/share/jolicloud-daemon/htdocs/index.html";

Que define la URL que debe de cargar cuando la PC está sin conexión a Internet (que en mi caso, es siempre, ya que la conexión a la red se da mucho después que todo el sistema ha iniciado). Entonces modifiqué este ficherito para que esperara la conexión a Internet, y redireccionara a una página web mia:

<!DOCTYPE html>
<html lang="en">
<head>
<title>Loading Jolicloud...</title>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="styles.css" />
<script>

URL='http://paris/pwp/';

function redirect() {
   setTimeout ( check, 1000 );
}

function check () {
   req = new XMLHttpRequest();
   req.open  ( 'GET', URL + "ping.php", true );

   req.onreadystatechange  = function() {
      if ( this.readyState == 4 ) {
         if ( this.responseText == 'OK!' ) {
            window.location = URL;
         }
      }
   }

   req.send( null );
   setTimeout ( check, 2000 );
}

</script>
</head>
<body onload="redirect();">

<div class="loading">Esperando la conexión con Paris...<br />
<br />
<img src="ajax-loader.gif" /></a>
</body>
</html>

Esta nueva web espera a que pueda recabar el contenido del script ping.php en mi servidor (“Paris”). Cuando esto sucede, quiere decir que está conectado a Internet (y en mi caso, a la intranet de Paperclip via VPN). Ya que esto sólo funcionará en Chrome, usa directamente el XMLHttpRequest

El script ping.php es sencillo:

<?php
    // Esta página no debe ser guardada en cache
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");

    header ( 'Access-Control-Allow-Origin: *' );

    echo "OK!";
?>

Simplemente imprime un “OK!”, y evita que sea grabado en la caché de los servidores, proxies, y navegador web . El Access-Control-Allow-Origin es para alterar la política del mismo origen, y permitir que el script grabado en Hellboy se conecte vía AJAX a un script en otro lado.

Una vez conectado, se muestra mi desktop HTML5. Es muy fácil programar en Javascript para un único navegador… y el Chrome soporta bastantes cositas del CSS3, como background-size, para hacer que la imagen de fondo cambie de tamaño según el tamaño del contenedor. Así que ahora éste es el escritorio de Hellboy, :

A la izquierda están mis enlaces más usados, que son simples tags <a>. Tendría que hacer una aplicación para Chrome para poder ejecutar programas y otras apps. Eso será después. A la derecha pienso mostrar algún tipo de información, aun no sé qué. Todo está dibujado usando Javascript, el HTML solo tiene un <script>init();</script>, que inicia todo.

Le he puesto también un pequeño selector para el wallpaper:

Un paseo ilegal por flickr me dio algunos de los wallpapers :) Ha sido un lindo ejercicio de Javascript, CSS3 y DOM. Aun falta algunas cosas por implementar, pero ahora lo que quiero hacer es compilar el nickel en Ubuntu, y usarlo para el wallpaper de Dorothy. Eso si será alucinante :)

Revisión rápida de Ubuntu 10.10

El 10/10/10, Ubuntu Linux liberó su última versión, la 10.10 (muchos dieces), llamada “Maverick Meerkat” (algo así como la “Suricata Independiente”). Tuve algunas dudas, por que el desarrollo debe condicionar la fecha, y no al revés, ya que esto obliga a acelerar algunas cosas, y puede trae problemas con la calidad del producto final.

Pero la comunidad de Ubuntu lo hizo bien :) Para probarlo, lo instalé en Hellboy, una netbook Acer Aspire One. Ya había probado algunas cosas en la beta, y éstas fueron las novedades que llamaron mi atención:

  • El instalador ha sido reconstruido completamente. Lo primero que me llamó la atención fue que ahora el instalador te da la opción de instalar software no libres, pero muy usados, como el reproductor de Flash, o el codec para MP3.

El particionador también ha cambiado un poco de forma, pero ahora aparece en el segundo paso, junto con un boton de “Instalar ahora”. Eso ha sido otro cambio muy interesante, la información sobre el usuario, y otros datos como la zona horaria, distribución de teclado, etc., se introduce mientras ya se ha iniciado la instalación de los ficheros. Buen uso del tiempo muerto.

  • Después de copiar los ficheros, y bajar las actualizaciones, me pidió reiniciar. Es la instalación más sencilla que he podido ver en un sistema operativo. Una vez iniciado, no hubo muchos cambios visuales significativos con respecto a la versión 10.04. A parte de la nueva fuente, los bordes de las ventanas cambiaron un poquito. El fondo por defecto ha cambiado por uno, a mi parecer, más simpático (pero siguiendo su tendencia MacOSX-era, que a muchos no le gusta):

El menú social “Yo” ahora incluye información sobre correos electrónicos de Evolution. Ahora soporta conexión a Buzz, y aun veo el problema con Facebook, que a veces no aparece el boton “Agregar” después de autorizar.

Otro cambio resaltante, es que la instalación por defecto ya no instala F-Spot como gestor de álbumes fotográficos, ahora lo han cambiado por Shotwell. La verdad, es que yo prefiero Picasa :D

También me llamó la atención la nueva forma de resolver conflictos al momento de copiar o mover ficheros. Se parece bastante al de Windows 7… pero me agrada que lo hayan implementado.

Realmente, esos han sido los cambios más resaltantes de esta nueva versión, que he podido notar. Como siempre, hay nuevas versiones de todos los paquetes, pero no se notan “a simple vista”, por lo que no impactan al usuario final. Lo siento con la misma velocidad que la versión anterior, por lo que por ahora, no lo instalaré en Dorothy. Pero si, pienso que será una experiencia mucho más satisfactoria para el usuario nuevo.

Aclaración: ODIO JAVA (y un poco de switch/case)

Java es un lenguaje arcaico, increíblemente lento, y redundante. Si lo enseñé alguna vez, fue porque:

a) El director del Instituto que me lo pidió inicialmente, se confundió… pensó haber leído en mi currículo que yo había sido docente en la UNICA (ahí dice claramente que fui Tech Support. Fue un momento bastante jocoso, la verdad),

b) Parece que no existia nadie más en Ica que enseñara eso, y

c) Me pareció paja la idea de ser profe :)

Es un error que no volveré a repetir. Quiero enseñar/exponer sobre Linux, Gambas, Blender, Python, y cualquier otro software libre que sea emocionante :)

¿Por qué digo que Java es arcaico y redundante? Porque su sintaxis es una copia de C. Y la sintaxis de C sólo tiene razón de ser en C, ya que el compilador de éste optima el código para convertirlo en lenguaje máquina, y ganar velocidad. Los lenguajes de programación de más alto nivel ya no compilan a lenguaje máquina directamente, usualmente lo hacen hacia un bytecode, y las optimizaciones de velocidad precisas de C pierden sentido. Para muestra, un botón: La sentencia switch, de C.

Si te has preguntado por qué tienes que escribir un break después de cada segmento case en una sentencia switch en Java,  es por que tu inconsciente también sabe que Java es feo :-D Básicamente, un switch es un montón de ifs anidados, y es lo mismo usar uno u otro (python, por ejemplo, no tiene una instruccion switch, y te recomienda usar simplemente ifs), no hay beneficio de velocidad.

Excepto en C. La sentencia switch en C crea una tabla de saltos, donde el puntero de ejecución es empujado cierta cantidad de instrucciones según el valor numérico que se le pasa a la sentencia switch. Al no haber comparaciones (esto es, ifs), es mucho más rápido. Entonces cada keyword case marca un punto donde debe de saltar el puntero de ejecución. Aquí viene lo interesante: case no es una sentencia, no produce código máquina, solo lo usa el compilador para armar la tabla de saltos. Cuando se ejecuta el programa, no hay forma de saber dónde acaba las sentencias que le corresponde a cada case, por lo que uno manualmente tiene que marcar el fin, indicando que salga del bloque switch usando la sentencia break;.

Esta forma de trabajar de switch permite hacer optimizaciones bastante locas (como el dispositivo de Duff). Otra cosa a notar aquí, es que el valor que se le proporciona a switch debe ser únicamente numérico. Es poco probable que ese tipo de sentencia switch se use en estos tiempos, incluso lenguajes feos como Visual Basic tienen un switch mucho más moderno (su SELECT CASE, que permite hacer comparaciones de mayor, menor, y de cadenas, obviamente es internamente IFs anidados)

¿Aún sigues pensando que Java es moderno? Allá en 1995, adoptaron la sintaxis de C para hacerlo familiar con los programadores, y modificaron cosas que trae problemas en C (como punteros, recolectores de basura, etc.) Cumplió su objetivo, y se volvió muy popular. Y el mismo bodoque siguen usando hasta ahora, por mucha presión de grandes billeteras. Suena un poco a la historia de Windows :) Ahora hay muchos lenguajes de programación, como Python, o Ruby, que son infinitamente mejores, modernos, y se enfocan en la velocidad de desarrollo, que es lo que realmente importa en estos tiempos.

Si, es cierto: PHP tiene también la sintaxis de C. Por eso estoy en el proceso de dejarlo :-)

¿Adios Flash? (Y bienvenido HTML5/Javascript)

A pesar que HTML5 aún está en desarrollo, muchos navegadores web ya lo están implementando, por las características que ofrece. Parece que el objetivo no-oficial, nunca-dicho, es “destronar a Flash” :-) y obviamente, a todos los demás programas que proveen elementos multimedia al navegador, como Google Gears, o Microsoft Silverlight.

Actualmente, la mayoría de navegadores modernos ya soporta el tag <video>, y el famoso tag <canvas>, que permite dibujar en él como si fuera una pequeña pantalla. Ejemplos, ya han bastantes por ahi, muchos funcionan en algunos navegadores específicos (como aún no es oficial, ni estándar, algunos navegadores están haciendo sus propias implementaciones del futuro HTML5). Algunos me han sorprendido bastante, entre ellos (necesitarás una versión reciente de cualquier navegador para verlos bien):

  • Explosión 3D de un vídeo:


http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/

  • Quake 2:

http://code.google.com/p/quake2-gwt-port/ (No lo he probado, pero aquí hay un vídeo)

http://www.youtube.com/html5

  • Esta me ha entretenido por un rato: Galactic Plunder, completamente hecho en HTML5 y JavaScript.

http://dougx.net/plunder/plunder.html

Aún queda mucho camino por recorrer con HTML5, en estos momentos le están dando importancia únicamente a la parte multimedia, pero promete momentos muy interesante para la Web en los años venideros.

Google desde la línea de comandos

Los chicos de Google nos sorprenden nuevamente con esta pequeña pero interesante herramienta, una interfase para la linea de comandos (CLI) de las aplicaciones de Google, llamada GoogleCL.

Asi que, si quieres agregar una entrada al Calendario de google:

$ google calendar add "Ir al dentista"

O quieres subir un vídeo a Youtube:

$ google post ballmer_monkey.avi

Con esto, ahora si es posible que Sheldon Cooper suba sus bromas automáticamente a Youtube :)

Evolución del audio de las PC (y nostalgia por Monkey Island)

Sin saber qué me esperaba, hice clic en play, y me fui a otra ventana. Entonces escuché una de las canciones más increíbles que yo recuerdo, que salia de una computadora, hace más de 10 años. Éste es una pequeña revisión de la evolución del audio en las PC, desde los bip bip del speaker que venia en las PCs, hasta los CD de audio, usando el tema musical de “Monkey Island“:

http://www.youtube.com/watch?v=a324ykKV-7Y

Ahh… la nostalgia :-)Monkey Island” es uno de los juegos que más me ha gustado en la PC, especialmente la segunda parte, “LeChuck’s revenge“. Las siguientes versiones no me agradaron (la “ridiculización” de los dibujos no me agradó), y en parte se debe a que el creador de las dos primeras (Ron Gilbert) renunció de LucasArts después de acabar la 2da entrega.

Yo lo jugaba en la 1ra Dorothy, 286 con 1MB de RAM y monitor CGA de 4 colores (vídeo)… uhh… voy a instalar ScummVM :-) La canción de LeChuck me encanta :-)

Avance de “Sintel”

Sintel” es la siguiente película que la Fundación Blender auspicia para empujar los límites técnicos de Blender. “Big Buck Bunny” fue todo un éxito, y esta nueva aventura se ve muy prometedora.

Aquí el avance:

http://www.youtube.com/watch?v=HOfdboHvshg

Asegúrate de verlo y oirlo en HD. También puedes descargarlo en varios formatos, en varias resoluciones. Se avecinan momentos muy emocionantes para la comunidad de Blender