<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nunca te acostarás...</title>
	<atom:link href="http://www.javray.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.javray.com</link>
	<description>Refurbished Minds</description>
	<lastBuildDate>Tue, 29 Nov 2011 20:31:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Prevenir el bloqueo de la UI</title>
		<link>http://www.javray.com/index.php/2011/11/29/prevenir-el-bloqueo-de-la-ui/</link>
		<comments>http://www.javray.com/index.php/2011/11/29/prevenir-el-bloqueo-de-la-ui/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 20:31:27 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=565</guid>
		<description><![CDATA[Con el auge de las llamadas asíncronas a través de peticiones AJAX me he acostumbrado a que todas las operaciones con javascript no bloqueen la interfaz gráfica de usuario y que cuando los datos estén listos ésta se actualice sin &#8230; <a href="http://www.javray.com/index.php/2011/11/29/prevenir-el-bloqueo-de-la-ui/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Con el auge de las llamadas asíncronas a través de peticiones AJAX me he acostumbrado a que todas las operaciones con javascript no bloqueen la interfaz gráfica de usuario y que cuando los datos estén listos ésta se actualice sin que el usuario se vea perjudicado por la obtención y procesado de los datos.</p>
<p>Pero claro, ¿qué pasa si los datos ya los tenemos cacheados y tenemos que procesarlos? Lo que ocurre por lo general es que se nos bloquea la interfaz de usuario y mientras se procesan el navegador o el dispositivo móvil se queda sin responder.</p>
<p>Una solución sencilla a este problema es provocar una llamada asincrona de la función que procesa los datos. Para ello podemos utilizar la función de <em>setTimeout</em> de javascript de la siguiente manera:</p>
<pre name="code" class="js">
setTimeout(function() {
    procesadoDeDatos();
}, 100);
</pre>
<p>Con esto conseguimos que la ejecución de la función <em>procesadoDeDatos</em> se haga de manera asincrona y no se bloquee la interfaz esperan a que acabe el procesado.</p>
<p>Así podemos poner el típico mensaje de procesando, para que el usuario sepa que se está procesando su petición y éste a su vez si quiere puede seguir interactuando con la interfaz mientras espera que se le devuelvan los datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2011/11/29/prevenir-el-bloqueo-de-la-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cache de imágenes</title>
		<link>http://www.javray.com/index.php/2011/11/24/cache-de-imagenes/</link>
		<comments>http://www.javray.com/index.php/2011/11/24/cache-de-imagenes/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 20:52:32 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=538</guid>
		<description><![CDATA[Sigo con el desarrollo de mi aplicación para iPad y el siguiente muro con el que me he topado ha sido el tema de cachear las imágenes. Mi aplicación accede a muchas imágenes que están en Internet y por tanto &#8230; <a href="http://www.javray.com/index.php/2011/11/24/cache-de-imagenes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sigo con el desarrollo de mi aplicación para iPad y el siguiente muro con el que me he topado ha sido el tema de cachear las imágenes. Mi aplicación accede a muchas imágenes que están en Internet y por tanto el consumo de ancho de banda es considerable. Lo que quería es que una vez que se accediera a la imagen, está se almacenara en cache y no se tuviera que volver a pedir.</p>
<p>Después de mucha investigación y muchas pruebas, he dado con dos soluciones: una para cuando el número de imágenes a almacenar no es muy grande (este no es mi caso) y otra que de momento promete guardar todas la imágenes que quiera.</p>
<p><strong>LocalStorage, Web DB SQL y Canvas</strong></p>
<p>La primera solución consiste en utilizar una combinación de localStorage y Web DB SQL para almacenar las imágenes y Canvas para obtener la versión base64 de la misma.</p>
<p>Lo primero que necesitamos por tanto es una función a la que le pasamos una URL de una imagen y nos devuelve una representación en base64 de la misma:</p>
<pre name="code" class="js">
function getImgBase64(imagen, callback) {
    var img = document.createElement('img'),
        canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d');
    img.src = imagen;

    img.addEventListener('load', function() {
        canvas.width = this.width;
        canvas.height = this.height;
        ctx.drawImage(this, 0, 0);
        callback(canvas.toDataURL('image'));
    }, false);
}
</pre>
<p>Ahora que tenemos la representación de la imagen en base64 necesitamos almacenarla de manera persistente, para ello tenemos localStorage y Web DB SQL. Toca enfrentarse a los límites de tamaño, localStorage permite almacenar 5M y Web DB SQL permite 50M que los puedes repartir en unos 10 BBDD de 5M sin tener que preguntar al usuario si quiere permitir crear una BBDD de tamaño mayor. Cuando estos límites se alcanzan se deja de guardar información.</p>
<p>Si tenemos claro que las imágenes que queremos guardar van a ocupar menos de 5M usaremos localStorage, si es mayor que 5M e inferior a 50M usaremos una combinación de ambas, para minimizar el acceso al Web DB SQL ya que a parte de ser asincrono tiene un retardo, menor que si accediéramos a Internet, pero un retardo que puede quitar fluidez a la aplicación.</p>
<p>La función que almacena en el localStorage sería la siguiente:</p>
<pre name="code" class="js">
function setImg(ref, img) {
    getImgBase64(img, function(base64) {
        var imagenes = localStorage.imagenes &#038;&#038; JSON.parse(localStorage.imagenes) || [];
        imagenes[ref] = base64;
        localStorage.imagenes = JSON.stringify(imagenes);
    });
}
</pre>
<p>Para obtener la imagen del localStorage:</p>
<pre name="code" class="js">
function getImg(ref) {
     var imagenes = localStorage.imagenes &#038;&#038; JSON.parse(localStorage.imagenes) || [];
     return imagenes[ref] || '';
}
</pre>
<p>La función completa que se encarga de hacer una pre-carga de las imágenes quedaría de la siguiente manera:</p>
<pre name="code" class="js">
function preLoadImg(ref, img) {
   var imagen = new Image(),
       data = getImg(ref);

   imagen.addEventListener('load', function() {
        // Acciones una vez que tenemos cargada la imagen.
   }, false);

   if (data === '') {
      imagen.src = img;
      setImg(ref, img);
   }
   else {
      imagen.src = data;
   }
}
</pre>
<p>Para la versión mixta entre localStorage y Web DB SQL, lo que vamos a hacer es almacenar las referencias y estado en localStorage y la imagen codificada en base64 en el Web DB SQL.</p>
<p>Primero vamos a definir qué es lo que guardamos en el localStorage: las referencias a las imágenes que tenemos guardas en Web DB SQL y el número y el tamaño que llevamos en la BBDD actual.</p>
<p>Al empezar, las referencias serán un array vacío y el número y el tamaño serán 0.</p>
<p>Para inicializar la variables y crear la BBDD haremos una función de inicialización:</p>
<pre name="code" class="js">

var DB = [];

function init() {
    var referencias = localStorage.referencias &#038;&#038; JSON.parse(localStorage.referencias) || [],
        actual = localStorage.actual &#038;&#038; JSON.parse(localStorage.actual) || {n: 0, t:0},
        DBI;

    for (var i = 0; i <= actual.n; i+=1) {
         DBI = openDatabase('Imagenes_' + i, '1.0', 'Imagenes ' + i, 4.9 * 1024 * 1024);
         DBI.transaction(function(t) {
                t.executeSql('CREATE TABLE IF NOT EXISTS Imagenes(ref TEXT NOT NULL, img TEXT NOT NULL, PRIMARY KEY(ref))', []);
            });

         DB.push(DBI);
    }

}
</pre>
<p>En la función de inicialización, la primera vez que se inicia se crea la BBDD Imagenes_0 y las demás veces se abren las BBDD que llevemos usadas hasta el momento.</p>
<p>La función que guarda una imagen en BBDD es algo más complicada que su versión únicamente con localStorage ya que tenemos que tener en cuenta el tamaño que llevamos en la BBDD actual y la creación de una nueva BBDD en caso de que sea necesario.</p>
<p>Como podemos ver defino una variable global DB donde voy a ir almacenando las conexiones a las distintas BBDD.</p>
<pre name="code" class="js">
function setImgDB(ref, img) {
    getImgBase64(img, function(base64) {
        var actual = localStorage.actual &#038;&#038; JSON.parse(localStorage.actual) || {n: 0; t: 0},
            referencias = localStorage.referencias &#038;&#038; JSON.parse(localStorage.referencias) || [];

        if (actual.t >= 1810000) {

            actual.n += 1;
            actual.t = base64.length;

            referencias[ref] = actual.n;

            localStorage.actual = JSON.stringify(actual);
            localStorage.referencias = JSON.stringify(refrencias);

            DBI = openDatabase('Imagenes_' + actual.n , '1.0', 'Imagenes ' + actual.n, 4.9 * 1024 * 1024);
            DBI.transaction(function(t) {
                    t.executeSql('CREATE TABLE IF NOT EXISTS Imagenes(ref TEXT NOT NULL, img TEXT NOT NULL, PRIMARY KEY(ref))', [], function(t, r) {
                            t.executeSql('REPLACE INTO Imagenes(ref, img) VALUES(?, ?)', [ref, base64], function(t, r) {
                                console.log('Insertamos la imagen: ' + ref + ' en BBDD ' + actual.n);
                            });
                    });
                });

            DB.push(DBI);
        }
        else {

            actual.t += base64.length;

            referencias[ref] = actual.n;

            localStorage.actual = JSON.stringify(actual);
            localStorage.referencias = JSON.stringify(refrencias);

            DB[actual.n].transaction(function(t) {
                    t.executeSql('REPLACE INTO Imagenes(ref, img) VALUES(?, ?)', [ref, base64], function(t, r) {
                        console.log('Insertamos la imagen: ' + ref + ' en BBDD ' + actual.n);
                    });
                });

        }
    });
}
</pre>
<p>El número 1810000 es el tamaño máximo aproximado de imágenes que se pueden almacenar, es un tamaño totalmente empirico y que se podría afinar un poco más.</p>
<p>Ahora necesitamos la función para obtener una imagen de la BBDD:</p>
<pre name="code" class="js">
function getImgDB(ref, callback) {
     var referencias = localStorage.referencias &#038;&#038; JSON.parse(localStorage.referencias) || [],
         n = referencias[ref] || -1;

     if (n !== -1) {
         DB[n].transaction(function(t) {
                    t.executeSql('SELECT img FROM Imagenes WHERE ref = ?', [ref], function(t, r) {
                        if (r.rows.length > 0) {
                            callback(r.rows.item(0).img);
                        }
                        else {
                           callback('');
                        }
                    });
                });
     }
     else {
         callback('');
     }
}
</pre>
<p>Y ahora la función de pre-carga de imágenes:</p>
<pre name="code" class="js">
function preLoadImg(ref, img) {
   var imagen = new Image();

   getImgDB(ref, function(data) {
       if (data === '') {
           imagen.src = img;
           setImgDB(ref, img);
       }
       else {
          imagen.src = data;
       }
    });

   imagen.addEventListener('load', function() {
        // Acciones una vez que tenemos cargada la imagen.
   }, false);
}
</pre>
<p>Como he dicho antes, estás dos soluciones son para un número pequeño y controlado de imágenes. </p>
<p>En el siguiente apartado veremos cómo hacerlo cuando no sabemos el número de imágenes a cachear.</p>
<p><strong>API de Phonegap</strong></p>
<p>En está solución necesitamos acceder al dispositivo, por lo tanto necesitamos una API que nos proporcione acceso al mismo, en este caso yo he escogido Phonegap. A parte de la API de Phonegap, necesitamos un Plugin que nos permite descargar ficheros a nuestro dispositivo.</p>
<p>No voy a meterme en cómo se instala el Phonegap ni el plugin, voy a suponer que ya está todo hecho y vamos directamente al código.</p>
<p>Primero una función de inicialización, necesaria para usar las API's de Phonegap</p>
<pre name="code" class="js">

var fileSystem = {};

function init() {
    document.addEventListener("deviceready", function() {
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) {
            fileSystem = fs;
        },
        function() {
            console.log('Error de inicialización');
        });
    }, false);
}
</pre>
<p>Ahora la función para almacenar una imagen en el dispositivo:</p>
<pre name="code" class="js">
function setImgFile(ref, img) {
    var ext = img.split('.')[3],
        fullPath = fileSystem.root.fullPath + '/',
        prev = 'file://' + fullPath + ref + '.' + ext,
        image = new Image();

   image.addEventListener('error', function() {
       var downloader = new Downloader();

        downloader.downloadFile(
            img,
            fullPath,
            ref + '.' + ext,
            function(file) {
                console.log(file);
            },
            function() {
                console.log('Error al subir la imagen');
        });
   }, false);

   image.src = prev;
}
</pre>
<p>Para la función anterior, suponemos que la imagen está ya en nuestro dispositivo, y por tanto le asignamos el path que suponemos que tiene, en caso de error es cuando nos la bajamos al dispositivo, con esto hacemos que sea más rápida la búsqueda de una imagen y no tenemos que acceder al sistema de archivos que es mucho más lento.</p>
<p>Con esta solución no nos hace falta una función para obtener la imagen ya que las imagenes se guardan en el dispositivo en una ubicación conocida, por tanto vamos con la función de pre-carga de imagenes que usará el mismo principio de suponer que la imagen ya está en nuestro dispositivo antes de pedirla a Internet.</p>
<pre name="code" class="js">
function preLoadImg(ref, img) {
    var ext = img.split('.')[3],
        fullPath = fileSystem.root.fullPath + '/',
        prev = 'file://' + fullPath + ref + '.' + ext,
        image = new Image();

    image.addEventListener('load', function() {
        // Acciones una vez que tenemos cargada la imagen.
    }, false);

   image.addEventListener('error', function() {
       this.src = img;
   }, false);

   image.src = prev;
}
</pre>
<p><strong>Conclusión</strong></p>
<p>Está claro que cuanto menos ancho de banda consuma una aplicación y cuanto más rápida sea en mostrar el contenido al usuario, éste se va a sentir más satisfecho y valorará mejor nuestra aplicación, por tanto debemos de ser cautos a la hora de cachear de manera que no se vea afectado el rendimiento de la aplicación por el acceso y la actualización de la misma.</p>
<p>Quiero destacar que las dos primeras soluciones son perfectamente válidas para una aplicación WEB, la segunda al depender del dispositivo solo servirá para dispositivos móviles, en este caso iPad y iPhone. </p>
<p><strong>Referencias</strong></p>
<p><a href="http://stackoverflow.com/questions/934012/get-image-data-in-javascript" target="_blank">http://stackoverflow.com/questions/934012/get-image-data-in-javascript</a><br />
<a href="http://docs.phonegap.com/en/1.2.0/phonegap_file_file.md.html#File" target="_blank">http://docs.phonegap.com/en/1.2.0/phonegap_file_file.md.html#File</a><br />
<a href="https://github.com/aflx/pg_downloader_plugin_ios" target="_blank">https://github.com/aflx/pg_downloader_plugin_ios</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2011/11/24/cache-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zepto vs jQuery</title>
		<link>http://www.javray.com/index.php/2011/10/07/zepto-vs-jquery/</link>
		<comments>http://www.javray.com/index.php/2011/10/07/zepto-vs-jquery/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 13:42:01 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=533</guid>
		<description><![CDATA[Estoy inmerso en el desarrollo de una aplicación web para iPad, como el tema de los recursos que se consumen es muy importante en este dispositivo, estoy intentando optimizar al máximo y por tanto decidí utilizar una framework de javascript &#8230; <a href="http://www.javray.com/index.php/2011/10/07/zepto-vs-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estoy inmerso en el desarrollo de una aplicación web para iPad, como el tema de los recursos que se consumen es muy importante en este dispositivo, estoy intentando optimizar al máximo y por tanto decidí utilizar una framework de javascript ligero: <a title="Zepto" href="http://zeptojs.com/" target="_blank">Zepto</a>.</p>
<p>Al principio todo iba de maravilla, el framework apenas pesa 5K y te ofrece la mayor parte de la funcionalidad de jQuery, framework al que estoy acostumbrado a usar.</p>
<p>Al terminar la primera iteración del desarrollo me pongo a hacer pruebas de rendimiento y compruebo que tarda muchísimo en hacer una llamada AJAX para obtener un JSON con datos para pintar la interfaz.</p>
<p>Al principio pienso que es mi código y que necesita más optimizaciones, reduzco al máximo el código y aún así veo un retraso de unos 7 u 8 segundos en el proceso de la petición.</p>
<p>Tengo que decir que antes de decantarme por Zepto hice una primera versión usando jQuery y el problema lo tenía en el renderizado de la interfaz y no en la llamada AJAX. Así que vuelvo a poner jQuery como framework de la aplicación y como la sintaxis entre ambos frameworks es compatible, veo que sí es cierto que realiza más acciones, que probablemente podré optimizar más adelante, lo que es la llamada AJAX se hace de manera fluida y sin el retardo de 7 segundos.</p>
<p>Analizado el código de ambos frameworks veo que en Zepto se hace un eval cuando el resultado es de una llamada AJAX es un JSON y por tanto es ahí donde se pierde el tiempo y hace que la aplicación se quede momentaneamente congelada.</p>
<p>La moraleja de esta historia es que aunque un framework pese poco y esté especificamente diseñado para un tipo de navegadores, en este caso Webkit, no tiene por qué ser más eficiente a la hora de realizar ciertas acciones y por tanto a la hora de elegirlo habrá que ver que tipo de llamadas hay que hacer y si nos merece la pena usarlo o no.</p>
<p>En defensa de Zepto puedo decir que está en fase beta y que me imagino que irán mejorando con el tiempo, pero por ahora, para una aplicación como la mía que requiere de procesado de JSON en las llamadas AJAX no es válida y tendré que seguir usando jQuery aunque sea más pesada y no sea especifica para Webkit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2011/10/07/zepto-vs-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Admob y SL4A</title>
		<link>http://www.javray.com/index.php/2011/10/07/admob-y-sl4a/</link>
		<comments>http://www.javray.com/index.php/2011/10/07/admob-y-sl4a/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 13:00:23 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=520</guid>
		<description><![CDATA[Durante un tiempo he estado desarrollando una app para Android usando SL4A y Python. Una vez desarrollada quería probar el tema de meter publicidad a la misma usando Admob. Con SL4A uso HTML como interfaz gráfica de la aplicación y &#8230; <a href="http://www.javray.com/index.php/2011/10/07/admob-y-sl4a/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Durante un tiempo he estado desarrollando una app para Android usando <a title="SL4A" href="http://code.google.com/p/android-scripting/" target="_blank">SL4A</a> y Python. Una vez desarrollada quería probar el tema de meter publicidad a la misma usando <a title="Admob" href="http://es.admob.com/" target="_blank">Admob</a>.</p>
<p>Con SL4A uso HTML como interfaz gráfica de la aplicación y por tanto tengo que usar javascript para meter la publicidad, como si de una aplicación web se tratase.</p>
<p>El banner se muestra correctamente y lo puedo colocar donde quiera, el problema viene a la hora de pinchar en la publicidad, ya que al ser un webview me abre la publicidad en la propia ventana de la aplicación perdiendo toda la interfaz de la misma y quedandome sin acceso a ella.</p>
<p>Después de varías pruebas y un poco de ingeniería inversa sobre el javascript de Admob he descubierto la solución para que la publicidad se abra en una ventana del navegador y no en la interfaz de mi aplicación.</p>
<p>Primero configuramos Admob para lanzarlo nosotros de manera manual:</p>
<pre name="code" class="js">var admob_vars = {
 pubid: '2121324214214', // publisher id
 bgcolor: '000000', // background color (hex)
 text: 'FFFFFF', // font-color (hex)
 manual_mode: true,
 test: false// test mode, set to false to receive live ads
};</pre>
<p>Después pedimos la publicidad:</p>
<pre name="code" class="js">var ad = _admob.fetchAd(document.getElementById('admob_ad'));</pre>
<p>Y por último redefinimos la función gotourl:</p>
<pre name="code" class="js">_admob.gotourl = function() {
    var droid = new Android();
    droid.view(arguments[0]);
};</pre>
<p>Con el código anterior conseguimos que la acción por defecto a la hora de pinchar en el banner sea la de abrir la URL con el navegador y no la de cargar la URL en la página actual, que en nuestro caso es la interfaz gráfica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2011/10/07/admob-y-sl4a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2008</title>
		<link>http://www.javray.com/index.php/2008/12/31/2008/</link>
		<comments>http://www.javray.com/index.php/2008/12/31/2008/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 19:14:48 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=517</guid>
		<description><![CDATA[Al igual que Badcrc, voy a hacer una listas de las cosas que he hecho en 2008, fijo que se me olvida alguna: Comprarme casa Montar una wiiparty en mi nueva casa Primera Gipuzkoa Encounter Tercera Euskal Encounter Leer 11 &#8230; <a href="http://www.javray.com/index.php/2008/12/31/2008/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Al igual que <a title="Cosas que he hecho en el 2008" href="http://electric-castle.net/archives/cosas-que-he-hecho-en-el-2008/" target="_blank">Badcrc</a>, voy a hacer una listas de las cosas que he hecho en 2008, fijo que se me olvida alguna:</p>
<ul>
<li>Comprarme casa</li>
<li>Montar una wiiparty en mi nueva casa</li>
<li>Primera Gipuzkoa Encounter</li>
<li>Tercera Euskal Encounter</li>
<li>Leer 11 libros</li>
<li>Correr en una carrera de 11,8 Km</li>
<li>Ver como mi macmini G4 se rompía y comprar un macmini Intel</li>
<li>Hacer algo más de deporte gracias a mi Wiifit.</li>
<li>Mi primer Ipod </li>
<li>Comprar dos HD externos más</li>
<li>No salir de Bilbao ni en vacaciones</li>
<li>Aumentar el número de salidas &#8220;extralaborales&#8221; con gente del curro.</li>
<li>Recibir regalos para mi casa</li>
<li>Seguir yendo todos los lunes al cine</li>
<li>Reducir gastos de donde podía.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2008/12/31/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meme: Don’t worry be happy</title>
		<link>http://www.javray.com/index.php/2008/11/06/meme-don%e2%80%99t-worry-be-happy/</link>
		<comments>http://www.javray.com/index.php/2008/11/06/meme-don%e2%80%99t-worry-be-happy/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 20:17:30 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=515</guid>
		<description><![CDATA[Seguimos con los memes, cómo no, viene de badcrc y las 6 cosas que me hacen feliz son las siguientes: Que alguien te pida ayuda y consigas ayudarle Ir al cine todas las semanas Tumbarme y ver un capítulo de &#8230; <a href="http://www.javray.com/index.php/2008/11/06/meme-don%e2%80%99t-worry-be-happy/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seguimos con los memes, cómo no, viene de <a href="http://electric-castle.net/archives/meme-don’t-worry-be-happy/">badcrc</a> y las 6 cosas que me hacen feliz son las siguientes:</p>
<ol>
<li>Que alguien te pida ayuda y consigas ayudarle</li>
<li>Ir al cine todas las semanas</li>
<li>Tumbarme y ver un capítulo de una buena serie</li>
<li>Leer un libro que me inspire</li>
<li>Tener una buena idea</li>
<li>Correr cuando estoy en forma y no me canso</li>
</ol>
<div>Joe, no sabía yo que había tantas cosas que me hacían feliz :-p</div>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2008/11/06/meme-don%e2%80%99t-worry-be-happy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nueva actualización</title>
		<link>http://www.javray.com/index.php/2008/11/05/nueva-actualizacion/</link>
		<comments>http://www.javray.com/index.php/2008/11/05/nueva-actualizacion/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 12:30:47 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.javray.com/?p=510</guid>
		<description><![CDATA[Creo que ya me tocaba actualizar el CMS del blog, ahora utilizo wordpress en vez de b2evolution, me he dejado llevar por la moda, pero la verdad es que es mucho más cómodo. He cogido un theme sencillito que como &#8230; <a href="http://www.javray.com/index.php/2008/11/05/nueva-actualizacion/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Creo que ya me tocaba actualizar el CMS del blog, ahora utilizo wordpress en vez de b2evolution, me he dejado llevar por la moda, pero la verdad es que es mucho más cómodo.</p>
<p>He cogido un theme sencillito que como siempre iré modificando poco a poco para que quede a mi gusto.</p>
<p>Para hacer la migración me he tenido que hacer un script en PHP ya que la versión del b2evolution que tenía era tan antigua que no he encontrado ningún script en Internet que me hiciera el trabajo, ha sido bastante sencillo ya que solo he tenido que hacer un par de selects.</p>
<p><strong>Actualización:</strong> A petición popular aquí está el script que he utilizado <a href="http://www.javray.com/wp-content/uploads/2008/11/impphp.txt">impphp</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2008/11/05/nueva-actualizacion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Meme: ¿Crisis? Que no cunda el pánico</title>
		<link>http://www.javray.com/index.php/2008/10/28/meme-%c2%bfcrisis-que-no-cunda-el-panico/</link>
		<comments>http://www.javray.com/index.php/2008/10/28/meme-%c2%bfcrisis-que-no-cunda-el-panico/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 12:03:54 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www2.javray.com/?p=507</guid>
		<description><![CDATA[Yo al igual que badcrc también tenía dinero ahorrado por lo que la crisis me está afectando menos, lo único que noto es como a final de mes me gasto más de lo que gano pero es por la puñetera hipoteca. Por &#8230; <a href="http://www.javray.com/index.php/2008/10/28/meme-%c2%bfcrisis-que-no-cunda-el-panico/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yo al igual que <a href="http://electric-castle.net/archives/meme-¿crisis-que-no-cunda-el-panico/" target="_self">badcrc</a> también tenía dinero ahorrado por lo que la crisis me está afectando menos, lo único que noto es como a final de mes me gasto más de lo que gano pero es por la puñetera hipoteca.</p>
<p>Por lo demás no soy de gastar nada entre semana, de hecho suelo ir con la cartera vacía, si no tienes, no te entrará la tentación de gastar y si hay una emergencia siempre está MasterCard.</p>
<p>La manera que tengo de gastar menos es apuntar todo lo que gasto de manera que lo pueda ver y si he hecho una compra imprudente lo estaré viendo siempre que abra la hoja de gastos, también hace que te de pereza apuntarlo y por lo tanto no lo gastas.</p>
<p>En cuanto a la ropa, solo me compro cuando tengo necesidad y de momento no la tengo. Cuando me quiero comprar algún capricho busco el más barato, por ejemplo, hace poco se me antojó un pulsometro para medir las pulsaciones cuando salgo a correr y vi que eran un poco caros, entre 100 y 200 euros, así  que me fui a Decathlon y me compre uno de oferta por 19,90 euros.</p>
<p>En cuanto al ocio, las Euskal dan mucho de si y todavíaa tengo material sin visionar desde hace dos, por lo que para las tardes aburridas ya tengo entretenimiento gratis. Cuando salgo los fines de semana procuro ir a sitios donde no cobren entrada y como mucho dos consumiciones, más no.</p>
<p>Y lo de independizarse que comenta badcrc, me da que todavíaa no, hay que esperar a no gastar más de lo que gano para poder hacerlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2008/10/28/meme-%c2%bfcrisis-que-no-cunda-el-panico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Odisea en IKEA</title>
		<link>http://www.javray.com/index.php/2008/08/13/odisea-en-ikea/</link>
		<comments>http://www.javray.com/index.php/2008/08/13/odisea-en-ikea/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:34:24 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Hace una semana compre un armario para el salón de mi casa, pero como todavía me quedaba pintar el pasillo, la deje empaquetado en una habitación. Hoy he ido con mi padre a montarla y al desembalar el primer bulto &#8230; <a href="http://www.javray.com/index.php/2008/08/13/odisea-en-ikea/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace una semana compre un armario para el salón de mi casa, pero como todavía me quedaba pintar el pasillo, la deje empaquetado en una habitación.</p>
<p>Hoy he ido con mi padre a montarla y al desembalar el primer bulto hemos visto que una de las puertas del mueble tenían un rayón. Como eran dos bultos no sabíamos si había que llevar los dos, que pesan como dos muertos, o solo el que estaba mal, así que he decido llamar al servicio de atención al cliente para preguntar. Por supuesto era un 902 y después de estar 8 minutos con música en espera, he decidido que me salía más barato el combustible para ir de nuevo al IKEA que la llamada al 902.</p>
<p>Cuando he llegado al IKEA he tenido que esperar la cola para cambios y devoluciones y cuando me a tocado el turno me lo han cambiado por uno nuevo, es decir, dos nuevos bultos que volvían a pesar como dos muertos, y me los he llevado a casa.</p>
<p>Como no nos fiábamos de que no estuviese rayado, hemos decido abrir de nuevo los bultos al llegar a casa, ya que montar ya no nos iba a dar tiempo. Y cual ha sido nuestra sorpresa al ver que nos han dado dos bultos exactamente iguales, como ya teníamos desembalado y comprobado uno de ellos, hemos decidido llevar solo el bulto que estaba repetido, para ahorrar esfuerzos.</p>
<p>Al llegar al IKEA e ir a la zona donde sale la mercancía para decirles que se había equivocado, la chica muy &#8220;atenta&#8221; nos ha dicho que estaba segurísima de que nos había dado bien los bultos, a lo cual le he respondido yo, que si eso era cierto, para qué quiero yo dos partes iguales del mismo mueble. Aún así me ha dicho que tengo que ponerme a la cola de nuevo en las devoluciones ya que como el bulto está abierto no lo puede meter en el almacén.</p>
<p>Me pongo otra vez a la cola, y cuando por fin me toca, me dice la otra señorita que no hay ningún problema y que ella misma me lo cambia y me saca el bulto que me falta.</p>
<p>Cuando me lo saca, me saca una caja que está golpeada, la miro un poco extrañado y me dice, uy tiene un golpe, se agacha y comprueba que es golpe ha dañado la mercancía y me comenta que me saca otra nueva. Al rato vuelve a salir con otro bulto, el cual tiene también un golpe en otro sito, me  vuelvo a quedar con cara de tonto y me dice que no hay ningún problema que solo tiene golpeada la protección de la mercancía y que el genero está bien. Como ya estoy hasta las narices compruebo yo mismo lo que dice y que el contenido está bien y me lo llevo para casa.</p>
<p>Cuando llego abro todo y veo que esta vez está todo, mañana tocará el montaje lo cual puede ser otra odisea, pero espero que sin menos viajecitos.</p>
<p>La verdad es que no quiero dejar mal a IKEA, pero la forma en la que está embalado el mueble que he comprado yo hace que al más mínimo golpe este se raye y llegue al cliente en pésimas condiciones como me ha pasado a mi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2008/08/13/odisea-en-ikea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Renovaciones</title>
		<link>http://www.javray.com/index.php/2008/07/12/renovaciones/</link>
		<comments>http://www.javray.com/index.php/2008/07/12/renovaciones/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 11:47:09 +0000</pubDate>
		<dc:creator>javray</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Por estas fechas y como todos los años toca renovar el dominio, esta operación la realicé ayer, y hoy mirando lo que me había costado y tiendo en mente que los dominios se pueden renovar para más de un año, &#8230; <a href="http://www.javray.com/index.php/2008/07/12/renovaciones/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Por estas fechas y como todos los años toca renovar el dominio, esta operación la realicé ayer, y hoy mirando lo que me había costado y tiendo en mente que los dominios se pueden renovar para más de un año, he visto la siguiente evolución de precios:</p>
<ul>
<li>2006: 6,96 €</li>
<li>2007: 6,51 €</li>
<li>2008: 5,92 €</li>
</ul>
<p>No se si es por la crisis o es que la tendencia es a que cada vez valgan menos, pero mi consejo es que si tienes un dominio, es mejor pagarlo año a año que renovarlo durante un periodo muy largo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javray.com/index.php/2008/07/12/renovaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

