<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marcos Fernández</title>
	<atom:link href="http://www.marcosdev.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcosdev.com</link>
	<description>Programación de páginas web</description>
	<lastBuildDate>Thu, 17 Feb 2011 18:31:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Rendimiento: YUI Compressor + ANT = Ficheros comprimidos</title>
		<link>http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/</link>
		<comments>http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:31:50 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=117</guid>
		<description><![CDATA[El post anterior trataba sobre la utilización de la herramienta ANT para concatenar varios ficheros y así reducir el número de peticiones que hacía nuestra página web para ser cargada. Otro punto importante, es que la posibilidad de reducir el fichero concatenado a un fichero mucho menor. La reducción puede ser tal, que según que <a href="http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>El post anterior trataba sobre la utilización de la herramienta ANT para concatenar varios ficheros y así reducir el número de peticiones que hacía nuestra página web para ser cargada.</p>
<p>Otro punto importante, es que la posibilidad de reducir el fichero concatenado a un fichero mucho menor. La reducción puede ser tal, que según que librerías pueden llegar a reducirse un 80% del total de su peso. Si estamos de aplicaciones de intranet, podemos estar hablando de reducir la carga de 1 Mb a 300 Kb, lo cual es una mejora sustancial.</p>
<p>En post bastante antiguos expliqué el uso de la compresión de ficheros js mediante el PHP. Esta técnica es muy cómoda para sitios pequeños, pero en el momento que el proyecto reciba muchas peticiones, este sistema se puede volver en nuestra contra ya que estamos sobrecargando el servidor con un trabajo extra que puede ser evitado.</p>
<p>La versión más óptima de enviar ficheros comprimidos es que estos ya lo estén y que el servidor web únicamente se encargue de servir esta petición. Para ello vamos a utilizar gran librería creada por los expertos en optimización web de Yahoo: <a title="Ir a la página de la librería" href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>. Necesitamos descargarnos esta librería y utilizar el fichero jar que tenemos en la carpeta build. Para los que no sepáis Java, tranquilos, no es necesario. Únicamente vamos a configurar nuestro XML de Ant para que utilice dicha librería para comprimir nuestros ficheros javascript (esta técnica también es aplicable a ficheros CSS).</p>
<p>Para ello, agregaremos la siguiente porción de código XML a nuestro fichero creado en el <a title="Ver post anterior" href="http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/">anterior post</a>:</p>
<p>Este grupo de tareas se llama <em>comprimirFicheros</em> y antes de ejecutarse, ejecutará de forma no paralela el grupo de tareas <em>concatenarFicherosJs</em>. Más adentro, se le define la carpeta dónde están ubicados los ficheros js y que ficheros queremos comprimir, en este caso, el fichero que hemos generado después de concatenar los ficheros del grupo de tareas <em>concatenarFicherosJs</em>. Luego aparecen un grupo de líneas que detallan que la ejecución de la librería y algunos argumentos que ésta precisa.  Y por último no menos importante, se define que todos los ficheros js seleccionados para ser comprimidos, tendrán una copia con el mismo nombre pero acabado en -<em>min.js</em>.</p>
<pre class="brush: xml">
&lt;target name=&quot;comprimirFicheros&quot; depends=&quot;concatenarFicherosJs&quot;&gt;
&lt;apply executable=&quot;java&quot; parallel=&quot;false&quot;&gt;
&lt;fileset dir=&quot;js/&quot; includes=&quot;fichero.js&quot;/&gt;
&lt;arg line=&quot;-jar&quot;/&gt;
&lt;arg path=&quot;yuicompressor.jar&quot;/&gt;
&lt;srcfile /&gt;
&lt;arg line=&quot;-o&quot;/&gt;
&lt;mapper type=&quot;glob&quot; from=&quot;*.js&quot; to=&quot;js/*-min.js&quot;/&gt;
&lt;targetfile /&gt;
</pre>
<p>Así, cuando hemos ejecutado este grupo de tareas, se ha ejecutado otro grupo (<em>concatenarFicherosJs</em>) y se ha generado un fichero comprimido del fichero generado por el grupo anterior (f<em>ichero-min.js</em>). En este caso la reducción es mínima ya que son ficheros muy pequeños, pero si hacéis pruebas con ficheros más grandes, podréis comprobar la gran mejora sobre el peso del fichero que provoca la compresión con esta utilidad.</p>
<p>Esto debe ser un <em>MUST</em>, como dicen los anglosajones, dentro de nuestras técnicas para mejorar el rendimiento de nuestro sitio web.</apply></target></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rendimiento: concatenando ficheros con ANT, reduciendo peticiones</title>
		<link>http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/</link>
		<comments>http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 21:26:27 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=104</guid>
		<description><![CDATA[Uno de los puntos primordiales en el rendimiento de la web es la reducción del número de peticiones que ésta realiza al servidor para cargar todos los elementos. A más peticiones, más tarda la página en cargar. Es cierto que podemos utilizar un CDN para cargar los ficheros necesarios de nuestra web desde diferentes servidores <a href="http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Uno de los puntos primordiales en el rendimiento de la web es la reducción del número de peticiones que ésta realiza al servidor para cargar todos los elementos. A más peticiones, más tarda la página en cargar. Es cierto que podemos utilizar un <a title="Explicación de CDN (En inglés)" href="http://en.wikipedia.org/wiki/Content_delivery_network">CDN</a> para cargar los ficheros necesarios de nuestra web desde diferentes servidores y con ello aumentar el rendimiento, pero esto es un añadido, no una mejora esencial.</p>
<p>Dentro de este tema de reducir las peticiones, aparece un tema recurrente en prácticamente todo proyecto web que se precie: la llamada a múltiples ficheros js para cargar una página web. Normalmente, nuestra página cuenta con algún framework javascript, cómo <a title="Ir al sitio web de jQuery" href="http://www.jquery.com">jQuery</a>, el uso de algún <a title="Directorio de plugins de jQuery" href="http://plugins.jquery.com/">plugin</a> de este framework que estamos utilizando y por último, nuestro propio fichero js con javascript que hemos manufacturado nosotros. Es decir, de inicio, ya tenemos como mínimo tres peticiones. Veamos cómo podemos reducir el número de peticiones de 3 a 1.</p>
<p>Para ello, haremos uso de <a title="Ir a la web del proyecto Apache Ant" href="http://ant.apache.org/">Ant</a>. Para quien no lo conozca, es una herramienta que permite realizar tareas mecánicas, normalmente muy utilizada en proyectos Java. Las tareas se definen en ficheros xml que dicha herramienta interpreta. Entornos de desarrollo como <a title="Ir a la web del proyecto Netbeans" href="http://www.netbeans.org">Netbeans</a> o <a title="Ir a la web del proyecto Eclipse" href="http://www.eclipse.org/">Eclipse</a>, llevan integrado esta utilidad. Veamos el siguiente xml:</p>
<pre class="brush: xml">
&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project name=&quot;DemoJavascript&quot; xmlns:rsel=&quot;antlib:org.apache.tools.ant.types.resources.selectors&quot;&gt;
&lt;target name=&quot;concatenarFicherosJs&quot; description=&quot;Unir varios ficheros js en orden&quot;&gt;
&lt;concat destfile=&quot;js/fichero.js&quot;&gt;
&lt;filelist dir=&quot;js/&quot;&gt;
&lt;file name=&quot;ficheroUno.js&quot; /&gt;
&lt;file name=&quot;ficheroDos.js&quot; /&gt;
&lt;file name=&quot;ficheroTres.js&quot; /&gt;
&lt;/filelist&gt;
&lt;/concat&gt;
&lt;/target&gt;
&lt;/project&gt;
</pre>
<p>Lo primero que se define es un nombre del proyecto más el xlmns de Apache Ant, lo cual nos sirve para validar nuestra sintaxis dentro del fichero xml.</p>
<p>Luego definimos un grupo de tareas &#8211; <em>target</em> (nuestro fichero puede contener más de  un grupo de tareas) y la llamamos <em>concatenarFicherosJs</em>. Este grupo tiene una tarea llamada <em>concat</em> la cual indica que se deben concatenar ficheros. Esta tarea, define un atributo <em>destfile</em> que indica el fichero que contendrá los tres ficheros concatenados. Ya hemos indicado que queremos concatenar y en dónde queremos guardar el fichero generado. Ahora nos queda indicar que ficheros y en que orden queremos que se concatenen. Eso se realiza mediante la definición de una lista de ficheros &#8211; <em>filelist</em>, dónde indicamos la ruta &#8211; <em>dir</em> &#8211; dónde encontrar los ficheros que a continuación definimos. A partir de ahí, definimos cada uno de los ficheros que queremos concatenar y en que orden necesitamos que se concatenen. El orden es importante ya que si primero si intenta cargar un plugin de jQuery sin que el framework se haya cargado antes, nos dará un error.</p>
<p>Para los que no han utilizado nunca Ant, hay muchos ejemplos sencillos en internet de cómo ejecutar tareas de Ant desde Eclipse y Netbeans.</p>
<p>Esto es todo. Ahora ya podemos modificar nuestra página para que en vez de realizar tres solicitudes, cargue un único fichero. En la utilización de proyectos mucho más complejos, esto puede ser una mejora sustancial ya que podemos reducir las peticiones de 8 o 9 a 1 o 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Javascript &#8211; rendimiento: generación de nuevo contenido</title>
		<link>http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/</link>
		<comments>http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:45:20 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=99</guid>
		<description><![CDATA[Gracias a la mejora que ha sufrido los motores de javascript de los navegadores y de la revolución que ha supuesto Ajax para el mundo del desarrollo web, cada vez se ha optado por generación del contenido sin la necesidad de recargar la página. El problema, es que esta generación al vuelo, si no se <a href="http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Gracias a la mejora que ha sufrido los motores de javascript de los navegadores y de la revolución que ha supuesto Ajax para el mundo del desarrollo web, cada vez se ha optado por generación del contenido sin la necesidad de recargar la página.</p>
<p>El problema, es que esta generación al vuelo, si no se hace bien, puede producir que nuestra página sufra grandes retardos e incluso a mucha gente le aparezca el contenido a golpes. Esto suele ser debido a que el contenido que se está generando, se está inyectando al DOM durante su proceso de creación. Esto provoca que recorramos continuamente al DOM. Veamos un ejemplo:</p>
<pre class="brush: javascript">
var accessDiv = document.getElementById(&#039;access&#039;);
for (var i = 0; i &lt; 50; i++){
accessDiv.innerHTML += &#039;hola&#039;;
}
</pre>
<p>De siguiente forma, generamos el html y una vez generado, entonces lo introducimos en el DOM:</p>
<pre class="brush: javascript">
var html = &#039;&#039;;
for (var i = 0; i &lt; 50; i++){
html += &#039;hola&#039;;
}
document.getElementById(&#039;access&#039;).innerHTML = html;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript – rendimiento: array.length</title>
		<link>http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/</link>
		<comments>http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 17:41:36 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=91</guid>
		<description><![CDATA[Seguimos con otro punto a tener en cuenta a la hora de mejorar el rendimiento de nuestro código javascript. Supongamos que queremos recorrer todo los elementos DIV de una determinada página.  Normalmente el código que haríamos sería el siguiente: var elementosDiv = document.getElementsByTagName(&#039;div&#039;); for (var i = 0; i &#60;  elementosDiv.length; i++){ //Trabajar con el <a href="http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seguimos con otro punto a tener en cuenta a la hora de mejorar el rendimiento de nuestro código javascript. Supongamos que queremos recorrer todo los elementos DIV de una determinada página.  Normalmente el código que haríamos sería el siguiente:</p>
<pre class="brush: javascript">
var elementosDiv = document.getElementsByTagName(&#039;div&#039;);
for (var i = 0; i &lt;  elementosDiv.length; i++){
//Trabajar con el array elementosDiv[i]
}
</pre>
<p>En la variable elementosDiv guardamos un array con todos los elementos DIV que contiene en nuestra página. Después, vamos iterando sobre este array trabajamos con cada uno de los elementos que componen este array. El problema que tiene este código, es que la variable elementosDiv contiene un array de elementos vivos, es decir, contiene una referencia directa al objeto DOM de nuestra página. Si durante la ejecución del bucle se agrega un nuevo elemento DIV a la página, automáticamente elementosDiv.length valdrá lo que valía antes más uno. Esto nos indica que para cada iteración del bucle, nuestro código solicita que se cuenten cuantos elementos DIV tiene el objeto DOM, lo cual produce una gran carga al navegador.</p>
<p>Para evitar este comportamiento, es tan sencillo como guardar cuantos elementos DIV hay justo antes de comenzar con la iteración.</p>
<pre class="brush: javascript">
var elementosDiv = document.getElementsByTagName(&#039;div&#039;);
for (var i = 0, count = elementosDiv.length; i &lt; count; i++){
//Trabajar con el array elementosDiv[i]
}
</pre>
<p>En este código, justo cuando se inicializa el bucle, se guarda en la variable count el número de elementos del array. De esta forma, ya no es necesario que en cada iteración del bucle se tenga que ir a contar el número de elementos DIV al objeto DOM.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript &#8211; rendimiento: reduciendo los accesos al DOM</title>
		<link>http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/</link>
		<comments>http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 18:44:37 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=84</guid>
		<description><![CDATA[Programar aplicaciones fiables debe ser el objetivo de cualquier profesional dedicado a este mundo. El problema, es que a veces nos centramos tanto en la fiabilidad que perdemos de vista otros elementos como pueden ser la usabilidad, accesibilidad, y en el caso que tratamos en este post, el rendimiento. En la actualidad, el rendimiento, y <a href="http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Programar aplicaciones fiables debe ser el objetivo de cualquier profesional dedicado a este mundo. El problema, es que a veces nos centramos tanto en la fiabilidad que perdemos de vista otros elementos como pueden ser la usabilidad, accesibilidad, y en el caso que tratamos en este post, el rendimiento. En la actualidad, el rendimiento, y sobretodo en internet, es un factor clave para que un proyecto pueda tener éxito.</p>
<p>En este primer post, vamos a ver un truco  muy sencillo para optimizar el rendimiento de nuestro código javascript y así conseguir una respuesta más rápida de nuestro navegador.</p>
<p>Suponemos el siguiente código:</p>
<pre>
<pre class="brush: javascript">

   var start = new Date().getTime();
   for (var i = 0; i &lt; 5000; i++){
      document.getElementById(&#039;s&#039;).value = i;
   }
   var elapsed = new Date().getTime() - start;
   console.log(elapsed);
</pre>
</pre>
<p>Este código accederá 5000 veces a un objeto y le cambiará su valor. Si ejecutáis este código con el firebug, podréis el tiempo en milisegundos que tarda en ejecutar dicho código. Cada vez que itera en el bucle, debe acceder al DOM y recorrerlo buscando un elemento que tenga un identificador igual a &#8216;s&#8217;.</p>
<p>Optimizar este código es muy sencillo y únicamente debemos acceder una vez al dom y guardar el objeto en una variable.
</pre>
<pre>
<pre class="brush: javascript">

   var start = new Date().getTime();
   var s = document.getElementById(&#039;s&#039;);
   for (var i = 0; i &lt; 5000; i++){
      s.value = i;
   }
   var elapsed = new Date().getTime() - start;
   console.log(elapsed);
</pre>
</pre>
<p>Y aún mejor, si no queremos realizar ningún tipo de animación, únicamente mostrar un valor después de un bucle, podemos asignarlo al final del proceso
</pre>
<pre>
<pre class="brush: javascript">

  var start = new Date().getTime();
  var j;
  for (var i = 0; i &lt; 5000; i++){
   //Aquí haríamos nuestro cálculo
   j = i;
  }
  document.getElementById(&#039;s&#039;).value = j;
  console.log(end.getTime() - start);
</pre>
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De vuelta!!!</title>
		<link>http://www.marcosdev.com/de-vuelta/</link>
		<comments>http://www.marcosdev.com/de-vuelta/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 18:11:15 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=82</guid>
		<description><![CDATA[Buenas, ha pasado mucho tiempo desde mi última publicación. He estado mucho tiempo sin tener justo eso, tiempo, para poder publicar. Durante este año he estado bastante liado con el trabajo, estudiando, realizando experimentos,&#8230; y sobretodo, me he tomado un tiempo para mi y para mis cosas, como por ejemplo, ir de forma habitual al <a href="http://www.marcosdev.com/de-vuelta/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Buenas, ha pasado mucho tiempo desde mi última publicación. He estado mucho tiempo sin tener justo eso, tiempo, para poder publicar. Durante este año he estado bastante liado con el trabajo, estudiando, realizando experimentos,&#8230; y sobretodo, me he tomado un tiempo para mi y para mis cosas, como por ejemplo, ir de forma habitual al gimnasio.</p>
<p>A partir de ahora, intentaré volver a publicar de forma más periódica y no volver a dejar tan descuidado el blog.</p>
<p>Así pues, es breve nos veremos en nuevo post.</p>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/de-vuelta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZCE PHP 5 conseguido</title>
		<link>http://www.marcosdev.com/zce-php-5-conseguido/</link>
		<comments>http://www.marcosdev.com/zce-php-5-conseguido/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 07:57:58 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=75</guid>
		<description><![CDATA[Después de mucho tiempo, vuelvo a postear en mi blog, y en este caso, es para decir que al final, después de una odisea, he conseguido el título de certificación de PHP5 ( Zend Certified Engineer PHP5). Todo ha sido más largo de lo que debería no por no querer presentarme al examen, ya que <a href="http://www.marcosdev.com/zce-php-5-conseguido/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Después de mucho tiempo, vuelvo a postear en mi blog, y en este caso, es para decir que al final, después de una odisea, he conseguido el título de certificación de PHP5 ( Zend Certified Engineer PHP5). Todo ha sido más largo de lo que debería no por no querer presentarme al examen, ya que tenía cita para Julio, si no por que no me dejaron hacerlo. Os resumo mi pequeña odisea:</p>
<ul>
<li>Pido cita (día y hora para hacer el examen a través de la página de Pearson VUE que es la empresa encarga de autorizar centros para la realización del exámen)</li>
<li>Cuadro la cita con mis vacaciones</li>
<li>Dos días antes del examen, repaso y hago exámenes de pruebas (se pueden comprar en la página de Zend)</li>
<li>Me presento en el centro. Me tienen 30 minutos de reloj esperando para al final decirme que no puedo hacer el exámen ya que, según ellos, los de Pearson Vue han cambiado el programa y desde entonces, a ellos no les funcionan por no se cuantas escusas más.</li>
<li>Me traslado a mi pueblo e intento cambiar el examen, pero ya no me dejan por que ya ha pasado.</li>
<li>Tengo que llamar varias veces hasta contactar con Pearson (más vale que habléis inglés si os pasa esto) para realizar la reclamación. Tengo que mandar un e-mail a una dirección determinada.</li>
<li>Mando el e-mail y contactan conmigo dos días después. Hablan con el centro y en teoría en una o dos semanas estará todo arreglado.</li>
<li>Pasan las semanas, mando e-mail sin respuestas hasta que estallo y mando un e-mail acordándome de ciertos parientes. A este e-mail si que recibo respuesta. Intercambio de e-mail con tono tenso.</li>
<li>Busco centro en Madrid (agosto), llamo al centro pero hasta septiembre está cerrado y no me pueden dar información.</li>
<li>Llamo el 2 de septiembre y me comunican que el sistema funciona correctamente y puedo realizar el examen.</li>
<li>Programo viaje para finales de septiembre (y de paso de turismo).</li>
<li>Por fin hago el examen el 25 de septiembre en el centro Azpe de Madrid.</li>
<li>Apruebo!!!!</li>
</ul>
<p>Cómo podéis comprobar, el camino ha sido largo, pero bueno, ya se ha acabado y ahora toca prepararse para el SCJP de Java.</p>
<p>En cuanto al examen, lo que os puedo contar es que es algo más difícil que los de test, principalmente por que aparecen cuestiones referentes a funciones que no están incluidas en el libro de preparación de Apress. No os puedo contar más ya que te hacen firmar que no comentes nada sobre el examen. De todas formas, si os preparáis bien y lleváis bien controlado todo lo que aparece en el libro de Apress, (y mucha práctica, por supuesto), no tendréis problemas para sacaros la certificación.</p>
<p>En cuanto al lugar y forma de realizar el examen, pues lo más resañable sería que cuando lleguéis os verificarán vuestra identidad mediante la solicitación de dos documentos identificativos, luego os pedirán firmar algún documento, iréis a un habitáculo cerrado con cámara, no se puede entrar con ningún objeto personal, ni incluso el reloj. La pantalla del programa de preguntas es toda blanca y podréis revisar todas las preguntas en cualquier momento hasta al hacer clic sobre el botón de evaluar, y por supuesto, todo en inglés.</p>
<p>Espero que más o menos, os haya aclarado un poco la idea del examen.</p>
<p>Un saludo y ánimo a todos</p>
<p>P.D.: aquí os dejo el logotipo con el enlace al perfil mi certificación</p>
<div class="wp-caption alignnone" style="width: 83px"><a href="http://www.zend.com/en/yellow-pages#show-ClientCandidateID=ZEND011172"><img title="ZCF PHP 5" src="http://www.zend.com/img/yellowpages/php5_zce_logo_new.gif" alt="Haz clic en el logo para ver mi perfil" width="73" height="68" /></a><p class="wp-caption-text">Haz clic en el logo para ver mi perfil</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/zce-php-5-conseguido/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Preparando certificación Zend de PHP 5</title>
		<link>http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/</link>
		<comments>http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/#comments</comments>
		<pubDate>Sun, 10 May 2009 10:29:10 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=72</guid>
		<description><![CDATA[Durante estos meses he estado muy ausente del blog. He cambiado de trabajo y  tecnologías con las que tener que programar, y por si fuera poco, también he cambiado de casa, con lo que todo ello conlleva. Además, no se si por el constructor o por telefónica, no tengo línea de ADSL, y estoy con <a href="http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Durante estos meses he estado muy ausente del blog. He cambiado de trabajo y  tecnologías con las que tener que programar, y por si fuera poco, también he cambiado de casa, con lo que todo ello conlleva. Además, no se si por el constructor o por telefónica, no tengo línea de ADSL, y estoy con un truñete sistema de internet a través de 3G.</p>
<p>Pero, a lo que iba en este post: <a title="Certificación Zend de PHP" href="http://www.zend.com/en/services/certification/">la certificación Zend de PHP</a>. He comenzado a prepararme seriamente dicha certificación que tenía en mente hace ya mucho tiempo. He comprado el Voucher (ticket para poder hacer el examen) y 5 exámenes de prueba. Tengo previsto realizar la prueba dentro un mes, durante junio probablemente. El examen se puede realizar en cualquier centro Vue autorizado y consiste en 70 preguntas tipo test, multiselección o de escritura, durante un tiempo máximo de 90 minutos. El <a title="Temario Certificación Zend PHP" href="http://www.zend.com/en/services/certification/php-5-certification/">temario</a> intenta contemplar todos los ámbitos de PHP, he incluso diferencias entre la versión 4 y la 5. Una vez superada la prueba, tu perfil aparece en un <a title="Páginas amarillas certificados por Zend" href="http://www.zend.com/en/yellow-pages">listado</a> en la página de Zend, con la gente que ha aprobado el examen, y cuya finalidad es de que si alguna empresa necesita de un programador PHP certificado, pueda ser fácil encontrarlo. Además, te ofrecen colocar un <a title="Logo certificados por Zend" href="http://www.zend.com/services/certification/zce-logo">logo de la certificación</a> enlazado con tu perfil de usuario dentro de Zend. El porcentaje de preguntas aprobadas necesarias para poder aprobar el examen, no lo he encontrado en ningún sitio, así que no puedo dar detalles sobre ese tema.</p>
<p>Dentro de unos días, tengo intención de continuar escribiendo tutoriales que nos ayuden con el día a día, dentro de nuestro mundo de la programación web.</p>
<p>Un saludo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/preparando-certificacion-zend-de-php-5/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Crear una clase para conectar a la base de datos (IV)</title>
		<link>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/</link>
		<comments>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 08:26:33 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=57</guid>
		<description><![CDATA[Este va a ser el último tip para ir mejorando nuestra clase. Durante todo el recorrido hemos podido ver una evolución de nuestra clase, ganando abstracción, ganando flexibilidad y ahora vamos a ganar capacidad gestión de errores. Un problema que podemos tener al trabajar con nuestra base de datos, es que ésta no esté disponible <a href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este va a ser el último tip para ir mejorando nuestra clase. Durante todo el recorrido hemos podido ver una evolución de nuestra clase, ganando abstracción, ganando flexibilidad y ahora vamos a ganar capacidad gestión de errores.</p>
<p><span id="more-57"></span></p>
<p>Un problema que podemos tener al trabajar con nuestra base de datos, es que ésta no esté disponible en un momento determinado por que esté sobrecargada o por que no hay posibilidad de conexión. Por ello, debemos controlar que si no tenemos conexión a la base de datos, la ejecución de nuestra aplicación sea detenida inmediatamente (en el caso de que el uso de la base de datos sea crítico y nuestra aplicación sea 100% dependiente de la conexión a la base de datos.</p>
<p>Existen multitud de formas de controlar y gestionar los errores. PHP nos da ciertas herramientas para intentar capturar estas situaciones. En el ejemplo vamos a utilizar la función <a title="Detalle de la función exit de PHP" href="http://es2.php.net/manual/es/function.exit.php"><em><strong>exit</strong></em></a>, que permite detener inmediatamente la ejecución de nuestro script, y también la función <a title="Detalle de la función error_log de PHP" href="http://es2.php.net/error_log"><em><strong>error_log</strong></em></a> que permite registrar en el log de errores de nuestro servidor web un evento, en nuestro caso, una frase identificadora para que podamos saber cúando ha pasado el problema. Si tenemos un hosting contratado (no un servidor dedicado), es prácticamente seguro que no tendremos acceso al fichero de logs del servidor web, pero lo bueno de esta función es que también es capaz de guardar el registro que nosotros queramos en un derminado fichero o incluso mandar un e-mail a una determinada cuenta. Recomiendo mirar la documentación por que además de las capacidades citadas, permite más opciones, las cuales puedes ser muy útiles para nuestra aplicación.</p>
<p>Lo que vamos a hacer es modificar la función pública conectar() de la clase Db. En dicha función vamos a detectar si nuestra conexión ha fallado, y si se da el caso, registrar dicho error para luego diagnosticar el problema, además de mostrar un error por pantalla avisando al visitante de existe un problema con nuestra aplicación.</p>
<pre>
<pre class="brush: php">
/*Realiza la conexión a la base de datos.*/
private function conectar(){
   switch ($this-&gt;tipo){
      case &#039;mysql&#039;:       $link=mysql_connect($this-&gt;servidor, $this-&gt;usuario, $this-&gt;password);
                          if ($link){
                             mysql_select_db($this-&gt;base_datos,$this-&gt;link);
                             @mysql_query(&quot;SET NAMES &#039;utf8&#039;&quot;);
                          }
                          break;

      case &#039;postgress&#039;:   $this-&gt;link=pg_connect(&quot;host=&quot;.$this-&gt;servidor.&quot; dbname=&quot;.$this-&gt;base_datos.&quot; user=&quot;.$this-&gt;usuario.&quot; password=&quot;.$this-&gt;password)
                          break;
      break;
   }
   if (!$link){
      error_log(0,&#039;Problema de conexión a la base de datos.&#039;);
      exit(&#039;Perdonen las molestias. Tenemos un problema técnico. Esperamos resolverlo en los próximos minutos&#039;);
   }else{
      $this-&gt;link=$link;
   }
}
</pre>
</pre>
<p><a title="Ficheros de ejemplo" href="http://www.marcosdev.com/ejemplos/clase-base-de-datos-iv/archivos.zip">Descargar fichero Db.class.php actualizado (en formato UTF8)</a></p>
<p>Con esto ponemos fin a una pequeña colección de tips. Espero que esto les haya servidor para ir aprendiendo como poder crear y desarrollar una clase, utilizar un patrón de diseño y crear niveles de abastracción.</p>
<p>Temas relacionados:</p>
<p><a title="Crear una clase para conectar a la base de datos" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/">Crear una clase para conectar a la base de datos</a></p>
<p><a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">Crear una clase para conectar a la base de datos (II)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (III)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/">Crear una clase para conectar a la base de datos (III)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iv/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Crear una clase para conectar a la base de datos (III)</title>
		<link>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/</link>
		<comments>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 00:23:20 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[clases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=51</guid>
		<description><![CDATA[Continuemos mejorando nuestra clase. En el último tip, creamos una clase nueva para leer un fichero de configuración. Este fichero contenía los valores que nos interesase para realizar la conexión a la base de datos. Luego estuvimos adaptando el fichero de conexión a la base de datos para que fuera capaz de instanciar el objeto <a href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuemos mejorando nuestra clase. En el <a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">último tip</a>, creamos una clase nueva para leer un fichero de configuración. Este fichero contenía los valores que nos interesase para realizar la conexión a la base de datos. Luego estuvimos adaptando el fichero de conexión a la base de datos para que fuera capaz de instanciar el objeto Conf y pudiera tener acceso a los datos necesarios para realizar la conexión.</p>
<p>En esta siguiente parte del tutorial vamos a realizar una sencilla mejora para hacer que nuestra clase sea capaz de conectarse a diferentes tipos de base de datos. En concreto vamos a ver cómo adaptarla para que se conecte a PostgreSQL.</p>
<p><span id="more-51"></span></p>
<p>Lo primero que debemos realizar es agregar una nueva variable a nuestro fichero de configuración:</p>
<p>config.php</p>
<pre>
<pre class="brush: php">

//Datos de configuración de la conexión a la base de datos

//Servidor
$host=&#039;localhost&#039;;

//Usuario
$user=&#039;user&#039;;

//Password
$password=&#039;test&#039;;

//Base de datos a utilizar
$db=&#039;testDB&#039;;

//Qué sistema gestor de base de datos utilizamos, mysql, oracle, ...
$dbType=&#039;mysql&#039;
</pre>
</pre>
<p>Podemos observar una nueva última variable llamada dbType la cual utilizaremos para saber que tipo de base de datos vamos a utilizar.</p>
<p>Ahora vamos a adaptar nuestra clase Conf para que lea dicho valor y lo guarde ($_dbType). Además agregaremos una función getDBType() para poder obtener dicho valor.</p>
<p>Conf.class.php</p>
<pre>
<pre class="brush: php">
Class Conf{
   private $_domain;
   private $_userdb;
   private $_passdb;
   private $_hostdb;
   private $_db;
   private $_dbType;

   private static $_instance;

   private function __construct(){
      require &#039;config.php&#039;;
      $this-&gt;_domain=$domain;
      $this-&gt;_userdb=$user;
      $this-&gt;_passdb=$password;
      $this-&gt;_hostdb=$host;
      $this-&gt;_db=$db;
      $this-&gt;_dbType=$dbType;
   }

   private function __clone(){ }

   private function __wakeup(){ }

   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   public function getUserDB(){
      $var=$this-&gt;_userdb;
      return $var;
   }

   public function getHostDB(){
      $var=$this-&gt;_hostdb;
      return $var;
   }

   public function getPassDB(){
      $var=$this-&gt;_passdb;
      return $var;
   }

   public function getDB(){
      $var=$this-&gt;_db;
      return $var;
   }

   public function getDBType(){
	  $var=$this-&gt;_dbType;
	  return $var;
   }

}
</pre>
</pre>
<p>Por último los cambios más significativos vienen dentro de nuestra clase Db. Dentro de las funciones de conectar, ejecutar una query y obtener una fila de resultados es dónde podemos ver cómo en función del  valor tipo de base de datos, la clase utiliza unas funciones u otras.</p>
<p>Db.class.php</p>
<pre>
<pre class="brush: php">

/* Clase encargada de gestionar las conexiones a la base de datos */
Class Db{

   private $servidor;
   private $usuario;
   private $password;
   private $base_datos;
   private $tipo;
   private $link;
   private $stmt;
   private $array;

   private static $_instance;

   /*La función construct es privada para evitar que el objeto pueda ser creado mediante new*/
   private function __construct(){
      $this-&gt;setConexion();
      $this-&gt;conectar();
   }

   /*Método para establecer los parámetros de la conexión*/
   private function setConexion(){
      $conf = Conf::getInstance();
      $this-&gt;servidor=$conf-&gt;getHostDB();
      $this-&gt;base_datos=$conf-&gt;getDB();
      $this-&gt;usuario=$conf-&gt;getUserDB();
      $this-&gt;password=$conf-&gt;getPassDB();
      $this-&gt;tipo=$conf-&gt;getDBType();
   }

   /*Evitamos el clonaje del objeto. Patrón Singleton*/
   private function __clone(){ }

   private function __wakeup(){ }

   /*Función encargada de crear, si es necesario, el objeto. Esta es la función que debemos llamar desde fuera de la clase para instanciar el objeto, y así, poder utilizar sus métodos*/
   public static function getInstance(){
      if (!(self::$_instance instanceof self)){
         self::$_instance=new self();
      }
      return self::$_instance;
   }

   /*Realiza la conexión a la base de datos.*/
   private function conectar(){
      switch ($this-&gt;tipo){
         case &#039;mysql&#039;:     $this-&gt;link=mysql_connect($this-&gt;servidor, $this-&gt;usuario, $this-&gt;password);
	                   mysql_select_db($this-&gt;base_datos,$this-&gt;link);
	                   @mysql_query(&quot;SET NAMES &#039;utf8&#039;&quot;);
			   break;

       case &#039;postgress&#039;:   $this-&gt;link=pg_connect(&quot;host=&quot;.$this-&gt;servidor.&quot; dbname=&quot;.$this-&gt;base_datos.&quot; user=&quot;.$this-&gt;usuario.&quot; password=&quot;.$this-&gt;password)
		           break;
       break;
      }
   }

   /*Método para ejecutar una sentencia sql*/
   public function ejecutar($sql){
      switch ($this-&gt;tipo){
         case &#039;mysql&#039;:     $this-&gt;stmt=mysql_query($sql,$this-&gt;link);
			   break;
         case &#039;postgress&#039;: $this-&gt;stmt=pg_Euery($this-&gt;link,$sql);
			   break;
         break;
      }
      return $this-&gt;stmt;
   }

   /*Método para obtener una fila de resultados de la sentencia sql*/
   public function obtener_fila($stmt,$fila){
      switch ($this-&gt;tipo){
         case &#039;mysql&#039;:     if ($fila==0){
	                      $this-&gt;array=mysql_fetch_array($stmt);
	                   }else{
	                      mysql_data_seek($stmt,$fila);
	                      $this-&gt;array=mysql_fetch_array($stmt);
	                   }
	                   break;
         case &#039;postgress&#039;: if ($fila==0){
			      $this-&gt;array=pg_fetch_row($stmt);
			   }else{
			      $this-&gt;array=pg_fetch_row($stmt,$fila);
			   }
			   break;
          break;
      }
      return $this-&gt;array;
   }

}
</pre>
</pre>
<p>En el siguiente y última parte, veremos cómo controlar los errores.</p>
<p>Un saludo</p>
<p><a title="Ficheros de ejemplo" href="http://www.marcosdev.com/ejemplos/clase-base-de-datos-iii/archivos.zip">Ficheros del ejemplo (en formato UTF-8)</a></p>
<p>Temas relacionados:</p>
<p><a title="Crear una clase para conectar a la base de datos" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos/">Crear una clase para conectar a la base de datos</a></p>
<p><a title="Crear una clase para conectar a la base de datos (II)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-ii/">Crear una clase para conectar a la base de datos (II)</a></p>
<p><a title="Crear una clase para conectar a la base de datos (IV)" href="http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iV/">Crear una clase para conectar a la base de datos (IV)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/crear-una-clase-para-conectar-a-la-base-de-datos-iii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

