<?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>pon css en tu vida! &#187; PHP</title>
	<atom:link href="http://blog.joanfernandez.es/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.joanfernandez.es</link>
	<description>css, html, javascript, php y mucho mas...</description>
	<lastBuildDate>Fri, 23 Jul 2010 12:28:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Gestión de incidencias en Eclipse con Mantis y Mylyn</title>
		<link>http://blog.joanfernandez.es/2009/12/gestion-de-incidencias-en-eclipse-con-mantis-y-mylyn/</link>
		<comments>http://blog.joanfernandez.es/2009/12/gestion-de-incidencias-en-eclipse-con-mantis-y-mylyn/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 06:30:12 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Cómo se hizo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Bug Tracking]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Mantis]]></category>
		<category><![CDATA[Mylyn]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=331</guid>
		<description><![CDATA[A raiz del post de Brandon Savage &#8220;Why tracking bugs in personal projects matters&#8220;, he decidido seguir su recomendación y montar mi propio Bug Tracker para mis proyectos personales.
A través de los comentarios he conocido Mylyn, una herramienta para integrar los gestores de incidencias en Eclipse, el IDE que utilizo para desarrollar.
Para completar el círculo, [...]]]></description>
			<content:encoded><![CDATA[<p>A raiz del post de Brandon Savage &#8220;<a title="Why tracking bugs in personal projects matters" href="http://www.brandonsavage.net/why-tracking-bugs-in-personal-projects-matters/" target="_self">Why tracking bugs in personal projects matters</a>&#8220;, he decidido seguir su recomendación y montar mi propio Bug Tracker para mis proyectos personales.</p>
<p>A través de los comentarios he conocido <a title="Mylyn para Eclipse" href="http://www.eclipse.org/mylyn/">Mylyn</a>, una herramienta para integrar los gestores de incidencias en Eclipse, el IDE que utilizo para desarrollar.</p>
<p>Para completar el círculo, y como Bug Tracker utilizaré <a title="Mantis Bug Tracker" href="http://www.mantisbt.org/">Mantis</a>, un gestor de incidencias desarrollado en PHP que utiliza MySQL como motor de bases de datos. Podría haberme decantado por <a title="Bugzilla" href="http://www.bugzilla.org/">Bugzilla</a>, <a title="JIRA Bug Tracking" href="http://www.atlassian.com/software/jira/">Jira</a> o <a title="Trac Bug Tracker" href="http://trac.edgewall.org/">Trac</a>, pero el hecho de conocer ya el funcionamiento de Mantis, así como que esté desarrollado en PHP, han decantado la balanza. Quizás no sea el mejor, pero para lo que necesito por el momento, cumplirá su función.</p>
<h2>La instalación</h2>
<h3>Instalando Mantis</h3>
<p>Empezaremos instalando el gestor de incidencias Mantis. Para ello, nos bajamos la última versión estable del proyecto (en estos momentos, la 1.1.8), desde aquí: <a title="Descarga MantisBT" href="http://www.mantisbt.org/download.php">http://www.mantisbt.org/download.php</a></p>
<p>La instalación de Mantis es sencilla:</p>
<p>1. Creamos la base de datos que utilizará la aplicación en MySQL.</p>
<p>2. Modificamos el archivo <strong>config_inc.php.sample</strong>, concretamente a partir de la línea 40:</p>
<pre class="brush: php;">
# --- database variables ---------

# set these values to match your setup
$g_hostname      = &quot;localhost&quot;;
$g_db_username   = &quot;mantisdbuser&quot;;
$g_db_password   = &quot;&quot;;
$g_database_name = &quot;bugtracker&quot;;
$g_db_type       = &quot;mysql&quot;;

# --- email variables -------------
$g_administrator_email  = 'administrator@example.com';
$g_webmaster_email      = 'webmaster@example.com';

# the &quot;From: &quot; field in emails
$g_from_email           = 'noreply@example.com';

# the return address for bounced mail
$g_return_path_email    = 'admin@example.com';
</pre>
<p>Las variables <strong>$g_hostname</strong>, <strong>$g_db_username</strong>, <strong>$g_db_password</strong> y <strong>$g_database_name</strong>, son las típicas de cualquier configuración para conectar con MySQL. <strong>$g_db_type</strong> por su parte, lo dejaremos tal cual está, ya que por el momento tan solo soporta <em>mysql</em>.</p>
<p>Las cuentas de email de las líneas inferiores, las configuraremos al gusto, para el envío-recepción de los emails correspondientes.</p>
<p>3. Una vez finalizada la modificación de este archivo, guardamos los cambios y lo renombramos. Quitaremos el <em>.sample</em> del final, para quedarnos tan solo con <strong>config_inc.php</strong>.</p>
<p>4. Ya hemos terminado la configuración. Ahora tan solo tendremos que seguir los pasos de la instalación, que se realiza desde <strong><em>http://servidor-mantis.com/admin/install.php</em></strong>.</p>
<p>5. Por último, y como medida de seguridad, es recomendable eliminar del servidor la carpeta <em><strong>admin</strong></em>.</p>
<h3>Instalando Mylyn en Eclipse</h3>
<p>El siguiente paso es instalar Mylyn en Eclipse. Como siempre, nos vamos al menú <em>Help &gt; Install New Software</em>, y añadimos esta url: <a href="http://download.eclipse.org/tools/mylyn/update/e3.4/">http://download.eclipse.org/tools/mylyn/update/e3.4/</a>. Seleccionamos los complementos deseados (en<em> Mylyn Integration</em> podéis desmarcar el de C/C++ y Java si nos los vais a necesitar) y continuamos hasta finalizar la instalación. Reiniciamos Eclipse y seguimos</p>
<h3>Conectando Mylyn con Mantis</h3>
<p>Para acabar, instalaremos el plugin <a title="Mylyn-Matis" href="http://sourceforge.net/apps/mediawiki/mylyn-mantis/index.php?title=Main_Page">Mylyn-Mantis</a>, necesario para que Mylyn reconozca las incidencias generadas en Mantis. Para ello, seguimos los mismos pasos que hemos realizado para instalar Mylyn, recogiendo los paquetes necesarios de esta url: <a title="Mylyn-Matis para Eclipse" href="http://mylyn-mantis.sourceforge.net/eclipse/update/">http://mylyn-mantis.sourceforge.net/eclipse/update/</a>. Instalamos el conector y volvemos a reiniciar Eclipse.</p>
<h2>Importar las incidencias de Mantis a Eclipse</h2>
<p>Ya solo nos queda conectar Mylyn con el servidor donde hemos instalado Mantis. Para ello, mostramos el panel Task List en Eclipse desde <em>Window &gt; Show View &gt; Other</em>, y dentro de la carpeta Tasks, encontraremos Task List. Es importante no confundir este panel con el propio de Eclipse, Tasks, ya que no tienen la misma utilidad. El nativo de Eclipse recoge los TO-DO, DONE, etc. que marcamos en el código.</p>
<p><img class="aligncenter size-full wp-image-345" title="new-query" src="http://blog.joanfernandez.es/wp-content/uploads/2009/12/new-query.jpg" alt="new-query" width="428" height="319" /></p>
<p>Pinchamos con el botón derecho sobre el panel, y seleccionamos <em>New &gt; Query</em>.</p>
<p style="text-align: center;"><img class="aligncenter" title="add-task-repo" src="http://blog.joanfernandez.es/wp-content/uploads/2009/12/add-task-repo.jpg" alt="add-task-repo" width="543" height="591" /></p>
<p>A continuación, seleccionamos <em>Add Task Repository</em>, y seleccionamos el de Mantis.</p>
<p>En la ventana que nos aparece a continuación, seleccionaremos en el desplegable Server la opción <em>Mantis Connector 1.1.0 or greater, </em>modificamos la url que nos aparecerá en su lugar (<em>http://your.domain.com/api/soap/mantisconnect.php)</em> por la de nuestro servidor, y terminamos de configurar el resto de parámetros (incluido nuestro usuario de Mantis).<em> </em></p>
<p><img class="aligncenter size-full wp-image-352" title="query-mylyn" src="http://blog.joanfernandez.es/wp-content/uploads/2009/12/query-mylyn.jpg" alt="query-mylyn" width="528" height="574" /></p>
<p>Para finalizar, le damos un nombre a la Query, seleccionamos el proyecto creado en Mantis del cual queremos importar las incidencias, y seleccionamos un filtro (lo más lógico es elegir uno que devuelva todas las incidencias de ese proyecto abiertas asignadas a nuestro usuario).</p>
<p>Para crear un filtro, podemos hacerlo desde el propio Mantis realizando una búsqueda avanzada.</p>
<p>Finalizamos el proceso, y ya es el propio Mylyn quien se encarga de importar todas las incidencias que cumplan el filtro a nuestro Eclipse.</p>
<p>Ahora tan solo nos queda trastear con él para explotar todas sus posibilidades.</p>
<p>Seguiremos informando <img src='http://blog.joanfernandez.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/12/gestion-de-incidencias-en-eclipse-con-mantis-y-mylyn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seguridad en Zend Framework</title>
		<link>http://blog.joanfernandez.es/2009/07/seguridad-en-zend-framework/</link>
		<comments>http://blog.joanfernandez.es/2009/07/seguridad-en-zend-framework/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 09:13:49 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=321</guid>
		<description><![CDATA[Últimamente, he estado poniéndome al día en todo lo que se refiere a la seguridad a la hora de programar una aplicación web. Temas como el session fixation, SQL injection, etc&#8230;
En programania, Luis Artola ha publicado el enlace a una presentación de Stefan Esser acerca de la seguridad en Zend Framework que corresponde a la [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente, he estado poniéndome al día en todo lo que se refiere a la seguridad a la hora de programar una aplicación web. Temas como el <a title="Session Fixation" hreflang="en-US" href="http://en.wikipedia.org/wiki/Session_fixation">session fixation</a>, <a title="SQL Injection" hreflang="es-ES" href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL">SQL injection</a>, etc&#8230;</p>
<p>En <strong>programania</strong>, Luis Artola ha publicado el enlace a una presentación de <a title="Stefan Esser" href="http://www.suspekt.org/">Stefan Esser</a> acerca de la <a title="Seguridad y Zend Framework" href="http://www.programania.net/php/seguridad-y-zend-framework/">seguridad en Zend Framework</a> que corresponde a la presentación que ofreció en la <a title="Dutch PHP Conference" hreflang="en-US" href="http://www.phpconference.nl/">Dutch PHP Conference</a> el pasado mes de Junio.</p>
<p>Muy interesante para todos los que andamos tocando Zend Framework, pues se tratan temas importantes como son:</p>
<ul>
<li>XSS</li>
<li>CSRF</li>
<li>Seguridad en consultas SQL</li>
<li>Validación y filtrado de las entradas</li>
<li>Manejo de las sesiones</li>
</ul>
<p>No entra en profundidad en ningún tema (al menos en las diapositivas), pero puede ser un buen punto de partida.</p>
<p><a title="Secure Programming With The Zend Framework" hreflang="en-US" href="http://www.suspekt.org/downloads/DPC_Secure_Programming_With_The_Zend_Framework.pdf">Descargar presentación: Secure Programming With The Zend Framework [PDF]</a></p>
<p><strong>Vía | </strong><a title="Seguridad y Zend Framework" hreflang="es-ES" href="http://www.programania.net/php/seguridad-y-zend-framework/">programania.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/07/seguridad-en-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizar JSON, serialize o var_export para cachear arrays</title>
		<link>http://blog.joanfernandez.es/2009/07/utilizar-json-serialize-o-var_export-para-cachear-arrays/</link>
		<comments>http://blog.joanfernandez.es/2009/07/utilizar-json-serialize-o-var_export-para-cachear-arrays/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 06:00:42 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=260</guid>
		<description><![CDATA[Hace un par de días, encontré esta comparativa entre tres de los sistemas que podemos utilizar en PHP para cachear grandes arrays de datos , comprimiendolos y almacenándolos en archivos.
Es este artículo, se utilizan 3 métodos distintos:

JSON (json_encode y json_decode)
Serialization (serialize y unserialize)
var_export / include (var_export y include)

La prueba para obtener a un ganador entre [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un par de días, encontré esta comparativa entre tres de los sistemas que podemos utilizar en PHP para cachear grandes arrays de datos , comprimiendolos y almacenándolos en archivos.</p>
<p>Es este artículo, se utilizan 3 métodos distintos:</p>
<ul>
<li>JSON (<a title="json_encode" href="http://php.net/json_encode">json_encode </a>y <a title="json_decode" href="http://php.net/json_decode">json_decode</a>)</li>
<li>Serialization (<a title="serialize" href="http://php.net/serialize">serialize</a> y <a title="unserlialize" href="http://php.net/unserialize">unserialize</a>)</li>
<li>var_export / include (<a title="var_export" href="http://php.net/var_export">var_export</a> y <a title="include" href="http://php.net/include">include</a>)</li>
</ul>
<p>La prueba para obtener a un ganador entre estos tres métodos fué la siguente:</p>
<p>Se utilizaron 5 conjuntos de datos, con diferentes tamaños (de memoria utilizada): 904B, ~18kB, ~250kB, ~4.5MB and ~72.5MB.</p>
<p>A estos conjuntos se los sometió a 10 codificaciones/decodificaciones, calculando el tamaño del archivo generado, y el tiempo tardado en relaizar cada operación.</p>
<div id="attachment_262" class="wp-caption aligncenter" style="width: 513px"><a href="http://blog.joanfernandez.es/wp-content/uploads/2009/07/optimizacion-big-array.png"><img class="size-full wp-image-262" title="optimizacion-big-array" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/optimizacion-big-array_thumb.png" alt="optimizacion-big-array" width="503" height="190" /></a><p class="wp-caption-text">Click para ampliar</p></div>
<p style="text-align: center;">
<p>Los resultados son bastante reveladores:</p>
<ol>
<li>El método con mayor ratio de compresión es JSON.</li>
<li>Hasta que no lidiamos con cantidades &#8220;ingentes&#8221; de datos ( más de 30Mb), los mejores resultados se obtienen con serialize/unserialize.</li>
<li>A partir de los 30Mb, el rendimiento de serialize/unserialize disminuye casi exponencialmente.</li>
<li>A partir de los 30Mb, JSON se convierte en el método más eficaz.</li>
</ol>
<p>Más información sobre cómo y dónde se realizó la comparativa, así como más gráficas, en el artículo original: <a title="Cache a large array" href="http://techblog.procurios.nl/k/618/news/view/34972/14863/Cache-a-large-array-JSON-serialize-or-var_export.html" hreflang="en-US">Cache a large array JSON serialize or var_export</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/07/utilizar-json-serialize-o-var_export-para-cachear-arrays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Login en Twitter con Zend Framework y Zend_Oauth.</title>
		<link>http://blog.joanfernandez.es/2009/07/login-en-twitter-con-zend-framework-y-zend_oauth/</link>
		<comments>http://blog.joanfernandez.es/2009/07/login-en-twitter-con-zend-framework-y-zend_oauth/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 06:00:11 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Zend_Oauth]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=229</guid>
		<description><![CDATA[Para desarrollar una aplicación basada en los servicios que ofrece Twitter en su API utilizando Zend Framework, podemos utilizar la librería que incluye el framework por defecto, Zend_Service_Twitter.
Sin embargo, utilizar este método nos obliga a solicitar el nombre de usuario y la contraseña a todos aquellos que quieran acceder al servicio. Esta práctica, aparte de [...]]]></description>
			<content:encoded><![CDATA[<p>Para desarrollar una aplicación basada en los servicios que ofrece <strong>Twitter</strong> en su API utilizando <a title="Zend Framework" href="http://framework.zend.com/" hreflang="en-US">Zend Framework</a>, podemos utilizar la librería que incluye el framework por defecto, <a title="Zend_Service_Twitter" href="http://framework.zend.com/manual/en/zend.service.twitter.html" hreflang="en-US">Zend_Service_Twitter</a>.</p>
<p>Sin embargo, utilizar este método nos obliga a solicitar el nombre de usuario y la contraseña a todos aquellos que quieran acceder al servicio. Esta práctica, aparte de estar desaconsejada como se indica en la<a title="API de Twitter | Security Best Practices" href="http://apiwiki.twitter.com/Security-Best-Practices#PasswordRetention" hreflang="en-US"> documentación del API</a>, en un futuro cercano estará obsoleta, y no se permitirá el acceso al API utilizandola.</p>
<p>Para compensarlo, los chicos de Twitter han adoptado <a title="OAuth" href="http://oauth.net/" hreflang="en-US">OAuth</a>, un estándar abierto que permite la identificación del usuario sin que el servicio externo maneje contraseñas ni otra información <em>sensible</em> requerida para la identificación.</p>
<p>En <strong>Zend Framework</strong> disponemos desde hace varios meses de <a title="Zend_Oauth" href="http://framework.zend.com/wiki/pages/viewpage.action?pageId=37957" hreflang="en-US">Zend_Oauth</a>, un proyecto de <strong>Pádraic Brady</strong>, que se encuentra todavía en la <a title="Zend Framework Incubator" href="http://framework.zend.com/svn/framework/standard/incubator/" hreflang="en-US">incubadora</a>, y teóricamente no debería de tardar mucho en dar el salto a la versión final del framework.</p>
<p><span id="more-229"></span></p>
<p>Para poder utilizar OAuth en nuestro proyecto basado en Twitter desarrollado con el framework de Zend, debemos:</p>
<ol>
<li>Registrar nuestra aplicación en Twitter.</li>
<li>Descargar Zend_Oauth del <em>incubator</em> de Zend Framework.</li>
</ol>
<h3>Registrando la aplicación en Twitter.</h3>
<p>Para registrar nuestra aplicación en Twitter, debemos hacerlo desde esta página: <a title="OAuth Twitter Clients" href="http://twitter.com/oauth_clients/new" hreflang="en-US">http://twitter.com/oauth_clients/</a>. Desde allí podremos registrar una nueva aplicación para utilizar el servicio, así como administrar aquellas que ya tenemos registradas.</p>
<div id="attachment_235" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-235" title="Registrando-aplicacion-en-twitter" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/Registrando-aplicacion-en-twitter.jpg" alt="Registrando-aplicacion-en-twitter" width="550" height="339" /><p class="wp-caption-text">Captura 1. Desde esta página registraremos nuestra aplicación en Twitter para utilizar OAuth para la identificación.</p></div>
<p>Rellenaremos el formulario, prestando un especial interés en los campos <strong>Application Type, Callback URL</strong> y <strong>Default Access type</strong>.</p>
<p>Con <strong>Application Type </strong>definiremos que tipo de aplicación va a realizar las peticiones de identificación, si una aplicación de escritorio o un servicio web. En nuestro caso lo tenemos bastante fácil: marcaremos <strong>Browser</strong>.</p>
<p>En <strong>Callback URL</strong> debemos insertar la url a la que redirigirá Twitter al usuario una vez se ha completado la identificación. Si tan solo queremos hacer unas cuantas pruebas, un <strong>http://localhost/oauth-test/</strong> nos bastará. O si jugamos con los Virtual Servers de Apache, podemos crearnos nuestro propio dominio de desarrollo. Algo parecido a<strong> http://twitterOauth.dev/</strong>.</p>
<p><strong>Default Access type</strong> lo marcaremos como Read &amp; Write. Una vez identificados, tendremos que hacer algo para que comprobar que realmente funciona, ¿no? Si elegimos Read-only, no seremos capaces de, por ejemplo, actualizar el timeline del usuario; tan solo podremos recibir información, no enviarla.</p>
<p>Para finalizar, marcamos la opción <strong>Use Twitter for login</strong>.</p>
<p>Una vez creada la aplicación, podremos ver los datos de conexión que necesitamos para identificarnos a través de OAuth.</p>
<div id="attachment_239" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-239" title="datos-aplicacion" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/datos-aplicacion.jpg" alt="datos-aplicacion" width="550" height="339" /><p class="wp-caption-text">Captura 2. Estos son los datos de conexión nuestra aplicación. Los utilizaremos más adelante con Zend_Oauth para identificarnos.</p></div>
<p style="text-align: center;">
<h3>Descargando Zend_Oauth</h3>
<p>Con nuestra aplicación ya registrada en el servicio de Twitter, vamos a realizar algunas pruebas desde nuestro proyecto de Zend Framework.</p>
<p>Para ello, debemos descargar Zend_Oauth del repositorio de la incubadora de Zend. Para ello, nos valdremos de cualquier cliente de Subversion. <em>TortoiseSVN</em> para windows o  <em>SCPlugin</em> para Mac OS X, deberían bastarnos.</p>
<p>La url del repositorio para descargar Zend_Oauth es: <a href="http://framework.zend.com/svn/framework/standard/incubator/library/Zend/Oauth" hreflang="en-US">http://framework.zend.com/svn/framework/standard/incubator/library/Zend/Oauth</a>.</p>
<p>Descargaremos la <em>HEAD Revision</em>, en formato recursivo, para obtener todos los archivos necesarios.</p>
<div id="attachment_241" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-241" title="archivos-repositorio" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/archivos-repositorio.jpg" alt="archivos-repositorio" width="550" height="234" /><p class="wp-caption-text">Captura 3. Estos son los archivos y carpetas que componen Zend_Oauth, descargados del repositorio de Zend</p></div>
<p>Copiamos el archivo Oauth.php y la carpeta Oauth a la librería de Zend, que normalmente está en <em>/library/Zend/</em>.</p>
<p>Doy por supuesto que tienes unos conocimientos mínimos de Zend Framework,y por lo tanto, sabes como crear y configurar un proyecto desde cero. Sino es así, puedes seguir el <a title="Zend Framework Quickstart" href="http://framework.zend.com/docs/quickstart" hreflang="en-US">Quickstart</a> disponible en la documentación que Zend dispone.</p>
<h3>Conectando con twitter</h3>
<p>A partir de aquí, los pasos son sencillos.Utilizaremos el <em>indexController.php</em> para realizar la conexión.</p>
<pre class="brush: php;">
/**
* Archivo indexController.php
* application/controllers/indexController.php
*/
class indexController extends Zend_Controller_Action
{

public function indexAction()
{

require_once 'Zend/Oauth/Consumer.php';

$options = array(
'requestScheme' =&gt; Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' =&gt; '1.0',
'signatureMethod' =&gt; 'HMAC-SHA1',
'localUrl' =&gt; 'http://twitterOauth.dev/',
'requestTokenUrl' =&gt; 'https://twitter.com/oauth/request_token',
'userAuthorisationUrl' =&gt; 'https://twitter.com/oauth/authorize',
'accessTokenUrl' =&gt; 'https://twitter.com/oauth/access_token',
'consumerKey' =&gt; 'CONSUMER_KEY',
'consumerSecret' =&gt; 'CONSUMER_SECRET'
);

$consumer = new Zend_Oauth_Consumer($options);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer-&gt;getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer-&gt;getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer-&gt;redirect();
}
} else {
$token = unserialize($_SESSION['ACCESS_TOKEN']);
// Reinicia el ACCESS_TOKEN cada vez que recargamos
$_SESSION['ACCESS_TOKEN'] = null;
}

$xml = simplexml_load_file('http://twitter.com/users/show.xml?user_id=ID_DEL_USUARIO');
echo var_dump($xml);
}
}
</pre>
<p>Vamos a repasar el código:</p>
<pre class="brush: php;">
require_once 'Zend/Oauth/Consumer.php';

$options = array(
'requestScheme' =&gt; Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' =&gt; '1.0',
'signatureMethod' =&gt; 'HMAC-SHA1',
'localUrl' =&gt; 'http://twitterOauth.dev/',
'requestTokenUrl' =&gt; 'https://twitter.com/oauth/request_token',
'userAuthorisationUrl' =&gt; 'https://twitter.com/oauth/authorize',
'accessTokenUrl' =&gt; 'https://twitter.com/oauth/access_token',
'consumerKey' =&gt; 'CONSUMER_KEY',
'consumerSecret' =&gt; 'CONSUMER_SECRET'
);
</pre>
<p>Cargamos los archivos necesarios para el correcto funcionamiento de Zend_Oauth. En este caso, bastará con el archivo Consumer.php dentro de Zend/Oauth/.<br />
Creamos un array con los datos necesarios para la conexión.<br />
Los datos que necesitamos personalizar con la información que nos proporcionó Twitter cuando registramos la aplicación son:</p>
<ul>
<li><strong>localUrl (<acronym title="Línea 7">l. 7</acronym>)</strong>. Donde definiremos la url a la que se redirigirá al usuario una vez completado el proceso de identificación.</li>
<li><strong>consumerKey (<acronym title="Línea 11">l. 11</acronym>)</strong> y <strong>consumerSecret (<acronym title="Línea 12">l.12</acronym>)</strong> corresponden a los campos con los mismos nombres que nos entrega Twitter (ver captura 2).</li>
</ul>
<pre class="brush: php;">
$consumer = new Zend_Oauth_Consumer($options);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer-&gt;getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer-&gt;getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer-&gt;redirect();
}
} else {
$token = unserialize($_SESSION['ACCESS_TOKEN']);
// Reinicia el ACCESS_TOKEN cada vez que recargamos
$_SESSION['ACCESS_TOKEN'] = null;
}
</pre>
<p>Realizamos la conexión y almacenamos los datos en la sesión. La variable <strong>$token</strong> almacenará una serie de parámetros con el siguiente formato:</p>
<p>oauth_token = <em>CODIGO_ALFANUM</em> &amp; oauth_token_secret = <em>CODIGO_ALFANUM</em> &amp;  user_id = ID_DEL_USUARIO_LOGUEADO &amp; screen_name = <em>NOMBRE_DEL_USUARIO</em></p>
<p>Por supuesto, sin espacios entre caracteres. Podremos dividir esta cadena utilizando la función <a title="función explode() PHP" href="http://es.php.net/explode" hreflang="es-ES">explode()</a> de PHP, para obtener el id del usuario, que deberíamos almacenar en la sesión para futuras consultas a twitter y obtener datos, como por ejemplo, la ficha completa del usuario.</p>
<pre class="brush: php;">
$xml = simplexml_load_file('http://twitter.com/users/show.xml?user_id=ID_DEL_USUARIO');
echo var_dump($xml)
</pre>
<p>El API de twitter permite obtener los resultados en formato XML o JSON. Para este ejemplo he optado por la vía rápida, y usar <a title="SimpleXML" href="http://php.net/manual/en/ref.simplexml.php" hreflang="en-US">simplexml</a> para recoger los valores y mostrarlos. Estar parte es personalmente optimizable por el lector <img src='http://blog.joanfernandez.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ahora solo nos queda probar nuestra aplicación. Recomiendo <strong>desactivar firewalls y demás protecciones que podamos tener instaladas en nuestro sistema</strong> para realizar las pruebas. Personalmente, utilizo Little Snitch para Mac OS X, y no hay forma de realizar la conexión sin desactivarlo.</p>
<p>Si ejecutamos nuestro script, comprobamos que el navegador nos redirige a twitter, donde nos aparecerá el siguiente mensaje, <strong>informándonos de la aplicación que solicita nuestra identificación</strong>:</p>
<div id="attachment_251" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-251" title="autorizacion" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/autorizacion.jpg" alt="autorizacion" width="550" height="234" /><p class="wp-caption-text">Desde la página de Twitter, se nos ofrece información de la aplicación que solicita que nos identifiquemos.</p></div>
<p>Una vez permitimos el acceso a la aplicación, <strong>Twitter nos redirigirá automáticamente de vuelta a la aplicación</strong>, con la información justa y necesaria del usuario: su nombre y su id.</p>
<div id="attachment_252" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-252" title="de-vuelta" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/de-vuelta.jpg" alt="de-vuelta" width="550" height="234" /><p class="wp-caption-text">Aún en Twitter, después de identificarnos se nos avisa que nos devuelve, sanos y salvos, a la aplicación de origen.</p></div>
<p>Ahora, ya podemos realizar todas las consultas necesarias a la API de Twitter.</p>
<p>Cabe resaltar que <strong>no podremos utilizar Zend_Service_Twitter si utilizamos el sistema de identificación con OAuth</strong>, ya que este necesita del nombre de usuario y contraseña para realizar la conexión. Así que, mientras tanto, deberemos conformarnos con recibir los datos en XML o JSON, según nos sea conveniente.</p>
<p>Esperemos que cuando Zend_Oauth se incorpore definitivamente a Zend Framework, modifiquen el helper de Twitter para poder utilizarlos conjuntamente. Ya estoy impaciente&#8230;</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/07/login-en-twitter-con-zend-framework-y-zend_oauth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google te ayuda a optimizar tu código PHP.</title>
		<link>http://blog.joanfernandez.es/2009/06/google-te-ayuda-a-optimizar-tu-codigo-php/</link>
		<comments>http://blog.joanfernandez.es/2009/06/google-te-ayuda-a-optimizar-tu-codigo-php/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 19:18:59 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[optimización]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=203</guid>
		<description><![CDATA[ACTUALIZADO.
En Baluart.net encontramos una recopilación de las correcciones que la comunidad de usuarios de PHP ha hecho al artículo publicado por Google que se comenta en esta entrada.
Es importante que leas el artículo, pues rebaten muchas de las afirmaciones con códigos de ejemplo y tiempos de ejecución. Así, sabrás realmente a qué acogerte a la [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>ACTUALIZADO.</strong></p>
<p>En <a title="Baluart.net" href="http://www.baluart.net/articulo/la-comunidad-de-php-responde-a-google-sobre-tips-de-optimizacion">Baluart.net</a> encontramos una recopilación de las <strong>correcciones que la comunidad de usuarios de PHP ha hecho al artículo publicado por Google</strong> que se comenta en esta entrada.</p>
<p><strong>Es importante que leas el artículo</strong>, pues rebaten muchas de las afirmaciones con códigos de ejemplo y tiempos de ejecución. Así, sabrás realmente a qué acogerte a la hora de programar.</p>
<p>Es curioso saber que los programadores de Google también se equivocan <img src='http://blog.joanfernandez.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></blockquote>
<p>Si hace un par de días comentabamos unos consejos para <a title="10 formas de optimizar javascript" hreflang="es-ES" href="http://blog.joanfernandez.es/2009/06/10-formas-de-optimizar-jquery/">optimizar javascript</a>, hoy le toca el turno a PHP.</p>
<p>De la mano de Google y su nueva sección <a title="Let's make the web faster - Google Code" rel="external" hreflang="en-US" href="http://code.google.com/intl/es/speed/">Let&#8217;s make the web faster</a>, encontramos <strong>PHP performance tips</strong>, una recopilación de consejos para programadores de PHP que nos ayudarán a mantener nuestros sitios más rápidos y optimizados.</p>
<p>Veamos algunos de los consejos que Eric Higgins, Webmaster de Google, nos ofrece:</p>
<h3>Mantén actualizada tu versión de PHP.</h3>
<p>¿Aún sigues utilizando PHP4? Las nuevas versiones de PHP están optimizadas para mejorar su rendimiento, por lo que deberías, al menos, dar el salto a PHP5. Hoy en día la mayoría de servicios de hosting ya ofrecen servidores con PHP5 instalado, para que puedas migrar tus páginas sin miedos.</p>
<h3>Utiliza la caché en tus sitios.</h3>
<p>Utilizando un modulo para cachear los resultados como <a title="Memcache para PHP" rel="external" hreflang="es-ES" href="http://es.php.net/memcache">Memcache</a>, o mediante un sistema de templates que lo soporte, como Smarty, podemos mejorar la velocidad de nuestras páginas cacheando los resultados de las consultas a la base de datos, o las páginas renderizadas.</p>
<h3>Utiliza el buffer de salida.</h3>
<p>PHP utiliza un buffer de salida para almacenar toda la información que tratamos de imprimir desde nuestros scripts. Este buffer puede disminuir el rendimiento de nuestras páginas, ya que no muestra la información al usuario hasta que no se llena.</p>
<p>Afortunadamente, podemos modificar el comportamiento del buffer para que muestre los datos más frecuentemente.</p>
<p><a title="Buffer de salida en PHP" rel="external" hreflang="es-ES" href="http://es2.php.net/manual/es/book.outcontrol.php">Más info sobre el buffer de salida de PHP</a>.</p>
<h3>Usa comillas simples para los strings.</h3>
<p>A la hora de delimitar un string, PHP permite hacerlo de dos formas diferentes; utilizando <em>&#8216;comillas simples&#8217;</em> o <em>&#8220;comillas dobles&#8221;</em>. Sin embargo, existen diferencias entre ambos métodos. Si utilizamos comillas dobles, PHP buscará variables dentro de la cadena, y si las encuentra, insertará su valor correspondiente. Esto puede significar una bajada de rendimiento, sobre todo si utilizamos strings sin variables dentro.</p>
<h3>Sustituye los print por echo.</h3>
<p>El rendimiento de la función <strong>echo</strong> es mayor que el de <strong>print.</strong> Además, la función echo puede recibir un número ilimitado de parámetros, por lo que no es necesario concatenar el string que le pasamos a la función. Es decir:</p>
<pre class="brush: php;">
$uno = 1;
$dos = 2;
$tres = 3;
// Típica concatenación para utilizar con echo
echo 'Vamos a contar hasta tres: ' . $uno . ' ' . $dos . ' y ' . $tres;

// Sin embargo, no necesitamos concatenar la cadena
// antes de pasarla a echo, puesto que esta función
// puede recibir el número de parámetros que
// deseemos
echo 'Vamos a contar hasta tres: ', $uno, ' ', $dos, ' y ', $tres;

// Y el resultado, en ambos casos será el mismo:
// &quot;Vamos a contar hasta tres: 1 2 y 3&quot;
</pre>
<p>En el ejemplo anterior el resultado es exactamente el mismo, y sin embargo evitamos la carga de tener que concatenar el string antes de pasar la cadena al buffer de salida.</p>
<p><a title="Optimizing PHP" rel="external" hreflang="es-ES" href="http://code.google.com/intl/es/speed/articles/optimizing-php.html">Leer el artículo completo en Google Code.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/06/google-te-ayuda-a-optimizar-tu-codigo-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
