<?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>Alexander Garzon &#187; php</title>
	<atom:link href="http://agarzon.php.com.ve/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://agarzon.php.com.ve</link>
	<description>... porque no todo es PHP.</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:57:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Manifiesto del programador PHP</title>
		<link>http://agarzon.php.com.ve/manifiesto-del-programador-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=manifiesto-del-programador-php</link>
		<comments>http://agarzon.php.com.ve/manifiesto-del-programador-php/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 01:46:32 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[reflexión]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=482</guid>
		<description><![CDATA[Yo soy un programador PHP No soy un programador Zend Framework o CakePHP. Pienso que PHP es bastante complicado suficientemente complejo. Me gusta construir cosas pequeñas Me gusta construir cosas pequeñas con propósitos simples. Me gusta hacer cosas que resuelven problemas. Me gusta construir cosas pequeñas que trabajan juntas para resolver grandes problemas. Quiero escribir [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Yo soy un programador PHP</strong></p>
<ul>
<li>No soy un programador Zend Framework o CakePHP.</li>
<li>Pienso que PHP es <del datetime="2012-02-05T15:57:26+00:00">bastante complicado</del> suficientemente complejo.</li>
</ul>
<p><strong>Me gusta construir cosas pequeñas</strong></p>
<ul>
<li>Me gusta construir cosas pequeñas con propósitos simples.</li>
<li>Me gusta hacer cosas que resuelven problemas.</li>
<li>Me gusta construir cosas pequeñas que trabajan juntas para resolver  grandes problemas.</li>
</ul>
<p><strong>Quiero escribir menos código, no más</strong></p>
<ul>
<li>Quiero escribir menos código, no más.</li>
<li>Quiero manejar menos código, no más.</li>
<li>Quiero soportar menos código, no más.</li>
<li>Necesito justificar cada pieza de código que agrego a un proyecto.</li>
</ul>
<p><strong>Me gusta el código simple, legible</strong></p>
<ul>
<li>Quiero escribir código que sea fácil de entender.</li>
<li>Quiero que el código sea fácilmente verificable. </li>
</ul>
<p>Traducción al español de: <a href="http://microphp.org/" target="_blank">http://microphp.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/manifiesto-del-programador-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La mejor forma de obtener la IP real con PHP</title>
		<link>http://agarzon.php.com.ve/la-mejor-forma-de-obtener-la-ip-real-con-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=la-mejor-forma-de-obtener-la-ip-real-con-php</link>
		<comments>http://agarzon.php.com.ve/la-mejor-forma-de-obtener-la-ip-real-con-php/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 01:18:30 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=474</guid>
		<description><![CDATA[&#60;?php function getIP(){ if( isset( $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;] )) $ip = $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;]; else if( isset( $_SERVER [&#039;HTTP_VIA&#039;] )) $ip = $_SERVER[&#039;HTTP_VIA&#039;]; else if( isset( $_SERVER [&#039;REMOTE_ADDR&#039;] )) $ip = $_SERVER[&#039;REMOTE_ADDR&#039;]; else $ip = null ; return $ip; } ?&#62;]]></description>
			<content:encoded><![CDATA[<pre class="brush: php; ">

&lt;?php
function getIP(){
    if( isset( $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;] )) $ip = $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;];
    else if( isset( $_SERVER [&#039;HTTP_VIA&#039;] ))  $ip = $_SERVER[&#039;HTTP_VIA&#039;];
    else if( isset( $_SERVER [&#039;REMOTE_ADDR&#039;] ))  $ip = $_SERVER[&#039;REMOTE_ADDR&#039;];
    else $ip = null ;
    return $ip;
}
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/la-mejor-forma-de-obtener-la-ip-real-con-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calcular la distancia entre dos coordenadas geográficas</title>
		<link>http://agarzon.php.com.ve/calcular-la-distancia-entre-dos-coordenadas-geograficas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=calcular-la-distancia-entre-dos-coordenadas-geograficas</link>
		<comments>http://agarzon.php.com.ve/calcular-la-distancia-entre-dos-coordenadas-geograficas/#comments</comments>
		<pubDate>Mon, 16 May 2011 16:38:19 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[geografia]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=419</guid>
		<description><![CDATA[Tenía tiempo sin escribir, así que para ponernos al día voy a redactar este pequeño artículo donde les contaré como calcular la distancia geográfica entre dos coordenadas dadas. Hoy día con todo esto de la web 2.0 y las geo-posiciones, nos hemos acostumbrado un poco a ver los mapas en 2D (como Google Map), y [...]]]></description>
			<content:encoded><![CDATA[<p>Tenía tiempo sin escribir, así que para ponernos al día voy a redactar este pequeño artículo donde les contaré como calcular la distancia geográfica entre dos coordenadas dadas.</p>
<p>Hoy día con todo esto de la web 2.0 y las geo-posiciones, nos hemos acostumbrado un poco a ver los mapas en 2D (como Google Map), y puede que en algún momento necesitemos calcular determinadas distancias entre 2 puntos de referencia. Y como es obvio, no podemos hacerlo sobre un plano cartesiano ya que nuestro querido planeta tierra no es plano ;-)</p>
<pre class="brush: php; ">

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  $unit = strtoupper($unit);

  if ($unit == &quot;K&quot;) {
    return ($miles * 1.609344);
  } else if ($unit == &quot;N&quot;) {
      return ($miles * 0.8684);
    } else {
        return $miles;
      }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/calcular-la-distancia-entre-dos-coordenadas-geograficas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CodeIgniter 2.0 Liberado (y en Español)</title>
		<link>http://agarzon.php.com.ve/codeigniter-2-0-liberado-espanol/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=codeigniter-2-0-liberado-espanol</link>
		<comments>http://agarzon.php.com.ve/codeigniter-2-0-liberado-espanol/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 18:34:16 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=390</guid>
		<description><![CDATA[Una grata noticia ! el mejor framework PHP ha liberado su versión 2.0 con decenas y notables mejoras. Descargar: http://codeigniter.com/download.php Y para agregarle la cereza a nuestro cóctel también tenemos el paquete oficial en Español (al cual le eché una manito ;-) ) Descargar: http://mygengo.com/string/p/codeigniter-2-1/export/language/es/ Estoy considerando traducir la guía oficial completa al español, ¿voluntarios?]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img src="http://agarzon.php.com.ve/wp-content/uploads/2010/11/codeigniter-v2.gif" alt="codeigniter 2.0" title="codeigniter 2.0" width="247" height="244" class="aligncenter size-full wp-image-323" /></a></p>
<p>Una grata noticia ! el mejor framework PHP ha liberado su versión 2.0 con decenas y notables mejoras.</p>
<p>Descargar: <a href="http://codeigniter.com/download.php">http://codeigniter.com/download.php</a></p>
<p>Y para agregarle la cereza a nuestro cóctel también tenemos el paquete oficial en Español (al cual le eché una manito ;-) )<br />
Descargar: <a href="http://mygengo.com/string/p/codeigniter-2-1/export/language/es/">http://mygengo.com/string/p/codeigniter-2-1/export/language/es/</a></p>
<p>Estoy considerando traducir la guía oficial completa al español, ¿voluntarios?</p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/codeigniter-2-0-liberado-espanol/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Un buen desayuno con Zend</title>
		<link>http://agarzon.php.com.ve/un-buen-desayuno-con-zend/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=un-buen-desayuno-con-zend</link>
		<comments>http://agarzon.php.com.ve/un-buen-desayuno-con-zend/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 14:06:44 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[venezuela]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=362</guid>
		<description><![CDATA[Está mañana a las 8:30 ha tocado el cartero a mi puerta, nada del otro mundo considerando que nos llegan todo tipo de papeles varias veces por semana. Pero en esta ocasión trajo algo muy particular&#8230; algo que procedía de Cupertino, California. Ya había visto algunas fotos de como sería el famoso certificado, de hecho [...]]]></description>
			<content:encoded><![CDATA[<p>Está mañana a las 8:30 ha tocado el cartero a mi puerta, nada del otro mundo considerando que nos llegan todo tipo de papeles varias veces por semana.</p>
<p>Pero en esta ocasión trajo algo muy particular&#8230; algo que procedía de Cupertino, California.</p>
<p style="text-align: center;"><a href="http://agarzon.php.com.ve/wp-content/uploads/2010/12/DSC09214.jpg"><img src="http://agarzon.php.com.ve/wp-content/uploads/2010/12/DSC09214-300x225.jpg" alt="Zend" title="Zend" width="300" height="225" class="aligncenter size-medium wp-image-363" /></a></p>
<p>Ya había visto algunas fotos de como sería el famoso certificado, de hecho ya estaba consciente de que el diseño lo habían &#8220;modernizado&#8221;, lo que no imaginaba era el momento en que yo mismo tendría la oportunidad de hacer lo mismo :-)</p>
<p style="text-align: center;"><a href="http://agarzon.php.com.ve/wp-content/uploads/2010/12/DSC09217.jpg"><img src="http://agarzon.php.com.ve/wp-content/uploads/2010/12/DSC09217-300x225.jpg" alt="ZCE Certificado" title="ZCE Certificado" width="300" height="225" class="aligncenter size-medium wp-image-366" /></a></p>
<p>Ahora si puedo decir que la arepita con queso e&#8217; mano que me estaba comiendo, sabe ahora mucho mejor !</p>
<p>¿Qué más puedo decir?, pues sólo aconsejar a quienes me leen, que si tienen oportunidad de certificarse, HÁGALO!</p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/un-buen-desayuno-con-zend/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Traducción al español de CodeIgniter 2.0</title>
		<link>http://agarzon.php.com.ve/traduccion-al-espanol-de-codeigniter-2-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=traduccion-al-espanol-de-codeigniter-2-0</link>
		<comments>http://agarzon.php.com.ve/traduccion-al-espanol-de-codeigniter-2-0/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 17:11:15 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=344</guid>
		<description><![CDATA[Me tomé la libertad de acomodar la traducción al español del CodeIgniter 1.7.2 para adaptarla al 2.0 Y he aquí: DESCARGAR Espero les sea de utilidad. Editado: El link de descarga ahora ya no está en mediafire, sino en el sitio oficial de codeigniter.]]></description>
			<content:encoded><![CDATA[<p>Me tomé la libertad de acomodar la traducción al español del <a href="http://codeigniter.com/wiki/File:spanish_1.7.2.zip/">CodeIgniter 1.7.2</a> para adaptarla al 2.0 </p>
<p>Y he aquí: <a href="http://mygengo.com/string/p/codeigniter-2-1/export/language/es/">DESCARGAR</a></p>
<p>Espero les sea de utilidad.</p>
<p><strong>Editado</strong>: El link de descarga ahora ya no está en mediafire, sino en el sitio oficial de codeigniter.</p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/traduccion-al-espanol-de-codeigniter-2-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>10 errores comunes cuando se trabaja con MySQL</title>
		<link>http://agarzon.php.com.ve/10-errores-comunes-cuando-se-trabaja-con-mysql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=10-errores-comunes-cuando-se-trabaja-con-mysql</link>
		<comments>http://agarzon.php.com.ve/10-errores-comunes-cuando-se-trabaja-con-mysql/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 16:10:30 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=326</guid>
		<description><![CDATA[Lo primero, decir que está es una traducción y adaptación libre del artículo cuyo autor es Craig Buckler. Aclarado ello, conozcamos los 10 errores más comunes que cometen muchos programadores PHP cuando trabajan con MySQL. 1. Usar MyISAM en lugar de InnoDB. MySQL tiene un considerable número de motores de almacenamiento, entre los cuales lo [...]]]></description>
			<content:encoded><![CDATA[<p>Lo primero, decir que está es una traducción y adaptación libre del <a href="http://blogs.sitepoint.com/2010/11/19/mysql-mistakes-php-developers/">artículo</a> cuyo autor es Craig Buckler. Aclarado ello, conozcamos los 10 errores más comunes que cometen muchos programadores PHP cuando trabajan con MySQL.</p>
<p><strong>1. Usar MyISAM en lugar de InnoDB.</strong><br />
MySQL tiene un considerable número de motores de almacenamiento, entre los cuales lo más destacados con MyISAM e InnoDB.</p>
<p>Pero MyISAM es quien viene por defecto en toda instalación MySQL. Y muchos ignoramos esto y sencillamente lo dejamos así, pero MyISAM no soporta foreign key ni transacciones. Además, la tabla completa es bloqueada cada vez que insertamos o actualizamos un registro causando problemas de rendimiento.</p>
<p>La solución es simple: Usar InnoDB</p>
<p><strong>2. Usar las funciones mysql de PHP.</strong><br />
PHP provee un amplio set de funciones para trabajar con MySQL, y eso ha sido así desde el principio (muchos años). Funciones tales como mysql_connect, mysql_query, mysql_fetch_assoc, etc. pero ignoramos una importante mejora implementada desde PHP 5: la librería mysqli.</p>
<p>Y tal como cita el <a href="http://php.net/manual/es/mysqli.overview.php">manual oficial de PHP</a>:</p>
<blockquote><p>
Si se utiliza una versión de MySQL 4.1.3 o posterior, se recomienda encarecidamente utilizar la extensión mysqli en su lugar.
</p></blockquote>
<p>mysqli tiene notables ventajas:</p>
<ul>
<li>Una interfaz opcional orientada a objetos</li>
<li>Prepared Statements (sentencias preparadas) que ayudan a prevenir los ataques de inyección SQL e incrementa el performance.</li>
<li>Soporta la ejecución de múltiples sentencias y transacciones</li>
</ul>
<p>Además, usted podría considerar usar <a href="http://php.net/manual/es/book.pdo.php">PDO</a> si planea dar soporte a distintos tipos de bases de datos.</p>
<p><strong>3. No filtrar las entradas del usuario</strong><br />
Este es quizá el peor de todos los errores. <strong>NUNCA CONFÍE EN LO QUE LOS USUARIOS ENVÍEN</strong>. Validar todo desde el lado del servidor es algo obligatorio, no confíe en las validaciones JavaSript. Atacar un sitio por inyección SQL es tan simple como:</p>
<pre class="brush: php; ">

$username = $_POST[&quot;name&quot;];
$password = $_POST[&quot;password&quot;];
$sql = &quot;SELECT userid FROM usertable WHERE username=&#039;$username&#039; AND password=&#039;$password&#039;;&quot;;
// run query...
</pre>
<p>Esto puede ser crackeado con tan sólo ingresar  &#8220;admin&#8217;; &#8211;&#8221; en el campo de username. La cadena SQL quedaría así:</p>
<pre class="brush: sql; ">

SELECT userid FROM usertable WHERE username=&#039;admin&#039;;  
</pre>
<p>El atacante ha logrado ingresar al sistema como &#8216;admin&#8217; sin siquiera necesitar el password, porque fue comentado dentro del SQL.</p>
<p><strong>4. No usar UTF-8</strong><br />
Un gran problema respecto al manejo de los caracteres y la internacionalización (otros idiomas) es el mal uso del charset. Sin importar si lo que desarrollamos sea en inglés o español (o cualquier otro) usar UTF-8 es una gran solución. Aunque PHP no ofrezca del todo un soporte a UTF-8 (al menos hasta la versión PHP 6) MySQL si posee dicho soporte, <a href="http://dev.mysql.com/doc/refman/5.1/en/charset.html">MySQL character sets</a> </p>
<p><strong>5. Favorecer a PHP por sobre MySQL</strong><br />
MySQL posee un amplio set de funciones que puede correr como parte de la sentencia QUERY, pero muchos lo ignoramos.</p>
<p>Por ejemplo, para obtener un valor promedio de los salarios en una tabla, un programador realizaría una consulta a MySQL y traería hasta PHP todos los registros a calcular; y posteriormente realizaría el cálculo del promedio con la aritmética de PHP (y que es el lenguaje que conoce); pero la mejor opción hubiese sido aprovechar la función <a href="http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_avg">AVG()</a> que trae MySQL y nos ahorramos procesos innecesarios.</p>
<p>La regla general es usar en la mayor medida posible las funciones pre-construidas en la base de datos, ahorrando procesos a PHP.</p>
<p><strong>6. No optimizar las consultas</strong><br />
El 99% de los problemas de performance en PHP se deben a sentencias y consultas SQL mal hechas. MySQL cuenta con herramientas que nos permiten medir y probar nuestras consultas a fin de buscar mejores opciones. <a href="http://dev.mysql.com/doc/refman/5.1/en/using-explain.html">Sentencia EXPLAIN</a>, <a href="http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html">Query Profiler</a> y <a href="http://www.jetprofiler.com/">algunas</a> <a href="http://myprofi.sourceforge.net/">otras</a> <a href="http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html">herramientas</a> que le ayudaran a robustecer sus SELECT.</p>
<p><strong>7. Usar tipos de campo inadecuados</strong><br />
MySQL ofrece un amplio rango de tipos numéricos, cadenas y de fechas. Si usted va a almacenar una fecha, use el campo indicado para ello DATE o DATETIME. Usar enteros o cadenas para ello, sólo le traerá problemas.</p>
<p>Es importante determinar cual es el tipo de campo ideal para cada dato que vaya a almacenar. Piénselo bien, MySQL ofrece bastante de donde escoger.</p>
<p><strong>8. Usar * en las consultas SELECT</strong><br />
Es un error terriblemente común. No use * para retornar todas las columnas de una tabla. No sea flojo ! Sea específico en definir cuales campos desea consultar, incluso si los llega a necesitar todos.</p>
<p><strong>9. No indexar o indexar más de lo necesario</strong><br />
Como regla de oro, indexe sólo donde una columna sea solicitada en una sentencia WHERE de una consulta SELECT. Saber hacerlo mejorará el performance de su base de datos y en consecuencia incrementará la velocidad de todo su sistema.</p>
<p><strong>10. Olvidar respaldar !</strong><br />
Aunque no lo crea, las cosas no siempre funcionan como esperamos. Las bases de datos se pueden corromper, el disco duro estropearse, un incendio puede consumir su datacenter e incluso su proveedor puede irse a banca rota !</p>
<p>Perder datos es algo catastrófico e imperdonable, tome todas las medidas necesarias para tener siempre a mano respaldos de sus datos, de forma automatizada y remota.</p>
<p><strong>11 La ñapa:  no considerar otras bases de datos.</strong><br />
MySQL es sin duda uno de los más famosos y extendidos entre los programadores PHP, pero no es la única opción. Existen muchas alternativas como <a href="http://www.postgresql.org/">PostgreSQL</a> y <a href="http://www.firebirdsql.org/">Firebird</a> quienes son además Software Libre y no controlados por una corporación como sí lo es MySQL. Incluso <a href="http://www.sqlite.org/">SQLite</a> puede resultar en una interesante alternativa para aplicaciones pequeñas y embebidas.</p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/10-errores-comunes-cuando-se-trabaja-con-mysql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>¿Cual es la edad ideal de un Programador Senior PHP ?</title>
		<link>http://agarzon.php.com.ve/%c2%bfcual-es-la-edad-ideal-de-un-programador-senior-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25c2%25bfcual-es-la-edad-ideal-de-un-programador-senior-php</link>
		<comments>http://agarzon.php.com.ve/%c2%bfcual-es-la-edad-ideal-de-un-programador-senior-php/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 23:34:04 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[reflexión]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=303</guid>
		<description><![CDATA[No cabe duda que los muchachos de hoy día son unos genios desde que nacen, desde que los primeros rayos de luz tocan sus retinas ya están observando y comprendiendo un mundo mucho muy diferente al que conocimos en el pasado, rodeados de nuevas tecnologías que aun nos sorprende; y sin duda cada nueva generación [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img src="http://agarzon.php.com.ve/wp-content/uploads/2010/09/tux-ninja_ronchon_tux.png" alt="" title="TUX Ninja" width="256" height="256" class="aligncenter size-full wp-image-309" /></p>
<p>No cabe duda que los muchachos de hoy día son unos genios desde que nacen, desde que los primeros rayos de luz tocan sus retinas ya están observando y comprendiendo un mundo mucho muy diferente al que conocimos en el pasado, rodeados de nuevas tecnologías que aun nos sorprende; y sin duda cada nueva generación será más &#8220;avanzada&#8221; aún.</p>
<p>Lo mismo sucede con la genialidad tecnológica, grandes genios (y ahora multimillonarios) son muchachos muy jóvenes. Por citar a <a href="http://es.wikipedia.org/wiki/Sergey_Brin">Sergey Brin</a> y <a href="http://es.wikipedia.org/wiki/Larry_Page">Larry Page</a> los creadores de <a href="http://google.com/">Google </a>o a <a href="http://es.wikipedia.org/wiki/Mark_Zuckerberg">Mark Zuckerberg</a> el genio detrás de <a href="http://www.facebook.com/">Facebook</a>. Todos ellos muy jóvenes.</p>
<p>Pero, ser un Programador Senior PHP va más allá de tener una &#8220;chispa de genialidad&#8221; y algo de suerte para convertirse en un hito de la historia universal, ser un Programador Senior PHP no es sólo saber programar en PHP.</p>
<p>Ahora bien, alguno podría auto-evaluarse y decir: &#8220;<em>yo desarrollé un framework, eso me hace PHP Senior</em>&#8220;&#8230; pero me temo que no, eso no te convierte en un SENIOR.</p>
<p>Otro dirá: &#8220;<em>Yo he desarrollado más de 200 sistemas web para distintos clientes</em>&#8220;, qué bien !&#8230; pero eso tampoco te hace SENIOR.</p>
<p>No faltará quien diga: &#8220;<em>tengo muchos artículos redactados en la web sobre PHP</em>&#8220;, felicidades&#8230; pero sigue sin ser lo necesario para convertirte en un SENIOR.</p>
<p>Y es que parte del problema es la edad&#8230;. si, la edad. Aunque suene disparatado.</p>
<p>Analicemos los hechos:</p>
<p>* PHP nació en 1995 pero llegó a conocerse recién en tierras latinoamericanas casi 2 años después: 1997<br />
* PHP tal como lo conocemos hoy, tiene la forma de PHP4 más que PHP3 (o PHP5 incluso) el cual vio la luz en el año 2000<br />
* Comprender hexadecimales, binarios, vectores y aritmética progresiva (necesarios para establecer la bases fundamentales de los operadores en PHP), es algo que un individuo promedio conoce a la edad de 15 años (cuando cursa el 8 grado de educación básica)</p>
<p>PHP entonces tiene 12 años de edad aproximadamente (15 para ser exactos pero no olvidemos el factor socio-económico que siempre produce retrasos tecnológicos en estas tierras sur-occidentales)&#8230; y si alguien se subió al tren de PHP digamos a una edad de 17 años quiere decir que apenas ha conocido los últimos 5 años de PHP y esa es toda su experiencia, la cual es sólo 1/3 un tercio de lo que algunos con más edad ha podido saborear.</p>
<p>Puede que haya excepciones y hay quien diga, pero yo programo desde que tengo 8 años&#8230; quizá, y si es así felicidades&#8230; quizá te conviertas en un buen programador, pero por ahora&#8230; no serás un SENIOR hasta que llegues a la edad en la cual comprendas :</p>
<p>* Que no te las sabes todas.<br />
* Que la humildad es algo que también se lleva a nivel de código.<br />
* Que desarrollas para ti y no para los demás.<br />
* Que no tienes nada que demostrarle al mundo, sólo a ti mismo.<br />
* Que no necesitas que tu nombre aparezca muchas veces en Google para sentirte &#8220;famoso&#8221;.<br />
* Que siempre habrá alguien que sepa más que tú.</p>
<p>Y es que lo que te hace SENIOR, no es lo bien que programes, la cantidad de funciones que te sepas de memoria o los certificados que te avalen&#8230; lo que te hace SENIOR es la experiencia y eso estimados amigos, sólo se gana con la edad no con los miles de proyectos o las millones de líneas de código que hayas escrito. </p>
<p>Si tienes más de 30 años (naciste antes de 1980), trabajaste con PHP3, instalaste y compilaste tú mismo PHP+Apache desde los códigos fuentes cuando antes no existía los <a href="http://es.wikipedia.org/wiki/LAMP">LAMP</a> o <a href="http://es.wikipedia.org/wiki/WAMP">WAMP</a>, si no te has &#8220;ensuciado&#8221; la mente con otros lenguajes de programación y en su lugar estás dedicado en cuerpo, alma y corazón a PHP desde hace más de 12 años sin dejar de pensar en ello un sólo día de esos más de 4300 días, si lograste desarrollar sistemas procedimentales limpios y lograste hacer de tripas corazón de la programación orientada a objetos con lo poco que había antes de PHP5, si has creado tus propios sistemas que no se parece a nada nunca antes visto y gozas del respeto de la comunidad pero a su vez conservas la humildad de reconocer que no te las sabes todas&#8230;</p>
<p>&#8230; entonces amigo mio, eres un <strong>Programador Senior PHP</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/%c2%bfcual-es-la-edad-ideal-de-un-programador-senior-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mes de la seguridad PHP: Inicialización de Variables</title>
		<link>http://agarzon.php.com.ve/mes-de-la-seguridad-php-inicializacion-de-variables/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mes-de-la-seguridad-php-inicializacion-de-variables</link>
		<comments>http://agarzon.php.com.ve/mes-de-la-seguridad-php-inicializacion-de-variables/#comments</comments>
		<pubDate>Mon, 17 May 2010 17:55:19 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=215</guid>
		<description><![CDATA[Contribuyendo con la celebración del &#8220;MPOS&#8221; (Month of PHP Security) les traigo a ustedes este pequeño artículo de Jakub Vrana llevado al español de mi mano y con algunos ajustes personales. Inicialización de variables PHP Consideremos el siguiente código: &#60;?php if (authUser($_POST[&#34;login&#34;], $_POST[&#34;password&#34;])) { $auth = true; } if ($auth) { echo &#34;Secret\n&#34;; } ?&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Contribuyendo con la celebración del &#8220;MPOS&#8221; (<a href="http://php-security.org/">Month of PHP Security</a>)  les traigo a ustedes este pequeño artículo de Jakub Vrana llevado al español de mi mano y con algunos ajustes personales.</p>
<p><strong>Inicialización de variables PHP</strong></p>
<p>Consideremos el siguiente código:</p>
<pre class="brush: php; ">

&lt;?php
if (authUser($_POST[&quot;login&quot;], $_POST[&quot;password&quot;])) {
    $auth = true;
}
if ($auth) {
    echo &quot;Secret\n&quot;;
}
?&gt;
</pre>
<p>Puedes detectar fácilmente la vulnerabilidad en el mismo. La variable <strong>$auth</strong> no se inicializó para todos los casos por lo que puede ser engañada desde el exterior. PHP define una forma de manejar las variables sin inicializar (a diferencia del lenguaje C, por ejemplo), todos ellos tienen el valor <strong>null</strong>. El problema es que la variable se puede inicializar de otras fuentes:</p>
<ul>
<li>Código Anterior.</li>
<li>Archivo incluido (include)</li>
<li>Remotamente si register_globals está habilitado.</li>
<li>Usando el <strong>extract</strong> de una variable (no fiable).</li>
</ul>
<p><strong>Defensa:</strong><br />
Defenderse de este tipo de vulnerabilidad es muy simple &#8211; Siempre inicializa las variables:</p>
<pre class="brush: php; ">

&lt;?php
$auth = false;
if (authUser($_POST[&quot;login&quot;], $_POST[&quot;password&quot;])) {
    $auth = true;
}
?&gt;
</pre>
<p>Ahora <strong>$auth</strong> contiene algo (o nada) entonces siempre resolverá a <strong>FALSE</strong>. Es una buena idea inicializar las variables incondicionalmente. El siguiente código debería funcionar aunque no es tan robusto:</p>
<pre class="brush: php; ">

&lt;?php
if (authUser($_POST[&quot;login&quot;], $_POST[&quot;password&quot;])) {
    $auth = true;
} else {
    $auth = false;
}
?&gt;
</pre>
<p>Ahora consideremos que a alguien le gusta revisar las direcciones IP y lo hace de este modo:</p>
<pre class="brush: php; ">

&lt;?php
if ($_SERVER[&quot;REMOTE_ADDR&quot;] == &quot;127.0.0.1&quot;) {
    if (authUser($_POST[&quot;login&quot;], $_POST[&quot;password&quot;])) {
        $auth = true;
    }
} else {
    $auth = false;
}
?&gt;
</pre>
<p>La variable <strong>$auth</strong> puede ser engañada de nuevo !</p>
<p><strong>Nota</strong>: El atacante debe conocer la variable a engañar, bien puede adivinarla, obtenerla de algún mensaje de error, usando fuerza bruta o en la mayoría de los casos, se ha hecho con el código fuente (aplicaciones open source o siendo un ex-empleado de una empresa).</p>
<p><strong>Deshabilitando register_globals</strong></p>
<p>Es importante mencionar que deshabilitar register_globals no es en definitiva una defensa contra este tipo de ataques. Esto sólo nos acerca a evitar el más común de los tipos de ataque. Por supuesto es una buena idea deshabilitarlo pero las buenas aplicaciones no dependen de esta directiva y funcionan indistintamente de ellas, así no es necesario emular de este modo:</p>
<pre class="brush: php; ">

&lt;?php
// NUNCA USES ESTE TIPO DE CÓDIGO
if (ini_get(&quot;register_globals&quot;)) {
    foreach ($_REQUEST as $key =&gt; $val) {
        unset($$key);
    }
}
?&gt;
</pre>
<p><strong>Reconociendo variables no inicializadas</strong></p>
<p>PHP posee un mecanismo para vigilar variables no inicializadas, este es el manejador de errores <strong>E_NOTICE</strong> quien nos muestra las variables no inicializadas, aunque esto conlleva algunos problemas:</p>
<ol>
<li>No advierte acerca de un array sin inicializar.</li>
<li>Advierte al acceder a un índice no-existente en un array debidamente inicializado.</li>
<li>Se publica en tiempo de ejecución.</li>
</ol>
<p><strong>E_NOTICE No advierte acerca de un array sin inicializar.</strong></p>
<p>Este primer problema es el más relevante, considere el siguiente código:</p>
<pre class="brush: php; ">

&lt;?php
$config[&quot;password&quot;] = &quot;pwd&quot;;
if (isset($_POST[&quot;password&quot;]) &amp;&amp; $_POST[&quot;password&quot;] == $config[&quot;password&quot;]) {
    echo &quot;Secret information.\n&quot;;
}
?&gt;
</pre>
<p>Esto no notará  si un atacante falsifica la variable $config. Si el pasa una cadena entones el código es interpretado como esto:</p>
<pre class="brush: php; ">

&lt;?php
$config[0] = &quot;p&quot;;
// $config es una cadena de modo que  [] es usada para acceder a los bytes de la cadena
// &quot;password&quot; es convertido al número 0 porque la posición de la cadena son siempre enteros
// sólo un byte puede ser escrito a [0] de modo que &quot;pwd&quot; es interpretado como &quot;p&quot;
if (isset($_POST[&quot;password&quot;]) &amp;&amp; $_POST[&quot;password&quot;] == $config[0]) {
    echo &quot;Secret information.\n&quot;;
}
?&gt;
</pre>
<p>Ahora bien, esto es suficiente para adivinar el primer carácter de la contraseña y enviarla junto con el falso <strong>$config</strong></p>
<p><strong>E_NOTICE advierte al acceder a un índice no-existente en un array debidamente inicializado.</strong></p>
<p>Este segundo problema no está relacionado con la seguridad pero si con desarrollar código &#8220;bien hecho&#8221;. El siguiente código informaría una notificación aún si funciona bien y no puede ser engañado:</p>
<pre class="brush: php; ">

&lt;input name=&quot;search&quot; value=&quot;&lt;?php echo htmlspecialchars((string) $_GET[&quot;search&quot;]); ?&gt;&quot; /&gt;
</pre>
<p>Con el E_NOTICE habilitado, nosotros debemos re-escribir el código aunque un poco más largo con la misma funcionalidad:</p>
<pre class="brush: php; ">

&lt;input name=&quot;search&quot; value=&quot;&lt;?php
if (isset($_GET[&quot;search&quot;])) {
    echo htmlspecialchars((string) $_GET[&quot;search&quot;]);
}
?&gt;&quot; /&gt;
</pre>
<p>Otro ejemplo de esta restricción &#8211; El siguiente código es perfectamente válido y hace lo que esperamos que haga (contar miembros de un grupo):</p>
<pre class="brush: php; ">

&lt;?php
$groups = array();
foreach (getData() as $data) {
    $groups[$data[&quot;id_group&quot;]]++;
}
?&gt;
</pre>
<p>Con el E_NOTICE habilitado, debemos re-escribirlo de este modo:</p>
<pre class="brush: php; ">

&lt;?php
$groups = array();
foreach (getData() as $data) {
    if (!isset($groups[$data[&quot;id_group&quot;]])) {
        $groups[$data[&quot;id_group&quot;]] = 0;
    } else {
        $groups[$data[&quot;id_group&quot;]]++;
    }
}
?&gt;
</pre>
<p>Yo no diría que este es el código más claro y menos propenso a errores (ya hay un error incluido).</p>
<p><strong>E_NOTICE se publica en tiempo de ejecución.</strong></p>
<p>Este tercer problema está relacionado con la seguridad. Si usamos variables no inicializadas que no monitorizamos durante el desarrollo, entonces el atacante puede usarle. Es bueno informar sobre variables no inicializadas en el log de errores pero si esto puede ser usado por el atacante, entonces será demasiado tarde. Es posible hacer notificaciones fatales con set_error_handler pero no vale la pena para la mayoría de las aplicaciones.</p>
<p><strong>Mejor monitoreo de variables no inicializadas</strong></p>
<p>No recomendaría deshabilitar las notificaciones. Sin embargo, esto no soluciona todos los problemas y requiere de re-escribir un código más profundo como han notado. Afortunadamente, hay una forma mejor de rastrear las variables no inicializadas que resuelve los tres problemas de las notificaciones. Su nombre es <strong>php-initialized</strong>. Es una herramienta para analizar el código fuente en búsqueda de variables no inicializadas. Esto no ejecuta el código y tiene algunas limitaciones pero se puede utilizar para comprobar el código de forma rutinaria, por ejemplo, después o antes de realizar una refactorización.</p>
<p>La principal limitación es que sólo el bloque actual es considerado dentro del ámbito de variables. Así, el siguiente código reclamaría a <strong>$auth</strong> como variable no inicializada:</p>
<pre class="brush: php; ">

&lt;?php
if (authUser($_POST[&quot;login&quot;], $_POST[&quot;login&quot;])) {
    $auth = true;
} else {
    $auth = false;
}
if ($auth) {
    echo &quot;Secret\n&quot;;
}
// Imprime: Uninitialized variable $auth on line 7
?&gt;
</pre>
<p><strong>No use $_REQUEST</strong></p>
<p>Engañar variables no sólo involucra a las variables globales. La variable $_REQUEST puede ser llenada desde cualquier fuente externa. </p>
<p>Recordemos que $_REQUEST obtiene sus valores de los métodos: POST, GET y COOKIE &#8230; en su lugar deberíamos ser más específicos respecto al origen de la información usando las super-globales: $_POST, $_GET y $_COOKIE en cada caso.</p>
<p><strong>En resumen</strong></p>
<p>Las buenas aplicaciones PHP deberían siempre inicializar sus variables antes de usarlas. Es una maravillosa idea establecer el register_globals en OFF Aunque una buena aplicación debe funcionar indistintamente de dicha directiva. PHP nos ofrece un manejador de errores E_NOTICE que puede monitorizar las variables que no están inicializadas pero esto no debe ser 100% confiable. La herramienta <a href="http://code.google.com/p/php-initialized/">php-initialized</a> resolverá estás deficiencias.</p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/mes-de-la-seguridad-php-inicializacion-de-variables/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Evitando las asignaciones en condiciones</title>
		<link>http://agarzon.php.com.ve/evitando-las-asignaciones-en-condiciones/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=evitando-las-asignaciones-en-condiciones</link>
		<comments>http://agarzon.php.com.ve/evitando-las-asignaciones-en-condiciones/#comments</comments>
		<pubDate>Wed, 12 May 2010 15:26:44 +0000</pubDate>
		<dc:creator>Alexander Garzon</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://agarzon.php.com.ve/?p=133</guid>
		<description><![CDATA[assignment in condition es un error muy común que cometemos muchos quienes programamos con PHP. Incluso en muchos ejemplos &#8220;oficiales&#8221; que figuran en el manual oficial de PHP se recurre a este tipo de &#8220;desliz&#8221;. En realidad no se trata de un error en sí, sino de una buena practica de programación que evita disparar [...]]]></description>
			<content:encoded><![CDATA[<p><strong>assignment in condition</strong> es un error muy común que cometemos muchos quienes programamos con PHP. Incluso en muchos ejemplos &#8220;oficiales&#8221; que figuran en el <a href="http://www.php.net/manual/">manual oficial de PHP</a> se recurre a este tipo de &#8220;desliz&#8221;.</p>
<p>En realidad no se trata de un error en sí, sino de una buena practica de programación que evita disparar comportamientos indeseados cuando la aplicación tiene a crecer.</p>
<p>La premisa es simple: <strong><em>no debes asignar variables dentro de una condición</em></strong>.</p>
<p><strong>El típico ejemplo <del datetime="2010-05-12T15:13:26+00:00">mal</del> indebidamente hecho:</strong></p>
<pre class="brush: php; ">
while($array = mysql_fetch_array($result)){
</pre>
<p><strong>¿Y como debería ser?</strong></p>
<pre class="brush: php; ">
while( ($array = mysql_fetch_array($result)) !== false){
</pre>
<p><strong>¿Cual es la diferencia?</strong></p>
<p>Esta buena práctica evita errores como:</p>
<pre class="brush: php; ">
if($a = 36){
</pre>
<p>Fíjense como sucede una &#8220;<em>asignación dentro de una condición</em>&#8220;, exactamente lo que debemos evitar&#8230; y es malo porque esa asignación SIEMPRE será cierta (true).</p>
<p><strong>¿Y porqué usar !== en lugar de un simple !=?</strong></p>
<p>Ese es otro detallito que muchos suelen ignorar ;-), resulta que esperamos un FALSE booleano, no una &#8220;false&#8221; cualquiera, así que para estar seguros del valor y el tipo (no vaya a ser un string con la palabra false), lo mejor es comprobar si el dato es IDÉNTICO o NO IDÉNTICO, los cuales evalúan no sólo el contenido de la variable, sino el tipo de variable también.</p>
<p>Espero les haya gustado esta mini-entrada, tenía tiempo sin redactar algo a este abandonado blog. Hasta la próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://agarzon.php.com.ve/evitando-las-asignaciones-en-condiciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

