Category: internet


Para los que quieran leer los capítulos anteriores:

  1. Optimización web ( I )
  2. Optimización web ( II ) : CSS Sprites
  3. Optimización web ( III ) : Minimizando archivos

A lo largo de los capítulos anteriores hemos repasado ciertas técnicas para reducir el peso de nuestras páginas, y en alguna medida, para reducir el número de peticiones HTTP. También explicamos brevemente algún que otro truco para reducir el tiempo de renderizado de la página que no estaba íntimamente ligado con su tamaño o el número de peticiones HTTP. A algunos podría parecerles suficiente (espero que a pocos, dentro del mundo de la informática deberíamos ser siempre poco conformistas), pero el abanico de técnicas no se acaba aquí.

Hoy empezamos una subserie de artículos dedicados a los mecanismos de cache a diferentes niveles (dentro del contexto de la creación de páginas web). La palabra cache se usa dentro de muchos contextos y con significados muy diversos, pero todos ligados por una definición algo vaga y generalista, que es la siguiente (sacada de Wikipedia): “Una cache es un conjunto de datos duplicados de otros originales, con la propiedad de que los datos originales son costosos de acceder (comparativamente con el coste de acceder a la copia del dato en cache)“.

¿Y en qué contextos usaremos nosotros las caches? Pues en diversos:

  1. Para no tener que solicitar ciertos recursos al servidor cada vez que recarguemos la página (imágenes, archivos CSS, archivos JS, algunas páginas estáticas… (cache del lado del cliente, o de proxies intermedios)
  2. Para no tener que hacer tantas peticiones a las bases de datos de la página cuando un dato es accedido muchas veces en modo lectura y no acostumbra a ser modificado… (cache del lado del servidor)
  3. Para no tener que generar ciertas páginas dinámicamente (con PHP, ASP, Java, Python, etc) cuando éstas cambien muy pocas veces a lo largo del tiempo… (cache del lado del servidor)

Empezaremos con las caches del lado del cliente. Antes de continuar debo indicar que, desgraciadamente, lo que explicaré a partir de ahora no es para nada universal, dependiendo de las tecnologías que uséis os resultará útil o no. Los conceptos generales sí que son válidos para cualquier opción que escojáis, pero las implementaciones no.

Después de asustar a unos pocos debo decir también que lo que sigue será útil para la mayoría (en el capítulo de hoy), trabajaremos con el servidor web Apache y PHP.

Para evitar volver a descargar ciertas imágenes y otros ficheros cada vez que recargamos la página hoy en día podemos encontrar como mínimo dos mecanismos con cierta importancia: las marcas de tiempo y las ETags (entity tags).

Vistas por encima, las marcas de tiempo vienen a ser ciertos datos adjuntos en las cabeceras de los mensajes HTTP que indican cuanto tiempo se podrá guardar un recurso concreto descargado sin tener que volver a solicitarlo. Por ejemplo, si adjuntamos una marca de tiempo que indique que cierta imagen será válida durante un día entero, ésta no volverá a ser descargada durante un día cada vez que se recargue la página.

El problema de las marcas de tiempo es que son algo inflexibles, si por alguna razón queremos modificar un recurso concreto puede darse el caso de que muchos navegantes sigan trabajando con una copia antigua de éste durante un tiempo. Pero tenemos el otro recurso que he mencionado anteriormente, las ETags. Éstas son tambien metainformación adjunta en las cabeceras de los mensajes HTTP que sirven para indicar si un recurso ha sido modificado o no. ¿Cómo se hace? Pues bien, se le adjunta un identificador largo a cada recurso de forma que, si este es modificado, el identificador cambie también. Si el navegador ha obtenido ya un recurso con una ETag, cuando quiera volver a recargar la página no enviará una petición GET (que sirve para pedir un recurso), sino una petición HEAD (que es casi como GET, pero que sirve solo para obtener la metainformación y no el recurso completo). Como respuesta a la petición HEAD le llegará la cabecera HTTP con la metainformación deseada, que nos indicará si el identificador del recurso ha cambiado o no, de manera que en caso de permanecer invariante no tendremos que malgastar recursos de red.

Ahora, habiéndoos explicado la mecánica general, os explicaré una implementación concreta del mecanismo de marcas de tiempo. ¿Cómo, por qué? ¡Pero si las ETags molan mucho más! Sí, pero también son algo más complicadas y creo que se merecen un capítulo a parte.

Para conseguir que nuestro servidor adjunte las marcas de tiempo podemos hacerlo mediante los ficheros .htaccess (recordad, estoy hablando de Httpd Apache y de PHP), la verdad es que es bastante sencillo, aquí os dejo un ejemplo y pasamos a comentarlo:

ExpiresActive On ExpiresDefault A0
<FilesMatch ".(gif|jpg|jpeg|png|swf|ico)$"> ExpiresDefault A2764800 Header append Cache-Control "public" </FilesMatch>
<FilesMatch ".(js|css)$"> ExpiresDefault A2764800 Header append Cache-Control "private" </FilesMatch>

Estas líneas deberían añadirse al fichero .htaccess que tengamos en la carpeta raíz de nuestra página web. La primera línea nos indica que activamos el mecanismo de las marcas de tiempo. La segunda línea nos sirve para decir que los ficheros expirarán a los 0 segundos (notad el 0 del final), es decir, que por lo general no deberían guardarse en la cache del navegador.

Seguidamente nos encotnramos con un bloque algo más compacto, que es muy parecido al que le sigue. En la primera línea indicamos las extensiones de archivo para las cuales estamos definiendo una configuración concreta. En la segunda línea indicamos el número de segundos que deberían mantenerse los ficheros con esa extensión en la cache del navegador antes de solicitar una nueva copia, en nuestro caso concreto ese número de segundos equivale a 32 días. La tercera línea es muy importante, sirve para indicar si los datos pueden ser cacheados por proxies intermedios o solo en nuestro navegador, si utilizamos la directiva “public” los servidores proxy de nuestro ISP podrían guardar una copia del recurso para servirlo más rápidamente a otros clientes, si utilizamos la directiva “private” solo nuestro navegador guardará copia.

Aquí debo hacer una pequeña digresión: Los ISP pueden vulnerar dichas políticas si quieren (otra cosa es que sea legal o no, y es depende de las legislaciones locales), aunque por lo general acostumbran a respetar lo que se indica en las cabeceras (dentro de lo posible). Es sabido por casi todos que actualmente nuestros proveedores de acceso a Internet están casi obligados a espiarnos, guardando datos sobre nuestra navegación durante más de medio año (en Europa), pero eso no hace que esos datos puedan ser enviados a otros clientes como si estuvieran dentro de una cache.

Extra ( Compresión )

Hubiera sido interesante añadir esto en los capítulos dedicados a reducir el “peso” de las páginas web, pero he esperado porque era importante introducir el concepto de cache antes. Utilizamos imágenes comprimidas, reducimos el tamaño de nuestras páginas web.. pero ¿por qué no las comprimimos directamente antes de enviarlas? Bien, es una buena pregunta. De hecho sí que se acostumbra a hacer. Los ficheros de texto tienen la propiedad de ser altamente redundantes, lo que implica que se pueden comprimir muchísimo de forma sencilla, así pues, os explicaré un pequeño truco para enviar ciertas partes de vuestra web comprimidas para salvar ancho de banda y reducir los tiempos de transmisión (aunque con el pequeño coste de tener que comprimir y descomprimir).

Os dejo otro trozo de fichero .htaccess junto con un fichero .php que juntos sirven para conseguir ese objetivo.

.htaccess

# Activa la compresion en el servidor
php_flag zlib.output_compression On
# Indica el nivel de compresion de 1 a 9 (de menor a mayor compresion)
php_value zlib.output_compression_level 5
# Indica sobre que extensiones se aplica la compresion
AddHandler application/x-httpd-php .css .js

php_value auto_prepend_file /ruta/contentHeader.php

Éste trozo de código ya está casi comentado del todo, a excepción de la última línea. Lo que hacen estas líneas es activar la compresión (de nivel 5 en este caso) para los ficheros con extensión CSS y JS, aquí aparecen dos problemas:

  1. Se debe indicar en las cabeceras el MIMETYPE de los ficheros enviados ya que al comprimirlos el navegador puede confundirse.
  2. Al añadir un manejador específico para los ficheros CSS y JS después de las líneas dedicadas a las marcas de tiempo, éstas quedan invalidadas para estas dos extensiones.

Por todo estos puntos utilizamos la línea auto_prepend_file /ruta/contentHeader.php, que nos servirá para añadir al principio del fichero que enviamos la salida generada por contentHeader.php, siendo la salida las cabeceras específicas que necesitamos. Vamos entonces a escribir ese fichero:


<?php
$pi=pathinfo($_SERVER['PHP_SELF']);
$ext=$pi['extension'];
if($ext=='css')header("Content-type: text/css");
elseif($ext=='js')header("Content-type: text/javascript");
header('ExpiresDefault "access plus 31 days"');
?>

Este script identifica la extensión del archivo, y en función de esto añade una cabecera u otra indicando el MIMETYPE correspondiente, finalmente añade una cabecera con una marca de tiempo.

Espero que os haya resultado útil, hasta la próxima.

Para los que queráis ver los artículos anteriores de ésta serie:

En este capítulo no apuntaremos muy alto, pero introduciremos una “nueva” herramienta (para los que no la conozcáis, claro está) y seguiremos en la misma línea de intentar reducir el peso de la página. En capítulos posteriores introduciremos otras técnicas complementarias que ya no consistirán en “aligerar” la página.

Texto plano : CSS y JavaScript

A medida que hacemos que nuestra página web sea más y más dinámica y vayamos refinando su estilo los archivos JS y CSS de nuestro sitio crecerán hasta llegar a alcanzar tamaños considerables para tratarse de simples archivos de texto plano. Podéis ver por ejemplo el tamaño de jQuery o Prototype, las dos librerías son bastante pesadas en cuanto a tamaño.

Ciertos programadores de Yahoo decidieron entonces crear una herramienta, el YUI Compressor . Podéis obtenerla desde su página oficial o bien, si estáis usando Debian o Ubuntu (supongo que también estará disponible en Fedora y otras distros) podéis instalarla mediante el instalador apt:

apt-get install yui-compressor

Esta herramienta nos servirá para eliminar todo aquello cuanto sea innecesario en nuestras hojas de estilo y ficheros de script. El problema es que lo hará eliminando espacios, puntos y coma donde pueda, saltos de línea… incluso a veces modificando los nombres de algunas variables internas en funciones para acortarlos. No hará lo mismo con los nombres de las funciones ya que si lo hiciera el fichero de script se tornaría inútil ¡Ni una de las llamadas realizadas desde la página funcionaría!

La forma de hacerlo funcionar (funciona sobre la línea de comandos) es bien sencilla:

yui-compressor fichero_que_quiero_minimizar.css -o nombre_de_nuevo_fichero_minimizado.css

Lo mismo se aplica a los ficheros con extensión .js , aunque yui-compressor dispone de algunas opciones específicas más para esta extensión. Si queréis conocer las opciones de yui-compressor solo tenéis que llamarlo con la opción –help .

Importante: YUI-Compressor no se lleva bien con el CSS no estándar, es decir, si os da por probar características aun experimentales como los gradientes de Firefox, Chrome, Safari u Opera entonces tendréis que ir con más cuidado para evitar que YUI-Compressor os estropee vuestros CSS .

Quiero destacar que, dado que probablemente vayáis a estar desarrollando la web al mismo tiempo que ésta ya esté online y siendo visitada por surferos de la red, el tener código ofuscado por esta herramienta os pueda parecer sumamente molesto aunque os permita reducir el tiempo de envío de los ficheros. Lo que recomiendo en estos casos es no subir directamente lo que tengáis en vuestro directorio de trabajo al servidor sino que tengáis un directorio intermedio donde haya las versiones optimizadas de dichos archivos. Una opción para hacer llevadero este sistema es que os hagáis un script que os sincronice los dos directorios (en una sola dirección, claro) a la vez que os comprime las hojas de estilo y los ficheros de script con yui-compressor de forma automatizada. Al principio puede parecer un rollo hacerse el script, pero a la larga simplifica muchísimo el trabajo y ahorra más tiempo aun.

Imágenes: paletas indexadas

En el capítulo anterior ya hice algunas referencias a las imágenes con paletas indexadas ¿pero qué son exactamente? Intentaré no extenderme con la explicación mucho porque esto es más propio del estudio de gráficos por computador que del diseño de páginas web. Para los que ya sepáis a qué me refiero podéis saltar directamente a la parte práctica, donde comento el caso práctico con GIMP.

Los ordenadores actuales acostumbran a representar internamente los colores mediante tres números (generalmente enteros), uno para cada color luz “básico”. Éstos colores luz básicos son el rojo, el verde y el azul, y por eso llamamos al esquema de representación mencionado RGB (Red Green Blue). Combinando dichos colores podemos obtener “todos” los demás ( en realidad es falso, pero a nivel perceptivo podríamos decir que es cierto ). Normalmente se usan números del 0 al 255, siendo el 0 el número que indica intensidad mínima y el 255 la máxima. Así el color blanco estaría representado por la terna (255, 255, 255). Cada uno de estos números cabe en un byte, por lo que para representar el color de un solo píxel necesitamos 3 bytes.

El sistema mencionado conlleva un problema: las imágenes acaban pesando demasiado. Por eso mismo se inventaron formatos de imágen en los que se aplican ciertas técnicas de compresión, como JPEG, GIF o PNG. JPEG aplica compresión “con pérdida”, lo que significa que se pierden ciertos detalles poco importantes de la imagen a cambio de una reducción drástica en su tamaño, mientras que en otros formatos se usa compresión “sin pérdida”. No “perderé el tiempo” explicándoos como funcionan los sistemas de compresión (en general) porque necesitaría introducir la Teoría de la información y entonces no acabaríamos nunca.

Pero sí os explicaré un sistema de compresión de imágenes muy básico y fácil de entender, el indexado de colores. En el caso de tener una imagen con una cantidad relativamente pequeña de colores nos podemos plantear una forma sencilla para reducir su tamaño: hacer una lista de colores de forma que para cada uno haya un número determinado por su posición en la lista. Si la lista tiene 255 o menos colores podremos representar cada pixel con un solo byte en vez de con 3, pues sólo tendremos que usar un número y no 3 para indicar su color. Si tuviéramos 16535 (256×256-1) o menos colores en nuestra lista, podríamos usar 2 bytes en vez de 3 para representar cada píxel, la reducción no es tanta en este caso, pero sigue siendo considerable. ¿Y solo se puede reducir en un factor de 3 el tamaño de la imagen? No, de hecho podemos reducir aun más el tamaño de la imagen, pero en este caso la lista de colores debería ser más pequeña. Por ejemplo, si tuvieramos 127 o menos colores podríamos reducir en un factor de 6 el tamaño de la imagen (descontando el pequeño añadido en tamaño debido a la lista de colores), si tuvieramos 63 o menos colores podríamos reducir en un factor de 12 el tamaño de la imágen, y así. Supongo que podéis ver fácilmente el patrón.

Práctica

Es interesante saber como reducir el tamaño de nuestras imágenes sin perder demasiada calidad. Una forma sería guardar nuestras imágenes en formato JPEG con una calidad inferior o igual al 85%. En cualquier editor gráfico que se precie podréis seleccionar la calidad de salida del fichero JPEG si hacéis “Guardar como…” o “Exportar”.

El problema de la opción JPEG es que sirve más para imágenes grandes o fotografías que para elementos de la web, en los que probablemente querremos más nitidez. Por suerte, aunque queramos más nitidez también se dará el caso de que usamos menos colores y las imágenes serán más pequeñas, en este caso es aconsejable usar imágenes con paletas indexadas. Indicaré como hacerlo en GIMP, hace tiempo que no toco Photoshop y no sabría deciros qué pasos exactos deberéis seguir los que lo uséis, pero seguramente será también bastante intuitivo.

En primer lugar debéis acceder al menú de Imagen e ir a seleccionar un modo:

Seleccionando modo de imagen

Una vez ahí podréis seleccionar cuantos colores queréis que haya en la paleta. A veces se dará el caso de que la imagen tenga más de 255 colores (en este caso las paletas pueden tener solo 255 colores, aunque en la teoría se pudieran tener paletas más grandes), en dicho caso podéis optar por perder algo de calidad eliminando algunos colores (el editor intentará aproximarlos lo mejor posible con los colores de la paleta) o renunciar al indexado de colores.

Conversión paleta

Después solo tendréis que guardar la imágen (recomiendo el formato PNG por encima de GIF), si usáis las nuevas versiones de Gimp tendréis que usar la opción Exportar y no Guardar, pues ésta se ha dejado solo para el formato nativo de Gimp, XCF .

Consejo final (fuera de contexto)

Lo que escribiré ahora debería haber estado en capítulos anteriores, pero me despisté. Aunque sea recomendable reducir la cantidad de ficheros que deben ser cargados para visualizar la página, hay algunas excepciones que vale la pena mencionar. Tal es el caso de las imágenes redimensionadas, no conviene redimensionar una imagen en tiempo de renderizado dentro de la web, es decir, no es conveniente ajustas las medidas de una imagen a otras que no sean las suyas. El tiempo que tarda el ordenador del visitante en redimensionar hace que su experiencia pueda verse mermada, es preferible tener distintas versiones de la imagen adaptadas a los tamaños pertinentes. Es usual que las redimensiones se den cuando se quieren hacer thumbnails, y también es usual que cuando se está visualizando el thumbnail no se esté visualizando simultáneamente la imagen a tamaño real, por lo que (generalmente) no supondrá un problema en cuanto aumento de peticiones HTTP tener versiones específicas de la imagen para cada tamaño.

Espero que os haya resultado útil, un saludo :) .

