Optimizando consultas Mysql

01 06 2008 Programación
La optimización de las consultas a la base de datos de tus aplicaciones web es de vital importancia, no sólo ha la hora de medir el tiempo en el que una página se carga sino también cuando el tráfico de tu máquina se incrementa o cuando el hardware tiene trabajo extra debido a un mal diseño de esas consultas.

Incluso aunque tengamos implementadas soluciones de caché (librerías de mysql con cache, memcache o similares) la optimización de las consultas sigue teniendo un relevancia plena. En este artículo resumiremos que herramientas podemos emplear para optimizar, detectar y solucionar problemas en las consultas a tu base de datos que lastran tu aplicación llegando ha hacerla inutilizable o requiriendo una inversión mayor en equipo cuando no debería.

La primera de las herramientas, interna al propio servidor mysql es la sentencia explain, explain también es un alias del comando describe cuando se escribe a continuación un nombre de tabla. Explain o describe devolverá información sobre la estructura de la tabla. La otra sintaxis propia de explain, y la que nos interesa, es la que sirve para analizar como mysql ejecuta una sentencia select.

EXPLAIN [EXTENDED] SELECT select_options

Explain hará que el optimizar de mysql nos devuelva información sobre como se procesará la sentencia SELECT incluyendo información de que tablas usará como utilizará los joins, en que orden y en que modo utilizará los indices que haya definidos en las tablas. Todo esta información se conoce con el nombre de información sobre plan de ejecución de mysql.

Esta información es muy valiosa y se puede emplear para optimizar nuestros selects. Con esta información podremos por ejemplo decidir añadir nuevos índices a nuestras tablas o modificar nuestros selects para que se fuerte un determinado orden para nuestros joins.

Explain devuelve una fila de información por cada tabla empleada en la consulta. Las tablas son listadas en el orden en el que mysql las leerá a la hora de procesar la consulta. Si añadimos EXTENDED mysql nos dará información adicional en forma de warning, para poder verla debemos ejecutar un SHOW WARNINGS. La información extra contiene como el optimizador da
nombre cada una de las tablas y columnas de la sentencia select y puede que otras notas sobre el proceso de optimización.

Veamoslo con un ejemplo bien simple:

mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

mysql> explain select 1;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)


Cada columna que devuelve EXPLAIN tiene el siguiente significado:

id - identificador, es sólo una secuencia numérica autoincrementada para cada una de las filas del explain
select_type - Debe ser uno de los siguiente tipos
SIMPLE - No usa subqueries ni UNION
PRIMARY - Último SELECT
UNION - Segunda o última sentencia SELECT en una UNION
DEPENDENT UNION - Segunda o última sentencia SELECT en una UNION, dependiente de otra query
SUBQUERY - Primera SELECT en una subquery
DEPENDENT SUBQUERY - Primera SELECT en una subquery, dependiente de otra query
DERIVED - Tabla SELECT derivada (subquery en una clausula FROM)
UNCACHEABLE SUBQUERY - Una subquery cuyo resultado no puede ser cacheado y debe ser re-evaluado para cada file de la otra query.

table - la tabla a la que se refiere la información
tipo - el tipo de unión empleado, que puede ser:
sytem - SYSTEM SELECT sólo hay una fila en la tabla (tipo especial del tipo const)
const - La tabla tiene como mucho un sola fila resultado, que es leída al principio de la operación convirtiéndose en una constante para el resto de las operaciones del select (operación muy rápida)
eq_ref - Una fila es leída de la tabla por cada combinación de filas en las tablas previas.
ref - Todas las filas con valores de índices validos son leídos de esta tabla por cada combinación de filas de las tablas previas.
fulltext - El join se utiliza mediante un índice FULLTEXT
ref_or_null - Este tipo de join es como el ref, pero además MySQL hace una busqueda extra por filas que contengan valores NULL
index_merge - la columna key en la fila de salida contiene una lista de indices a utilizar, y key_len contiene una lista de las claves más largas para los índices utilizados.
unique_subquery - Este tipo sustituye al ref para algunas subqueries IN de el siguiente tipo de estructuras: value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery - Este tipo join es similar al unique_subquery. Este sustituye subqueries IN, pero funciona para índices no únicos en subqueries del siguiente tipo: value IN (SELECT key_column FROM single_table WHERE some_expr)
range - Solamente las columnas que están en un rango dado son retornadas, empleando un índice para seleccionar las columnas. La columna key indica que índice es utilizado. key_len contiene el índice más largo de la parte del índice más larga utilizada. ref es NULL para este tipo.
index - Este ipo de join es el mismo que el de ALL, con la excepción de que sólo se realiza el escaneado a través de un índice. Esto es mas rápido que ALL ya que los ficheros índice son generalmente más pequeños que el fichero de datos.
all - Se realiza un escaneado de toda la tabla por cada combinación de filas de las tablas anteriores.

