Todas las entradas de: Xosen

Crear un sitemap.xml de forma dinámica con PHP

Siguiendo con las optimizaciones para mejorar la indexación por parte de Google, vi en las herramientas que proporciona Google a webmasters (www.google.com/webmasters/tools/) que se puede proporcionar un sitemap en formato xml para que Google pueda rastrear con mayor facilidad algunas páginas de difícil rastreo.

En teoría, con la actualización de las Friendly URLs ya no tengo páginas de difícil rastreo, pero viendo que no me indexa, pues mejor dar todas las facilidades posibles.

Lo primero que hice fue crear un sitemap.xml mediante esta página:
http://www.xml-sitemaps.com/
La página se encarga de rastrear el sitio y obtener el listado de enlaces y te genera un xml para descargar. Después se deja en la raíz del blog, y ya es accesible mediante:
http://konichiwamundo.x10.mx/sitemap.xml

El problema es que según se generan nuevos artículos, tendría que estar volviendo a generar manualmente el sitemap. Además, aparecían enlaces que no estoy especialmente interesado en que se indexen, como las etiquetas o la página de registro.

La solución, por tanto, es que el sitemap se genere de forma dinámica. Estuve buscando generadores de sitemap en PHP y al final encontré este tutorial de como hacer el tuyo propio:

http://www.seopher.com/articles/writing_a_php_google_sitemap_generator_without_using_fopen

Usando ese código como base y el sitemap.xml que había generado con la primera página como plantilla, lo he adaptado para poder funcionar con la base de datos de eggBlog.

Al final, solo añado las URLs de los artículos, ya que son mi prioridad en la indexación, pero no debería ser complicado modificar el código para añadir más enlaces.

[ACTUALIZACIÓN 05/03/2011]

He realizado algunas modificaciones al sitemap.php. Anteriormente estaba utilizando la fecha de publicación como la fecha de modificación el el sitemap, pero claro, yo quiero indicar a Google que un articulo ha sido actualizado, por lo que necesito tener una fecha de modificación. Para eso añadí una nueva columna a la tabla "eb_articles" con el nombre "mod_date".

Hay que establecer su valor en dos métodos, eb_admin_editarticle y eb_admin_newarticle, ambos en admin.php. Simplemente hay que añadir:

.",mod_date="".time(). en el INSERT.

También es interesante añadirlo a la definición de la tabla en el método eb_install para una futura migración o reinstalación. Solo hay que añadir:

"mod_date int NOT NULL DEFAULT '0',".

Por si alguien lo quiere aprovechar, aquí os dejo el código para descargar. Me ha tocado subirlo como un txt, ya que no me deja subir ficheros zip… ¬

[ACTUALIZACIÓN 11/10/2011]

Con tanto cambio de servidor, el fichero zip se perdió en algún lado, así que a continuación pongo la útima versión que hice para eggBlog. Para wordpress lo mejor es optar por un plugin como el Google (XML) Sitemap Generator.

<?php
require_once "_lib/global.php";
header("Content-Type: text/xml;charset=iso-8859-1");

// Connectamos con la base de datos
mysql_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass']);
@mysql_select_db($config['mysql_db']) or die("Unable to select DB");

// Realizamos la consulta
$sql = "SELECT article_id,mod_date,article_title,article_date"
." FROM eb_articles"
." WHERE article_flag = 1 OR article_flag = 2"
." ORDER BY article_date DESC";
$query = mysql_query($sql) or die("Query failed");

// Escribimos la cabezera del xml
echo '<?xml version="1.0" encoding="UTF-8"?>
    <urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">';

$maxArticleDate = 0;
settype($maxArticleDate, "integer");

