Archivo por autor

10 “nos” para freelances

Hoy mi hermana Olalla me ha pasado un interesante artículo de wakeuplater del año 2007 que me he permitido traducir. No estoy de acuerdo con todo, pero ofrece un punto de vista curioso y muy a tener en cuenta para todos los freelance que nos dedicamos al mundo web.

1.- Puedes mostrarme un boceto para ayudarnos a elegir un diseñador/desarrollador?
Cuando era joven e ingenuo lo hice. No cobré y perdí un montón de tiempo. No hagas trabajo que no se cobre por la posibilidad de cobrar — Esto no ocurre en otras industrias, entonces por qué en diseño web? El mejor escenario (Aunque raro) es que consigas un trabajo con un cliente que sepa que si fuera necesario trabajarías gratis. El peor escenario es que no te page, y aun así utilice tu trabajo, sabiendo que no tendrás lo recursos legales para hacer nada. En cualquier caso, lo más problema es que pierdas el tiempo.

2.- Puedes ofrecernos un descuento?
Hay un montón de compañías que no consideran que el trabajo de diseño gráfico valga más de 20$ la hora. Nunca deben ser tus clientes. En mis primeros años post universitarios, tenía la máxima de “conseguir el trabajo” en muy alta estima, sería capaz de dedicar una cantidad exagerada de tiempo para cobrar. Deja que te diga que no merece la pena. Nunca. Recuerda, puede que hagas un favor a esta compañía, pero por otra parte, estás dañando tu propio futuro y el de tu familia. Ahora, doy mi tarifa horaria inmediatamente y eso desbroza a muchos clientes potenciales. En realidad se trata de matemáticas — Si doblar tu tarifa te hace perder la mitad de clientes, entonces consigues lo mismo en la mitad de tiempo. Si haces un trabajo excelente, cóbralo — siempre habrá compañías que cobren el doble que tú.

3.- Registrarás y alojaras mi página?
Seguro que parece una buena idea — ingresos fijos, verdad? Bien, puede ser…  si consigues que primero paguen, y eso justifica que dediques 10$ al mes en llamadas de soporte técnico que tendrás que dar a altas horas de la noche. Una vez que elcliente piense que eres responsable de su correo electrónico y página web, te llamarán continuamente cada su correo haga algo levemente raro o les muestre un error 404 por la razón que sea en el equipo de su casa. Lo creas o no, hasta he conocido gente que ha recibido llamadas de clientes preguntando por alguna funcionalidad de su teléfono móvil sólo porque mi amigo alojó su página. No lo hagas… no merece la pena. Facilítales una compañía de registro y de alojamientos y deja que lo hagan ellos mismos.

4.- ¿Puedes copiar este sitio?
Puede que ahora pienses que contestaría “No” desde un punto de vista estrictamente moral, y aunque eso es cierto, hay otras razones igualmente importantes. En primer lugar, si están copiando un sitio, es una mala señal y se reducen las posibilidades de que cobres a tiempo la cantidad estipulada. En segundo lugar, hacer esta clase de trabajos te reduce a un mono, y aunque hagas algún trabajo de estos para pagar tus facturas, por qué ir en busca de este propósito? En tercer lugar, si es una copia real, el único beneficio real que obtendrás será el pago – no podrás usarlo en tu portfolio, y más aun, este tipo de clientes es de los que no querrás tener en un futuro.

5.- ¿Puedo pagarte mi página de comercio electrónico con las ventas que haga en él?
Odio ser pesimista, pero cuando me piden esto, quisiera decirles que quizás no ganen nada así que podrían pedirme también que se la haga gratis. Sí, sé que son excepciones, por lo que a veces les preguntaré por sus negocios, marketing, planes de pago, y el 99% de ellos no los tienen. Simplemente piensas que vender camisetas en internet será una idea novedosa. Normalmente les suelto un rollo sobre tener que mantenerme a mí y a mi familia, y no puedo hacer trabajos especulativos — Entonces recomiendo Yahoo! Shopping o CafePress, y 9 de cada 10 veces, no realizan su página web.

6.- Tengo una gran idea. ¿Te gustaría…?
No es muy distinto de #5, pero puede suponerte mucho más tiempo si participas. De nuevo, y sin ser borde, pero si la persona añade poco al proyecto más allá de redactar la idea, entonces cualquier trabajo que hagas es mera caridad (Que quizás te parzca bien). Pero siendo honestos, prefiero ser caritativo con mis familiares y amigos y hacerlos socios gratis antes que con un extraño. Créeme, si alguien tiene realmente una buena idea, te hará socio Y también te pagará.

7.- ¿Tienes una cuenta de mensajería instantánea?
Podría dársela a una persona en la que tenga confianza durante un proyecto grande, pero como normal general, digo a los clientes que no lo hago. La razón aquí está clara — tienes una vida y otros clientes además de ellos. Muchos clientes te ven como un empleado al teléfono, y esto es malo. Esto es por lo que dejaste tu trabajo…