Estos tipos están ordenados en cuando a lo mejor o peor en cuanto a optimización. Así un tipo all sería lo peor y un tipo system sería lo mejor. Reducir de un tipo a otro, cambiando o creando índices para una determinada tabla o modificando la estrucutra misma de la petición es la tarea básica que debemos intentar para optimizar nuestra querys.

possible_keys - La columna indica que índices se pueden seleccionar para ser usados a la hora de encontrar filas en la tabla.
key - Índica que índice es empleado finalmente (podría se uno que no estuviera listado en las possible_keys).
key_len - Longitud del índice empleado
ref - Muestra que columnas o constante son empleadas para comparar con el índice
rows - Número de filas que MySQL piensa que debe examinar al ejecutar la petición
extra - Información adicional sobre la consulta.

Cuando modifiques la estructura de una tabla o añadas índices recuerda ejecutar un:

ANALIZE TABLE nombre_tabla;

Esto hará que el optimizador analize adecuadamente la tabla, los datos los usará para ayudarle a determinar la mejor estrategia en consultas posteriores. Tras modificar la tabla ejecuta ANALIZE y vuelve a ejecutar un EXPLAIN para observar las modificaciónes en el plan de ejecución de la consulta.


Bookmark Optimizando consultas Mysql  at del.icio.us Digg Optimizando consultas Mysql Mixx Optimizando consultas Mysql Bloglines Optimizando consultas Mysql Technorati Optimizando consultas Mysql Fark this: Optimizando consultas Mysql Bookmark Optimizando consultas Mysql  at YahooMyWeb Bookmark Optimizando consultas Mysql  at Furl.net Bookmark Optimizando consultas Mysql  at reddit.com Bookmark Optimizando consultas Mysql  at blinklist.com Bookmark Optimizando consultas Mysql  at Spurl.net Bookmark Optimizando consultas Mysql  at NewsVine Bookmark Optimizando consultas Mysql  at Simpy.com Bookmark Optimizando consultas Mysql  at blogmarks Bookmark Optimizando consultas Mysql  with wists Bookmark Optimizando consultas Mysql  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Firefox 3 rc1

24 05 2008 Programación
Firefox, uno de los navegadores más empleados en la actualidad y el más importante de las alternativas "open source" acaba de anunciar la salida de la primera "release candidate".

Este navegador podría ser el primero en desbancar a internet explorer como navegador más empleado.

La versión puede ser descargada directamente desde las páginas de mozilla. Pero se avisa que sólo es válido para realizar pruebas. No presenta muchas características nuevas respecto a las betas anteriores por lo que nos encontramos ante una versión más estable que sólo (esperemos) solucione bugs de las betas anteriores.

Bookmark Firefox 3 rc1  at del.icio.us Digg Firefox 3 rc1 Mixx Firefox 3 rc1 Bloglines Firefox 3 rc1 Technorati Firefox 3 rc1 Fark this: Firefox 3 rc1 Bookmark Firefox 3 rc1  at YahooMyWeb Bookmark Firefox 3 rc1  at Furl.net Bookmark Firefox 3 rc1  at reddit.com Bookmark Firefox 3 rc1  at blinklist.com Bookmark Firefox 3 rc1  at Spurl.net Bookmark Firefox 3 rc1  at NewsVine Bookmark Firefox 3 rc1  at Simpy.com Bookmark Firefox 3 rc1  at blogmarks Bookmark Firefox 3 rc1  with wists Bookmark Firefox 3 rc1  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Unit testing (pruebas unitarias)

22 05 2008 Programación
En el desarrollo de software la ausencia de errores es una autentica quimera. Tantos son los factores que finalmente pueden alterar el flujo que consideramos "normal" en el programa como los errores propios a cualquier actividad humana.

    Uno de los métodos más utilizados para realizar pruebas a nuestro software es el llamado de pruebas unitarias (unit testing). La base de este método es el hacer pruebas en pequeños fragmentos de nuestro programa. Estos fragmentos deben ser unidades estructurales de nuestro programa encargados de una tarea especifica, en programación procedural u orientada a objetos podemos afirmar que estas unidades son los métodos o las funciones que tenemos definidos.

    Tras realizar estas pruebas sobre los elementos unitarios de nuestro programa podremos eliminar gran parte de los errores de los que podría adolecer. Como ya sabemos cualquier prueba demuestra no la ausencia de errores sino que revela la presencia de ellos. Las pruebas unitarias no revelan errores en la integración de las partes unitarias ni tampoco otros problemas como el bajo rendimiento de las aplicaciones o problemas derivados del sistema sobre el que está ejecutándose nuestro programa.

    El objetivo de las pruebas unitarias es el aislamiento de partes del código y la demostración de que estas partes no contienen errores.

    Una vez creados el conjunto de pruebas unitarias sobre un fragmento de código los beneficios obtenidos, incluso antes de ejecutar ninguna prueba, son múltiples. Pasaré a enumerarlos:

