Warning: Cannot modify header information - headers already sent by (output started at /homepages/19/d301818556/htdocs/vicentesabuco/contentHeader.php:22) in /homepages/19/d301818556/htdocs/vicentesabuco/wp-includes/feed-rss2.php on line 8
VicenteSabuco.com http://www.vicentesabuco.com Informática, programación y otras soluciones tecnológicas Sun, 30 May 2010 21:42:17 +0000 http://wordpress.org/?v=2.9.2 en hourly 1 Compresión gzip en hosting compartido 1&1http://www.vicentesabuco.com/programacion/php/2010-05-14/compresion-gzip-hosting-compartido-1and1.html http://www.vicentesabuco.com/programacion/php/2010-05-14/compresion-gzip-hosting-compartido-1and1.html#comments Fri, 14 May 2010 16:41:57 +0000 jose http://www.vicentesabuco.com/?p=286 compresion gzip en hosting compartido 1and1

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.

Activar la compresión gzip

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.

Problema con las cabeceras de los archivos css y javascript comprimidos

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.

]]>
http://www.vicentesabuco.com/programacion/php/2010-05-14/compresion-gzip-hosting-compartido-1and1.html/feed 12
Página en blanco de la administración de Wordpresshttp://www.vicentesabuco.com/wordpress/2010-05-13/solucion-pagina-blanco-administracion.html http://www.vicentesabuco.com/wordpress/2010-05-13/solucion-pagina-blanco-administracion.html#comments Thu, 13 May 2010 18:47:22 +0000 jose http://www.vicentesabuco.com/?p=331 Hace unos días se me planteó el problema de la página en blanco en la administración de Wordpress. En este caso se producía en el listado de páginas. Comparamos con otros Wordpress de la misma versión y con los mismos plugins montados en el mismo servidor y no se producía este problema. La única diferencia que vimos en el Wordpress problemático era la gran cantidad de páginas que se habían creado con él. Por lo que, consultando casos parecidos por los foros, nos decantamos por pensar que el PHP se quedaba sin memoria por la gran cantidad de páginas listadas.Solucion pagina en blanco administracion wordpress
Con un phpinfo() comprobamos que el memory_limit estaba establecido a 16M y con la siguiente orden en el .htaccess se duplicó el límite de memoria:

    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.

]]>
http://www.vicentesabuco.com/wordpress/2010-05-13/solucion-pagina-blanco-administracion.html/feed 0
Url de un post asignado a dos categoríashttp://www.vicentesabuco.com/wordpress/2010-04-10/url-post-asignado-dos-categorias.html http://www.vicentesabuco.com/wordpress/2010-04-10/url-post-asignado-dos-categorias.html#comments Fri, 09 Apr 2010 23:04:22 +0000 jose http://www.vicentesabuco.com/?p=280 Voy a plantear la situación que se me ha presentado hoy. En este blog tengo una serie de categorías para clasificar los posts. El nombre de la categoría se incluye en la url añadiendo %category% en las Opciones de los enlaces permanentes. Si el post está asignado a una categoría su nombre se añade a la URL. Pero, ¿qué pasa cuando un post está asignado a dos o más categorías? ¿cual se utiliza en la URL permanente?.

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.

]]>
http://www.vicentesabuco.com/wordpress/2010-04-10/url-post-asignado-dos-categorias.html/feed 0
Crear página en wordpress con el listado de tags completohttp://www.vicentesabuco.com/wordpress/2010-04-09/crear-pagina-wordpress-listado-tags-completo.html http://www.vicentesabuco.com/wordpress/2010-04-09/crear-pagina-wordpress-listado-tags-completo.html#comments Fri, 09 Apr 2010 18:44:06 +0000 jose http://www.vicentesabuco.com/?p=246 Cuando el espacio reservado para el listado de tags de nuestro Wordpress es limitado y el número de tags aumenta hasta llenarlo. Nos interesa tener el listado completo de tags en una página de nuestro Wordpress para ayudar a la indexabilidad. La página nos aportará muchos beneficios en este sentido y Wordpress nos ofrece una forma fácil y rápida de implementar el listado de tags.

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:

  • smallest: el tag con menor número de apariciones tendrá este tamaño de fuente.
  • largest: el tag con mayor número de apariciones tendrá este tamaño de fuente.
  • separator: cadena empleada para separar entre tags. En el ejemplo se utiliza un espacio en blanco.
  • orderby: parámetro por el que se ordena la lista de tags del blog. En el ejemplo, por nombre.
  • order: especifica si el orden es ascendente (ASC), descendente (DESC) o aleatorio (RAND). En el ejemplo se ha optado por la opción aleatoria para que cada vez que se entre a la página muestre una nube diferente.
  • number: especifica el número de tags a mostrar. Si no ponemos este valor, mostrará como mucho 45 tags. En este caso nos interesa que los muestre todos, lo que indicamos con un 0.

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.

]]>
http://www.vicentesabuco.com/wordpress/2010-04-09/crear-pagina-wordpress-listado-tags-completo.html/feed 0
Generar el listado de posts en Wordpresshttp://www.vicentesabuco.com/wordpress/2010-04-01/generar-listado-posts-wordpress.html http://www.vicentesabuco.com/wordpress/2010-04-01/generar-listado-posts-wordpress.html#comments Thu, 01 Apr 2010 18:13:05 +0000 jose http://www.vicentesabuco.com/?p=227 Desde el punto de vista SEO, un listado con todos los posts ayuda a la indexabilidad del sitio. Ya que el robot tiene en una sola página todos los enlaces más relevantes del blog, los posts. En Wordpress una forma de hacerlo puede ser la siguiente.

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

]]>
http://www.vicentesabuco.com/wordpress/2010-04-01/generar-listado-posts-wordpress.html/feed 0
Usar TOP en una sentencia DELETE de SQLhttp://www.vicentesabuco.com/sql-server/2010-04-01/top-sentencia-delete.html http://www.vicentesabuco.com/sql-server/2010-04-01/top-sentencia-delete.html#comments Wed, 31 Mar 2010 22:16:24 +0000 jose http://www.vicentesabuco.com/?p=210 Usar top en una sentencia delete de sql

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.

]]>
http://www.vicentesabuco.com/sql-server/2010-04-01/top-sentencia-delete.html/feed 0
Sincronizar Windows Mobile con Google Sync usando ActiveSynchttp://www.vicentesabuco.com/noticias/moviles-telefonia/2010-02-28/sincronizar-windows-mobile-google-sync-activesync.html http://www.vicentesabuco.com/noticias/moviles-telefonia/2010-02-28/sincronizar-windows-mobile-google-sync-activesync.html#comments Sun, 28 Feb 2010 13:45:44 +0000 jose http://www.vicentesabuco.com/?p=183 Sincronizar windows mobile con Google syncAntes 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:

  1. Ejecutamos Inicio -> Programas -> ActiveSync
  2. Hacemos click en Menú -> Configurar Sevidor
  3. Introducimos la dirección del servidor m.google.com
  4. Nos aseguramos de que el SSL esté activado y hacemos click en Siguiente.
  5. Introducimos los datos de nuestra cuenta de Google. Podemos hacerlo de diversas formas por si nuestro dispositivo no nos permite hacerlo de una de ellas en concreto. Si tenemos una cuenta nombre_cuenta@gmail.com podemos introducir el nombre completo de la cuenta en el Nombre de usuario y nuestro password dejando el dominio vacío. O bien, si nuestro dispositivo requiere un nombre de dominio. Introducir el nombre_cuenta en el nombre de usuario y gmail.com en el dominio. Por supuesto el password en el correspondiente campo.
  6. Seleccionamos Guardar contraseña para poder sincronizar automáticamente y pulsamos en Siguiente.
  7. Seleccionamos los datos que queremos sincronizar. En este paso es muy importante indicar que Google solo nos permite seleccionar por el momento Contactos, Calendario y Correo electrónico. Si seleccionamos también las tareas, la sincronización fallará.
  8. Por último hacemos click en Finalizar y podremos ver como ActiveSync comineza la sincronización.