while($row=mysql_fetch_array($query)){

    // Obtenemos la Friendly URL del articulo
    $article_link = eb_links_article($row['article_title'],$row['article_id']);

    // Componemos la fecha de modificación (p.e. 2011-02-18)
    $year = date("Y",$row[1]);
    $mon  = date("m",$row[1]);
    $day  = date("d",$row[1]);

    $lastModDate = $year.'-'.$mon.'-'.$day;

    echo
        '<url>
            <loc>'.$article_link.'</loc>
            <lastmod>'.$lastModDate.'</lastmod>
            <changefreq>monthly</changefreq>
        </url>';
    
    $articleDate = $row['article_date'];
    settype($articleDate, "integer");
    if($articleDate > $maxArticleDate){
        $maxArticleDate = $articleDate;
    }
}

mysql_close(); //Cerramos la conexión

$year = date("Y",$maxArticleDate);
$mon  = date("m",$maxArticleDate);
$day  = date("d",$maxArticleDate);

$lastCreateDate = $year.'-'.$mon.'-'.$day;

echo
    '<url>
        <loc>'.$config['domain'].'index.php</loc>
        <lastmod>'.$lastCreateDate.'</lastmod>
        <changefreq>daily</changefreq>
    </url>';

echo '</urlset>';
?>

¿Indexa Google las páginas PHP?

En teoría sí, pero por alguna razón a mi no.

Encontré este artículo que trata el tema de la indexación de páginas PHP por parte de Google y esclarece muchos de los mitos:
http://www.seo.com/blog/seo-tips/how-to-get-your-php-pages-indexed-on-google/

Ahí se explica que no debería haber ningún problema con las páginas generadas dinámicamente, pero en el caso de eggBlog, no parece indexar los artículos. En este caso se accede a los artículos a través de la página news.php y una ID, por ejemplo:
http://tu-url.com/news.php?id=12

Parece que el consenso general es que Google tiene problemas, o se esfuerza menos, en indexar páginas que tienes más de 2 parámetros, pero en mi caso solo tengo 1, el id, y no debería dar problemas…

El caso es que en el foro de eggBlog encontré un hilo en el que comentaban como sustituir la utilización de IDs por Friendly URLs:
http://eggblog.net/forum.php?topic=216

El usuario Faris se curró una modificación para el blog para implementar las Friendly URLs, que podéis encontrar en su web:
http://www.contraflo.co.uk/downloads/php/eggblog_seo_links.zip

Tras probar la modificación, estaba casi a punto, pero daba un fallo al intentar ir a los enlaces. Parecía cosa del .htaccess, así que tras investigar un poco encontré la respuesta en esta web:
http://www.williamsmendez.com/2010/01/friendly-url-solo-con-htaccess-y-rewriterule/

Solo hacía falta añadir esta linea:

RewriteBase /

El código completo del .htaccess por si alguien lo necesita es el siguiente:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule .*-([0-9]+).htm$ news.php?id=$1 [L]
RewriteRule .*-([0-9]+)/$ news.php?id=$1
RewriteRule (.*)-([0-9]+)$ $1-$2/ [R]
RewriteRule .*/([0-9]+)/$ news.php?id=$1
RewriteRule (.*)/([0-9]+)$ $1/$2/ [R]

Y una página con el listado de expresiones regulares y su significado, que nunca viene mal 🙂
http://plan-b-for-openoffice.org/ooo-help/r2.1/en-US/MAC/shared/01/02100001

El resultado final es que los enlaces a la derecha que van a los articulos muestran en la URL el nombre del artículo y el rastreador de Google debería de entrar en todos. A ver que tal en la próxima indexación…

[ACTUALIZACIÓN 15/02/2011]
Es irónico que la entrada que habla sobre Friendly URLs tenga una que justamente falla. ¿El problema? Pues que se está utilizando el título de la entrada como URL y ahí tengo un bonito interrogante (?), que se usa para pasar parámetros… y peta. Al principio pensaba que también estaban afectando el otro interrogante y el acento, pero solo quitando el interrogante de cierre se ha solucionado, aunque la URL ya no quedaba "bonita" ya que los caracteres especiales se sustituían por su código, por lo que he acabado sustituyendolos todos.