Simplificación de la integración
    Las pruebas unitarias eliminan las posibles incertidumbres y errores en lo que se espera de cada una de las unidades ayudando a entender la integración de cada una de las partes.

Refactorización de código
    Una vez refactorizado el código; las mismas pruebas unitarias nos pueden servir para probar el nuevo código asegurándonos de que este sigue siendo válido bajo la nueva implementación.

Documentación
    Las pruebas unitarias sirven como método de documentación mismo. Los desarrolladores pueden ver a través de las pruebas unitarias cual es el objetivo de las distintas partes del código de una manera básica.

Diseño
    Cuando se desarrolla el software las pruebas unitarias pueden tomar el lugar del diseño formal. Cada prueba unitaria puede ser visto como un elemento de diseños que especifica las clases, los métodos y el comportamiento observable de la aplicación.



Bookmark Unit testing (pruebas unitarias)  at del.icio.us Digg Unit testing (pruebas unitarias) Mixx Unit testing (pruebas unitarias) Bloglines Unit testing (pruebas unitarias) Technorati Unit testing (pruebas unitarias) Fark this: Unit testing (pruebas unitarias) Bookmark Unit testing (pruebas unitarias)  at YahooMyWeb Bookmark Unit testing (pruebas unitarias)  at Furl.net Bookmark Unit testing (pruebas unitarias)  at reddit.com Bookmark Unit testing (pruebas unitarias)  at blinklist.com Bookmark Unit testing (pruebas unitarias)  at Spurl.net Bookmark Unit testing (pruebas unitarias)  at NewsVine Bookmark Unit testing (pruebas unitarias)  at Simpy.com Bookmark Unit testing (pruebas unitarias)  at blogmarks Bookmark Unit testing (pruebas unitarias)  with wists Bookmark Unit testing (pruebas unitarias)  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

PHP 6

09 05 2008 Programación
Dentro de muy poco tiempo tendremos entre nosotros la próxima versión de php, php6. Esta versión ya está disponible en php.net para su descargar. Aunque la adopción de php5 y desaparición de php4 fue un proceso algo más lento de lo esperado. PHP6 no supone un cambio tan radical como el que sucedió con la versión anterior por lo que es de esperar, si todo va bien, que la adopción de esta versión sea más rápida.

    PHP sigue siendo el lenguaje script para desarrollos web más popular y la lista de nuevas características que vienen con esta nueva versión pueden situarle en posiciones todavía más destacadas.

Estas son las novedades que incorporará el lenguaje:

Soporte para Unicode

    PHP6 soporta Unicode en la mayoría de sus funciones principales. Esta característica tendrá un fuerte impacto ya que permitirá una mayor capacidad de internazionalización al soportar un conjunto de caracteres mucho mayor mediante sus funciones nativas.

Espacios de nombres (Namespaces)

    PHP6 soporta namespaces. Una manera de evitar colisiones entre los nombres que asignemos a las diferentes clases sin tener que estar elaborando notaciones especificas para evitar este problema. De esta manera al crear tu propio espacio de nombres no tienes que preocuparte por si php tiene una clase con el mismo nombre o si una librería externa podría fallar debido a una colisión en los nombres de clase.

    No es obligatorio el uso de namespaces lo que permite que el código de la versión 5 sea compatible con esta nueva caracteristica. Los namespaces aparecen ya soportados en la version php 5.3

Ejemplo:

<php
namespace ACC
class Dummy {}
$dummy = new ACC::Dummy();
?>

SOAP

    SOAP es uno de los protocolos empleados por los servicios web soportado en otros lenguajes como JAVA. SOAP permite la interoperativilidad entre diferentes plataformas.

    PHP6 tendra una extensión SOAP que nos permitirá una manera más sencilla de implementar tanto clientes como servidores SOAP

XML

    A partir de PHP5.1 XMLWriter y XMLReader han formado parte del núcleo de PHP lo que permite construir y leer mensajes XML sin tener que preocuparte de los detalles más complejos de este formato. PHP6 mejora esta funcionalidad

Cosas que se han eliminado en PHP6

    Además de los nuevas características añadidas, PHP 6 no tendrá algunas de las funciones y características propias de versiones anteriores. La mayoría de estas características, como register_globlas y safe_mode, son consideradas negativamente en la versión actual. Los que se oponen ha estas modificaciones arguyen que estos cambios provocará el fallo en los scripts actuales en cuanto se actualize a la nueva versión.

