<?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>Blog -  El TallerWeb &#187; igormx</title>
	<atom:link href="http://blog.eltallerweb.com/author/igormx/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.eltallerweb.com</link>
	<description>Blog para apasionados al diseño y desarrollo Web</description>
	<lastBuildDate>Tue, 16 Jun 2015 20:26:30 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Usar stored procedures desde Zend Framework 2</title>
		<link>http://blog.eltallerweb.com/usar-stored-procedures-desde-zend-framework-2/</link>
		<comments>http://blog.eltallerweb.com/usar-stored-procedures-desde-zend-framework-2/#comments</comments>
		<pubDate>Mon, 18 May 2015 22:06:47 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Zend Framework 2]]></category>
		<category><![CDATA[base de datos]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=809</guid>
		<description><![CDATA[En esta ocasión veremos cómo usar stored procedures desde Zend Framework 2, en realidad, ejecutar o llamar un stored procedure no es muy diferente de ejecutar cualquier otra consulta. Pero veamos un ejemplo para ver ]]></description>
				<content:encoded><![CDATA[<p><!-- P { margin-bottom: 0.08in; } --><span style="font-family: DejaVu Sans,sans-serif;">En esta ocasión veremos cómo usar stored procedures desde Zend Framework 2, en realidad, ejecutar o llamar un stored procedure no es muy diferente de ejecutar cualquier otra consulta. Pero veamos un ejemplo para ver esto más claramente.</span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">Partamos de una tabla en MySQL con el siguiente contenido:</span></p>
<p><span style="font-family: FreeMono,monospace;">+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+ </span></p>
<p><span style="font-family: FreeMono,monospace;">| cvepedido | total | usuario | status | </span></p>
<p><span style="font-family: FreeMono,monospace;">+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+ </span></p>
<p><span style="font-family: FreeMono,monospace;">| 1 | 82.65 | 4 | abierta | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 2 | 11.60 | 7 | abierta | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 3 | 76.56 | 10 | cerrada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 4 | 50.23 | 7 | cerrada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 5 | 65.43 | 4 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 6 | 91.03 | 5 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 7 | 40.69 | 8 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 8 | 53.92 | 5 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 9 | 58.28 | 6 | abierta | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 10 | 21.96 | 4 | enviada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 11 | 92.72 | 7 | enviada | </span></p>
<p><span style="font-family: FreeMono,monospace;">+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+ </span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">De esta tabla lo más importante para nuestro ejemplo serám las columna total y status, pues las usaremos en el siguiente stored procedure:</span></p>
<p><span style="font-family: FreeMono,monospace;">CREATE PROCEDURE promedioStatus(IN estado varchar(20),OUT promedio float(10,2)) </span></p>
<p><span style="font-family: FreeMono,monospace;">BEGIN </span></p>
<p><span style="font-family: FreeMono,monospace;">select AVG(total) into promedio from pedidos where status=estado; </span></p>
<p><span style="font-family: FreeMono,monospace;">END</span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">Este procedimiento, es simple, recibe 2 parámetros uno de entrada y otro de salida, el de entrada es el status que se usará para calcular el promedio del total de los pedidos, promedio que será almacenada en el parametro de entrada “promedio”.</span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">Ahora entramos al Zend Framework 2 usaremos un patrón Table Module con el componente Zend\Db de Zend Framework 2. Lo primero sería colocar la configuración de BD y el adaptador.</span></p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
return array(

'db' =&gt; array(

'driver' =&gt; 'pdo_mysql',

'host' =&gt; 'localhost',

'username' =&gt; 'xxxx',

'password' =&gt; 'xxxxxxxx',

'dbname' =&gt; 'xxxxxx'

),

'service_manager' =&gt; array(

'factories' =&gt; array(

'DbAdapter' =&gt; 'Zend\Db\Adapter\AdapterServiceFactory'

)

)

);

</pre>
<p><span style="font-family: DejaVu Sans,sans-serif;">Ahora hay que crear la clase para la Tabla</span></p>
<pre class="brush: php; title: ; notranslate">

&lt;?php

namespace Application\Model;

use Zend\Db\TableGateway\TableGateway;

use Zend\Db\Adapter\Adapter;

class PedidosTable

{

/**
*
* @var TableGateway
*/

protected $tableGateway;

public function __construct(Adapter $adapter)

{

$this-&gt;tableGateway=new TableGateway('pedidos', $adapter);

}

}

</pre>
<p align="LEFT"><span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Aquí en el constructor recibimos el adaptador de BD y creamos el Objeto TableGateway que estará dentro de una propiedad, desde el podremos llamar cualquier operación de BD y la idea es envolver esas operaciónes, querys y llamadas a store procedures dentro de métodos que describan esas operaciones en terminos de funcionalidad de clase y no funcionalidad de tabla, es decir que digan, insertar, actualizar, borrar, sino, obtener, cambiar, quitar.</span></span></span></p>
<p align="LEFT"><span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Así creamos el siguiente método que ejecuta nuestro stored procedure:</span></span></span></p>
<pre class="brush: php; title: ; notranslate">

public function obtenerPromedio($status)

{

$sql=&quot;CALL promedioStatus('{$status}',@res)&quot;;

$statement = $this-&gt;tableGateway-&gt;getAdapter()-&gt;createStatement($sql);

$statement-&gt;execute();

$query = $this-&gt;tableGateway-&gt;getAdapter()-&gt;query(&quot;select @res as resultado&quot;);

$fila=$query-&gt;execute();

$resultado=$fila-&gt;current();

return $resultado['resultado'];

}

</pre>
<p align="LEFT"> <span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Dentro de este módulo tomamos el adaptador y creamos una sentencia que llame nuestro store procedure y lo ejecutamos, el resultado se almacenará en la variable @res, luego simplemente hay que hacer un query que seleccione esa variable y hacer un fetch de ese resultado.</span></span></span></p>
<p align="LEFT"> <span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Lo que seguiría sería crear un servicio de esta clase para poder invocarla desde cualquier lugar donde tangamos acceso desde cualquier lugar en el que exista </span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/usar-stored-procedures-desde-zend-framework-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El componente Zend\Cache en ZF2</title>
		<link>http://blog.eltallerweb.com/el-componente-zendcache-en-zf2/</link>
		<comments>http://blog.eltallerweb.com/el-componente-zendcache-en-zf2/#comments</comments>
		<pubDate>Wed, 19 Jun 2013 18:33:36 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[caché]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[ZF2]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=738</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx El componente para el manejo de cache en ZF2, Zend\Cache ha sido completamente reescrito, ahora hace uso de muchísimas interfaces, plugins y clases abstractas. Sin embargo, al igual que su predecesor ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p dir="ltr">El componente para el manejo de cache en ZF2, Zend\Cache ha sido completamente reescrito, ahora hace uso de muchísimas interfaces,<em> plugin</em>s y clases abstractas. Sin embargo, al igual que su predecesor en ZF1, Zend\Cache sigue contando con soporte para gran número de medios de almacenaje para el caché; por ejemplo Xcache, Memcache, Redis, sistema de archivos, etc.</p>
<p><span style="font-size: 1.5em;">¿Cómo guarda la información Zend\Cache?</span></p>
<p>Principalmente a través de los<em> Adapters</em>, estos son quienes se conectan al medio de almacenaje correspondiente, servicio, base de datos, sistema de archivos, etc; su funcionalidad está descrita por algunas interfaces del componente.</p>
<p>Hay algunas clases llamadas <em>capabilities</em>, que indican capacidades de comportamiento del almacenaje. También existen clases <em>Plugins</em> que añaden funcionalidad al adaptador, normalmente cuentan con<em> listeners</em> que escuchan <em>triggers</em> de los adaptadores y tienen que ver más con el tratamiento de los datos o acciones adicionales a las tomadas por los adaptadores.</p>
<p><span style="font-size: 1.5em;">¿Qué tipo de información puede guardar Zend\Cache?</span></p>
<p>Zend\Cache tiene una serie de clases Patrón, que describen desde donde se puede guardar la información en caché. Por ejemplo CallbackCache, nos sirve para guardar en caché una respuesta de una función <em>callback</em>, OutputCache nos sirve para guardar un <em>output</em> generado por un <em>script</em>.</p>
<p><span style="font-size: 1.5em;">Un ejemplo</span></p>
<p>$cacheSalida = Zend\Cache\PatternFactory::factory(&#8216;output&#8217;, array(</p>
<p dir="ltr">   &#8216;storage&#8217; =&gt; &#8216;memcache&#8217;,<br />
));</p>
<p>$cacheSalida-&gt;start(&#8216;idCacheSalida&#8217;);<br />
echo “Esto se va a guardar en el cache”;</p>
<p dir="ltr">printf(“Esto también”);<br />
$cacheSalida-&gt;end();</p>
<p>En el ejemplo anterior, se usa el PatternFactory para “fabricar” un objeto OutputCache que use el adaptador Memcache, ya teniendo toda la salida desde el <em>start</em> hasta el <em>end</em> será guardada por el adaptador en<em> memcache</em> con el identificadir idCacheSalida.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/el-componente-zendcache-en-zf2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uso de los comandos Mongodump y Mongorestore</title>
		<link>http://blog.eltallerweb.com/uso-de-los-comandos-mongodump-y-mongorestore/</link>
		<comments>http://blog.eltallerweb.com/uso-de-los-comandos-mongodump-y-mongorestore/#comments</comments>
		<pubDate>Thu, 16 May 2013 15:17:28 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[datos]]></category>
		<category><![CDATA[mongo db]]></category>
		<category><![CDATA[mongod]]></category>
		<category><![CDATA[mongodump]]></category>
		<category><![CDATA[mongorestore]]></category>
		<category><![CDATA[mongos]]></category>
		<category><![CDATA[recuperar]]></category>
		<category><![CDATA[restauracion]]></category>
		<category><![CDATA[restore]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=712</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Si queremos hacer  un  respaldo de nuestros datos en Mongo DB tenemos varias opciones, una es utilizar las utilerías Mongodump y Mongorestore. Ambas utilerías están disponibles junto con cualquier instalación de ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p dir="ltr">Si queremos hacer  un  respaldo de nuestros datos en Mongo DB tenemos varias opciones, una es utilizar las utilerías Mongodump y Mongorestore. Ambas utilerías están disponibles junto con cualquier instalación de Mongo DB.</p>
<p>Con mongodump podemos hacer un <em>backup</em> de nuestros datos, ya sea conectándonos a un servidor Mongo DB (Mongod o Mongos) y extraer esos datos como un cliente común o accediendo directamente a los archivos de datos en el sistema de archivos. Entonces, tenemos las opciones &#8211;host y &#8211;port para especificar el servidor y puerto a conectarnos y desde luego, podemos especificar una base de datos y una colección particular que deseamos respaldar con &#8211;db (-d) y &#8211;collection (-c). Lo que obtendremos serán los archivos BSON (Binary JSON) que contienen los datos. Ejemplo:</p>
<p dir="ltr">mongodump -d dbETW -c myCollection</p>
<p dir="ltr">Muy bien, ya tenemos nuestros datos en BSON, ahora ¿Qué hacemos si queremos restaurarlos?</p>
<p dir="ltr">Pues allí es dónde entra Mongorestore, que su trabajo principal es tomar los archivos BSON,  se contecta a algún servidor Mongo DB (Mongod o Mongos) y guardar los datos. También puede guardar los datos localmente a través del sistema de archivos, las opciones del comando son muy parecidas a las de mongodump, es decir, podemos especificar hosts, puertos, bases de datos, colecciones y demás. Ejemplo:</p>
<p>mongorestore &#8211;host 127.51.12.1 &#8211;port 3017 /backup/mongodump-2013-01-01</p>
<p>Por último hay que tomar en cuenta si nuestros servidores requieren autenticación, tenemos que especificar usuario y contraseña al conectarnos con estas utilerías tanto al respaldar como al restaurar.</p>
<p>¿Ya has realizados respaldos o restauraciones con alguna de estas herramientas? Cuentános tu experiencia.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/uso-de-los-comandos-mongodump-y-mongorestore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Qué es PECL?</title>
		<link>http://blog.eltallerweb.com/que-es-pecl/</link>
		<comments>http://blog.eltallerweb.com/que-es-pecl/#comments</comments>
		<pubDate>Tue, 16 Apr 2013 23:09:39 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[extensión]]></category>
		<category><![CDATA[extensiones]]></category>
		<category><![CDATA[pclp]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=648</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx PECL es un repositorio de extensiones PHP, de hecho PECL quiere decir PHP Extension Community Library,  es  decir es un lugar donde están las extensiones PHP más comunes y que más ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>PECL es un repositorio de extensiones PHP, de hecho PECL quiere decir PHP Extension Community Library,  es  decir es un lugar donde están las extensiones PHP más comunes y que más son usadas por la comunidad.</p>
<p>Comparte el mismo sistema de empaquetado que su hermana PEAR, sólo que tiene una diferencia grande y fundamental, lo que se guarda en PECL son extensiones PHP, es decir código C que se compila para que  funcione como librería PHP, añadiendo funcionalidad al lenguaje.</p>
<p>Así muchas extensiones comunitarias, antes de llegar a la distribución “normal” de PHP, primero se vuelven conocidas y populares en PECL. Entonces, una extensión escrita por cualquiera necesita cumplir con los requerimientos de PECL, cubrir ciertas necesidades o carencias, documentarla y demás.</p>
<p>Actualmente las 5 extensiones más populares en PECL son:</p>
<p>1      APC</p>
<p>2      memcache</p>
<p>3      imagick</p>
<p>4      timezonedb</p>
<p>5      mongo</p>
<p><strong>¿Cómo instalar una extensión con PECL?</strong></p>
<p>Para instalar una extensión con PECL, solo hay que usar el comando:   pecl install memcache</p>
<p>Esto hará que se descargue el código fuente de la extensión desde el repositorio, se phpizará, se compilará para generar  un archivo .so, que puede ser cargado con la función dl() o añadiendo extension=memcache.so al php.ini.</p>
<p>Con esto ya tendremos funcionando la extensión en nuestro PHP y podremos utilizar su funcionalidad.</p>
<p>Espero que esto les sea de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/que-es-pecl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Quién es Zend?</title>
		<link>http://blog.eltallerweb.com/quien-es-zend/</link>
		<comments>http://blog.eltallerweb.com/quien-es-zend/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 23:48:43 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[historia]]></category>
		<category><![CDATA[lenguaje]]></category>
		<category><![CDATA[programa]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[programador]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=634</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Muchos PHPeros no saben quién o qué es Zend. Otros quizá solo lo relacionan con el Zend Framework o con alguno de sus productos.  Un poco de historia Corría el año de ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<h2><span style="font-size: 13px;">Muchos PHPeros no saben quién o qué es </span><a style="font-size: 13px;" href="http://zend.com/">Zend</a><span style="font-size: 13px;">. Otros quizá solo lo relacionan con el </span><a style="font-size: 13px;" href="http://zendframework.com/">Zend Framework</a> <span style="font-size: 13px;">o con alguno de sus productos. </span></h2>
<div>
<p><strong>Un poco de historia</strong></p>
<p>Corría el año de 1997, la internet como la conocemos hoy no existía y PHP también era un desconocido, de hecho no era PHP sino PHP/FI, Rasmus Lerdorf lo había creado hacía un tiempo (de hecho casi lo hizo en solitario desde el 95 al 97), pero era algo limitado y su nicho era pequeño.</p>
<p>Unos estudiantes del Technion de Israel, Andi Gutmans y Zeev Suraski, tenían un proyecto en una de sus clases de crear un carrito de compras, la mayoría de sus compañeros decidieron usar Perl, ellos decidieron usar PHP/FI. Pero se toparón con muchos problemas en la herramienta elegida, la mayoría de ellos errores en el parseador.</p>
<p>Decidieron avisar a Rasmus y éste les respondió que eran libres de proponer parches, por lo que decidieron crear un verdadero motor para el lenguaje el cual funcionó muy bien, tanto que Rasmus decidió sustituir su versión por la versión de Gutmans y Suraski (nada de egos super inflados eh) y así nació PHP 3.</p>
<p>PHP 3 se volvió muy popular, el “boom” histórico de PHP . Gutmans y Suraski fundaron Zend, volviéndose un ícono del mundo PHP.</p>
<p><strong>El PHP Empresarial</strong></p>
<p>No se asusten, esto es lo que hacemos todos los días, el PHP empresarial es el PHP que se orienta hacia los negocios, es el desarrollo que le implementas a la tienda de &#8220;don Pedrito&#8221; hasta el gran sistema que le codificas a la empresa multinacional.</p>
<p>Zend intentá cubrir todo este espectro, así que apoya con contribuiciones a proyectos<em> Open Source</em>, patrocinando otros proyectos gratuitos y además de proveer de productos para aquellos que cuentan con aplicaciones de misión crítica. Además, Zend tiene servicios como consultoría, soporte y entrenamiento, siendo esta última área el origen de la certificación en PHP.</p>
<p>Reconozcámoslo, muchas veces podemos hacer la caja nosotros solos, pero a veces necesitaremos la caja ya hecha.</p>
<p><strong>Zend y la Comunidad</strong><br />
Entre los aportes de Zend a la comunidad estan:</p>
<ul>
<li><strong>Zend Engine</strong>: El corazón de PHP, sobre esto corren todas tus aplicaciones</li>
<li><strong>Zend Optimizer+</strong>: Un acelerador de código PHP</li>
<li><strong>Zend Framework</strong>: Un framework MVC robusto y flexible</li>
<li><strong>Eclipse PDT: </strong>Un IDE para la edición PHP en el ambiente Eclipse</li>
<li><strong>Zend Server (versión gratuita)</strong>: La versión gratuita, de un stack PHP para tus deploys</li>
<li><strong>Zend Developer Zone</strong>: Centro de reunión de desarrolladores PHP del mundo entero</li>
</ul>
<p><strong>Productos Zend</strong><br />
Algunos de los productos de Zend son:</p>
<ul>
<li><strong>Zend Studio</strong>: IDE PHP basado en Eclipse, con funciones extras para intervenir mejor en el ciclo de una aplicación</li>
<li><strong>Zend Server</strong>: Stack PHP con  monitoreo y mejoras en perferomance</li>
<li><strong>Zend Guard</strong>: Encripta tu código PHP</li>
</ul>
<p><strong>En Latinoámerica</strong><br />
Si quieren más info sobre Zend o sus productos, pónganse  en contacto con <a href="http://www.eltallerweb.com/">El Taller Web</a>.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/quien-es-zend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los Servicios en Zend Framework 2</title>
		<link>http://blog.eltallerweb.com/los-servicios-en-zend-framework-2/</link>
		<comments>http://blog.eltallerweb.com/los-servicios-en-zend-framework-2/#comments</comments>
		<pubDate>Sat, 16 Mar 2013 01:07:01 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=611</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Zend Framework 2 trae consigo una serie de cambios de arquitectura en comparación con Zend Framework 1, lo que en ZF1 era Singletons, en ZF2 son Eventos; lo que en ZF1 ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>Zend Framework 2 trae consigo una serie de cambios de arquitectura en comparación con Zend Framework 1, lo que en ZF1 era Singletons, en ZF2 son Eventos; lo que en ZF1 es una estructura MVC rígida en ZF2 tenemos los Módulos.</p>
<p>Estos cambios también han impactado la forma en al que se maneja las librerías que antes sólo eran cargadas o registradas por <em>autoloaders</em> y llamadas en cualquier momento, sin tomar en cuenta requerimientos de instanciación,configuración y más.  Ahora en ZF2 tenemos servicios.</p>
<p><strong>¿Qué es un servicio?</strong></p>
<p>Son básicamente librerías, objetos o piezas de funcionalidad que cumple con un propósito concreto como enviar e-mails, loggers,  comunicación con bases de datos o servicios concretos. Una de las características que los diferencía es que un servicio debe tener en cuenta la reutilización que un servicio, tanto que podríamos usarla en cualquier proyecto sea ZF2 o no.</p>
<p>La necesidad de crear un servicio se hace patente cuando esa funcionalidad no se puede colocar ni en el modelo ni en el controlador, es decir, no tiene que ver con el proceso MVC de la aplicación.</p>
<p><strong>Estructura básica de un servicio</strong></p>
<p>El servicio básicamente tiene 2 carpetas:</p>
<p><em>Library  </em>que contiene la estructura de directorios  con las clases que contienen nuestra funcionalidad, hay que tomar en cuenta que los <em>namespaces</em> de las clases tienen que coincidir con la estructura de directorios a la cual pertenecen.</p>
<p><em>Tests</em> que contiene los <em>test</em> unitarios (buena práctica) del código funcional, la estructura de directorios y clases en <em>tests</em> debe ser un espejo de lo que hay en <em>library</em>. Además, debe tener un archivo phpunit.xml.dist quien contiene configuraciones para el PHPUnit, un archivo de arranque Bootstrap.php o bootstrap.php que es llamado por PHPUnit para establecer condiciones iniciales de los <em>tests</em>, y por último un archivo para el <em>autoloading</em>, que puede usarse el mecanismo de autoloading de ZF2 u otras herramientas de generación de lo mismo como <em>phpab</em>.</p>
<p><strong>Archivos adicionales del servicio</strong></p>
<p>Si el servicio se va a compartir en Github, se pueden añadir archivos como README, LICENSE,etc.</p>
<p>Si nuestro servicio requiere dependencias puede usarse composer para estleber tales dependencias de una manera más sencilla</p>
<p><strong>Estándares de codificación</strong></p>
<p>Nuestro servicio debe usar estándares de codificación adecuados, el de ZF2 es el siguiente: <a href="http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards">http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards</a>.</p>
<p><strong>Documentación</strong></p>
<p>Tenemos que generar documentación adecuada de nuestro servicio, se recomienda ampliamente la generación de la misma a partir de los comentarios en el código con docBlocks y phpDocumentor.</p>
<p><strong>Reutilización y publicación de nuestro servicio</strong></p>
<p>Podemos publicar nuestro servicio en los siguientes sitios</p>
<p><a href="http://packages.zendframework.com/">http://packages.zendframework.com</a></p>
<p><a href="https://packagist.org/">https://packagist.org</a></p>
<p><a href="http://github.com/">http://github.com</a></p>
<p>Si alguien instala nuestro servicio usando <em>composer</em>, este será colocado en la carpeta vendor y tendrá que ser cargado y usado a través del Service Manager.</p>
<p>Espero que esta guía les sea útil.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/los-servicios-en-zend-framework-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¡Nueva versión de Zend Studio!</title>
		<link>http://blog.eltallerweb.com/nueva-version-de-zend-studio/</link>
		<comments>http://blog.eltallerweb.com/nueva-version-de-zend-studio/#comments</comments>
		<pubDate>Fri, 15 Feb 2013 14:57:36 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[lanzamiento]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[programadores]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[zend studio 10]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=572</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Hace apenas unos días, Zend anunció el lanzamiento de la última versión de su IDE, Zend Studio 10. Esta nueva versión nos ofrece las ya conocidas características de versiones anteriores que ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>Hace apenas unos días, Zend anunció el lanzamiento de la última versión de su IDE, Zend Studio 10.</p>
<p>Esta nueva versión nos ofrece las ya conocidas características de versiones anteriores que nos ayudan a maximizar la productividad, como el PHPUnit, Debugging, perfilado de aplicaciones y Control de versiones(incluyendo Git).</p>
<p>Pero son las nuevas características de esta versión que llaman rápidamente nuestra atención, por ejemplo la posibilidad de crear aplicaciones móviles conectadas a la nube. Así es , desde Zend Studio 10, podemos crear los dos aspectos de una aplicación móvil, el lado cliente generado a partir de HTML y jQuery, y el lado del servidor con <em>web services RESTful</em> creados con PHP y componentes de Zend Framework 2 con la posibilidad de hospedar esto en la nube.</p>
<p>Y ya que hablamos de desarrollar usando la nube, Zend Studio nos da la posibilidad de desplegar nuestro código en “nubes”, que cuentan con <em>stacks</em> de PHP certificados y otras componentes como bases de datos que nos evitan la necesidad de tener que preparar ambientes de desarrollo en máquinas locales u otros servidores, en concreto se trata de la Zend Developer Cloud y la de Red Hat, la OpenShift, ambas gratuitas y abiertas.</p>
<p>Todo esto suena excelente, aunque debo confesar que para un servidor, la característica más atrayente es por mucho la integración del IDE con Zend Framework 2. Y es que el Zend Studio 10 te auxilia muchísimo en el desarrollo de aplicaciones ZF2. Por ejemplo, la creación inicial de la aplicación nos deja ya una estructura muy completa desde la cual podemos empezar a poner nuestro código; además nos ayuda en la creación de módulos, controladores, vistas y otros items del framework. Por si esto fuera poco, cuenta con un localizador de servicios ZF2 con integración a <em>composer</em>, sin mencionar la auto-completación de clases, métodos y <em>namespaces</em> que hace que el desarrollo en ZF2 sea mucho más sencillo.</p>
<p>¿Ya conoces el producto? Cuéntanos que te parecio.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/nueva-version-de-zend-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Qué es PHPUnit?</title>
		<link>http://blog.eltallerweb.com/que-es-phpunit/</link>
		<comments>http://blog.eltallerweb.com/que-es-phpunit/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 21:18:44 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=516</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx PHPUnit es un framework open source para el desarrollo, orientado a pruebas ó TDD para culquier código PHP. Es decir, es un framework que nos ayuda a probar nuestro código. Ahora, ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>PHPUnit es un <em>framework open source</em> para el desarrollo, orientado a pruebas ó TDD para culquier código PHP. Es decir, es un framework que nos ayuda a probar nuestro código.</p>
<p>Ahora, ¿Por qué probar nuestro código? Bueno, Sebastian Bergmann creador de PHPUnit, dice algo muy cierto, <em>&#8220;todos los programadores cometen errores, pero la diferencia entre los buenos programadores y los malos programadores es que los buenos programadores prueban su código para encontrar esos errores lo más pronto posible</em>&#8220;. Y es que esperar a que el software falle por sí mismo para después corregirlo es muy costoso, lento y dificíl de corregir.</p>
<p>La propuesta de PHPUnit y otros frameworks para pruebas es crear pequeñas unidades que revisen funcionalidades puntuales del código y probar que funcionen como debe, además de la posibilidad de automatizar estas pruebas para ejecutarlas frecuentemente, tanto como el código cambie.</p>
<p>Así, para probar el código no es suficiente recargar el navegador como loco, hay que definir la funcionalidad del mismo, separarla en unidades y revisar que cada una funcione como se supone.</p>
<p>La vía típica para instalar PHPUnit es a través de PEAR, aunque también algunos IDEs como Zend Studio ya lo traen integrado. Una vez instalado hay que crear los tests, que no es otra cosa que métodos clases en PHP, y ejecutarlos por línea de comando o desde nuestro IDE; así obtendremos un resultado para cada test. Para que una prueba sea exitosa, todos los tests unitarios deben pasar y obtener un alto porcentaje en la cobertura de código.</p>
<p>Crear tests unitarios puede complicarse si nuestro código no es testeable, es decir, no se presta mucho para hacerle pruebas, saber si un código es testeable o no, crear pruebas más efectivas es algo que sólo con la práctica lograremos.</p>
<p>Espero esto les sea de utilidad.<br />
Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/que-es-phpunit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>El nuevo sistema de Módulos de Zend Framework 2</title>
		<link>http://blog.eltallerweb.com/el-nuevo-sistema-de-modulos-de-zend-framework-2/</link>
		<comments>http://blog.eltallerweb.com/el-nuevo-sistema-de-modulos-de-zend-framework-2/#comments</comments>
		<pubDate>Fri, 28 Dec 2012 19:56:06 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[módiulos]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework 2]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=457</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx En Zend Framework 2 se introduce un nuevo sistema de manejo de módulos. Si bien ZF1 ya contaba con un sistema modular, éste tenía algunas limitantes como poca flexibilidad, soporte limitado ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>En Zend Framework 2 se introduce un nuevo sistema de manejo de módulos. Si bien ZF1 ya contaba con un sistema modular, éste tenía algunas limitantes como poca flexibilidad, soporte limitado para su reutilización y distribución.</p>
<p>Los módulos en ZF2 son flexibles porque, no tienen que forzosamente estar atados al MVC, pueden contentener sólo servicios,<em> plugins,</em> librerías como <em>Doctrine</em> o controladores, todo eso y más, es decir, no debe de tener un solo uso.</p>
<p>En cuanto a la reutilización y distribución los módulos en ZF2 es extremadamente sencilla, por ejemplo, con el simple hecho de copiar nuestro módulo a otro proyecto y activarlo en el archivo de configuración del mismo ya será tomado en cuenta. Esto permite a los desarrolladores crear módulos comunes y aplicarlos en varios proyectos. Aquí también entra la distribución que puede ser hecha manualmente o a través de Composer, Packagist, GitHub, Pyrus o <a href="http://modules.zendframework.com/">http://modules.zendframework.com/.</a> También puedes usar modulos que otros programadores o empresas ofrecen.</p>
<p>Los módulos deben de tener un nombre de directorio válido (este nombre también será el <em>namespace</em>), un archivo Module.php y una clase Module dentro de él. Al estar registrado en la configuración el Module Manager de ZF2 buscará la clase y ejecutará los eventos registrados primero de inicialización y si es necesario de ejecución. Entre estos eventos tenemos el ServiceListener,OnBoostrapListener y otros.</p>
<p>Espero que esta introducción les sea útil. Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/el-nuevo-sistema-de-modulos-de-zend-framework-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detectando código PHP duplicado con phpcpd</title>
		<link>http://blog.eltallerweb.com/detectando-codigo-php-duplicado-con-phpcpd/</link>
		<comments>http://blog.eltallerweb.com/detectando-codigo-php-duplicado-con-phpcpd/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 23:45:27 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[phpcpd]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=428</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Muchas veces, se dice que al codificar se debe reutilizar código, esto es cierto,  pero no quiere decir que necesariamente se tenga que hacer “copy-paste” de ese código. El duplicar o ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>Muchas veces, se dice que al codificar se debe reutilizar código, esto es cierto,  pero no quiere decir que necesariamente se tenga que hacer “copy-paste” de ese código. El duplicar o clonar código dentro de un proyecto,  incrementa la dificultad para mantener el mismo aumentando los tiempos y costos.</p>
<p>Sí, al principio es muy simple y rápido hacer “copy-paste” de algunas o muchas líneas de código, pero si luego se detecta un error o se quiere hacer mejoras, la dificultad para lograrlo se multiplicará por el número de veces que se duplicó ese código en el proyecto. Lo ideal para reutilizar código es crear librerías de funciones o clases que sean sencillas y especializadas, de manera que mantenerlas resulte práctico y fácil.</p>
<p>Una herramienta que nos ayuda a detectar código PHP duplicado es <strong>phpcpd</strong> <strong>(Copy/Paste Detector (CPD) for PHP code)</strong> , la cuál fue creada por Sebastian Bergmann, el mismo de <strong>PHPUnit</strong> , y al igual que phploc se instala desde <strong>PEAR</strong>.</p>
<h2>Instalación</h2>
<p>Si no has usado el canal PEAR phpunit.de primero debes “descubrirlo”:</p>
<p>pear channel-discover pear.phpunit.de</p>
<p>pear channel-discover components.ez.no</p>
<p>Y ahora sí podemos instalar el phpcpd</p>
<p>pear install phpunit/phpcpd</p>
<h2>Corriendo una prueba</h2>
<p>/usr/local/zend/bin/phpcpd sigmabol/</p>
<p>phpcpd 1.3.2 by Sebastian Bergmann.</p>
<p>Found 8 exact clones with 550 duplicated lines in 8 files:</p>
<p>&#8211; application/controllers/MatrizinternaController.php:8-163</p>
<p>application/controllers/MatrizController.php:7-162</p>
<p>&nbsp;</p>
<p>&#8211; application/controllers/MatrizinternaController.php:186-240</p>
<p>application/controllers/MatrizController.php:179-233</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Pdf.php:285-292</p>
<p>library/Bvb/Grid/Deploy/Pdf.php:436-443</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Print.php:111-120</p>
<p>library/Bvb/Grid/Deploy/Wordx.php:381-390</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Wordx.php:79-234</p>
<p>library/Bvb/Grid/Deploy/Odt.php:79-234</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Print.php:111-120</p>
<p>library/Bvb/Grid/Deploy/Odt.php:352-361</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Wordx.php:79-233</p>
<p>library/Bvb/Grid/Deploy/Ods.php:79-233</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Print.php:111-118</p>
<p>library/Bvb/Grid/Deploy/Word.php:111-118</p>
<p>&nbsp;</p>
<p>3.64% duplicated lines out of 15116 total lines of code.</p>
<p>Time: 1 second, Memory: 22.25Mb</p>
<p>Al correr el comando nos da una salida con los archivos que tienen líneas de código duplicadas, además un porcentaje de líneas duplicadas respecto al total de líneas del proyecto, el tiempo y memoria que tomó hacer la prueba.</p>
<h2>Conclusiones</h2>
<p>Esta herramienta nos de una buena idea de la forma en la que reutilizamos nuestro código, lo ideal sería que el 0% de nuestro código esté repetido, por supuesto algunas veces esto no será posible y duplicaremos algo de código, pero es bueno mantener esos porcentajes por niveles bajos.</p>
<p>Eso nos ayuda a fomentar buenas prácticas como la creación de librerías comunes y clases extendibles( léase con la facilidad para ser extendidas por clases hijas).</p>
<p>Además phpcpd y las otras herramientas similares pueden ser integradas con servidores de <em>Continuous Integration</em> como Jenkins y phpUnderControl, lo que nos da una visión completa del QA (Quality assurance) en nuestros proyectos PHP.</p>
<p>Saludos.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/detectando-codigo-php-duplicado-con-phpcpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