El método eb_links_article del fichero _lib/global.php queda así:

// F4ris - 20090708 - Function to produce SEO friendly links, dependant on config flag.
function eb_links_article($title,$id){
    global $config;
    if($config['seo_flag'] == 1) {
        $unsuportedChars = array("á","é","í","ó","ú","¿","?");
        $suportedChars = array("a","e","i","o","u","","");
        $tmpTitle = str_replace($unsuportedChars, $suportedChars, $title);
        $link = $config['domain'].urlencode(str_replace(" ","-",str_replace(" - ","-",$tmpTitle)))."-".$id.".htm";
    }else{
        $link = $config['domain']."news.php?id=".$id;
    }
    return $link;
}

Ordenar un Vector de manera aleatoria en j2me

Soy un gran fan de Java. Está claro que no es el lenguaje que mejor rendimiento da, pero la portabilidad, la estructura del lenguaje en sí y las herramientas disponibles (viva Eclipse!) hacen que disfrute programando en Java.

Últimamente estoy haciendo cositas de programación para mi Nokia, que corre un S40 y tiene Java Micro Edition. Me costó un poco al principio hacerme a los elementos de interfaz gráfica, pero ahora que ya lo domino más, puedo empezar a meterle funcionalidades chulas a los programas.

El caso es que necesitaba ordenar de manera aleatoria un Vector. En Java SE es inmediato con el método Collections.shuffle(Vector), pero en j2me no lo tenemos. Buscando un poco encontré un par de enlaces donde proponían soluciones, pero como no me gustaban sus implementaciones, pues al final cogí el código fuente del método Collections.shuffle y lo he adaptado para j2me.

Por si a alguien le resulta útil, aquí lo tenéis:

    public static void shuffle(Vector v){
        Random random = new Random(System.currentTimeMillis());
        Object[] array = new Object[v.size()];
        for(int i = 0; i < v.size(); i++){
            array[i] = v.elementAt(i);
        }
       
        int index;
        Object temp;
        for(int i = array.length - 1; i > 0; i--){
            index = random.nextInt(i + 1);
            temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }

        for(int i = 0; i < v.size(); i++){
            v.setElementAt(array[i], i);
        }
    }

Control de versiones

[Escrito el 13/09/2010]

Hola de nuevo! Tras un largo parón, vuelvo a la carga con energías renovadas!

Y como vuelvo a programar en casa, lo primero que he querido hacer es montarme un sistema de control de versiones de mi código, ya que me he acostumbrado a utilizarlo en el trabajo y me parece increíblemente útil.

Allí usaba principalmente CVS integrado en el Eclipse, pero nunca tuve que preocuparme del servidor o de crear nuevos proyectos. Ahora que he intentado hacerlo todo desde cero, me he encontrado con múltiples problemas. La máquina que uso para programar es un MacBook, pero quiero tener el repositorio en otro lugar, por si el portátil muere o si tengo que dejarlo encendido varios días seguidos.

El caso es que mi otro ordenador es un vetusto Pentium 4 con Windosw XP, y tras unos días de búsqueda, no ha habido manera de encontrar un buen servidor CVS gratuito para Windows. ¿No existe nada? La verdad es que ya no lo necesito, pero tengo curiosidad…

La segunda opción fue crear una máquina virtual con un Linux, y tener ahí el servidor. Pero tras instalar la máquina virtual y lanzarla, quedó claro que la opción era inviable, más que nada por la lentitud. El giga de RAM no da para más…

Viendo que montar un CVS se estaba complicando, me dio por echarle un vistazo a Subversion (SVN). Lo utilicé de manera muy esporádica en un proyecto anterior, y recuerdo que cuando lo comenté con mi anterior jefe, me hablo de sus virtudes situándolo como una opción superior a CVS.

Me puse a buscar un servidor de SVN gratuito para Windows y lo encontré rápidamente. Se trata de VisualSVN. Está disponible en dos versiones, pero la versión gratuita está muy completa, ofreciendo la versión de pago unas pocas funcionalidades que no estoy interesado en utilizar.