Estas con las características eliminadas en la próxima versión de PHP

magic_quotes
register_globals
register_long_arrays
safe_mode

Magic quotes

    Por razones de portabilidad, rendimiento e inconveniencia se recomienda ya no utilizar esta característica. magic_quotes escapa cadenas que proceden de datos introducidos por el usuario $_POST, $_GET, $_REQUEST y que podrían ser empleados en una sentencia SQL originando fallos en la seguridad de la aplicación si se introducen determinadas secuencias de caracteres. Cuando se elimine esto de PHP también desaparecerá la función get_magic_quotes_gpc(). En su lugar para eliminar este riesgo de seguridad debemos recurrir a funciones del estilo mysql_escape_string para mysql y pg_escape_string para PostgreSQL.

Register globals

    Register globals permitía inicializar variables a partir de datos externos ($_GET,$_POST,$_REQUEST) lo que potencialmente podría producir importantes errores en la aplicación y su seguridad. Register globals paso de estar activo a desactivo por defecto a partir de la versión 4.2

Register long arrays

    Se eliminan los variables superglobales $HTTP_*_VARS se ha mantenido por razones de compatibilidad, aunque se aconsejaba dejar esta característica deshabilitada para mejorar el rendimiento de los scripts.

Safe mode

    Cuando esta habilitada safe mode se aseguraba de que el propietario del fichero que se está ejecutando coincida con el propietario del fichero que se está empleando. Originariamente fue un intento para securizar determinadas operaciones en un entorno en el que el servidor estaba compartido.

Etiquetas PHP

    Ya no se permiten ni etiquetas cortas ni el formato ASP <% %> para encerrar fragmentos de código php

FreeType 1 y GD1

    El soporte para FreeType 1 y GD 1 será eliminado completamente de PHP debido a que ambas librería ya no son mantenidas desde hace bastante tiempo. Las nuevas versiones de ambas librerías si que seguirán en PHP ya que proporcionan mejor funcionalidad.

Ereg

    La extensión ereg también desaparecerá. En su lugar ya tenemos las expresiones regulares compatibles Perl (PCRE - Perl-Compatible Regular Expressions). De esta manera ereg() y eregi() pueden ser sustituidas por preg_match() y ereg_replace() y ereg_replacei() por preg_replace.

PHP 5.3

    Algunas de las características mencionadas previamente para la nueva versión ya han sido portadas a la versión 5.3 de PHP para que el cambio de versión no sea tan violento como son los Namespaces y la inclusión en el núcleo de PHP de XMLReader y XMLWriter.

Bookmark PHP 6  at del.icio.us Digg PHP 6 Mixx PHP 6 Bloglines PHP 6 Technorati PHP 6 Fark this: PHP 6 Bookmark PHP 6  at YahooMyWeb Bookmark PHP 6  at Furl.net Bookmark PHP 6  at reddit.com Bookmark PHP 6  at blinklist.com Bookmark PHP 6  at Spurl.net Bookmark PHP 6  at NewsVine Bookmark PHP 6  at Simpy.com Bookmark PHP 6  at blogmarks Bookmark PHP 6  with wists Bookmark PHP 6  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Temas piramidales (SEO)

08 05 2008 Ocio
Una de las estrategias SEO que se emplean para diseñar desde cero un sitio web es el de los temas piramidales. Los estructuración del un sitio web en temas piramidales presenta ventajas no sólo desde el mundo SEO sino también a nivel organizativo y de usabilidad del sitio. Muchos sitios presente una estructura cercana a esta en mayor o menor medida pero al no comprender en profundidad las ventajas de este tipo de estructuración finalmente el sitio pierde estas ventajas a medida que el sitio crece en tamaño.

Los temas piramidales no son algo nuevo que haya surgido hace poco tiempo sino que ya han sido utilizados desde hace años.

Los sitios basados en temas piramidales son más sencillos de mantener, organizativamente facilitan la tarea de encontrar los contenidos que buscas y de optimizan sus el futuras mejoras y mantenimiento debido a su clara organización. Los temas piramidales se basan en concepto de tema.

¿Que es un tema?

Es la base, la idea común, a partir de la cual desarrollamos nuestro sitio. Es el termino unificador que reune todas las partes de nuestro sitio y que puede englobar todo el contenido de nuestro sitio bajo este concepto. Es el keyword que define todo nuestro conjunto de páginas.

Construcción de temas piramidales