8.- ¿Podría pagarte todo cuando el trabajo finalice?
Pido un 50% por adelantado (a no ser que sea un trabajo grande, en tal caso en torno al 33%). Necesito tener seguridad en que pagarán el proyecto, y que podré planear mis ingresos, pagar facturas y comer. La gente que quiere pagar cuando termines el trabajo suelen insistir en más cosas después de que hayas hecho toneladas de trabajo.

9.- ¿Hay alguna forma de que puedas hacerlo para esta noche o fin de semana?
Cuando sean conscientes de que una vez les hiciste un favor, esperarán lo mismo en un futuro. Ahora puedes elegir hacer horas extras por las noches (Yo lo hago), pero no te comprometas a tenerlo terminado por la noche o el fin de semana/vacaciones. Conozco muchos freelances que cobran sus horas nocturas/fin de semana, y podría ser un camino a seguir. Porque la razón por la que te has hecho autónomo es por la libertad, ¿verdad? ¿Verdad?

10.- ¿Puedo estar seguro de que no usarás este trabajo con alguien más?
Este es un asunto delicado porque la mayoría de clientes lo malinterpretan (Es un asunto espinoso la propiedad intelectual). En mis Términos y Condiciones que exijo firmar a todos mis nuevos clientes, me aseguro de que ellos saben que (1) su código funciona con el de otros proyectos por los que no les he vuelto a cobrar, y (2) probablemente use código del suyo en otros proyectos, y (3) ellos poseen el código y la implementación del proyecto (página terminada), pero no las piezas de código (sistemas de sesiones, cargador de imágenes, etc.). Estoy orgulloso de mí mismo respecto a mi productividad y velocidad, y necesito utilizar el código de otros todo el tiempo para lograrlo. Eso por no mencionar que vendo objetos en Flash que quizás necesiten código antiguo para hacerlos. No te están pagando para que crees código que ellos puedan venderlo, así que asegúrate de que es la implementación y no el código lo que poseen.

Vodafone se ha quedado con mi dinero (Solucionado)

¡Dejad de cobrarme por un servicio que no me ofrecéis!

Os he pagado 6 meses por un servicio que no he recibido. Me habéis pedido paciencia para resolver la incidencia, y os la he dado, sin dejar de pagar. Ahora, cansado de esperar decido darme de baja, y me habéis penalizado por incumplir el contrato…

NOTA: Finalmente Vodafone no ha cobrado penalización, y me ha reembolsado el dinero pagado.

Hoy estoy indignadísimo. Hace seis siete meses contraté el servicio de ADSL y telefonía fija de Vodafone. Desde entonces estoy sin línea de voz y les estoy pagando como si la tuviera. Para el que no lo conozca, le indico; Es una modalidad que permite tener internet por cable, mientras que la voz funciona mediante cobertura móvil. En el momento de contratar el servicio nadie me indicó que la voz funciona a través de la red móvil. Lógicamente de haberlo sabido no lo hubiera solicitado, pues donde lo contraté no existe cobertura móvil: Para que os hagáis una idea, si tratas de enviar un SMS, éste se queda en la bandeja de salida hasta que no te mueves a unos 100 o 200 metros de mi vivienda.

Bien, cuando recibí el paquete, ilusionado lo instalé, y fue entonces cuando me llevé la sorpresa: Me habían vendido algo que no podían ofrecerme. Y lo peor de todo, había un contrato de permanencia de por medio. Fui a la oficina del consumidor, donde me indicaron cómo proceder: Debía abrir una incidencia, solicitar el número de incidencia, y posteriormente solicitar el alta en otro operador. Desde Vodafone se pusieron en contacto conmigo para pedirme paciencia. Se la di (Pardillo de mí).

Hace un mes y medio decido retomar el contacto. Me piden de nuevo 2 meses de paciencia, aplicándome un descuento del 100% en las 2 siguientes facturas. No está mal, de no ser por que la calidad del servicio de ADSL había empeorado, y ya era complicado disfrutar de 5 minutos seguidos sin sufrir una desconexión.

Hoy he recibido una factura, en la que no se aplica el descuento. Tras una odisea de casi 3 horas, me he dado de baja. En sus bases de datos consta que la calidad del servicio móvil en mi domicilio es alta (Espera, que me río), por lo cual, me tendrían que penalizar por incumplimiento de contrato. ¡Según ellos el que no ha cumplido el contrato soy yo! Ante mi insistencia de que no dispongo de cobertura, me comunican que puedo pagar en torno a 40€ a un técnico que se desplazaría a mi domicilio para comprobar que efectivamente no hay señal. De lo contrario, debería pagar 80€ de penalización. Entre esas dos opciones prefiero la penalización y no volver a saber jamás de Vodafone. Por supuesto, también voy a dar de baja mi móvil, mañana voy de nuevo a la oficina del defensor al consumidor, y he dado orden al banco de no aceptar ningún cobro de ellos de momento.

