<?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>Codigo Manso &#187; Programacion</title>
	<atom:link href="http://www.codigomanso.com/es/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codigomanso.com</link>
	<description>Programación, informática y tecnología</description>
	<lastBuildDate>Sun, 21 Aug 2011 10:54:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Donde está el cursor?</title>
		<link>http://www.codigomanso.com/es/2009/02/where-is-the-cursor-or-cursor-in-a-textarea-or-input/</link>
		<comments>http://www.codigomanso.com/es/2009/02/where-is-the-cursor-or-cursor-in-a-textarea-or-input/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 09:13:28 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[caret]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=548</guid>
		<description><![CDATA[Buscando y buscando, me acabo de encontrar con una web que tiene un ejemplo muy interesante y que nos dice dónde está el cursor en un input o textarea en cada momento, y además permite saber cual es el texto seleccionado (si es que lo hay).
La verdad es que no es algo que a uno [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://javascript.nwbox.com/cursor_position/" style="float:left; margin: 0 8px 4px 0;"><img src="http://www.codigomanso.com/wp-content/uploads/2009/02/where-is-the-cursor.png" alt="Where is the cursor?" title="Where is the cursor?" width="300" height="290" class="alignnone size-full wp-image-552" /></a>Buscando y buscando, me acabo de encontrar con una web que tiene un ejemplo muy interesante y que nos dice <a href="http://javascript.nwbox.com/cursor_position/">dónde está el cursor en un input o textarea en cada momento</a>, y además permite saber cual es el texto seleccionado (si es que lo hay).</p>
<p>La verdad es que no es algo que a uno le haga falta todos los días, pero a mi me hacía falta y me ha resuelto el problema.</p>
<p>En el ejemplo que hay en dicha página se usan las funciones <b>getSelectionStart</b> y <b>getSelectionEnd</b>. La primera nos dice donde está el cursor, mientras que la segunda nos dice dónde finaliza la selección (siempre y cuando getSelectionEnd devuelva un valor distinto a getSelectionStart).</p>
<p>A continuación teneis estas dos funciones:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> getSelectionStart<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">createTextRange</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #003366; font-weight: bold;">var</span> r <span style="color: #339933;">=</span> document.<span style="color: #660066;">selection</span>.<span style="color: #660066;">createRange</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">duplicate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   r.<span style="color: #660066;">moveEnd</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'character'</span><span style="color: #339933;">,</span> o.<span style="color: #660066;">value</span>.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>r.<span style="color: #660066;">text</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> o.<span style="color: #660066;">value</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
   <span style="color: #000066; font-weight: bold;">return</span> o.<span style="color: #660066;">value</span>.<span style="color: #660066;">lastIndexOf</span><span style="color: #009900;">&#40;</span>r.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> o.<span style="color: #660066;">selectionStart</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> getSelectionEnd<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">createTextRange</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #003366; font-weight: bold;">var</span> r <span style="color: #339933;">=</span> document.<span style="color: #660066;">selection</span>.<span style="color: #660066;">createRange</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">duplicate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 r.<span style="color: #660066;">moveStart</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'character'</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span>o.<span style="color: #660066;">value</span>.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000066; font-weight: bold;">return</span> r.<span style="color: #660066;">text</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000066; font-weight: bold;">return</span> o.<span style="color: #660066;">selectionEnd</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/02/where-is-the-cursor-or-cursor-in-a-textarea-or-input/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Testeo y tiempo razonable no se llevan bien ¿o si?</title>
		<link>http://www.codigomanso.com/es/2009/02/testeo-y-tiempo-razonable-no-se-llevan-bien-o-si/</link>
		<comments>http://www.codigomanso.com/es/2009/02/testeo-y-tiempo-razonable-no-se-llevan-bien-o-si/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 20:14:41 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Ingenieria del Software]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[black box]]></category>
		<category><![CDATA[ingenieria de software]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[smoke tests]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tests unitarios]]></category>
		<category><![CDATA[white tests]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=525</guid>
		<description><![CDATA[Parece que el artículo de Testing shows the presence of bugs ha generado unos cuantos comentarios  
Entre ellos, Gonzalo dice:
Si habeis trabajado con desarrollo en base a tests no entiendo el comentario de que porque se llevan mal con el tiempo, la verdad.
Los tests ahorran muuuucho tiempo, tanto en la fase de depuración y [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Parece que el artículo de <a href="http://www.codigomanso.com/es/2009/01/micropost-testing-shows-the-presence-of-bugs/">Testing shows the presence of bugs</a> ha generado unos cuantos comentarios <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Entre ellos, <a href="http://www.codigomanso.com/es/2009/01/micropost-testing-shows-the-presence-of-bugs/comment-page-1/#comment-73">Gonzalo dice</a>:</p>
<blockquote style="text-align: justify;"><p>Si habeis trabajado con desarrollo en base a tests no entiendo el comentario de que porque se llevan mal con el tiempo, la verdad.<br />
Los tests ahorran muuuucho tiempo, tanto en la fase de depuración y estabilización de un proyecto como a la hora de añadir funcionalidad.<br />
Y otro punto que los hacen críticos, los tests unitarios salvan proyectos que sin ellos estarían abocados al fracaso.</p></blockquote>
<p style="text-align: justify;">Me doy por aludido, puesto que creo que Gonzalo se refiere al comentario en el que digo:</p>
<blockquote style="text-align: justify;"><p>Testeo y “tiempo razonable” no se suelen llevar bien</p></blockquote>
<p style="text-align: justify;">Así que en vez de un comentario he pensado que sería mejor poner este tema encima de la mesa, y compartir mis ideas sobre el testeo.</p>
<p style="text-align: justify;">Realmente a lo que me refería es que muchas veces no es posible hacer un <strong>buen testeo</strong> o un <strong>testeo exhaustivo</strong> de una determinada funcionalidad en un tiempo razonable.</p>
<p style="text-align: justify;">Mi opinión es que hacer más o menos tests depende siempre del tipo de proyecto. Por poner dos casos extremos, no es lo mismo hacerte un miniprograma para ti, que por ejemplo renombre todos los archivos de un directorio usando algún tipo de patrón, que por ejemplo hacer un programa que va a controlar la trayectoria de un misil.</p>
<p style="text-align: justify;">No sólo depende del tipo de proyecto si no también de los plazos del proyecto y de los recursos con los que se cuente. No es lo mismo un equipo de un desarrollador, que un equipo con 5. Tampoco es lo mismo disponer de 7 meses para hacer un parser de XML, que disponer de 2.</p>
<p style="text-align: justify;">Hay muchos elementos que influyen.</p>
<p style="text-align: justify;">Volviendo a la discusión anterior, sobre que <strong>tests</strong> y <strong>tiempo razonable</strong> no se llevan bien, básicamente esto significa que si tu proyecto es de andar por casa, tus recursos son limitados o tu tiempo es escaso, probablemente puedas y debas <strong>posponer</strong> <em><strong>algunos</strong></em> tests.</p>
<p style="text-align: justify;">Estoy de acuerdo con Gonzalo con que los <strong>tests traen muchos beneficios</strong>, pero esos beneficios, desde mi punto de vista son <strong>a medio y largo plazo.</strong> A corto plazo los tests beneficiosos son aquellos que te permiten ir desarrollando la aplicación y probando lo que tu crees que van a ser los casos más comunes.</p>
<p style="text-align: justify;">Soy partidario de hacer tests desde el primer momento, de  hecho, en otro comentario mío se puede leer:</p>
<blockquote style="text-align: justify;"><p>Mi opinión (al menos es lo que yo hago) es que <strong>hay que ir haciendo tests para probar las cosas conforme se desarrolle</strong><br />
[...]<br />
cuando se encuentra un bug (o bien por uno mismo, o por un usuario), mi punto de vista es que <strong>hay que añadir un test-case que lo reproduzca</strong></p></blockquote>
<p style="text-align: justify;">Se pueden escribir páginas y páginas sobre el testeo de software, sobre metodologias de programación, sobre si hay o no que llegar al 100% de cobertura de código&#8230; el caso es que escribir un buen artículo que cubra todos estos aspectos en un tiempo razonable, tampoco lo veo posible&#8230;</p>
<p style="text-align: center;"><strong>¿Haceis tests a menudo? ¿lo considerais perder el tiempo?</strong></p>
<p style="text-align: center;"><strong>¿Cuales son vuestras prácticas habituales?</strong></p>
<p style="text-align: left;">Como siempre, vuestras ideas y opiniones son bienvenidas en los comentarios y/o posts en vuestros respectivos blogs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/02/testeo-y-tiempo-razonable-no-se-llevan-bien-o-si/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Micropost: Testing shows the presence of bugs</title>
		<link>http://www.codigomanso.com/es/2009/01/micropost-testing-shows-the-presence-of-bugs/</link>
		<comments>http://www.codigomanso.com/es/2009/01/micropost-testing-shows-the-presence-of-bugs/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 10:16:23 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/es/?p=455</guid>
		<description><![CDATA[Hoy Hector, en un mail, me ha puesto la siguiente frase, con la que estoy totalmente de acuerdo:
 &#8220;Testing shows the presence, not the absence of bugs&#8221; &#8211; Edger Dijkstra
Es decir, los tests están para capturar y mostrar si hay algún bug, sin embargo cuando todos los tests pasan, no significa que la aplicación no [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hoy <a href="http://www.kirainet.com">Hector</a>, en un mail, me ha puesto la siguiente frase, con la que estoy totalmente de acuerdo:<br />
<strong> &#8220;Testing shows the presence, not the absence of bugs&#8221; &#8211; Edger Dijkstra</strong></p>
<p style="text-align: justify;">Es decir, los tests están para capturar y mostrar si hay algún bug, sin embargo cuando todos los tests pasan, no significa que la aplicación no tenga bugs, normalmente significa que no hay suficientes tests para capturarlos <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Por otro lado, cuantos más tests haya se supone que mejor cobertura tendrá la aplicación y mas robusto será el software que hagamos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2009/01/micropost-testing-shows-the-presence-of-bugs/feed/</wfw:commentRss>
		<slash:comments>152</slash:comments>
		</item>
		<item>
		<title>Crear varios millones de registros usando SQL</title>
		<link>http://www.codigomanso.com/es/2008/12/crear-varios-millones-de-registros-usando-sql/</link>
		<comments>http://www.codigomanso.com/es/2008/12/crear-varios-millones-de-registros-usando-sql/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 17:39:41 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[insert]]></category>
		<category><![CDATA[registros]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=265</guid>
		<description><![CDATA[Me gusta bastante la forma que comentan en Tu función sobre como insertar 8 millones de datos usando sólo SQL.
Básicamente consiste en insertar unos valores semilla, y posteriormente ejecutar:

INSERT INTO t SELECT * FROM t;


Con lo cual se insertan de nuevo los elementos existentes en la iteración anterior. Claramente el crecimiento es exponencial (2n), y [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Me gusta bastante la forma que comentan en <a href="http://www.tufuncion.com/" target="_blank">Tu función</a> sobre como <a href="http://www.tufuncion.com/test-mysql" target="_blank">insertar 8 millones de datos usando sólo SQL</a>.</p>
<p style="text-align: justify;">Básicamente consiste en insertar unos valores semilla, y posteriormente ejecutar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> t <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> t;</pre></div></div>

<p style="text-align: justify;">
<p style="text-align: justify;">Con lo cual se insertan de nuevo los elementos existentes en la iteración anterior. <em>Claramente el crecimiento es exponencial</em> <strong>(2<sup>n</sup>)</strong>, y partiendo de un único campo en la base de datos, en tan solo 23 iteraciones se consiguen 8.388.608 datos (la verdad es que 8 millones de registros ya son registros).</p>
<p style="text-align: justify;">Yo hasta ahora hacía iteraciones de sentencias insert en PHP&#8230; la próxima vez me lo replantearé <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/12/crear-varios-millones-de-registros-usando-sql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Coding standards: ¿Cuantos caracteres de indentación uso?</title>
		<link>http://www.codigomanso.com/es/2008/12/coding-standards-%c2%bfcuantos-caracteres-de-indentacion-uso/</link>
		<comments>http://www.codigomanso.com/es/2008/12/coding-standards-%c2%bfcuantos-caracteres-de-indentacion-uso/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 10:43:50 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[coding standard]]></category>
		<category><![CDATA[espacios]]></category>
		<category><![CDATA[formatear codigo]]></category>
		<category><![CDATA[indentación]]></category>
		<category><![CDATA[tabs]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=225</guid>
		<description><![CDATA[Aunque es una de esas cosas que parece una tonteria, no lo es. Por lo general, cada persona tiene unos gustos y costumbres, por lo que no suele ser fácil que un grupo de gente se ponga de acuerdo en una cosa como esta. Por regla general, el último en llegar al grupo es el [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Aunque es una de esas cosas que parece una tonteria, no lo es. Por lo general, cada persona tiene unos gustos y costumbres, por lo que no suele ser fácil que un grupo de gente se ponga de acuerdo en una cosa como esta. Por regla general, el último en llegar al grupo es el que tiene que aceptar los estándares que hayan sido definidos.</p>
<p style="text-align: justify;">Realmente creo que buscando por internet se pueden encontrar puntos a favor y en contra sobre el uso espacios o tabs. Incluso hay discusiones sobre cuantos huecos se deben usar para indentar (al margen de si se usan tabs o espacios).</p>
<p style="text-align: justify;">Vayamos por partes.</p>
<p style="text-align: justify;">El propósito de la indentación (independientemente de si usamos tabs o espacios), sirve para que visualmente distingamos fragmentos de código, es decir, la indentación tiene el objetivo de facilitar la lectura de código.</p>
<p style="text-align: justify;">Ahora voy a exponer mi punto de vista sobre las distintas opciones en cuanto al tamaño de la indentación:</p>
<ul style="text-align: justify;">
<li><strong>no usar indentación alguna:</strong> esto es perfecto si quieres que tu codigo sea ilegible por los demás humanos, e incluso por tí, despues de unas horas.</li>
<li><strong>usar 1 caracter de indentación:</strong> enhorabuena, no eres un completo desastre, pero aún te queda mucho camino por andar.</li>
<li><strong>usar 2 caracteres de indentación:</strong> esta es la opción que yo utilizo siempre que puedo. Dos caracteres te permite que cuando tienes una función con bastantes bloques anidados (no digo que esto pase muy a menudo, pero pasa), no acabes escribiendo en la linea 40. Además 2 caracteres son suficientes para distinguir bloques.</li>
<li><strong>usar 3 caracteres de indentación:</strong> esta opción no creo que la use mucha gente. Por lo general, los informáticos tenemos tendencia a buscar multiplos de 2.</li>
<li><strong>usar 4 caracteres de indentación:</strong> esta opción también me parece perfecta. No todo el mundo verá igual de claro la indentación con 2 caracteres, sobretodo si está en sus primeros años de escribir código, así que esta es la opción perfecta. Mucho mejor que los 8 caracteres que suelen venir por defecto en muchos editores.</li>
<li><strong>usar 5, 6 e incluso 7 caracteres:</strong> vale, esto me lo salto por lo mismo que he dicho respecto a los 3 caracteres. Es más, si usas 5, 6 o 7 caracteres, casi casi estás a la altura del que usa 1 caracter (sin ofender :p).</li>
<li><strong>usar 8 caracteres:</strong> esta es la opción por defecto en muchos editores. 8 caracteres son muchos caracteres. Demasiados caracteres. Nuevamente, si estás empezando a programar, me parece bien que respetes lo que dicen algunos editores, sin embargo, conforme pase el tiempo, te darás cuenta de que 8 es demasiado, que incluso quita claridad a tu código, y que para complir con el propósito de la indentación, es mucho más claro usar 4 caracteres que 8.</li>
<li><strong>más de 8 caracteres:</strong> C&#8217;mon!!!!! ¿de verdad hay alguien que use más de 8 caracteres? Creo que es algo que no he probado en la vida, y me atrevo a asegurar que si programas usando más de 8 caracteres de indentación, mejor que vayas buscando otro trabajo&#8230;</li>
</ul>
<p style="text-align: justify;">Tras todo esto, decir que estoy de acuerdo con cualquiera que elija 2 o 4 caracteres de indentación, pero si has elegido cualquier otra opción, es que aún te falta madurar. Probablemente no sea culpa tuya, aún estás verde, estás aprendiendo, pero por suerte has llegado a esta página, y te acabo de ahorrar tiempo de pruebas y miles de lineas de código escritas con distintos tipos de tabulación.</p>
<p style="text-align: justify;">Aunque mañana voy a discutir si es mejor espacios o tabs, te pongo mi conclusión ya:</p>
<p style="text-align: center;"><strong>Usa 2 o 4 espacios para la indentación. Nunca uses tabs.</strong></p>
<p style="text-align: left;">Una vez elijas una opción (2 o 4 espacios), se coherente y no cambies de indentación a mitad de un proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/12/coding-standards-%c2%bfcuantos-caracteres-de-indentacion-uso/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Un error común en programación: Lenguajes compilados</title>
		<link>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion-lenguajes-compilados/</link>
		<comments>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion-lenguajes-compilados/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 18:41:59 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[cl]]></category>
		<category><![CDATA[compilador]]></category>
		<category><![CDATA[error comun]]></category>
		<category><![CDATA[g++]]></category>
		<category><![CDATA[interprete]]></category>
		<category><![CDATA[optimizar]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=167</guid>
		<description><![CDATA[Juanjo ha apuntado que muy probablemente esto que yo comentaba como un típico error que la gente comete cuando programa, se optimiza en los lenguajes compilados (vease C/C++/Java/&#8230;).
Lo que proponía Juanjo (de probarlo con el g++ optimizando a tope) me ha parecido buena idea, así que he hecho unas cuantas pruebas en C++. 
Los resultados [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://blackshell.usebox.net/" target="_blank">Juanjo</a> ha apuntado que muy probablemente esto que yo comentaba como un <a href="http://www.codigomanso.com/2008/11/un-error-comun-en-programacion/" target="_blank">típico error que la gente comete cuando programa</a>, se optimiza en los lenguajes compilados (vease C/C++/Java/&#8230;).</p>
<p style="text-align: justify;">Lo que proponía Juanjo (de probarlo con el g++ optimizando a tope) me ha parecido buena idea, así que he hecho unas cuantas pruebas en C++. </p>
<p>Los resultados han sido interesantes <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Para mi grata sorpresa, el g++ ha optimizado muy bien la función <strong>strlen</strong>. Sin embargo, no es capaz de optimizar &#8220;cualquier&#8221; función que tenga sus mismas características.</p>
<p style="text-align: justify;">En el archivo <strong>test-strlen.cpp</strong> he realizado varias pruebas (más abajo están los fuentes descargables en un .tgz).</p>
<p style="text-align: justify;">La primera prueba ha sido realizar un bucle con <strong>strlen</strong>, tal cual el código de PHP, y otro donde el <strong>strlen</strong> está fuera del bucle.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #666666; font-style: italic;">// strlen dentro del bucle</span>
 <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> strlen <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    copy <span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> str<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #808080; font-style: italic;">/* [...] */</span>
&nbsp;
 <span style="color: #666666; font-style: italic;">// strlen fuera del bucle</span>
 len <span style="color: #339933;">=</span> strlen <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> len<span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    copy <span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> str<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Ha resultado que el g++ ha optimizado muy bien el primer bucle, hasta el punto que ambos probablemente ejecuten el mismo código, no se aprecia diferencia.</p>
<p style="text-align: justify;">Una vez hecho esto, me he dicho, voy a fastidiar un poco al compilador, así que he añadido una linea, que básicamente modifica <strong>str</strong>, que es la cadena que se le pasa al <strong>strlen</strong>, para que el compilador tenga que evaluar siempre el bucle:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"> <span style="color: #666666; font-style: italic;">// strlen dentro del bucle, modificando str</span>
 <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;=</span> strlen <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    copy <span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> str<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> str<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> str<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">El caso es que ha funcionado, básicamente el compilador no lo ha podido optimizar, no obstante esto no me vale para ejemplificar lo que decía en el artículo anterior, porque el compilador ha hecho lo que tenía que hacer, y la variable ha sido modificada dentro.</p>
<p style="text-align: justify;">He aquí los resultados de <strong>test-strlen</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Making the common mistake(not optimizable): 9.20
Making the common mistake(optimizable by the compiler): 0.00
Avoiding the common mistake: 0.00</pre></div></div>

<p style="text-align: justify;">Total, que he creado otro archivo de ejemplo, el <strong>test-custom-strlen.cpp</strong> cuyo objetivo es implementar una función equivalente a strlen y ver si el compilador es igual de inteligente.</p>
<p style="text-align: justify;">Básicamente, en este archivo he creado 5 funciones, vease: <strong>custom_strlen, custom_strlen_const, custom_strlen_const2, strlen_wrap, strlen_wrap_const</strong></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/** this is a custom strlen function */</span>
size_t custom_strlen <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> str<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ptr <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #009900;">&#41;</span> ptr<span style="color: #339933;">++;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>size_t<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">-</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/** this is same as above, but telling the compiler we are not touching str*/</span>
size_t custom_strlen_const <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> str<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ptr <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #009900;">&#41;</span> ptr<span style="color: #339933;">++;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>size_t<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">-</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/** this strlen updates input string, no matter that is const */</span>
size_t custom_strlen_const2 <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ptr <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #009900;">&#41;</span> ptr<span style="color: #339933;">++;</span>
&nbsp;
  <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'a'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// update string</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>size_t<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ptr <span style="color: #339933;">-</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/** this is a wrapper over strlen function */</span>
size_t strlen_wrap <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> strlen <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/** this is a wrapper over strlen function with constant input */</span>
size_t strlen_wrap_const <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> strlen <span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Y los resultados ha sido los siguientes:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">using custom_strlen: 3.90
using custom_strlen_const: 4.05
using custom_strlen_const2: 4.04
using strlen_wrap: 0.00
using strlen_wrap_const: 0.00</pre></div></div>

<p style="text-align: justify;">Vamos, que el compilador, con -O3, no ha sido capaz de optimizar ninguna de mis funciones. Y el caso es que la función <strong>custom_strlen_const</strong> era candidata para ser optimizada igual que el strlen (función con un parámetro constante, internamente usa const para todo y no cambia el valor de nada).</p>
<p style="text-align: justify;">Total, que sigo manteniendo la misma opinión que en el artículo anterior: <strong>si una función se va a evaluar siempre a lo mismo, mejor que esté fuera del bucle, porque no se sabe si el compilador o intérprete va a ser capaz de optimizarla o no.</strong></p>
<p style="text-align: justify;">También me gustaría decir que por lo general este tipo de cosas, normalmente, tampoco va a suponer ningún cuello de botella en ninguna aplicación, ni va a suponer tiempos abismales de ejecución, por lo que no es preciso prestarle mucha importancia; ahora bien, son pequeños detalles, que se van sumando y sumando, y oye, quizá no reduzcan los tiempos un 30%, pero un 5%&#8230; <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;"><a href="http://www.codigomanso.com/archives/misc/test-gcc-strlen.tgz" target="_blank">Aquí teneis el archivo comprimido con los códigos fuentes de ejemplo</a>. (descomprimir, ejecutar make y listo)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion-lenguajes-compilados/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Un error común en programación</title>
		<link>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion/</link>
		<comments>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 09:28:16 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[bucles]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[error comun]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=156</guid>
		<description><![CDATA[Un error que comete mucha gente, aunque mucha no se da cuenta, y la mayoría de veces pasa desapercibido, se da a la hora de poner las condiciones en los bucles. Se debe tener cuidado cuando se hacen llamadas dentro de un bucle, porque algo que a priori puede parecer O(n) se convierte en O(n2).
¿Alguien [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Un error que comete mucha gente, aunque mucha no se da cuenta, y la mayoría de veces pasa desapercibido, se da a la hora de poner las condiciones en los bucles. Se debe tener cuidado cuando se hacen llamadas dentro de un bucle, porque algo que a priori puede parecer O(n) se convierte en O(n<sup>2</sup>).</p>
<p style="text-align: justify;">¿Alguien ve algo raro en el siguiente código?</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">strlen</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// whatever this loop does</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">A priori ¿Parece que todo está bien, no? Si te lo parece es que no eres consciente aún.</p>
<p style="text-align: justify;">Es bien sabido que las condiciones de los bucles se evaluan tantas veces como iteraciones tiene el bucle, con esto no estoy descubriendo nada a nadie, sin embargo, si se mete un <strong>strlen</strong> para medir la longitud de la cadena en un bucle que se ejecuta tantas veces como caracteres hay, acabamos de elevar al cuadrado el tiempo de ejecución.</p>
<p style="text-align: justify;">Tanto en C como en PHP, la función <strong>strlen</strong> necesita recorrer toda la cadena hasta encontrar el &#8216;\0&#8242; para determinar su longitud, así pues, si la longitud es 20, strlen necesitará 20 iteraciones para determinar que la longitud es 20. El problema es que el bucle que estamos haciendo también tiene 20 iteraciones, y en cada iteración se ejecuta strlen, que consume otras 20 iteraciones (claro que en PHP esas 20 iteraciones se ejecutan en código máquina, y no en el interprete), por lo que tendríamos que el coste de ese bucle para una cadena de 20 caracteres es de 20*(20 + lo que hay dentro del bucle) = 400 + 20*lo que hay dentro del bucle.</p>
<p style="text-align: justify;">El siguiente script (<a href="http://www.codigomanso.com/archives/phpscripts/common_mistake_with_loops_using_strlen.php.txt" target="_blank">error común con los bucles</a>) muestra un ejemplo de esto en PHP, donde dentro del bucle no se hace nada, y se puede observar como un bucle es mucho más lento que el otro.</p>
<p style="text-align: justify;">Los resultados tras ejecutarlo en mi ordenador han sido:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">strlen($sentence) =  12608 bytes
Making the common mistake: 3.02566313744 seconds
Fixing the common mistake: 0.958508968353 seconds</pre></div></div>

<p style="text-align: justify;">Creo que se puede apreciar claramente la diferencia <img src='http://www.codigomanso.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Finalmente, aunque he usado PHP para ilustrar el error, y concretamente <strong>strlen</strong>, si nos olvidamos de strlen y de PHP, esto es aplicable a otros muchos lenguages C/C++/Java/Pascal/PHP/Python/Perl/Ruby y un largo etcetera; y pasa en todos los lenguajes porque todos los lenguajes usan el mismo concepto, la condicion de salida del bucle se evalua en cada iteración. Quizás no ocurra cuando se utilizan cadenas, porque guardan la longitud en una variable, pero puede que pase al mirar la longitud de listas enlazadas, etc&#8230;</p>
<p style="text-align:justify;"><strong>Conclusión:</strong> si en el bucle estás llamando a una función que siempre te va a devolver lo mismo, mejor guardalo en una variable y usa esa variable dentro del bucle, te ahorrará sorpresas</p>
<p style="text-align:justify;">
<p><strong>Enlaces interesantes:</strong></p>
<ul>
<li><a href="http://www.joelonsoftware.com/articles/fog0000000319.html" target="_blank">Back to basics</a>, un excelente artículo de Joel (<a href="http://local.joelonsoftware.com/mediawiki/index.php/De_vuelta_a_lo_b%C3%A1sico" target="_blank">disponible en Español</a>) donde reflexiona sobre algunas cosas directamente relacionadas con esto.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/11/un-error-comun-en-programacion/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Paamayim Nekudotayim</title>
		<link>http://www.codigomanso.com/es/2008/11/paamayim-nekudotayim/</link>
		<comments>http://www.codigomanso.com/es/2008/11/paamayim-nekudotayim/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 22:14:51 +0000</pubDate>
		<dc:creator>Pau Sanchez</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Paamayim Nekudotayim]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[token]]></category>

		<guid isPermaLink="false">http://www.codigomanso.com/?p=43</guid>
		<description><![CDATA[
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in ....

Ese error me ha salido mientras estaba programando&#8230; me ha parecido tan raro que es digno de ser posteado.
El caso es que buscando un poco por internet, en la wikipedia sin ir más lejos, hay una entrada sobre Paamayim Nekudotayim y donde básicamente se dice que ese nombre [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Parse error<span style="color: #339933;">:</span> syntax error<span style="color: #339933;">,</span> unexpected T_PAAMAYIM_NEKUDOTAYIM in <span style="color: #339933;">....</span></pre></div></div>

<p style="text-align: justify;">Ese error me ha salido mientras estaba programando&#8230; me ha parecido tan raro que es digno de ser posteado.</p>
<p style="text-align: justify;">El caso es que buscando un poco por internet, en la wikipedia sin ir más lejos, hay una entrada sobre <a href="http://en.wikipedia.org/wiki/Paamayim_Nekudotayim" target="_blank">Paamayim Nekudotayim</a> y donde básicamente se dice que ese nombre de token se corresponde con &#8220;<strong>::</strong>&#8220;, el que se usa para acceder a un método o variable de clase.</p>
<p style="text-align: justify;">Es curioso la de nombres que se le ponen a los tokens, con lo fácil que hubiera sido llamarlo T_DOUBLE_COLON.</p>
<p style="text-align: justify;">Ale, una vez resuelto el enigma, voy a ver si sigo programando un poco&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codigomanso.com/es/2008/11/paamayim-nekudotayim/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