La palabra/keyword principal que define el tema principal de tu sitio será la empleada en la página inicial, y todas los niveles debajo de la página principal contendrán variaciones de esta keywords de una manera jerarquizada. Es decir cada keyword debajo de la principal tendrá a su vez otras keywords (niveles) y actuará como englobador o tema común de todas las que se encuentren por debajo y así sucesivamente. De manera que cuanto más profundizaremos en la estructura del sitio encontraremos keywords cada vez más específicas.


Este tema principal estará recogido en nuestra página principal soportado por varios subtemas muy relacionados. Para soportar estos subtemas cada uno de ellos tiene otros temas fuertemente relacionados con este subtema y así seguiríamos a través de varios niveles.

Valor SEO
Sin valor Home page (tema principal)
bajo valor SubtemaA SubtemaB SubtemaC SubtemaD
medio valor kw a1 kw a2 kw b1 kw b2 kw c1 kw c2 kw d1 kw d2
alto valor ka1a ka1b ka2a ka2b ..........
Dinero $ $ $ $ $ $ $ $ $ $ .....

La teoría de los temas piramidales implica ver al sitio como un todo compartimentado. Comenzado por un contenedor que englobe a todo el sitio tema principal y diseñando subtemas nivel tras nivel para abarcar todo el contenido del sitio. Enlazar cada tema arriba y abajo pero no a través de los temas con diferentes temas padres (esto reforzara las páginas y la popularidad del enlace). Estructura vertical de enlaces NO HORIZONTAL.

Cosas importantes en el diseño de un sitio estructurado en temas piramidales, en cada nivel:

1. La pagina principal APENAS tiene valor SEO. Raramente ranquea bien y tampoco es algo que nos deba preocupar demasiado. Una página principal bien ranqueada con una estructura de este tipo es la excepción y no la regla. Si ranquea bien es generalmente debido a factores externos (off-the-page). Sus únicas funciones es ser usable para los visitantes y servir de alimento(enlaces a los niveles inferiores) a los buscadores que visitan tu sitio web. Intenta también colocar enlaces tan profundos como puedas a los buscadores les gusta el contenido de primer nivel sobre todo en keywords que te interesan especialmente.

2. Para el segundo nivel el valor SEO es más importante pero lo más importante aquí, es también colocar enlaces a los niveles más profundos de tu sitio web y no sólo al siguiente. Enlaces verticales dentro de este subtema arriba y abajo. No horizontales.

3. Valor SEO importante la distinción entre los niveles 4 y 5 puede ser confusa. Suele contener términos muy competitivos y de posicionamiento difícil. Algunos de los enlaces entrantes deberían proceder de la home page.

4. Suele tener el contenido básico de calidad del sitio. Enlázalo verticalmente. Si enlazas con sitios externos procura que sea también contenido muy relacionado.

5. Habitualmente las páginas que traen el dinero. Enlázalo con todas las páginas de sus niveles superiores


Con toda esa pirámide de keywords el impacto en el posicionamiento de estas keywords será muy importante pues cada una de ellos reforzará a cada una de las demás.

Ventajas temas piramidales:
1.-Es sencillo tener un sitio web organizado y centrado en el tema principal, a veces cuando un sitio web crece esto se vuelve algo complicado.
2.-Una correcta organización en temas te permite obtener una diferenciación clara entre las distintas partes de tu web y abarcar keywords especificas y sus variaciones en diferentes secciones.
3.-Una buena organización en temas tiene un impacto positivo en la selección, fuerza y posicionamiento de tus keywords.
4.-Una web estructurada en temas piramidales está preparada para el futuro. Los buscadores tienen un estructura organizada, limpia y con términos relevantes que no van a eliminar de sus bases de datos.
5.-Un web estructura así te permitirá ahorrar tiempo en el futuro
6.-Muchos de los buscadores actuales usan temas para sus algoritmos de posicionamiento

Buscadores basados en temas, ¿como funcionan?

La diferencia principal es que un buscador basado en temas visita las páginas de tu sitio web y las indexa en conjunto no una a una a media que las va visitando. El buscador basado en temas examina y pondera tu sitio web como un todo en lugar de hacerlo en cada página individualmente. Con este tipo de indexación es más difícil que una página aislada en una web no estructurada en temas obtenga un buen posicionamiento para una keyword que un sitio entero que hable de esta keyword y que reciba y tenga enlaces de keywords muy relacionadas.