A continuación pongo un resumen de las infinitas llamadas de hoy:

  • 19:45 Comienzo las llamadas. Pido que me pasen con bajas. Tras 10 minutos pidiéndome la señorita que espere, me dice que ahora no pueden pasarme. Me pide que llame pasados 10 minutos.
  • 20:15 Vuelvo a llamar. Tras insistir con el teleoperador robótico, logro que me pasen a un agente. Salto por unos cuantos agente-pide-datos hasta que finalmente me ponen con bajas.
  • 20:32 Desde el dapartamento de bajas me indican que debo hablar con servicio técnico para que reflejen en las notas que no tengo cobertura móvil. Me dicen que siga este procedimiento:
    1. Debo llamar primero al 22155, donde me solicitarán mis datos y desde ahi me darán la información, y dejarán constancia del problema de cobertura en las notas.
    2. Después llamo de nuevo al 1441 y me pongo en contacto con bajas ADSL, para ahora sí, proceder a la baja sin aplicar penalización.
  • 20:50 Desde el 22155 (Teléfono de pago, 50c + IVA) me instan a que llame al 22130, y vaya al departamento de linea de voz de ADSL.
  • 21:08 Desde el 22130 me dicen que ellos no llevan la calidad de la cobertura, de modo que me piden que llame de nuevo al 22155 (Pagando otros 50c + IVA). Me ofrece comprobar la cobertura mediante mi código postal.
  • 21:24 Llamo de nuevo al 22155 pagando los 50c, y me piden el Código Postal. De nuevo me piden que llame al 123, solicite un agente, y que le pida que me pasen con Total Telecom. En cualquier caso, me dicen que desde el servicio técnico de ADSL no tienen “poder” para anotar nada en mis notas sobre las calidad de la señal. Aun así, me dicen que consta que hay calidad media y mala en mi municipio, dependiendo de la zona.
  • 21:33 Ya estoy en 123 y me transfieren a Total Telecom.
  • 21:34 me atiende Fátima de Vodafone Internet y Fijo. Me dice que no existe método alguno de comprobar que no tengo cobertura, porque según ella tengo calidad alta (¡5 minutos antes me dijeron lo contrario!). Me dice que hable con bajas, y que les explique mi problema :)
  • 21:42 Llamo de nuevo al 1441 para solicitar la baja. Alejandra me pide mis datos y me pasa con el departamento de bajas.
  • 21:45 Silvia de atención ADSL me pide de nuevo todos los datos y compruba a denuevo la calidad por el Código Postal. Le explico todo y trata de ponerme con bajas ADSL. Al final lo consigue.
  • 21:55 Patricio me atiende. Me explica que si quiero la baja sin descuento tengo que pagar para que un técnico vaya a mi domicilio. Me niego. Procedo a la baja pagando 80€.
  • 22:00 llamo para solicitar la baja de mi contrato de teléfono móvil. Debo pagar otros 80€ :) Tengo que enviar un fax al 607 131 859 indicando los siguientes datos: Nombre y apellidos del titular, DNI, número de teléfono, motivo, fotocopia del DNI.

Gracias Vodafone. “Somos como somos porque tú eres como eres”.

Actualizacion 17 de mayo a las 23:43

He enviado una reclamación desde su página web, a la atención de “Bajas”. Éste es el texto:

En diciembre contraté con ustedes el servicio de ADSL y voz para el 91 862 XX XX. Nadie me indicó que la voz funcionaba por cobertura móvil. De haberlo sabido, no lo hubiera contratado, ya que en la vivienda donde se contrató no existe un ápice de cobertura.

En sus sistemas consta que para el término municipal (CP 45900) hay calidad alta de la señal. Yo les digo que mi municipio tiene 65Km cuadrados, y en mi residencia no es posible ni enviar un sms con un móvil de su compañía.

Me pidieron paciencia para resolver el problema. Se la he dado y no he dejado de pagar en ningún momento.

Hoy, cansado de pagar por un servicio que no me ofrecen, he decidido solicitar la baja de esta línea. Sus amables operadores deslocalizados me han tenido 2 horas y media, para finalmente decirme que, como en sus sistemas consta que en los 65Km cuadrados de mi municipio hay calidad alta de la señal, entonces me aplicarían una penalización de 80€. He formalizado la baja.

Si después de pagarles pese a que no me ofrecían el servicio, y darles tiempo para resolver la incidencia, finalmente me aplican la penalización, daré también de baja mi contrato de móvil. La permanencia no es problema.

Mañana sin falta voy a la oficina de defensa del consumidor.

Respecto a esta incidencia, les solicito por favor un identificador.