Optimización web ( II ) : CSS Sprites

Continuamos la serie sobre optimización web empezada en el artículo “Optimización web ( I )“ .

En este capítulo trataremos una técnica que viene siendo usada desde mucho antes de la aparición de la web dentro del mundo de la programación, en concreto dentro del mundo de los videojuegos, y en algunas ocasiones en la creación de interfaces gráficas. Los que ya sepáis algo sobre eso y hayáis leído el título, como buenos lectores que sois, ya debéis saber a qué me refiero, para los que el título no les diga mucho os daré una breve explicación.

La técnica de trabajar con sprites está relacionada con la presentación de imágenes por pantalla, por lo general pequeñas. Usualmente, tanto en webs como en videojuegos, acabamos teniendo conjuntos enormes de imágenes. Cada una de estas imágenes acostumbra a tener un fichero asociado (siempre y cuando no estemos usando ya la técnica de los sprites) y eso tiene bastantes implicaciones (negativas) en el rendimiento de nuestra página o videojuego.

En el caso de los videojuegos las desventajas son varias:

  • Por cada imagen se tiene que hacer una lectura de disco, además, el hecho de que estén en ficheros separados puede implicar fácilmente que las imágenes estén alejadas unas de otras (físicamente) sobre el disco. No es que se trate de fragmentación, pero a efectos prácticos conlleva casi los mismos problemas de lentitud.
  • Normalmente, siempre y cuando el programador o grafista no tenga problemas neuronales o de visión, las paletas de colores de cada imagen serán muy parecidas entre ellas (habrá paleta si y solo si usamos un esquema de colores indexados, lo que se hace para reducir el tamaño final de la imágen, aunque implica que podamos usar menos colores que usando directamente el esquema RGB). El hecho de que no se compartan esas paletas implica que se carga información redundante en memoria por cada imágen que leemos desde el disco (lo que implica un mayor consumo de memoria).