Bookmark Temas piramidales (SEO)  at del.icio.us Digg Temas piramidales (SEO) Mixx Temas piramidales (SEO) Bloglines Temas piramidales (SEO) Technorati Temas piramidales (SEO) Fark this: Temas piramidales (SEO) Bookmark Temas piramidales (SEO)  at YahooMyWeb Bookmark Temas piramidales (SEO)  at Furl.net Bookmark Temas piramidales (SEO)  at reddit.com Bookmark Temas piramidales (SEO)  at blinklist.com Bookmark Temas piramidales (SEO)  at Spurl.net Bookmark Temas piramidales (SEO)  at NewsVine Bookmark Temas piramidales (SEO)  at Simpy.com Bookmark Temas piramidales (SEO)  at blogmarks Bookmark Temas piramidales (SEO)  with wists Bookmark Temas piramidales (SEO)  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

La cola larga (SEO)

08 05 2008 Ocio
Que sucede cuando creas un nuevo sitio web y pretendes elaborar un estrategía SEO. Lo primero que pretendes hacer es escoger cuidadosamente una grupo de palabras clave para rankear en la página de resultados de google (SERP). Diseñas la páginas y amoldas la estructura de la página (sus enlaces internos y contenido) para tratar de obtener buenos resultados en ellas. Introduces las palabras clave y sus sinónimos en el contenido de tus páginas. Finalmente marcas tus páginas con el código de google analytics y después de unos días miras los resultados.

    Para tu sorpresa detectas que muchas de los términos por los que entra la gente en tu página no son los que esperabas e incluso te preguntas porqué apareces en búsquedas que parecen no tener nada que ver con lo que aparece en tu página (si, el bounce rate, relación de rebote y el tiempo medio que pasan los visitantes en tu página se resiente). Es más tu mismo intentando buscar tus páginas por esos términos dan lugar a resultados en los que ni siquiera apareces.

    Pasado aún más tiempo tus visitantes comienzan a entrar en tu página por los términos que pretendías e incluso detectas nuevas frases por los que entran relacionadas con tus productos y así optimizas nuevamente para estos nuevos términos recién descubiertos y que te parecen interesantes.

    Pero que pasa con esos términos 'raros' que aparecían al principio. Pues nada que siguen allí atrayendo visitantes (más o menos interesados en lo que ofrece tu web). A medida que tu web se hace más grande y tiene más contenido el número de términos por los que aparecen en las páginas de resultados también aumenta. No sólo de términos extraños sino otros muchos más relacionados con tu contenido. Tus términos principales son los que optienen un mayor número de visitas pero hay otros muchos que atraen proporcionalmente un número muy pequeño de visitas pero que en su conjunto atraen una cantidad de tráfico muy respetable (aún tal vez con una cota de conversión menor). A todos estos términos se le llama la cola larga. Es fácil ver el porqué, si representásemos el % de visitas que llegan a nuestra web con cada una de nuestras palabras claves ordenadas de mayor a menor veríamos que la gráfica empezaría en valore muy altos, tus keywords principales y caería muy rápidamente ha valores mucho más reducidos pero mucho más largo que estos primeros valores.

¿Porqué el concepto de cola larga se ha vuelto tan importante?

    En primer lugar porqué sumando las aportaciones de cada una de las palabras clave que se encuentran en la cola larga tenemos una cantidad de tráfico muy importante que puede rondar el 25% o más dependiendo del tipo de página. Por ejemplo amazón es el rey de la cola larga. Para dar un ejemplo amazón factura más con pequeños libros que apenas tienen 1 o 2 ventas al año que con toda la saga de Harry Potter.

    En segundo lugar que pasa cuando has conseguido escalar puestos para tus palabras clave principales y ya no puedes subir más o porque has alcanzado la 1ª posición o porqué las páginas que están por encima tuyo parecen inamovibles (wikipedia). Pués que ha llegado el momento en el que debes concentrarte en los términos de la cola larga. Porqué es hay donde puedes mejorar tu número tu número de visitas.

¿Pero como hago para para mejorar mi cola larga?

    Como el número de keywords en la cola larga puede ser realmente gigantesco, obviamente no puedes ponerte a optimizar una por una creando por ejemplo landings específicas para cada una de ellas. Además los keywords de la cola larga pueden variar de manera importante. La única manera viable de obtener una cola todavía más larga es aumentar tu web con contenido de calidad, olvidándote de tus palabras claves principales y sus sinónimos, contenido natural (no optimizado con keywords de ningún tipo) y relevante. Muchas veces se dice que un SEO realmente bueno es el que no lo parece aquí tenemos otros buen ejemplo de esto.

Bookmark La cola larga (SEO)  at del.icio.us Digg La cola larga (SEO) Mixx La cola larga (SEO) Bloglines La cola larga (SEO) Technorati La cola larga (SEO) Fark this: La cola larga (SEO) Bookmark La cola larga (SEO)  at YahooMyWeb Bookmark La cola larga (SEO)  at Furl.net Bookmark La cola larga (SEO)  at reddit.com Bookmark La cola larga (SEO)  at blinklist.com Bookmark La cola larga (SEO)  at Spurl.net Bookmark La cola larga (SEO)  at NewsVine Bookmark La cola larga (SEO)  at Simpy.com Bookmark La cola larga (SEO)  at blogmarks Bookmark La cola larga (SEO)  with wists Bookmark La cola larga (SEO)  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

