<?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>Nos pasa algo lo mismo &#187; PHP</title>
	<atom:link href="http://www.tatai.es/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tatai.es</link>
	<description>...está claro...</description>
	<lastBuildDate>Mon, 02 Aug 2010 13:54:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Equation y Matrix, mis últimos desarrollos en PHP</title>
		<link>http://www.tatai.es/2010/07/20/equation-y-matrix-mis-ultimos-desarrollos-en-php/</link>
		<comments>http://www.tatai.es/2010/07/20/equation-y-matrix-mis-ultimos-desarrollos-en-php/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 21:07:49 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ecuación]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[matriz]]></category>
		<category><![CDATA[phpclasses]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=764</guid>
		<description><![CDATA[Para recuperar un poco el blog, que últimamente está muy mustio, voy a hablar de un par de desarrollos que he hecho y publicado en PHP. Los he llamado con el original nombre de Equation y Matrix. Los tenía desde hace bastante tiempo, pero aprovechando que le estoy dando a TDD y a los testeos [...]]]></description>
			<content:encoded><![CDATA[<p>Para recuperar un poco el blog, que últimamente está muy mustio, voy a hablar de un par de desarrollos que he hecho y publicado en PHP. Los he llamado con el original nombre de <a href="http://github.com/tatai/equation">Equation</a> y <a href="http://github.com/tatai/matrix">Matrix</a>.</p>
<p>Los tenía desde hace bastante tiempo, pero aprovechando que le estoy dando a <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> y a los <a href="http://en.wikipedia.org/wiki/Unit_Testing">testeos unitarios</a>, los he adecentado y completado hasta ponerlos decentes para publicarlos y este es el resultado.</p>
<h2>Equation</h2>
<p>Es una sencilla clase que nos permite trabajar con una ecuación polinomial de grado n-ésimo mediante un objeto, facilitando el acceso a cada uno de los coeficientes así como una sencilla evaluación de la misma (basada en el <a href="http://en.wikipedia.org/wiki/Horner_scheme">método Horner</a>).</p>
<p>Además, permite mostrar la ecuación renderizada al formato indicado de una forma muy sencilla. Actualmente en el paquete existe la opción de mostrarlo en formato HTML, cuyo resultado final sería algo del estilo: y = x<sup>3</sup> + 7x<sup>2</sup> + 10</p>
<p>El código completo, incluyendo ejemplos y test unitarios está publicado en <a href="http://github.com/tatai/equation">github</a>. También lo he publicado en <a href="http://www.phpclasses.org/package/6352-PHP-Evaluate-and-render-polynomial-equations.html">phpclasses</a> (sin test unitarios por lo engorroso que es subir cada fichero de forma individual).</p>
<h2>Matrix</h2>
<p>Este paquete consta de varias clases, la principal es Matrix que permite representar en un objeto una matriz matemática. Podemos además realizar distintas operaciones que a día de hoy son:</p>
<ul>
<li>suma de dos matrices</li>
<li>resta de dos matrices</li>
<li>multiplicación de dos matrices</li>
<li>multiplicación de una matriz por un escalar</li>
<li>multiplicación de una fila por un valor</li>
<li>multiplicación de una columna por un valor</li>
<li>cambiar dos filas</li>
<li>cambiar dos columnas</li>
<li>inversa de una matriz</li>
<li>unir dos matrices compatibles</li>
<li>trasponer una matriz</li>
<li>eliminación de Gauss-Jordan (con el que poder obtener, por ejemplo, ajustes polinómicos de cualquier grado o inversas)</li>
</ul>
<p>Las clases, con sus correspondientes test unitarios, están publicada en <a href="http://github.com/tatai/matrix">github</a>.</p>
<h2>Enlaces</h2>
<ul>
<li><a href="http://github.com/tatai/equation">Equation en github</a></li>
<li><a href="http://www.phpclasses.org/package/6352-PHP-Evaluate-and-render-polynomial-equations.html">Equation en phpclasses</a></li>
<li><a href="http://github.com/tatai/matrix">Matrix en github</a></li>
</ul>
<p><strong>Update 2010.08.01</strong>: PHPClasses acaba de avisarme que Equation está nominada al Innovation Award July 2010 <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  A ver si hay suerte<br />
<script src="http://www.phpclasses.org/browse/package/6352/format/badge.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/07/20/equation-y-matrix-mis-ultimos-desarrollos-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentación oficial de PHP en español</title>
		<link>http://www.tatai.es/2010/04/02/documentacion-oficial-de-php-en-espanol/</link>
		<comments>http://www.tatai.es/2010/04/02/documentacion-oficial-de-php-en-espanol/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 20:41:46 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[documentación]]></category>
		<category><![CDATA[español]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=727</guid>
		<description><![CDATA[Tras un largo tiempo sin ella, podemos anunciar que está de nuevo online la documentación oficial de PHP en español. De esta forma, para todos aquellos a los que se os hacía complicada la lectura de la ayuda en alguno de los idiomas actualmente disponibles, ahora no teneis excusa Hace ya unos años que el [...]]]></description>
			<content:encoded><![CDATA[<p>Tras un largo tiempo sin ella, podemos anunciar que <a href="http://www.php.net/manual/es/"><strong>está de nuevo online la documentación oficial de PHP en español</strong></a>. De esta forma, para todos aquellos a los que se os hacía complicada la lectura de la ayuda en alguno de los idiomas actualmente disponibles, ahora no teneis excusa <img src='http://www.tatai.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Hace ya unos años que el manual en español se consideró obsoleto debido a la discontinuidad de la traducción (principalmente con la llegada de PHP5), pero volvemos a contar con él.</p>
<p><strong>La traducción la realizan voluntarios</strong> que prestan su tiempo a esta tarea y se organizan mediante una <a href="doc-es@lists.php.net">la lista de correo oficial documentación de PHP-ES</a>.</p>
<p>Como se puede ver en la lista que hay más adelante, no está traducido todo el manual. A fecha de hoy, 2 de abril de 2010, el 21% del manual oficial de PHP en inglés (manual base) está traducido a español. Aunque pueda parecer una cifra reducida, irá creciendo poco a poco.</p>
<p>El manual en español es el cuarto con más contenido traducido. Existen otras lenguas en las que se ha empezado con la tarea pero que, hasta el momento, no tienen contenido suficiente como para estar publicados.</p>
<p>Actualmente la documentación oficial de PHP está disponible en los siguientes idiomas (entre paréntesis, la cantidad del manual que está traducido):</p>
<ul>
<li>Inglés (100%)</li>
<li>Francés (90%)</li>
<li>Japonés (69%)</li>
<li>Turco (35%)</li>
<li><strong>Español (21%)</strong></li>
<li>Alemán (18%)</li>
<li>Portugués brasileño (11%)</li>
<li>Polaco (4%)</li>
<li>Rumano (4%)</li>
<li>Búlgaro (3%)</li>
<li>Coreano (3%)</li>
</ul>
<p>¿Te animas a traducir apoyando así a la comunidad? Cualquier ayuda es buena y será bienvenida <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Links:</p>
<ul>
<li><a href="http://www.php.net">Página oficial de PHP</a></li>
<li><a href="http://www.php.net/manual/en/">Documentación de PHP (inglés)</a></li>
<li><a href="http://www.php.net/manual/es/">Documentación de PHP (español)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/04/02/documentacion-oficial-de-php-en-espanol/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Crear un DOMDocument de un DOMNode en PHP5</title>
		<link>http://www.tatai.es/2010/02/23/crear-un-domdocument-de-un-domnode-en-php5/</link>
		<comments>http://www.tatai.es/2010/02/23/crear-un-domdocument-de-un-domnode-en-php5/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:00:53 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[DOMDocument]]></category>
		<category><![CDATA[DOMNode]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=699</guid>
		<description><![CDATA[Tengo que reconocer que DOMDocument (del Document Object Model de PHP) me gusta muy muy poco. Lo he usado por necesidad un par de veces en versiones tempranas de PHP5 donde SimpleXML todavía no tenía tanta potencia y con el problema de no poder usar por ejemplo YAML u otro tipo de formatos que no [...]]]></description>
			<content:encoded><![CDATA[<p>Tengo que reconocer que DOMDocument (del <a href="http://es.php.net/manual/en/book.dom.php">Document Object Model de PHP</a>) me gusta muy muy poco. Lo he usado por necesidad un par de veces en versiones tempranas de PHP5 donde SimpleXML todavía no tenía tanta potencia y con el problema de no poder usar por ejemplo YAML u otro tipo de formatos que no me daban la potencia y flexibilidad de XML para ciertos casos.</p>
<p>Bueno, una de los últimos problemas que me he encontrado ha sido cómo obtener un DOMDocument de un DOMNode ya que quería usar XPath a partir de dicho DOMNode, algo que no es posible si no es DOMDocument.</p>
<p>La verdad es que no he encontrado mucha información ni algo bonito para presentar. Sólo tengo esto, que por lo menos me ha servido (he preferido no pararme a medir el consumo de memoria o de proceso por miedo a querer descartar la idea y perder todavía más tiempo, jeje):</p>
<pre><code>$doc = new DOMDocument();
$doc-&gt;loadXML($node-&gt;ownerDocument-&gt;saveXML($node))</code></pre>
<p>El &#8220;truco&#8221; es tan sencillo como como crear un nuevo DOMDocument en el que importamos (vía método loadXML) el nodo a través del código XML que genera. Este código se obtiene con la propiedad ownerDocument del DOMNode (que nos retorna el DOMDocument) y sobre el que podemos llamar a saveXML, método que expulsa el XML del elemento que le indiquemos, en este caso, nuestro DOMNode.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/02/23/crear-un-domdocument-de-un-domnode-en-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XHP: una extensión para escribir PHP de forma distinta</title>
		<link>http://www.tatai.es/2010/02/11/xhp-una-extension-para-escribir-php-de-forma-distinta/</link>
		<comments>http://www.tatai.es/2010/02/11/xhp-una-extension-para-escribir-php-de-forma-distinta/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 18:49:29 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[xhp]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=687</guid>
		<description><![CDATA[Una de las noticias de esta semana en el mundo PHP es sin duda toda la información acerca de HipHop for PHP por parte del equipo de desarrollo de Facebook. Una de las extensiones que ha salido a la luz por parte del equipo de front-end es la que han llamado XHP y, como ellos [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las noticias de esta semana en el mundo PHP es sin duda toda la información acerca de HipHop for PHP por parte del equipo de desarrollo de <a href="http://www.facebook.com">Facebook</a>. Una de las extensiones que ha salido a la luz por parte del equipo de front-end es la que han llamado XHP y, como ellos mismos rezan, &#8220;<a href="http://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919">a new way to write PHP</a>&#8221; (una nueva forma de escribir PHP).</p>
<p>La explicación de cómo funciona es muy sencilla. Intentan evitar que al desarrollar la parte de frontal, cuando nos &#8220;pegamos&#8221; con el XHTML, tengamos que unir código XHTML y PHP. En el ejemplo que muestran se ve más claramente.</p>
<p>De un código como:</p>
<pre><code>&lt;?php
if ($_POST['name']) {
?&gt;
    &lt;span&gt;Hello, &lt;?=$_POST['name']?&gt;.&lt;/span&gt;
&lt;?php
} else {
?&gt;
    &lt;form method="post"&gt;
    What is your name?&lt;br&gt;
    &lt;input type="text" name="name"&gt;
    &lt;input type="submit"&gt;
    &lt;/form&gt;
&lt;?php
}</code></pre>
<p>Nos da como opción generar este otro:</p>
<pre><code>&lt;?php
// note: includes omitted
if ($_POST['name']) {
  echo &lt;span&gt;Hello, {$_POST['name']}&lt;/span&gt;;
} else {
  echo
    &lt;form method="post"&gt;
      What is your name?&lt;br /&gt;
      &lt;input type="text" name="name" /&gt;
      &lt;input type="submit" /&gt;
    &lt;/form&gt;;
}</code></pre>
<p>No voy a negar que, de primeras, XHP parece más sencillo de seguir y de generar. Eliminar los tags de apertura y cierra de PHP aligera el código en gran medida. Además, eliminamos problemas con el XSS así como detectar problemas por malformación de XHTML en tiempo de parsing.</p>
<p>A mi personalmente me sigue gustando bastante más usar un motor de plantillas. Un motor real como <a href="http://www.phpxtemplate.org">XTemplates</a> (sí, he dicho XTemplates, no smarty o similares). Separar el código PHP del HTML me parece bastante importante y necesito verlo con más claridad.</p>
<p>No obstante, hay que seguir el tema de cerca. Si es algo que la gente de Facebook ha visto que es necesario ya que aumenta el rendimiento, es evidente que en este tipo de entornos será uno de los puntos de referencia. Sin embargo, XHP como técnica para el resto de las webs donde no se reciban tantas peticiones como Facebook (si no recuerdo mal, sirven más doscientas mil millones de páginas al mes, sí, sí, 200.000.000.000), es posible que un objetivo que cumpla a primera vista es juntar el PHP con el HTML, algo que, repito, me parece bastante &#8220;sucio&#8221; si no hay una justificación clara. Pos supuesto, un motor de plantillas tiene sus desventajas, no vamos a negarlo <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Lo dicho, XHP de momento me parece algo que puede provocar que el código sea más rápido pero a costa de hacerlo más guarro. Habrá que seguirle la pista para ver por dónde avanza, no lo descarto de primeras porque el objetivo de aumentar el rendimiento es muy importante, pero analizando el coste (ni monetario ni de recursos en este caso, jeje).</p>
<p>Enlaces:</p>
<ul>
<li><a href="http://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919">Noticia original</a></li>
<li><a href="http://github.com/facebook/xhp">XHP on Github</a></li>
<li><a href="http://wiki.github.com/facebook/xhp/">XHP Wiki</a></li>
</ul>
<p>Update: Muy muy muy interesante <a href="http://toys.lerdorf.com/archives/54-A-quick-look-at-XHP.html">lo que comenta Rasmus en su web</a>. Importante verlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/02/11/xhp-una-extension-para-escribir-php-de-forma-distinta/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Conference 2009. Día 2</title>
		<link>http://www.tatai.es/2009/10/31/php-conference-2009-dia-2/</link>
		<comments>http://www.tatai.es/2009/10/31/php-conference-2009-dia-2/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 22:01:08 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[calidad]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[congreso]]></category>
		<category><![CDATA[phpbcn2009]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=518</guid>
		<description><![CDATA[Y, con mucha tristeza, ya ha terminado la PHP Conference 2009. Tristeza porque se acaba, pero creo que el balance final hay sido muy muy positivo y me voy realmente contento. Al igual que hice ayer, voy a realizar un pequeño resumen de las conferencias a las que he asistido, que también prometían. Eso sí, [...]]]></description>
			<content:encoded><![CDATA[<p>Y, con mucha tristeza, ya ha terminado la PHP Conference 2009. Tristeza porque se acaba, pero creo que el balance final hay sido muy muy positivo y me voy realmente contento.</p>
<p><a href="http://www.tatai.es/2009/10/30/php-conference-2009-dia-1/">Al igual que hice ayer</a>, voy a realizar un pequeño resumen de las conferencias a las que he asistido, que también prometían.</p>
<p>Eso sí, no me quedo sin comentar lo bien que nos lo hemos pasado en el sorteo final y entrega de premios. Como colofón a la PHP Conference 2009, la organización realizó un sorteo en que entreban 7 packs de libro de O&#8217;Reilly + elePHPant, más 3 XBOX 360. Para empezar, muchas de las personas que esperaban participar en el sorteo se encontraron con que no podían hacerlo puesto que no habían completado la encuesta. Las probabilidades de que nos tocase algo aumentaron mucho <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Tras todo esto, para entregar los premios oparon por un método que me pareció de lo más original y que, de alguna forma u otra, adoptaré, jeje. Se trataba de obtener tantos números de forma aleatoria como premios había y para ello usaron http://www.random.org. Los números obtenidos eran los ids numéricos de las personas que habían contestado la encuesta.</p>
<p>Tras varios intentos frustrados por parte de Buenosvinos de dominar al MAC que le habían dejado para tal efecto (si por algo los MAC OS X tienen nombres de fieras xDD), sacaron los nombres. Arkaitz se llevó un libro + elePHPant e Iván una XBOX 360. Yo no tuve tanta suerte, pero bueno, 2 de 3 <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por lo menos, he aprovechado la oferta de O&#8217;Reilly para comprarme un libro de git con un 35% de descuento <img src='http://www.tatai.es/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Y bueno, estas han sido las conferencias a las que he asistido hoy:</p>
<ul>
<li>PHundamental Security by Hans Zaunere</li>
<li>The State of Quality Assurance Tools for PHP by Sebastian Bergmann</li>
<li>Técnicas y Herramientas para una API con REST by Àlex Puig</li>
<li>Symfony 2.0 a sneak peak by Fabien Potencier</li>
<li>Open Classifieds by Chema Garrido</li>
</ul>
<p>Y he aquí unn pequeño resumen:</p>
<h2>PHundamental Security</h2>
<p>Hans nos dio una buena charla cargada de otra buena cantidad de frases para apuntar y grabar a fuego sobre aspectos relacionados con la seguridad de nuestros servidores y PHP.</p>
<p>Sus comentarios inicialmente partían de sistemas en los que tenemos mucho control, pudiendo decidir hasta la forma de compilar los módulos. Algo que en algunos casos puede ser excesivo, pero desde luego tenemos que tener la oportunidad de decidir los módulos que están instalados.</p>
<p>Me quedo principalmente con estas dos frases (que no son las mejores, pero realmente creo que dicen mucho en poco espacio):</p>
<p><em>Let PHP do its magic inly whe you want it to &#8211; not by chance</em></p>
<p><em>Mayority &#8220;PHP security flaws&#8221; could be avoided by casting to int</em></p>
<h2>The State of Quality Assurance Tools for PHP</h2>
<p><a href="http://www.slideshare.net/sebastian_bergmann/the-state-of-qa-tools-for-php-2389795">http://www.slideshare.net/sebastian_bergmann/the-state-of-qa-tools-for-php-2389795</a></p>
<p>La charla de Bergmann tuvo, en mi opinión dos partes bien diferenciadas, la primera que me pareció hasta aburrida ya que eran conceptos demasiado básicos para una charla de este estilo, pero en la segunda parte (mitad-final) estuvo plagada de buenos ejemplos, herramientas y enlaces veerdaderamente útiles e interesantes.</p>
<p>Muy buen sabor de boca pese a ser una persona que odia los Singleton sn excepción :p</p>
<h2>Técnicas y Herramientas para una API con REST</h2>
<p>Charla introductoria a REST que contaba, partiendo de lo más básico, cómo realizar una API y cómo montar tu aplicación. Desde mi punto de vista, todo iba bien hasta que entró a explicarlo con un MVC y dar ciertas explicaciones dentro de un contexto más personal que general.</p>
<p>Interesante charla como introducción aunque a mi personalmente se me quedó algo corta.</p>
<h2>Symfony 2.0 a sneak peak</h2>
<p><a href="http://www.slideshare.net/fabpot/symfony-20-on-php-53">http://www.slideshare.net/fabpot/symfony-20-on-php-53</a></p>
<p>Contando con la presencia de Fabien Potencier como ponente, mostró lo que va a ser el nuevo Symfony 2, orientado principalmente a las nuevas incorporaciones. Cabe destacar que funcionará únicamente para PHP 5.3 y será una reealidad inicialmente a finales de 2010. El respaso fue demasiado exhaustivo entrando quiás demasiado a poner ejemplos con código, algo que creo que no ayudó mucho a mostrar el potencial de algunos apartados.</p>
<p>Cotnamos con una completa explicación de Event Dispatcher, Request Handler, Templating Framework y Dependency Injection Container.</p>
<p>Esperábamos haber visto algo de Twig, pero no salió nada del tema.</p>
<h2>Open Classifieds</h2>
<p>De esta charla tengo que decir que alabo las ganas que le echó el ponente por dar a conocer su proyecto, pero predicar con el hecho de que hay que seguir el concepto KISS y que se ha venido de controlar la programación en  Java a PHP para decir que no se usa un framework para hacer tu código más efectivo, hacer código spaguetthi y considerarlo bueno y mantenible&#8230; creo que te has confundido de sitio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/31/php-conference-2009-dia-2/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>PHP Conference 2009. Día 1</title>
		<link>http://www.tatai.es/2009/10/30/php-conference-2009-dia-1/</link>
		<comments>http://www.tatai.es/2009/10/30/php-conference-2009-dia-1/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 22:12:44 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[congreso]]></category>
		<category><![CDATA[phpbcn2009]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=514</guid>
		<description><![CDATA[Hoy ha sido el primer día del PHP Conference 2009 y tars todo el día de conferencias voy a hacer un pequeño repaso a las que yo he asistido. Todas a las que he asistido ha sido en inglés y, en general, hay que decir que mucho nivel tanto entre los conferenciantes como entre el [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy ha sido el primer día del PHP Conference 2009 y tars todo el día de conferencias voy a hacer un pequeño repaso a las que yo he asistido. Todas a las que he asistido ha sido en inglés y, en general, hay que decir que mucho nivel tanto entre los conferenciantes como entre el público.</p>
<p>De entre todas las disponibles en el <a href="http://phpconference.es/barcelona-php-conference-2009/schedule/">schedule</a>, he ido a estas:</p>
<ul>
<li>Working with webservices by Lorna Mitchel</li>
<li>Trees in database by Lorenzo Alberton</li>
<li>Simple is hard by Rasmus Lerdorf</li>
<li>AJAX for Scalability by Erik Schultink</li>
<li>Integrating Zend Framework and Symfony by Stefan Koopmanshap</li>
<li>PHP Security audits by Damien Seguy</li>
</ul>
<p>Seguidamente voy a hacer un breve resumen de cada uno de ellos.</p>
<h2>Working with webservices</h2>
<p><a href="http://www.slideshare.net/lornajane/working-with-web-services">http://www.slideshare.net/lornajane/working-with-web-services</a></p>
<p>Introducción a los servicios web con un repaso completo de los diferentes formatos usados: JSON, XML e incluso serialize, los formatos más usados: SOAP, RPC (XML-RPC y JSON-RPC) y REST, así como alguna de las herramientas más utilizadas para debuggear como cURL, Wireshark o Charles.</p>
<p>Por último, Lorna dio un repaso a realizar webservices con REST.</p>
<h2>Trees in database</h2>
<p><a href="http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures?type=presentation">http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures?type=presentation</a></p>
<p>Charla enfocada al problema de trabajar el mateo de árboles en bases de datos relacionales mediante SQL.</p>
<p>Muy interesante la aportación de soluciones aunque el alto componente matemático de alguna de las partes unido a la necesidad de realizar sentencias SQL complejas hicieron algo complicada de seguir en ciertos momentos.</p>
<p>Las diferentes posibilidades incluían tanto soluciones de código abierto como propietarias.</p>
<h2>Simple is hard</h2>
<p><a href="http://talks.php.net/show/phpbcn">http://talks.php.net/show/phpbcn</a></p>
<p>Gran keynote a cargo de Rasmus Lerdorf centrada en la optimizaciónde rendimiento en backend de aplicaciones PHP y en la seguridad del código generado.</p>
<p>Rasmus dio cantidad de herramientas e indicios de posibles problemas que nos podemos encontrar cuando realizamos código en PHP.</p>
<p>Sinceramente, todo un gusto oirle hablar. Ha sido una oportunidad que no me volvería a perder por nada del mundo. Destila conocimiento y experiencia que contrasta con su pragmatismo y su incredulidad ante procesos y sistemas de hoy en día.</p>
<h2>AJAX for Scalability</h2>
<p>Esta charla aunque se inició con temas relacionados con AJAX y como tuenti realiza monta y desmonta su página mediante javascript, la mayor parte constó de la explicación de cómo optimizar los servidores y escalar nuestro sistema mediante mediciones en la conexión, datos transferidos, etc.</p>
<h2>Integrating Zend Framework and Symfony</h2>
<p>Mediante ejemplos prácticos se mostró cómo se puede usar Zend Framework en proyectos con Symfony y viceversa. La potencia de frameworks como Zend que permite el uso de sus diversos módulos de forma particular con otro como Symfony con las funciones separadas, permite aprovechar al máximo de los dos.</p>
<p>A la espera de la charla de mañana de Fabien Potencier, se mostraron algunos de los nuevos desarrollos que tendrá Symfony 2.0.</p>
<h2>PHP Security audits</h2>
<p>A última hora entró esta charla dada por el genial Damien Seguy en el que mostró el proceso que sigue cuando realiza una auditoría de seguridad. El papá de los elePHPants nos mostró muchos de los elementos que con un alto porcentaje de acierto nos provocarán problemas así como diversas herramientas y recetas que podemos usar para intentar evitar estos problemas.</p>
<p><strong>Update: </strong>sigue leyendo <a href="http://www.tatai.es/2009/10/31/php-conference-2009-dia-2/">el resumen del día 2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/30/php-conference-2009-dia-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Una forma sencilla de hacer bien las cosas</title>
		<link>http://www.tatai.es/2009/10/02/una-forma-sencilla-de-hacer-bien-las-cosas/</link>
		<comments>http://www.tatai.es/2009/10/02/una-forma-sencilla-de-hacer-bien-las-cosas/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:21:09 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=471</guid>
		<description><![CDATA[Para romper este &#8220;silencio&#8221; de casi un mes debido a la Navarparty y al trabajo, volvamos a la carga con un pequeño post. Quiero tratar el tema de &#8220;cómo hacer bien las cosas programando&#8221; con un sencillo ejemplo que pasó el otro día por mis manos. Y para ello contaremos con dos actores, un array [...]]]></description>
			<content:encoded><![CDATA[<p>Para romper este &#8220;silencio&#8221; de casi un mes debido a la Navarparty y al trabajo, volvamos a la carga con un pequeño post.</p>
<p>Quiero tratar el tema de &#8220;cómo hacer bien las cosas programando&#8221; con un sencillo ejemplo que pasó el otro día por mis manos. Y para ello contaremos con dos actores, un array y un if. Supongamos que tenemos los siguientes datos:</p>
<pre><code>$a = array
  array('from' =&gt; 0, 'to' =&gt; 100),
  array('from' =&gt; 101, 'to' =&gt; 250),
  array('from' =&gt; 250, 'to' =&gt; 1000),
  array('from' =&gt; 1001, 'to' =&gt; 2000)
);</code></pre>
<p>Nuestro sencillo código va a retornar el índice del array $a en el que se encuentra un número $b. Ahora bien, tenemos dos formas de hacerlo:</p>
<p>Opción a:</p>
<pre><code>function getRange($b) {
  foreach($a AS $index =&gt; $actual) {
    if($actual['from'] &lt;= $b &amp;&amp; $actual['to'] &gt;= $b) {
      return $index;
    }
  }
}</code></pre>
<p>Opción b:</p>
<pre><code>function getRange($b) {
  foreach($a AS $index =&gt; $actual) {
    if($actual['to'] &gt;= $b &amp;&amp; $actual['from'] &lt;= $b) {
      return $index;
    }
  }
}
</code></pre>
<p>El único cambio es el if que, como se puede ver, cambia el orden de las condiciones.</p>
<p>Entonces, hacemos la pregunta, ¿cuál de las dos opciones es más eficiente? Es posible que no lo veas claro, pero si lo miras un poco veras como <strong>en la mayoría de los casos es la opción b</strong>. Únicamente son igual de eficientes cuando $b se encuentra entre los valores de la primera posición.</p>
<p>¿Y por qué es más eficiente la opción b? La respuesta es porque dentro del if, al tener un Y lógico (los dos ampersands &amp;&amp;) <strong>si la primera condición es falsa, la otra condición ni siquiera se evalúa</strong>. Es decir, nos ahorramos que el microprocesador tenga que hacer esa comprobación lógica. Y este caso se da si pensamos que $b = 150. Para la opción a el if tiene que ejecutar ambas condiciones (0 &lt;= 150 &amp;&amp; 100 &gt;= 150) para descubrir que es false y pasar a la siguiente iteración, mientras que con la opción b bastaría con la primera comprobación (100 &gt;= 150) para saber que es false y pasar a la siguiente iteración.</p>
<p>Si se hace este if una única vez estamos hablando de una parte muy pequeña de un segundo, pero si esta tarea es muy repetitiva o el array tiene muchas posiciones, el efecto es claramente favorable e incluso se puede notar directamente.</p>
<p>Este sencillo ejemplo demuestra como <strong>pensar un poco las cosas y cambios muy pequeños en tu código pueden hacer que tengas un código mucho más optimizado y que te de mayor rendimiento</strong>.</p>
<p>Y por si quieres rizar el rizo, la opción a puede ser más eficiente que la b, pero sólo en el caso de que se recorra el array de forma descendente o este ordenado de forma inversa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/02/una-forma-sencilla-de-hacer-bien-las-cosas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mis expresiones regulares favoritas</title>
		<link>http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/</link>
		<comments>http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 20:08:34 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=451</guid>
		<description><![CDATA[A raíz de mi post anterior sobre 5 expresiones regulares que todo programador web debería conocer, me ha parecido interesante añadir unas cuantas más que, aunque quizás no sean nada del otro mundo, me parecen muy útiles y seguro que ayudan a más de uno. Validar un número entero Esta es realmente sencilla y muy [...]]]></description>
			<content:encoded><![CDATA[<p>A raíz de mi post anterior sobre <a href="http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/">5 expresiones regulares que todo programador web debería conocer</a>, me ha parecido interesante añadir unas cuantas más que, aunque quizás no sean nada del otro mundo, me parecen muy útiles y seguro que ayudan a más de uno.</p>
<h3>Validar un número entero</h3>
<p>Esta es realmente sencilla y muy muy útil, sobre todo si trabajar con cadenas de texto o lenguajes de programación no tipados. En PHP hay por ejemplo funciones como <a href="http://www.php.net/is_number">is_number()</a> que hacen una función parecida.</p>
<p>Comprueba si todos caracteres del string son dígitos.</p>
<pre><code>/^\d+$/</code></pre>
<p>O, de forma equivalente:</p>
<pre><code>/^[0-9]+$/</code></pre>
<p>Atentos que la cadena vacía no pasa esta expresión, es necesario que haya al menos un dígito. Si quieres permitir que esté vacío, entonces cambia el + por *.</p>
<h3>Validar un número decimal</h3>
<p>Esta es una extensión la anterior. Acepta tanto número positivos como negativos y que el separador de decimales sea coma o punto:</p>
<pre><code>/^-?[0-9]+([,\.][0-9]*)?$/</code></pre>
<h3>Validar opciones de entrada</h3>
<p>Aunque no siempre, viene muy bien cuando tenemos unos cuantos parámetros y no queremos usar if($a == &#8216;a&#8217; || $a == &#8216;b&#8217; || $a == &#8216;c&#8217;) y todo lo largo que queráis el if.</p>
<p>La siguiente expresión comprueba si la variable es a,  b, c, otro o mas:</p>
<pre><code>/^(a|b|c|otro|mas)$/</code></pre>
<p>En PHP, con un preg_match, la papeleta está solucionada. Por ejemplo:</p>
<pre><code>if(!preg_match('/^(a|b|c|otro|mas)$/', $a) {
  // Si entra es que no hay coincidencias
  return null;
}</code></pre>
<p>Tras estas líneas, $a es sólo una de las opciones indicada y si no, habrá retornado null.</p>
<h3>Extraer cierta parte de un texto</h3>
<p>Partiendo de que tenemos una cadena de caracteres en $text y sabemos que en alguna parte suya cumple que tiene una cadena de texto (por ejemplo &#8216;jugador&#8217;) y un número separados por un guión (es decir, por ejemplo &#8216;jugador-15&#8242;) y queremos conocer ese número porque es su identificador. Podemos usar:</p>
<pre><code>preg_match('/player-(\d+)/', $text, $matches);
$id = $matches[1];</code></pre>
<p>Tras estas líneas, en $id tenemos nuestro número.</p>
<p>Esta expresión se puede extender todavía un poco más si el texto a buscar lo tenemos en una variable, por ejemplo $buscar.</p>
<p>En PHP podemos hacer:</p>
<pre><code>preg_match('/' . $buscar . '-(\d+)/', $text, $matches);
$id = $matches[1];</code></pre>
<p>Si estás usando javascript, el equivalente para este último caso es:</p>
<pre><code>var buscar = 'player';
var m = texto.match(new RegExp(buscar + '-(\d+)'));
var id = m[1];</code></pre>
<p>Y hasta aquí da mi memoria de momento. Cuando me acuerde de alguna otra, ya las iremos posteando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>5 expresiones regulares que todo programador web debería conocer</title>
		<link>http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/</link>
		<comments>http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 14:20:14 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=446</guid>
		<description><![CDATA[Extraigo de I&#8217;m Mike un artículo bastante interesante 5 expresiones regulares (también llamadas regexp) que deberías conocer si eres programador web. Bien es sabido por los que me conocen que considero las expresiones regulares como uno de los mejores método que se han inventado para los programadores (y en general, para cualquier persona que quiera [...]]]></description>
			<content:encoded><![CDATA[<p>Extraigo de <a href="http://immike.net/blog/2007/04/06/5-regular-expressions-every-web-programmer-should-know/">I&#8217;m Mike</a> un artículo bastante interesante 5 expresiones regulares (también llamadas regexp) que deberías conocer si eres programador web.</p>
<p>Bien es sabido por los que me conocen que considero las <a href="http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular">expresiones regulares</a> como uno de los mejores método que se han inventado para los programadores (y en general, para cualquier persona que quiera comprobar si una cadena de caracteres cumple ciertas características y posibilidades). Como definió <a href="http://www.twi/acidonitrix">@acidonitrix</a> en su momento: en todas las empresas hay algún loco que le encantan las expresiones regulares; pues bien, ¡ese es mi caso! (Ya me lo haré mirar algún día, pero de momento no molesta)</p>
<p>Pues bien, las 5 expresiones que Mike comenta son las siguientes</p>
<h3>Comprobar un nombre de usuario</h3>
<p>Esta es la más sencilla de todas. Comprueba si el nombre de usuario está compuesto únicamente por letras, mayúsculas o minúsculas, números de 0 a 9 o el guión bajo (<em>underscore</em>) y cuya longitud total sea entre 3 y 16 caracteres.</p>
<pre><code>/^[a-zA-Z0-9_]{3,16}$/</code></pre>
<h3>Buscar una etiqueta HTML/XHTML</h3>
<p>Partiendo del ejemplo de querer buscar la etiqueta <em>tag</em> aquí coincido con Mike en que la mejor forma (de las varias y farragosas que existen) es usar lo que se denomina un &#8220;cuantificador vago&#8221; (<em>lazy quantifier</em>) para obtener todo el contenido de la etiqueta.</p>
<pre><code>/&lt;tag[^&gt;]*&gt;(.*?)&lt;\/tag&gt;/</code></pre>
<p>Existen otras soluciones, pero ninguna tan directa como esta. Podríamos buscar el contenido por [^&gt;]*, pero eso nos obligaría a post-procesar el resultado ya que es posible que dentro de esa etiqueta tengamos otra.</p>
<h3>Buscar una etiqueta HTML/XHTML con cierto atributo y valor en su interior</h3>
<p>Esta expresión es algo más compleja y usa las referencias (<em>matching backreference</em>) que son los \\1 y \\2 para buscar el tag y la comilla o las dobles comillas que cierran el valor del atributo. Este truco también se podía haber usado antes, pero yo creo que queda más claro así.</p>
<p>Para este ejemplo, supongamos que se quiere buscar la etiqueta <em>tag</em>, el atributo <em>attribute</em> y el valor <em>value</em>:</p>
<pre><code>/&lt;tag[^&gt;]*attribute\s*=\s*(["'])value\\2[^&gt;]*&gt;(.*?)&lt;\/\\1&gt;/</code></pre>
<p>Cuando incluyáis esta regexp en PHP, tened cuidado en escapar una de las dos, según el carácter que uséis para crear la cadena de texto. Por ejemplo:</p>
<pre><code>preg_match('/&lt;tag[^&gt;]*attribute\s*=\s*(["\'])value\\2[^&gt;]*&gt;(.*?)&lt;\/\\1&gt;/', $text, $matches)</code></pre>
<p>Tengo que reconocer que esta expresión como esta no la he usado apenas. Las veces que he tenido que buscar algún atributo, solía ser más de uno o más complejo que una simple asignación y, partiendo del ejemplo anterior, el de buscar una etiqueta HTML/XHTML, procesaba el resultado.</p>
<h3>Comprobar una dirección de correo electrónico</h3>
<p>Esto ya son palabras mayores. La solución que se plantea, dada por <a href="http://www.iamcal.com/">Cal Henderson</a>, cumple con la <acronym title="Request For Comments">RFC</acronym> 822 que define cómo son las direcciones de correo electrónico. Poco más se puede añadir, no hay nada más completo:</p>
<pre><code>function is_valid_email_address($email){
  $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'.
                  '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  $quoted_pair = '\\x5c[\\x00-\\x7f]';
  $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
  $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
  $domain_ref = $atom;
  $sub_domain = "($domain_ref|$domain_literal)";
  $word = "($atom|$quoted_string)";
  $domain = "$sub_domain(\\x2e$sub_domain)*";
  $local_part = "$word(\\x2e$word)*";
  $addr_spec = "$local_part\\x40$domain";

  return preg_match("!^$addr_spec$!", $email) ? 1 : 0;
}</code></pre>
<h3>Comprabando una URL</h3>
<p>En mi sincera opinión, crear una regla genérica para comprobar una URL es un berenjenal horrible. Hace falta realizar alguna particularización. Seguidamente os pongo el código de I&#8217;m Mike.</p>
<pre><code>{
  \\b
  # Match the leading part (proto://hostname, or just hostname)
  (
    # http://, or https:// leading part
    (https?)://[-\\w]+(\\.\\w[-\\w]*)+
  |
    # or, try to find a hostname with more specific sub-expression
    (?i: [a-z0-9] (?:[-a-z0-9]*[a-z0-9])? \\. )+ # sub domains
    # Now ending .com, etc. For these, require lowercase
    (?-i: com\\b
        | edu\\b
        | biz\\b
        | gov\\b
        | in(?:t|fo)\\b # .int or .info
        | mil\\b
        | net\\b
        | org\\b
        | [a-z][a-z]\\.[a-z][a-z]\\b # two-letter country code
    )
  )

  # Allow an optional port number
  ( : \\d+ )?

  # The rest of the URL is optional, and begins with /
  (
    /
    # The rest are heuristics for what seems to work well
    [^.!,?;"\\'&lt;&gt;()\[\]\{\}\s\x7F-\\xFF]*
    (
      [.!,?]+ [^.!,?;"\\'&lt;&gt;()\\[\\]\{\\}\s\\x7F-\\xFF]+
    )*
  )?
}ix</code></pre>
<p>Como se puede comprobar es realmente una tarea complicada y, aunque esta regexp funciona bastante bien para la amplia mayoría de casos, hay <acronym title="Top Level Domain - Dominios del nivel más alto">TLD</acronym> que se deja como por ejemplo .name, .travel, etc.</p>
<p>Y de momento dejo el post aquí, ya que tengo en marcha otro sobre expresiones regulares que llegará en breve.</p>
<p>Update: ya tengo mi propio post sobre <a href="http://www.tatai.es/2009/08/22/mis-expresiones-regulares-favoritas/">expresiones regulares</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/08/22/5-expresiones-regulares-que-todo-programador-web-deberia-conocer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