La instalación es muy sencilla, y en apenas unos pocos minutos puedes tener un servidor SVN funcionando. Lo único que falta es configurar el Eclipse para que se conecte al servidor.

Al contrario que CVS, Eclipse no trae integrado SVN, pero hay un proyecto en incubación, llamado Subversive, que se encuentra en una avanzada fase de desarrollo y es completamente funcional.

1. Instalarlo en Eclipse es tan sencillo como ir a Ayuda -> Instalar Nuevo Software…
2. Del desplegable seleccionamos Helios – http://download.eclipse.org/releases/helios
3. En 'Colaboración' seleccionamos las opciones relacionadas con Subversive, que suelen estar de las últimas.
4. Continuamos con la instalación como con cualquier otro componente de Eclipse, y al finalizar pedirá reiniciar Eclipse.
5. Al iniciarse, nos ofrecerá una lista de conectores para SVN. Los conectores a elegir dependerán de la versión de SVN que utilice nuestro servidor. En mi caso era la 1.6.12, por lo que elegí los conectores para la 1.6.x. Yo recomiendo instalar los dos que se ofrecen, el de código nativo (Native JavaHL) y el implementado en java (SVNKit).

En mi primer intento instalé únicamente el nativo y no hubo manera de hacerlo funcionar. Ahora estoy utilizando el SVNKit y sin problemas.En esta página tenéis una comparación de los pros y los contras de los conectores. En mi opinión SVNKit es a la larga una mejor opción.

Solo queda abrir la perspectiva de SVN y crear un repositorio, lo cual resulta bastante intuitivo y es muy similar a CVS.

Espero que os resulte útil, y confío en actualizar más frecuentemente el blog. Nos vemos!

[ACTUALIZACIÓN 11/02/2011]

Pues ya llevo unos meses usando Subversion y estoy encantado. No he notado que sea superior a CVS, pero la funcionalidad ha sido perfecta.

El otro día hice un tutorial de configuración de Subversive para un amigo y resulta que por unos problemas que han tenido con las versiones, la instalación ya no es tan sencilla como antes. Lo pasaré a formato web y lo colgaré para quien lo necesite 🙂

[ACTUALIZACIÓN 10/10/2011]

Me instale la última versión de Eclipse (Indigo) y la instalación de Subversive fue sin problemas, por lo que parece que ya está solucionado lo que comentaba en la última actualización.

Mac Tip of the Day #1

[Escrito el 12/10/2009]

Es una pequeña chorrada, pero en Windows estoy muy acostumbrado a moverme por las carpetas pudiendo moverme a la carpeta padre. En el Finder no veía un botón similar, pero hoy he descubierto que se puede conseguir el mismo efecto con Comando + Flecha Arriba. Soy un poco más feliz ^_^

Buscando un buen editor de texto

[Escrito el 26/07/2009]
Hoy quería hacer un pequeño experimento con html. Llevo años acostumbrado en Windows a que cuando quiero crear un nuevo fichero de texto, le doy al segundo botón, crear nuevo fichero de texto, y después ya le doy la extensión que me de la gana 😛

Total, que intento la misma operación en el Mac y… ¿no existe la opción? ¡Y como creo yo ahora un documento! De no ser por el "pánico" inicial, habría ido a el menú de aplicaciones y habría visto que ahí tengo el TextEdit, que habría sido más que suficiente para lo que tenía que hacer. Pero como siempre me ha gustado matar moscas a cañonazos, me he puesto a buscar un buen editor de código, y lo que es más importante, que sea gratuito.

Mirando unas cuantas webs, muchas me han indicado el Smultron. Lo he estado probando, y no me desagrada. Cuando haga algo un poco más complicado, ya veremos si está a la altura :P. Aun así, ya hecho de menos mi querido Notepad++ … 🙁

¿Alguien conoce algún otro editor de código para Mac que sea potente y fácil de usar?

