<?xml version="1.0" encoding="UTF-8"?>
<rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Usuario de Internet</title>
	
	<link>http://www.usuariodeinternet.es</link>
	<description>Experiencias técnicas y lúdicas</description>
	<lastBuildDate>Wed, 25 Apr 2012 23:31:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feed.usuariodeinternet.es/usuariodeinternet" /><feedburner:info uri="usuariodeinternet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Script Caza Unfollowers de Twitter</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/1sA452r5ybg/twitter-unfollowers</link>
		<comments>http://www.usuariodeinternet.es/desarrollo/twitter-unfollowers#comments</comments>
		<pubDate>Wed, 16 Mar 2011 09:00:30 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=831</guid>
		<description><![CDATA[Las reacciones ante un unfollow en Twitter suelen ser diversas, desde la acción recíproca inmediata (cosa que no logro entender ¿has dejado de ver el telediario porque el presentador no se dirija a ti en persona? pues eso&#8230;) hasta la más absoluta indeferencia. A mi más bien me mueve la curiosidad, saber si ha sido [...]]]></description>
			<content:encoded><![CDATA[<p>Las reacciones ante un unfollow en Twitter suelen ser diversas, desde la acción recíproca inmediata (cosa que no logro entender ¿has dejado de ver el telediario porque el presentador no se dirija a ti en persona? pues eso&#8230;) hasta la más absoluta indeferencia. A mi más bien me mueve la curiosidad, saber si ha sido la posible reacción ante un tuit concreto, el perfil de la persona que deja de seguirme, etc&#8230;</p>
<p>Aquí os traigo un pequeño script que he hecho para enterarme de esto. Sé que hay por ahi muchos servicios que hacen lo mismo, los he probado y todos me han parecido una chusta, publicidad, desfase en la notificación y en general nada que cumpla bien algo tan simple como esto. Por eso he acabado tirando unas líneas de código para tenerlo en mi propio servidor y hacer exáctamente lo que espero, que es muy sencillo: <strong>recibir un email cada vez que alguien deje de seguirme en Twitter</strong>. A continuación explico algunos detalles de esta mini aplicación que podéis descargar desde <a href="https://github.com/ferjgar/twitter-unfollowers">github</a>.</p>
<p style="text-align: center;"><img src="http://www.usuariodeinternet.es/img/post/twitter-unfollowers.jpg" alt="Esos que te hacen unfollow en Twitter..." /></p>
<p><span id="more-831"></span><br />
Lo primero aclarar que obviamente no es una aplicación de uso general, por las siguientes peculiaridades:</p>
<ul style="margin-left: 30px;">
<li>Aunque fácilmente modificable, hace únicamente lo que yo necesito, explicado al principio</li>
<li>Está limitada a 5000 followers (por defecto el límite de la API de Twitter si no se utiliza paginación), cuando sobrepase esa cifra ya lo modificaré ;)</li>
<li>Utiliza un fichero para almacenar los followers y arrays para comparar, lo cual con un número elevado de ellos no sé cómo rendirá</li>
</ul>
<p>Al turronaco. El único requerimiento es la extensión <strong>curl</strong> de PHP, que se utiliza para llamar a las APIs de Twitter. La gestión de errores es como un martillo, si no hay curl o alguna API devuelve un error el script termina, no necesito nada más sofisticado.</p>
<p>La única personalización necesaria está en el fichero <span class="codigo">twitter_unfollowers.php</span>, para los campos del email que recibiremos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// fichero donde se guardan los followers para posteriormente compararlos con los actuales</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'FIC_GUARDADO'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'twitter_followers_{USUARIO}.db'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// poner a 0 si no quieres recibir un email con la lista de unfollowers</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ENVIAR_EMAIL'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'EMAIL_DIRECCION'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'xxxx@yyyy.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'EMAIL_ASUNTO'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'[TWITTER] Te ha(n) desfollogüeado {NUM} usuario(s)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// dirección válida en el servidor donde se ejecuta el script para que el email no se vaya al spam</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'EMAIL_REMITENTE'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'iiii@jjjj.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Podemos utilizar esta clase en un simple script que se pondría en el <a href="http://es.wikipedia.org/wiki/Cron_%28Unix%29">cron</a>, como por ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'twitter_unfollowers.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$tuiter</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Twitter_unfollowers<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;id_usuario_twitter&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$tuiter</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">check_unfollow</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'fin'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<div class="descarga">
<a href="https://github.com/ferjgar/twitter-unfollowers">descargar en <strong>github</strong></a></p>
<p>Twitter Unfollowers [v1.2]</p>
</div>
<p class="relacionados">Changelog</p>
<blockquote><p>v1.0 &#8211; Desarrollo inicial<br />
v1.1 &#8211; Eliminada la necesidad de autenticarse con OAuth para utilizar las APIs<br />
v1.2 &#8211; Arreglados problemas de codificación y control de errores de la API</p></blockquote>
<img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/1sA452r5ybg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/desarrollo/twitter-unfollowers/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/desarrollo/twitter-unfollowers</feedburner:origLink></item>
		<item>
		<title>Conflicto de herencia en htaccess entre Rewrite y Auth</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/ZqAnGE7b6yk/conflicto-de-herencia-en-htaccess-entre-rewrite-y-auth</link>
		<comments>http://www.usuariodeinternet.es/desarrollo/conflicto-de-herencia-en-htaccess-entre-rewrite-y-auth#comments</comments>
		<pubDate>Thu, 23 Sep 2010 10:26:01 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=774</guid>
		<description><![CDATA[Atención al titulo, soy un hacha jugando con keywords para atraer a todo tipo de audiencia al blog&#8230; y no, no se ha muerto Apache y los módulos se pelean por la pasta&#8230; en fin, al turrón. Pongamos que tenemos una web http://www.pepe.com, que en el servidor corresponde al path /home/web/pepe, y un subdirectorio http://www.pepe.com/admin, [...]]]></description>
			<content:encoded><![CDATA[<p>Atención al titulo, soy un hacha jugando con keywords para atraer a todo tipo de audiencia al blog&#8230; y no, no se ha muerto Apache y los módulos se pelean por la pasta&#8230; en fin, al turrón. Pongamos que tenemos una web http://www.pepe.com, que en el servidor corresponde al path <em>/home/web/pepe</em>, y un subdirectorio http://www.pepe.com/admin, cuya ruta es <em>/home/web/pepe/admin</em>.</p>
<p>En mi caso concreto pepe.com es un dominio antiguo, y quiero que toda referencia a él acabe en el nuevo, digamos paco.com. Para ello utilizo un htaccess que hace una redirección 301 a lo bruto:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;"># colocado en /home/web/pepe/.htaccess</span>
<span style="color: #00007f;">Options</span> +<span style="color: #0000ff;">FollowSymlinks</span>
<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
<span style="color: #00007f;">RewriteRule</span> ^(.*)$ http://www.paco.com [R=<span style="color: #ff0000;">301</span>,L]</pre></div></div>

<p>Éste es mi problema concreto, pero por ejemplo es también muy común en frameworks y CMS hacer una redirección general de todas las peticiones a un único fichero. Vamos, que aquí lo importante es la <strong>reescritura general</strong>.</p>
<p>Ahora lo que quiero es <strong>proteger con contraseña</strong> el acceso a mi administración, por lo que utilizo otro htaccess con el contenido estándar para ésto:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;"># colocado en /home/web/pepe/admin/.htaccess</span>
<span style="color: #00007f;">AuthType</span> Basic
<span style="color: #00007f;">AuthUserFile</span> /home/web/pepe/admin/.htpasswd
<span style="color: #00007f;">AuthName</span> <span style="color: #7f007f;">&quot;Acceso Administrador&quot;</span>
<span style="color: #00007f;">Require</span> valid-<span style="color: #00007f;">user</span></pre></div></div>

<p>Y como no podía ser de otra forma el invento no funciona. Cuando intento acceder a http://www.pepe.com/admin me redirige a http://www.paco.com, luego el primer cambio es meter una excepción para que no aplique la regla de reescritura para la URL que nos interesa. Lo podemos hacer en el htaccess principal con una condición:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;"># colocado en /home/web/pepe/.htaccess</span>
<span style="color: #00007f;">Options</span> +<span style="color: #0000ff;">FollowSymlinks</span>
<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
<span style="display:block;background-color: #ffc;"><span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} !^/admin/?</span><span style="color: #00007f;">RewriteRule</span> ^(.*)$ http://www.paco.com [R=<span style="color: #ff0000;">301</span>,L]</pre></div></div>

<p>O si no necesitamos de ninguna reescritura en el directorio hijo podemos directamente desactivar el engine:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;"># colocado en /home/web/pepe/admin/.htaccess</span>
<span style="display:block;background-color: #ffc;"><span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">off</span></span><span style="color: #00007f;">AuthType</span> Basic
<span style="color: #00007f;">AuthUserFile</span> /home/web/pepe/admin/.htpasswd
<span style="color: #00007f;">AuthName</span> <span style="color: #7f007f;">&quot;Acceso Administrador&quot;</span>
<span style="color: #00007f;">Require</span> valid-<span style="color: #00007f;">user</span></pre></div></div>

<p>Cojonudo, pero sigue haciendo la redirección. <u>Primera comida de cabeza importante</u>: comento todas las reglas de reescritura y sigue redirigiendo ¿? resulta que <strong>Firefox cachea las redirecciones</strong> (al menos las 301), así que ya puedes darle a F5 y estar correctas las reglas, que no te enterarás si no borras la caché del navegador, eso o utilizar Explorer (no lo he probado en el resto).</p>
<p>Descartado el navegador, ésto sigue sin rular. Utilizando el imprescindible <a href="https://addons.mozilla.org/es-ES/firefox/addon/6647/">HttpFox</a> y Google descubro que la autenticación básica de Apache que queremos usar manda una cabecera <strong>401 Unauthorized</strong>, que el navegador recibe y es cuando muestra el cuadro de usuario/contraseña. <u>Segunda comida de cabeza importante</u>: el servidor está buscando un mensaje de error personalizado para el 401 (en una directiva <a href="http://httpd.apache.org/docs/2.0/mod/core.html#errordocument">ErrorDocument</a>), que no encuentra y por tanto lanza, adicionalmente, un 404. Y resulta que, no me preguntes por qué, este último error pasa por la reescritura general y es lo que está provocando la redirección. Acojonante. La solución es definir dicho ErrorDocument en nuestro htaccess:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;"># colocado en /home/web/pepe/.htaccess</span>
<span style="color: #00007f;">Options</span> +<span style="color: #0000ff;">FollowSymlinks</span>
<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
<span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} !^/admin/?
<span style="color: #00007f;">RewriteRule</span> ^(.*)$ http://www.paco.com [R=<span style="color: #ff0000;">301</span>,L]
<span style="display:block;background-color: #ffc;"><span style="color: #00007f;">ErrorDocument</span> <span style="color: #ff0000;">401</span> <span style="color: #7f007f;">&quot;Acceso restringido&quot;</span></span></pre></div></div>

<p>¡Aparece el cuadro para meter usuario/contraseña! joder, ha costado.</p>
<img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/ZqAnGE7b6yk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/desarrollo/conflicto-de-herencia-en-htaccess-entre-rewrite-y-auth/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/desarrollo/conflicto-de-herencia-en-htaccess-entre-rewrite-y-auth</feedburner:origLink></item>
		<item>
		<title>Historias para no dormir: perder un iPhone</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/yCcylFHQhTk/historias-para-no-dormir-perder-un-iphone</link>
		<comments>http://www.usuariodeinternet.es/personal/historias-para-no-dormir-perder-un-iphone#comments</comments>
		<pubDate>Sun, 23 May 2010 11:27:52 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=737</guid>
		<description><![CDATA[No me ha pasado, pero sí: yo salgo a la calle con el iPhone en el bolsillo ACOJONADO. Antaño, cuando perdías un PC era poco menos que una hecatombe (y una especie de catarsis cuando lo asumías): fotos, música, documentos, toneladas de películas&#8230; hoy en día Internet lo ha cambiado todo, y al menos los [...]]]></description>
			<content:encoded><![CDATA[<p>No me ha pasado, pero sí: <strong>yo salgo a la calle con el iPhone en el bolsillo ACOJONADO</strong>.</p>
<p><em>Antaño</em>, cuando <em>perdías</em> un PC era poco menos que una hecatombe (y una especie de catarsis cuando lo asumías): fotos, música, documentos, toneladas de películas&#8230; hoy en día Internet lo ha cambiado todo, y al menos los hardcore users (a los que siempre asocio con el iPhone, al menos con el uso <em>intenso</em> del iPhone al que aquí me refiero) ya guardan gran parte de esa información en <strong>la nube</strong>.</p>
<p>Éste es uno de los ingredientes de la tragedia. El otro es la miniaturización del hardware y el poder llevar ahora un <strong>mini ordenador en el bolsillo</strong>, dispositivos que permiten acceder a la nube desde cualquier sitio.</p>
<p>En definitiva: cacharro + nube + pérdida/robo = <strong>El Horror</strong></p>
<p>Y para ilustrar mi pavor, una captura de la pantalla principal de mi iPhone, así que el desgraciao que lo encontrara/robara tendría acceso a:</p>
<p><img src="http://www.usuariodeinternet.es/img/post/perder-iphone.jpg" alt="Aplicaciones principales de mi iPhone" title="Aplicaciones principales de mi iPhone" style="float: left; margin-right: 10px;" /></p>
<ul>
<li><strong>Contactos</strong>: tener el número de mi madre y llamarla para burlarse de lo mandril que es su hijo es todo uno.</li>
<li><strong>Calendario</strong>: ver dónde y a qué hora tendría una cita, podría venir a robarme la cartera también.</li>
<li><strong>Fotos</strong>: ni te cuento, de hecho se me están poniendo los pelos como escarpias de pensarlo, voy a borrar algunas&#8230;</li>
<li><strong>MoneyBook</strong>: app para llevar un control de gastos personales, aquí la verdad más que nada le entraría la risa&#8230;</li>
<li><strong>Remember the milk</strong>: app para el control de tareas, lo mismo, &#8220;comprar calcetines de algodón&#8221; es algo íntimo que no debe ser compartido.</li>
<li><strong>MobileRSS</strong>: lee tus propios feeds, desgraciao!</li>
<li><strong>Tiempo</strong>: que pueda consultar el tiempo que hace en Elche desde MI telefóno no es justo.</li>
<li><strong>Twitter</strong>: aquí traspasamos la delgada línea roja: redes sociales. Empezar a seguir a Enrique Dans me parece un ejemplo bastante cruel de puteo con mi cuenta&#8230;</li>
<li><strong>Facebook</strong>: no te digo ná y te lo digo tó!</li>
<li><strong>Tumblr</strong>: aquí sí que me cabrearía, mi tumblr es ahora mismo la joya de lo corona, pff&#8230;</li>
<li><strong>LinkedIn</strong>: supongo que arruinar mi carrera profesional con un &#8220;mecagontosmisjefes&#8221; es un buen puteo.</li>
<li><strong>Evernote</strong>: aquí hay un poco de todo: facturas, apuntes, contraseñas, etc&#8230; vamos, el Dorado del desgraciao.</li>
<li><strong>Dropbox</strong>: pues lo mismo, si Evernote era el Dorado, éste es el Santo Grial.</li>
<li><strong>Mensajes</strong>: y además ordenaditos por conversación, un puto lujo oche!</li>
<li><strong>Mail</strong>: acceso directo y rápido a todas mis cuentas de email, el único límite es la imaginación!</li>
</ul>
<p>Bueno, creo que el concepto ha quedado claro. Y ésta es una página de 4 (y lo restauré hace poco&#8230;) de aplicaciones, telita!</p>
<p>Y sí, claro que tengo activo el <strong>bloqueo con código</strong>, pero sin saber ni papa de estas cosas, pondría la mano en el fuego a que hay alguna forma <em>sencilla</em> de saltarse esta protección&#8230; lo dicho, tal es el acojono que me estuve planteando pagar por una cuenta de MobileMe únicamente por el borrado a distancia, pero no, he optado por la opción gitaner: un móvil de los que darían con los cereales que no tenga ni WAP para llevar en determinadas salidas (principalmente cualquiera que implique noche). <strong>Mi iPhone es mucho iPhone</strong>.</p>
<img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/yCcylFHQhTk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/personal/historias-para-no-dormir-perder-un-iphone/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/personal/historias-para-no-dormir-perder-un-iphone</feedburner:origLink></item>
		<item>
		<title>Scroll infinito con jQuery</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/LtBER3zkkx4/scroll-infinito-con-jquery</link>
		<comments>http://www.usuariodeinternet.es/desarrollo/scroll-infinito-con-jquery#comments</comments>
		<pubDate>Mon, 12 Apr 2010 19:15:36 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[tumblr]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=674</guid>
		<description><![CDATA[También conocido como endless scrolling, endless pageless, paginación sin páginas, etc&#8230; es un patrón de interfaz de usuario del que se viene hablando desde hace unos años, aunque es últimamente cuando parece que lo veo implementado en cada vez más sitios. El ejemplo por antonomasia es por supuesto el de Google Reader, pero hay muchos [...]
Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/desarrollo/error-en-la-codificacion-con-ajax' rel='bookmark' title='Error en la codificación con AJAX'>Error en la codificación con AJAX</a></li>
<li><a href='http://www.usuariodeinternet.es/desarrollo/internacionalizacion-con-smarty' rel='bookmark' title='Internacionalización con Smarty'>Internacionalización con Smarty</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>También conocido como <em>endless scrolling</em>, <em>endless pageless</em>, <em>paginación sin páginas</em>, etc&#8230; es un <strong>patrón de interfaz de usuario</strong> del que se viene hablando desde hace unos años, aunque es últimamente cuando parece que lo veo implementado en cada vez más sitios.</p>
<p>El ejemplo por antonomasia es por supuesto el de Google Reader, pero hay muchos más: Facebook (fijaros que lo hace una vez cuando vas a mitad de página), Digg, Bing, Vimeo, Dropular&#8230;.</p>
<p>Básicamente consiste en cargar más contenido dinámicamente conforme te acercas al final de la página, de forma que la navegación por el mismo no queda interrumpida en ningún momento. Viene a ser un <strong>sustitutivo de la paginación tradicional</strong>.</p>
<p>Luego comentaré los pros y contras que pienso tiene esta técnica. Antes contar cómo lo he implementado en mi tumblr, <a href="http://micro.usuariodeinternet.es/">micro Usuario de Internet</a>, algo que llevaba bastante tiempo queriendo hacer y que sin duda opino le va como anillo al dedo.</p>
<p style="text-align:center;"><img src="/img/post/scroll_infinito.png" alt="Scroll infinito en micro.usuariodeinternet.es" /></p>
<p>Aunque en principio tenía intención de remangarme, encontré un plugin, <a href="http://plugins.jquery.com/project/de-pagify" target="_blank"><strong>de-pagify</strong></a>, que lo implementa de forma muy flexible y aprovechando parte de la <em>magia</em> de jQuery. Utilizar un framework de javascript simplifica considerablemente la codificación del método, que de otra forma sería bastante más laboriosa, sobre todo el paso de procesar el contenido para pintarlo en pantalla.</p>
<p>En la página del plugin viene todo explicado muy claramente, sólo destacar dos cosas:</p>
<ul style="margin-left:30px;">
<li>Hay 4 formas de lanzar el evento para traerse más contenido. Se configura con el párametro <strong>trigger</strong>, y puede ser cuando se llegue a un % de altura de la página, a una altura determinada (pixels), cuando se vea un determinado elemento de la página (mi elección) o incluso dependiendo de la salida de una función propia. La flexibilidad es máxima.</li>
<li>Como he comentado, utilizar jQuery ahorra mucho código, y una de las perlas que más me ha gustado es la siguiente línea:

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Format url as &quot;?page=1 div#wrapper div.post&quot;</span>
<span style="color: #003366; font-weight: bold;">var</span> url <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>next.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'href'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> options.<span style="color: #660066;">container</span><span style="color: #339933;">,</span> options.<span style="color: #660066;">filter</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">' '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>El método de ajax <a href="http://api.jquery.com/load/" target="_blank">load</a>, que es con el que nos vamos a traer el contenido de la <em>siguiente página</em> para pintarlo dinámicamente, permite especificar la URL con selectores separados por espacios, de manera que podemos controlar qué elementos, qué HTML al fin y al cabo, queremos que se cargue en la capa que eligamos. Ésto nos ahorra de una tacada tener que hacer alguna modificación en el código de la aplicación (se van a ir pidiendo por ajax sucesivas páginas como si la navegación fuera la clásica) y tener que procesar el HTML que recibimos (se pinta tal cual porque ya viene filtrado con el contenido, lo único que he tenido que modificar de la página es un poco la maquetación).</p>
</li>
</ul>
<p>En definitiva, y en mi opinión:</p>
<p><strong>PROS</strong></p>
<ul style="margin-left:30px;">
<li><em>Experiencia de usuario</em>: no tengo la menor duda de que, para cierto tipo de webs y, sobre todo, de contenido, el eliminar la paginación supone una mejora muy significativa en la forma de navegar por el sitio, comportándose de la forma natural en la que uno esperaría moverse por él.</li>
<li><em>Consumo</em>: cuando desaparece el punto final (pie de página y paginación) pasa a ser un comportamiento natural el hacer scroll indefinidamente y por tanto seguir consumiendo el contenido de manera <em>indefinida</em>.</li>
</ul>
<p><strong>CONTRAS</strong></p>
<ul style="margin-left:30px;">
<li><em>Experiencia de usuario</em>: y no es una contradicción, la <em>nueva</em> forma de navegación puede confundir a muchos usuarios menos duchos en esto de Internet, acostumbrados a los puntos de ruptura (paginación), a saber por qué página del libro van y a una estructura de web más convencional.</li>
<li><em>Implementación</em>: no es tema trivial, ya no técnicamente, sino desde el punto de vista de la usabilidad. Por ejemplo está muy unido al dispositivo utilizado: con la rueda del ratón todo es maravilloso, con el teclado o arrastrando la barra de scroll ya pueden darse saltos incómodos. La norma aquí es que sea prácticamente imperceptible para el usuario lo que se está cociendo de fondo (aquí tengo que mejorar mi implementación).</li>
<li><em>Monetización</em>: en sitios que se ganan las habichuelas con la publicidad puede suponer un problema la ubicación de los bloques de anuncios. Un esquema típico de jumbobanner arriba, roba a la derecha y Adsense bajo el contenido queda bastante desvirtuado con esta navegación. Lo mismo con páginas vistas (solucionable con una buena semilla).</li>
</ul>
<p>Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/desarrollo/error-en-la-codificacion-con-ajax' rel='bookmark' title='Error en la codificación con AJAX'>Error en la codificación con AJAX</a></li>
<li><a href='http://www.usuariodeinternet.es/desarrollo/internacionalizacion-con-smarty' rel='bookmark' title='Internacionalización con Smarty'>Internacionalización con Smarty</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/LtBER3zkkx4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/desarrollo/scroll-infinito-con-jquery/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/desarrollo/scroll-infinito-con-jquery</feedburner:origLink></item>
		<item>
		<title>Internacionalización con Smarty</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/EvY05SZACGw/internacionalizacion-con-smarty</link>
		<comments>http://www.usuariodeinternet.es/desarrollo/internacionalizacion-con-smarty#comments</comments>
		<pubDate>Mon, 23 Nov 2009 08:16:06 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=532</guid>
		<description><![CDATA[El temita de la internacionalización (i18n para los amigos) en una aplicación web puede dar para largo y tendido, yo voy a hablar aquí concretamente de la forma de guardar y utilizar las cadenas de texto del site en varios idiomas utilizando el framework de templates Smarty. Hay muchas formas de hacerlo, se pueden encontrar [...]
Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/desarrollo/error-en-la-codificacion-con-ajax' rel='bookmark' title='Error en la codificación con AJAX'>Error en la codificación con AJAX</a></li>
<li><a href='http://www.usuariodeinternet.es/desarrollo/scroll-infinito-con-jquery' rel='bookmark' title='Scroll infinito con jQuery'>Scroll infinito con jQuery</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img title="Internacionalización con Smarty" src="/img/post/smarty_i18n.png" border="0" alt="Internacionalización con Smarty" width="640" height="97" /></p>
<p>El temita de la internacionalización (<em>i18n</em> para los amigos) en una aplicación web puede dar para largo y tendido, yo voy a hablar aquí concretamente de la <strong>forma de guardar y utilizar las cadenas de texto</strong> del site en varios idiomas utilizando el framework de templates <a href="http://www.smarty.net" target="_blank">Smarty</a>.</p>
<p>Hay muchas formas de hacerlo, se pueden encontrar varias alternativas en este post de <a href="http://www.smarty.net/forums/viewtopic.php?t=84&#038;postdays=0&#038;postorder=asc&#038;start=0" target="_blank">best way to build a multi-language site with smarty</a>, que empezó en el ¡2003! (el frenético ritmo que lleva la tecnología hace que no me crea nada que no sea de ayer&#8230;). Todas tienen sus ventajas e inconvenientes, y dado que no hay nada en el core de Smarty para ésto ni una solución popularmente aceptada como la <em>estándar</em>, cada uno debe analizar lo que necesita para su proyecto y tener unas preferencias subjetivas, que en mi caso son:</p>
<ul style="margin-left:30px;">
<li><strong>Que no implique PHP</strong>: obviamente hay opciones mucho más sofisticadas, eficientes, etc&#8230; para solucionar el tema del i18n con programación (por ejemplo <a href="http://sourceforge.net/projects/smarty-gettext/" target="_blank">smarty-gettext</a>), pero precisamente el uso de Smarty es para separar la lógica de la aplicación de la de presentación, y dado que considero que ésto es problema de front-end puro, yo quiero resolverlo únicamente con Smarty.</li>
<li><strong>Que sea sencillo y eficiente</strong>: con el tiempo me estoy conviertiendo en un talibán del código, en el sentido bueno (creo) de intentar que las cosas se hagan de la forma más clara posible (<a href="http://es.wikipedia.org/wiki/Principio_KISS" target="_blank">KISS</a> power!) y que note un pinchazo en el corazón con cada ciclo de reloj que se consume en código prescindible.</li>
</ul>
<p><span id="more-532"></span><br />
 Por ejemplo, hay una solución <strong>muy buena</strong> y que he utilizado en otros proyectos, <a href="http://smarty.incutio.com/?page=SmartyMultilanguageSupport" target="_blank">SmartyML</a>, pero es una clase más en PHP (una capa más para procesar) y viendo tanto código pienso que debe haber una forma mejor de hacerlo.</p>
<p>Pero vamos al turrón. Al final encontré en el foro antes mencionado la solución que me parece más sencilla y adecuada para lo que necesito. Se trata de utilizar <a href="http://smarty.net/manual/es/config.files.php" target="_blank"><strong>archivos de configuración</strong></a> (1ª ventaja: es una funcionalidad core de Smarty, con lo que no hay que añadir más complejidad). En estos ficheros se definen variables globales para los templates y se pueden aplicar de varias formas:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// desde el PHP</span>
<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">config_load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fichero.conf'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// desde el template</span>
<span style="color: #009900;">&#123;</span>config_load <span style="color: #990000;">file</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'fichero.conf'</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Yo prefiero hacerlo desde PHP porque la gestión del idioma de la web es lógica de aplicación y hay que poner cada cosa en su sitio. El directorio donde se almacenan estos ficheros debe ser definido en el código:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$smarty</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Smarty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">config_dir</span>   <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/path/al/directorio/'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Crearemos un archivo por idioma, en los que tendremos todas las cadenas de texto que vamos a utilizar traducidas, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"># /path/al/directorio/es.conf (español)
saludo = hola!
enviar = Enviar
cancelar = Cancelar</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"># /path/al/directorio/en.conf (inglés)
saludo = hi!
enviar = Send
cancelar = Cancel</pre></div></div>

<p>Utilizar estas variables en los templates es tan sencillo como usar la sintaxis <strong>{#variable#}</strong>, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">strong</span>&gt;</span>{#saludo#}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">strong</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;enviar&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;{#enviar#}&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cancelar&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;{#cancelar#}&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>¡Y ya está! desde el PHP se puede controlar qué archivo de configuración de idioma cargar y de esta manera tener montada nuestra web multilenguaje. Unos últimos apuntes:</p>
<ul style="margin-left:30px;">
<li>Las cadenas también pueden llevar <strong>texto variable</strong>, como por ejemplo un saludo del tipo <em>Hola Fernando, bienvenido!</em> Ésto se puede solucionar de dos formas:

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"># forma CUTRE: en el tpl
<span style="color: #009000;">&lt;strong&gt;</span><span style="color: #D36900;">&#123;</span>#saludo1#<span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$nombre_usuario</span><span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span>#saludo2#<span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/strong&gt;</span>
&nbsp;
# en el archivo de configuración de idioma
saludo1 = Hola
saludo2 = bienvenido!</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"># forma CORRECTA: en el tpl
<span style="color: #009000;">&lt;strong&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">eval</span> var<span style="color: #D36900;">=</span>#saludo#<span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/strong&gt;</span>
&nbsp;
# en el archivo de configuración de idioma
saludo = Hola <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$nombre_usuario</span><span style="color: #D36900;">&#125;</span>, bienvenido!</pre></div></div>

</li>
<li>En lo que entiendo es una <strong>optimizacion</strong> (supongo que a nivel interno se controlará), se pueden utilizar <strong>secciones</strong> (referenciadas así <em>[seccion]</em>) en el archivo de configuración, de manera que si se especifica una en el <em>config_load</em> sólo esas variables se <em>cargarán</em> (la que estén fuera de una sección estarán siempre disponibles). Ésto nos puede servir para organizar las cadenas de texto por página y suponer que Smarty lo manejará mejor que el chorro completo de variables. Quedaría así:

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"># cadenas globales
saludo = Hola!
enviar = Enviar
&nbsp;
# página de login
[login]
titulo = Introduce tu usuario y contraseña</pre></div></div>

<p>Y desde el PHP:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">config_load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'es.conf'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'login.tpl'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</li>
<li>Una desventaja es que no maneja de manera nativa los <strong>plurales</strong> como otras soluciones, de forma que hay que controlarlo a manubrio, por ejemplo:

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"># en el tpl
<span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">eval</span> var<span style="color: #D36900;">=</span>#subida_fotos#<span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">if</span> <span style="color: #00aaff;">$num_fotos</span> <span style="color: #D36900;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #D36900;">&#125;</span>s<span style="color: #D36900;">&#123;</span><span style="color: #D36900;">/</span><span style="color: #0600FF;">if</span><span style="color: #D36900;">&#125;</span>
&nbsp;
# en el archivo de configuración de idioma
subida_fotos = Has subido <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$num_fotos</span><span style="color: #D36900;">&#125;</span> foto</pre></div></div>

</li>
</ul>
<p>Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/desarrollo/error-en-la-codificacion-con-ajax' rel='bookmark' title='Error en la codificación con AJAX'>Error en la codificación con AJAX</a></li>
<li><a href='http://www.usuariodeinternet.es/desarrollo/scroll-infinito-con-jquery' rel='bookmark' title='Scroll infinito con jQuery'>Scroll infinito con jQuery</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/EvY05SZACGw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/desarrollo/internacionalizacion-con-smarty/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/desarrollo/internacionalizacion-con-smarty</feedburner:origLink></item>
		<item>
		<title>Integrar las APIs de login de Facebook, Yahoo y Windows Live</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/c1Boyio63eg/integrar-las-apis-de-login-de-facebook-yahoo-y-windows-live</link>
		<comments>http://www.usuariodeinternet.es/desarrollo/integrar-las-apis-de-login-de-facebook-yahoo-y-windows-live#comments</comments>
		<pubDate>Fri, 20 Feb 2009 09:37:55 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[windows live]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=414</guid>
		<description><![CDATA[La filosofía del single sign-on ha terminado imponiéndose por pura lógica de saturamiento 2.0, con los grandes jugadores vendiendo sus nuevas propuestas (OpenID lo intentó y no lo consiguió&#8230;) y los usuarios cansados de procesos de registro y contraseñas varias. Darles a éstos la oportunidad de usar sus credenciales de alguno de los servicios top [...]
Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/navegando/windows-live-maps-se-un-pajaro' rel='bookmark' title='Windows Live Maps: Sé un Pájaro'>Windows Live Maps: Sé un Pájaro</a></li>
<li><a href='http://www.usuariodeinternet.es/navegando/segundo-facebook-developer-garage-en-madrid' rel='bookmark' title='Segundo Facebook Developer Garage en Madrid'>Segundo Facebook Developer Garage en Madrid</a></li>
<li><a href='http://www.usuariodeinternet.es/desarrollo/nuevas-apis-de-google' rel='bookmark' title='Nuevas APIs de Google'>Nuevas APIs de Google</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<img height="150" width="640" border="0" alt="El bonito single sign-on" src="/img/post/singlesignon.jpg" title="El bonito single sign-on"/>
</p>
<p>La filosofía del <strong>single sign-on</strong> ha terminado imponiéndose por pura lógica de saturamiento 2.0, con los grandes jugadores vendiendo sus nuevas propuestas (OpenID lo intentó y no lo consiguió&#8230;) y los usuarios cansados de procesos de registro y contraseñas varias. Darles a éstos la oportunidad de usar sus credenciales de alguno de los servicios top para utilizar tu sitio debería ser ya a estas alturas planteado como una funcionalidad primaria de cualquier proyecto web.</p>
<p>Lo que viene a continuación es una guía para implementar en tu web la funcionalidad de &#8220;login externo&#8221; usando las APIs de tres de los grandes: <strong>Facebook</strong>, <strong>Yahoo</strong> y <strong>Windows Live</strong> (Google y OpenID vendrán en otro post). El proceso es similar en todos los casos, y el objetivo es acabar teniendo para utilizar en nuestro código el id único externo (la variable <em>$id_unico</em> en los ejemplos) que nos sirva para identificar y validar al usuario en nuestro sistema local.<br />
<span id="more-414"></span></p>
<h2>Facebook</h2>
<p>La integración más sencilla de todas ¡5 líneas de código!</p>
<p>La <a href="http://developers.facebook.com/">documentación para desarrolladores de Facebook</a> es de las mejores, con muchos ejemplos prácticos y una comunidad muy activa. Vamos a hacer <strong>la implementación más sencilla</strong>, sin meternos en <a href="http://developers.facebook.com/connect.php">Facebook Connect</a>, que será chicha para otro post. Los pasos serían los siguientes:</p>
<ol style="margin-left:30px;">
<li>Logueado en tu cuenta de Facebook debes añadirte la <a href="http://www.facebook.com/developers/">aplicación para desarrolladores</a>.</li>
<li>Creamos una nueva aplicación, y rellenamos lo básico para que funcione (el resto es para configuraciones más avanzadas)
<p style="text-align: center;margin-top:10px;"><img src="/img/post/apilog_facebook_campos.png" alt="Campos mínimos para rellenar en la aplicación de Facebook" title="Campos mínimos para rellenar en la aplicación de Facebook" width="701" height="244" /></p>
</li>
<li>Nos bajamos la <a href="http://svn.facebook.com/svnroot/platform/clients/packages/facebook-platform.tar.gz">librería cliente de PHP</a>.</li>
<li>¡Y a picar!</li>
</ol>
<p>Resumiendo, tenemos una api key, otra key privada, hemos especificado una URL propia de retorno de Facebook, y tenemos su clase de PHP (nos sobraría con los ficheros <em>facebook.php</em> y <em>facebookapi_php5_restlib.php</em>). Pues el script para loguearse con Facebook sería tan sencillo como esto:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// cargamos la clase que nos proporcionan</span>
	<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'apis_externas/facebook/class_facebook.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// datos de la aplicación que se nos facilitan cuando la registramos en Facebook </span>
	<span style="color: #000088;">$appapikey</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'000000000000'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$appsecret</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'111111111111'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// inicializamos el objeto de la clase</span>
	<span style="color: #000088;">$facebook</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Facebook<span style="color: #009900;">&#40;</span><span style="color: #000088;">$appapikey</span><span style="color: #339933;">,</span><span style="color: #000088;">$appsecret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// si el usuario no está logueado en Facebook le redirigirá allí</span>
	<span style="color: #000088;">$id_unico</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$facebook</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">require_login</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id_unico</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// si a estas alturas no tenemos el id único algo ha salido mal</span>
		<span style="color: #000088;">$error_api</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Hay varias formas de hacer esto en Facebook, y no digo que esta sea la más correcta, pero seguro que la más sencilla. La importante es la línea 14, en la que si el usuario está logueado nos devolverá su id único, y sino le enviará a la página de login de Facebook.</p>
<h2>Yahoo</h2>
<p>Otra API con integración <em>no traumática</em> gracias a la tecnología <a href="https://developer.yahoo.com/auth/">BBAuth de Yahoo</a>. Aquí también se pueden elegir varias implementaciones (OAuth, OpenID), pero de nuevo vamos a optar por la más sencilla y rápida de desarrollar. Los pasos son los siguientes:</p>
<ol style="margin-left:30px;">
<li>Vamos a la página de <a href="https://developer.yahoo.com/dashboard/">alta de aplicaciones</a> (se necesita usuario de Yahoo).</li>
<li>Creamos una nueva <em>Browser-Based Authentication Protected Application</em>
<p style="text-align: center;margin-top:10px;"><img src="/img/post/apilog_yahoo_campos.gif" alt="Campos mínimos para rellenar en la aplicación de Yahoo" title="Campos mínimos para rellenar en la aplicación de Yahoo" width="665" height="586" /></p>
</li>
<li>Nos pedirán confirmar el dominio subiendo un fichero determinado a nuestra web.</li>
<li>Nos bajamos la <a href="https://developer.yahoo.com/auth/quickstart/bbauth_quickstart.zip">librería cliente de PHP</a>.</li>
<li>¡Y a picar!</li>
</ol>
<p>Resumiendo de nuevo, tenemos la aplicación creada, apuntadas las dos keys que necesitamos y la clase para comunicarnos con Yahoo (usaremos el fichero <em>ybrowserauth.class.php4</em> o <em>ybrowserauth.class.php5</em> dependiendo de nuestra versión de PHP). El código final quedará así:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// datos de la aplicación que se nos facilitan cuando la registramos en Yahoo</span>
	<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPID'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'000000000000'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SECRET'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'111111111111'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
&nbsp;
	<span style="color: #666666; font-style: italic;">// cargamos la clase que nos proporcionan (en este caso tenemos PHP 5 en el servidor)</span>
	<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'apis_externas/yahoo/ybrowserauth.class.php5'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// inicializamos el objeto de la clase</span>
	<span style="color: #000088;">$authObj</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> YBBauthREST<span style="color: #009900;">&#40;</span>APPID<span style="color: #339933;">,</span>SECRET<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'token'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// si no tenemos token mandamos a la página de login</span>
		<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$authObj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAuthURL</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$authObj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate_sig</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// si validamos el token ya podemos sacar el id único</span>
		<span style="color: #000088;">$id_unico</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$authObj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">userhash</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// el token recibido no es correcto</span>
		<span style="color: #000088;">$error_api</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Es muy importante recordar que esta API es especial en el sentido que el id que se recibe finalmente es un <strong>hash del id único real del usuario en Yahoo y el id de la aplicación</strong>, es decir, si el mismo usuario de loguea con otra aplicación recibiremos un hash distinto, por lo que tenemos que tener en cuenta qué significa exactamente este id <em>único</em> que recibimos de la API.</p>
<h2>Windows Live</h2>
<p>Haciendo honor a su fama, y con mucha diferencia, la API de Windows Live es la más complicada de implementar, tanto por su <a href="http://msdn.microsoft.com/en-us/library/bb676633.aspx">horrenda documentación</a> (lo de msdn es terminal&#8230;) como por el engorro general que supone lidiar con sus múltiples archivos y su extraño flujo de información.</p>
<p>Los pasos iniciales son similares a las anteriores APIs, la diversión viene después&#8230;</p>
<ol style="margin-left:30px;">
<li>Vamos a la página de <a href="https://lx.azure.microsoft.com/">alta de aplicaciones</a> (se necesita usuario de Windows Live).</li>
<li>Creamos un proyecto de <em>Live Services: Existing APIs</em>
<p style="text-align: center;margin-top:10px;"><img src="/img/post/apilog_windowslive_campos.gif" alt="Campos mínimos para rellenar en la aplicación de Windows Live" title="Campos mínimos para rellenar en la aplicación de Windows Live" width="685" height="440" /></p>
<p>Es en este formulario cuando nos enfrentamos al primer problema absurdo, y es que el campo <em>Return URL</em> permite un <strong>máximo de 50 caracteres</strong> wtf?? cualquier ruta que no vaya a la raíz va a tener más de 50 letras! la única solución es tener una herramienta tipo <a href="http://getfirebug.com/">firebug</a> para poder editar online el HTML y cambiar el atributo <em>maxlength</em> del campo para poder enviar una URL en condiciones (lo que confirma lo absurdo de la limitación es que la página no te comprueba si has escrito más de esos 50 caracteres, se envía sin problemas&#8230;)<br />
Y atención también que la <strong>URL de retorno no es la misma que el resto de las APIs</strong>, es a un script que nos bajaremos luego con el SDK.</li>
<li>Nos bajamos el <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=E565FC92-D5F6-4F5F-8713-4DD1C90DE19F&#038;displaylang=en#filelist">Web Authentication SDK</a> para el lenguaje que vayamos a utilizar.</li>
<li>¡Y a picar!</li>
</ol>
<p>De nuevo tenemos una api key, otra key privada, hemos especificado una URL de retorno nueva, y tenemos su SDK con varios archivos. Lo primero es poner las keys en el fichero <strong><em>Application-Key.xml</em></strong> (debe ser innaccesible desde internet, bien limitándolo con un htaccess o colocándolo fuera del document root):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;windowslivelogin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>000000000000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;secret<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>111111111111<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/secret<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;securityalgorithm<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>wsignin1.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/securityalgorithm<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/windowslivelogin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Ahora en el directorio <em>sample</em> tenemos una implementación de ejemplo a la que podemos quitarle bastante paja. Lo primero es editar el fichero <strong><em>settings.php</em></strong>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// por si las cosas no salen y se necesita consultar logs de errores </span>
	<span style="color: #000088;">$DEBUG</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// path completo al XML de configuración de la aplicación</span>
	<span style="color: #000088;">$KEYFILE</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/home/usuario/Application-Key.xml'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// nombre de la cookie que almacena el token de usuario que manda la API</span>
	<span style="color: #000088;">$COOKIE</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'webauthtoken'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// URL a la que tiene que redirigir cuando todo termine</span>
	<span style="color: #000088;">$INDEX</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/login_externo.php'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// páginas a las que tiene que llevar cuanto se haga login o logout</span>
	<span style="color: #000088;">$LOGIN</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$INDEX</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$LOGOUT</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$INDEX</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// la URL de la API ¡no tocar!</span>
	<span style="color: #000088;">$CONTROLURL</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://login.live.com/controls/WebAuth.htm'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>En el fichero <strong><em>webauth-handler.php</em></strong> (recordar que es éste el que hemos puesto como URL de retorno al crear la aplicación) tenemos que poner la rutas correcta al fichero de configuración y a la librería de la API (el fichero <em>windowslivelogin.php</em> en el directorio <em>lib</em>):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/home/usuario/dominio/windows_live/settings.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/home/usuario/dominio/windows_live/lib/windowslivelogin.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #339933;">....</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Y finalmente el código que implementa la autenticación con Windows Live:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// el fichero de configuración de la API</span>
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/home/usuario/dominio/windows_live/settings.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// la librería del SDK</span>
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/home/usuario/dominio/windows_live/lib/windowslivelogin.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// inicializamos las variables</span>
	<span style="color: #000088;">$wll</span> <span style="color: #339933;">=</span> WindowsLiveLogin<span style="color: #339933;">::</span><span style="color: #004000;">initFromXml</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$KEYFILE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$wll</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setDebug</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$DEBUG</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$APPID</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wll</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAppId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$userid</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// comprobamos si el token de usuario está en la cookie</span>
	<span style="color: #000088;">$token</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$COOKIE</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$token</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wll</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">processToken</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$token</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// tenemos token, intentamos sacar de él el id único del usuario</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$userid</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$userid</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// guardamos el id único</span>
		<span style="color: #000088;">$id_unico</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$userid</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// si no tenemos token, redirigimos al usuario a la página de login de Windows Live</span>
		<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: http://login.live.com/wlogin.srf?appid=0000000040009631&amp;alg=wsignin1.0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Quedaría, como en el resto de APIs, hacer una gestión eficiente de los errores que se pueden dar, aunque eso ya son detalles de implementación de cada aplicación.</p>
<p>Tampoco comento nada sobre los módulos de PHP que es necesario tener activados en el servidor para hacer funcionar las APIs. En principio los únicos que considero pudieran salirse de una configuración básica son <a href="http://es.php.net/curl"><strong>curl</strong></a> y <a href="http://es.php.net/mhash"><strong>mhash</strong></a>. Curl se utiliza en la librería de Yahoo y es complicado buscarle una alternativa. Mhash se utiliza en la de Windows Live, y en este caso, siendo una extensión mucho menos común, se puede <em>puentear</em> su uso parcheando el fichero <strong>windowslivelogin.php</strong>, en concreto la línea:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1515
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mhash</span><span style="color: #009900;">&#40;</span>MHASH_SHA256<span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Cambiándola para utilizar funciones del core de PHP5 que también realizan el hash binario SHA256:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1515
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">pack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;H*&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">hash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sha256'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/navegando/windows-live-maps-se-un-pajaro' rel='bookmark' title='Windows Live Maps: Sé un Pájaro'>Windows Live Maps: Sé un Pájaro</a></li>
<li><a href='http://www.usuariodeinternet.es/navegando/segundo-facebook-developer-garage-en-madrid' rel='bookmark' title='Segundo Facebook Developer Garage en Madrid'>Segundo Facebook Developer Garage en Madrid</a></li>
<li><a href='http://www.usuariodeinternet.es/desarrollo/nuevas-apis-de-google' rel='bookmark' title='Nuevas APIs de Google'>Nuevas APIs de Google</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/c1Boyio63eg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/desarrollo/integrar-las-apis-de-login-de-facebook-yahoo-y-windows-live/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/desarrollo/integrar-las-apis-de-login-de-facebook-yahoo-y-windows-live</feedburner:origLink></item>
		<item>
		<title>Ya tengo nuevo juguete: tumblr</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/loAkTAcByh0/ya-tengo-nuevo-juguete-tumblr</link>
		<comments>http://www.usuariodeinternet.es/navegando/ya-tengo-nuevo-juguete-tumblr#comments</comments>
		<pubDate>Sun, 08 Feb 2009 19:13:20 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Navegando]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[tumblr]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=467</guid>
		<description><![CDATA[Estoy viciado a tumblr, enganchado a su sencillez, encantado con su filosofía y alucinando con su comunidad. Es sencillo como pocas cosas compartir lo que quieras en tu tumblr. Tienes un dashboard con enlaces según el tipo de contenido que quieres publicar y poco más. Rellenas un campo (dos si eres pro) y de las [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin-right: 10px;"><img src="/img/post/tumblr.gif" alt="Logo tumblr" title="Logo tumblr" width="200" height="200"  /></div>
<p> Estoy viciado a <a href="http://www.tumblr.com"><strong>tumblr</strong></a>, enganchado a su sencillez, encantado con su filosofía y alucinando con su comunidad.</p>
<ul style="margin-left:30px;">
<li>Es <strong>sencillo</strong> como pocas cosas compartir lo que quieras en tu tumblr. Tienes un dashboard con enlaces según el tipo de contenido que quieres publicar y poco más. Rellenas un campo (dos si eres pro) y de las al botón de <em>Create post</em>. Hay <a href="https://addons.mozilla.org/es-ES/firefox/addon/5867">extensiones de firefox</a> que lo hacen tan trivial como arrastrar el contenido a un icono de tu barra de estado. Y sí, la sencillez crea <strong>adicción</strong> (¿he oído twitter?)
<li style="margin-top:10px;">tumblr es la quintaesencia de la <strong>filosofía</strong> del <a href="http://es.wikipedia.org/wiki/Tumblelog">tumblelog</a>, el término medio entre el blog de toda la vida y el nuevo microblogging, un espacio sin necesidad de temática fija, sin los rigores de un post más trabajado y con ese plus multimedia que a veces se echa en falta en el nanoblogging. No hay comentarios, no hay categorías ni tags&#8230; es una servilleta de papel de un bar en la que apuntas lo que te viene a la cabeza, lo que encuentras, lo que te gusta&#8230; y es <strong>tu</strong> servilleta, porque las posibilidades de personalización son <strong>totales</strong> (<a href="http://tumblrawards.tumblr.com/">ver ejemplos</a>).</li>
<li style="margin-top:10px;">Y sin duda lo que más me ha sorprendido es la <strong>comunidad</strong>. Me recuerda la sensación que tengo cuando navego por <a href="http://www.vimeo.com">Vimeo</a>, todo parece de tanta calidad y veo tan poca morralla que me da que pensar si estas comunidades se forman de manera espontánea o la supuesta navegación por el portal es en realidad una visita guiada a través de un filtro anti-shit. Una muestra en el <a href="http://www.tumblr.com/radar">Radar</a> y el <a href="http://www.tumblr.com/directory">Directorio</a>.
<p>Otro plus es que es una comunidad <strong>activa </strong> (cosa que no me extraña). En tu dashboard puedes ver las actualizaciones de los tumblrs que sigues (otro vicio), y continuando con la sencillez, puedes <em>rebloguear</em> ese contenido o guardártelo como favorito. Todo esto para comentar que he visto como <a href="http://slackr.tumblr.com/">un usuario</a> (que digo yo será bastante popular) ha colgado una foto y al minuto tenía más de 20 reblog/likes. Lástima que en castellano hayan tan pocos (bueno, tampoco me he puesto a buscar, me vale con las joyitas que voy encontrando) tumblrs&#8230;</li>
</ul>
<p>En definitiva, para mi tumblr ha supuesto el complemento perfecto a este blog y <a href="http://twitter.com/olfativo">mi tuiter</a>. La puntilla ha sido cuanto el otro día <a href="http://staff.tumblr.com/post/75941045/twitter">lanzaron la integración oficial con twitter</a>, justo en el clavo, es exactamente uno de los usos que me gusta darle al microblogging, compartir cosas que me voy encontrando en las navegaciones a la deriva&#8230; ahora por fin tengo la perfecta servilleta de papel para apuntarlos y que no se pierdan en la niebla de mi historial!</p>
<p>Para terminar, unos cuantos tumblrs: <a href="http://yimmyayo.tumblr.com/">yimmyayo</a>, <a href="http://hipstertracks.tumblr.com/">hipstertracks</a>, <a href="http://graphiceverywhere.tumblr.com/">graphiceverywhere</a>, <a href="http://kari-shma.tumblr.com/">kari-shma</a>&#8230; y por supuesto el mio!! <a href="http://micro.usuariodeinternet.es/"><strong>micro usuario de internet</strong></a>!!</p>
<p style="text-align: center;">
<a href="http://micro.usuariodeinternet.es/" style="border-bottom:0px;"><img height="143" width="518" border="0" alt="micro usuario de internet, mi tumblr" src="/img/post/tumblr_cabecera_final.jpg" title="micro usuario de internet, mi tumblr"/></a></p>
<img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/loAkTAcByh0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/navegando/ya-tengo-nuevo-juguete-tumblr/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/navegando/ya-tengo-nuevo-juguete-tumblr</feedburner:origLink></item>
		<item>
		<title>Spotify ¿realidad o ficción?</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/HcNnChFs8k4/spotify-realidad-o-ficcion</link>
		<comments>http://www.usuariodeinternet.es/navegando/spotify-realidad-o-ficcion#comments</comments>
		<pubDate>Thu, 15 Jan 2009 20:57:52 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Navegando]]></category>
		<category><![CDATA[musica]]></category>
		<category><![CDATA[negocio]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=385</guid>
		<description><![CDATA[Durante estos días uno no hace más que ver en Internet referencias al nuevo killer service, venerado por la blogosfera y los early adopters (frikis para los profanos), Spotify, o como dar un vuelco al negocio de la música en Internet por la patilla. Y es que el temita promete. El otro día conseguí una [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img title="Spotify, la nueva revolución de la música en Internet" src="/img/post/spotify_logo.gif" border="0" alt="Spotify, la nueva revolución de la música en Internet" width="640" height="150" /></p>
<p>Durante estos días uno no hace más que ver en Internet referencias al nuevo killer service, venerado por la blogosfera y los <em>early adopters</em> (frikis para los profanos), <a href="http://www.spotify.com"><strong>Spotify</strong></a>, o como dar un vuelco al negocio de la <strong>música en Internet</strong> por la patilla.</p>
<p>Y es que el temita promete. El otro día conseguí una invitación (ahora mismo está en beta semi-pública) sin saber qué leches iba a probar, y sin ser usuario de servicios tipo last.fm, pandora, etc&#8230; vamos, yo soy de los del género vago, de abrir la radio online a las 9:00 y no cerrarla hasta las 19:00. Pero es que ésto está tan bien hecho, es tan sencillo, tan fluido, que crea adicción, incluso en analfabetos musicales de mi calaña. <strong>Primer logro</strong>.</p>
<p>El servicio va de: <strong>A</strong>. Registrarse <strong>B</strong>. Instalarse su aplicación <strong>C</strong>. ¡Música! (<em>it&#8217;s easy as 1,2,3!</em>). La herramienta es una maravilla, un iTunes fibrado y ligero, diseño minimalista y usabilidad cuidada. Cualquier camino dentro de la aplicación termina siempre en <strong>escuchar música</strong>. Haces click en el nombre de un artista, vas a su ficha, ves toda su discografía, clickeas el track 9 del CD2 de su disco de hace 7 años y lo escuchas. TODA canción que aparezca en la aplicación simplemente haces click y la escuchas. <strong>Música gratis bajo demanda</strong>.</p>
<p style="text-align: center"><img title="La aplicación de escritorio de Spotify" src="/img/post/spotify_app.jpg" border="0" alt="La aplicación de escritorio de Spotify" width="500" height="292" /></p>
<p>No voy a analizar sus pros y contras, para eso ya sabéis que hay <a href="http://www.genbeta.com/2009/01/13-musica-gratis-al-instante-spotify">otras webs temáticas</a>, sólo comentar lo que<strong> me siguen sorprendiendo algunos modelos de negocio en Internet</strong>. En algo como la música, con unos proveedores que odian y desprecian al medio, y unos márgenes pírricos (creo recordar que si en iTunes una canción costaba 0.99 €, las majors se llevaban 0.70 €), no me parece muy sostenible la apuesta de Spotify, con un modelo freebie totalmente funcional (si el modelo premium lo único que me ofrece es que no me salgan ads sonoros, poco van a sacar por ahí), unos ingresos por publicidad tipo radio (¿éso lo sigue contratando alguien?) y un coste asociado al ancho de banda de servir las canciones (<a href="http://torrentfreak.com/spotify-an-alternative-to-music-piracy-090102/">aunque utilicen un modelo híbrido P2P</a>). Tal vez sea lo que se comenta por ahí, que es un torpedo con el que la industria discográfica (¿tal vez hayan aceptado menos trozo de la tarta por el compromiso de los responsables del proyecto de que <em>algo</em> va a cambiar?) quiere atacar a la línea de flotación de la piratería musical: &#8220;<em>Tú, alma triste, si te pongo un programita con el puedes escuchar cualquier canción como si la tuvieras descargada ¿pa que leches quieres seguir dándole al emule?</em>&#8221;</p>
<p>Y bueno, no tendrán la parte social muy desarrollada, pero en Twitter por ejemplo no paran ya de llover los enlaces para escuchar canciones. Comparto un temazo: <a href="http://open.spotify.com/track/40ThmAgDduNcjwkypLe0Dj">http://open.spotify.com/track/40ThmAgDduNcjwkypLe0Dj</a></p>
<p><del datetime="2010-04-30T09:17:12+00:00">Por cierto, <strong>tengo unas cuantas invitaciones</strong> para probar Spotify, aunque no se si es una puerta trasera dejada abierta disimuladamente aposta o están en la parra, pero por ahora <a href="https://www.spotify.com/en/get-started/">te puedes registrar sin invitación aquí</a>. <strong>ACTUALIZACIÓN</strong>: parece ser que dicha puerta ha sido cerrada, de todas formas yo sigo teniendo unas cuantas invitaciones, si lo necesitas escribe un comentario.</del></p>
<p class="video_tit">su vídeo promocional</p>
<div class="video_marco" style="width:500px;"><object width="500" height="281"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1900024&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1900024&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="281"></embed></object></div>
<img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/HcNnChFs8k4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/navegando/spotify-realidad-o-ficcion/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/navegando/spotify-realidad-o-ficcion</feedburner:origLink></item>
		<item>
		<title>Semana 3 / Pixel Feed</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/Hh_2Ti3BW78/semana-3-pixel-feed</link>
		<comments>http://www.usuariodeinternet.es/lecturas/semana-3-pixel-feed#comments</comments>
		<pubDate>Sun, 04 Jan 2009 21:21:47 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Lecturas]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[enlaces]]></category>
		<category><![CDATA[musica]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=262</guid>
		<description><![CDATA[El tam-tam de los &#8220;nativos digitales&#8221; / elpais.com Un artículo que me ha parecido muy interesante por dos cosas: primero, plantear cómo va a ser la madurez de esta nueva generación que ha nacido con Internet ¿qué usarán después de Tuenti? ¿por fin comercio electrónico total (comprar el pan por Internet, vamos), la verdadera televisión [...]
Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/lecturas/semana-1-feed-dispatching' rel='bookmark' title='Semana 1 / Feed Dispatching'>Semana 1 / Feed Dispatching</a></li>
<li><a href='http://www.usuariodeinternet.es/lecturas/semana-2-el-cerebro-de-la-bestia' rel='bookmark' title='Semana 2 / El Cerebro de la Bestia'>Semana 2 / El Cerebro de la Bestia</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="linkfavicon margentopmini"><span></span><img src="/img/favicon/elpais.gif" /></div>
<div class="linktexto margentopmini">
<p><a href="http://www.elpais.com/articulo/sociedad/tam-tam/nativos/digitales/elpeputec/20081221elpepisoc_1/Tes" target="_blank"><strong>El tam-tam de los &#8220;nativos digitales&#8221;</strong></a> <span>/ elpais.com</span></p>
<p>Un artículo que me ha parecido muy interesante por dos cosas: primero, plantear cómo va a ser la madurez de esta nueva generación que ha nacido con Internet ¿qué usarán después de Tuenti? ¿por fin comercio electrónico total (comprar el pan por Internet, vamos), la verdadera televisión online? En España se va a poner el medio muy interesante! y segundo, el artículo habla sobre los nuevos retos que plantea esto mismo en la educación. A mi eso de que &#8220;<em>Su atención se divide mejor, su cerebro tiene un procesador más complejo</em>&#8221; me parece una tontería, no son mas listos ni multitarea, pero para esto mejor leer los comentarios del artículo, hay opiniones de primera mano, los profesores</p>
</div>
<div style="clear:both;"></div>
<div class="linkfavicon"><span></span><img src="/img/favicon/generico.gif" /></div>
<div class="linktexto">
<p><a href="http://gallir.wordpress.com/2008/11/28/pequena-historia-del-fracaso-de-un-proyecto-personal-derrotado-por-friendfeed-por-goleada-y-sin-siquiera-salir-al-campo/" target="_blank"><strong>Pequeña historia del fracaso de un proyecto personal</strong></a> <span>/ gallir.wordpress.com</span></p>
<p>Me ha encantado este post, esa sensación de tener la idea, llegar incluso a plasmarla en un boceto, adelantar a paso de tortuga, y todo para terminar viendo pasar a toda ostia a otro que tuvo la misma antes o después, pero consiguió los recursos para llevarla a cabo. Lo que se suele decir &#8220;<em>Primera regla del éxito: Empezar</em>&#8220;</p>
</div>
<div style="clear:both;"></div>
<div class="linkfavicon"><span></span><img src="/img/favicon/sethgodin.gif" /></div>
<div class="linktexto">
<p><a href="http://sethgodin.typepad.com/seths_blog/2008/11/three-new-jobs.html" target="_blank"><strong>Three new jobs you might want to consider</strong></a> <span>/ sethgodin.typepad.com</span></p>
<p>La web social lo ha cambiado todo, y entre otras cosas no puedo estar más deacuerdo en que ha generado la necesidad para las empresas de Internet de contar con nuevos perfiles profesionales para manejarse en estos mares. Yo considero básica ya a estas alturas la figura del <strong>responsable de comunidad</strong>, que no viene a ser más que el relaciones públicas 2.0, ese cuyas principales armas son Facebook, Twitter&#8230;.</p>
</div>
<div style="clear:both;"></div>
<div class="linkfavicon"><span></span><img src="/img/favicon/sixrevisions.gif" /></div>
<div class="linktexto">
<p><a href="http://sixrevisions.com/ajax/20-excellent-websites-for-learning-ajax/" target="_blank"><strong>20 Excellent Websites for Learning Ajax</strong></a> <span>/ sixrevisions.com</span></p>
<p>Aprender los básicos de Ajax es realmente sencillo, es un método que para usos normales no suele salirse de un ABC fijo. Pero aquí han recopilado una serie de sitios que permiten meterse de cabeza en esta tecnología con todos sus detalles y complejidad</p>
</div>
<div style="clear:both;"></div>
<div class="linkfavicon"><span></span><img src="/img/favicon/smashingmagazine.gif" /></div>
<div class="linktexto">
<p><a href="http://www.smashingmagazine.com/2008/11/16/60-beautiful-music-videos/" target="_blank"><strong>60 Beautiful Music Videos</strong></a> <span>/ smashingmagazine.com</span></p>
<p>Si es que me encantan los videoclips, y más los originales, en los que me acaba gustando más el vídeo que la música. En este post recopilan auténticas joyitas, y cuidado, es NSFW, un auténtico mata-productividad</p>
</div>
<div style="clear:both;"></div>
<p style="margin-top:20px;text-align:center;font-size:12px;">adoremos al pixel</p>
<div style="border: 1px solid #dcdcdc; margin: 15px auto; padding: 7px; background: #ffffff url(/wp-content/themes/Fontella/images/imagesbg.png) repeat-x scroll center bottom; width: 425px;"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/MXIzyquw-kc&#038;showsearch=0&#038;rel=0"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/MXIzyquw-kc&#038;showsearch=0&#038;rel=0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="344"></embed></object></div>
<p>Entradas relacionadas:<ol>
<li><a href='http://www.usuariodeinternet.es/lecturas/semana-1-feed-dispatching' rel='bookmark' title='Semana 1 / Feed Dispatching'>Semana 1 / Feed Dispatching</a></li>
<li><a href='http://www.usuariodeinternet.es/lecturas/semana-2-el-cerebro-de-la-bestia' rel='bookmark' title='Semana 2 / El Cerebro de la Bestia'>Semana 2 / El Cerebro de la Bestia</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/Hh_2Ti3BW78" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/lecturas/semana-3-pixel-feed/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/lecturas/semana-3-pixel-feed</feedburner:origLink></item>
		<item>
		<title>¡Feliz Navidad!</title>
		<link>http://feed.usuariodeinternet.es/~r/usuariodeinternet/~3/U4HGj-pROLM/feliz-navidad</link>
		<comments>http://www.usuariodeinternet.es/personal/feliz-navidad#comments</comments>
		<pubDate>Mon, 22 Dec 2008 12:01:40 +0000</pubDate>
		<dc:creator>fer</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[chunda chunda]]></category>
		<category><![CDATA[musica]]></category>
		<category><![CDATA[navidad]]></category>

		<guid isPermaLink="false">http://www.usuariodeinternet.es/?p=289</guid>
		<description />
			<content:encoded><![CDATA[<div style="border: 1px solid #dcdcdc; margin: 15px auto; padding: 7px; background: #ffffff url(http://www.fernandogarciatorres.es/wp-content/themes/Fontella/images/imagesbg.png) repeat-x scroll center bottom; width: 640px;"><object width="640" height="360"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2515299&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2515299&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></embed></object></div>
<img src="http://feeds.feedburner.com/~r/usuariodeinternet/~4/U4HGj-pROLM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.usuariodeinternet.es/personal/feliz-navidad/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.usuariodeinternet.es/personal/feliz-navidad</feedburner:origLink></item>
	</channel>
</rss>