getopt

06 05 2008 Programación
Las funciones getopt y getopt_long sirven para automatizar el paso de parámetros al programa en linea de comandos. Estas funciones también pertenecen a la librería C de GNU. Sus usos y ejemplos son inmediatos en cuando comenzamos a escribir comandos en nuestra consola.

# ls -la
# find . -name "*.mp3"

    -la y -name son los parámetros que deben ser analizados cuando invocamos estos programas para su correcto funcionamiento. Getopt y getopt_long nos servirán de mucha ayuda para analizar y detectar todos esto parámetros.

    Debemos incluir el archivo de cabecera unistd.h para poder emplear getopt una vez hecho esto la firma de la función es la siguiente:

int getopt(int argc, char * const argv[], const char *optstring);

    Para getopt_long también necesitamos el archivo de cabecera unistd.h:

int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

    getopt emplea o fija varias variables, estas son:

int opterr - Si le damos un valor igual a 0 getopt no indicara imprimirá en stderr ningún mensaje de error (por defecto si que lo hará)
int optopt - Si getopt encuentra una opción no reconocida o sin un parámetro necesario, entonces almacena este caracter en esta varible.
int optint - La variable fijada por getopt nos da el indice del parámetro a ser analizado.
char* optarg - Fijada por getopt y que nos da la posición del argumento a analizar.

    La función getopt obtiene el siguiente argumento en la lista de argumentos que se le pasan al programa. Normalmente los argumentos son los pasados a la función main al comienzo de nuestro programa (argc y argv)

    optstring es una cadena que especifica todos los caracteres válidos para nuestro programa. Un carácter seguido de dos puntos ':' indica que esta opción necesita un argumento y si está seguida de dos dobles puntos '::' indicamos que ese argumento es opcional (sólo GNU), por lo tanto la cadena:

"lac:d::"

    Indica que nuestro programa acepta el parametro -l, -a el parámetro -c seguido de un argumento y -d que puede no estar seguido de un argumento esto podría ser:

-l -a -c /tmp/a.txt -d

ó

-la -d -c /tmp/a.txt

etc

    getopt va devolviendo el último parámetro analizado y al final cuando no queda ningúno más por analizar devuelve -1

    Si la opción tiene un argumento este es colocado dentro de optarg

    El argumento especial '--' termina el análisis de opciones posteriores

    Si getopt encuentra una opción que no aparece en la lista de opciones disponibles devuelve '?' e introduce en la variable externa optopt este argumento.

    Este es un ejemplo del uso de getopt:

#include
#include
#include
#include