En el caso de las páginas web, los problemas pueden llegar a ser incluso peores:

  • A parte de que el servidor tiene que hacer bastantes lecturas de disco por cada página web cargada (sí, ya sé que muchos los cargará en alguna caché en memoria y todo eso, pero si el sitio web es mínimamente grande los contenidos de la cache irán rotando, y si el sitio está alojado en un hosting compartido la cosa será más complicada aun) también tendrá que hacer más envíos al navegador del visitante para que éste pueda visualizar la página web por completo. Y ahí es donde está el gran problema, los tiempos de lectura de disco son casi despreciables si los comparamos con los tiempos de envío a través de la red, pues no se envía solo la imágen, sino que además también se envían sus respectivas cabeceras HTTP, lo que incrementa la cantidad de información a enviar.
  • Como antes, el navegador consumirá más memoria para mantener esas imágenes, esto ahora mismo no supone un gran problema porque los ordenadores personales cada vez tienen más memoria principal, pero también es importante decir que los usuarios se están acostumbrando a abrir cada vez más pestañas en sus navegadores… y aquí el consumo de memoria se dispara y su importancia (aunque sigue siendo poca) crece algo más.
  • Si se tienen elementos mínimamente dinámicos, como botones pulsables que cambian su imagen de fondo cuando se pasa el ratón por encima o cuando se hace click sobre ellos puede aparecer un problema estético muy importante, resulta que dado que la página no debía cargar la imagen en el primer momento de renderizado… casi en todos los navegadores se da el hecho de que ésta no se descarga hasta el momento de ser necesitada. Esto implica que en el momento de pasar el ratón por encima del susodicho botoncito nos encontraremos con que la imágen no cambia inmediatamente (la primera vez que lo hagamos), habrá un retraso perceptible bastante antiestético y que puede llegar incluso a confundir al visitante, pues puede tener la sensación de que el elemento está bloqueado o algo por el estilo.

