
Contratar un hosting compartido, conlleva el delegar la gestión del servidor en manos de otros. Suele pasar que el servidor en donde tengamos nuestro sitio alojado no disponga de todos los módulos necesarios para una perfecta optimización de nuestra web. Una de esas optimizaciones es la compresión gzip. Comprimiendo mediante gzip conseguimos reducir el tamaño del html, css y JavaScript a una tercera parte de su tamaño. Siendo esta la manera más eficiente de ahorrar en transferencia de datos. Tema importante también en términos económicos ya que en algunos hostings tenemos transferencia limitada a cierta cantidad.
Paso a describir la forma mediante la cual he conseguido activar la compresión gzip en mi hosting 1&1. Lo primero que hay que hacer es añadir un par de líneas en el .htaccess para que los archivos sean parseados en php5 correctamente:
AddType x-mapp-php5 .php .shtml .html .htm .js .txt .css AddHandler x-mapp-php5 .php .shtml .html .htm .js .txt .css
Aquí añadimos las extensiones que vayamos a comprimir. Principalmente contenido html y texto como JavaScript o CSS.
La activación de la compresión gzip la podemos activar en el php.ini con el siguiente código:
zlib.output_compression = On zlib.output_compression_level = 9 allow_url_fopen = On
En otros hostings con más módulos activados esto lo suelen hacer a nivel de .htaccess pero a mí no me ha funcionado de esa forma. Con la primera línea estamos activando la compresión en sí. La segunda línea fija el nivel de compresión, los niveles están comprendidos entre 0 y 9. En este caso estamos aplicando la compresión gzip al máximo. Por último se habilitan las envolturas fopen de tipo URL que permiten el acceso a objetos URL como archivos. Las extensiones zlib registran envolturas adicionales.
Hasta este punto podremos ver con herramientas como el plugin YSlow de Firefox que la compresión gzip se lleva a cabo. Pero en ciertos navegadores fallan los estilos y el JavaScript contenido en archivos externos. Esto es debido a que la compresión está cambiando las cabeceras de estos archivos a html corriente. La forma de solucionarlo es especificar el tipo de archivo para cada uno de ellos mediante programación.
Lo hacemos con el siguiente código:
$pathinfo = pathinfo($_SERVER['PHP_SELF']);
$extension = $pathinfo['extension'];
if($extension == "css")
{
header("Content-type: text/css");
}
if($extension == "js")
{
header("Content-type: text/javascript");
}
Ahora hay que especificar que en cada llamada se consulte este archivo añadiendo esta línea al php.ini:
auto_prepend_file = [RUTA_FISICA]/contentHeader.php
Intenté hacer lo mismo a nivel de php pero siempre conseguía un error 500. Así que tuve que optar por ejecutarlo a nivel de php.ini . Hay que especificar la ruta física dentro del servidor, la cual podemos consultar con el siguiente archivo en php:
$ruta_absoluta = getcwd(); echo 'Ruta física: ' . $ruta_fisica;
Si ejecutamos este código en el directorio donde tengamos el contentHeader.php veremos la información que nos falta para su correcta implementación. Una vez completado todo el php.ini hay que destacar que debemos copiarlo a todas las carpetas donde hayan archivos css y JavaScript. Ya que el php.ini solo se aplica a la carpeta en donde esté contenido.
]]>
php_value memory_limit 32M
Con esto se logra solucionar el problema de la página en blanco en la administración de Wordpress en listados con un alto número de elementos.
]]>En mi caso cada post lo asigno a una categoría y después tengo una para marcar los que quiero que aparezcan en el slide de la home. Pero necesito que siempre se incluya en la url el nombre de la categoría y no la de destacados. Hasta el momento el comportamiento era el deseado, hasta que me he dado cuenta de que en los dos últimos posts utilizaba la categoría destacados en la URL.
He comprobado el resto de posts, pero en estos no ocurría. Sólo se presentaba en los posts asignados a una categoría que por lo visto se creó después de la de destacados. Por lo que el siguiente paso lógico ha sido desvincular los posts de la categoría destacados. Volverla a crear y volver a asignar los posts destacados. Una vez hecho esto, siempre utiliza el nombre de la categoría en la URL correctamente.
Por lo visto, Wordpress utiliza la categoría más antigua, o con menor identificador como primera opción para formar la URL permanente. Con esto controlado y las correspondientes redirecciones 301 en el .htaccess, problema solucionado.
]]>Creamos una plantilla de Wordpress como la siguiente:
<?php
/**
* @package WordPress
* @subpackage theme
*/
/*
Template Name: tags-template
*/
?>
<?php get_header(); ?>
<div id="content" class="clearfix">
<h1 class="title">
Listado de tags
</h1>
<p class="nube_tags"><?php wp_tag_cloud('smallest=12&largest=22&separator= &orderby=name&order=RAND&number=0'); ?></p>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
La instrucción que genera la nube de tags en Wordpress es wp_tag_cloud. Ofrece un buen número de opciones de personalización que podemos ver en su página de soporte.
En mi ejemplo de nube de tags he utilizado los siguientes parámetros:
Una vez implementada la plantilla la guardamos en el directorio de nuestro tema. Y solo queda crear una página nueva en Wordpress, seleccionar la plantilla y colocar el link en el blog si no lo hace automáticamente el tema seleccionado.
]]>Primero debemos crear la plantilla con el siguiente código:
<?php
/**
* @package WordPress
* @subpackage Tema
*/
/*
Template Name: post-list-template
*/
?>
<?php get_header(); ?>
<div id="content" class="clearfix">
<h1 class="title">Listado de posts</h1>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('posts_per_page=100&paged=' . $paged . $categoria); ?>
<?php while (have_posts()) : the_post(); ?>
<h2 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_time('j-F-Y') ?> <?php the_title(); ?>"><?php the_title(); ?></a></h2>
<?php endwhile; ?>
<div class="navigation clearfix">
<div class="alignleft"><?php next_posts_link('« Anteriores') ?></div>
<div class="alignright"><?php previous_posts_link('Siguientes »') ?></div>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>En esta ocasión se ha optado por un listado de posts paginado. En cada página se mostrarán 100 posts:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('posts_per_page=100&paged=' . $paged . $categoria); ?>Después viene el bucle en que se recorre el listado generando un listado de links. Se utiliza the_permalink() para conseguir la url y the_title() para mostrar el título de cada post en el anchor text y en el title del link. Por último, mostramos el paginador que permitirá navegar entre las páginas del listado.
Una vez implementada la plantilla la guardamos en el directorio de nuestro tema. Y solo queda crear una página nueva en Wordpress, seleccionar la plantilla y colocar el link en el blog si no lo hace automáticamente el tema seleccionado.
En el LISTADO DE POSTS se puede ver este algoritmo en funcionamiento