int main (int argc, char **argv)
{
int aflag = 0;
int bflag = 0;
char *cvalue = NULL;
int index;
int c;

opterr = 0;

while ((c = getopt (argc, argv, "abc:")) != -1)
switch (c)
{
case 'a':
aflag = 1;
break;
case 'b':
bflag = 1;
break;
case 'c':
cvalue = optarg;
break;
case '?':
if (optopt == 'c')
fprintf (stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
}

printf ("aflag = %d, bflag = %d, cvalue = %s\n",
aflag, bflag, cvalue);

for (index = optind; index < argc; index++)
printf ("Non-option argument %s\n", argv[index]);
return 0;
}


Bookmark getopt  at del.icio.us Digg getopt Mixx getopt Bloglines getopt Technorati getopt Fark this: getopt Bookmark getopt  at YahooMyWeb Bookmark getopt  at Furl.net Bookmark getopt  at reddit.com Bookmark getopt  at blinklist.com Bookmark getopt  at Spurl.net Bookmark getopt  at NewsVine Bookmark getopt  at Simpy.com Bookmark getopt  at blogmarks Bookmark getopt  with wists Bookmark getopt  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Memcache

27 04 2008 GNU/Linux
Memcache es un sistema para almacenamiento de objetos en memoria que pueden ser solicitados por varios procesos, incluso en distintas máquinas y que actúa como caché para acelerar estas peticiones. Memcache ha sido diseñado de manera genérica aunque su mayor utilidad y para la que fue desarrollado inicialmente es para reducir la carga en sitios web debido a las solicitudes a base de datos que en muchos casos son innecesarias.

    Memcache ha sido desarrollado por Danga Interactive para livejournal en primera instancia pero luego liberado bajo licencia BSD. Hoy en día es empleado por muchos otros sitios webs debido a su gran utilidad, entre ellos: Livejournal, Slashdot, Wikipedia, SourceForge, FotoLog y un largo etc.

    El funcionamiento de memcache es de concepción muy sencilla. En lugar de acceder a la base de datos para solicitar determinada información primero se accede a memcached (el servidor de memcache) a través de tcp/ip (así se puede acceder a servidores memcache en máquinas remotas o en local). Si este tiene la información la devuelve y si no debemos hacer la petición a la base de datos e introducir los datos en memcached para que puedan ser accedidos directamente la próxima vez que los necesitemos. Además cada dato introducido en memcached tiene un tiempo de expiración, tras pasar este tiempo almacenado en el servidor este se considera descartable y se borra del servidor, dejando espacio para otros objetos.

    De una manera muy sencilla también es posible emplear varios servidores memcache, creando una cache distribuida todavía más eficiente o incluso utilizar varios niveles de caché entre máquinas locales y/o remotas.

    Memcaché está basado en libevent una librería de notificación de eventos asíncrona que permite ejecutar callbacks cuando un determinado evento es disparado (además de eventos puede reaccionar a señales o a intervalos de tiempo específicos, más adelante quizás le dedique un post a esta librería).

    Para instalar memcached en nuestro servidor debemos bajarnos las fuentes del sitio de Danga Interactive. La compilación e instalación no debería ser complicada. También es posible descargar fuentes y binario con apt-get o con el gestor de paquetes que tengamos instalado (absténganse windowzers)

apt-get install memcached

 El servidor memcached tiene unas pocas opciones en la línea de argumentos, estos son:

-d (implicito)
-v (verbose)
-vv (más verbose)
-m (memoría en megas disponible para el demonio)
-p (puerto a la escucha, por defecto 11211
-u (usuario bajo el que se ejecuta el servidor)
-l (IP de la que se espera conexiónes, es la única medida de seguridad del servidor, el valor por defecto es escuchar comunicaciones desde cualquier ip lo cual es completamente inseguro si no se está detrás de un firewall)
-c (número máximo de conexiones simultaneas)
-k (activa bloqueos)
-M (devuelve error cuando la memoria se agota)
-r (limita los core dump)

 El demonio toma toda la memoria especificada por el parámetro -m al principio y cuando no puede alamacenar más datos desecha aquellos accedidos menos recientemente (si no se le pasa el parámetro -M)

Ejemplo:
# memcached -d -m 2048 -l 10.0.0.40 -p 11211

El comando anterior iniciará el servidor usando 2GB de memoria y escuchando conexiones desde la ip 10.0.0.40 al puerto 11211. Recordemos que es posible iniciar más servidores memcache en la misma máquina.

Existen disponibles diversas APIs para conectarse al servidor escritas en diferentes lenguajes: PHP, Python, PERL, Ruby, Java, C, C#

Ejemplo en php de conexión con el servidor memcached:


$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

$version = $memcache->getVersion();
echo "Server's version: ".$version."
\n";

$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)
\n";

$get_result = $memcache->get('key');
echo "Data from the cache:
\n";

var_dump($get_result);

?>

Bookmark Memcache  at del.icio.us Digg Memcache Mixx Memcache Bloglines Memcache Technorati Memcache Fark this: Memcache Bookmark Memcache  at YahooMyWeb Bookmark Memcache  at Furl.net Bookmark Memcache  at reddit.com Bookmark Memcache  at blinklist.com Bookmark Memcache  at Spurl.net Bookmark Memcache  at NewsVine Bookmark Memcache  at Simpy.com Bookmark Memcache  at blogmarks Bookmark Memcache  with wists Bookmark Memcache  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Gato bebiendo leche de vaca

26 04 2008 Ocio


Gato bebiendo leche de vaca, literalmente

Bookmark Gato bebiendo leche de vaca  at del.icio.us Digg Gato bebiendo leche de vaca Mixx Gato bebiendo leche de vaca Bloglines Gato bebiendo leche de vaca Technorati Gato bebiendo leche de vaca Fark this: Gato bebiendo leche de vaca Bookmark Gato bebiendo leche de vaca  at YahooMyWeb Bookmark Gato bebiendo leche de vaca  at Furl.net Bookmark Gato bebiendo leche de vaca  at reddit.com Bookmark Gato bebiendo leche de vaca  at blinklist.com Bookmark Gato bebiendo leche de vaca  at Spurl.net Bookmark Gato bebiendo leche de vaca  at NewsVine Bookmark Gato bebiendo leche de vaca  at Simpy.com Bookmark Gato bebiendo leche de vaca  at blogmarks Bookmark Gato bebiendo leche de vaca  with wists Bookmark Gato bebiendo leche de vaca  at Ma.gnolia.com