El primer punto junto con el tercero son los que más motivan la técnica de los CSS Sprites, que paso a comentar seguidamente.

La técnica de los CSS Sprites consiste en combinar un conjunto de imágenes en una sola, formando una especie de mosaico, para luego mostrar solo las partes que nos interesen de ella en ciertos elementos de la web. Cargar una sola imagen nos ayudará a reducir la cantidad de peticiones HTTP, eliminará el problema del retraso comentado anteriormente, y en muchas ocasiones también nos servirá para reducir el tamaño total de las imágenes (porque, en el caso de tener una paleta de colores indexada es probable que compartan una gran parte de ésta). Tengo que decir que, aunque en la mayoría de casos podamos conseguir el beneficio extra de reducir el tamaño total de las imagenes, esto no siempre es así y a veces puede pasar incluso lo contrario, aun así los beneficios de reducir la cantidad de peticiones HTTP compensarían esta penalización.

Si nos fijamos, la mayoría de páginas web ultrarápidas que nos puedan pasar por la cabeza usan ésta técnica, el ejemplo paradigmático de página web ligera es la del buscador de Google. Os muestro una de las imágenes que usan para aplicar la técnica:

sprites de google

Y ahora viene la parte interesante, he hablado mucho pero todavía no he explicado como hacer esto. ¿Como se hace pues? Pues no hay una fórmula exacta, pero intentaré sentar las bases para que cada uno pueda aplicar las variaciones que considere pertinentes.