Muchas gracias por su servicio, han sido muy amables.

A la hora he recibido esta respuesta:

Para sus consultas de puntos, póngase en contacto con nosotros llamando al 22114. El coste de la llamada al Servicio de Atención de Puntos Vodafone es de 0,15€ de establecimiento de llamada y de 0.15€ por minuto. Su horario de atención es de 8:00 a 24:00 de lunes a domingo.

WTF!! Por favor, que alguien me explique qué tiene que ver su respuesta con mi reclamación. ¿También procesa los correos de reclamación un software que reconoce patrones como en su callcenter? Cuánta incompetencia… Por cierto, puse “diciembre de 2009″ en lugar de “noviembre de 2009″.

Actualización 18 de mayo a las 13:32

He ido al defensor del consumidor. Me han dado cita para resvisarlo en profundidad el próximo lunes. Por lo pronto me han dicho que no tendría por qué haber pagado nada, ya que no me estaban ofreciendo lo acordado. No hay problema en haber dado orden al banco de no pagarles más, ya que como se ha iniciado un procedimiento de reclamación, no podrían constar mis datos en lista de morosos (Si aun así lo hicieran, podría quitarme dejando constancia del procedimiento ya abierto). Sólo iría a lista de morosos en caso de que se resuelva el procedimiento a favor de Vodafone, y yo no pague.

Ya me he hecho con un duplicado de las 6 facturas que les he pagado. En total 171,61€, que junto con la próxima factura que me quieren cobrar y la penalización, quedaría en unos 292€ que van para Vodafone por un servicio que no me han ofrecido. Qué majos :)

Actualización 18 de mayo a las 19:29

He llamado para solicitar una reclamación, de este modo no pueden añadirme a ninguna lista de morosos. Este es el contenido del fax que les he enviado:

Expone:

En noviembre de 2009 contraté con ustedes el servicio de Internet ADSL y teléfono fijo. Al recibir el paquete, me llevé la sorpresa de que el teléfono fijo funciona mediante cobertura móvil, cosa que en ningún momento nadie me advirtió al contratarlo. De haberlo sabido, no lo hubiera contratado, ya que en mi domicilio no es posible ni enviar un SMS con Vodafone.

Me puse en contacto con ustedes, y me pidieron paciencia para solucionar el problema. Les di mi confianza, y seguí pagando mes a mes por un servicio que no me ofrecían.

El 6 de abril de 2010, y en vista de que todo seguía igual, me pongo nuevamente en contacto con ustedes para solicitar la baja. El agente que me atendió me ofreció 2 mensualidades con el 100% de descuento, sin ningún tipo de compromiso, como plazo para solucionar la “incidencia”. El problema a día de hoy sigue sin solucionarse, y desde entonces he recibido 2 facturas en las que sí se me ha cobrado el importe sin aplicar descuento.

Ayer me puse nuevamente en contacto con ustedes con la firme intención de tramitar la baja, pues tanto mi paciencia como mi bolsillo tienen un límite. Muy amablemente, sus agentes deslocalizados me entretuvieron durante dos horas y media. Todos insistían en comprobar la calidad de la señal de mi municipio solicitándome mi código postal (45XXX), para decirme que la calidad del servicio era alta, y por tanto Vodafone cumplía, y se me aplicaría una penalización de 80€.

Me parece estupendo que sus bases de datos afirmen que, en los 65 kilómetros cuadrados de mi municipio de orografía escarpada, una sola antena GSM en el núcleo urbano es capaz de ofrecer una calidad de señal alta a 5 kilómetros de ella. Pero la realidad es que en mi vivienda, a 5 kilómetros de la antena y con montes y bosques de por medio, no existe un ápice de cobertura, y ninguno de sus empleados me ofreció una solución viable que no suponga un desembolso extra de dinero por mi parte. Así agradecen mi confianza y paciencia desde Vodafone.

Finalmente me di de baja, insistiendo, muy poco cordialmente su agente de nombre XXX, en que aplicaría la penalización por incumplimiento de contrato.

Solicita:

Si bien, tal y como me han informado desde la oficina del consumidor, no tenía la obligación de pagarles un solo recibo, solicito no me apliquen ninguna penalización. Del mismo modo, solicito me indiquen el identificador de esta reclamación en el 622 305 XXX.

Ya ha quedado enviado. Veremos en qué queda esto…

Actualización 8 de junio

Final sorprendente e inesperado. Gracias a la reclamación hecha en consumo, lo he conseguido :) Finalmente Vodafone no me ha cobrado ninguna penalización y ha procedido a reembolsarme 150€ por los pagos realizados.

En consumo me lo advirtieron, que Vodafone suele responder bien cuando se presenta una reclamación formal. Y que de haber tenido que poner una reclamación similar a la compañía líder, no habría conseguido nada.

The End :)

WebApps Working Group