[ACTUALIZACIÓN]
Hoy he estado haciendo unas cosillas con PHP, y según me voy acostumbrando al Smultron, cada vez me gusta más. Parece que llegó para quedarse 🙂

[ACTUALIZACIÓN 2]
En el curro uso constantemente el Eclipse, y el otro día al bajarme la nueva versión vi que hay una exclusiva para PHP, ¿alguien sabe que tal está? Me lo instalé pero me pareció un poco complicado de usar, ¿vale la pena que invierta tiempo en aprender a usarlo?

[ACTUALIZACIÓN 11/02/2011]
Poco hice con la versión de Eclipse para PHP, pero ahora me lo he vuelto a instalar para hacer las modificaciones del blog, así que a ver como va la cosa 🙂

Smultron por su parte murió. Renació de la mano de otro programador con el nombre de Fraise, que también murió rápidamente porque Smultron renació como programa de pago… Así que por el momento no tengo ni idea de un buen editor para Mac 😛

[ACTUALIZACIÓN 15/02/2011]
He estado usando el Eclipse para PHP y de momento me está gustando, pero cual ha sido mi sorpresa al descubir que no puedo comparar dos ficheros PHP, ni siguiera con las versiones anteriores que tengo en Subversión!!!

Es un bug conocido de la última versión. Más información y como solucionarlo en el siguiente enlace:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=326194

Estrenando el MacBook

[Escrito el 23/05/2009]

Tras una semana probando el MacBook Pro que me habían dejado, por fin me decidí a comprarme mi propio Mac. La cuestión estaba en cual comprarme, ya que el precio entre las distintas versiones sube como la espuma cuantas más chorraditas tienen.Hacía tiempo que quería hacerme con un portatil, y la verdad es que no tengo espacio para un iMac, así que la duda estaba entre comprar el Pro o no. Tras mirar comparativas, parece que el consenso general es que si no vas a usarlo para procesar video, tampoco hay tanta diferencia entre los dos modelos (un poco menos de velocidad en el procesador y en la RAM), y la verdad es que me atraía la idea de que fuese lo más pequeño posible.

Así pues, la duda estaba entre la carcasa de aluminio o el blanquito… pero gastarme casi 250€ más solo por la carcasa, me parecía demasiado, así que aquí os presento mi nuevo MacBook blanquito, al que ya he bautizado como "Byakugan" ^_^

El blanquito en acción

Si alguien se pregunta como se cambia el nombre del equipo (yo no lo sabía y lo he tenido que buscar), hay que ir a Preferencias del Sistema y después a Compartir. Ahí te aparece el nombre de la máquina. Muy intuitivo de encontrar no es…

Ni el teclado me respeta…

[Escrito el 13/05/2009]

Con el apaño del otro día, el ratón ya no me da problemas, así que después de leerme una buena cantidad de documentación sobre Cocoa y Xcode, me he puesto a programar mi primer "Hello World!".

Aún no tengo muy clara la estructura de los programas, y claro, meto lineas de código donde no toca, pero no pasa nada, la copio y la pego donde toca. Para ello pincho al principio de la linea, le doy al shift, y ahora le doy al fin… ¿Donde c*** se ha metido la tecla fin? Ah! vale, culpa mía, se ejecuta con fn y la flecha derecha…. WTF! Me coge hasta el FIN del documento! Aquí está fallando algo…

Y lo que falla es que el funcionamiento de las teclas de inicio y fin es distinto en Mac y Windows. Menos mal que alguien ha pensado ya en esto y ha hecho un programita que lo soluciona, el KeyFixer:

http://www.starryhope.com/tech/apple/2006/keyfixer/

Parece que no funciona en todos los programas, pero en el Xcode sí, así que con eso solucionado, sigo programando…

[ACTUALIZACIÓN]

Vaya… parece que me calenté la cabeza más de la cuenta. Hoy he encontrado este enlace con todas las convinaciónes para hacer selecciones de linea y demás sin tener que hacer tantas historias 😛