Para facilitar las cosas empezaremos con elementos de tamaño fijo, supongamos que tenemos un elemento div con tamaño 32×32, y tenemos en una imágen un set de iconos de 32×32 .. no sé, unas ocho filas por ocho columnas de iconos, unos 64. Supongamos también que queremos que el fondo de dicho elemento div sea el icono situado en la fila 6 y columna 5. Lo que escribiremos en la hoja de estilos CSS es:

background:url(/ruta/a/la/imagen.png) no-repeat -160px -192px }

Analizemos este trozo de código. la primera parte background nos indica que vamos a definir los atributos del fondo del elemento. url(/ruta/a/la/imagen.png) nos indica la imagen donde buscaremos nuestro fondo. -160px es la cantidad de pixels que nos tendremos que desplazar horizontalmente sobre la imagen que contiene los sprites para encontrar el fondo que queremos (5×32, 5 columnas), -192px ídem, pero para las filas. El elemento no-repeat nos indica que no queremos que la imagen se repita a modo de mosaico.

Aquí es importante destacar que debemos definir el tamaño del elemento al que queremos poner fondo para que no aparezcan a continuación de la imagen que queríamos mostrar todas sus “compañeras de viaje”. Otro punto interesante es que el elemento no-repeat podría ser cambiado por repeat-x o por repeat-y en algunos casos, como cuando queremos dibujar fondos periódicos o dibujar los contornos de alguna caja con tamaño variable (dependiendo del contenido). En este caso la distribución de las imágenes dentro de la imagen contenedora es muy importante, pues si hacemos un repeat-x y tenemos otras imágenes a la izquierda o la derecha de la que queremos repetir, el efecto que queríamos conseguir será estropeado. Ídem con el caso de repeat-y.

Esta técnica puede ser usada para crear menus, para personalizar las “bolitas” de las listas, para dibujar los bordes y el fondo de cajas con tamaño variable, para mejorar el efecto de elementos pulsables, etc.

Un saludo, y hasta la próxima entrega.

Optimización web ( I )

Hace muchísimo que no escribo ningún artículo técnico por aquí, y más aun que no escribo ninguna reflexión. Pero se acabó lo que se daba, a partir de ahora intentaré actualizar más frecuentemente el blog y hoy voy a empezar una pequeña serie de (también pequeños) artículos sobre optimización de páginas web.

Introducción

Cuando desarrollamos páginas web nos encontramos con decenas sino cientos de problemas a medida que avanzamos. Los que acostumbran a ser más usuales son los relacionados con la maquetación y el tan temido Microsoft Internet Explorer, otras veces tenemos problemas con el lenguaje de scripting en el lado del servidor, y otras con la base de datos… pero de lo que casi nunca nos salvamos (y pocas veces nos damos cuenta, al menos cuando somos aprendices) es de los problemas relacionados con el tiempo de carga y renderizado de la página.

Los tiempos de carga excesivos no son tan vistos como un problema debido a que no afectan al buen funcionamiento de las páginas y en parte también a nuestra experiencia con líneas de baja velocidad antes de la irrupción de ADSL y otras tecnologías de banda ancha, vamos, que estamos acostumbrados a sufrir y no lo notamos tanto. Aun así, y aunque los visitantes toleren bastante la lentitud, deberíamos encontrar la causa del ralentizamiento para atajarla.

