<?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>Asier Marqués &#187; PHP</title>
	<atom:link href="http://asiermarques.com/category/desarrollo-web/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://asiermarques.com</link>
	<description>apuntes personales, arquitectura web y negocios en internet</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:01:01 +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>Jugando con ips y redes en php</title>
		<link>http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/</link>
		<comments>http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 21:24:40 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1978</guid>
		<description><![CDATA[Por la naturaleza de mi entorno profesional, lidio con conceptos de IT y redes en mi día a día que me ayudan a tener frescos conceptos que aprendí hace ya algún tiempo cursando el temario del programa CCNA de Cisco &#8230; <a href="http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Por la naturaleza de mi entorno profesional, lidio con conceptos de IT y redes en mi día a día que me ayudan a tener frescos conceptos que aprendí hace ya algún tiempo cursando el temario del programa <a href="http://www.cisco.com/web/learning/netacad/course_catalog/CCNAexploration.html" target="_blank">CCNA</a> de Cisco y del <a href="http://www.microsoft.com/learning/en/us/certification/mcse.aspx" target="_blank">MCSE</a> de Microsoft.</p>
<p>Concretamente en el área de redes, es muy útil saber cómo hacer subredes o saber a qué red pertenece una ip en concreto haciendo operaciones AND binarias con las máscaras y direcciones a evaluar.</p>
<h3>Refresco de conceptos</h3>
<p>Las direcciones ip se clasifican en lo que llamamos &#8220;clases de red&#8221; según el número de hosts que dichas redes puedan soportar (siendo un host un ordenador, impresora o cualquier cacharro que conectemos a dicha red).</p>
<p>Usamos comúnmente las siguientes clases de red:</p>
<ul>
<li>Clase C, la más común, que puede tener hasta 254 dispositivos host conectados.</li>
<li>Clase B, que puede tener hasta 65.534 dispositivos host conectados.</li>
<li>Clase A, que puede tener hasta 16.777.214 dispositivos host conectados.</li>
</ul>
<p>Para saber de qué clase es una red o una dirección ip, usamos <a href="http://es.wikipedia.org/wiki/M%C3%A1scara_de_red" target="_blank">máscaras de red</a>. Las máscaras de red se componen de 4 fracciones y en cada una podemos rellenar hasta 8bits.</p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">En una dirección de clase C tendremos un total de 24bits, en binario podríamos expresarla entonces como 11111111.11111111.11111111.00000000 (24bits = 8bits + 8 bits +8bits + 0bits) y en decimal como 255.255.255.0 .</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">No necesitamos escribir la máscara completa para indicar que la ip 192.168.1.2 es de clase C por ejemplo, bastaría con indicar al final de la misma que su máscara tiene 24bits de la siguiente forma: 192.168.1.2/24 .</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">En el resto de clases, tendríamos 8bits para las redes de clase A y 16bits para las de clase B.</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">Sin embargo, aunque en entornos domésticos o de mediana empresa se usen estas clases de red para crear las redes a las cuales se conecten los ordenadores, servidores e impresoras de la organización, en una empresa que provee servicios de internet o que tiene muchos departamentos, le es muy útil poder partir esas redes en subredes.</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">Hay escenarios en los que nos interesa tener varias subredes con un número concreto de equipos en cada una de ellas. De esta forma aislamos a qué recursos puede acceder uno o varios equipos de una determinada subred.</span></p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;">Para hacer subredes lo que se suele hacer es usar máscaras de red personalizadas. </span>Por ejemplo, si tenemos la ip 192.168.129.3/18, tal y como hemos visto antes sabemos que su máscara de red tiene 18bits, es decir en binario 11111111.11111111.11000000.00000000 y en decimal 255.255.192.0. Ahora bien, al no tener una máscara de 16bits o de 24, ya que tenemos una fracción de las 4 sin rellenar totalmente por bits en la máscara de subred, no podríamos decir que esa ip pertenece a la red 192.168.129.0/24, ya que esta sería una dirección de red de clase C y la nuestra no pertenece a esa clase.</p>
<p>Para saber a qué dirección de red pertenece tenemos que hacer una operación AND a nivel de bits binarios entre la dirección ip y su máscara de red.</p>
<p>En este caso la operación quedaría así:</p>
<p><img class="size-full wp-image-1985" title="Operación con ips" src="http://asiermarques.com/wp-content/uploads/2011/09/and-ips.jpg" alt="Operación con ips" width="559" height="97" /></p>
<p>Al final deducimos que la dirección de red a la que pertenece la ip 192.168.129.3 es 192.128.0.0.</p>
<p>También podemos realizar operaciones para saber la cantidad de dispositivos que se pueden conectar a una determinada red o calcular una red que pueda albergar un determinado número de equipos.</p>
<p>Para calcular el número de dispositivos usamos la función <span style="color: #990000;"><strong>2</strong><sup>x</sup><strong> -2 </strong><span style="color: #000000;">donde X es la cantidad de bits disponibles en una subred es decir, el número de ceros que quedan al final de la misma. En la máscara de 18 bits que hemos usado en el ejemplo (11111111.11111111.11<span style="color: #800000;">000000.00000000</span>) serían 14 los bits disponibles (32bits posibles totales &#8211; 18 que estamos usando). </span></span></p>
<p><span style="color: #990000;"><span style="color: #000000;">Aplicando la fórmula nos daría un total de 16.382 cacharros que podríamos conectar a nuestra red.</span></span></p>
<h3>Utilizando php para realizar estos cálculos.</h3>
<p>En php disponemos de una serie de funciones y operadores que nos hacen muy sencillo realizar cálculos de este tipo y automatizar este trabajo que de hacerlo manual nos haría consumir tiempo y estaría propenso a errores.</p>
<p>En este escenario utilizaremos tan sólo dos cosas:</p>
<ul>
<li>La función <strong><a href="http://php.net/manual/es/function.ip2long.php" target="_blank">ip2long</a></strong> para pasar una dirección ip separada por puntos a su representación numérica para poder realizar operaciones posteriores con ella.</li>
<li>La función <strong><a href="http://es.php.net/manual/es/function.decbin.php" target="_blank">decbin</a></strong>, para pasar de decimal a binario.</li>
<li>El operador bitwise <strong>&amp;</strong> que es el que realizará la <strong>operación AND</strong> a nivel binario.</li>
</ul>
<p>Volviendo al anterior ejemplo, podemos saber a qué dirección de red pertenece la ip 192.168.129.3/18 de la siguiente forma:</p>
<pre class="brush: php;">

$ip_en_binario        = decbin( ip2long( &quot;192.168.129.3&quot; ) );

$mascara_en_binario   = decbin( ip2long( &quot;255.255.192.0&quot; ) );

$resultado_en_binario = $ip_en_binario &amp; $mascara_en_binario;

echo long2ip( bindec( $resultado_en_binario ) );
</pre>
<p>Tal y como esperábamos, el resultado que nos devuelve este script es 192.168.128.0, que es la dirección de red a la que pertenece la ip 192.168.129.3/18.</p>
<p>Con este sencillo ejemplo vemos el juego que le podemos sacar a todo esto.</p>
<p>Por un lado se ve de forma clara que si queremos saber a qué red pertenece una ip dada de todas las que tenemos en nuestra empresa, las cuales almacenamos en una base de datos, bastaría con pasar a binario cada ip y compararla al resultado de la operación efectuada en el ejemplo.</p>
<p>Pero lo realmente útil es saber que podemos guardar en base de datos la dirección directamente en binario, ahorrando un espacio importante en la tabla al evitarnos usar un campo tipo texto (clave para el rendimiento con índices en motores como inndb de mysql) y realizar directamente la búsqueda contra el registro que necesitemos.</p>
<p>También podríamos conocer muy fácilmente con la formula que hemos visto antes, el número de equipos que puedo conectar a una red seleccionada y en base a las ips que podríamos tener registradas, los &#8220;huecos&#8221; e ips disponibles para los equipos nuevos que tenga que conectar a esa red en un futuro.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2011/09/30/jugando-con-ips-y-redes-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony, wordpress o php desde 0</title>
		<link>http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/</link>
		<comments>http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 02:04:29 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Mis Proyectos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1508</guid>
		<description><![CDATA[Este post es una reflexión sobre si realmente utilizar un framework es el camino para desarrollar aplicaciones web o es mejor utilizar un cms como WordPress o quizá una estructura de clases propia que reutilicemos en los futuros proyectos que &#8230; <a href="http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este post es una reflexión sobre si realmente utilizar un framework es el camino para desarrollar aplicaciones web o es mejor utilizar un cms como WordPress o quizá una estructura de clases propia que reutilicemos en los futuros proyectos que afrontemos.</p>
<h3>Utilizar un framework como Symfony</h3>
<p>Para mí, adoptar <strong><a href="http://symfony-project.org/" target="_blank">Symfony</a> como framework</strong> ha sido una de las mejores decisiones que he tomado en mi historia como desarrollador web.</p>
<p>Symfony es un framework excelente, muy personalizable, extendible y automatizado que además, te enseña a programar bien.</p>
<p>¿Qué es programar bien? Para empezar, usar <strong>patrones de diseño</strong>, aprovechar todas las ventajas que ofrece la POO al máximo posible ademas de, por encima de todo, evitar repetirte.</p>
<p>Symfony no es el único framework que permite esto, también <a href="http://framework.zend.com/" target="_blank">Zend</a> es otra opción excelente.</p>
<p>Sin embargo, en los últimos meses he tenido la oportunidad de participar en proyectos fuera de las necesidades comunes. Ya sea por rendimiento o por la naturaleza de la aplicación, teníamos que especializar bastante funcionalidad del core de symfony, aprender casi de memoria los parámetros de <a href="http://www.symfony-project.org/reference/1_4/" target="_blank">los archivos .yml de configuración</a> o incluso, extender el framework para que cumpliese con los requisitos de la arquitectura de sistemas.</p>
<p>Esto supone en algunos casos muchas horas más que en un proyecto de php digamos &#8220;sin framework&#8221;, pero una vez conseguido el tiempo se reduce en la próxima ocasión que te encuentras con el mismo problema, si lo haces.</p>
<p>Hay pequeñas situaciones en las que debemos invertir tiempo para desarrollar pensando en el framework para obtener funcionalidad que sería trivial en un entorno sin framework. Sin embargo en general compensa porque nuestro código queda totalmente integrado con una arquitectura que tiene un nivel muy alto de calidad.</p>
<p>Pero otro problema aparece cuando de repente se anuncia una nueva versión del framework y empiezas a ver que todo lo que has aprendido en la versión 1, es completamente distinto <a href="http://www.symfony-reloaded.org/" target="_blank">en la versión 2</a>. Esto es algo bastante costoso de asumir para los desarrolladores ya que algunas de las ventajas más importantes de utilizar un framework son precisamente las que en este caso, se ha puesto en contra de todos nosotros:</p>
<ol>
<li>Todos habíamos aprendido a programar en nuestro día a día pensando en symfony, con sus configuraciones y la nomenclatura de sus clases.</li>
<li>Todos conocíamos perfectamente los nombres de los directorios, archivos de configuración y comportamientos de los métodos que se usan en las clases más importantes del framework, así como dónde teníamos que encontrar los recursos de documentación necesarios para nuestro día a día.</li>
<li>Habíamos desarrollado código reutilizable como plugins, concepto que desaparece en la próxima versión.</li>
</ol>
<p>Estos puntos son los más negros que quizá se puedan encontrar a la hora de decidirse por un framework que no sea uno nuestro propio. Sin embargo y a pesar de los mismos, creo que en general es una decisión muy buena el optar por un framework de desarrollo.</p>
<h3>Utilizar un CMS como WordPress</h3>
<p>Otra opción que existe es optar por un cms como <a href="http://wordpress.org" target="_blank">WordPress</a>. Hablo de WordPress porque es el que más conozco a &#8220;bajo nivel&#8221;. Si estás acostumbrado a utilizar un framework como Symfony, tienes la sensación al desarrollar bajo una plataforma para nada óptima (en cuanto a rendimiento se refiere) y que se salta a la torera cientos de recomendaciones sobre cómo desarrollar en un entorno POO.</p>
<p>Sin embargo el sistema funciona para la mayoría de proyectos medios o básicos, los diseñadores están encantados con él y ya lo conocen debido a la facilidad de uso de su sistema de themes, funciona sin tener que tocar prácticamente nada en la mayoría de plataformas de hosting y cubre con la necesidad funcional de todo sitio medio que no tenga necesidad de un desarrollo continuado.</p>
<p>Aunque sea una opción poco óptima fuera de la caja, en <a href="http://blackslot.com" target="_blank">Blackslot</a> tenemos corriendo varios sitios con decenas de miles de visitas al día basados en esta plataforma, con ayuda de soluciones de caché internas, teniendo aún margen para escalar a bastante más tráfico sin demandar grandes cantidades de recursos de servidor.</p>
<p>El problema reside más bien en el tipo de funcionalidad que quieres afrontar con el cms y la calidad que esperas obtener con el mismo. Yo no desarrollaría una intranet en WordPress por ejemplo, ni una plataforma de tienda electrónica para un negocio que dependa exclusivamente de esta plataforma para funcionar.</p>
<h3>Utilizar PHP desde 0</h3>
<p>Aunque durante muchos años he defendido el utilizar php sin frameworks hoy en día lo desaconsejo por completo.</p>
<p>Hace años no existía ninguna opción seria para php equiparable a un entorno .net por ejemplo. Hoy en día hay tantos que cuesta elegir.</p>
<p>No digo que debas elegir una de las opciones más maduras disponibles (que para mí sólo hay dos: Zend o Symfony). Lo que digo es que a menos que tu negocio sea una sola web y tengas el foco y todo tu tiempo puesta en ella, necesitas un framework para conseguir sobre todo estos puntos:</p>
<ol>
<li>Desarrollar con más programadores en el mismo proyecto sin que sea un caos.</li>
<li>Trabajar con más gente en el mismo proyecto. A diferencia del punto 1, tienes que tener en cuenta a diseñadores, maquetadores, analistas, gente de sistemas..</li>
<li>Tener una base reutilizable que os ahorre, a medida que desarrolléis con la misma, más y más tiempo.</li>
<li>Conseguir automatizar las tareas más repetitivas y centrarte en el código específico de la aplicación que te ocupe en ese momento.</li>
</ol>
<p>Aunque creas que lo mejor es ponerte a desarrollar un framework propio desde el principio, merece la pena conocer los frameworks que existen para aprender de miles de desarrolladores que han tenido muchos más problemas y por lo tanto tienen más experiencia que tú.</p>
<p>Desarrollar un framework sin haber utilizado otro antes como Symfony o asp.net mvc es una tarea muy compleja que puede hacerte perder mucho tiempo. Actualmente no es casualidad que Ruby On Rails, Symfony, asp.net mvc y otras opciones para desarrollo web escritas en diferentes lenguajes se parezcan entre sí. Esto es porque los problemas que nos solemos encontrar en el día a día son los mismos y es muy bueno conocer alguno de estos frameworks al detalle para orientarte sobre cómo debes organizar la arquitectura de una aplicación web seria.</p>
<p>En mi caso, incentivado por el cambio de versión de Symfony y por algunas de las cosas que no me han gustado o que he visto demasiado complejas en el mismo para solucionar determinados problemas, he empezado a diseñar y desarrollar en mis tiempos muertos un framework mucho más ligero y simple que Symfony pero pensado tanto para entornos tanto de hosting compartido como para arquitecturas más complejas.</p>
<p>Sin embargo no voy a dejar de utilizar ni Symfony ni WordPress. Me encanta Symfony y muchas de las cosas que he aprendido con este framework las estoy aplicando en este proyecto e incluso utilizo alguno de <a href="http://components.symfony-project.org/" target="_blank">sus componentes</a>. WordPress por su parte es la mejor opción para reducir costes en determinados proyectos que no requieran ni complejidad ni funcionalidad fuera de lo que se espera de un sistema de publicación.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2010/12/29/symfony-wordpress-o-php-desde-0/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Instalar extensión pecl de sphinx para php en debian</title>
		<link>http://asiermarques.com/2009/06/10/instalar-extension-pecl-de-sphinx-para-php-en-debian/</link>
		<comments>http://asiermarques.com/2009/06/10/instalar-extension-pecl-de-sphinx-para-php-en-debian/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 21:03:39 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=1140</guid>
		<description><![CDATA[Aunque se puede utilizar para más cosas, Sphinx es principalmente un motor de búsqueda de texto completo que puede usarse al trabajar normalmente con sistemas de bases de datos mysql y postgresql. Sphinx trae, en el paquete donde incluye su &#8230; <a href="http://asiermarques.com/2009/06/10/instalar-extension-pecl-de-sphinx-para-php-en-debian/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Aunque se puede utilizar para más cosas, <a href="http://www.sphinxsearch.com/" target="_blank">Sphinx</a> es principalmente un motor de búsqueda de texto completo que puede usarse al trabajar normalmente con sistemas de bases de datos mysql y postgresql.</p>
<p>Sphinx trae, en el paquete donde incluye su código fuente, una serie de librerías con las que se puede atacar a su demonio searchd, el encargado de hacer consultas a los índices que hayamos creado.</p>
<p>Aunque una de esas librerías está escrita en php, quizá nos interese más usar la librería escrita en c desde php, con el fin de comunicarnos de una forma más eficiente contra searchd.</p>
<p>Para ello lo primero que tenemos que hacer es compilar la librería libsphinxclient, que encontramos en el directorio que tiene su mismo nombre dentro de la carpeta api, en el código fuente de sphinx.</p>
<pre class="brush: bash;">
CXXCPP=&quot;gcc -E&quot; ./configure --prefix=/opt/sphinx
make
make install
</pre>
<p>Si no tenemos phpize, lo instalamos</p>
<pre class="brush: bash;">
apt-get install php5-dev
</pre>
<p>Ahora nos bajamos <a href="http://pecl.php.net/package/sphinx" target="_blank">la extensión pecl más reciente de sphinx</a>, descomprimimos el paquete y usamos phpize:</p>
<pre class="brush: bash;">
cd sphinx-1.0.0
phpize</pre>
<p>Configuramos y compilamos la extensión</p>
<pre class="brush: bash;">
./configure --with-sphinx=/opt/sphinx
make
make install
</pre>
<p>Y por último, podemos añadir un archivo sphinx.ini en /etc/php5/conf.d/ donde habilitamos la librería:</p>
<pre class="brush: bash;">
[sphinx]
extension=sphinx.so
</pre>
<p>Tras reiniciar el servidor web ya podemos trabajar con esta librería.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2009/06/10/instalar-extension-pecl-de-sphinx-para-php-en-debian/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>You Look Like You Could Use Some REST, Ben Ramsey</title>
		<link>http://asiermarques.com/2008/12/05/you-look-like-you-could-use-some-rest-ben-ramsey/</link>
		<comments>http://asiermarques.com/2008/12/05/you-look-like-you-could-use-some-rest-ben-ramsey/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 12:40:23 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Aplicaciones Web]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javaScript]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=932</guid>
		<description><![CDATA[Ben Ramsey hizo una presentación muy interesante hace unas semanas en la que aclaraba conceptos sobre REST y cómo lograr aproximarnos a un diseño RESTfull. Merece la pena echarle un vistazo You Look Like You Could Use Some REST! View &#8230; <a href="http://asiermarques.com/2008/12/05/you-look-like-you-could-use-some-rest-ben-ramsey/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://benramsey.com/about/" target="_blank">Ben Ramsey</a> hizo una presentación muy interesante hace unas semanas en la que aclaraba conceptos sobre <a href="http://es.wikipedia.org/wiki/REST" target="_blank">REST</a> y cómo lograr aproximarnos a un diseño RESTfull.</p>
<p>Merece la pena echarle un vistazo</p>
<div id="__ss_806520" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="You Look Like You Could Use Some REST!" href="http://www.slideshare.net/benramsey/you-look-like-you-could-use-some-rest-rest-and-the-resourceoriented-architecture-explained-presentation?type=powerpoint">You Look Like You Could Use Some REST!</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=restphpworks08-1228155264275583-9&amp;stripped_title=you-look-like-you-could-use-some-rest-rest-and-the-resourceoriented-architecture-explained-presentation" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=restphpworks08-1228155264275583-9&amp;stripped_title=you-look-like-you-could-use-some-rest-rest-and-the-resourceoriented-architecture-explained-presentation" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View SlideShare <a style="text-decoration:underline;" title="View You Look Like You Could Use Some REST! on SlideShare" href="http://www.slideshare.net/benramsey/you-look-like-you-could-use-some-rest-rest-and-the-resourceoriented-architecture-explained-presentation?type=powerpoint">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/http">http</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/resource-oriented">resource-oriented</a>)</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/12/05/you-look-like-you-could-use-some-rest-ben-ramsey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En ocasiones curl devuelve cadena vacía al enviar peticiones POST</title>
		<link>http://asiermarques.com/2008/11/18/en-ocasiones-curl-devuelve-cadena-vacia-al-enviar-peticiones-post/</link>
		<comments>http://asiermarques.com/2008/11/18/en-ocasiones-curl-devuelve-cadena-vacia-al-enviar-peticiones-post/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 09:54:05 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=906</guid>
		<description><![CDATA[Ayer estuve mosqueado con un problema que me daba curl a la hora en enviar peticiones post con php. Mi aplicación se conectaba a una api que me devolvía un resultado en json, pero en lugar de eso me devolvía &#8230; <a href="http://asiermarques.com/2008/11/18/en-ocasiones-curl-devuelve-cadena-vacia-al-enviar-peticiones-post/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ayer estuve mosqueado con un problema que me daba curl a la hora en enviar peticiones post con php.</p>
<p>Mi aplicación se conectaba a una api que me devolvía un resultado en json, pero en lugar de eso me devolvía una cadena vacía a menos que fallase la autenticación. Lo que me mosqueaba es que sólo fallaba con peticiones POST y no con peticiones GET.</p>
<p>Examinando las cabeceras HTTP de respuesta se mostraba un error indicado como <strong>&#8220;HTTP/1.1 417 Expectation Failed Connection: close Content-Length: 0</strong><strong>&#8220;</strong></p>
<p>La solución al problema es enviar el campo <strong><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20" target="_blank">Expect</a></strong> (vale con mandarlo vacío) dentro de las cabeceras http de la petición, por ejemplo:</p>
<pre class="brush: php;">

$ch = curl_init();

//metemos el campo expect en la cabeceras

curl_setopt( $ch,

CURLOPT_HTTPHEADER,

$headers = array( &quot;Expect:&quot;)

);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/11/18/en-ocasiones-curl-devuelve-cadena-vacia-al-enviar-peticiones-post/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ordenar arrays multidimensionales en base a una clave asociativa con php</title>
		<link>http://asiermarques.com/2008/10/29/ordenar-arrays-multidimensionales-en-base-a-una-clave-asociativa-con-php/</link>
		<comments>http://asiermarques.com/2008/10/29/ordenar-arrays-multidimensionales-en-base-a-una-clave-asociativa-con-php/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 01:52:47 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=852</guid>
		<description><![CDATA[Algunas veces disponemos de un array que contiene a su vez varios arrays asociativos, que contienen por ejemplo datos obtenidos tras una consulta a la base de datos. Puede que dicho array esté cacheado y no queramos atacar a la &#8230; <a href="http://asiermarques.com/2008/10/29/ordenar-arrays-multidimensionales-en-base-a-una-clave-asociativa-con-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Algunas veces disponemos de un array que contiene a su vez varios arrays asociativos, que contienen por ejemplo datos obtenidos tras una consulta a la base de datos.</p>
<p>Puede que dicho array esté cacheado y no queramos atacar a la base de datos para ordenar esos resultados, por lo que nos vendría genial poder <strong>ordenar los arrays asociativos que contenga dicho array</strong>, en base a los valores que contenga una de las claves de los mismos.</p>
<p>Lo vemos más claro en un ejemplo. Tenemos el siguiente array:</p>
<pre class="brush: php;">

$resultados = array(

array(

'id' =&gt; 1,
'nombre' =&gt; 'Enjuto',
'apellido' =&gt; 'Mojamuto'

),

array(

'id' =&gt; 2,
'nombre'  =&gt; 'Marlo',
'apellido'  =&gt; 'Brando'

)

);
</pre>
<p>En php disponemos de la función <a href="http://es.php.net/usort" target="_blank">usort()</a>, que ordena en base a una función de comparación que nosotros especifiquemos.</p>
<p>Por ejemplo si quisiéramos ordenar en base a la clave id, en orden descendiente, la función sería:</p>
<pre class="brush: php;">

function comparar($x, $y){

if ( $x['id'] == $y['id'] )
return 0;
else if ( $x['id'] &gt; $y['id'] )
return -1;
else
return 1;

}
</pre>
<p>Y ahora llamamos a usort para que utilice dicha función:</p>
<pre class="brush: php;">

//si no estamos en un entorno Orientado a Objetos

usort($resultados, array('comparar'));

//si estamos en un entorno Orientado a Objetos

usort($resultados, array('nombreDeClase','comparar'));
</pre>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/10/29/ordenar-arrays-multidimensionales-en-base-a-una-clave-asociativa-con-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perfeccionismo</title>
		<link>http://asiermarques.com/2008/10/29/perfeccionismo/</link>
		<comments>http://asiermarques.com/2008/10/29/perfeccionismo/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 00:52:27 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=848</guid>
		<description><![CDATA[Viñeta por Juan Lao Tebar / CC BY-SA 2.5 Una de las cosas que más tiempo nos hace &#8220;perder&#8221; en el desarrollo web.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" src="http://farm4.static.flickr.com/3250/2982194283_5f8f3f8feb.jpg" alt="" width="450" /></p>
<h6 style="text-align: center;"><a rel="cc:attributionURL" href="http://imageeknation.blogspot.com/2008/09/epoch-bug.html" target="_blank">Viñeta por Juan Lao Tebar</a> / <a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/es/">CC BY-SA 2.5</a></h6>
<p style="text-align: center;">Una de las cosas que más tiempo nos hace &#8220;perder&#8221; en el desarrollo web.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/10/29/perfeccionismo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FirePHP, debug para php integrado en Firebug</title>
		<link>http://asiermarques.com/2008/09/02/firephp-debug-para-php-integrado-en-firebug/</link>
		<comments>http://asiermarques.com/2008/09/02/firephp-debug-para-php-integrado-en-firebug/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 11:21:57 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=718</guid>
		<description><![CDATA[FirePHP es una extensión para Firebug, que combinándola con una clase php que usemos en el lado del servidor, nos permite ver y crear trazas de errores en el mismo. Dispone de integración para la mayoría de los frameworks de &#8230; <a href="http://asiermarques.com/2008/09/02/firephp-debug-para-php-integrado-en-firebug/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.firephp.org/" target="_blank">FirePHP</a> es una extensión para <a href="http://getfirebug.com/" target="_blank">Firebug</a>, que combinándola con una clase php que usemos en el lado del servidor, nos permite ver y crear trazas de errores en el mismo.</p>
<p>Dispone de integración para la mayoría de los frameworks de php, algunos cms como Drupal y <a href="http://www.firephp.org/Wiki/Reference/Protocol" target="_blank">un protocolo</a> propio que permite crear librerías para otros lenguajes que se puedan comunicar con el plugin para FireBug.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm4.static.flickr.com/3047/2821387272_389a4b8a0e.jpg" alt="FirePHP" width="422" height="457" /></p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/09/02/firephp-debug-para-php-integrado-en-firebug/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP 5.3, cosas que deberías saber si lo vas a usar bajo Microsoft Windows</title>
		<link>http://asiermarques.com/2008/08/28/php-53-cosas-que-deberias-saber-si-lo-vas-a-usar-bajo-microsoft-windows/</link>
		<comments>http://asiermarques.com/2008/08/28/php-53-cosas-que-deberias-saber-si-lo-vas-a-usar-bajo-microsoft-windows/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 02:18:40 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sistemas]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=698</guid>
		<description><![CDATA[La próxima versión de php incluirá una serie de cambios generales, como la introducción de namespaces por ejemplo, que afectarán a todos las versiones de los diferentes sistemas operativos. Pero en la versión para Microsoft Windows se incluyen una serie &#8230; <a href="http://asiermarques.com/2008/08/28/php-53-cosas-que-deberias-saber-si-lo-vas-a-usar-bajo-microsoft-windows/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La próxima versión de php incluirá una serie de <a href="http://wiki.php.net/doc/scratchpad/upgrade/53" target="_blank">cambios generales</a>, como la introducción de namespaces por ejemplo, que afectarán a todos las versiones de los diferentes sistemas operativos.</p>
<p>Pero <strong>en la versión para Microsoft Windows se incluyen una serie de <a href="http://wiki.php.net/internals/windows/releasenotes" target="_blank">cambios</a></strong> que debemos conocer los que desarrollamos bajo esta plataforma.</p>
<p>- Sólo serán soportados Windows 2000, XP, Server 2003, Vista y Server 2008. Se elimina el soporte para Windows 98, ME, and NT.</p>
<p>- Las nuevas versiones de php a partir de esta versión usarán el compilador VC9 (Microsoft Visual C++ 2008) por lo que requiere la librería msvcr90.dll. Si usas el instalador oficial, este incluirá dicha librería automáticamente.</p>
<p>Por razones de compatibilidad con algunas extensiones y con el servidor web Apache, durante las versiones php5.3.x se tendrá que utilizar la versión compatible con VC6, el cual data de 1998. En las siguientes versiones de php éste solo podrá ser compilado con VC9.</p>
<p>- Se incluirán versiones de 64 bits pero tendrán un soporte experimental por el momento.</p>
<p>- Las extensiones PECL no serán incluidas en php hasta que el nuevo sistema de compilado de PECL funcione correctamente.</p>
<p>- Los binarios se publicarán al mismo tiempo que el código fuente.</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/08/28/php-53-cosas-que-deberias-saber-si-lo-vas-a-usar-bajo-microsoft-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usar twitter para monitorizar los errores en tu aplicación web php</title>
		<link>http://asiermarques.com/2008/08/28/usar-twitter-para-monitorizar-los-errores-en-tu-aplicacion-web-php/</link>
		<comments>http://asiermarques.com/2008/08/28/usar-twitter-para-monitorizar-los-errores-en-tu-aplicacion-web-php/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 01:32:27 +0000</pubDate>
		<dc:creator>Asier</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Innovación]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://asiermarques.com/?p=695</guid>
		<description><![CDATA[Johannes Schlüter se ha programado una extensión para php, que captura los errores generados en una aplicación web y los publica en twitter. Este es un posible uso muy inteligente de Twitter, ya que si pensamos en la eficaz que &#8230; <a href="http://asiermarques.com/2008/08/28/usar-twitter-para-monitorizar-los-errores-en-tu-aplicacion-web-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://schlueters.de/blog/archives/80-I-have-nothing-to-say-but-maybe-PHP....html" target="_blank"><strong>Johannes Schlüter</strong> se ha programado una extensión para php</a>, que <a href="http://es.php.net/manual/es/book.errorfunc.php" target="_blank">captura los errores</a> generados en una aplicación web y los publica en <a href="http://twitter.com" target="_blank">twitter</a>.</p>
<p>Este es <strong>un posible uso muy inteligente de Twitter</strong>, ya que si pensamos en la eficaz que sería dicho servicio web <strong>usado como monitorización de errores</strong>, podemos ver una aplicación profesional y de gran utilidad al concepto de microblogging.</p>
<h3><strong>Lo vemos en un ejemplo</strong></h3>
<p>Imagina un equipo de 4 desarrolladores, y que cada uno tuviese una cuenta de twitter. Se crea una cuenta en twitter de usuario adicional, pero con el perfil privado. Esta cuenta es a la que se envían todos los mensajes de error de nuestra aplicación en producción.</p>
<p>Cuando la aplicación en producción genere un error inmediatamente el perfil de nuestro usuario se actualiza, avisando a nuestros 4 desarrolladores responsables de nuestro proyecto.</p>
<p>Los avisos les llegarían a su cliente de mensajería instantánea y al teléfono móvil. De esta forma controlarían cuando su sitio web esta caído y pueden llevar el seguimiento de los errores en el sitio.</p>
<p>Es posible que un servicio profesional especializado en este tipo de cosas, sea un proyecto útil e interesante para desarrollar. Pensaré en ello&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://asiermarques.com/2008/08/28/usar-twitter-para-monitorizar-los-errores-en-tu-aplicacion-web-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

