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

<channel>
	<title>Fillito &#187; Programación</title>
	<atom:link href="http://www.fillito.com/blog/category/programacion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fillito.com/blog</link>
	<description>Blog Personal de Daniel García</description>
	<lastBuildDate>Thu, 24 Mar 2011 18:44:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>OAuth en WebOS</title>
		<link>http://www.fillito.com/blog/oauth-en-webos-04-2010</link>
		<comments>http://www.fillito.com/blog/oauth-en-webos-04-2010#comments</comments>
		<pubDate>Wed, 21 Apr 2010 19:00:05 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[Mojo Framework]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[WebOS]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[palm pre]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=1153</guid>
		<description><![CDATA[Hace ya unos cuantos meses que programo asiduamente con el Framework Mojo de Palm WebOS , y para unas cuantas aplicaciones que he empezado a desarrollar, he necesitado autenticación OAuth.
Como me ha costado bastante trabajo dejar listo todo el proceso de autenticación, y estoy seguro que a muchos que desarrollen para WebOS les podría venir bien, he liberado (aprovechando para estrenar mi nueva cuenta de GitHub) una librería de autenticación OAuth para WebOS.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fillito.com/blog/wp-content/uploads/Screen-shot-2010-04-21-at-8.55.47-PM.png"><img class="size-full wp-image-1154 alignright" style="margin: 5px 0px 5px 15px;" title="Screen shot 2010-04-21 at 8.55.47 PM" src="http://www.fillito.com/blog/wp-content/uploads/Screen-shot-2010-04-21-at-8.55.47-PM.png" alt="" width="436" height="230" /></a>Hace ya unos cuantos meses que programo asiduamente con el Framework Mojo de Palm WebOS , y para unas cuantas aplicaciones que he empezado a desarrollar, he necesitado autenticación <a href="http://es.wikipedia.org/wiki/OAuth">OAuth</a>.</p>
<p>Como me ha costado bastante trabajo dejar listo todo el proceso de autenticación, y estoy seguro que a muchos que desarrollen para WebOS les podría venir bien, he liberado (aprovechando para estrenar mi nueva cuenta de <a href="http://github.com/">GitHub</a>) una librería de autenticación OAuth para WebOS.</p>
<p>Además, he querido abstraerla de los dos tipos de aplicaciones con autenticación OAuth que puede haber: web application / client application. Así que he optado por hacer un pequeño hack para que, dando de alta la aplicación como web app, funcione en un terminal movil.<br />
Si conocen un poco cómo funciona la autenticación OAuth, sabrán que al finalizar el proceso, para una web app, se realiza una redirección web en la que se envía el token de autorización como parametro GET. Esto complica la integración en una aplicación movil o de escritorio, ya que no hay url de callback posible. Por lo que el pequeño hack consiste simplemente en capturar la url de callback y parsearla para obtener el token, y luego interrumpir el proceso. De esta manera poder autenticar la aplicación como si fuese web, sin serlo.<br />
Esto además abre el abanico de APIs con las que poder trabajar, ya que no todas están preparadas para ofrecer soporte a aplicaciones cliente. Sin embargo, todas sí soportan la integración de tipo web.</p>
<p>La librería la he liberado en GitHub y pueden acceder desde aquí : <a href="http://github.com/fillito/WebOS-OAuth">http://github.com/fillito/WebOS-OAuth</a></p>
<p>Es totalmente OpenSource y gratuita. E invito a todo el que se anime a &#8220;forkearla&#8221; en GitHub y mejorarla.</p>
<p>Espero que sea útil !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/oauth-en-webos-04-2010/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Un blog de los que hacemos minube</title>
		<link>http://www.fillito.com/blog/un-blog-de-los-que-hacemos-minube-04-2010</link>
		<comments>http://www.fillito.com/blog/un-blog-de-los-que-hacemos-minube-04-2010#comments</comments>
		<pubDate>Sun, 18 Apr 2010 12:40:29 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[Minube]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=1142</guid>
		<description><![CDATA[Esta semana en minube lanzamos un nuevo blog, pero esta vez un poco más especial.

Desde hace unos meses, los que desarrollamos y creamos minube, nos surgió la idea de crear un blog técnico donde contar las cosillas con las que nos vamos encontrando día a día desde el punto de vista del desarrollo. Estamos convencidos de que muchas de las cosas que hacemos, cómo solucionamos algunos problemas técnicos o simplemente cosas curiosas o interesantes relacionadas con la programación y el desarrollo, podrían ser interesantes para mucha gente.

Así que , con mucha ilusión y cariño , los que hacemos minube lanzamos <a href="http://haciendo.minube.com">haciendo.minube.com</a>. Un blog técnico más, pero esta vez, hecho por nosotros :)

No dejéis de echarle un vistazo !]]></description>
			<content:encoded><![CDATA[<p>Esta semana en minube lanzamos un nuevo blog, pero esta vez un poco más especial.</p>
<p>Desde hace unos meses, los que desarrollamos y creamos minube, nos surgió la idea de crear un blog técnico donde contar las cosillas con las que nos vamos encontrando día a día desde el punto de vista del desarrollo. Estamos convencidos de que muchas de las cosas que hacemos, cómo solucionamos algunos problemas técnicos o simplemente cosas curiosas o interesantes relacionadas con la programación y el desarrollo, podrían ser interesantes para mucha gente.</p>
<p>Así que , con mucha ilusión y cariño , los que hacemos minube lanzamos <a href="http://haciendo.minube.com">haciendo.minube.com</a>. Un blog técnico más, pero esta vez, hecho por nosotros <img src='http://www.fillito.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>No dejéis de echarle un vistazo !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/un-blog-de-los-que-hacemos-minube-04-2010/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>En minube liberamos nuestra API</title>
		<link>http://www.fillito.com/blog/en-minube-liberamos-nuestra-api-06-2009</link>
		<comments>http://www.fillito.com/blog/en-minube-liberamos-nuestra-api-06-2009#comments</comments>
		<pubDate>Mon, 08 Jun 2009 20:39:48 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[Minube]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=842</guid>
		<description><![CDATA[Hoy es un gran día para toda la comunidad de desarrolladores entusiastas de minube.com ! Desde hace ya unos meses, hemos estado trabajando en la preparación de una API de datos para desarrolladores. Y al fin está lista para que podáis empezar a hacer pruebas con ella (todo obra de nuestro gran arquitecto pablasso). Creemos [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy es un gran día para toda la comunidad de desarrolladores entusiastas de <a href="http://www.minube.com">minube.com</a> !</p>
<p>Desde hace ya unos meses, hemos estado trabajando en la preparación de una <strong><a href="http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones">API de datos</a></strong> para desarrolladores. Y al fin <a href="http://blog.minube.com/liberamos-nuestra-api/">está lista</a> para que podáis empezar a hacer pruebas con ella (todo obra de nuestro gran arquitecto <a href="http://www.pablasso.com">pablasso</a>).<br />
Creemos ciegamente que la base de una gran comunidad es el contenido generado por el usuario, y que el gran valor de una comunidad está en la utilidad que se le dé a ese contenido. No queremos ser una gran base de datos de contenido relacionado con los viajes donde la gente va llenando con sus experiencias, fotos y videos de sus viajes, sino una gran comunidad donde aportar y consultar información sobre cualquier destino. ¿Y qué mejor manera, que poniendo a disposición de todos vosotros, todo ese contenido?</p>
<p>Muchas de las herramientas más populares e interesantes, se convierten en increibles aplicaciones mucho más ricas al permitir hacer un mashup con otras. (salvando las diferencias&#8230;) Como es el caso del propio <strong>Google Maps</strong>. A pesar de ser una herramienta increible, haber liberado su API ha permitido que aparecieran aplicaciones igualmente impresionantes como <a href="http://www.panoramio.com/">Panoramio</a>.<br />
Precisamente eso es lo que queremos !</p>
<p>Si eres desarrollador y crees que podrías desarrollar algo interesante aprovechando el contenido que te podemos ofrecer en minube, adelante !!<br />
La integración es muy sencilla (peticiones <a href="http://es.wikipedia.org/wiki/Representational_State_Transfer">REST</a> y resultados formateados en <a href="http://es.wikipedia.org/wiki/XML">XML</a>), la cantidad de contenido disponible sigue creciendo día a día, y por supuesto, usar nuestra API es totalmente gratuito.</p>
<p>Apenas hace unas horas que hemos anunciado la liberación de la API y ya hemos recibido unas cuantas solicitudes para usarla. Y aunque aún está en fase de pruebas, y esperamos poder seguir mejorandola con vuestra ayuda y en base a vuestras necesidades, estamos seguros de que no os decepcionará.</p>
<p><a href="http://www.minube.com/api">Empieza a usarla aquí</a><br />
Esperamos que la disfrutes !</p>
<p>Un saludo !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/en-minube-liberamos-nuestra-api-06-2009/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulación de strings de PHP codificadas en UTF-8</title>
		<link>http://www.fillito.com/blog/manipulacion-strings-php-utf8-03-2009</link>
		<comments>http://www.fillito.com/blog/manipulacion-strings-php-utf8-03-2009#comments</comments>
		<pubDate>Tue, 31 Mar 2009 18:56:17 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[strings]]></category>
		<category><![CDATA[utf-8]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=599</guid>
		<description><![CDATA[Esta semana me he encontrado con un problema que me dió muchos quebraderos de cabeza pero que por suerte llegué a una solución El problema surgía al manipular cadenas de caracteres en php codificadas en UTF-8 con funciones del tipo ucwords, strtoupper, etc... Al pasarlas por éstas funciones, algunos caracteres se corrompían, y se guardaban [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana me he encontrado con un problema que me dió muchos quebraderos de cabeza pero que por suerte llegué a una solución <img src='http://www.fillito.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
El problema surgía al manipular cadenas de caracteres en php codificadas en UTF-8 con funciones del tipo ucwords, strtoupper, etc...<br />
Al pasarlas por éstas funciones, algunos caracteres se corrompían, y se guardaban erroneamente.</p>
<p>Indagando un poco encontré la explicación a todos éstos problemas.<br />
Las funciones de manipulación de strings en PHP están programadas para trabajar con caracteres de 1 byte de longitud. De ésta manera, funciones como contar el número de caracteres que incluye una cadena (strlen) simplemente calcula el tamaño ocupado en memoria y divide por 1 byte. Todo esto se viene abajo al utilizar cadenas de caracteres codificadas con juegos de caracteres como UTF-8, en los que algunos caracteres pueden ocupar 2 o 3 bytes. Por lo tanto, muchas de las funciones típicas de trabajo con cadenas son peligrosas de usar si nuestros textos están codificados en UTF-8 y son susceptibles de contener éste tipo de caracteres de mayor tamaño, que al leer byte a byte, encontrará erroneamente los datos binarios correspondiente a dos (o tres) caracteres, en vez de uno.</p>
<p>Existe una lista de funciones "inseguras" al trabajar con cadenas con encodings que guarden caracteres de más de 1 byte. Son las siguientes :<code><br />
· ord<br />
</code><code> · </code><code>str_ireplace<br />
</code><code> · </code><code> str_pad<br />
</code><code> · </code><code> str_split<br />
</code><code> · </code><code> strcasecmp<br />
</code><code> · </code><code> strcspn<br />
</code><code> · </code><code> stristr<br />
</code><code> · </code><code> strlen<br />
</code><code> · </code><code> strpos<br />
</code><code> · </code><code> strrpos<br />
</code><code> · </code><code> strrev<br />
</code><code> · </code><code> strspn<br />
</code><code> · </code><code> strtolower<br />
</code><code> · </code><code> strtoupper<br />
</code><code> · </code><code> substr_replace</code><code><br />
</code><code> · </code><code> [l|r]trim </code> <span style="font-size:10px">(unicamente cuando se usa el segundo parametro)</span><br />
<code> · </code> <code>ucfirst<br />
</code><code> · </code><code> ucwords<br />
</code><br />
Si lo que necesitas es convertir toda la cadena a minúsculas (strtolower), a mayúsculas (strtoupper) o la primera letra de cada palabra a mayúsculas y el resto en minúsculas (ucwords), existe una alternativa que nos evitará tener que cambiar el encoding de nuestra cadena:</p>
<div class="igBar"><span id="lphp-2"><a href="#" onclick="javascript:showPlainTxt('php-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-2">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$string</span> = <a href="http://www.php.net/mb_convert_case"><span style="color:#000066;">mb_convert_case</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$string</span>, TIPO_ACCION, <span style="color:#FF0000;">"UTF-8"</span><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Donde TIPO_ACCION  puede tomar los  siguientes valores para obtener el resultado equivalente:  "<strong><code>MB_CASE_LOWER</code></strong>" (strtolower), "<strong><code>MB_CASE_UPPER</code></strong>" (strtoupper)  , "<strong><code>MB_CASE_TITLE</code></strong>" (ucwords)</p>
<p><strong><code>mb_convert_case</code></strong> es una función que permite la manipulación de los caracteres de una cadena de tipo multibyte.</p>
<p>Tienes muchas más <a href="http://es2.php.net/manual/en/ref.mbstring.php">funciones para cadenas multibyte</a>.</p>
<p>Un saludo !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/manipulacion-strings-php-utf8-03-2009/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Aceleradores de PHP + Instalación de xCache</title>
		<link>http://www.fillito.com/blog/aceleradores-php-instalacion-xcache-03-2009</link>
		<comments>http://www.fillito.com/blog/aceleradores-php-instalacion-xcache-03-2009#comments</comments>
		<pubDate>Tue, 24 Mar 2009 00:13:48 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[aceleradores php]]></category>
		<category><![CDATA[opcode]]></category>
		<category><![CDATA[xcache]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=544</guid>
		<description><![CDATA[Hace tiempo que llevo pensando en escribir un pequeño artículo sobre los Aceleradores de php. Y ésta semana, aprovechando que he instalado uno en una nueva máquina para hostear éste y algunos otros blogs más, me he animado a ello. Lo primero de todo, es entender qué es un Acelerador de php. Como su nombre [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo que llevo pensando en escribir un pequeño artículo sobre los Aceleradores de php. Y ésta semana, aprovechando que he instalado uno en una nueva máquina para hostear éste y algunos otros blogs más, me he animado a ello.</p>
<p>Lo primero de todo, es entender qué es un Acelerador de php.</p>
<p>Como su nombre bien indica, un acelerador de php es "algo" (ahora veremos qué..), que acelera nuestro código escrito en php. Si reflexionamos un poco llegaremos rápidamente a unas sencillas preguntas ¿Cómo puede hacer "algo" que nuestro código se ejecute más rápidamente? ¿Qué hace ésto que parece tan mágico? ¿Retoca nuestro codigo en tiempo real para optimizarlo? ¿Mágicamente hace que nuestro código consuma menos recursos? </p>
<p>Por supuesto que no...</p>
<p>La explicación es mucho más sencilla de lo que parece.<br />
Como bien sabemos, php no es un <a href="http://es.wikipedia.org/wiki/Lenguaje_compilado" target="_blank">lenguaje compilado</a>, sino un <a href="http://es.wikipedia.org/wiki/Lenguaje_interpretado" target="_blank">lenguaje interpretado</a> (script). Cuando nuestro servidor Apache, o un comando <a href="http://es2.php.net/features.commandline" target="_blank">CLI</a> llama al intérprete de php para que ejecute un determinado archivo, nuestro intérprete genera en tiempo real los <a href="http://es.wikipedia.org/wiki/C%C3%B3digo_de_operaci%C3%B3n" target="_blank">opcodes</a> necesarios para su ejecución. Cada vez que se llama a ejecutar uno de nuestros archivos, nuestro intérprete vuelve a compilar en tiempo real nuestros scripts, incluso cuando llamamos a un script que se haya ejecutado anteriormente. Es aquí donde entran en juego los Aceleradores de php. Su función es simplemente la de recubrir todo el proceso de compilación, guardar los estados compilados de nuestros scripts en memoria, y facilitar una interfaz automatizada que evalúa si es necesario compilar un script o si disponemos de una copia ya compilada en memoria. Osea, que un Acelerador de php, no es más que un "cacheador" de opcodes.<br />
Imaginaos cuánto tiempo y recursos ahorramos al evitar el compilado de toda nuestra home, o de nuestras páginas más visitadas.</p>
<p>La mejora de rendimiento es asombrosa, incluso podremos llegar a ver mejorado el rendimiento de carga de algunas páginas por 3.</p>
<p>Ésta es una de la mejoras de optimización más sencillas que podemos llevar a cabo en nuestro servidor web, y sin duda una de las mejores en relación dificultad de aplicación / mejoras claramente visibles obtenidas.</p>
<p>Existen muchos Aceleradores de php , como APC, eAccelerator, xCache , PHPA, ...<br />
Para gustos, colores. Seguro que encontrarás rápidamente un montón de comparativas, articulos a favor, en contra, y demás ...</p>
<p>Yo voy a explicar cómo instalar xCache (en una máquina Ubuntu). Por su extrema sencillez de instalación y excelente rendimiento.</p>
<p><span id="more-544"></span><span style="text-decoration: underline;"><strong>Instalación de xCache en Ubuntu</strong></span></p>
<p>Lo primero que vamos a hacer, descargarnos la última versión de xcache desde su <a href="http://xcache.lighttpd.net/" target="_blank">web oficial</a>. (En el momento de escribir ésto, la última versión era la 1.2.2. Para futuras versiones sustituir el archivo por su versión actual)<br/></p>
<div class="igBar"><span id="lcode-11"><a href="#" onclick="javascript:showPlainTxt('code-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-11">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">wget http:<span style="color:#FF9933; font-style:italic;">//xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz </span></div>
</li>
</ol>
</div>
</div>
</div>
<p>
Descomprimimios nuestro archivo recién descargado.<br/></p>
<div class="igBar"><span id="lcode-12"><a href="#" onclick="javascript:showPlainTxt('code-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-12">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">tar -zxf xcache-*.<span style="">tar</span>.<span style="">gz</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">cd xcache </div>
</li>
</ol>
</div>
</div>
</div>
<p>
El siguiente paso es preparar nuestro xcache para su compilación, compilarlo e instalarlo<br/></p>
<div class="igBar"><span id="lcode-13"><a href="#" onclick="javascript:showPlainTxt('code-13'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-13">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">phpize</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">./configure --enable-xcache</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">make</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">sudo make install </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p><strong>Nota:</strong> phpize es un script de shell que prepara las extensiones de php para su correcta compilación. Si no se encuentra instalado, simplemente instala el paquete php5-dev, que lo incluye<br/></p>
<div class="igBar"><span id="lcode-14"><a href="#" onclick="javascript:showPlainTxt('code-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-14">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">sudo apt-get install php5-dev </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Para finalizar ya solo queda configurar nuestro php.ini. Simplemente concatenamos el archivo de configuración por defecto a nuestro php.ini, lo editamos, y nos aseguramos de que la ruta extensión esté apuntando correctamente. Posteriormente reiniciamos el servicio de Apache<br />
<br/></p>
<div class="igBar"><span id="lcode-15"><a href="#" onclick="javascript:showPlainTxt('code-15'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-15">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">cat xcache.<span style="">ini</span> &gt;&gt; /etc/php5/apache2/php.<span style="">ini</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">nano /etc/php5/apache2/php.<span style="">ini</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">/etc/init.<span style="">d</span>/apache2 restart </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>En mi caso la extensión estaba en /usr/lib/php5/20060613/xcache.so.<br/></p>
<div class="igBar"><span id="lcode-16"><a href="#" onclick="javascript:showPlainTxt('code-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-16">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">zend_extension = /usr/lib/php5/<span style="color:#800000;color:#800000;">20060613</span>/xcache.<span style="">so</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
<br/><br/><br />
<!--more--><span style="text-decoration: underline;"><strong>Instalar Interfaz Web</strong></span></p>
<p>Una de las cosas buenas que tiene xCache, es que dispone de una interfaz web, que además de confirmarnos que xcache está correctamente instalado (una razón más que válida para instalarla <img src='http://www.fillito.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), nos dará unas estadísticas bastante detalladas sobre el cacheo de opcodes.<br />
Para instalarlo no hay más que copiar la carpeta admin que encontraremos dentro de nuestro xcache recien descargado y descomprimido, y pegarla en nuestra raiz de apache.<br/></p>
<div class="igBar"><span id="lcode-17"><a href="#" onclick="javascript:showPlainTxt('code-17'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-17">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">cp -a admin<span style="color:#008000;">/* /var/www/xcache-admin/ </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Podemos (y debemos <img src='http://www.fillito.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) configurar nuestro acceso a la interfaz de xcache desde nuestro php.ini asignando los valores a las opciones xcache.admin.user y xcache.admin.pass (esta última debe ir codificada en md5)<br/></p>
<div class="igBar"><span id="lcode-18"><a href="#" onclick="javascript:showPlainTxt('code-18'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-18">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">xcache.<span style="">admin</span>.<span style="">user</span> = <span style="color:#CC0000;">"admin"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">xcache.<span style="">admin</span>.<span style="">pass</span> = <span style="color:#CC0000;">"5f4dcc3b5aa765d61d8327deb882cf99"</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Después de ésto ya no queda más que reiniciar nuestro servicio de Apache y probar que todo ha ido bien y nuestro xcache está cacheando correctamente. Nuestra url debería ser algo parecido a www.dominio.com/xcache-admin y estaría protegido por contraseña.<br />
<br/><br/><br />
Bueno, espero que sea útil.<br />
Un saludo !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/aceleradores-php-instalacion-xcache-03-2009/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Averiguar una clase y sus metodos en php</title>
		<link>http://www.fillito.com/blog/averiguar-una-clase-y-sus-metodos-en-php-12-2008</link>
		<comments>http://www.fillito.com/blog/averiguar-una-clase-y-sus-metodos-en-php-12-2008#comments</comments>
		<pubDate>Tue, 09 Dec 2008 00:51:47 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[funciones útiles]]></category>
		<category><![CDATA[objetos]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=413</guid>
		<description><![CDATA[Si alguna vez has tenido que lidiar con código ajeno, o has integrado algún paquete de clases de terceras partes, o trabajado con algún API que te devuelva los datos en forma de objeto; probablemente hayas tenido la necesidad de conocer los métodos disponibles para interactuar con un objeto. Si a eso le sumamos una [...]]]></description>
			<content:encoded><![CDATA[<p>Si alguna vez has tenido que lidiar con código ajeno, o has integrado algún paquete de clases de terceras partes, o trabajado con algún API que te devuelva los datos en forma de objeto; probablemente hayas tenido la necesidad de conocer los métodos disponibles para interactuar con un objeto. Si a eso le sumamos una documentación pobre de las clases que vamos a usar, estamos ante un buen dolor de cabeza y unas cuantas horas de tiempo perdido estudiando el código para poder trabajar.</p>
<p>Éste fin de semana tuve ese problema, y buscando un poco, encontré dos métodos de php que se han convertido en imprescindibles para mí.</p>
<p>La primera función nos permite conocer el nombre de la clase de un objeto</p>
<div class="igBar"><span id="lphp-23"><a href="#" onclick="javascript:showPlainTxt('php-23'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-23">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">string <a href="http://www.php.net/get_class"><span style="color:#000066;">get_class</span></a><span style="color:#006600; font-weight:bold;">&#40;</span>OBJECT<span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Que pasándole como parámetro el objeto, nos devolverá un string con el nombre de la clase.</p>
<p>La segunda es si cabe aún más útil, ya que para una clase, nos devuelve un array con la lista de metodos públicos disponibles.</p>
<div class="igBar"><span id="lphp-24"><a href="#" onclick="javascript:showPlainTxt('php-24'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-24">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/array"><span style="color:#000066;">array</span></a> <a href="http://www.php.net/get_class_methods"><span style="color:#000066;">get_class_methods</span></a><span style="color:#006600; font-weight:bold;">&#40;</span>string class_name<span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Imaginad ahora qué bonito lo que obtenemos, si combinamos éstos dos métodos:</p>
<div class="igBar"><span id="lphp-25"><a href="#" onclick="javascript:showPlainTxt('php-25'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-25">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$objetoMisterioso</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$metodosDisponibles</span>=<a href="http://www.php.net/get_class_methods"><span style="color:#000066;">get_class_methods</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/get_class"><span style="color:#000066;">get_class</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$objetoMisterioso</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#000066;">print_r</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$metodosDisponibles</span><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Que nos devolverá algo parecido a:</p>
<div class="igBar"><span id="lcode-26"><a href="#" onclick="javascript:showPlainTxt('code-26'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-26">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Array<span style="color:#006600; font-weight:bold;">&#40;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#800000;color:#800000;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>=&gt;getMethod</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#800000;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>=&gt;setMethod</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#800000;color:#800000;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>=&gt;delElement</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Realmente útil y nos ahorrará mucho tiempo cuando trabajemos con objetos que no conocemos del todo bien.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/averiguar-una-clase-y-sus-metodos-en-php-12-2008/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Conference 08 &#8211; Barcelona</title>
		<link>http://www.fillito.com/blog/php-conference-08-barcelona-09-2008</link>
		<comments>http://www.fillito.com/blog/php-conference-08-barcelona-09-2008#comments</comments>
		<pubDate>Sun, 28 Sep 2008 20:01:39 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[deathmonger]]></category>
		<category><![CDATA[Minube]]></category>
		<category><![CDATA[munix]]></category>
		<category><![CDATA[php conference]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=311</guid>
		<description><![CDATA[Éste fin de semana asistimos ivan, munix , alex y yo al PHP Conference 08 que se celebraba en Cornellá , Barcelona. Después de un accidentadísimo viaje en el que pillamos un tren de 9 horas desde Madrid que pensábamos teníamos camas, llegamos a Barcelona. Pillamos el metro hasta Cornellá caminamos hasta llegar a estar [...]]]></description>
			<content:encoded><![CDATA[<p><a title="PHP Conference 08 - Barcelona por fillito, en Flickr" href="http://www.flickr.com/photos/fillito/2895468977/"><img src="http://farm4.static.flickr.com/3211/2895468977_c5ef674b21_m.jpg" border="0" alt="PHP Conference 08 - Barcelona" hspace="5" width="240" height="161" align="left" /></a>Éste fin de semana asistimos <a href="http://www.twitter.com/ugarte">ivan</a>, munix , <a href="http://www.deluhoo.com">alex</a> y yo al PHP Conference 08 que se celebraba en Cornellá , Barcelona.</p>
<p>Después de un accidentadísimo viaje en el que pillamos un tren de 9 horas desde Madrid que <strong>pensábamos</strong> teníamos camas, llegamos a Barcelona. Pillamos el metro hasta Cornellá caminamos hasta llegar a estar a unos 50 metros del Citylab, donde se celebraba el evento. Al llegar a esa altura, por alguna extraña razón pensamos : "No, ... creo que por aquí no es. Vamos a dar la vuelta y tomar otro camino". Creo que llegamos a caminar unos 4 kilómetros y a tirar a la basura la hora de antelación con la que habíamos llegado. Entonces llamamos a un taxi que nos llevó al Citylab. Imaginaos nuestras caras cuando nos dimos cuenta lo cerca que estubimos de allí.</p>
<p>Después de acreditarnos, entramos a tiempo a la primera charla de Marcus Bointon sobre Emailing en PHP. Fué bastante entretenida. Nos contaron qué librerías había disponible para el envio de mails desde php y sus características. Aunque luego la explicación detallada, trucos, consejos y demás, estuvo enfocada al uso de phpmailer.<br />
Luego fuimos a una interesantísima charla llamada "<a href="http://www.bierkandt.org/php_barcelona2008.pdf">How to Pimp High Volume websites</a>" por <a href="http://www.bierkandt.org/">Jens Bierkandt</a>,  uno de los desarrolladores de Softonic. Esta es la charla que más me gustó y a la que creo que más pro,vecho sacaré. Nos hablaron tanto de cómo organizar una arquitectura basada en balanceo de servidores web, replicación de servidores de bases de datos, cachés, uso de memcached, utilidades de diagnóstico y seguimiento , etc...<br />
Me alegró saber que todas las acciones que habiamos llevado a cabo en minube nos las recomendaron allí, pero también me alegró conocer nuevas formas adicionales que aún no habíamos llevado a cabo.</p>
<p>Luego asistimos a la ponencia de Zoë Slattery sobre indexación y motores de búsqueda en php. Ésta me interesó menos, ya que no se habló sobre metodologías a seguir, o formas de desarrollar un buscador , sino del comportamiento interno de php a la hora de analizar formalmente los textos, extracción de tokens , etc...</p>
<p>La última de las charlas fué la de XDebug por Derick Rethans, donde nos presentaron la herramienta de debuggin y nos explicaron cómo configurarla, y ponerla en práctica. Además de algunos trucos, herramientas complementarias e incluso extensiones de firefox para trabajar con el debuggin de XDebug.</p>
<p>Me perdí una charla sobre SQLite 3 , ya que estaba un poco cansado y aproveché para conectarme a internet un rato , y cargar el portatil (que durante el viaje escasearon mucho los enchufes)</p>
<p>A las 6 o así acabó todo con la keynote de despedida y un sorteo de algunos regalos (no me llevé nada <img src='http://www.fillito.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).<br />
Después de eso ya sólo nos quedó otras 9 horas de viaje de vuelta en el tren Estrella de Renfe ... que dudo vuelva a coger en mi vida.<br />
Si queréis podeis ver algunas de <a href="http://www.flickr.com/photos/fillito/sets/72157607560034085/">mis fotos del viaje y la conferencia</a>, y <a href="http://www.flickr.com/photos/deathmonger/sets/72157607557500511/">algunas otras de Alex</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/php-conference-08-barcelona-09-2008/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Developer Day 08&#8242;</title>
		<link>http://www.fillito.com/blog/google-developer-day-08-09-2008</link>
		<comments>http://www.fillito.com/blog/google-developer-day-08-09-2008#comments</comments>
		<pubDate>Sun, 28 Sep 2008 18:26:06 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Minube]]></category>
		<category><![CDATA[nvivo]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=308</guid>
		<description><![CDATA[El jueves pasado fué el Google Developer Day 08' en el Parque de Atracciones de Madrid. Y cómo no ? allí estuvimos. Junto a los chicos de nvivo, alex e ivan, me acredité a a las 9 de la mañana. Y, después de unos regalitos de Google (un cuaderno, un boli , publicidad y un [...]]]></description>
			<content:encoded><![CDATA[<p>El jueves pasado fué el Google Developer Day 08' en el Parque de Atracciones de Madrid. Y cómo no ? allí estuvimos.</p>
<p>Junto a los chicos de <a href="http://www.nvivo.es">nvivo</a>, <a href="http://www.deluhoo.com">alex</a> e ivan, me acredité a a las 9 de la mañana. Y, después de unos regalitos de Google (un cuaderno, un boli , publicidad y un muñequito pendrive), nos dirigieron a una pequeña carpa donde nos ofrecieron un pequeño desayuno.<br />
Nos dieron una pequeña charla introductoria de bienvenida, y ya de allí nos dirigimos a los distintos talleres y conferencias.</p>
<p>Yo asistí a la de GEO, Google Web Toolkit , Open Social, Consejos para el desarrollo de start-ups, y Android.</p>
<p>Me quedo sobre todo con las dos primeras. Nos explicaron todas las novedades que habían sacado en las últimas versiones, y me sirvió para sacar ideas para implementar en minube.<br />
Me quedé totalmente boquiabierto con la potencia y posibilidades que te ofrece GWT. Creo que en las próximas semanas le echaré un ojo más a fondo y probaré qué cosillas se pueden hacer.</p>
<p>Otro de los grandes momentos del día, fué la ponencia de <a href="http://www.eduardomanchon.com/">Eduardo Manchón</a> de panoramio sobre el desarrollo de producto para start-ups. Tomé muchas ideas de los consejos que nos proponía Eduardo, y al final de la charla pude hablar con él personalmente y saludarle.</p>
<p>Después de todas las ponencias fué el acto de despedida. Donde entregaron los premios a los proyectos ganadores de los talleres, de los que mi amigo <a title="Gafeman" href="http://www.viciao2k3.net">gafeman</a> era uno de los gandores.<br />
Poco después, Google nos tenía organizada una pequeña fiesta con música, futbolines, máquinas recreativas, aperitivos y barra libre !! Además nos abrieron gratis la atracción "La Lanzadera" durante una hora.</p>
<p>La verdad es que un 10 para la organización, que nos ofreció un fantástico día de charlas interesantísimas, nos dió de comer y beber gratis, y la oportunidad de conocer y charlar con los ingenieros y excepcionales ponentes.</p>
<p>El próximo año espero repetir <img src='http://www.fillito.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/google-developer-day-08-09-2008/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evitar links externos con Amazon S3</title>
		<link>http://www.fillito.com/blog/evitar-links-externos-con-amazon-s3-09-2008</link>
		<comments>http://www.fillito.com/blog/evitar-links-externos-con-amazon-s3-09-2008#comments</comments>
		<pubDate>Sun, 14 Sep 2008 18:47:21 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[links externos]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=287</guid>
		<description><![CDATA[Si hemos elegido Amazon S3 como sistema de almacenamiento virtual , quizás nos interese tener almacenados archivos que se puedan descargar libremente por cualquier usuario, y que además puedan ser linkados desde cualquier sitio. Pero en la mayoría de los casos tendremos almacenados nuestros archivos y no nos gustará que nadie nos enlace directamente y [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fillito.com/blog/wp-content/uploads/100014192753_v46777512_.gif"><img class="alignleft size-medium wp-image-265" style="border: 0pt none; margin: 5px;" title="Evitar Links Externos con Amazon S3" src="http://www.fillito.com/blog/wp-content/uploads/100014192753_v46777512_.gif" alt="" width="170" height="69" /></a>Si hemos elegido Amazon S3 como sistema de almacenamiento virtual , quizás nos interese tener almacenados archivos que se puedan descargar libremente por cualquier usuario, y que además puedan ser linkados desde cualquier sitio. Pero en la mayoría de los casos tendremos almacenados nuestros archivos y no nos gustará que nadie nos enlace directamente y tener que soportar los gastos de transferencia y almacenamiento por él.</p>
<p>Voy a explicar cómo, con un sencillo script en php conseguiremos que nuestros archivos de S3 estén totalmente protegidos y que sólo puedan ser accesibles desde nuestro dominio.</p>
<p>Lo primero de todo, es conocer dos características que Amazon nos prové con sus <a title="S3 API Docs : Acojonante que la última actualización sea del 03 de 2006" href="http://docs.amazonwebservices.com/AmazonS3/2006-03-01/">APIs</a>:<br />
- Los ACL (Access Control List) : que nos permite definir los permisos de lectura-escritura-ejecución de nuestros bucket y objetos.<br />
- Las URLs Firmadas : que nos permite acceder temporalmente a nuestros archivos protegidos, a través de una url que incluye una firma y un tiempo de expiración de los permisos. Éstas URLs las podremos generar con nuestro script, y llevarán como parámetro nuestra firma generada en tiempo de ejecución, que lleva implicita el tiempo de caducidad de la url.</p>
<p>La primera medida es aplicar permisos exclusivo de lectura para nuestro usuario (usando los ACLs) a todos los archivos que queramos proteger, para que sea imprescindible una validación al acceder a ellos.<br />
Para generar nuestro script , necesitaremos echar mano de la clase <a title="Crypt/HMAC" href="http://pear.php.net/package/Crypt_HMAC/download">Crypt/HMAC</a> para construir el hash en <a href="http://es.wikipedia.org/wiki/SHA">sha1</a> que Amazon S3 requiere.<br />
Lo primero será crear nuestra función para  generar nuestra <a title="S3 Authentication" href="http://docs.amazonwebservices.com/AmazonS3/2006-03-01/S3_Authentication.html">firma</a>:</p>
<div class="igBar"><span id="lphp-30"><a href="#" onclick="javascript:showPlainTxt('php-30'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-30">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">require_once</span> <span style="color:#FF0000;">'Crypt/HMAC.php'</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> hex2b64<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$str</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$raw</span> = <span style="color:#FF0000;">''</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">for</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$i</span>=<span style="color:#CC66CC;color:#800000;">0</span>; <span style="color:#0000FF;">$i</span> &amp;lt;strlen<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$str</span><span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color:#0000FF;">$i</span>+=<span style="color:#CC66CC;color:#800000;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$raw</span> .= <a href="http://www.php.net/chr"><span style="color:#000066;">chr</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/hexdec"><span style="color:#000066;">hexdec</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/substr"><span style="color:#000066;">substr</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$str</span>, <span style="color:#0000FF;">$i</span>, <span style="color:#CC66CC;color:#800000;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">return</span> <a href="http://www.php.net/base64_encode"><span style="color:#000066;">base64_encode</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$raw</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> makeSig<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$str</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$secretKey</span>=<span style="color:#FF0000;">"Llave secreta que nos proporciona Amazon para nuestra cuenta"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$hasher</span> =&amp; <span style="color:#000000; font-weight:bold;">new</span> Crypt_HMAC<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$secretKey</span>, <span style="color:#FF0000;">"sha1"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$signature</span> = hex2b64<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$hasher</span>-&amp;gt;hash<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$str</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">return</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$signature</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Lo siguiente, será crearnos una función para construir nuestra URL firmada :</p>
<div class="igBar"><span id="lphp-31"><a href="#" onclick="javascript:showPlainTxt('php-31'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-31">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> getSignedURL<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$bucket</span>, <span style="color:#0000FF;">$key</span>, <span style="color:#0000FF;">$expires</span>=<span style="color:#CC66CC;color:#800000;">120</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$accessKeyId</span>=<span style="color:#FF0000;">"accessKeyId que nos proporciona Amazon con nuestra cuenta"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$expires</span> = <a href="http://www.php.net/time"><span style="color:#000066;">time</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> + <span style="color:#0000FF;">$expires</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$resource</span> = <span style="color:#0000FF;">$bucket</span>.<span style="color:#FF0000;">"/"</span>.<a href="http://www.php.net/urlencode"><span style="color:#000066;">urlencode</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$key</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$stringToSign</span> = <span style="color:#FF0000;">"GETnnn$expiresn/$resource"</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$signature</span> = <a href="http://www.php.net/urlencode"><span style="color:#000066;">urlencode</span></a><span style="color:#006600; font-weight:bold;">&#40;</span>makeSig<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$stringToSign</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$signedUrl</span>=<span style="color:#FF0000;">"http://s3.amazonaws.com/$resource?AWSAccessKeyId=$accessKeyId&amp;Expires=$expires&amp;Signature=$signature"</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">return</span> <span style="color:#0000FF;">$signedUrl</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ésta función nos devolverá la url firmada, que estará disponible durante el tiempo (en segundos) que hayamos establecido en el parametro $expires (120seg por defecto)</p>
<p>Ahora ya sólamente nos falta un script que nos lance al contenido, pero que nos proteja de links externos a nuestro dominio.<br />
Para ésto simplemente comprobaremos si existe el campo HTTP_REFERER en nuestra variable $_SERVER , que nos indicará que estamos accediendo a ésta url desde otra url de referencia , y que nuestro dominio (extraido desde $_SERVER['HTTP_HOST']) esté contenido en él.</p>
<div class="igBar"><span id="lphp-32"><a href="#" onclick="javascript:showPlainTxt('php-32'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-32">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> get_amazon_url<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$amazon_bucket</span>,<span style="color:#0000FF;">$amazon_object</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#616100;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/isset"><span style="color:#000066;">isset</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$_SERVER</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'HTTP_REFERER'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> &amp;&amp; <a href="http://www.php.net/strstr"><span style="color:#000066;">strstr</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$_SERVER</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'HTTP_REFERER'</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<span style="color:#0000FF;">$_SERVER</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#FF0000;">'HTTP_HOST'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>&nbsp; &nbsp;<span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$url</span>=getSignedURL<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$amazon_bucket</span>,<span style="color:#0000FF;">$amazon_object</span>,<span style="color:#CC66CC;color:#800000;">60</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/header"><span style="color:#000066;">header</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'Location:'</span>.<span style="color:#0000FF;">$url</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#616100;">else</span><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/echo"><span style="color:#000066;">echo</span></a> <span style="color:#FF0000;">'Éste contenido ha sido enlazado ilegalmente'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Al llamar a ésta función, seremos automáticamente redirigidos al contenido en amazon siempre que el link provenga desde nuestro mismo dominio. Por supuesto, si quisieramos permitir el acceso desde una determinada lista de dominios, simplemente tendríamos que modificar un poco la condición if , para que compruebe que cada uno de los dominios están incluido en el HTTP_REFERER.</p>
<p>Espero que sea útil.<br />
Un Saludo !!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/evitar-links-externos-con-amazon-s3-09-2008/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Operadores &gt; en PHP (desplazamientos binarios)</title>
		<link>http://www.fillito.com/blog/operadores-en-php-desplazamientos-binarios-09-2008</link>
		<comments>http://www.fillito.com/blog/operadores-en-php-desplazamientos-binarios-09-2008#comments</comments>
		<pubDate>Wed, 10 Sep 2008 21:11:25 +0000</pubDate>
		<dc:creator>fillito</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[operadores aritméticos]]></category>

		<guid isPermaLink="false">http://www.fillito.com/blog/?p=271</guid>
		<description><![CDATA[Esta semana me he puesto ya en serio a prepararme para la certificación Zend de Ingeniero PHP. Entre el temario del primer capítulo, encontré dos operadores que jamás había usado y me llamaron mucho la atención porque ni siquiera los había visto usados en algún otro script php. Me sonaban de cuando había estudiado C [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana me he puesto ya en serio a prepararme para la certificación Zend de Ingeniero PHP.</p>
<p>Entre el temario del primer capítulo, encontré dos operadores que jamás había usado y me llamaron mucho la atención porque ni siquiera los había visto usados en algún otro script php. Me sonaban de cuando había estudiado C en la universidad, y efectivamente hacen lo mismo.</p>
<p>Los operadores "<strong>&lt;&lt;</strong>" y "<strong>&gt;&gt;</strong>" realizan un desplazamiento binario de n posiciones, hacia la izquierda o a la derecha respectivamente.</p>
<p>Para el que no sepa exáctamente qué es un desplazamiento binario, lo explico:</p>
<p>La representación binaria de 5 (decimal) es 101. Un desplazamiento binario nos sirve para desplazar, a la izquierda o a la derecha, sus dígitos.  Por lo que un desplazamiento binario de 2 posiciones sobre el numero 5 nos daría como resultado el binario 10100 (20 en decimal).<br />
Su uso puede ser bastante útil y extremadamente eficiente cuando queremos multiplicar un número por alguna potencia de dos, ya que, internamente, el desplazamiento binario será mucho más rápido y requerirá menos operaciones que la multiplicación.</p>
<p>Su sintaxis es muy sencilla, y como cualquier otro operador aritmético, su asociatividad de izquierda.</p>
<div class="igBar"><span id="lphp-34"><a href="#" onclick="javascript:showPlainTxt('php-34'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-34">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$a</span> &amp;lt;&amp;lt; n; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Donde n es el número de desplazamientos que queremos hacer hacia la izquierda.</p>
<p><strong>Nota adicional</strong>: si pretendemos usar el desplazamiento binario tenemos que tener cierto cuidado y conocimiento de las características técnicas de la máquina en la que estamos corriendo el script. Ya que si estamos utilizando una máquina de 32bits , los datos se almacenarán, como es lógico, en palabras de 32 bits, y si intentamos realizar un desplazamiento binario de 32 posiciones, obtendremos como resultado un estupendo overflow.<br />
Por lo que si queremos multiplicar por potencias de 2 , tened cuidado de cuántas posiciones desplazais, ya que a veces os convendrá más utilizar la función <strong>pow(</strong>n,m<strong>)</strong>;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fillito.com/blog/operadores-en-php-desplazamientos-binarios-09-2008/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