Motivación

  • Los visitantes se sienten más satisfechos cuando nuestro sitio carga rápida y fluidamente, lo que, en gran cantidad de contextos, nos puede reportar una mayor cantidad de beneficios económicos.
  • Por lo general, hacer páginas rápidas y fluidas sirve también para consumir una menor cantidad de recusos del servidor por visita, lo que nos puede ahorrar costes económicos o bien permitirnos atender a más visitantes.
  • Parece ser que la velocidad de carga de los sitios será un factor más a tener en cuenta por parte de algunos buscadores para el posicionamiento de las webs.
  • Y el que nos debería importar más a los geeks: Hacer páginas web fluidas es síntoma de saber hacer bien las cosas, de un buen nivel técnico, y cuando todavía no se sabe como conseguirlo, supone un reto interesante.

Primeros pasos

Empezaremos con consejos aplicables a prácticamente cualquier tipo de página, servidor, framework de desarrollo, lenguaje de scripting en el lado del servidor… vamos, que iniciaremos la lista de consejos con algunos bastante universales y, siento decirlo, algo aburridillos (tranquilos, no faltarán consejos interesantes de verdad más adelante).

  1. Intentad hacer vuestras páginas lo más pequeñas que os sea posible. Con esto no me refiero a que hagáis que las letras sean pequeñas, como supongo que habréis entendido, sino a que el tamaño del documento que envía el servidor web debería ser pequeño para que éste tarde el mínimo tiempo posible en enviarlo.
  2. Para conseguir el punto anterior es muy importante que vuestro código sea limpio y conforme a los estándares, en particular: evitad usar tablas para tabular los elementos de vuestras páginas, para eso están los elementos div y span, y como no, las hojas de estilo en cascada (CSS).
  3. Es interesante unificar todos los estilos de la página en un único archivo css, que podrá ser compartido entre diferentes secciones de ésta, de forma que solo se tendrá que descargar una vez la información de estilos y se podrá reutilizar para varias páginas de vuestro sitio.
  4. Reducid la cantidad de ficheros a descargar para visualizar vuestra página, es decir, usad cuantos menos ficheros de imagen mejor, cuantas menos hojas de estilo, mejor, y cuantos menos ficheros de script, mejor también. Esto es muy importante debido a que cada petición HTTP implica una sobrecarga importante en el envío de información. La sobrecarga es debida a que, además de los ficheros en sí, se tienen que enviar también cabeceras con cierta metainformación, por lo que se pierde mucho tiempo enviando información “inútil”. Otro problema asociado es que las descargas son, en cierta medida, bloqueantes. El protocolo HTTP impone un límite de descargas simultáneas por página, por lo que éstas no se pueden paralelizar y se tienen que hacer una detrás de otra, provocando el retraso en la carga.
  5. Ahora uno de los más extraños (por ser el menos evidente): Intentad situar el código JavaScript cuanto más cerca del final del documento, mejor. Esto es importante debido a que los navegadores pierden tiempo interpretando y ejecutando el código cuando lo encuentran, siendo esta tarea también bloqueante. Así pues, si situáis el código JavaScript al final de vuestras páginas conseguiréis que sean renderizadas antes, mejorando la experiencia del usuario.

Herramientas

Aunque todavía tengo que explicar muchas cosas en esta serie de artículos, creo que puede ser conveniente para los que queráis ir más rápidos una lista de herramientas muy útiles que os ayudarán a encontrar más puntos a mejorar en vuestros sitios web.

  • Speed Tracer: es una extensión para el navegador Chrome / Chromium creada por Google , nos permite ver el tiempo de carga del sitio web desglosado elemento por elemento para identificar algunos cuellos de botella de nuestro sitio. También da algunos pequeños consejos para mejorar la web cuando detecta fallos.
  • YSlow: es una extensión para el navegador Firefox creada por Yahoo que, a mi parecer, junto con Speed Tracer forma un tandem perfecto. Se necesite instalar la extensión Firebug antes que ésta. Asigna una nota a la página que evaluamos mediante una media ponderada de puntuaciones sobre ciertos aspectos de ésta. No solo da puntuaciones, también es una herramienta a la que parece encantarle dar consejos, y muy buenos por cierto, aprendí bastante de ella xD, fue algo así como mi profesora. Los gráficos que genera ni son tan bonitos ni útiles como los de Speed Tracer, pero a cambio la información realmente útil se muestra mucho más digerida y apta para ser utilizada directamente.
  • Page Speed: otra extensión creada por Google, pero esta vez para Firefox, que parece ser una mezcla entre YSlow y Speed Tracer, ésta muestra directamente una lista de consejos que deberíamos seguir, y los marca en rojo, amarillo o verde segun considere si ya lo estamos haciendo o no.

Hay muchas más herramientas  que podrían resultar útiles, pero estas son las más remarcables dentro del panorama actual… y ciñéndonos a las herramientas que nos dan información o consejos. Hay otras herramientas que comentaré en los siguientes artículos y que no listo aquí porque prefiero presentarlas dentro de un contexto más adecuado.

Espero que os haya resultado útil y/o interesante, un saludo :) .

Jugando con jQuery

Por motivos varios estoy aprendiendo a manejar la librería jQuery, que sirve para dar dinamismo a páginas y aplicaciones web con una buena mezcla de Javascript, AJAX y CSS, y a modo de guinda, nos abstrae de las incompatibilidades entre navegadores. No voy a escribir una introducción a jQuery aquí porque todavía me falta bastante por aprender, pero sí os dejaré un enlace a una página repleta de “chuletas” sobre jQuery y librerías similares, como Prototype, Scriptaculous o MooTools.