http://www.hcs.harvard.edu/~jrus/Site/system-bindings.html

Malditos roedores…

[Escrito el 11/05/2009]

He sido usuario de PC desde mi primer 386, y ya con MS-DOS y Windows 3.11 aprendí a manejar un ratón. He dado su funcionamiento por asumido desde entonces, configurando únicamente su velocidad, ya que me gusta poder desplazarme rápidamente por la pantalla y tengo buen pulso (supongo que de tanto jugar a juegos de estrategia. Por cierto, el Starcraft 2 está al caer, pero ese es otro tema… :P)

El caso es que ha sido empezar a manejar un Mac (un MacBook Pro), y sentirme terriblemente frustrado con el movimiento del ratón. Para desplazamientos rápidos, sin problemas, se mueve de una esquina a la otra de la pantalla en un momento, pero cuando intento darle a esa pequeña crucecita para cerrar una pestaña del Safari… ¡que lentitud! Parece que el cursor no va a llegar nunca…

Entiendo que este modo de funcionamiento puede ser muy útil, sobre todo a un usuario novato que tenga problemas para manejar el ratón y quiera más precisión, pero ese no es el problema, ¡NO ES CONFIGURABLE! Y lo que aun me confunde más, el Touch pad tiene casi la configuración que quiero para mi ratón. Creo que es la primera vez que estoy más a gusto usando el touch pad de un portátil, que un ratón en condiciones…

Empecé a documentarme y el panorama no era muy alentador. Casi toda la información me redirigía a el MouseFix y iMouseFix. Mismo programa, salvo que el segundo viene con una interfaz gráfica que facilita su configuración.

http://www.knockknock.org.uk/mac/

http://lavacat.com/iMouseFix/

Después de trastear un rato con ambos, la experiencia mejoraba sensiblemente, pero no, ni de lejos funcionaba como yo quería. Así que seguí buscando hasta encontrar este:

http://lavacat.com/iMouseFix/

Ahora sí. Esto es lo que buscaba. Por fin puedo recorrer la pantalla de lado a lado moviendo el ratón despacito. El problema es que es de pago, pero viene con una prueba de 30 días, así que seguiré buscando una alternativa. ¿Alguien conoce alguna?

[ACTUALIZACIÓN 11/02/2011]
Pues no ha llovido desde entonces… Al final me compré un ratón logitech. Instalé su Set-Point, y problema solucionado. Se comporta casi exactamente como un ratón de PC 🙂

A la enésima va la vencida…

O eso quiero creer… 😛

Este es, si no he predido la cuenta, el 5º blog que empiezo, y todos se han quedado por el camino por motivos similares. Los hice en blogger y wordpress, y básicamente no los sentia mios. Siempre tuve la sensación de que si me cambiaba de blog más adelante, se perdería toda la información acumulada.

Solución: buscar un hosting gratuito que me permitiera hacer copias de seguridad de la base de datos para poder exportarla más adelante.

Así que aquí estoy gracias a http://x10hosting.com/ que ofrecen un servicio muy completo, gratis, y sin publicidad! (La base de datos es un MySQL).

Gracias también a http://eggblog.net/ que es de donde he sacado este sencillo blog en PHP. Lo quería lo más sencillo posible para poder modificarlo a mi antojo, y así ampliar mis reducidos conocimientos de PHP (siempre hay que estar aprendiendo cosas nuevas!).

¿En que va a consistir este blog? Pues la verdad, de todo un poco. Mi intención sobre todo es la de publicar información útil en temas de programación e informática en general, que pueda ayudar a otras personas con las mismas dudas. Pero seguro que también acabaré hablando de temas que me interesen, como los videojuegos, literatura, anime y Japón.

Así que nada, ya corto el rollo. Lo primero será rescatar los posts que tengo el el otro blog de WordPress, que me da lastima perderlos 😛

Un saludo, y bienvenidos!