El intentar borrar un gran número de registros de una tabla en SQL puede provocar el bloqueo de la misma. Quedando inutilizada para insertar o modificar datos en ella mientras se hace el borrado. Por lo que no está de más realizar este borrado por partes.
Al igual que con las sentencias SELECT en las que utilizamos TOP para mostrar los n primeros registros. Podemos utilizar la misma opción TOP con DELETE, pero no de la misma forma. Con DELETE hay que utilizar el número de registros a borrar entre paréntesis de la siguiente forma.
DELETE TOP(100) FROM tabla
Esto haría que solamente se borraran los primeros 100 registros de la tabla. Lo que nos permitiría fragmentar el borrado en pequeñas partes.
]]>
Antes de empezar a sincronizar nuestro smartphone Windows Mobile con Google Sync debemos realizar una copia de seguridad de nuestros contactos, calendarios y demás datos que consideremos importantes. Y quiero insistir en ello, porque sincronicé los datos de mi teléfono con los de mi cuenta Gmail de Google y hasta ahí todo bien. El problema fue cuando al deseleccionar la sincronización de Contactos y dejar el resto de apartados seleccionados, ví como desaparecían todos los contactos en mi movil.Windows Mobile nos ofrece la utilidad ActiveSync para sincronizar nuestro dispositivo móvil con otros dispositivos. Realizando los siguientes pasos conseguiremos sincronizar nuestros contactos, calendarios y correos electrónicos de Google. Empecemos:
Con estos sencillos pasos tendremos sincronizado nuestro smartphone Windows Mobile con nuestra cuenta de Google.
]]>Si consultamos el resumen del SQL Server Management Studio, solo nos muestra la fecha de creación de las tablas. En caso de haber creado alguna nos es de utilidad. Pero, ¿y si solo hemos añadido o modificado algún campo?. En ese caso la fecha de creación no nos sirve de nada y no hay forma alguna de añadir una nueva columna con la fecha de modificación de la tabla.
Si pinchamos con el botón derecho sobre las tablas propensas a haber sido modificas podemos ver las propiedades. Pero seguimos teniendo el mismo problema, solo se dispone de una fecha de creación. Ni rastro de fecha de modificación por ningún sitio. Como en otros casos, hay que recurrir a los comandos SQL para conseguir los datos que no disponemos de forma gráfica.
En este caso recurrimos a una consulta de sys.objects con una select para obtener la fecha de modificación:
SELECT * FROM sys.objects WHERE type = 'U' ORDER BY modify_date DESC
La tabla sys.objects contiene una fila para cada objeto de ámbito de esquema definido por el usuario que se cree en la base de datos. Cada fila dispone de los siguientes campos: name, object_id, principal_id, schema_id, parent_object_id, type, type_desc, create_date, modify_date, is_ms_shipped, is_published y is_schema_published. De entre su docena de campos los más interesantes para mí son los siguientes:
Con todo esto, como hemos visto en la sentencia de SQL más arriba, solo tenemos que consultar sys.objects. Podemos filtrar por el tipo de objeto que nos interese y en la columna modify_date tendremos la fecha de modificación.
]]>
Después de conocer que Vodafone está ofreciendo el iPhone a sus clientes en Reino Unido. Parece ser que también Vodafone tendrá el iPhone en España. Esto será posible a partir del verano, cuando podremos empezar a disfrutar el iPhone sin ser necesariamente cliente de Movistar.Parece ser que el incumplimiento de objetivos de venta de Movistar con el iPhone haría perder su exclusividad del terminal más deseado de su catálogo. Puede que la llegada del iPhone a Vodafone coincida con la llegada del iPhone 4G, debido a que se rumorea que Apple lo anunciaría durante el evento WWDC. Con lo que la noticia cobraría más fuerza cuando en Junio o Julio Vodafone empiece a ofrecer el terminal.
]]>Una opción más potente que el RAND() para generar valores aleatorios es la utilización de la función NEWID() de SQL. NEWID() nos devuelve una cadena larga basada en la MAC de la tarjeta de red y el reloj del sistema. Este sí será un valor aleatorio más útil, ya que obtendremos un valor distinto en cada llamada a NEWID() aunque sea en la misma transacción. Pongamos como ejemplo que queremos devolver un registro aleatorio de una tabla, lo podríamos hacer con esta sentencia:
SELECT TOP 1 * FROM tabla ORDER BY NEWID()
Con esto obtendríamos el primer registro pero de un listado con orden aleatorio. Lógicamente, si quitamos el TOP 1 de la sentencia, obtendríamos el listado aleatorio completo. Y si volvemos a ejecutar la sentencia, el mismo listado pero con un orden diferente al obtenido en la anterior ejecución.
Si por algún motivo necesitamos generar en SQL un número aleatorio. Podemos transformar el resultado de la función NEWID() en un entero con la función CHECKSUM de la siguiente manera:
select checksum(newid())
Esta sentencia puede devolver en algún caso números negativos, esto lo solucionamos utilizando la función abs que nos devuelve el valor absoluto:
select abs(checksum(newid()))
Y si queremos limitar el valor de este número aleatorio, utilizamos el resto de la división entera (%) como en otros lenguajes de programación:
select abs(checksum(newid())) % 10
Con esta última sentencia obtenemos un valor aleatorio entre 0 y 9 en SQL.
]]>