http://www.scottklarr.com/topic/95/javascriptajax-cheat-sheets/

Personalmente la que más me gusta a mí es la de colorines xD, tengo muco de niño pequeño todavía. Saludos!

Los riesgos de abandonar las tecnologías P2P

Aun recuerdo la primera vez que usé eDonkey2000 cuando todavía era un niño, tuve muchas impresiones contradictorias. Por un lado me pareció algo excesivamente complicado… e incluso lento, pero por otro me atrajo muchísimo la idea de compartición. La descentralización que permitía era todo un hito, así como la menor dependencia de ciertas webs, empresas, o personas que se podía conseguir con él. En esa época no tenía ni pajolera idea ni de redes ni de informática en general (aunque sabía ya mucho más de lo que sabe la mayoría de la gente hoy en día, algo que me parece bastante triste). En el momento que apareció eMule ante mi vista salté inmediatamente a él porque era un software netamente superior, más manejable e intuitivo, y estaba por esa época iniciándome en el mundo del software libre.

Soy una persona que tiene mucha curiosidad por naturaleza, y casi siempre que me surge una duda voy presto a intentar resolverla, a buscar el dato que me falta en Internet. Pues bien, la tecnología P2P no escapó a mi curiosidad y me puse a investigar, descubrí las diferentes topologías de red, comprendí la razón de ser de las esperas (las puñeteras colas, la necesaria redundancia en las transmisiones de datos para reducir la tasa de errores.. etc) y muchas cosas más. Entendí entonces que la red ed2k no era lo suficientemente “buena”, que seguía habiendo una gran dependencia. En realidad la red e2dk es semi-centralizada… lo que quiere decir que precisa de servidores (aunque no sean fijos) para realizar las búsquedas y encontrar a otros contactos (más tarde pasaremos a describir los riesgos de la centralización). Durante mis tardes de “investigación” descubrí la red Gnutella (realmente descentralizada) y cuando me estaba planteando saltar los de eMule se pusieron las pilas y añadieron soporte para la red Kademlia (en realidad red Kad, basada en el protocolo Kademlia) que eliminaba la dependencia de servidores. Desde entonces sigo usando eMule… aunque ya seguiré con eso después.

Ahora vamos al quid de la cuestión. eMule se hizo muy popular en su momento, pero rápidamente fue desbancado por BitTorrent y otros del estilo basados en el mismo protocolo (uno muy popular es Ares, que tiene soporte para varios protocolos, en particular BitTorrent). BitTorrent es un protocolo que permite descargas ultrarrápidas sin necesidad de las típicas colas de espera, pero tiene como contrapartida la necesidad de unos servidores llamados trackers para poder realizar las busquedas (a grandes trazos). Después de eso la gente saltó directamente a las descargas directas (Rapidshare, Megaupload, etc) ya que las velocidades de transmisión de las redes actuales permiten descargar grandes bloques de información sin tener que hacerlo a lo largo de varios días, se puede hacer en una única sesión y sin tener que subir datos a la red (las velocidades de subida en España son muy bajas) y ahí está el gran error.

En redes descentralizadas como Kademlia las búsquedas son una tarea sencilla y el material persiste durante mucho tiempo, además éstas redes son resistentes a ataques, si se hace caer un nodo siguen funcionando como si nada hubiera pasado. En sistemas como BitTorrent las búsquedas se transforman en una tarea mucho más compleja y se empieza a depender de servidores, por lo que esas redes son vulnerables ante ataques realizados a nodos estratégicos de la red, también está el inconveniente de que el material desaparece muy rápidamente de la red. En el caso de las descargas directas el problema se torna aún más grande, los ataques pueden tener consecuencias mucho peores, no solo se dificultan las búsquedas al desconectar los servidores sino que además se imposibilita la descarga, además el material tampoco es que dure mucho en esos sistemas. Buscar material alojado en servidores es una tarea de chinos ya que no hay buenos buscadores especializados en eso.

Para que nos hagamos a la idea, los sistemas centralizados son tan débiles que no hace falta ni hacer caer el servidor, con que nuestro ISP bloquee su IP ya es suficiente. Se nos pueden hacer otras jugarretas, como limitar la velocidad de descarga (Parece que Telefónica ya lo está haciendo en algunos casos), registrar de forma mucho más sencilla quién se baja qué (lo que hace peligrar nuestra privacidad y nuestra seguridad jurídica también dependiendo de donde vivamos), etc.

Recientemente la tecnología P2P ha sufrido un “gran parón” (en cuanto a la compartición de datos, en otros ámbitos ha triunfado, como con Spotify), eMule hace mucho tiempo que no añade innovaciones (y nunca ha habido una versión decente de éste para GNU/Linux) y los pocos que tienen novedades son los clientes de BitTorrent… se debería incentivar el desarrollo de esas alternativas, añadiendo soporte para cifrado de las comunicaciones y otras mejoras de seguridad que permitan anonimizar las conexiones, así como mejorar los clientes para GNU/Linux y Mac, que siempre van a la zaga de los existentes para MS Windows. Existen alternativas realmente seguras tales como Freenet o GnuNet, pero casi nadie las usa y por el momento son extremadamente lentas (en parte debido a la poca gente perteneciente a esas redes, alcanzada la masa crítica la cosa sería diferente). Debemos adelantarnos a las leyes restrictivas que puedan aparecer en un futuro y tener a punto tecnologías que nos permitan evadir los sistemas de control autoritario que muchos quieren imponernos. Si no actuamos a tiempo podría llegar el momento en el que los sistemas de control consiguieran impedir la difusión de la tecnología que nos serviría para evadirlos, es una típica carrera de armamento, o levantamos unas buenas defensas o nos acribillarán.