Últimamente leo bastante la página del w3c (Qué acierto fue cambiar su diseño), y casi siempre me veo a mí mismo leyendo sobre el Grupo de Trabajo de Aplicaciones Web (WebApps Working Group). ¿Qué es?

El W3C Web Applications (WebApps) Working Group, una fusión de los grupos de trabajoWebAPI y WAF, se constituye para desarollar APIs estándar para el desarrollo de Aplicaciones Web del lado del cliente. Este trabajo incluirá tanto la documentación de APIs existentes como el XMLHttpRequest, como el desarrollo de nuevas APIs que enriquezcan las aplicaciones web.

Veamos en qué consisten algunas de esas APIs que están desarrollando:

Interfaz para Widgets

Cada widget podrá tener un documento de configuración que almacenará metadatos relativos al Widget. Además, cada instancia de un widget podrá almacenar datos de manera persistente.  ¿Cómo se hará esto? Gracias a otra API de almacenamiento de datos locales.

Está bastante maduro (En estado de Recomendación Candidata), y existe una suite de tests para probar su correcta implementación.

API de selectores Level 1

Supongamos el siguiente bloque de código HTML 4.01:

<table id="score">
  <thead>
    <tr>
      <th>Test
      <th>Result
  <tfoot>
    <tr>
      <th>Average
      <td>82%
  <tbody>
    <tr>
      <td>A
      <td>87%
    <tr>
      <td>B
      <td>78%
    <tr>
      <td>C
      <td>81%
</table>

Si quisiéramos obtener los valores de todas las celdas tendríamos que ejecutar algo similar a esto con la API de DOM Level 2:

var table = document.getElementById("score");
var groups = table.tBodies;
var rows = null;
var cells = [];

for (var i = 0; i < groups.length; i++) {
  rows = groups[i].rows;
  for (var j = 0; j < rows.length; j++) {
    cells.push(rows[j].cells[1]);
  }
}

¡Qué feo! La nueva API permite hacerlo de este modo mucho más conciso:

var cells = document.querySelectorAll("#score>tbody>tr>td:nth-of-type(2)");

Como véis, es exactamente igual que lo que ya hacemos con los selectores de jQuery, salvo que en un tiempo podremos realizarlo directamente desde el motor de JavaScript del navegador, sin necesidad de frameworks.

Esta API también está muy madura, y al igual que la anterior es una Recomendación Candidata. Está disponible en Firefox desde su versión 3.1+, en Internet Explorer 8 y en Safari 3.1+. Pero hasta que no borremos del mapa a IE6 e IE7 tendremos que seguir utilizando herramientas como jQuery.

Web Storage

Es un nuevo mecanismo de almacenamiento local que, a diferencia de las Cookies, permite almacenar un gran volumen de datos (Por ejemplo, los emails de una cuenta, haciendo innecesario plugins como Google Gears), y también permite almacenarlo accesible a todas las ventanas del dominio al que pertenecen.

Todo se realizaría de un modo muy sencillo: Simplemente accediendo al atributo que proceda dentro del objeto localStorage.

De nuevo, está disponible ya en Firefox 3.5, IE8, Safari 4.0, Chromium…

Web Workers

Permite lanzar distintos hilos de ejecución que se ejecutan en paralelo a la página principal. De este modo, se puede trabjar en un entorno thread-like trabajando con un mecanismo de coordinación de pase de mensajes.

Como ejemplos, podríamos:

  • Generar una hebra que busque números primos en background.
  • Un worker que actualice una base de datos local. Estaría permanentemente escuchando al servidor mediante un WebSocket, y cuando hubiera algún cambio, modificaría la base de datos local.
  • Operaciones de Lectura/Escritura de fondo.
  • Workers compartido. Distintas ventanas podría compartir un único Worker que, en un momento dado, podría actualizar a todas a la vez.
  • Delegación. Aprovechando las distintas CPUs de los microprocesadores multi-core.

Lógicamente, esto abre un gran número de posibilidades en cuanto al rendimiento de las páginas web.

Por el momento disponible en Firefox 3.5+, Safari 4, Chromium.

Server-Sent Events

La API que define esta especificación puede no parecer muy revolucionaria: Permite recivir notificaciones PUSH desde el servidor en forma de evento DOM. Perfectamente podemos lograr el mismo objetivo mediante XHR o un iframe. Sin embargo, dada su naturaleza, permitiria que, cuando el navegador se pueda coordinar con el operador de red, se ahorraran notablemente recursos de red. Uno de los efectos colaterales sería aumentar la duración de las baterías de los dispositivos portátiles.

WebSockets API

Esta API permite una auténtica conexión bidireccional entre el navegador y el servidor. Ya fue cubierta en este blog cuando Google Chrome anunció su implementación.

Web SQL Database

Es exactamente lo que su nombre sugiere. Consiste en una especificación de un API que permitirá almacenar información en una base de datos locale accesible mediante SQL.

