<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chuso! &#187; desarrollo</title>
	<atom:link href="http://chusete.es/category/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>http://chusete.es</link>
	<description>A la tercera va la vencida</description>
	<lastBuildDate>Tue, 27 Jul 2010 11:57:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>10 errores comunes de programadores web novatos</title>
		<link>http://chusete.es/2010/07/22/10-errores-comunes-de-programadores-web-novatos/</link>
		<comments>http://chusete.es/2010/07/22/10-errores-comunes-de-programadores-web-novatos/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 21:53:33 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[errores]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[novatos]]></category>
		<category><![CDATA[sitepoint]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=777</guid>
		<description><![CDATA[Hace poco comentaba que en SitePoint habían publicado una lista de los 10 errores comunes de diseñadores web novatos. Pues recientemente publicaron un nuevo artículo, pero esta vez sobre los programadores web. Aquí el resumen: Ignorar los estándares web. Destacan el uso incorrecto del DOCTYPE, uso de etiquetas antiguas de HTML, o no validar el [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco comentaba que en SitePoint habían publicado una lista de los <a href="http://chusete.es/2010/06/15/10-errores-comunes-de-disenadores-web-novatos/">10 errores comunes de diseñadores web novatos</a>. Pues recientemente publicaron un <a href="http://www.sitepoint.com/blogs/2010/07/15/top-10-web-development-mistakes/">nuevo artículo</a>, pero esta vez sobre los programadores web. Aquí el resumen:</p>
<ol>
<li>Ignorar los estándares web. Destacan el uso incorrecto del DOCTYPE, uso de etiquetas antiguas de HTML, o no validar el código.</li>
<li>Delegar en software WYSIWYG. Muy acertadamente indican que, con este tipo de software uno se centra en la visualización, y no en la estructura.</li>
<li>Descuidar aspectos semánticos. El ejemplo que ponen es impagable: El programador novato, si quiere escribir un titular, lo pondrá encerrado en la etiqueta &lt;h1&gt;. Pero posteriormente es posible que &#8220;involucione&#8221;, y lo diseñe con divs anidados y estilos CSS.</li>
<li>Nombres de clases de estilos. ¿Qué tal una clase como &#8220;columna-izquierda-50px&#8221;? ¿Y si en un futuro el ancho cambia?</li>
<li>Prueba de navegadores tardía. Invitan al programador novato a revisar su página en varios navegadores desde el primer momento, y no dejarlo para el final. Personalmente, en este punto no estoy de acuerdo; Siempre he preferido desarrollar para una plataforma, y al final, corregir errores de las demás.</li>
<li>Ignorar la portabilidad. Destacan enlaces a rutas absolutas, conexiones a bases de datos sin centralizar, o realizar suposiciones sobre el entorno de ejecución.</li>
<li>Descuidar el ancho de banda. Poco más que añadir&#8230; En local un fichero de unos megas es irrelevante, no así en Internet.</li>
<li>Pésima accesibilidad. No consiste sólo en seguir unas reglas mecánicas de código, sino en tener en cuenta aspectos funcionales como poder consultar la web sin javascript, sin flash, en un móvil, o sin ratón.</li>
<li>Despreciar al SEO. Me encanta la definición que hacen del SEO: <em>Es una mezcla de psicoanálisis, complejidad técnica, y misteriosas artes oscuras</em>. En cualquier caso, indican que el desarrollador novato, dejará el SEO para el departamento de marketing una vez lanzada la página. Para entonces, ya será demasiado tarde.</li>
<li>Actualizaciones erróneas. Destacan la práctica de muchos programadores web de tener durante horas una página web en mantenimiento, cuando suele ser una tarea que no debería llevar más de unos minutos. En este punto tampoco estoy de acuerdo. Muchas actualizaciones tan sólo consisten en añadir documentos html, imágenes, y actualizar hojas de estilo y javascript. Sin embargo, hay aplicaciones web que requieren mucho más que eso a la hora de actualizar, por ejemplo cuando cambiamos la estructura de una base de datos, y se deben reestablecer todos los índices.</li>
<li>Como bonus, dejan una lista de otros 20 errores.</li>
</ol>
<p>En general, este artículo me ha parecido bastante más pobre que el anterior. Sobre todo, por lo mucho que se centra en la capa de presentación HTML, que dista mucho de ser coto exclusivo de los programadores web. En ningún punto se ha mencionado ni una sola práctica o error relacionada con la programación (Salvo el punto 6, donde sugieren no incluir <em>hard coded</em> la conexión a base de datos).</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2010/07/22/10-errores-comunes-de-programadores-web-novatos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.3.3 liberada</title>
		<link>http://chusete.es/2010/07/22/php-5-3-3-liberada/</link>
		<comments>http://chusete.es/2010/07/22/php-5-3-3-liberada/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 21:13:31 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=775</guid>
		<description><![CDATA[Hace ya un año que PHP lanzó la versión 5.3.0, la última rama de desarrollo de la versión 5 que adelanta muchas de las funcionalidades más esperadas, como namespaces o closures. Hoy se ha liberado la versión 5.3.3. Se ha centrado sobre todo en mejorar el rendimiento y la seguridad de la rama 5.3, con [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya un año que <a href="http://www.php.net/archive/2009.php#id2009-06-30-1">PHP lanzó la versión 5.3.0</a>, la última rama de desarrollo de la versión 5 que adelanta muchas de las funcionalidades más esperadas, como namespaces o closures. Hoy <a href="http://www.php.net/archive/2010.php#id2010-07-22-2">se ha liberado la versión 5.3.3</a>. Se ha centrado sobre todo en mejorar el rendimiento y la seguridad de la rama 5.3, con más de 100 errores corregidos, por lo que se recomienda encarecidamente actualizar a la nueva versión.</p>
<p>Entre las novedades, se destacan:</p>
<ul>
<li>Actualizada la versión de sqlite a 3.6.23.1</li>
<li>Actualizada la versión de <a href="http://www.pcre.org/">PCRE</a> (Expresiones Regulares Compatibles con Perl) a la versión 8.02</li>
<li>Añadido FPM (Gestor de Procesos de FastCGI) SAPI. SAPI hace referencia a los módulos de PHP que hacen de interfaz al servidor web (<a href="http://en.wikipedia.org/wiki/Server_Application_Programming_Interface">Server Application Programming Interface</a>)</li>
<li>Añadido soporte para <a href="http://www.php.net/manual/en/stream.filters.php">stream filter</a> de la extensión mcrypt.</li>
</ul>
<p>¡A disfrutarlo!</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2010/07/22/php-5-3-3-liberada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 errores comunes de diseñadores web novatos</title>
		<link>http://chusete.es/2010/06/15/10-errores-comunes-de-disenadores-web-novatos/</link>
		<comments>http://chusete.es/2010/06/15/10-errores-comunes-de-disenadores-web-novatos/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 21:39:15 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[errores]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=766</guid>
		<description><![CDATA[Hoy me he encontrado en SitePoint un curioso artículo titulado &#8220;10 Common Mistakes Made by Novice Web Designers&#8220;. Me ha parecido muy interesante, pues aunque no soy diseñador propiamente dicho, pero sí he cometido muchos de esos errores. Y esta es la lista: No tener en cuenta la forma de visualizar del navegador. Cada navegador [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy me he encontrado en SitePoint un curioso artículo titulado &#8220;<a href="http://www.sitepoint.com/blogs/2010/06/15/top-10-web-design-mistakes/">10 Common Mistakes Made by Novice Web Designers</a>&#8220;. Me ha parecido muy interesante, pues aunque no soy diseñador propiamente dicho, pero sí he cometido muchos de esos errores.</p>
<p>Y esta es la lista:</p>
<ol>
<li>No tener en cuenta la forma de visualizar del navegador. Cada navegador funciona a una resolución, y ésta normalmente no es la misma que los bocetos hechos en Photoshop. ¿Cómo se comporta la página al cambiar de tamaño?</li>
<li>Forzar a altos y anchos fijos. ¿Qué ocurre si el texto que hay dentro es anormalmente extenso o anormalmente corto?</li>
<li>Presuponer sobre la experiencia del usuario. Hay muchas resoluciones y muchos dispositivos a tener en cuenta.</li>
<li>Sub-pixels en bocetos. Un boceto a 300 ppp no se verá igual en un monitor a 72 ppp.</li>
<li>Desconocimiento de las pilas de fuentes. No todas las fuentes funcionan en todos los sistemas, ni siempre se ven igual.</li>
<li>No tener en cuenta el desarrollo. Nos ponen el ejemplo de títulos ricos en diseño que sólo se pueden conseguir con imágenes. Es algo asumible cuando hay 5 o 50 páginas, ¿pero y si hay 500? ¿O 5000?</li>
<li>Olvidar en los enlaces. Los links son el hilo conductor de la web, y hay que diferenciarlos bien del resto del contenido.</li>
<li>No tener en cuenta animaciones o efectos. Esto no se puede reflejar en un diseño en photoshop.</li>
<li>Controles de formularios extraños o inaccesibles. Nos explican que los formularios son sosos, pero que sin embargo los navegadores saben renderizarlos y los usuarios los entienden.</li>
<li>Poca apreciación por las tecnologías. HTML y Flash no son lo mismo <img src='http://chusete.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ol>
<p>En mi opinión, las más importantes a tener en cuenta (O al menos las que más problemas me han dado) son la 2, 4, 6, 8 y 10 (Curioso, justo los pares).</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2010/06/15/10-errores-comunes-de-disenadores-web-novatos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebApps Working Group</title>
		<link>http://chusete.es/2009/12/23/webapps-working-group/</link>
		<comments>http://chusete.es/2009/12/23/webapps-working-group/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 04:22:04 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[javasctipt]]></category>
		<category><![CDATA[file API]]></category>
		<category><![CDATA[selectores]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[web SQL database]]></category>
		<category><![CDATA[web storage]]></category>
		<category><![CDATA[web workers]]></category>
		<category><![CDATA[webapps]]></category>
		<category><![CDATA[webScokes]]></category>
		<category><![CDATA[widgets]]></category>
		<category><![CDATA[workers]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=670</guid>
		<description><![CDATA[Ú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? &#8220;El W3C Web Applications (WebApps) Working Group, una fusión de los grupos de trabajoWebAPI y WAF, se constituye para desarollar [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente leo bastante la página del <a href="http://www.w3.org">w3c</a> (Qué acierto fue cambiar su diseño), y casi siempre me veo a mí mismo leyendo sobre el Grupo de Trabajo de Aplicaciones Web (<a href="http://www.w3.org/2008/webapps/">WebApps Working Group</a>). ¿Qué es?</p>
<p>&#8220;<em>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 <strong>desarrollo de nuevas APIs que enriquezcan las aplicaciones web</strong>.</em>&#8221;</p>
<p>Veamos en qué consisten algunas de esas APIs que están desarrollando:</p>
<h2><a href="http://www.w3.org/TR/2009/CR-widgets-apis-20091222/">Interfaz para Widgets</a></h2>
<p>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.</p>
<p>Está bastante maduro (En estado de <a href="http://www.w3.org/Consortium/Process/Process-19991111/tr.html#RecsCR">Recomendación Candidata</a>), y existe una <a href="http://dev.w3.org/2006/waf/widgets-api/test-suite/">suite de tests</a> para probar su correcta implementación.</p>
<h2><a href="http://www.w3.org/TR/2009/CR-selectors-api-20091222/">API de selectores Level 1</a></h2>
<p>Supongamos el siguiente bloque de código HTML 4.01:</p>
<pre>&lt;table id="score"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Test
      &lt;th&gt;Result
  &lt;tfoot&gt;
    &lt;tr&gt;
      &lt;th&gt;Average
      &lt;td&gt;82%
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;A
      &lt;td&gt;87%
    &lt;tr&gt;
      &lt;td&gt;B
      &lt;td&gt;78%
    &lt;tr&gt;
      &lt;td&gt;C
      &lt;td&gt;81%
&lt;/table&gt;</pre>
<p>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:</p>
<pre>var table = document.getElementById("score");
var groups = table.tBodies;
var rows = null;
var cells = [];

for (var i = 0; i &lt; groups.length; i++) {
  rows = groups[i].rows;
  for (var j = 0; j &lt; rows.length; j++) {
    cells.push(rows[j].cells[1]);
  }
}
</pre>
<p>¡Qué feo! La nueva API permite hacerlo de este modo mucho más conciso:</p>
<pre>
<pre>var cells = document.querySelectorAll("#score&gt;tbody&gt;tr&gt;td:nth-of-type(2)");</pre>
</pre>
<p>Como véis, es exactamente igual que lo que ya hacemos con los <a href="http://docs.jquery.com/Selectors">selectores de jQuery</a>, salvo que en un tiempo podremos realizarlo directamente desde el motor de JavaScript del navegador, sin necesidad de frameworks.</p>
<p>Esta API también está muy madura, y al igual que la anterior es una Recomendación Candidata. Está disponible en <a href="https://developer.mozilla.org/En/Code_snippets/QuerySelector">Firefox</a> 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.</p>
<h2><a href="http://www.w3.org/TR/2009/WD-webstorage-20091222/">Web Storage</a></h2>
<p>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 <a href="http://code.google.com/apis/gears/">Google Gears</a>), y también permite almacenarlo accesible a todas las ventanas del dominio al que pertenecen.</p>
<p>Todo se realizaría de un modo muy sencillo: Simplemente accediendo al atributo que proceda dentro del objeto <a href="http://www.w3.org/TR/2009/WD-webstorage-20091222/#dom-localstorage">localStorage</a>.</p>
<p>De nuevo, está disponible ya en <a href="https://developer.mozilla.org/en/DOM/Storage">Firefox</a> 3.5, IE8, <a href="http://developer.apple.com/safari/library/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Name-ValueStorage/Name-ValueStorage.html">Safari 4.0</a>, Chromium&#8230;</p>
<h2><a href="http://www.w3.org/TR/2009/WD-workers-20091222/">Web Workers</a></h2>
<p>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.</p>
<p>Como ejemplos, podríamos:</p>
<ul>
<li>Generar una hebra que busque números primos en background.</li>
<li>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.</li>
<li>Operaciones de Lectura/Escritura de fondo.</li>
<li>Workers compartido. Distintas ventanas podría compartir un único Worker que, en un momento dado, podría actualizar a todas a la vez.</li>
<li>Delegación. Aprovechando las distintas CPUs de los microprocesadores multi-core.</li>
</ul>
<p>Lógicamente, esto abre un gran número de posibilidades en cuanto al rendimiento de las páginas web.</p>
<p>Por el momento disponible en <a href="https://developer.mozilla.org/En/Using_web_workers">Firefox 3.5+</a>, Safari 4, Chromium.</p>
<h2><a href="http://www.w3.org/TR/2009/WD-eventsource-20091222/">Server-Sent Events</a></h2>
<p>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.</p>
<h2><a href="http://www.w3.org/TR/2009/WD-websockets-20091222/">WebSockets API</a></h2>
<p>Esta API permite una auténtica conexión bidireccional entre el navegador y el servidor. Ya fue cubierta en <a href="/2009/12/11/google-chrome-ahora-con-web-sockets/">este blog</a> cuando Google Chrome anunció su implementación.</p>
<h2><a href="http://www.w3.org/TR/2009/WD-webdatabase-20091222/">Web SQL Database</a></h2>
<p>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.</p>
<p>Veamos un ejemplo de su funcionamiento:</p>
<pre>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);
});</pre>
<p>En primer lugar se define la función   <code>prepareDatabase()</code> que, en caso de que fuera necesario, crea la base de datos con una tabla llamada &#8220;docids&#8221; con dos columnas (&#8220;id&#8221; y &#8220;name&#8221;). Si hay éxito, o no es necesario crearla, se llama a la función <code>getDatabase()</code>, que obtiene un manejador de la base de datos, y entonces llama a la función que hace realmente el trabajo, en este caso <code>showDocCount()</code>.</p>
<h2><a href="http://dev.w3.org/2006/webapi/FileAPI/">File API</a></h2>
<p>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:</p>
<ul>
<li>Una vez que el usuario conceda permisos, el navegador permitirá leer y parsear un fichero.</li>
<li>Se podrá almacenar información de forma local.</li>
<li>Se permitirá guardar los archivos, del mismo modo que ahora se pueden descargar ficheros de servidores remotos.</li>
<li>Se podrán enviar ficheros grandes a servidores de un modo más eficiente que el actual. Por ejemplo, se podrá dividir en porciones.</li>
<li>Los navegadores implementarán mecanismos para poder cancelar o impedir los casos de uso enumerados anteriormente.</li>
</ul>
<hr />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.</p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/12/23/webapps-working-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vídeo, audio e imágenes de entrada al navegador</title>
		<link>http://chusete.es/2009/12/21/video-audio-e-imagenes-de-entrada-al-navegador/</link>
		<comments>http://chusete.es/2009/12/21/video-audio-e-imagenes-de-entrada-al-navegador/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 01:39:10 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[javasctipt]]></category>
		<category><![CDATA[cámara]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[microfono]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[webcam]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=665</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco se ha publicado un nuevo borrador del w3c (<a href="http://dev.w3.org/2009/dap/camera/">The Capture API</a>) 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.</p>
<p>Aun se encuentra en un estado muy prematuro, pero nos enumeran una serie de posibles casos de uso:</p>
<ul>
<li><strong>Captura y envío de imágenes.</strong> Permitiendo el envío por XHR de varias imágenes.</li>
<li><strong>Captura de imagen panorámica.</strong> Por ejemplo, con 3 tomas que posteriormente se &#8220;concatenan&#8221; automáticamente para mostrar la panorámica.</li>
<li><strong>Video Chat</strong>. Aun está sin definir el método para realizar streaming, sin embargo todas las soluciones propuestas pasan por <a href="http://chusete.es/2009/12/11/google-chrome-ahora-con-web-sockets/">websockets</a>.</li>
<li><strong>Cámara web.</strong> 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.</li>
<li><strong>Búsqueda por voz.</strong> Introduciendo por el micrófono la cadena de búsqueda.</li>
<li><strong>Recordatorio de voz.</strong> De nuevo, desde el micrófono.</li>
</ul>
<p>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.</p>
<p>Ejemplo de uso:</p>
<pre name="code" class="javascript">
// 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);
</pre>
<p>Mientras tanto, y hasta que esto sea una realidad, se puede utilizar el paquete <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/package-detail.html">flash.media de ActionScript3</a>, en concreto las clases <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/Camera.html">Camera</a> y <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/Microphone.html">Micrphone</a>. 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.</p>
<p><span> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/12/21/video-audio-e-imagenes-de-entrada-al-navegador/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chrome ahora con Web Sockets</title>
		<link>http://chusete.es/2009/12/11/google-chrome-ahora-con-web-sockets/</link>
		<comments>http://chusete.es/2009/12/11/google-chrome-ahora-con-web-sockets/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 04:01:58 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[comet]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[websockets]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=661</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>La noticia del día en cuanto a desarrollo web sin duda ha sido la implementación de <a href="http://blog.chromium.org/2009/12/web-sockets-now-available-in-google.html">Web Sockets en Chromium</a>. una tecnología de comunicación bidireccional para aplicaciones web.</p>
<p>Los Web Sockets son un <a href="http://dev.w3.org/html5/websockets/">borrador del W3C</a> que, mediante una conexión TCP, permiten realizar fácilmente un <a href="http://en.wikipedia.org/wiki/Push_technology">Server Push</a>, 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.</p>
<p>Veamos un ejemplo del código del lado del cliente:</p>
<pre name="code" class="javascript">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.
}</pre>
<p>Ridícultamente sencillo, ¿verdad? <img src='http://chusete.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Como se puede observar en la URI de la petición, funciona mediante un protocolo distinto al HTTP (ws://example.com/service), el <a href="http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-55">web socket protocol</a>. Por tanto el servidor debe estar capacitado para manejar dichas peticiones. Con fines experimentales, Google ha creado <a href="http://code.google.com/p/pywebsocket/">pywebsocket</a>, 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).</p>
<p>Las ventajas son evidentes: Supongamos un chat. Un usuario accede y dice &#8220;hola&#8221;. 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 <img src='http://chusete.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>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).</p>
<h2>Comet</h2>
<p>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 <a href="http://en.wikipedia.org/wiki/Comet_%28programming%29">Comet</a>: 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.</p>
<p>Los principales métodos para lograr Comet en el navegador son éstos:</p>
<ul>
<li><strong>Streaming</strong> &#8211; 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:
<ol>
<li><strong>IFrame oculto</strong> &#8211; 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.</li>
<li><strong>XMLHTTPRequest</strong> &#8211; En 1995, <a title="Netscape Navigator" href="http://en.wikipedia.org/wiki/Netscape_Navigator">Netscape Navigator</a> añadió una funcionalidad llamada “server push” que permite peticiones XHR &#8220;multipart&#8221; mediante el tipo mime <code>multipart/x-mixed-replace</code>. 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.</li>
</ol>
</li>
<li><strong>Long polling en AJAX</strong> &#8211; 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 <acronym title="HTTPXmlRequest">XHR</acronym>.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.<strong><span> </span></strong>
<ul>
<li><span id="XMLHttpRequest_long_polling"><strong>XMLHttpRequest long polling</strong> &#8211; 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.</span></li>
<li><span id="Script_tag_long_polling"><strong>Script tag long polling</strong> &#8211; 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.</span></li>
</ul>
</li>
</ul>
<p>Especial mención respecto a Comet merece el <a href="http://svn.cometd.com/trunk/bayeux/bayeux.html">protocolo Bayeux</a>, y la implementación <a href="http://cometdproject.dojotoolkit.org/">CometD de Dojo Foundation</a>. Utilizando el paradigma Comet, han diseñado todo un protocolo de red que, a diferencia de &#8220;web socket protocol&#8221;, 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.</p>
<h2>Otras implementaciones de Sockets</h2>
<p>Por supuesto aquí no acaba la cosa. Algunos plugins permiten ejecutar sockets, como por ejemplo el objeto <a href="http://livedocs.adobe.com/flex/3/langref/flash/net/Socket.html">Socket</a> de Adobe Flash que permite enviar flujos binarios. Por supuesto Silverlight y Java mediante applets también permiten realizarlo.</p>
<p>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.</p>
<h2>¿Y ahora qué?</h2>
<p>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).</p>
<p>¿Y para los usuarios? Junto con otras tecnologias, los Web Sockets abren muchas puertas de cara al futuro. Por ejemplo, con <a href="http://code.google.com/apis/o3d/">O3D</a> o <a href="http://www.khronos.org/webgl/wiki/Main_Page">WebGL</a>, sockets y &lt;audio&gt; 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 <img src='http://chusete.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ¡Estén atentos!</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/12/11/google-chrome-ahora-con-web-sockets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Facturas en CSS</title>
		<link>http://chusete.es/2009/12/08/facturas-en-css/</link>
		<comments>http://chusete.es/2009/12/08/facturas-en-css/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 15:51:58 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[factura]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=650</guid>
		<description><![CDATA[Vía css-tricks veo un sencillo método para crear facturas sólo con CSS. ¿Y por qué usar este método en lugar de un software específico? Bueno, gracias a esto sólo necesitas el navegador para poder crear tus facturas. Y qué demonios, es muy ilustrativo el ejemplo. ¡Qué de cosas se pueden hacer con textarea! Además, es [...]]]></description>
			<content:encoded><![CDATA[<p>Vía <a href="http://css-tricks.com/editable-invoice-v2">css-tricks</a> veo un sencillo método para crear facturas sólo con CSS. ¿Y por qué usar este método en lugar de un software específico? Bueno, gracias a esto sólo necesitas el navegador para poder crear tus facturas. Y qué demonios, es muy ilustrativo el ejemplo. ¡Qué de cosas se pueden hacer con textarea! Además, es fácil de imprimir, y pasarlo a PDF es algo trivial.</p>
<p><a href="http://css-tricks.com/examples/EditableInvoice/">Ver demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/12/08/facturas-en-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Botones súper increíbles con CSS3 y RGBA</title>
		<link>http://chusete.es/2009/12/08/botones-super-increibles-con-css3-y-rgba/</link>
		<comments>http://chusete.es/2009/12/08/botones-super-increibles-con-css3-y-rgba/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 04:08:16 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[botones]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[enlaces]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[rgba]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=583</guid>
		<description><![CDATA[CSS3 ya está aquí, y ha llegado para quedarse. Gracias a él, podemos crear increíbles efectos en navegadores modernos (Teniendo en cuenta un enfoque de graceful degradation). En éste artículo voy a mostrar cómo, desde ZURB, han creado unos botones CSS que realmente son súper increíbles. Accede a la página del artículo para ver demostraciones [...]]]></description>
			<content:encoded><![CDATA[<p>CSS3 ya está aquí, y ha llegado para quedarse. Gracias a él, podemos crear increíbles efectos en navegadores modernos (Teniendo en cuenta un enfoque de <a href="http://chusete.es/2009/11/05/mejora-progresiva/">graceful degradation</a>). En éste artículo voy a mostrar cómo, desde <a href="http://www.zurb.com/playground/super-awesome-buttons">ZURB</a>, han creado unos botones CSS que realmente son súper increíbles. Accede a la página del artículo para ver demostraciones en vivo.</p>
<p><a class="button" href="#">Botón en ancla »</a></p>
<p><a class="large green button" href="#">Botón en ancla 2 »</a></p>
<p>La magia está en el CSS:</p>
<pre name="code" class="css">.button{
   background:#222 url(/wp-content/uploads/2009/12/alert-overlay.png) repeat-x 0 0;
   display:inline-block;
   padding:5px 15px 6px;
   color:#fff !important;
   font-size:13px;
   font-weight:bold;
   line-height:1;
   text-decoration:none;
   -moz-border-radius:5px;
   -webkit-border-radius:5px;
   -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25);
   -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25);
   text-shadow:0 -1px 1px rgba(0,0,0,0.25);
   border-bottom:1px solid rgba(0,0,0,0.25);
   position:relative;
   cursor:pointer;
   overflow:visible;
   width:auto
}

button::-moz-focus-inner{
   border:0;
   padding:0
}

.button:hover{
   background-color: #111111;
   color: white
}

.button:active{
   top:1px
}</pre>
<p>Una sombra a la caja, otra al texto, un borde redondeado, y de fondo una imagen png que realiza el degradado (Se puede realizar también con CSS en Webkit). Una pasada hacer todo esto sólo con CSS, ¿no?</p>
<p>¡Pero espera! ¡Ahí no queda la cosa! ¿Qué ocurriría si cambiásemos el color de fondo sobre el que está el botón? La sombra se vería &#8220;rara&#8221;, al igual que el color del borde.</p>
<p><a href="http://chusete.es/wp-content/uploads/2009/12/super-awesome-buttons-fixed.png"><img class="aligncenter size-full wp-image-639" title="super-awesome-buttons-fixed" src="http://chusete.es/wp-content/uploads/2009/12/super-awesome-buttons-fixed.png" alt="super-awesome-buttons-fixed" width="413" height="66" /></a></p>
<p>Y lo mismo ocurriría con la sombra del texto si cambiásemos el color de relleno del propio botón. ¿Cómo se soluciona? Ahora es cuando llega al rescate la A de RGBA <img src='http://chusete.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Por ejemplo, en la sombra de la caja, lo hemos definido como:</p>
<pre>rgba(0,0,0,0.25)</pre>
<p>Es decir, color negro al 25% de transparencia. De ese modo, la sombra siempre &#8220;lucirá&#8221; del mismo modo usemos el color que usemos.</p>
<p>Espero que os haya gustado tanto como a mí.</p>
<p>Vía <a href="http://www.smashingmagazine.com/2009/12/02/pushing-your-buttons-with-practical-css3/">Smashin Magazine</a>,</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/12/08/botones-super-increibles-con-css3-y-rgba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El test de Joel adaptado al desarrollo web</title>
		<link>http://chusete.es/2009/11/05/el-test-de-joel-adaptado-al-desarrollo-web/</link>
		<comments>http://chusete.es/2009/11/05/el-test-de-joel-adaptado-al-desarrollo-web/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 23:13:02 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[desarrollo web]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=577</guid>
		<description><![CDATA[Leyendo blogs, me encuentro con este artículo que trata sobre una revisión del sencillo test de Joel Spolsky sobre la calidad del software. Esta nueva revisión, de la mano de Brandon Savage, propone 12 pasos adaptados al desarrollo web hoy día. Los pasos se responden con un sí o un no. Estos son los posibles [...]]]></description>
			<content:encoded><![CDATA[<p>Leyendo blogs, me encuentro con <a href="http://www.brandonsavage.net/adapting-the-joel-test-to-web-development/">este artículo</a> que trata sobre una revisión del sencillo <a href="http://www.joelonsoftware.com/articles/fog0000000043.html">test de Joel Spolsky sobre la calidad del software</a>. Esta nueva revisión, de la mano de Brandon Savage, propone 12 pasos adaptados al desarrollo web hoy día. Los pasos se responden con un sí o un no. Estos son los posibles resultados:</p>
<ul>
<li>12 síes. Perfecto.</li>
<li>11 síes. Aceptable.</li>
<li>10 o menos síes. Tienes un serio problema.</li>
</ul>
<p>Ahora veamos las preguntas:</p>
<p><span></p>
<ol>
<li>¿Usas algún <a href="http://en.wikipedia.org/wiki/Revision_Control_System">sistema de control de versiones</a>?</li>
<li>¿Puedes generar fichero para distribuir tu software en sólo un paso?</li>
<li>¿Usas <a href="http://martinfowler.com/articles/continuousIntegration.html">integración continua</a>?</li>
<li>¿Guardas un registro de bugs?</li>
<li>¿Corriges los bugs tras escribir nuevo código?</li>
<li>¿Cumples los hitos a tiempo?</li>
<li>¿Documentas las especificaciones?</li>
<li>¿Disfrutan tus programadores de un entorno de trabajo tranquilo?</li>
<li>¿Usas las mejores herramientas, y gastas dinero en aquéllas que son necesarias y caras?</li>
<li>¿Escribes <a href="http://en.wikipedia.org/wiki/Unit_testing">test unitarios</a>?</li>
<li>¿Tus nuevos candidatos demuestran sus conocimientos de programación con alguna prueba tangible durante la entrevista?</li>
<li>¿Tienes testers?</li>
</ol>
<p></span></p>
<p>En mayor o menor medida, todas me parecen propuestas muy acertadas. No deja de ser una curiosidad más, pero posiblemente este &#8220;juego&#8221; sea una métrica de calidad de software equiparable a otros sistmas varios órdenes de magnitud más complejos.</p>
<p>Por cierto, yo obtengo un 6 sobre 11 (La pregunta número 11 no se aplica en mi caso).</p>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/11/05/el-test-de-joel-adaptado-al-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mejora progresiva</title>
		<link>http://chusete.es/2009/11/05/mejora-progresiva/</link>
		<comments>http://chusete.es/2009/11/05/mejora-progresiva/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 22:44:00 +0000</pubDate>
		<dc:creator>chusete</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[mejora progresiva]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://chusete.es/?p=575</guid>
		<description><![CDATA[De un tiempo a ahora, cada vez leo con más frecuencia el término progressive enhancement, o en catellano, mejora progresiva. ¿Qué es exactamente? Como desarrolladores web, debemos lidiar con numerosos navegadores, cada uno con una serie de prestaciones y recursos. Como veremos a continuación, normalmente hay 4 formas de abordar esta situación: Impedir el acceso [...]]]></description>
			<content:encoded><![CDATA[<p>De un tiempo a ahora, cada vez leo con más frecuencia el término <em>progressive enhancement</em>, o en catellano, mejora progresiva. ¿Qué es exactamente? Como desarrolladores web, debemos lidiar con numerosos navegadores, cada uno con una serie de prestaciones y recursos. Como veremos a continuación, normalmente hay 4 formas de abordar esta situación:</p>
<ol>
<li><strong>Impedir el acceso a determinados navegadores</strong>. Creedme, existen páginas a las que no se puede acceder con según qué navegadores. No me refiero a que se muestren defectuosas, es que directamente te muestran un mensaje de error. Tratad de acceder a una página de El Plural cambiando el user-agent de vuestro navegador y sabréis a qué me refiero. Ésta es una pésima solución.</li>
<li><strong>Quedarnos en el mínimo común denominador</strong>. Esto es, diseñar la página de modo que sólo contenga recursos disponibles por todos los navegadores. No es una solución muy escalable, puesto que se está limitando a las funcionalidades mínimas (Funcionalidades que, por otro lado, normalmente se corresponden con las de nuestro querido IE6). Visto con un enfoque más visual, esto significa que la manada debe ir a la velocidad del más lento. Por ejemplo, querémos posicionar un &lt;div&gt; de forma &#8216;fixed&#8217;. IE6 no lo permite, de modo que, o no lo hacemos, o dedicamos esfuerzos en buscar retorcidos hacks para lograrlo en este navegador. Mmmm no me gusta. ¿Qué más hay?</li>
<li><a href="http://en.wikipedia.org/wiki/Fault-tolerant_system"><em><strong>Graceful degradation</strong></em></a>. Durante mucho tiempo ésta ha sido la tendencia reinante, y seguramente seguirá siéndolo. Consiste en partir del máximo de prestaciones de forma que, a medida que se usen navegadores menos avanzados, la página se mantenga usable con pequeños defectos. Un ejemplo perfecto es el uso de imágenes PNG con semitransparencias: Mientras que los usuarios de Firefox o Safari las verán sin problemas, los de IE6 se encontrarán con imágenes <em>corruptas</em>. En estos casos es frecuente dividir la página en dos niveles: El nivel 1 corresponde a una buena experiencia para el usuario, el nivel 2 con una versión degradada de la página. Encontramos un ejemplo en el servicio de correo de Google Gmail, con su versión avanzada (Por defecto) y una versión básica.</li>
<li><a href="http://en.wikipedia.org/wiki/Progressive_enhancement"><strong>Mejora progresiva</strong></a>. Y al fin llegamos a la mejora progresiva. ¿En qué consiste? Es exactamente igual que <em>graceful degradation</em> pero al revés. En lugar de partir de una versión avanzada, se parte de la versión mínima, de forma que, a medida que un navegador ofrece mejores recursos, la página también se ve mejorada. En este caso, se parte de un mínimo razonable, por ejemplo, que sea compatible con HTML 4. Podría, por ejemplo, usarse transparencias en GIF, y sin embargo, en aquéllos navegadores que sí lo soporten, semitransparencias en PNG.</li>
</ol>
<p>Lógicamente las dos mejores soluciones son las dos últimas. ¿Cuál es mejor? Realmente depende del caso. Pero como método general yo prefiero la mejora progresiva, pues a diferencia de graceful degradation parte de una experiencia de usuario razonablemente buena. Además, con esto siempre ganaremos en accesibilidad.</p>
<p>Si bien cada día existen más navegadores con sus respectivas versiones, también es cierto que disponemos cada vez más de recursos que nos permiten abstraernos de ellos, como los numerosos frameworks javascript como <a href="http://jquery.com/">jquery</a> o <a href="http://mootools.net/">mootools</a>, además de brillantes soluciones como <a href="http://code.google.com/chrome/chromeframe/">Google Chrome Frame</a>.</p>
<p>Más información:</p>
<ul>
<li><a href="http://www.sitepoint.com/blogs/2009/09/22/progressive-enhancement-graceful-degradation-basics/">Sitepoint &#8211; Progressive Enhancement and Graceful Degradation: an Overview</a> &#8211; Introducción didáctica para conocer los principios de la mejora progresiva.</li>
<li><a href="http://www.alistapart.com/articles/understandingprogressiveenhancement/">Sitepoint &#8211; Progressive Enhancement and Graceful Degradation: Making a Choice</a> &#8211; Aporta pautas para saber qué elegir.</li>
<li><a href="http://www.alistapart.com/articles/understandingprogressiveenhancement/">A List Apart &#8211; Understanding Progressive Enhancement</a> &#8211; Posiblemente la mejor introducción a la mejor progresiva que he leído.</li>
<li><a href="http://www.smashingmagazine.com/2009/04/22/progressive-enhancement-what-it-is-and-how-to-use-it/">Smashing Magazine &#8211; Progressive Enhancement: What It Is, And How To Use It?</a> &#8211; Con un útil ejemplo de uso.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://chusete.es/2009/11/05/mejora-progresiva/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