Saludos!

Tivion and Kraken

A finales de septiembre empezó el Concurso Universitario de Software Libre (CUSL), éste año no me presenté por que no tenía claro que pudiera dedicarle tiempo a ningún proyecto y ya tenía los antecedentes del año anterior, pero no por eso he perdido el interés en él.

Entre los proyectos concursantes hay dos proyectos bastante interesantes relacionados con el streaming de video. Estos son Tivion y Kraken, dos proyectos con enfoques muy diferentes y también dignos de atención.

Kraken es un proyecto dedicado al streaming de video vía redes descentralizadas p2p, pero con ciertas innovaciones técnicas que permitirían ajustar dinámicamente la calidad del video al ancho de banda disponible de forma dinámica. Podéis saber más de él a través de su blog: http://matachana.net/kraken/blog/ . Aviso: por el momento solo se trata de vaporware, estudios y documentos, no hay una implementación, aunque parece que el nivel técnico es alto y tiene muchas probabilidades de ver la luz :) .

Por otro lado Tivion es un programa dedicado a ver canales de televisión de todo al mundo a través de Internet, ahora mismo está en su versión 0.03, disponible para Ubuntu (Jaunty, Karmic y la futura Lucid, en 32 y 64 bits) y para Arch. El anuncio oficial de la última release lo podéis encontrar el blog de Shakaran: http://shakaran.es/blog/2009/12/tivion-0-0-3-opiron-liberado/ . Personalmente lo he estado probando y va bastante bién, os lo recomiendo si queréis ver algún programa de televisión en vuestro ordenador y mejor aún, con un programa libre :) .

Saludos!

Integrar visor de PDFs en Firefox

Para los que ya estén hartos de tener que abrir los documentos pdf en una nueva ventana cada vez que se encuentran uno de estos en la web, he encontrado un minitutorial que explica como integrar Evince (el visor de PDFs de Gnome) con Firefox para que los documentos PDF se vean en la misma o en una nueva pestaña sin tener que abrir una nueva ventana. Espero que os sea útil :) .

http://shakaran.es/blog/2009/12/integrar-evince-en-firefox-para-visualizar-pdfs/

Ahora mismo estamos dando los retoques finales a las prácticas de la asignatura Gràfics per Computador I , dado que no disponemos de mucho tiempo para trabajar (pues tenemos muchas asignaturas y en todas hay muucho trabajo) preferimos programar toda la práctica con Python y python-opengl por encima de lenguajes más eficientes como C o C++. Obviamente el rendimiento ha mermado de forma impresionante si lo comparamos con lo que hubiéramos obtenido haciéndolo con los otros lenguajes mencionados… pero nos da absolutamente igual, simplemente tenemos que demostrar que sabemos hacer lo que nos han pedido, no es nada que tenga que entrar en producción.

El caso es que cuando digo lo de poco tiempo lo digo con todas las de la ley, tan poco que no hemos podido encontrar ningún hueco para coincidir en persona, así que hemos tenido que optar por trabajar a distancia con casi todo lo que eso comporta normalmente. Y digo con casi todo porque en este caso Gobby nos ha puesto las cosas fáciles :) . Gracias a este programa podemos editar documentos simultániamente (viendo los cambios en tiempo real, omitiendo el pequeño retardo claro) mientras podemos charlar y comentar los cambios a través del chat integrado.

Su sistema de funcionamiento es sencillo, uno de los que participa en el proceso de edición de los documentos inicia una sesión, lo que viene a significar que crea la instancia de un servidor al que otros se pueden conectar, los demás se conectan.. y listos :)   (se pueden establecer claves de acceso por si se quieren grupos cerrados :) ). Por otro lado, por el momento solo se puede trabajar con ficheros de texto plano, así que para ciertas tareas está un poco limitadito. Habría que ver si se quiere “mejorar” ese aspecto o si ya se diseñó el programa con la idea de que funcionara tal y como funciona para no hacer nada más en un futuro. Sea como sea, ya sabéis, si os interesa podéis intentar añadir funcionalidad al programa y me haréis un favor xD… y si no, talvez un día me ponga a ver si puedo hacer algo yo con mis propias manos ;) .

Saludos! (Voy a seguir con la práctica… )

P.D.: Para los KDE-adictos (aunque cada vez quedan menos gracias a las regresiones de KDE4) hay un programa que realiza la misma función que Gobby (y puede interactuar con éste) que se llama Kobby, aun está en fase de desarrollo, pero seguro que a los aventureros eso no os asusta. Lo podéis encontrar en http://greghaynes.github.com/kobby/ .

Sacado de Barrapunto (estoy muy de acuerdo con éste manifiesto):

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…
  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Si os ha gustado os animo a difundirlo ;) .

Powered by WordPress | Theme: Motion by 85ideas.