Veamos un ejemplo de su funcionamiento:

function prepareDatabase(ready, error) {
  return openDatabase('documents', '1.0', 'Offline document storage', 5*1024*1024, function (db) {
    db.changeVersion('', '1.0', function (t) {
      t.executeSql('CREATE TABLE docids (id, name)');
    }, error);
  });
}

function showDocCount(db, span) {
  db.readTransaction(function (t) {
    t.executeSql('SELECT COUNT(*) AS c FROM docids', [], function (t, r) {
      span.textContent = r.rows[0].c;
    }, function (t, e) {
      // couldn't read database
      span.textContent = '(unknown: ' + e.message + ')';
    });
  });
}

prepareDatabase(function(db) {
  // got database
  var span = document.getElementById('doc-count');
  showDocCount(db, span);
}, function (e) {
  // error getting database
  alert(e.message);
});

En primer lugar se define la función prepareDatabase() que, en caso de que fuera necesario, crea la base de datos con una tabla llamada “docids” con dos columnas (“id” y “name”). Si hay éxito, o no es necesario crearla, se llama a la función getDatabase(), que obtiene un manejador de la base de datos, y entonces llama a la función que hace realmente el trabajo, en este caso showDocCount().

File API

Como último ejemplo de apartados en los que trabaja el WebApps Working Group, voy a mosotrar la File API. Permitirá un manejo avanzado de ficheros desde JavaScript, pudiendo:

  • Una vez que el usuario conceda permisos, el navegador permitirá leer y parsear un fichero.
  • Se podrá almacenar información de forma local.
  • Se permitirá guardar los archivos, del mismo modo que ahora se pueden descargar ficheros de servidores remotos.
  • Se podrán enviar ficheros grandes a servidores de un modo más eficiente que el actual. Por ejemplo, se podrá dividir en porciones.
  • Los navegadores implementarán mecanismos para poder cancelar o impedir los casos de uso enumerados anteriormente.

Sin duda, APIs como éstas permitirán realizar aplicaciones reales que funcionen en el navegador sin necesidad de un servidor. Como ejemplo, un reproductor multimedia avanzado, que guarde una caché local con metadatos de nuestra música y películas.

Creo que muy pronto comenzaremos a ver todas estas nuevas aplicaciones ir aparenciendo, poco a poco, hasta que un día el navegador realmente sea un framework de aplicaciones más.

Vídeo, audio e imágenes de entrada al navegador

Hace poco se ha publicado un nuevo borrador del w3c (The Capture API) que permitirá conectar dispositivos de entrada al navegador, permitiendo por ejemplo capturar una fotografía, mensaje de audio por el micrófono, o un vídeo.

Aun se encuentra en un estado muy prematuro, pero nos enumeran una serie de posibles casos de uso:

  • Captura y envío de imágenes. Permitiendo el envío por XHR de varias imágenes.
  • Captura de imagen panorámica. Por ejemplo, con 3 tomas que posteriormente se “concatenan” automáticamente para mostrar la panorámica.
  • Video Chat. Aun está sin definir el método para realizar streaming, sin embargo todas las soluciones propuestas pasan por websockets.
  • Cámara web. Permitirá realizar una aplicacion de vigilancia para controlar la cámara, incluyendo movimientos como arriba, abajo, izquierda o derecha, o hasta aplicaciones de detección de movimiento.
  • Búsqueda por voz. Introduciendo por el micrófono la cadena de búsqueda.
  • Recordatorio de voz. De nuevo, desde el micrófono.

Por supuesto, para proteger la privacidad de los usuarios, el navegador tendrá que pedir explícitamente confirmación del usuario para permitir que se acceda a estos dispositivos.

Ejemplo de uso:

// Create a container div element and append it to the document body.
var container = document.createElement("div");
document.body.appendChild(container);

// The browser viewport width in pixels.
var screenWidth = window.innerWidth;

function successCallback(data) {
for (var i in data) {
var img = document.createElement("img");
img.src = data[i].uri;
// If the image width exceeds that of the browser viewport, the image
// is scaled to fit the screen keeping the aspect ratio intact.
if (data[i].format.width > screenWidth) {
img.style.width = screenWidth + "px";
img.style.height = (data[i].format.height/data[i].format.width)*screenWidth + "px";
}
container.appendChild(img);
}
}

function errorCallback(err) {
alert(err.message + " (" + err.code + ")");
}

// Launch the device camera application and invoke the callback once
// the user exits the camera application.
transactionId = navigator.device.captureImage(successCallback, 1, errorCallback);

Mientras tanto, y hasta que esto sea una realidad, se puede utilizar el paquete flash.media de ActionScript3, en concreto las clases Camera y Micrphone. Pero claro, no es lo mismo. Una verdadera lástima tener que esperar tanto tiempo. Veremos cuándo tiene el navegador más utilizado estas funcionalidades.