Con estos sencillos pasos tendremos sincronizado nuestro smartphone Windows Mobile con nuestra cuenta de Google.

]]>
http://www.vicentesabuco.com/noticias/moviles-telefonia/2010-02-28/sincronizar-windows-mobile-google-sync-activesync.html/feed 0
Fecha de modificación de tablas en SQLhttp://www.vicentesabuco.com/sql-server/2010-02-09/fecha-modificacion-tablas-sql.html http://www.vicentesabuco.com/sql-server/2010-02-09/fecha-modificacion-tablas-sql.html#comments Mon, 08 Feb 2010 22:11:38 +0000 jose http://www.vicentesabuco.com/?p=170 Cuando modificamos la estructura de una base de datos SQL en un servidor de preproducción lo lógico es ir preparando la actualización al servidor definitivo en producción. Pero a veces no se sigue el método lógico por prisas o descuido. Y cuando llega el momento de actualizar la base de datos nos encontramos con que no recordamos todas las tablas que hemos modificado y tenemos que ir comparando una a una.

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:

  • name: lógicamente para identificar el nombre del objeto.
  • type: define el tipo del objeto con un char(2) . El tipo que nos interesa es U que son las tablas de usuario. Si hubieramos definido procedimientos almacenados serían del tipo P. En msdn se pueden consultar los tipos.
  • type_desc: funciona en paralelo con la columna type ofreciendo una descripción más detallada del tipo.
  • create_date: nos muestra la fecha de creación del objeto, como en la pantalla de resumen de objetos.
  • modify_date: nos muestra la fecha de modificación del objeto. Lo que buscábamos.

 

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.

]]>
http://www.vicentesabuco.com/sql-server/2010-02-09/fecha-modificacion-tablas-sql.html/feed 0
iPhone con Vodafone a partir del veranohttp://www.vicentesabuco.com/noticias/apple-mac-iphone/2010-02-04/iphone-vodafone-a-partir-del-verano.html http://www.vicentesabuco.com/noticias/apple-mac-iphone/2010-02-04/iphone-vodafone-a-partir-del-verano.html#comments Thu, 04 Feb 2010 20:29:40 +0000 jose http://www.vicentesabuco.com/?p=164 Vodafone ofrecerá el iPhone a partir de veranoDespué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.

]]>
http://www.vicentesabuco.com/noticias/apple-mac-iphone/2010-02-04/iphone-vodafone-a-partir-del-verano.html/feed 0
Registros aleatorios en SQL con newid()http://www.vicentesabuco.com/sql-server/2010-01-16/aleatorios-sql-newid.html http://www.vicentesabuco.com/sql-server/2010-01-16/aleatorios-sql-newid.html#comments Sat, 16 Jan 2010 18:51:21 +0000 jose http://www.vicentesabuco.com/?p=145 Aunque SQL dispone de la función RAND() para generar números aleatorios su uso es limitado. Por ejemplo, si lo ejecutamos varias veces en una misma transacción, siempre nos devolverá el mismo valor. Con lo que, si queremos devolver un valor aleatorio en cada fila de una consulta, no podemos usarlo.

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.

]]>
http://www.vicentesabuco.com/sql-server/2010-01-16/aleatorios-sql-newid.html/feed 0