<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>ivanmosquera.net</title>
	<atom:link href="http://ivanmosquera.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://ivanmosquera.net</link>
	<description>Just another computing weblog</description>
	<lastBuildDate>Mon, 09 Jan 2012 23:52:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='ivanmosquera.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>ivanmosquera.net</title>
		<link>http://ivanmosquera.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://ivanmosquera.net/osd.xml" title="ivanmosquera.net" />
	<atom:link rel='hub' href='http://ivanmosquera.net/?pushpress=hub'/>
		<item>
		<title>Netbeans: rsync with remote server</title>
		<link>http://ivanmosquera.net/2011/12/09/netbeans-rsync-with-remote-server/</link>
		<comments>http://ivanmosquera.net/2011/12/09/netbeans-rsync-with-remote-server/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 22:28:01 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=372</guid>
		<description><![CDATA[So you&#8217;re still using Eclipse/PDT because you see no way to rsync your local files with your remote dev machine. This is the workaround I use:  Create a &#8220;rsync.php&#8221; file in your project root, with this content. You&#8217;ll see this would be the Mac version, change the bits according yo your OS: &#60;?php system(&#8220;/opt/local/bin/rsync -uvrz [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=372&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://ivanmosquera.files.wordpress.com/2011/12/netbeans-logo.png"><img class="aligncenter  wp-image-376" title="netbeans-logo" src="http://ivanmosquera.files.wordpress.com/2011/12/netbeans-logo.png?w=179&#038;h=179" alt="rsync netbeans" width="179" height="179" /></a></p>
<p>So you&#8217;re still using Eclipse/PDT because you see no way to <strong>rsync</strong> your local files with your remote dev machine.</p>
<p>This is the workaround I use:</p>
<p><span id="more-372"></span></p>
<ul>
<li> Create a &#8220;rsync.php&#8221; file in your project root, with this content. You&#8217;ll see this would be the Mac version, change the bits according yo your OS:</li>
</ul>
<p>&lt;?php</p>
<p>system(&#8220;/opt/local/bin/rsync -uvrz &#8211;chmod=uga+rx &#8211;delete-after &#8211;exclude-from=/Users/USERNAME/rsyncExclude.txt .  USERNAME@HOSTNAME:/home/USERNAME/PROJECT_PATH&#8221;);</p>
<ul>
<li> Create a rsyncExclude.txt file with the file patterns you need to avoid syncing and place it in your home dir:</li>
</ul>
<pre>.settings
.buildpath
.project
.hg
rsync.php</pre>
<ul>
<li>Project &gt; Properties &gt; Run configuration</li>
</ul>
<p>Run As: &#8220;script (run in command line)&#8221;</p>
<p>Make sure you configure the php cli.</p>
<p>Index file: rsync.php</p>
<p>Working directory: your project directory.</p>
<ul>
<li> That&#8217;s all. Now you can use &#8220;Run Project (F6)&#8221; to rsync.</li>
</ul>
<p>Let me know if you&#8217;ve found another way to achieve this without hacking Netbeans.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/372/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=372&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2011/12/09/netbeans-rsync-with-remote-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2011/12/netbeans-logo.png" medium="image">
			<media:title type="html">netbeans-logo</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8220;CSS Pocket Reference&#8221;, Fourth edition, By Eric A. Meyer; O&#8217;Reilly Media;</title>
		<link>http://ivanmosquera.net/2011/08/20/css-pocket-reference-fourth-edition-by-eric-a-meyer-oreilly-media/</link>
		<comments>http://ivanmosquera.net/2011/08/20/css-pocket-reference-fourth-edition-by-eric-a-meyer-oreilly-media/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 00:41:34 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[reviews]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[reference]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=364</guid>
		<description><![CDATA[ Eric A. Meyer , also author of other CSS books like CSS: The Definitive Guide tries to provide a good tool for  the daily CSS work. The book features the following parts: 1. Basic concepts. 2. Values 3. Selectors. 4. Property Reference. As a pocket reference it is, don&#8217;t expect learning CSS from this book but a quick [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=364&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://oreilly.com/catalog/9781449399030/"><img class="aligncenter" src="http://covers.oreilly.com/images/9780596515058/cat.gif" alt="CSS Pocket Reference" width="180" height="296" /></a></p>
<p> <a href="http://www.oreillynet.com/pub/au/52" target="_blank">Eric A. Meyer</a> , also author of other CSS books like <a href="http://oreilly.com/catalog/9780596527334/" target="_blank">CSS: The Definitive Guide</a> tries to provide a good tool for  the daily CSS work.</p>
<p>The book features the following parts:</p>
<ul>
<li>1. Basic concepts.</li>
<li>2. Values</li>
<li>3. Selectors.</li>
<li>4. Property Reference.</li>
</ul>
<p style="text-align:justify;">As a pocket reference it is, don&#8217;t expect learning CSS from this book but a quick reference for your daily work. You&#8217;ll find a few references to chapters of <a title="CSS: The definitive guide" href="http://oreilly.com/catalog/9780596527334" target="_blank">CSS: The Definitive Guide</a>. This edition is updated to CSS3.<span id="more-364"></span></p>
<p style="text-align:justify;"><span style="text-decoration:underline;">Basic concepts</span>: you&#8217;ll find a guide to the CSS key concepts. Just and introduction, something which could have been avoided as the reference it is but it&#8217;s useful having those key concepts together in a few pages.</p>
<p style="text-align:justify;"><span style="text-decoration:underline;">Values</span>: a reference to the values you can use, descriptive information ordered by different categories like <em>key words</em>, <em>colors</em>, <em>numbers</em>, <em>percentages</em>&#8230;</p>
<p style="text-align:justify;"><span style="text-decoration:underline;">Selectors</span>: a reference to selectors, information structured as <em>pattern</em>, <em>description</em> and <em>examples</em>.</p>
<p style="text-align:justify;"><span style="text-decoration:underline;">Property Reference</span> : it lacks property categories, an alphabetic list is all you get. You need to know the name of the property you&#8217;re looking for, which isn&#8217;t always the case. For each property the information is well structured with: <em>name</em>, <em>values</em>, <em>initial value</em>, <em>applies to</em>, <em>computed value</em>, <em>description</em>, <em>examples</em> and <em>note</em>. <em>Note</em> usually refers to browser compatibility but just generally (&#8220;as of 2011&#8243;), not a complete browser compatibility reference.</p>
<p style="text-align:justify;"><strong>Summary</strong>: a good CSS reference, perhaps lacking property categories and better information about browser compatibility.</p>
<p style="text-align:justify;">Link to catalog: <a href="http://oreilly.com/catalog/9781449399030/" target="_blank">http://oreilly.com/catalog/9781449399030/</a></p>
<p style="text-align:justify;">
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/364/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/364/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/364/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=364&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2011/08/20/css-pocket-reference-fourth-edition-by-eric-a-meyer-oreilly-media/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://covers.oreilly.com/images/9780596515058/cat.gif" medium="image">
			<media:title type="html">CSS Pocket Reference</media:title>
		</media:content>
	</item>
		<item>
		<title>PHP Barcelona Conference 2010</title>
		<link>http://ivanmosquera.net/2010/11/02/php-barcelona-conference-2010/</link>
		<comments>http://ivanmosquera.net/2010/11/02/php-barcelona-conference-2010/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 19:59:55 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[pbc10]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpforandroid]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=353</guid>
		<description><![CDATA[Este año he tenido la suerte de asistir como ponente a la PHP Barcelona Conference para presentar &#8220;PHP for Android: Scripting PHP en Android&#8221;. A pesar de que mi conferencia coincidía en el tiempo con otras dos muy interesantes creo que no quedaron sillas vacías y se cumplió el objetivo de generar interés en torno [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=353&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este año he tenido la suerte de asistir como ponente a la <a href="http://phpconference.es">PHP Barcelona Conference</a> para presentar &#8220;PHP for Android: Scripting PHP en Android&#8221;.</p>
<p>A pesar de que mi conferencia <a href="http://phpconference.es/php-barcelona-conference-2010/schedule/">coincidía en el tiempo</a> con otras dos muy interesantes creo que no quedaron sillas vacías y se cumplió el objetivo de generar interés en torno al proyecto.</p>
<p><span id="more-353"></span></p>
<p>Ha sido mi primera PBC y mi impresión no ha podido ser más positiva. Desde el nivel de las conferencias hasta la profesionalidad de la organización pasando por la gente tan interesante que asiste y con la cual tienes oportunidad de tratar.</p>
<p>A continuación las transparencias de mi conferencia. Nos vemos en la PBC 11 <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<iframe src='http://www.slideshare.net/slideshow/embed_code/5607595' width='497' height='407'></iframe>
<div id="__ss_5607595" style="width:425px;"></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/353/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/353/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/353/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=353&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/11/02/php-barcelona-conference-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>
	</item>
		<item>
		<title>Acerca de la certificación ZCE.</title>
		<link>http://ivanmosquera.net/2010/09/30/acerca-de-la-certificacion-zce/</link>
		<comments>http://ivanmosquera.net/2010/09/30/acerca-de-la-certificacion-zce/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 23:16:11 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=298</guid>
		<description><![CDATA[(Google translation : Link) Hoy he aprobado el examen &#8220;Zend PHP Certified Engineer &#8211; PHP5&#8243; y he pensado que estaría bien un post con mi opinión sobre esta certificación. &#160; Este examen ha sido mi primera experiencia en el mundo de las certificaciones y ha sido mejor de lo que esperaba. Empezando por el temario, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=299&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es-->(Google translation : <a href="http://translate.google.com/translate?hl=es&amp;sl=es&amp;tl=en&amp;u=http://ivanmosquera.net/index.php/2010/09/30/acerca-de-la-certificacion-zce/">Link</a>)</p>
<p style="text-align:center;"><a href="http://www.zend.com/en/store/education/certification/yellow-pages.php#show-ClientCandidateID=ZEND014486"><img class="aligncenter" title="zce" src="http://www.zend.com/topics/php5-zce-logo-new.gif" alt="zce" width="146" height="136" /></a></p>
<p>Hoy he aprobado el examen &#8220;<strong>Z</strong>end PHP <strong>C</strong>ertified <strong>E</strong>ngineer &#8211; PHP5&#8243; y he pensado que estaría bien un post con mi opinión sobre esta certificación.<!--:--><!--:en--></p>
<p>&nbsp;</p>
<div>
<p><!--:--><span id="more-299"></span><!--:es--></p>
<p>Este examen ha sido mi primera experiencia en el mundo de las certificaciones y ha sido mejor de lo que esperaba. Empezando por el temario, que me parece bastante completo si bien creo que más bien se trata de un perfil de programador, análogo al SCJP de Java. Es decir, la certificación se llama &#8220;Ingeniero Certificado Zend PHP&#8221; y sin embargo la carga tanto en el temario como en el examen que podría considerarse más bien de ingeniería o arquitectura es mínima: patrones de diseño y ciertas buenas prácticas. Supongo que en Zend habrán considerado que no hay demanda suficiente como para establecer diferentes niveles como sí ocurre con otras tecnologías: developer, engineer y arquitect.</p>
<p>Los tests son suficientemente exigentes como para obligarte a dominar el temario, que en mi caso me ha hecho profundizar en ciertos temas. Como crítica el hecho de que hay que memorizar bastantes cosas que realmente en el día a día suele ser suficiente con saber consultarlas. De hecho, una certificación en la que dejen una referencia de las funciones sería interesante al evaluar algo que en el modelo actual se pasa por alto: la capacidad de entender sin problemas los prototipos de nuevas funciones y sus casos de uso.</p>
<p>El temario de la certificación ha sido:</p>
<ul>
<li>PHP Basics</li>
<li>Functions</li>
<li>Arrays</li>
<li>Object Oriented Programming</li>
<li>Security</li>
<li>XML &amp; Web Services</li>
<li>Strings &amp; Patterns</li>
<li>Databases &amp; SQL</li>
<li>Web Features</li>
<li>Streams &amp; Network Programming</li>
<li>PHP 4/5 Differences</li>
<li>Design &amp; Theory</li>
</ul>
<p>He debido ser el último certificado PHP5 ya que en la web de zend ya se encuentra únicamente disponible la certificación PHP5.3. He echado un vistazo y parece que han quitado todo lo referente a las diferencias entre PHP4/5 añadiendo en su lugar las nuevas características de PHP5.3 .</p>
<p>Mi consejo para el exámen es seguir los consejos de los posts que enlazo a continuación y sobre todo no conformarse con aprobar en los mock exams, lograr excelente y sin fallar en ningún apartado es lo recomendable.</p>
<p style="text-align:center;"><img class="aligncenter" title="mock" src="http://ivanmosquera.net/wp-content/uploads/Pantallazo-217.png" alt="mock" width="538" height="336" /></p>
<p>Hay cierta polémica acerca de si estos exámenes de simulación son más o menos difíciles que el exámen final. En mi opinión, sí que son ligeramente más difíciles que el exámen real pero lo que ocurre es que las preguntas se repiten frecuentemente y terminas recordándolas con lo que a la cuarta simulación puedes estar logrando excelente en todos los apartados más por memorística que por dominar el temario.</p>
<p><a href="http://blog.webmantica.com/2008/08/04/becoming-a-zend-php-certified-engineer/">http://blog.webmantica.com/2008/08/04/becoming-a-zend-php-certified-engineer/</a> (No olvides descargarte sus apuntes en pdf que enlaza al final, escritos a mano pero resumen muy bien el temario.)</p>
<p><a href="http://zceguide.blogspot.com/2010/07/preparing-for-teh-zce-exam-ultimate.html">http://zceguide.blogspot.com/2010/07/preparing-for-teh-zce-exam-ultimate.html</a> (Una buena recopilación)</p>
<p><a href="http://readtheweb.info/tag/zend-certified-engineer/">http://readtheweb.info/tag/zend-certified-engineer/</a> (Resúmenes del temario).</p>
<p>Añadir que el exámen no se encuentra disponible en español y que a diferencia de otras certificaciones, no se da tiempo extra debido a este hecho. También es cierto que 90 minutos son muchos para 70 preguntas cortas de las cuales como mucho 20 requieren hacer ciertos cálculos.</p>
<p>Las certificaciones ZCE no caducan, seguirás siendo certificado en PHP-X con la misma validez.</p>
<p>Tener la certificación ZCE permite utilizar el logo de la versión correspondiente, pertenecer al grupo LinkedIn de ZCE y figurar en las páginas amarillas de Zend.<!--:--><!--:en--></p>
<p>&nbsp;</p>
</div>
<p><!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/299/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=299&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/09/30/acerca-de-la-certificacion-zce/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://www.zend.com/topics/php5-zce-logo-new.gif" medium="image">
			<media:title type="html">zce</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.net/wp-content/uploads/Pantallazo-217.png" medium="image">
			<media:title type="html">mock</media:title>
		</media:content>
	</item>
		<item>
		<title>Ikuspro es libre.</title>
		<link>http://ivanmosquera.net/2010/07/26/ikuspro-es-libre/</link>
		<comments>http://ivanmosquera.net/2010/07/26/ikuspro-es-libre/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 20:52:06 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[antlr]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=257</guid>
		<description><![CDATA[Ikuspro es el proyecto de fín de carrera que hice en su día en el que aprendí un montón de cosas sin las cuales no se me habría ocurrido empezar el proyecto PFA. En su día ya comenté un poco de qué iba el tema . Tras eso la cosa terminó en que el proyecto [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=257&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es--></p>
<p style="text-align:center;"><a href="http://ivanmosquera.files.wordpress.com/2010/07/logoikusprogrande.png"><img class="aligncenter size-full wp-image-259" title="logoIkusprogrande" src="http://ivanmosquera.files.wordpress.com/2010/07/logoikusprogrande.png?w=497" alt=""   /></a></p>
<p>Ikuspro es el proyecto de fín de carrera que hice en su día en el que aprendí un montón de cosas sin las cuales no se me habría ocurrido empezar el proyecto <a href="http://phpforandroid.net">PFA</a>.</p>
<p>En su día ya comenté un poco <a href="http://ivanmosquera.files.wordpress.com/2010/07/logoikusprogrande.pngindex.php/2009/10/02/ikuspro-en-beta/">de qué iba el tema</a> . Tras eso la cosa terminó en que el proyecto obtuvo matrícula de honor.</p>
<div>
<div id="__ss_4756310" style="width:425px;"></div>
</div>
<p><!--:--><span id="more-257"></span><!--:es--></p>
<p>A rasgos generales aprendí lo siguiente y por tanto ahora que está liberado puede que sirva a alguien para indagar en estos aspectos:</p>
<ul>
<li>Implementación de un framework MVC para Swing usando genericidad.</li>
<li>Diseño de interfaces gráficas Swing con soporte para persistencia.</li>
<li>Buenas prácticas Swing: integración con los OS más utilizados, no recarga del hilo de eventos usando workers etc&#8230;</li>
<li>Programación concurrente en Java, diseño productor-consumidor.</li>
<li>Separación de una aplicación en dos partes comunicadas mediante sincronización de hilos.</li>
<li>Implementación con <a href="http://antlr.org">ANTLR</a> de un intérprete de un subconjunto de ANSI-C que se comunica con el GUI mediante mensajes XML.</li>
<li>Comunicación entre procesos mediante un API XML.</li>
<li>Dibujado en Canvas con Java2D e integración del mismo con el GUI.</li>
</ul>
<p>Lo cierto es que fue bastante divertido. Me consta que en EUITI tienen pensado utilizarlo en laboratorios y la idea es que otros alumnos extiendan Ikuspro con nuevas funcionalidades e incluso con nuevos intérpretes.</p>
<p>Gracias a Mikel Villamañe por confiar en mí para implementar la idea.</p>
<p>A continuación el material que usé en la defensa, un pantallazo y el enlace al repositorio en mi github.</p>
<iframe src='http://www.slideshare.net/slideshow/embed_code/4756310' width='497' height='407'></iframe>
<div id="__ss_4756310" style="width:425px;">
<div style="padding:5px 0 12px;">Repositorio en GITHUB: ﻿﻿<a href="http://github.com/ivmos/Ikuspro">http://github.com/ivmos/Ikuspro</a></div>
</div>
<p><!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/257/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/257/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/257/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/257/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/257/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/257/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/257/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/257/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=257&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/07/26/ikuspro-es-libre/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2010/07/logoikusprogrande.png" medium="image">
			<media:title type="html">logoIkusprogrande</media:title>
		</media:content>
	</item>
		<item>
		<title>Un vistazo a Quercus: PHP by Java</title>
		<link>http://ivanmosquera.net/2010/05/12/un-vistazo-a-quercus-php-by-java/</link>
		<comments>http://ivanmosquera.net/2010/05/12/un-vistazo-a-quercus-php-by-java/#comments</comments>
		<pubDate>Wed, 12 May 2010 20:06:10 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=227</guid>
		<description><![CDATA[Quercus es una implementación de PHP 5.2 escrita totalmente en Java, algo similar al famoso Hiphop de facebook sólo que en lugar de un traductor a C++ se trata de un intérprete PHP que corre en Java. Se ha oído hablar mucho menos de Quercus que de HipHop pero es probable que Hiphop no llegue [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=227&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es-->
<p style="text-align:center;"><a href="http://ivanmosquera.files.wordpress.com/2010/05/appengine-java-php1.jpg"><img class="aligncenter size-full wp-image-233" title="appengine-java-php" src="http://ivanmosquera.files.wordpress.com/2010/05/appengine-java-php1.jpg?w=497" alt=""   /></a></p>
<p style="text-align:center;">
<p>Quercus es una implementación de PHP 5.2 escrita totalmente en Java, algo similar al famoso Hiphop de facebook sólo que en lugar de un traductor a C++ se trata de un intérprete PHP que corre en Java.<br />
Se ha oído hablar mucho menos de Quercus que de HipHop pero es probable que Hiphop no llegue a utilizarse tanto como ya se está utilizando Quercus.<!--:--><!--:en-->
</p>
<p><!--:--><span id="more-227"></span><!--:es--><br />
¿En qué casos puede ser interesante utilizar Quercus?</p>
<ul>
<li>Desplegar aplicaciones web en entornos muy controlados donde sólo se acepta Java o en plataformas cloud computing que no soportan PHP pero sí Java (Google App Engine).</li>
<li>Necesitar cierta mejora en rendimiento que puede suponer utilizar Quercus en ciertas situaciones.</li>
<li>Desplegar scripts PHP encapsulados en una aplicación Java.</li>
<li>Utilizar PHP como motor de scripting de una aplicación Java, desarrollando el frontend por ejemplo en Swing y dejando el trabajo sucio para los scripts PHP.</li>
<li>Integrar aplicaciones PHP desde Java. (Alfresco lo utiliza).</li>
<li>Estás aburrido, probar por curiosidad.</li>
</ul>
<p>Este post se compone de dos partes. En la primera veremos cómo correr un wordpress sobre Quercus y en la segunda introduciré una prueba de concepto de uso de Quercus en el escritorio.</p>
<h3>1. WordPress sobre Quercus.</h3>
<ul>
<li>Descargamos Resin 3.1, la versión opensource del paquete que incluye Quercus junto a un servidor web.
<pre><code>wget http://www.caucho.com/download/resin-4.0.6.tar.gz</code></pre>
</li>
<li>Descargamos wordpress:
<pre><code>wget http://wordpress.org/latest.zip</code></pre>
</li>
<li>Descomprimimos Resin:
<pre><code>tar xvzf resin-4.0.6.tar.gz</code></pre>
</li>
<li> Ejecutamos resin:
<pre><code>sh resin-4.0.6/bin/resin.sh  start</code></pre>
</li>
<li> Podemos visitar <a href="http://127.0.0.1:8080">http://127.0.0.1:8080/</a></li>
<li>Ahora, sorpresa tratándose de Java <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , toca editar algo de XML:<br />
Copiamos lo siguiente en un fichero resin-web.xml colocado en webapps/ROOT/WEB-INF/:</li>
</ul>
<pre>&lt;web-app xmlns="http://caucho.com/ns/resin"&gt;
   &lt;servlet-mapping url-pattern="*.php"
                    servlet-class="com.caucho.quercus.servlet.QuercusServlet"&gt;
   &lt;/servlet-mapping&gt;
&lt;/web-app&gt;</pre>
<li>Para probar que está funcionando bien podemos colocar un script con un phpinfo() en webapps/ROOT/.<br />
Veremos que es bastante más feo que el de Zend:</li>
<pre>PHP Version =&gt; 5.2.0
System =&gt; Linux 2.6.31-14-generic i386
Build Date =&gt; 20100413T085542
Configure Command =&gt; n/a
Server API =&gt; CGI
Virtual Directory Support =&gt; disabled
Configuration File (php.ini) Path =&gt; null
PHP API =&gt; 20031224
PHP Extension =&gt; 20041030
Debug Build =&gt; no
Thread Safety =&gt; enabled
Registered PHP Streams =&gt; php, file, http, https</pre>
<li>Colocamos el jar del conector en la carpeta lib de Resin. Para que resin cargue el conector es necesario reiniciarlo:</li>
<li>
<pre><code>sh resin.sh restart</code></pre>
</li>
<p>Ya lo tendremos funcionando, 100% Java, 0% Zend, pero PHP al fin y al cabo, no ha  hecho falta cambiar ni una línea de WordPress.</p>
<p><strong>2. QuercusFun, prueba de concepto de aplicación Swing y CLI con Quercus.</strong></p>
<p>En github ya existe una prueba de concepto de integrar quercus sin servlet, es decir, como aplicación de escritorio: ( <a href="http://code.google.com/p/phpandallthat/#Detached_Quercus">http://code.google.com/p/phpandallthat/#Detached_Quercus</a> ) pero no es funcional debido a que no autocarga los módulos con lo cual las funciones de php no están disponibles y tampoco cuida otros aspectos como que los scripts no den timeout demasiado pronto. Es decir, en la práctica no funciona.</p>
<p>Mi aportación se llama &#8220;QuercusFun&#8221; y se trata de una aplicación que se puede ejecutar tanto con GUI (Swing) como desde línea de comandos&#8230; y funciona.</p>
<p>A continuación pantallazo y enlaces tanto al repositorio donde he subido el código como a un JAR.</p>
<p><a href="http://ivanmosquera.files.wordpress.com/2010/05/quercusfun1.png"><img class="alignleft size-full wp-image-239" title="quercusfun" src="http://ivanmosquera.files.wordpress.com/2010/05/quercusfun1.png?w=497" alt=""   /></a></p>
<h3 style="padding-left:180px;"><a href="http://ktulur.net/pro/quercusfun/quercusFun.jar">Bajar quercusFun.jar</a></h3>
<p>Para ejecutar como CLI:</p>
<pre><code>java -jar quercusFun.jar fichero.php</code></pre>
<p>y para ejecutar con GUI</p>
<pre><code>java  -jar quercusFun.jar
</code></pre>
<p>Repositorio en GITHUB: <a href="http://github.com/ivmos/QuercusFun">http://github.com/ivmos/QuercusFun</a><!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/227/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=227&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/05/12/un-vistazo-a-quercus-php-by-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2010/05/appengine-java-php1.jpg" medium="image">
			<media:title type="html">appengine-java-php</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2010/05/quercusfun1.png" medium="image">
			<media:title type="html">quercusfun</media:title>
		</media:content>
	</item>
		<item>
		<title>[Destripando PHP] Las variables</title>
		<link>http://ivanmosquera.net/2010/04/15/destripando-php-las-variables/</link>
		<comments>http://ivanmosquera.net/2010/04/15/destripando-php-las-variables/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 01:04:28 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[quercus]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=182</guid>
		<description><![CDATA[Con esta entrada comienzo una serie en la que hablaré del lenguaje PHP atendiendo a cómo está implementado internamente, para cada post desarrollaré un pequeño PECL (extensión de PHP) que trabaje los conceptos. En realidad no haría falta recurrir a ese nivel para ver las estructuras internas ya que PHP5 tiene un API de Reflection, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=182&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es-->Con esta entrada comienzo una serie en la que hablaré del lenguaje PHP atendiendo a cómo está implementado internamente, para cada post desarrollaré un pequeño PECL (extensión de PHP) que trabaje los conceptos. En realidad no haría falta recurrir a ese nivel para ver las estructuras internas ya que PHP5 tiene un <a href="http://es.php.net/manual/en/class.reflection.php">API de Reflection</a>, pero sí que es necesario para ver realmente cómo funcionan las cosas.<br />
La motivación de esta serie es ir documentando lo que voy aprendiendo en mi estudio de PHP. En el desarrollo de mi PFC me enganché al tema de los intérpretes y ahora trato de continuar tomando PHP como ejemplo, al mismo tiempo me ayuda a tener una base sólida de cara al <a href="http://www.zend.com/services/certification/php-5-certification/">ZCE</a>.</p>
<p>En este primer post veremos en profundidad cómo se trabajan las variables  en PHP y su idiosincrasia.<br />
<!--:--><span id="more-182"></span><!--:es--><br />
El PECL que he desarrollado para el mismo se llama &#8220;ejemplovars&#8221; y aporta las siguientes funciones:</p>
<ul>
<li>ejemplovars_print_type($variable)</li>
<li>ejemplovars_print_refcount($variable)</li>
<li>ejemplovars_dump_globalsymtable</li>
<li>ejemplovars_dump_currentsymtable</li>
</ul>
<p>Algunas cosas que veremos ya se trataron en <a href="http://ivanmosquera.net/index.php/2010/02/13/las-referencias-en-php-que-son-y-porque-no-usarlas/">otro post</a> pero he preferido retomar el tema desde el principio.<br />
.</p>
<h3>El zval</h3>
<p>PHP es un lenguaje de tipado débil, esto implica que se realizan un montón de conversiones implícitas entre los tipos de valores hasta el punto que desde el punto de vista del programador PHP puede dar la impresión de que en lugar de haber tipos las cosas funcionan mágicamente.</p>
<p>Los datos en php se almacenan en una estructura de datos llamada &#8220;zval&#8221; (Zend Value). Podemos encontrar esta estructura en &#8220;Zend/Zend.h&#8221;.</p>
<pre>
struct _zval_struct {
        /* Variable information */
        zvalue_value value;
        zend_uint refcount;
        zend_uchar type;
        zend_uchar is_ref;
};</pre>
<p>Podemos ver que un zval está compuesto por 4 miembros: value, refcount, type y is_ref. refcount es un unsigned integer mientras que type y is_ref son unsigned char.<br />
El miembro &#8220;value&#8221; sin embargo es una estructura union. La diferencia entre un struct y una union es que sólo ocupa lo que necesite el miembro más grande de la union, en lugar de reservarse memoria dedicada a cada uno de los miembros.<br />
Tiene perfecto sentido por tanto que esta estructura de datos sea una union ya que un &#8220;value&#8221; sólo puede ser de un tipo cada vez, usar un struct sería un gran desaprovechamiento.</p>
<h3>Los tipos</h3>
<p>Según la guía de Zend los tipos de datos en PHP son:</p>
<ul>
<li>boolean</li>
<li>int</li>
<li>float</li>
<li>string</li>
<li>array</li>
<li>object</li>
<li>NULL</li>
<li>resource</li>
</ul>
<p>Sin embargo, internamente los tipos son los siguientes (constantes numéricas):</p>
<ul>
<li>IS_NULL: se asigna automáticamente a las variables no inicializadas. La asignación se realiza en php con la palabra reservada NULL. Hay que tener en cuenta que NULL no es lo mismo que FALSE ni que cero, desde php lo parece debido a los casting implícitos que realiza.
</li>
<li>IS_BOOL: sólo puede tomar los valores TRUE y FALSE. Cuando se evalúan expresiones como WHILE o IF, lo que se hace es un casting implícito a ese tipo. Es decir, como en NULL, no se trata de que 0 sea lo mismo que FALSE sino que ese es un casting que se realiza automáticamente.
</li>
<li>IS_LONG: los int en php son internamente &#8220;signed long&#8221;, dependiente de la plataforma (en 32bit el rango es menor que en 64bit). Si en un script php una variable int se sale del rango, se convierte automáticamente al tipo que veremos a continuación.
</li>
<li>IS_DOUBLE: para números de coma flotante se utiliza el tipo &#8220;signed double&#8221; del sistema. Esto supone que la precisión no es exacta. Se entiende con este ejemplo :
<pre></pre>
<p>Cuando la precisión es una factor crítico se recomienda el uso de BCMath.</p>
</li>
<li>IS_STRING: cadena de caracteres, se reserva un bloque de memoria para acomodar el string en cuestión, guardando en el zval un puntero al mismo. La longitud del string se guarda también en el zval. Esto permite que el string contenga datos binarios ya que un &#8220;&#8221; no lo va a truncar dado que se maneja la longitud independientemente. Debido a esta práctica se dice que los string de php son &#8220;binary safe&#8221;. El bloque de memoria reservado es siempre la longitud del string + 1 ya que se añade &#8220;&#8221; al final para que el string se pueda trabajar desde cualquier función sin tener que depender de la longitud guardada en el zval.
</li>
<li>IS_ARRAY: un array en php en realidad no cumple con la definición clásica de array, sino que se trata de un mapa ordenado o tabla. Esto hace que muchos programadores que sólo conocen PHP se lleven una gran sorpresa al enfrentarse a otros lenguajes y ver que los arrays son mucho más limitados que en php. Quizá habría sido más afortunado llamar a este tipo collection o map directamente, pero a efectos prácticos es irrelevante. Aclarado esto, un array de php está implementado con una tabla Hash donde la clave (o label) puede ser un índice numérico o un string asociativo y está relacionada con un valor (o data).
<p>Internamente también se sigue esa generalización y se usa el tipo HashTable en lugar de usar arrays o listas enlazadas. Supongo que habrán considerado que la flexibilidad y facilidad de uso que supone compensa con creces  el impacto que pueda tener en cuanto a eficiencia. El tipo HashTable se encuentra definido en :</p>
<pre>
typedef struct _hashtable {
        uint nTableSize;
        uint nTableMask;
        uint nNumOfElements;
        ulong nNextFreeElement;
        Bucket *pInternalPointer;       /* Used for element traversal */
        Bucket *pListHead;
        Bucket *pListTail;
        Bucket **arBuckets;
        dtor_func_t pDestructor;
        zend_bool persistent;
        unsigned char nApplyCount;
        zend_bool bApplyProtection;
#if ZEND_DEBUG
        int inconsistent;
#endif
} HashTable;</pre>
</li>
<li>IS_OBJECT: Un objeto de php viene a  ser un array (de php) al que se le añaden métodos, modificadores de acceso y constantes. El modelo de objetos cambió radicalmente de PHP4 a PHP5.</li>
<li>IS_RESOURCE: se trata de un tipo especial utilizado para casos como un puntero FILE o una conexión a base de datos.</li>
</ul>
<h3>Probando con nuestro PECL</h3>
<p>Un ejemplo con nuestro PECL:</p>
<pre>
attr = 25;
ejemplovars_print_type($a);
$a = 4;
ejemplovars_print_type($a);
$a = $a * 1000000000;
ejemplovars_print_type($a);</pre>
<p>El resultado en una máquina de 32bits será:</p>
<pre>
Tipo: IS_BOOL
Tipo : IS_OBJECT
Tipo: IS_LONG
Tipo : IS_DOUBLE</pre>
<pre>
&lt;?php
$a = 5;
$b = &amp;$a;
$c = &amp;$a;
ejemplovars_print_refcount($a);
ejemplovars_print_type($a);</pre>
<p>El resultado será:</p>
<pre>
Referenciado 4 veces.
Tipo: IS_LONG</pre>
<p>El código de las dos funciones de ejemplovars es el siguiente, he evitado utilizar macros para trabajar con el zval para que quede claro el acceso a la estructura. Está probado en PHP 5.2, para 5.3 es probable que sea necesario algún cambio ya que para el nuevo recolector de basura  han tocado el struct zval. La función ejemplovars_print_type usa paso por valor mientras que ejemplovars_print_refcount usa paso por referencia implícito.</p>
<pre>
PHP_FUNCTION(ejemplovars_print_refcount)
{
    zval *arg;
    if (zend_get_parameters(ZEND_NUM_ARGS(), 1, &amp;arg) == FAILURE) {
        RETURN_NULL();
    }
    if (!arg-&gt;is_ref) {
        return;
    }

    php_printf("Referenciado %d veces.\n", arg-&gt;refcount);
}</pre>
<pre>
PHP_FUNCTION(ejemplovars_print_type)
{
   zval *arg;
   if (zend_get_parameters(ZEND_NUM_ARGS(), 1, &amp;arg) == FAILURE) {
      php_error_docref(NULL TSRMLS_CC, E_WARNING, "Falta el parámetro.");
      RETURN_NULL();
   }
   switch (arg-&gt;type) {
      case IS_NULL:
         php_printf("Tipo: IS_NULL\n");
         break;
      case IS_BOOL:
         php_printf("Tipo: IS_BOOL\n");
         break;
      case IS_LONG:
         php_printf("Tipo: IS_LONG\n");
         break;
      case IS_DOUBLE:
         php_printf("Tipo : IS_DOUBLE\n");
         break;
      case IS_STRING:
         php_printf("Tipo : IS_STRING\n");
         break;
      case IS_ARRAY:
         php_printf("Tipo : IS_ARRAY\n");
         break;
      case IS_OBJECT:
         php_printf("Tipo : IS_OBJECT\n");
         break;
      case IS_RESOURCE:
         php_printf("Tipo: IS_RESOURCE\n");
         break;
      default:
         php_printf("Otro tipo\n");
   }

}</pre>
<p></p>
<h3>Las tablas de símbolos</h3>
<p>Una tabla de símbolos es un HashTable con punteros a zvals. Hay una tabla de símbolos global que se crea al comienzo, y que podemos ver desde nuestros scripts php : $GLOBALS.</p>
<pre>
&lt;?php
$a = &quot;lala&quot;;

function prueba() {
   $b = &quot;jaja&quot;;
   print_r($GLOBALS);
}

prueba();</pre>
<p>
Veremos que la variable $b no figura en esa tabla de símbolos. Esto es así ya que al entrar en nuevos ámbitos locales, ya sea por entrar en una función o en el método de una clase, se crea una nueva tabla de símbolos y se establece esta como la tabla de símbolos activa. Es decir, en cada momento sólo tendremos acceso a dos tablas de símbolos: la global y la del ámbito concreto en que estemos. Al terminar la vida de una función su tabla de símbolos se destruye. Podemos caer en el error de pensar que entonces sólo va a haber dos tablas de símbolo en memoria como mucho, pero repito: se crea una por cada nuevo ámbito. Si desde una función o método llamas a otro, ya tienes otra tabla de símbolos iniciada sólo que la de la función invocadora no está activa. Con este diseño es fácil entender cómo funciona el concepto de visibilidad de variables locales.</p>
<p>La tabla de símbolos global así como el puntero a las demás se guarda en la estructura _zend_executor_globals. A continuación un fragmento, si quieres verla entera la encontrarás en zend_globals.h.</p>
<pre>
        /* symbol table cache */
        HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
        HashTable **symtable_cache_limit;
        HashTable **symtable_cache_ptr;

        zend_op **opline_ptr;

        HashTable *active_symbol_table;
        HashTable symbol_table;         /* main symbol table */

        HashTable included_files;       /* files already included */

        jmp_buf *bailout;

        int error_reporting;
        int orig_error_reporting;
        int exit_status;

        zend_op_array *active_op_array;

        HashTable *function_table;      /* function symbol table */
        HashTable *class_table;         /* class table */
        HashTable *zend_constants;      /* constants table */</pre>
<p>
Podemos acceder fácilmente a la estructura zend_globals con la macro EG. ejemplovars tiene dos funciones que acceden a la tabla de símbolos global y la activa respectivamente:</p>
<pre>
PHP_FUNCTION(ejemplovars_dump_globalsymtable)
{
      php_printf("Tabla de simbolos global : \n\n");
      php_ejemplovars_print_var_hash(&amp;(EG(symbol_table)));
}

PHP_FUNCTION(ejemplovars_dump_currentsymtable)
{
      php_printf("Tabla de simbolos actualmente activa : \n\n");
      php_ejemplovars_print_var_hash(EG(active_symbol_table));
}</pre>
<p>
La tabla de símbolos global se pasa por referencia ya que zend_executor_globals la incluye directamente en lugar de simplemente un puntero a la misma.</p>
<pre>
Tabla de simbolos global :

The value of GLOBALS is: Array
The value of _ENV is: Array
The value of HTTP_ENV_VARS is: Array
The value of argv is: Array
The value of argc is: 1
The value of _POST is: Array
The value of HTTP_POST_VARS is: Array
The value of _GET is: Array
The value of HTTP_GET_VARS is: Array
The value of _COOKIE is: Array
The value of HTTP_COOKIE_VARS is: Array
The value of _SERVER is: Array
The value of HTTP_SERVER_VARS is: Array
The value of _FILES is: Array
The value of HTTP_POST_FILES is: Array
The value of _REQUEST is: Array
The value of a is: lala

Tabla de simbolos actualmente activa :

The value of b is: jaja</pre>
<p>
Próximamente subiré &#8220;ejemplovars&#8221; a github o similar.</p>
<p>Si te interesa el tema de PECL recomiendo el libro &#8220;Extending and Embedding PHP&#8221; de Sara Golemon.<!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=182&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/04/15/destripando-php-las-variables/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>
	</item>
		<item>
		<title>Doctest en PHP</title>
		<link>http://ivanmosquera.net/2010/03/18/doctest-en-php/</link>
		<comments>http://ivanmosquera.net/2010/03/18/doctest-en-php/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 22:03:55 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[doctest]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=137</guid>
		<description><![CDATA[Doctest es un módulo de Python que permite incluir tests en los comentarios (en los llamados docstring para ser exactos). Pues bien, existe una implementación para PHP en PEAR. Para desarrollos rápidos (o ágiles que se dice últimamente), Doctest representa una buena forma de escribir tests debido a que utilizar otras herramientas típicas como PHPUnit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=137&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es--></p>
<div id="attachment_146" class="wp-caption aligncenter" style="width: 310px"><img title="ykPzBWTSLc70G4FqoIoG.0" src="http://ivanmosquera.files.wordpress.com/2010/03/ykpzbwtslc70g4fqoiog-0.jpg?w=300&#038;h=225" alt="dna" width="300" height="225" /><p class="wp-caption-text">Dana prefiere Haskell</p></div>
<p>Doctest es un módulo de Python que permite incluir tests en los comentarios (en los llamados docstring para ser exactos). Pues bien, existe una implementación para PHP en PEAR.</p>
<p><!--:--><span id="more-137"></span><!--:es--></p>
<p>Para desarrollos rápidos (o ágiles que se dice últimamente), Doctest representa una buena forma de escribir tests debido a que utilizar otras herramientas típicas como PHPUnit o Simpletest requiere una metodología de primero escribir los tests y luego implementar, que está muy bien pero la curva de aprendizaje no es despreciable y tiene más sentido en proyectos de cierto recorrido. En realidad los doctest no se suelen considerar una alternativa a los tests unitarios sino una opción más centrada en la documentación y más sencilla aunque menos potente.</p>
<p>Instalamos la herramienta vía PEAR:</p>
<pre>pear install -f Testing_DocTest</pre>
<p>A continuación un ejemplo de un doctest en php.</p>
<p>El doctest se incluye entre unas etiquetas <strong>&lt;code&gt;</strong>. La salida esperada para que el test sea satisfactorio se escribe tras <strong>&#8220;// expects:&#8221;</strong>.</p>
<pre>&lt;?php
/**
 * <code>
 * mostrarNumeros(3);
 *
 * // expects:
 * //0
 * //11
 * //222
 * //3333
 * </code>
 *
 **/
function mostrarNumeros($num) {
   for($i=0;$i&lt;=$num;$i++) {
      for($j=0;$j&lt;=$i;$j++) {
         echo $i;
      }
      echo "\n";
   }
}</pre>
<p>Para ejecutar los tests :</p>
<pre>phpdt numeros.php.</pre>
<p>Dará como resultado:</p>
<pre>Processing /tmp/numeros.php
[PASS]  function mostrarNumeros

Total time    : 0.0253 sec.
Passed tests  : 1
Skipped tests : 0
Failed tests  : 0</pre>
<p>El doctest se suele incluir en la misma cabecera de comentario de phpdoc pero lo he omitido para que quede más claro lo necesario estrictamente para Doctest.</p>
<p>Doctest por defecto sólo considerará que el test ha sido satisfactorio si la salida del script es exactamente la misma que la salida que hemos escrito como esperada pero ¿y si queremos un comportamiento algo más flexible ?</p>
<p>Para ello podemos usar flags que alteren el comportamiento:</p>
<ul>
<li>NORMALIZE_WHITESPACE: se ignoran los espacios en blanco.</li>
<li>CASE_INSENSITIVE:  ignorar mayúsculas/minúsculas</li>
<li>SKIP: ignorar el test</li>
<li>ELLIPSIS: permitir utilizar el comodín [...]. Útil para los casos en que parte de la salida es variable</li>
</ul>
<p>A continuación un ejemplo que usa un flag de ELLIPSIS. También sirve para ver que podemos incluir varios tests en la misma cabecera.</p>
<pre>&lt;?php
/**
 * <code>
 * // Usamos ELLIPSIS porque hay una parte de la salida que no podemos predecir
 *
 * // flags: ELLIPSIS
 * echo testString();
 * // expects:
 * // Lo siguiente no se puede predecir [...].
 *
 * </code>
 *
 * <code>
 * // Este es el mismo test pero lo hacemos para ver que podemos dividir la salida con \
 *
 * // flags: ELLIPSIS
 * echo testString();
 * // expects:
 * // Lo siguiente \
 * // no se puede \
 * // predecir [...].
 *
 * </code>
 *
 */
function testString()
{
    return sprintf('Lo siguiente no se puede predecir %s', microtime());
}</pre>
<p>Si la salida esperada para un test es demasiado grande podemos utilizar &#8220;expects-file:&#8221; en lugar de &#8220;expects :&#8221;. El ejemplo de mostrarNumeros quedaría así con expects-file:</p>
<pre>&lt;?php
/**
 * <code>
 * mostrarNumeros(3);
 *
 * // expects-file: mostrarNumeros.txt
 *
 * </code>
 *
 **/
function mostrarNumeros($num) {
   for($i=0;$i&lt;=$num;$i++) {
      for($j=0;$j&lt;=$i;$j++) {
         echo $i;
      }
      echo "\n";
   }
}</pre>
<p>En el fichero mostrarNumeros.txt incluiremos la salida en bruto, es decir, sin comentar.</p>
<p>Existe también la posibilidad de incluir todo el test en un fichero externo:</p>
<pre> * <code>
 * // test-file: tests/test1.doctest
 * </code></pre>
<p>Por último, existe la posibilidad de insertar cierto código a interpretar antes que todo lo demás. Esto es útil para establecer variables de entorno o para simular una petición HTTP.</p>
<pre>/**
 * This is a file level test.
 *
 * <code>
 * // setup:
 * // $_ENV['OSTYPE'] = 'linux';
 * echo OS_TYPE;
 * // expects:
 * // linux
 * </code>
 */
define('OS_TYPE', $_ENV['OSTYPE']);</pre>
<p>Como conclusión, los doctest son una pequeña joya de Python que por suerte ha sido portada también a PHP. Permite incrustar los pequeños scripts que probablemente ya haces para probar tus clases y te obliga a ver tus clases desde el punto de vista del usuario de las mismas, de modo que te ayudará a pensar en si la encapsulación es correcta, en si tiene demasiadas dependencias, en si hace demasiadas cosas etc.. Sirve como complemento a los tests unitarios pero también como iniciación a la escritura de tests.</p>
<p>Se suele decir que el código fácil de testear es propio de un software bien diseñado.</p>
<p>Enlaces:</p>
<p><a href="http://code.google.com/p/testing-doctest/">http://code.google.com/p/testing-doctest/</a><br />
<a href="http://pear.php.net/package/Testing_DocTest">http://pear.php.net/package/Testing_DocTest</a><br />
<a href="http://en.wikipedia.org/wiki/Doctest">http://en.wikipedia.org/wiki/Doctest</a><br />
Para ver más ejemplos de uso, lo mejor es ver el fichero de pruebas de Testing-DocTest, disponible en el repositorio:<br />
<a href="http://svn.php.net/repository/pear/packages/Testing_DocTest/trunk/tests/test1.php">http://svn.php.net/repository/pear/packages/Testing_DocTest/trunk/tests/test1.php</a><br />
<!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/137/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=137&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/03/18/doctest-en-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2010/03/ykpzbwtslc70g4fqoiog-0.jpg" medium="image">
			<media:title type="html">ykPzBWTSLc70G4FqoIoG.0</media:title>
		</media:content>
	</item>
		<item>
		<title>Las referencias en PHP: qué son y el porqué de no usarlas</title>
		<link>http://ivanmosquera.net/2010/02/13/las-referencias-en-php-que-son-y-porque-no-usarlas/</link>
		<comments>http://ivanmosquera.net/2010/02/13/las-referencias-en-php-que-son-y-porque-no-usarlas/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 17:17:45 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=101</guid>
		<description><![CDATA[Según un estudio reciente, PHP es actualmente el tercer lenguaje de programación más popular.  Puede sorprender teniendo en cuenta los buenos comentarios que han recibido durante años lenguajes como Ruby y que se daba por seguro el retroceso de PHP. Yo creo que esto es debido a que la gente que está detrás de PHP [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=101&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es--></p>
<div id="attachment_108" class="wp-caption aligncenter" style="width: 434px"><img class="size-full wp-image-108" title="elephant-php" src="http://ivanmosquera.files.wordpress.com/2010/02/elephant-php.png?w=497" alt="elefante"   /><p class="wp-caption-text">elefante</p></div>
<p>Según un <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">estudio reciente</a>, PHP es actualmente el tercer lenguaje de programación más popular.  Puede sorprender teniendo en cuenta los buenos comentarios que han recibido durante años lenguajes como Ruby y que se daba por seguro el retroceso de PHP.  Yo creo que esto es debido a que la gente que está detrás de PHP ha sabido adaptarse a las nuevas tendencias y responder a tiempo. Dos ejemplos muy significativos:</p>
<ul>
<li>PHP5</li>
<li>Zend Framework (y otros)</li>
</ul>
<p><!--:--><!--:en-->Sorry this post is only in Spanish :<br />
<a href="http://ivanmosquera.files.wordpress.com/2010/02/elephant-php.pngindex.php/2010/02/13/las-referencia…que-no-usarlas/?lang=es">http://ivanmosquera.files.wordpress.com/2010/02/elephant-php.pngindex.php/2010/02/13/las-referencia…que-no-usarlas/?lang=es</a><!--:--><span id="more-101"></span><!--:es--><br />
La comunidad &#8220;phpera&#8221; lejos de quedarse parada ante el adelantamiento por la derecha que parecía que les iba a hacer Ruby/Python/etc han mejorado el lenguaje increíblemente hasta el punto que el diseño OO de PHP tiene poco que envidiar a Java. Me imagino a los desarrolladores allá por el 2003 diciéndo <em>&#8220;Dicen que PHP4 no es enterprise-ready, que su OO da asco, vale, tienen razón.&#8221;</em>. Y de ahí salió PHP5, miras la lista de cambios entre PHP4 y PHP5, y resulta increíble que sólo les separe un número de versión.  Algo parecido se puede decir de &#8220;Zend Framework&#8221;: <em>&#8220;Ruby on Rails mola mucho, un killer app, hagamos algo parecido&#8221;</em>. Y acabó surgiendo Zend Framework, un excelente framework MVC con &#8220;total&#8221; cobertura de test unitarios y completamente modular. Además, surgieron muchos otros framework que rivalizan con ZF, el &#8220;oficial&#8221;, creando una competencia absolutamente sana. Se trata de ejemplos como CakePHP, Symfony o CodeIgniter. El último episodio donde se ha demostrado este pragmatismo de los phperos ha sido dejar Zend_Entity y pasar a adoptar el ORM supuestamente de la competencia : Doctrine. Esto contrasta con la gente de Perl que ha dedicado la mayor parte de sus esfuerzos a crear una máquina virtual, académicamente muy interesante pero en la práctica ¿Hay nuevos usuarios de Perl existiendo PHP, Python y Ruby?.</p>
<p>Vale, a estas alturas te estarás preguntando a qué viene el título de esta entrada. Pues bien, todo esto de la actitud pragmática, los grandes avances etc. está muy bien pero existe un problema en PHP si bien en mi opinión es un mal menor: se trata de mantener la compatibilidad hacia atrás. No sólo un mal menor sino además un mal necesario que permite que los desarrolladores vayan adaptándose a los nuevos cambios progresivamente. La opción contraria podría resultar crítica para muchos usuarios, hay pocos casos donde ha sido necesario ese caso extremo, me viene a la cabeza VisualBasic 6 y poco más.</p>
<p>PHP es un lenguaje que empezó con objetivos mucho más modestos, seguramente <a href="http://es.wikipedia.org/wiki/Rasmus_Lerdorf">Rasmus Lerdof</a> ni en sus sueños más húmedos se imaginó que su herramienta evolucionaría hasta soportar sitios de la escala de Facebook. La política en PHP ha sido ir corrigiendo cosas y manteniendo compatibilidad hacia atrás avisando al desarrollador de las malas prácticas mediante warnings. En esta entrada hablaré de porqué no se debe utilizar a día de hoy referencias en PHP.</p>
<h3>¿Qué son las referencias? &#8220;&amp;&#8221;</h3>
<p>Las referencias de PHP se parecen en esencia a las referencias (que no punteros) de C++. Son algo parecido a los enlaces duros de UNIX. Se han utilizado mucho en PHP debido a que en PHP4 el diseño OO era bastante distinto.  En POO se trabaja con referencias de objetos en lugar de con los datos directamente debido a que la idea es mandar mensajes a los objetos y que ellos mismos sean los encargados de modificar su propio estado, y para eso basta la referencia del objeto para mandarle mensajes, difícilmente vas a necesitar acceder al objeto en sí mismo.<br />
En PHP4, la implementación OO hacía que fuera necesario utilizar el operador referencia para hacer POO ya que de lo contrario estabas copiando objetos.  También hay que tener en cuenta que hasta hace relativamente poco no se programaba OO en PHP por lo que se asumía que al igual que en C, si quieres trabajar con una estructura de datos muy grande, lo suyo es pasarlo por referencia y así evitar la copia. Esto me lleva a explicar un hecho poco conocido de PHP.</p>
<h3>copy-on-write</h3>
<p>La práctica de usar paso por referencia por motivos de optimización es equivocada <em>actualmente </em>debido a que PHP hace copy-on-write. Esto consiste en que PHP cuando se pasa por valor (casi siempre), no hace una copia de la variable desde el principio sino que trabajará en realidad con la referencia y hará una copia sólo en el momento en que detecte que vas a intentar modificar. Es decir, tú como programador feliz, estás en el ámbito de la función y con un parámetro por valor, y parece que estás trabajando desde el principio con una copia con lo cual si la estructura de datos es muy grande te puedes ver tentado a pasar por referencia pero es un error debido a que PHP internamente no hace la copia hasta que sea realmente necesario. Vale, pero puedes estar pensando: ¡ pero es que precisamente mi función va a modificar esa estructura y mucho así que se va a hacer esa costosa copia! Bien, el problema subyacente es que no se está pensando suficientemente a lo OO sino más bien proceduralmente.  En PHP5 el modelo de objetos está rediseñado de modo que los objetos se trabajan con referencias como en Java, por lo que deja de ser necesario utilizar el operador referencia para hacer POO. Esto supone que el operador &#8216;=&#8217; en la práctica es como si copiara sólo para los tipos primitivos mientras que para los objetos copia la referencia. Esta suele ser la típica explicación pero en realidad es errónea, lo cierto es que esta misma mala explicación también se suele dar en Java como simplificación. Lo que ocurre en realidad es que en PHP5 no trabajas con el objeto directamente, trabajas con su referencia, de modo que cuando pasas el objeto por valor, como mucho estarás provocando (copy-on-write) la copia de la referencia pero no del objeto. Si quieres una copia física del objeto lo que necesitarás es clonar el objeto (clone). Puedes utilizar el operador de referencia con objetos también pero resulta innecesario.</p>
<p>Vamos a ver más en profundidad cómo trabaja el intérprete de PHP las variables.</p>
<pre>apt-get source php5-cli.</pre>
<p>La estructura de datos que almacena una variable en PHP se llama &#8220;zval_struct&#8221; (zval entre amigos).  Un &#8220;zval&#8221; tiene los siguientes campos:</p>
<ul>
<li>tipo (el tipo de la variable)</li>
<li>valor (el valor de la variable)</li>
<li>is_ref (flag que indica si la variable es una referencia &amp;)</li>
<li>refcount (contador del número de símbolos que apuntan a este zval)</li>
</ul>
<p>La estructura está definida en zend.h:</p>
<pre>struct _zval_struct {
/* Variable information */
zvalue_value value;             /* value */
zend_uint refcount;
zend_uchar type;        /* active type */
zend_uchar is_ref;
};</pre>
<p>Un zvalue_value puede ser muchas cosas. Ahí reside la magia del tipado de php. Tenemos en la misma estructura de datos las distintas posibilidades, tanto tipos primitivos como objetos, en <a href="http://ivanmosquera.files.wordpress.com/2010/02/elephant-php.pngindex.php/2009/10/02/ikuspro-en-beta/">Ikuspro</a> realicé una implementación similar sólo que la genericidad de Java facilita mucho las cosas. Los objetos no se almacenan en esta estructura sino que únicamente se guarda el puntero (en PHP-5).</p>
<pre>typedef union _zvalue_value {
        long lval;                                      /* long value */
        double dval;                            /* double value */
        struct {
                char *val;
                int len;
        } str;
        HashTable *ht;                          /* hash table value */
        zend_object_value obj;
} zvalue_value;</pre>
<p>En PHP4 probablemente el diseño era distinto de manera que en el valor iba directamente el objeto de manera que era necesario usar continuamente el operador referencia para hacer programación orientada a objetos correctamente.</p>
<p>Un zend_object_value es lo siguiente (zend_types.h):</p>
<pre>typedef struct _zend_object_value {
        zend_object_handle handle;
        zend_object_handlers *handlers;
} zend_object_value;</pre>
<p>El handle es un ID único de entre ese tipo concreto de objetos (no global). El tipo del objeto y su funcionalidad está en esta otra estructura que es encuentra en una tabla. Desde zend_object_value vemos que se apunta con handlers en la entrada adecuada.</p>
<pre>typedef struct _zend_object_handlers {
        zend_object_add_ref_t                    add_ref;
        zend_object_del_ref_t                    del_ref;
        zend_object_delete_obj_t                 delete_obj;
        zend_object_clone_obj_t                  clone_obj;
        zend_object_read_property_t              read_property;
        zend_object_write_property_              write_property;
        zend_object_get_property_ptr_t           get_property_ptr;
        zend_object_get_property_zval_ptr_t      get_property_zval_ptr;
        zend_object_get_t                        get;
        zend_object_set_t                        set;
        zend_object_has_property_t               has_property;
        zend_object_unset_property_t             unset_property;
        zend_object_get_properties_t             get_properties;
        zend_object_get_method_t                 get_method;
        zend_object_call_method_t                call_method;
        zend_object_get_constructor_t            get_constructor;
        zend_object_get_class_entry_t            get_class_entry;
        zend_object_get_class_name_t             get_class_name;
        zend_object_compare_t                    compare_objects;
} zend_object_handlers;</pre>
<p>Los símbolos (nombres de variables) que apuntan a un zval se guardan en una tabla de símbolos. Normalmente solemos hablar de variables locales, variables globales, ámbitos de variables&#8230; Bien, de lo que se trata es que tenemos una tabla de símbolos por ámbito y en PHP el ámbito está unido a las funciones o métodos. En C por ejemplo, es diferente y los ámbitos van unidos a los bloques directamente de modo que tenemos tablas de símbolos por bloques.  Por ejemplo en PHP tenemos:</p>
<pre>
$a = "hola/";
echo $a;
{
          $a = "jaja/";
          echo $a;
}
echo $a;</pre>
<p>El resultado será &#8220;hola/jaja/jaja/&#8221;</p>
<p>En C:</p>
<pre>#include
main() {

char *a = "hola/";
printf("%s",a);

{
char *a = "jaja/";
printf("%s",a);
}

printf("%s",a);

}</pre>
<p>El resultado es &#8220;hola/jaja/hola/&#8221;.</p>
<p>Si te parece un detalle de importancia echa un vistazo a este código:</p>
<pre>
&lt;?
$a = &quot;Hola&quot;;
echo $a;

if ($a == &quot;Hola&quot;) {
        $b = &quot;Adios&quot;;
}
echo $b;</pre>
<p>Este código en C no tiene sentido.</p>
<p>Podemos ver los zval con xdebug_debug_zval</p>
<pre>apt-get install php5-xdebug</pre>
<p>Veamos un ejemplo:</p>
<pre>
atrib1 = "foo";
$obj-&gt;atrib2 = "bar";
xdebug_debug_zval('obj');
$obj2 = $obj;
xdebug_debug_zval('obj2');
$obj3 = &amp;$obj;
xdebug_debug_zval('obj3');</pre>
<p>El resultado es:</p>
<pre>a: (refcount=1, is_ref=0)='Hola'
b: (refcount=1, is_ref=0)=2
obj: (refcount=1, is_ref=0)=class stdClass { public $atrib1 = (refcount=1, is_ref=0)='foo'; public $atrib2 = (refcount=1, is_ref=0)='bar' }
obj2: (refcount=2, is_ref=0)=class stdClass { public $atrib1 = (refcount=1, is_ref=0)='foo'; public $atrib2 = (refcount=1, is_ref=0)='bar' }
obj3: (refcount=2, is_ref=1)=class stdClass { public $atrib1 = (refcount=1, is_ref=0)='foo'; public $atrib2 = (refcount=1, is_ref=0)='bar' }</pre>
<p>Como puedes ver el único con is_ref=1 es la variable referencia. Un zval se elmina cuando refcount pasa a ser cero y esas referencias van desaparenciendo a medida que se van resolviendo los ámbitos. Es decir, si hemos creado un zval dentro de una función (localmente) tendremos en principio símbolos pertenecientes a la tabla de símbolos de esa función. Al terminar la función ese zval pasará a tener 0 de refcount y por tanto se podrá liberar. Se suele decir que la función unset() de php destruye objetos pero creo que eso no es cierto.  Un ejempo:</p>
<pre>$orig = 4;

$a = $orig;
xdebug_debug_zval('a');
$b = &amp;$a;
xdebug_debug_zval('a');
unset($a);
xdebug_debug_zval('b');
echo $b ."\n";
$obj = new stdClass;
$obj-&gt;foo = "bar";
$obj2 = &amp;$obj;
xdebug_debug_zval('obj');
unset($obj);
xdebug_debug_zval('obj2');
echo $obj2-&gt;foo ."\n";</pre>
<p>El resultado es:</p>
<pre>a: (refcount=2, is_ref=0)=4
a: (refcount=2, is_ref=1)=4
b: (refcount=1, is_ref=0)=4
4
obj: (refcount=2, is_ref=1)=class stdClass { public $foo = (refcount=1, is_ref=0)='bar' }
obj2: (refcount=1, is_ref=0)=class stdClass { public $foo = (refcount=1, is_ref=0)='bar' }
bar</pre>
<p>Como podemos ver lo que hace unset en realidad es disminuir el número del contador.  Por último un ejemplo en el que pasamos la referencia de un objeto con lo cual hacemos que deje de apuntar a un objeto y pase a ser un string (tipo primitivo):</p>
<pre>
foo = "bar";
xdebug_debug_zval('a');
lafuncion(&amp;$a);
xdebug_debug_zval('a');</pre>
<p>El resultado es:</p>
<pre>
a: (refcount=1, is_ref=0)=class stdClass { public $foo = (refcount=1, is_ref=0)='bar' }
a: (refcount=1, is_ref=0)='Sorpresa'</pre>
<p>Como conclusión: no merece la pena trabajar con el operador referencia si estamos haciendo POO, lo único que vamos a conseguir es liar el código y provocar bugs, los punteros y referencias no están al nivel de abstracción que solemos manejar en nuestra vida diaria mientras que los objetos, atributos y métodos sí. Desgraciadamente existe mucho código &#8220;legacy&#8221; que hace uso intensivo de pasos por referencia, incluyendo algunas funciones de ordenación de PHP. Una opción para convertir esas funciones es sustituir los parámetros por referencia por un objeto stdClass que los encapsule pasado por valor.</p>
<p>Links:</p>
<p>Para escribir este post me he basado en el código citado del intérprete de PHP y en los siguientes enlaces. Si crees que he cometido algún error pon un comentario, estaré encantado en aprender:</p>
<p>http://php.net/manual/en/features.gc.refcounting-basics.php</p>
<p>http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html</p>
<p>http://blog.libssh2.org/index.php?/archives/51-Youre-being-lied-to..html</pre>
<p><!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=101&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2010/02/13/las-referencias-en-php-que-son-y-porque-no-usarlas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2010/02/elephant-php.png" medium="image">
			<media:title type="html">elephant-php</media:title>
		</media:content>
	</item>
		<item>
		<title>Desarrollo para Plataforma Flash en Linux: Minibuilder</title>
		<link>http://ivanmosquera.net/2009/12/26/desarrollo-para-plataforma-flash-en-linux-minibuilder/</link>
		<comments>http://ivanmosquera.net/2009/12/26/desarrollo-para-plataforma-flash-en-linux-minibuilder/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 16:53:18 +0000</pubDate>
		<dc:creator>Ivan Mosquera Paulo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://ivanmosquera.net/?p=75</guid>
		<description><![CDATA[Desde hace un tiempo Adobe ya no desarrolla Flash/Flex Builder para Linux. Una alternativa libre prometedora que he encontrado es Minibuilder. Se trata de un editor que utiliza la tecnología Adobe Air. flash platform Veamos a continuación los pasos necesarios para desarrollar en Linux para plataforma Flash con esta herramienta: Adobe no longer develops Flash/Flex [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=75&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!--:es-->Desde hace un tiempo Adobe ya no desarrolla Flash/Flex Builder para Linux. Una alternativa libre prometedora que he encontrado es Minibuilder. Se trata de un editor que utiliza la tecnología Adobe Air.<br />
<img src="http://ivanmosquera.files.wordpress.com/2009/12/flash-platform-signature1.jpg?w=497" alt="flash platform" /></p>
<p>flash platform</p>
<p>Veamos a continuación los pasos necesarios para desarrollar en Linux para plataforma Flash con esta herramienta:<br />
<!--:--><!--:en-->Adobe no longer develops <a href="http://diariolinux.com/2009/04/30/adobe-paraliza-el-desarrollo-de-flex-builder-3-para-linux/">Flash/Flex Builder for Linux</a>. I&#8217;ve found a promising opensource alternative : <a href="http://code.google.com/p/minibuilder/">Minibuilder</a>. It&#8217;s an IDE built with <a href="http://es.wikipedia.org/wiki/Adobe_Integrated_Runtime">Adobe Air</a>.</p>
<div id="attachment_86" class="wp-caption aligncenter" style="width: 283px"><img class="size-full wp-image-86" title="flash-platform-signature" src="http://ivanmosquera.files.wordpress.com/2009/12/flash-platform-signature1.jpg?w=497" alt="flash platform"   /><p class="wp-caption-text">flash platform</p></div>
<p>Let&#8217;s see how to install and use this tool:<br />
<!--:--><span id="more-75"></span><!--:es--></p>
<p>1. <strong>Instalamos Adobe AIR</strong> : (Fuente:  <a href="http://www.sizlopedia.com/2008/04/06/how-to-install-adobe-air-on-ubuntu/">http://www.sizlopedia.com/2008/04/06/how-to-install-adobe-air-on-ubuntu/</a> )</p>
<pre>wget http://airdownload.adobe.com/air/lin/download/1.5/AdobeAIRInstaller.bin</pre>
<pre>chmod +x AdobeAIRInstaller.bin</pre>
<pre>./AdobeAIRInstaller.bin</pre>
<p>Si aún habiendo instalado las dependencias tiene problemas para hacer funcionar Adobe AIR con 64 bits, con un error como el siguiente: <em>Error loading the runtime (libnss3.so: wrong ELF class: ELFCLASS64)</em><br />
Los pasos que le pueden faltar son:<br />
<code><br />
$ cd /usr/lib32/<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libnss3.so .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libssl3.so .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libsmime3.so .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libnspr4.so .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libnssutil3.so.1d .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libplc4.so.0d .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libplds4.so .<br />
$sudo ln -s /emul/ia32-linux/usr/lib/libplds4.so.0d libplds4.so.0d<br />
</code></p>
<p>2. <strong>Instalar Java</strong></p>
<pre>apt-get install sun-java-jre</pre>
<p>3. <strong>Instalar Flex</strong> 3.5 ( URL : <a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3">http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3</a> )</p>
<p>Descomprimir en algún sitio</p>
<p>4. <strong>Descargar minibuilder</strong>: (URL :  <a href="http://minibuilder.googlecode.com/files/AirMiniBuilder-1.0-alpha-3.air">http://minibuilder.googlecode.com/files/AirMiniBuilder-1.0-alpha-3.air</a> )</p>
<pre>Adobe\ AIR\ Application\ Installer /$RUTA_ABSOLUTA/AirMiniBuilder-1.0-alpha-3.air</pre>
<p>5. Tras la instalación de minibuilder, éste <strong>se iniciará</strong>. Veremos que nos pide <strong>ejecutar</strong> un tal <strong>MBCompiler</strong>, la ruta al script figurará en la última línea de la ventana.<br />
En mi caso : <em>/opt/AirMiniBuilder/share/MBCompiler/start</em><br />
Supongo que Minibuilder no hace ese trabajo por nosotros debido a algún tipo de limitación del sandbox de Air.</p>
<p>Teniendo ejecutado MBCompiler podemos hacer click en &#8220;Check again&#8221; y desaparecerá la advertencia.<br />
También tenemos que especificar la ruta  a flex en el cuadro &#8220;SDK Path&#8221;.</p>
<p>Y ya está. Ya podemos empezar a utilizar de Minibuilder. Empezaremos con un pequeño proyecto para el Flash Player.</p>
<p>Utilizamos la pestaña &#8220;<em>Create New Project</em>&#8220;:</p>
<div id="attachment_78" class="wp-caption aligncenter" style="width: 597px"><img class="size-full wp-image-78" title="Minibuilder" src="http://ivanmosquera.files.wordpress.com/2009/12/1.png?w=497" alt="Minibuilder"   /><p class="wp-caption-text">Minibuilder</p></div>
<p>Elegimos:<br />
Project target : &#8220;<em>Flash Player AS3</em>&#8220;</p>
<p>Vemos que soporta dos frameworks : Flex y <a href="http://aswing.org">AsWing</a>. Nosotros por ahora sólo usaremos Flex.<br />
Activamos &#8220;<em>Add (some) Flex support</em>&#8220;</p>
<p>Como project name lo que queramos, en mi caso &#8220;hola mundo&#8221;.</p>
<p>Ese texto inicial que veremos se trata de MXML, un lenguaje de marcado que facilita el uso del framework Flex.</p>
<div id="attachment_79" class="wp-caption aligncenter" style="width: 778px"><img class="size-full wp-image-79" title="Editor Minibuilder" src="http://ivanmosquera.files.wordpress.com/2009/12/21.png?w=497" alt="Editor Minibuilder"   /><p class="wp-caption-text">Editor Minibuilder</p></div>
<p>Hacemos click en &#8220;Compile and Quickrun&#8221;. Veremos que tarda su tiempo en compilar el SWF, años luz de la rapidez de MTASC o Haxe.<br />
No veremos nada cuando no debería ser así. Sospecho que puede ser porque mi distribución Linux utiliza SWFDEC por defecto en lugar del player de flash Adobe. El swf lo podemos encontrar en la carpeta bin-debug, con lo cual podremos ejecutarlo manualmente.</p>
<p>Veremos que aparecen unos botones (&#8220;AAA&#8221;,&#8221;BBB&#8221;&#8230;) es debido a que se está utilizando la clase &#8220;Application.as&#8221; predefinida por Minibuilder que incluye esos botones en tabs.</p>
<p>Ahora ya es cuestión de aprender Flex. Como pistas para alguien que venga de MTASC decir que las clases Flash que se solían utilizar anteriormente, en la documentación están en el API de Flash Player.</p>
<p>Así que para jugar por un lado tenemos los controles del framework Flex: <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=controls_01.html">http://livedocs.adobe.com/flex/3/html/help.html?content=controls_01.html</a> y por otro lado tenemos el API de Flash Player, el cual ya nos resultará familiar al haberlo utilizado con <a href="http://mtasc.org">MTASC</a> , <a href="http://haxe.org">Haxe</a> o Flash Studio:</p>
<p><a href="http://livedocs.adobe.com/flex/3/html/help.html?content=Part3_Flash_Player_APIs_1.html">http://livedocs.adobe.com/flex/3/html/help.html?content=Part3_Flash_Player_APIs_1.html</a></p>
<p>Podemos utilizar ambas cosas sin problemas. En el siguiente ejemplo, se utiliza NetStream y Netconnection en lugar del control VideoDisplay de Flex, pero eso no quita para que los botones a utilizar puedan ser controles Flex:</p>
<p><a href="http://blog.flexexamples.com/2008/03/01/displaying-a-video-in-flex-using-the-netconnection-netstream-and-video-classes/">http://blog.flexexamples.com/2008/03/01/displaying-a-video-in-flex-using-the-netconnection-netstream-and-video-classes/</a></p>
<p>Vemos que en ese ejemplo el código Actionscript se encuentra incrustado en el MXML. No tiene porqué ser así y de hecho yo no creo que sea una buena práctica. El ejemplo de Minibuilder utiliza una clase independiente para el código (Application.as). De todos modos, ya hablaremos en otro post sobre buenas prácticas, patrones y otras librerías.</p>
<p>Entonces como conclusión. ¿Qué ofrece Minibuilder en cuanto a facilitar el desarrollo para plataforma Flash?</p>
<p>Resaltado y autocompletado AS3, así como compilación amigable de SWF incluyendo gestión de los namespaces.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:2319px;width:1px;height:1px;">
<pre class="code">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- http://blog.flexexamples.com/2008/03/01/displaying-a-video-in-flex-using-the-netconnection-netstream-and-video-classes/ --&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white"
        creationComplete="init();"&gt;

    &lt;mx:Script&gt;
        &lt;![CDATA[
            import mx.utils.ObjectUtil;

            private var nc:NetConnection;
            private var ns:NetStream;
            private var video:Video;
            private var meta:Object;

            private function init():void {
                var nsClient:Object = {};
                nsClient.onMetaData = ns_onMetaData;
                nsClient.onCuePoint = ns_onCuePoint;

                nc = new NetConnection();
                nc.connect(null);

                ns = new NetStream(nc);
                ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv");
                ns.client = nsClient;

                video = new Video();
                video.attachNetStream(ns);
                uic.addChild(video);
            }

            private function ns_onMetaData(item:Object):void {
                trace("meta");
                meta = item;
                // Resize Video object to same size as meta data.
                video.width = item.width;
                video.height = item.height;
                // Resize UIComponent to same size as Video object.
                uic.width = video.width;
                uic.height = video.height;
                panel.title = "framerate: " + item.framerate;
                panel.visible = true;
                trace(ObjectUtil.toString(item));
            }

            private function ns_onCuePoint(item:Object):void {
                trace("cue");
            }
        ]]&gt;
    &lt;/mx:Script&gt;

    &lt;mx:Panel id="panel" visible="false"&gt;
        &lt;mx:UIComponent id="uic" /&gt;
        &lt;mx:ControlBar&gt;
            &lt;mx:Button label="Play/Pause" click="ns.togglePause();" /&gt;
            &lt;mx:Button label="Rewind" click="ns.seek(0); ns.pause();" /&gt;
        &lt;/mx:ControlBar&gt;
    &lt;/mx:Panel&gt;

&lt;/mx:Application&gt;</pre>
</div>
<p><!--:--></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanmosquera.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanmosquera.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ivanmosquera.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ivanmosquera.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanmosquera.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanmosquera.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanmosquera.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanmosquera.wordpress.com/75/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanmosquera.net&amp;blog=16516799&amp;post=75&amp;subd=ivanmosquera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ivanmosquera.net/2009/12/26/desarrollo-para-plataforma-flash-en-linux-minibuilder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.helpexamples.com/flash/video/cuepoints.flv" length="1161290" type="video/x-flv" />
	
		<media:content url="http://1.gravatar.com/avatar/9577514d092a25034026cd68dd729ae4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ivmos</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2009/12/flash-platform-signature1.jpg" medium="image">
			<media:title type="html">flash platform</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2009/12/flash-platform-signature1.jpg" medium="image">
			<media:title type="html">flash-platform-signature</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2009/12/1.png" medium="image">
			<media:title type="html">Minibuilder</media:title>
		</media:content>

		<media:content url="http://ivanmosquera.files.wordpress.com/2009/12/21.png" medium="image">
			<media:title type="html">Editor Minibuilder</media:title>
		</media:content>
	</item>
	</channel>
</rss>