Google Chrome ahora con Web Sockets

La noticia del día en cuanto a desarrollo web sin duda ha sido la implementación de Web Sockets en Chromium. una tecnología de comunicación bidireccional para aplicaciones web.

Los Web Sockets son un borrador del W3C que, mediante una conexión TCP, permiten realizar fácilmente un Server Push, es decir, una petición iniciada desde el servidor central. Es un cambio notable en la programación web, hasta ahora dirigida por peticiones iniciadas desde el cliente.

Veamos un ejemplo del código del lado del cliente:

if ("WebSocket" in window) {
  var ws = new WebSocket("ws://example.com/service");
  ws.onopen = function() {
    // Se conecta el websocket. Puedes enviar datos con el método send()
    ws.send("mensaje a enviar"); ....
  };
  ws.onmessage = function (evt) { var received_msg = evt.data; ... };
  ws.onclose = function() { // se cierra el websocket. };
} else {
  // el navegador no soportaWebSocket.
}

Ridícultamente sencillo, ¿verdad? :) Como se puede observar en la URI de la petición, funciona mediante un protocolo distinto al HTTP (ws://example.com/service), el web socket protocol. Por tanto el servidor debe estar capacitado para manejar dichas peticiones. Con fines experimentales, Google ha creado pywebsocket, un módulo del servidor web Apache que implementa dicho protocolo (Dejo para otro post el colgar un howto para ver cómo instalarlo y ejecutar un ejemplo funcional).

Las ventajas son evidentes: Supongamos un chat. Un usuario accede y dice “hola”. Empleando tecnología AJAX, deberá enviarse una petición HTTP completa, posiblemente superando 1KB para sólo cuatro caracteres. Multipliquemos esto por miles de conexiones simultáneas con millones de usuarios diarios (Como le ocurre a Facebook): Tendríamos un problema de ancho de banda. Con este nuevo protocolo, las peticiones son mínimas :)

Uno de los apartados más criticados ha sido la necesidad de relegar el socket a una conexión TCP, impidiendo aprovechar otros protocolos como UDP o RUDP. Además, y pese a ir sobre TCP, funciona sobre otro protocolo a nivel de aplicación, por lo que no sería posible acceder desde el navegador a, por ejemplo, un servidor IRC (Salvo que se haga através de otro servidor que haga de proxy).

Comet

No se puede hablar de WebSockets sin mencionar otra tecnología. En el año 2006 Alex Russell definió y acuñó lo que hoy conocemos como Comet: Un patrón que define un método para implementar Server Push desde cualquier navegador. Si bien no fue el que lo creó, pues algunos sitios como el chat de Google en Gmail ya utilizaban técnicas similares.

Los principales métodos para lograr Comet en el navegador son éstos:

  • Streaming – Consiste en mantener una una única conexión persistente desde el navegador al servidor. Cada vez que el servidor envía un nuevo evento, el navegador lo interpreta. Hay dos técnicas:
    1. IFrame oculto – Se utiliza un IFrame oculto en el que el servidor va escribiendo, cada vez que lo desea, porciones de código javascript. Es efectivo gracias a que los navegadores ejecutan los documentos HTML de forma secuencial. Sin embargo trae problemas en el motor de renderizado KHTML, pues no se comparte javascript entre distintos documentos.
    2. XMLHTTPRequest – En 1995, Netscape Navigator añadió una funcionalidad llamada “server push” que permite peticiones XHR “multipart” mediante el tipo mime multipart/x-mixed-replace. De ese modo se puede utilizar una petición XHR como canal de streaming. Sin embargo sólo es soportado por el motor Gecko, no así por otros grandes players como Trident o Webkit.
  • Long polling en AJAX – Las soluciones anteriores causan efectos negativos en los navegadores modernos. Por eso, muchas aplicaciones optan por una estrategia de long polling, funcional en todos los navegadores que soportan XHR.Esta técnica se basa en el uso de AJAX, realizando una petición que no es cerrada hasta que el servidor contesta. Una vez se recibe respuesta, comienza de nuevo el sondeo.
    • XMLHttpRequest long polling – Funciona como la mayoría de aplicaciones AJAX: Se lanza una petición al servidor, y no se cierra la conexión hasta que se recibe la respuesta. Una vez recibida, automáticamente se lanza otra nueva petición.
    • Script tag long polling – Si bien los métodos anteriores funcionan entre subdominios, no lo hacen entre distintos dominios de segundo nivel debido a protecciones anti XSS de los navegadores. Gracias a que la etiqueta script, a diferencia de un IFrame o de una petición XHR, puede apuntar a distintos dominios de segundo nivel, se logra solucionar este problema.

Especial mención respecto a Comet merece el protocolo Bayeux, y la implementación CometD de Dojo Foundation. Utilizando el paradigma Comet, han diseñado todo un protocolo de red que, a diferencia de “web socket protocol”, funciona generalmente sobre HTTP, permitiendo ser ejecutado en cualquier navegador moderno. Como API del lador del cliente se puede utiliar indistintamente su framework javascript Dojo, o JQuery. Eso sí, el lado del servidor debe saber interpretar también el protocolo Bayeux, por tanto es necesario instalar unas determinadas bibliotecas, actualmente disponibles para servidores Java.

Otras implementaciones de Sockets

Por supuesto aquí no acaba la cosa. Algunos plugins permiten ejecutar sockets, como por ejemplo el objeto Socket de Adobe Flash que permite enviar flujos binarios. Por supuesto Silverlight y Java mediante applets también permiten realizarlo.

El uso de Flash como proxy para conexiones bidireccionales, por ejemplo, puede resultar muy atractivo, pues está presente en prácticamente todos los navegadores. Sin embargo, y en mi opinión, siempre es mejor emplear tecnologías estándar, como los Web Sockets del W3C, en lugar de soluciones propietarias.

¿Y ahora qué?

Las comunicaciones bidireccionales reales están más cerca. ¿Qué cambia esto? Para los desarrolladores significa un método más versátil y aun más sencillo que XHR para nuestras páginas web. Por supuesto también es un ahorro en ancho de banda (Aunque bendito el programador web que emprenda y deba enfrentarse a problemas de ancho de banda).

¿Y para los usuarios? Junto con otras tecnologias, los Web Sockets abren muchas puertas de cara al futuro. Por ejemplo, con O3D o WebGL, sockets y <audio> se podrán desarrollar videojuegos en HTML si necesidad de Flash. Aun nos falta, por ejemplo, soporte para el micrófono, la webcam, o datagramas binarios, pero tiempo al tiemo :) ¡Estén atentos!

¿Qué diferencias hay entre Google Chrome y Chromium?

Es posible que, al igual que a mí, os haya surgido esa duda. Si bien desde hoy tenemos a nuestra disposición Google Chrome para Linux y de Mac, hace tiempo que podíamos disfrutar de Chromium. ¿No habíamos quedado en que era lo mismo? ¿Qué diferencias hay? Voy a tratar de dar respuesta a estas dudas.

chrome_vs_chromium

Si consultamos la Wikipedia en castellano veremos que:

  • Google Chrome es un navegador web desarrollado por Google y compilado con base en componentes de código abierto [...]
  • Chromium es el proyecto de software libre detrás de Google Chrome[...]

O dicho de otra forma, Google Chrome es la compilación y el paquete que Google hace del software Chromium. Algo así como los distints paquetes que las distribuciones de GNU/Linux hacen del kernel.

Si eso es todo… ¿Qué más me da usar uno u otro? ¿No son lo mismo pero empaquetado por entidades diferentes? Bien, Google tiene una página explicativa al respecto que con vuestro permiso voy a traducir:

Chromium en Linux tiene en general dos sabores: Puedes instalar o bien Google Chrome o bien un navegador Chromium. Esta página trata de explicar la diferencia entre ambos:

Google Chrome

Google Chrome es el proyecto de software libre Chromium construído, empaquetado y distribuído por Google. Tiene las siguientes diferencias respecto a Chromium:

  • Logo coloreado
  • Opción de informe de errores
  • Opción de métrias de usuarios
  • Soporte para H.264, AAC, MP3, Vorbis y Theora con las etiquetas audio y video.
  • Aislamiento de procesos
  • Un sólo paquete deb/rpm
  • Los ficheros de los perfiles se almacenan en  ~/.config/google-chrome

La compilación del canal de desarrollo se actualiza alrededor de una vez por semana, tras pasar los test automáticos y unos pocos test manuales de garantía de calidad.

Chromium

  • Logo azul
  • Soporte para Vorbis y Theora con las etiquetas video y audio
  • El aislamiento de procesos es opcional, depende del mantenedor del paquete
  • Los paquetes dependen de la distribución, a veces se dividen en múltiples partes.
  • Los ficheros de perfiles se almacenan en ~/.config/chromium

Bien, ahora queda un poco más claro. La principal diferencia que veo yo es el soporte para los codecs de compresión de audio y vídeo. Google, como compañía, está dispuesta a pagar royalties por la licencia de la patente de dichos codecs, no así las ediciones libres.

Por otra parte, mientras nada me haga pensar lo contrario, creo que el nivel de calidad que ofrecen las distribuciones Linux en general es bastante elevado, por lo que no considero que ese hecho otorgue ventaja a Google Chrome.

¿Cuál elegir? Yo personalmente seguiré usando Chromium como navegador secundario y Firefox como primario. Principalmente para promover el uso de tecnologías libres y estándar, como son Vorbis para el audio y Theora para el vídeo.