<?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>Init Developers &#187; Español</title>
	<atom:link href="http://blog.theinit.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.theinit.com</link>
	<description>Coding and blogging</description>
	<lastBuildDate>Tue, 05 Feb 2013 09:31:37 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Cómo construir una aplicación con Symfony2 [1/X]</title>
		<link>http://blog.theinit.com/2013/01/31/como-construir-una-aplicacion-con-symfony2-1x/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-construir-una-aplicacion-con-symfony2-1x</link>
		<comments>http://blog.theinit.com/2013/01/31/como-construir-una-aplicacion-con-symfony2-1x/#comments</comments>
		<pubDate>Thu, 31 Jan 2013 08:00:07 +0000</pubDate>
		<dc:creator>Igomez</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1440</guid>
		<description><![CDATA[Aprovechando el desarrollo de un nuevo proyecto, se me presenta la oportunidad de escribir una serie de posts sobre cómo construir una aplicación con Symfony, pero, algunos diréis, ¿qué es Symfony?. Bien, Symfony es un framework de PHP para el&#8230;]]></description>
			<content:encoded><![CDATA[<p>Aprovechando el desarrollo de un nuevo proyecto, se me presenta la oportunidad de escribir una serie de posts sobre cómo construir una aplicación con Symfony, pero, algunos diréis, ¿qué es <a title="Symfony" href="http://symfony.com/symfony-at-a-glance" target="_blank">Symfony</a>?.</p>
<p>Bien, Symfony es un framework de PHP para el desarrollo de aplicaciones web, creado por <a title="SensioLabs" href="http://sensiolabs.com/en" target="_blank">SensioLabs</a>. Cómo cualquier framework que se precie, se basa en el patrón <a title="MVC" href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">MVC</a>, pero además, nos permite flexibilidad en cuánto a qué tecnologías utilizar para ello.</p>
<p>En nuestro caso emplearemos <a title="Twig" href="http://twig.sensiolabs.org/" target="_blank">Twig</a> para las vistas, <a title="Doctrine" href="http://es.wikipedia.org/wiki/Doctrine_%28PHP%29" target="_blank">Doctrine</a> para el modelo, y el propio Symfony cómo framework sobre PHP para el controlador.(La versión empleada de Symfony será la 2+ , de modo que el tutorial puede no ser compatible con Symfony 1.5 e inferiores&#8230;)</p>
<h1><span style="color: #ffcc00;">Instalando Symfony</span></h1>
<p>El primer paso será acceder a la web de Symfony y <a title="descargar Symfony" href="http://symfony.com/download" target="_blank">descargar</a> el .zip con los fuentes, en nuestro caso elegiremos la siguiente versión:</p>
<p><a href="http://symfony.com/download?v=Symfony_Standard_Vendors_2.1.4.zip">http://symfony.com/download?v=Symfony_Standard_Vendors_2.1.4.zip</a></p>
<p>Una vez descargado, extraemos su contenido en el raíz de nuestra aplicación.</p>
<p>Una vez hecho esto, si accedemos a través del navegador a la siguiente URL:</p>
<p><strong>http://localhost/nuestraAplicacion/web/app_dev.php</strong></p>
<p>Podremos ver la página de bienvenida de Symfony que nos indica que el proyecto está montado correctamente.</p>
<div id="attachment_1450" class="wp-caption aligncenter" style="width: 594px"><a href="http://blog.theinit.com/wp-content/uploads/2012/12/11.jpg"><img class="size-large wp-image-1450" title="Symfony instalado correctamente" src="http://blog.theinit.com/wp-content/uploads/2012/12/11-1024x729.jpg" alt="Symfony instalado correctamente" width="584" height="415" /></a>
<p class="wp-caption-text">Symfony instalado correctamente</p>
</div>
<p>Una vez hecho esto y para asegurarnos de que nuestra instalación de PHP es adecuada para Symfony, podemos acceder a la siguiente URL:</p>
<p><strong>http://localhost/nuestraAplicacion/web/config.php</strong></p>
<div id="attachment_1454" class="wp-caption aligncenter" style="width: 594px"><a href="http://blog.theinit.com/wp-content/uploads/2012/12/2.jpg"><img class="size-large wp-image-1454" title="Puntos a corregir en la instalación de PHP" src="http://blog.theinit.com/wp-content/uploads/2012/12/2-1024x719.jpg" alt="Puntos a corregir en la instalación de PHP" width="584" height="410" /></a>
<p class="wp-caption-text">Puntos a corregir en la instalación de PHP</p>
</div>
<p>y corregir los puntos que indique, en caso de indicar algo.</p>
<p>Una vez hecho ésto, podemos acceder al entorno de desarrollo y ver la única URL accesible de momento.</p>
<p><strong>http://localhost/nuestraAplicacion/web/app_dev.php/demo/hello/igomez</strong></p>
<div id="attachment_1455" class="wp-caption aligncenter" style="width: 594px"><a href="http://blog.theinit.com/wp-content/uploads/2012/12/3.jpg"><img class=" wp-image-1455 " title="Ejemplo action con parámetro de un controller que devuelve un render de una vista" src="http://blog.theinit.com/wp-content/uploads/2012/12/3-1024x728.jpg" alt="Ejemplo action con parámetro de un controller que devuelve un render de una vista" width="584" height="415" /></a>
<p class="wp-caption-text">Ejemplo action con parámetro de un controller que devuelve un render de una vista</p>
</div>
<h1><span style="color: #ffcc00;">Creando nuestro bundle</span></h1>
<p>Una vez tenemos Symfony instalado correctamente, es hora de comenzar con nuestra aplicación. Para ello, lo primero que vamos a hacer es crear los diferentes bundles en que ésta va a dividirse.</p>
<p>Un bundle es una forma de empaquetar diferentes apartados de nuestra aplicación.</p>
<p>En nuestro caso crearemos 2, uno para el frontend de la aplicación y otro para el backoffice, ya que son dos ámbitos diferenciados e independientes de nuestra aplicación.</p>
<p>Lo haremos a través de los comandos que pone a nuestra disposición Symfony, mediante línea de comando.(Debemos tener PHP configurado para ejecutar tareas por este medio)</p>
<pre class="brush: bash; title: ; notranslate">php app/console generate:bundle --namespace=watchKeeper/frontEndBundle --format=yml

bundle namespace:[watchKeeper/frontEndBundle]
bundle name: [ffrontEndBundle]

Target directory [C:/Users/igomez/Desktop/Mowes/www/watchKeeper/watchKeeper/sr
c]:

Determine the format to use for the generated configuration.

Configuration format (yml, xml, php, or annotation) [yml]:

To help you get started faster, the command can generate some
code snippets for you.

Do you want to generate the whole directory structure [no]?

You are going to generate a &quot;watchKeeper\frontEndBundle\frontEndBundle&quot; bundle
in &quot;C:/Users/igomez/Desktop/Mowes/www/watchKeeper/watchKeeper/src/&quot; using the
&quot;yml&quot; format.

Do you confirm generation [yes]? yes

  Bundle generation

Generating the bundle code: OK
Checking that the bundle is autoloaded: OK
Confirm automatic update of your Kernel [yes]? yes

Enabling the bundle inside the Kernel: OK
Confirm automatic update of the Routing [yes]? yes
Importing the bundle routing resource: OK

  You can now start using the generated code!

c:\Users\igomez\Desktop\Mowes\www\watchKeeper\watchKeeper
</pre>
<p>Ésto creará la estructura completa de nuestros bundles, dentro del directorio src de nuestro proyecto.</p>
<p>En nuestro caso las rutas generadas serán:</p>
<p><strong>src/watchKeeper/frontEndBundle</strong></p>
<p><strong>src/watchKeeper/backOfficeBundle</strong></p>
<p>La estructura básica del bundle contiene algunos directorios esenciales con los que estructurar nuestra aplicación.</p>
<p><strong>Controller-&gt;</strong> dónde guardaremos nuestros controllers, que serán los paquetes encargados de contener nuestros actions y funciones.</p>
<p><strong>Resources/config-&gt;</strong> aquí se encuentra el routing.yml que contiene las rutas(URLs) de nuestro proyecto</p>
<p><strong>Resources/public-&gt;</strong> aquí alojaremos los css,js, imágenes y demás recursos específicos de nuestro bundle.</p>
<p><strong>Resources/translations-&gt;</strong>directorio para los ficheros de textos en diferentes idiomas (messages.es.xliff, messages.en.xlf&#8230;)</p>
<p><strong>Resources/views-&gt;</strong>aquí guardaremos las plantillas .twig de nuestro bundle, que se corresponderán a las diferentes pantallas.</p>
<p>De momento tenemos Symfony funcionando y hemos creado los bundles de nuestra aplicación.<br />
Lo siguiente que deberemos hacer será crear los controllers, y views de nuestro proyecto y configurar nuestro routing con las URLs que queramos para nuestras pantallas. Lo veremos, en el siguiente post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2013/01/31/como-construir-una-aplicacion-con-symfony2-1x/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Haciendo funcionar el Opencms Web Optimization Module con opencms 8</title>
		<link>http://blog.theinit.com/2012/10/15/haciendo-funcionar-el-opencms-web-optimization-module-con-opencms-8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=haciendo-funcionar-el-opencms-web-optimization-module-con-opencms-8</link>
		<comments>http://blog.theinit.com/2012/10/15/haciendo-funcionar-el-opencms-web-optimization-module-con-opencms-8/#comments</comments>
		<pubDate>Mon, 15 Oct 2012 08:06:17 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[opencms]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1404</guid>
		<description><![CDATA[OpenCMS es un sistema CMS (Gestión de Contenidos) muy potente y flexible. Desde mi punto de vista, es un CMS de verdad, un verdadero framework para trabajar la gestión de contenidos: permite definir formatos de contenidos (noticias, post, elementos destacados,&#8230;]]></description>
			<content:encoded><![CDATA[<p><a title="OpenCMS" href="http://www.opencms.org">OpenCMS</a> es un sistema CMS (Gestión de Contenidos) muy potente y flexible. Desde mi punto de vista, es un CMS de verdad, un verdadero framework para trabajar la gestión de contenidos: permite definir formatos de contenidos (noticias, post, elementos destacados, banners, etc; todo tipo de contenidos), para que los usuarios administren esos contenidos y los destaquen en las distintas páginas.&nbsp;Muchas veces un CMS se confunde con un gestor de contenidos empresarial; o cualquier sistema que permita &#8220;gestionar&#8221; un contenido y publicarlo en la web. Pero eso es otra historia que da para otro post&#8230;.</p>
<p><span id="more-1404"></span></p>
<p>Lo que hoy venimos a destacar aquí es que una de las muchas ventajas del OpenCMS es que permite el uso de módulos. Sinceramente, desde mi humilde punto de vista, la comunidad open source externa a la empresa que promueve el opencms (Alkacon) es pequeña, lo que hace el número de módulos del opencms no sea muy grande. Y eso hace que los módulos realmente necesarios sean promovidos por la propia Alkacon.</p>
<p>La consecuencia de ésto es que Alkacon está muy centrada en el desarrollo de su producto; producto que ya va por la octava versión y media; lo cual hace del OpenCMS un producto <strong>especialmente estable y funcional</strong>. Sin embargo, no así ocurre con los módulos que liberan, y que de vez en cuando tienen pequeñas sorpresas.</p>
<p>Uno en concreto es el módulo de Optimización Web. Para nosotros fue una sorpresa encontrarlo entre los módulos OAMP (opencms Add On Module Package): un &nbsp;módulo que permite comprimir CSS e imágenes (con el <a title="YUI compressor" href="http://developer.yahoo.com/yui/compressor/" target="_blank">YUI compressor</a>, como el archiconocido<a title="minify PHP" href="http://code.google.com/p/minify/" target="_blank">&nbsp;minify en php</a>). Este módulo se puede encontrar en la sección de módulos opensource realizados por Alkacon: <a href="http://www.opencms.org/en/download/alkacon_modules.html">http://www.opencms.org/en/download/alkacon_modules.html</a>&nbsp;</p>
<p>El funcionamiento es sencillo: permite crear un elemento estructurado &#8220;optimized-js&#8221; (idem para css), en el que se definen en su interior N elementos js que se quieren unir y optimizar. Al hacer la inclusión de este elemento &#8220;optimized-js&#8221;, automáticamente &#8220;pega y minifica&#8221; los N elementos en su interior. Muy útil para comprimir JS y CSS.</p>
<p>El problema sin embargo es que al instalarlo en una versión OpenCMS 8.0.4 recién instalada, el elemento JS no funcionaba, y provocaba el siguiente error: &#8220;Not supported resource  type 282 of given resource  /sites/default/&#8230;.&#8221;.&nbsp;</p>
<p>Curiosamente, lo mismo ocurre con los elementos de ejemplo que el propio módulo trae consigo.</p>
<h2>&nbsp;¿Existe solución?</h2>
<p>Afortunadamente, sí, y es sencilla: el problema viene derivado por el mal uso de una constante en el módulo. Aunque no es necesario, si nos descargamos del GitHub, la versión del OAMP actual, veremos que la clase &nbsp;CmsOptimizationJs tiene una variable estática RESOURCE_TYPE_JS de valor igual a 762; es decir, que el módulo debería importar el objeto &#8220;optimized-js&#8221; con un ID igual a 762. Sin embargo, si al importar el módulo abrimos el opencms-modules.xml, y buscamos el &#8220;optimized-js&#8221;, veremos que su ID es 282.</p>
<p>Por lo tanto, la solución es sencilla: se debe editar el opencms-modules.xml una vez importado el paquete, cambiar el ID 282 por 762, guardar y reiniciar el servidor de aplicaciones. OJO: lo mismo ocurre con los CSS y los sprite, por lo que se deben cambiar los ID 282, 283 y 284, por 762, 763 y 764 respectivamente.</p>
<p>Una vez realizado esto, todo debería funcionar. Es importante destacar que si ya tienes elementos definidos, el sistema no los reconocerá. Puedes (a) eliminarlos y volver a crearlos, o (b) Cambiar el tipo en las opciones avanzadas del menú contextual al seleccionar el objeto.</p>
<p>Si has llegado aquí buscando el error, esperamos haber solucionado vuestro problema.</p>
<p>Por cierto, hay una comunidad de habla hispana en torno al opencms llamada OpenCMS hispano: <a href="http://www.opencmshispano.com/">http://www.opencmshispano.com</a></p>
<p><a href="http://www.opencmshispano.com/"></a>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/10/15/haciendo-funcionar-el-opencms-web-optimization-module-con-opencms-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gorm Derived Properties. ¡Aquí y ahora!</title>
		<link>http://blog.theinit.com/2012/08/22/gorm-derived-properties-%c2%a1aqui-y-ahora/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gorm-derived-properties-%25c2%25a1aqui-y-ahora</link>
		<comments>http://blog.theinit.com/2012/08/22/gorm-derived-properties-%c2%a1aqui-y-ahora/#comments</comments>
		<pubDate>Wed, 22 Aug 2012 10:00:09 +0000</pubDate>
		<dc:creator>afernandez</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Formulas]]></category>
		<category><![CDATA[GORM]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1358</guid>
		<description><![CDATA[En ocasiones nos encontramos con la necesidad de tener que calcular valores para mostrar en una pantalla, en nuestro caso una gsp. El mayor problema reside en responder a ¿realizo el cálculo correspondiente a cada elemento del objeto en el&#8230;]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.theinit.com/wp-content/uploads/2012/05/grails.png"><img src="http://blog.theinit.com/wp-content/uploads/2012/05/grails-150x150.png" alt="Gorm" title="Gorm" width="150" height="150" class="aligncenter size-thumbnail wp-image-1392" /></a><br />
En ocasiones nos encontramos con la necesidad de tener que calcular valores para mostrar en una pantalla, en nuestro caso una gsp. El mayor problema reside en responder a ¿realizo el cálculo correspondiente a cada elemento del objeto en el controller o lo calculo en la misma Gsp (Grails Server Page)?</p>
<p>Si vienes de trabajar con Hibernate, sabrás que podemos usar las formulas para calcular al vuelo aquello que nosotros queramos. En nuestro caso, estas formulas las encontraremos en la documentación de Gorm bajo el nombre de Derived Properties.</p>
<p>Pongamos un ejemplo sencillo:</p>
<p><code lang="java">class Rectangulo{<br />
    String nombre<br />
    Float base<br />
    Float altura<br />
    Float superficie<br />
}<br />
</code></p>
<p>Lo primero será declarar los campos en nuestro domain. Nosotros para el ejemplo hemos usado Base, Altura y Superficie, siendo esta última variable donde guardaremos el resultado de la formula.</p>
<blockquote><p>¡Pero yo no quiero que persista en BBDD!  -Tranquilo, los campos que definimos como resultados de formulas no persisten en base de datos</p></blockquote>
<p>Lo próximo que haremos será añadir al &#8220;Mapeo&#8221; la formula que queramos.</p>
<p><code lang="java"><br />
class Rectangulo{<br />
    String nombre<br />
    Float base<br />
    Float altura<br />
    Float superficie</p>
<p>    static constraints = {<br />
        //...<br />
    }</p>
<p>    static mapping = {<br />
        superficie formula: 'BASE * ALTURA'<br />
    }<br />
}<br />
</code></p>
<p>De esta manera cada vez que hagamos la consulta a la BBDD para obtener el o los objetos Rectangulo, este nos devolverá todos los campos y la superficie calculada.</p>
<blockquote><p>¡Pero mis campos no se llaman así!  -Tienes razón, las fórmulas pertenecen al modelo de datos que estamos usando y no tienen nada que ver con nuestros objetos, tendremos que usar los nombres que tienen en BBDD</p></blockquote>
<p><code lang="java"><br />
// Objeto Rect1 tiene una altura de 5 y una base de 10<br />
def rect1 = Rectangulo.findByNombre(Rectangulo.RECT1)<br />
def superficie = rect1.superficie</p>
<p>println(superficie) //Pinta 50<br />
</code></p>
<p>Realizando una sentencia como la siguiente<br />
<code lang="sql"><br />
select<br />
    rectangulo0_.id as id1_0_,<br />
    rectangulo0_.nombre as nombre1_0_,<br />
    rectangulo0_.version as version1_0_,<br />
    rectangulo0_.base as base1_0_,<br />
    rectangulo0_.altura as altura4_1_0_,<br />
    rectangulo0_.BASE * rectangulo0_.ALTURA as formula1_0_<br />
from<br />
    rectangulo rectangulo0_<br />
where<br />
    rectangulo0_.name=?<br />
</code></p>
<p>Pese a no persistir en base de datos, Grails nos da además la oportunidad de realizar búsquedas sobre ese campo mediante los &#8220;Dynamic Finders&#8221;, de este modo podríamos realizar la siguiente consulta<br />
<code lang="java"><br />
Rectangulo.findAllWhereSuperficieGreaterThan(valor)<br />
</code></p>
<p>La complejidad de las formulas puede aumentar en base a nuestras necesidades, así que anímate a usarlas que son muy útiles para realizar cálculos sin obstaculizar el flujo de tu web.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/08/22/gorm-derived-properties-%c2%a1aqui-y-ahora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo crear un módulo de Prestashop (3/X)</title>
		<link>http://blog.theinit.com/2012/08/16/como-crear-un-modulo-de-prestashop-3x/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-crear-un-modulo-de-prestashop-3x</link>
		<comments>http://blog.theinit.com/2012/08/16/como-crear-un-modulo-de-prestashop-3x/#comments</comments>
		<pubDate>Thu, 16 Aug 2012 12:43:43 +0000</pubDate>
		<dc:creator>Igomez</dc:creator>
				<category><![CDATA[Destacados]]></category>
		<category><![CDATA[E-Commerce]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[modulo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prestashop]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=250</guid>
		<description><![CDATA[En los posts anteriores vimos cómo crear nuestro módulo de Prestashop(parte 1) y hacer que el backOffice lo liste(parte 2), lo instale y se muestre en el frontOffice. Pero, a parte de eso, nuestro módulo no hacía nada, por lo&#8230;]]></description>
			<content:encoded><![CDATA[<p>En los posts anteriores vimos cómo crear nuestro módulo de Prestashop(<a title="como-crear-modulo-prestashop-1" href="http://blog.theinit.com/2011/03/25/como-crear-un-modulo-de-prestashop-1x/" target="_blank">parte 1</a>) y hacer que el backOffice lo liste(<a title="crear-modulo-prestashop-2" href="http://blog.theinit.com/2011/04/13/como-crear-un-modulo-de-prestashop-2x/" target="_blank">parte 2</a>), lo instale y se muestre en el frontOffice. Pero, a parte de eso, nuestro módulo no hacía nada, por lo que vamos a ver cómo hacer que muestre datos en el frontOffice y cómo configurar desde el backOffice algunos parámetros.</p>
<h1><span style="color: #ffcc00;">Consultar datos para mostrar en el frontOffice</span></h1>
<p>Cualquier módulo que créemos tendrá que mostrar cierta información en pantalla, o tener alguna clase de funcionalidad. En nuestro caso, al haber creado un bloque, queremos que éste muestre información sobre las ofertas especiales de nuestra tienda, para ello, vamos a modificar nuestro método &#8221; function hookLeftColumn($params)&#8221; qué es el encargado de mostrar nuestro bloque en la columna izquierda.<br />
(Efectivamente ésta funcionalidad ya la ofrece el blockSpecials, pero para nuestro ejemplo básico no vamos a complicarnos demasiado)</p>
<p>Cómo ya hemos visto anteriormente, la lógica de negocio se ejecuta desde la capa de controlador, por lo que és ahí dónde deberemos realizar las consultas oportunas para recuperar la información deseada, ésto es, en nuestro fichero &#8220;testmodule.php&#8221;.</p>
<pre class="brush: php; title: ; notranslate">
function hookLeftColumn($params){
		global $smarty;

		if ($special = Product::getRandomSpecial(intval($params['cookie']-&gt;id_lang)))
			$smarty-&gt;assign(array(
			'special' =&gt; $special,
			'priceWithoutReduction_tax_excl' =&gt; Tools::ps_round($special['price_without_reduction'] / (1 + $special['rate'] / 100), 2),
			'oldPrice' =&gt; $special['price'] + $special['reduction'],
			'mediumSize' =&gt; Image::getSize('medium')));

		return $this-&gt;display(__FILE__, 'testModule.tpl');
	}
</pre>
<p>Primero, definimos una variable global $smarty, que será un array dónde almacenaremos cualquier información que queramos que esté disponible desde las .tpl (Vista).</p>
<p>Después crearemos una variable $special para almacenar los resultados de nuestra consulta, y para ello utilizaremos la función getRandomSpecial de la clase Product&nbsp;que nos ofrece Prestashop.<br />
(Para conocer más funciones disponibles, basta con entrar al directorio classes en el directorio raíz de prestashop e inspeccionar la clase deseada)</p>
<p>Una vez recuperada la información pasaremos a hacerla disponible para la capa de Vista, asignando a la variable global $smarty un índice llamado &#8220;special&#8221; que contendrá un array con los resultados de la consulta a bbdd.</p>
<p>Hecho ésto continuamos con la presentación de la plantilla .tpl</p>
<h1><span style="color: #ffcc00;">Recorrer los datos y mostrarlos en el frontOffice</span></h1>
<p>Para recorrer los datos en nuestro bloque del frontOffice deberemos recuperar la información del array global $smarty.</p>
<pre class="brush: php; title: ; notranslate">
&lt;!-- Block testModule --&gt;
&lt;!-- @import url({$base_dir}modules/testModule/css/testModule.css); --&gt;
&lt;div id=&quot;testModule_block_left&quot; class=&quot;block&quot;&gt;
&lt;h4&gt;{l s='testModule Block' mod='testModule'}&lt;/h4&gt;
&lt;div class=&quot;block_content&quot;&gt;
{if $special}
&lt;ul class=&quot;products&quot;&gt;
	&lt;li class=&quot;product_image&quot;&gt;
				&lt;a href=&quot;{$special.link}&quot;&gt;&lt;img title=&quot;{$special.name|escape:html:'UTF-8'}&quot; src=&quot;{$link-&gt;getImageLink($special.link_rewrite, $special.id_image, 'medium')}&quot; alt=&quot;{$special.legend|escape:html:'UTF-8'}&quot; width=&quot;{$mediumSize.width}&quot; height=&quot;{$mediumSize.height}&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
&lt;h5&gt;&lt;a title=&quot;{$special.name|escape:html:'UTF-8'}&quot; href=&quot;{$special.link}&quot;&gt;{$special.name|escape:html:'UTF-8'}&lt;/a&gt;&lt;/h5&gt;
				&lt;span class=&quot;price-discount&quot;&gt;{if !$priceDisplay}{displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$priceWithoutReduction_tax_excl}{/if}&lt;/span&gt;
				{if $special.reduction_percent}&lt;span class=&quot;reduction&quot;&gt;(-{$special.reduction_percent}%)&lt;/span&gt;{/if}
				&lt;span class=&quot;price&quot;&gt;{if !$priceDisplay}{displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc}{/if}&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
			&lt;a class=&quot;button_large&quot; title=&quot;{l s='All specials' mod='testModule'}&quot; href=&quot;{$base_dir}prices-drop.php&quot;&gt;{l s='All specials' mod='testModule'}&lt;/a&gt;

{else}

{l s='No specials at this time' mod='testModule'}

{/if}&lt;/div&gt;
&lt;/div&gt;
&lt;!-- /Block testModule --&gt;
</pre>
<p>Cómo podéis apreciar, para utilizar propiedades de un objeto en una plantilla de Smarty basta con utilizar la siguiente sintáxis:<br />
{$special.link}<br />
dónde $special es el objeto, en éste caso un array asociativo, y link es un campo de ese array.</p>
<div id="attachment_1382" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.theinit.com/wp-content/uploads/2012/08/Sin-título-1.jpg"><img class="size-medium wp-image-1382" title="modulo-prestashop-finalizado" src="http://blog.theinit.com/wp-content/uploads/2012/08/Sin-título-1-300x174.jpg" alt="modulo-prestashop-finalizado" width="300" height="174" /></a>
<p class="wp-caption-text">Módulo en el frontOffice</p>
</div>
<p>Con ésto, ya seríamos capaces de construir nuestro propio módulo para mostrar cierta información. A partir de aquí, tan sólo nos quedaría investigar un poco los fuentes de prestashop para ver hasta dónde podemos llegar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/08/16/como-crear-un-modulo-de-prestashop-3x/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducción a NO-SQL: Cassandra y CouchDB</title>
		<link>http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduccion-a-no-sql-cassandra-y-couchdb</link>
		<comments>http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 10:11:39 +0000</pubDate>
		<dc:creator>ggaray</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Destacados]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1340</guid>
		<description><![CDATA[Esta semana pasada nos hemos dado un pequeño baño de NO-SQL. Supongo que a estas alturas todo el mundo sabe que el &#8220;NO&#8221; no significa &#8220;no&#8221;, sino &#8220;not-only&#8221;, de manera que esto del NO-SQL en realidad es algo así como&#8230;]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.theinit.com/wp-content/uploads/2012/04/CAP.gif"><img class="alignleft size-medium wp-image-1348" title="CAP" src="http://blog.theinit.com/wp-content/uploads/2012/04/CAP-300x211.gif" alt="" width="300" height="211" /></a>Esta semana pasada nos hemos dado un pequeño baño de NO-SQL. Supongo que a estas alturas todo el mundo sabe que el &#8220;NO&#8221; no significa &#8220;no&#8221;, sino &#8220;not-only&#8221;, de manera que esto del NO-SQL en realidad es algo así como &#8220;esas cosas que siempre quisiste hacer con SQL y nunca te atreviste a configurar&#8221;&#8230;</p>
<p>Sin una idea preconcebida más allá de lo indicado, nos fuimos a que nos hablaran de <a href="http://cassandra.apache.org/" target="_blank">Cassandra</a> y <a href="http://couchdb.apache.org/" target="_blank">CouchDB</a>. Ya hemos tocado a veces algo de <a href="http://www.mongodb.org/" target="_blank">MongoDB</a>, de manera que el tema no podía ser más complementario.</p>
<p>La teoría, básicamente, se centra en otra visión del <a href="http://es.wikipedia.org/wiki/Teorema_CAP" target="_blank">Teorema de CAP</a>, que viene a decir que no puedes tener más de 2 de las 3 gracias que todo sistema computacional distribuido puede aportarte: Consistency, Avalilability, Partition.</p>
<p>Es decir, el SQL de siempre se ha centrado mucho en la C y en la A, dejando la P para sistemas tan grandes que no había probablemente en aquel entonces. Hoy (varios años atrás en realidad), la P empieza a tener más importancia, dadas las ingentes cantidades de datos a procesar de manera suficientemente rápida, en aplicaciones web tales como Facebook o Twitter.</p>
<p>En los casos que nos ocupan, ganamos un mucho de P, penalizando un poco de C, de manera que es habitual que las bases de datos NO-SQL tengan lo que viene a llamarse &#8220;consistencia eventual&#8221;, algo así como &#8220;puede que lo que ves no sea lo que debes ver, pero si te esperas unos milisegundos, entonces seguro que sí&#8221;.</p>
<p>Además, prácticamente todas las NO-SQL tienen un punto en común: son orientadas a documento, y no existen las joins (que consumen demasiado en consultas sobre volúmenes de datos gigantescos).</p>
<p><strong>Cassandra</strong></p>
<p>Originalmente creada por Facebook y donada a Apache como software libre, se trata de una de las más relevantes a nivel mundial, usada por el propio Facebook, Twitter, Digg, entre otros.</p>
<p>Funciona mediante la creación de clusters de bases de datos a partir de nodos que pueden añadirse como nuevas instalaciones en nuevos servidores en cualquier momento. Modificando el fichero &#8220;conf/cassandra.yaml&#8221;, podremos configurar los distintos nodos, indicando, por ejemplo:</p>
<p>- Nombre del Cluster: Si dos nodos tienen el mismo nombre de cluster, son del mismo cluster. Fácil, no?</p>
<p>- Nodos Seed: Nodos especiales que se encargan de la comunicación y propagación de los datos entre todos ellos. Se recomienda que haya al menos 2 por cluster.</p>
<p>- Replication Factor: ¿Cuántas copias de la misma información quieres tener? Algo así como responder a &#8220;a cuántos fallos quieres ser inmune?&#8221;.</p>
<p>Con pocos parámetros más, a funcionar con un &#8220;cassandra -f&#8221; (si queremos ver los logs en foreground), incluso con un sólo nodo <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Una vez levantado el servidor, podremos hacer uso del comando &#8220;cassandra-cli&#8221;, con el que podremos conectarnos a nuestra base de datos y tirar comandos como:</p>
<p>- show keyspaces: lo que sería análogo a un &#8220;show databases&#8221;</p>
<p>Los conceptos de guardado de &#8220;documentos&#8221; en Cassandra son los siguientes:</p>
<p>- keyspace: viene a ser un espacio de datos a nivel de base de datos de sql.</p>
<p>- columnfamily: viene a ser un conjunto de columnas que definen datos de un registro. Viene a ser algo similar a una tabla en sql, por la salvedad de que cada fila (row) puede tener unas columnas u otras. (Imaginad toda una base de datos sql condensada en una super-tabla con todos los campos nullables para poder dar salida a cualquier entidad).</p>
<p>- column: campo de dato de una fila, que se agrupan en columnfamilies. Viene a ser como un campo (field) de una tabla de sql, con la salvedad de que contiene siempre un nombre, un valor, y un timestamp.</p>
<p>- supercolumn: columna especial que permite tener dentro a otras columnas (no se pueden mezclar con columnas en un columnafamiliy, y hay dos niveles a anidamiento).</p>
<p>- Orden: cada columnfamily tiene configurado a priori sobre qué campo se va a poder ordenar</p>
<p>En general, la idea es que primero pienses qué consultas quieres realizar, y en base a ellas generes el modelo de datos como si fueran tablas denormalizadas de sql, y cada tabla responde a &#8220;su&#8221; consulta. Esto se puede hacer con sql, porque eres tú el encargado de mantener un determinado dato si está en varias columns, de manera que, por qué Cassandra? Porque si necesitas más rendimiento, aprovechas la &#8220;P&#8221; y con meter un nuevo nodo de manera muy sencilla lo vas a tener.</p>
<p>Programáticamente, se accede a Cassandra vía <a href="http://thrift.apache.org/" target="_blank">Thrift</a>, una interfaz de comunicación que tiene implementaciones en casi todos los lenguajes. En particular, para Java, tenemos la librería Hector, que nos permite realizar las típicas acciones CRUD, etc&#8230; Se habla de que Avro será la nueva interfaz que entierre a Thrift, ya que parece que no tienen demasiado movimiento como proyecto libre.</p>
<p>Por último, a partir de la versión 0.8, disponemos de <a href="http://www.datastax.com/docs/0.8/dml/using_cql" target="_blank">CQL</a> (Cassandra Query Language) que nos acerca la sintaxis de Casssandra a SQL, que los que usamos HQL no podemos otra cosa que agradecer <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>CouchDB</strong></p>
<p>En la misma situación que Cassandra en cuanto a importancia de la A y la P del Teorema del CAP, CouchDB es una sorprendente implementación de base de datos NO-SQL, por su total orientación web. Desde su gestión a través de documentos JSON, hasta su interfaz RESTful, sorprende el diseño de esta base de datos.</p>
<p>Se instala en nodos, de manera distribuida, y se posibilita el uso offline de los mismos, de manera que si un nodo se cae de la red, puede seguir operando y sincronizarse con el resto cuando esté de nuevo online (esto hace su uso especialmente indicado para plataformas móviles). Para la sincronización de datos, se usa un modelo tipo SVN (<a href="http://en.wikipedia.org/wiki/Multiversion_concurrency_control" target="_blank">MVCC</a>), en el que se van marcando las versiones de los documentos guardados. Ojo a datos muy cambiantes que pueden hacer crecer la base de datos demasiado para nuestros intereses; por suerte, se puede configurar el número de históricos a guardar.</p>
<p>A diferencia de Cassandra, el cliente de CouchDB no es otro que cualquier cosa que implemente el protocolo HTTP, con el siguiente mapeo simple de acciones:</p>
<p>- GET: Es un &#8220;read&#8221; de CRUD.</p>
<p>- POST: Es un &#8220;create&#8221; de CRUD</p>
<p>- PUT: Es un &#8220;update&#8221; de CRUD</p>
<p>- DELETE: Es un &#8220;delete&#8221; de CRUD</p>
<p>Es decir, <a href="http://en.wikipedia.org/wiki/RESTful" target="_blank">RESTful</a>.</p>
<p>Casi cualquier lenguaje de programación tiene implementados estos métodos HTTP, de manera que, por ejemplo, podríamos generar aplicaciones vía AJAX directamente contra la base de datos sin la necesidad de una capa servidora (:-O). De hecho, como CouchDB es un servidor HTTP en sí mismo, es posible &#8220;subir&#8221; aplicaciones html+javascript y hacerlas funcionar directamente en la base de datos.</p>
<p>Otra de las gracias que tiene es que la &#8220;programación&#8221; es vía javascript. Todo.</p>
<p>Es posible generar &#8220;vistas&#8221; (en cierto modo análogas a las de SQL) definiendo un método map que determinará si un documento (las vistas se aplican primero a tooooodos los documentos y luego incremental, como si fueran vistas materializadas de SQL) entra en dicha vista o no. Esto nos permite generar respuestas a consultas que no tienen por qué estar directamente mapeadas en los datos, pero además, si acompañamos a la función map con una función reduce, podemos realizar distintos tipos de agregaciones, desde counts, sums, etc&#8230; hasta lo que se nos ocurra que podamos hacer con una función javascript. Esto nos da muchas posibilidades <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Es posible generar validadores javascript para controlar un determinado valor de un campo obligatorio o cosas así.</p>
<p>Es posible generar show/list que permitirán ver respuestas diferentes a JSON (por ejemplo, HTML, XML, etc&#8230;) de un determinado documento o conjunto de los mismos.</p>
<div class="wp-caption alignleft" style="width: 372px"><img title="NO-SQL, no relations" src="http://lh6.ggpht.com/-PeltmZ9Lmf4/TuBoBLb1vyI/AAAAAAAAA04/pO4nF8xkjIc/The%252520Hard%252520Life%252520Of%252520A%252520NoSQL%252520Coder%252520-%252520Geek%252520Poke.jpg" alt="NO-SQL, no relations" width="362" height="512" />
<p class="wp-caption-text">NO-SQL, no relations</p>
</div>
<p>Es posible generar funciones update que creará o modificará documentos.</p>
<p>&#8230;</p>
<p>Todo esto se puede gestionar vía navegador, o un cliente http cualquier tipo <a href="http://curl.haxx.se/" target="_blank">curl</a>, pero una de las mayores gracias que tiene CouchDB es su &#8220;<a href="http://wiki.apache.org/couchdb/Getting_started_with_Futon" target="_blank">Futón</a>&#8220;, que nos hará la vida más sencilla. Se trata de una interfaz web que nos permitirá gestionar las bases de datos, documentos, vistas y demás elementos de nuestra instancia.</p>
<p>En particular, nos ayudará mucho a gestionar un tipo de documento especial, los documentos &#8220;de diseño&#8221;, que contienen todos los elementos anteriores.</p>
<p>Como la sintaxis de su definición no es simple, y se trata de objetos json no demasiado intuitivos, la guinda del pastel de CouchDB: <a href="http://couchapp.org/page/index" target="_blank">CouchApp</a>.</p>
<p>CouchApp es un framework de creación de aplicaciones que permite generar documentos de diseño de CouchDB de manera mucho más sencilla.</p>
<p>En fin, que a modo de resumen y de primer contacto con estas NO-SQL, espero que os pueda servir para que os hagáis una idea. En general, me parece que la mayor gracia está en las posibilidades de escalabilidad horizontal que nos dan estas bases de datos (la P del CAP), así como su rendimiento, pero a cierto coste computacional en las aplicaciones que generemos sobre ellas.</p>
<p>¿Trabajáis habitualmente con NO-SQL? ¿Tenéis alguna aplicación donde os hubiera gustado usarlas? ¿Os habéis encontrado con problemas de escalabilidad SQL que compense migrarlo todo a una NO-SQL? ¿Pensáis que no todo el monte es orégano y que no es para tanto? ¿Una moda pasajera tal vez?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/04/24/introduccion-a-no-sql-cassandra-y-couchdb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Actualizacion / Upgrading MongoDB a 2.0.3</title>
		<link>http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=actualizacion-upgrading-mongodb-a-2-0-3</link>
		<comments>http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 12:12:32 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1323</guid>
		<description><![CDATA[El día 28 de febrero, MongoDB se actualizó a la versión 2.0.3. Para los usuarios que utilizamos la 2.0.2, los cambios más significativos que nos encontraremos en esta nueva versión son: Arreglo de bugfixes, muchos relacionados con la autenticación. En&#8230;]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.theinit.com/wp-content/uploads/2012/03/bc358_MongoDB.png"><img class="alignleft size-full wp-image-1334" title="bc358_MongoDB" src="http://blog.theinit.com/wp-content/uploads/2012/03/bc358_MongoDB.png" alt="" width="300" height="300" /></a>El día 28 de febrero, MongoDB se actualizó a la versión 2.0.3. Para los usuarios que utilizamos la 2.0.2, los cambios más significativos que nos encontraremos en esta nueva versión son:</p>
<ul>
<li>Arreglo de bugfixes, muchos relacionados con la autenticación. En nuestro caso, no nos habíamos encontrado con ninguno.</li>
<li>Ya se puede utilizar logrotate con windows (¿alguien usa windows con mongodb?)</li>
<li>Mejoras con capped collections y replica.</li>
</ul>
<p>Se puede ver todo el ChangeLog en su JIRA: https://jira.mongodb.org/browse/SERVER/fixforversion/11001</p>
<p>Se puede actualizar sin ningún problema desde la versión 2.0.2 a la versión 2.0.3, utilizando vuestro gestor de actualizaciones favorito.</p>
<p>Se recomienda empezar con los SECONDARY, y luego con los PRIMARY. Por último, actualizad vuestro cliente, y ala, ya tenemos mongo actualizado sin dolores de cabeza.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/03/12/actualizacion-upgrading-mongodb-a-2-0-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando un certificado SSL con el balanceador ELB en Amazon AWS</title>
		<link>http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalar-certificado-ssl-balanceador-elb-en-amazon-aws</link>
		<comments>http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 15:51:04 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1309</guid>
		<description><![CDATA[Una de las funcionalidades que incluye el servicio Amazon es la posibilidad de configurar el certificado SSL directamente en el balanceador ELB, extrayendo de esa &#8220;carga&#8221; al servidor web (apache, por ejemplo). De este modo, el proceso de configuración del&#8230;]]></description>
			<content:encoded><![CDATA[<p>Una de las funcionalidades que incluye el servicio Amazon es la posibilidad de configurar el certificado SSL directamente en el balanceador ELB, extrayendo de esa &#8220;carga&#8221; al servidor web (apache, por ejemplo). De este modo, el proceso de configuración del servidor web se simplifica, y el procesado de SSL lo realiza el ELB. Sin embargo, si has configurado anteriormente SSL en servidores web  Apache o Tomcat, al principio puedes sentirte desorientado, al no saber  qué parámetros de configuración debes introducir. Es por eso que hemos realizado esta guía.<br />
<span id="more-1309"></span></p>
<p>A continuación mostramos una guía paso a paso. Esta guía se ha realizado en Febrero de 2012, y puede que en un futuro el panel haya modificado (por ejemplo, recientemente han incorporado la posibilidad de indicar tu c<a href="http://blog.theinit.com/wp-content/uploads/2012/02/images.jpeg"><img class="alignright size-full wp-image-1312" title="amazon ssl security" src="http://blog.theinit.com/wp-content/uploads/2012/02/images.jpeg" alt="amazon ssl security" width="259" height="195" /></a>ifrado SSL). Allá vamos:</p>
<p>- Primero vas a necesitar el certificado público y la clave privada, para que el ELB lo muestre. El certificado, lógicamente, lo debes pedir a tu suministrador de certificados (verisign, geotrust, rapidssl, etc.). Generalmente te piden el CSR, y con ello, te devuelven el certificado en formato PEM. Eso es lo que necesitas. El único punto a tener en cuenta es que al generar el CSR, debes exportar también la clave privada. Para ello, puedes hacerlo como se indica a continuación:</p>
<p><code lang="bash[notools]">openssl req -nodes -newkey rsa:2048 -keyout claveprivada.key -out midominio.csr<br />
openssl rsa -in ./claveprivada.key -out claveprivada.pem</code></p>
<p>- Como puedes ver, primero se genera el CSR (te pedirá los datos del certificado), y en segundo lugar, se convierte la clave privada a formato PEM (formato necesario para Amazon).</p>
<p>- Haz la petición de tu certificado a tu entidad certificadora.</p>
<p>- En el servicio ELB (dentro de EC2, del panel de Amazon AWS), pulsa sobre &#8220;Crear Nuevo Balanceador&#8221;.</p>
<p>- Configura los listeners. Verás uno configurado inicialmente (http 80 &gt; http 80). Aquí tienes dos opciones:</p>
<ul>
<li>Agregar https (443) &gt; http (80) [ SSL desde cliente a ELB, pero NO SSL desde ELB a servidor ]</li>
<li>Agregar https (443) &gt; http (443) [ SSL total, desde cliente a servidor ]</li>
</ul>
<p>La diferencia está en lo que el servidor web verá, ya que lo que hace el ELB es transformar la petición HTTPS y traspasarla a HTTP (primer caso) o HTTPS (segundo caso). En el primero de los casos, el servidor web pensará que está dando un servicio HTTP (aunque hasta el balanceador llega con SSL), y en el segundo un servicio HTTPS. De ese modo, piensa qué es lo que más te interesa a tí (la segunda opción tendrá como desventaja que el servidor web también tendrá que procesar el desencriptado SSL).</p>
<p>- Pulsa &#8220;save&#8221; y continuar.</p>
<p>- Ahora te pedirá los datos del certificado: la clave privada (el contenido del archivo &#8220;claveprivada.pem&#8221;), el certificado público (lo que te envíe la entidad certificadora) y cualquier certificado intermedio (idem).</p>
<p>- Una vez que los introduces, te pedirá escoger el conjunto de cifrados SSL que deseas proporcionar desde la terminación ELB. En principio, la selección inicial por defecto es suficiente para un buen balance entre el rango más común de navegadores y la seguridad del cifrado. Si aun así, necesitas gestionar más concretamente dichos cifrados, el balanceador lo permite. Aquí puedes obtener más información sobre <a title="Modificación Cifrados SSL en el ELB" href="http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-security-features.html#using-elb-cipher-settings" target="_blank">cómo modificar los cifrados SSL de tu ELB.</a></p>
<p>- Y el resto de parámetros, son los mismos que en un ELB normal.</p>
<p>Esperamos que esta guía te haya servido. A nosotros lo que nos faltó inicialmente fue la conversión de la clave privada al formato PEM que requiere el ELB (sino te indica que &#8220;Private Key not valid&#8221;).</p>
<p>Si tienes dudas, pregunta pregunta <img src='http://blog.theinit.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/02/21/instalar-certificado-ssl-balanceador-elb-en-amazon-aws/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando Gearman y su extensión PHP en CentOS 5</title>
		<link>http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalando-gearman-y-su-extension-php-en-centos-5-2</link>
		<comments>http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 09:14:10 +0000</pubDate>
		<dc:creator>jmarti</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[hilos]]></category>
		<category><![CDATA[tareas paralelas]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1177</guid>
		<description><![CDATA[En un post anterior os comentábamos como instalar Gearman y su extensión PHP en ubuntu, ya que existía un problema de compatibilidades de librerías. En CentOS también ocurre, ya que la versión que hay en EPEL de gearman es la&#8230;]]></description>
			<content:encoded><![CDATA[<p>En un post anterior os <a title="Instalando Gearman y su extensión PHP en Ubuntu" href="http://blog.theinit.com/2011/12/13/instalando-distribuidor-procesos-gearman-php-ubuntu/" target="_blank">comentábamos como instalar Gearman y su extensión PHP en ubuntu</a>, ya que existía un problema de compatibilidades de librerías.</p>
<p>En CentOS también ocurre, ya que la versión que hay en EPEL de gearman   es   la 0.14. Por lo tanto, se recomienda descargar gearman e instalar.</p>
<p>Pero al hacerlo, nos encontraremos con un problema que también nos hemos encontrado con Ubuntu:</p>
<pre>checking Boost headers version >=1.39.0...no
 configure: error: cannot find Boost headers version >=1.39.0</pre>
<p>El problema aquí es que la versión de boost en CentOS 5 es la 1.33, y por tanto, no nos vale para Gearman.</p>
<p>Para resolverlo: </p>
<p>- Añadir el repositorio EPEL si no lo tenemos ya <a href="http://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F" target="_blank">(instrucciones aquí)</a></p>
<p>- Instalar boost141 boost141-devel mediante yum (yum install boost141-devel boost141)</p>
<p>Si ahora intentamos ejecutar &#8220;configure&#8221;; nos dará todavía el mismo    error,  y es que boost141 se instala en otra ruta. Se puede solucionar    gracias  al <a href="http://groups.google.com/group/gearman/browse_thread/thread/fa552d98db87b5cf/2e6205a362f8b773?lnk=gst&amp;q=boost141#2e6205a362f8b773" target="_blank">mail de google-groups localizado aquí. </a></p>
<p>Además de lo indicado, yo tuve que ir a la carpeta /usr/lib/boost141 y copiar todo su contenido a la carpeta /usr/lib para que lo encontrara el configure.</p>
<p>¡ Esperamos que os funcione !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/02/06/instalando-gearman-y-su-extension-php-en-centos-5-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phonegap, turbo desarrollo de aplicaciones móviles.</title>
		<link>http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=phonegap-turbo-desarrollo-de-aplicaciones-moviles</link>
		<comments>http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 15:10:04 +0000</pubDate>
		<dc:creator>afernandez</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[agile mobile application development]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[Phonegap]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1221</guid>
		<description><![CDATA[¿Qué es Phonegap? Sencillo, Phonegap es un framework para desarrollar aplicaciones móviles que es un claro sinónimo de sencillo. Basándose en tecnologías como HTML, CSS, Javascript, JQuery o Sencha Touch entre otras podremos realizar nuestras aplicaciones móviles en muy poco&#8230;]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: justify;">¿Qué es Phonegap?</h2>
<p style="text-align: justify;">Sencillo, Phonegap es un framework para desarrollar aplicaciones móviles que es un claro sinónimo de sencillo. Basándose en tecnologías como HTML, CSS, Javascript, <a href="http://jquerymobile.com/">JQuery</a> o <a href="http://www.sencha.com/products/touch">Sencha Touch</a> entre otras podremos realizar nuestras aplicaciones móviles en muy poco tiempo, todo depende de los conocimientos de programación web de los que dispongas, desde luego la curva de aprendizaje de Javascript o HTML siempre son mucho menos pronunciadas que aprender <a href="http://developer.apple.com/technologies/ios/cocoa-touch.html">Cocoa</a> y <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html">Objetive C</a>.</p>
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_1254" class="wp-caption aligncenter" style="width: 664px;">
<dt class="wp-caption-dt"><a href="http://blog.theinit.com/wp-content/uploads/2012/01/build4.png"><img class="size-full wp-image-1254" title="Phonegap" src="http://blog.theinit.com/wp-content/uploads/2012/01/build4.png" alt="Phonegap" width="654" height="290" /></a></dt>
<dd class="wp-caption-dd">Phonegap</dd>
</dl>
</div>
<h2 style="text-align: justify;">¿Qué hace?</h2>
<p style="text-align: justify;">Este conjunto de herramientas, porta casi cualquier código HTML, CSS, Javascript y demás en código nativo listo para compilar en el SDK. Abstrayendo al programador de aprender código nuevo y/o más complejo, agilizando así el desarrollo y el mantenimiento de las aplicaciones.</p>
<h2 style="text-align: justify;">¿Cómo?</h2>
<p style="text-align: justify;">Phonegap basa todo su potencial en un fichero javascript y una librería que se encargan de hacer el port de un lenguaje a otro. Aparte, dispone de varias API´s para poder interactuar con elementos nativos del dispositivo como la cámara de fotos o vídeo, el acelerómetro, las redes, etc. Si queremos usar los elementos propios de la interfaz gráfica del SO (pj: En iOS los navigation tool bar o los tab bars) también es posible acceder a los mismos mediante la instalación de plugins como NativeControls.</p>
<h2 style="text-align: justify;">¿En qué me beneficia?</h2>
<p style="text-align: justify;">El tiempo de desarrollo es menor, bastante menor. Posiblemente sea más sencillo encontrar un programador web que un programador de iOS o Android. Es más probable disponer de un trabajador en plantilla que pueda desarrollar código HTML, Javascript y JQuery.<br />
Y por último, pero no por ello menos importante, podremos disponer de una web basada en la aplicación móvil sin muchas dificultades o portar un proyecto web a aplicación móvil en tiempo récord.</p>
<h2 style="text-align: justify;">¿Es fácil de usar?</h2>
<p style="text-align: justify;">Sí. Necesitarás bajarte el SDK correspondiente a la plataforma para la que estés desarrollando, yo pondré por ejemplo Android e iOS que son con las que he estado trabajando, así que, Eclipse y XCode 4  respectivamente. En el caso de eclipse podremos descargarnos el siguiente plugin:</p>
<blockquote><p>https://svn.codespot.com/a/eclipselabs.org/mobile-web-development-with-phonegap/tags/r1.2/download</p></blockquote>
<p style="text-align: justify;">Esto nos generará un icono para poder realizar proyectos con phonegap de manera sencilla, dándonos la posibilidad de introducir las librerías de JQuery o Sencha directamente. Por defecto nos dirá para usar una versión que el plugin considera la última para crear el proyecto, si no estamos de acuerdo, siempre podremos introducir el Path de fichero de Phonegap que nosotros queramos.</p>
<p style="text-align: justify;">En el caso del XCode, cuando nos descargamos los archivos de la web de Phonegap, tendremos en la carpeta de iOS un .dmg que nos instalará el plugin directamente en el XCode, con esto cuando creemos nuestra aplicación usaremos la opción &#8220;Phonegap Based Aplication&#8221;.</p>
<p style="text-align: justify;">En ambos casos es necesaria una caperta &#8220;www&#8221; en el proyecto donde meteremos nuestros ficheros .html, .css y .js así como el fichero phonegap-version.js.</p>
<p style="text-align: justify;"><a href="http://www.youtube.com/watch?v=E0UV5i5jY50&amp;#038">Video oficial de Phonegap @ YouTube</a></p>
<h2 style="text-align: justify;">Venga, va&#8230; ¿No serás comercial de Phonegap, no?</h2>
<p style="text-align: justify;">La verdad es que no. Como siempre, no es oro todo lo que reluce y Phonegap tiene sus carencias. En principio no tiene trazas, y hacer debug de una app móvil se puede convertir en un verdadero incordio por mucho &#8220;console.log()&#8221; o &#8220;alert()&#8221; que tengamos en javascript.<br />
Por otro lado Phonegap es rápido, pero código puramente nativo es más rápido aún.</p>
<p style="text-align: justify;">Por último, si nuestro proyecto es de una complejidad muy elevada, deberíamos de plantearnos si usar este framework o no, ya que las API´s se nos podrían quedar algo limitadas, como por ejemplo el uso de la cámara del dispositivo u controles nativos específicos a los cuales no podamos acceder mediante los plugins de terceros.</p>
<h2 style="text-align: justify;">¿Existe alguna alternativa?</h2>
<p style="text-align: justify;">Si nos ponemos un poco frente a Google, encontraremos AppGeiser o Titanum. Yo personalmente me quedo con Phonegap ya que el resultado que nos está dando es muy satisfactorio.<br />
<a href="http://blog.theinit.com/wp-content/uploads/2012/01/titanium_logo.png"><img class="aligncenter size-full wp-image-1268" title="titanium_logo" src="http://blog.theinit.com/wp-content/uploads/2012/01/titanium_logo.png" alt="" width="175" height="148" /></a></p>
<blockquote>
<p style="text-align: center;"><a href="http://www.appcelerator.com/products//">Appcelerator Titanium</a></p>
</blockquote>
<p style="text-align: justify;"><a href="http://blog.theinit.com/wp-content/uploads/2012/01/appsgeyser_log_beta.png"><img class="aligncenter size-full wp-image-1269" title="appsgeyser_log_beta" src="http://blog.theinit.com/wp-content/uploads/2012/01/appsgeyser_log_beta.png" alt="" width="247" height="61" /></a></p>
<blockquote>
<p style="text-align: center;"><a href="http://www.appsgeyser.com/">AppGeyser</a></p>
</blockquote>
<p style="text-align: justify;">¿Conocéis algún otro framework? ¿Habéis trabajado con Phonegap o cualquier otra herramienta de este tipo? Cuéntanos tus experiencias con este tipo de herramientas en los comentarios.</p>
<p style="text-align: justify;">Un saludo!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/01/31/phonegap-turbo-desarrollo-de-aplicaciones-moviles/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AB, duelo al sol con Apache HTTP Server</title>
		<link>http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=apache-benchmark-ab-rendimiento</link>
		<comments>http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 07:50:47 +0000</pubDate>
		<dc:creator>ggaray</dc:creator>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[sistemas]]></category>

		<guid isPermaLink="false">http://blog.theinit.com/?p=1232</guid>
		<description><![CDATA[Siguiendo con las pruebas de rendimiento de los entornos que tenemos entre manos, y una vez que JMeter ya nos ha dado cierta tranquilidad en cuanto a los contenedores de aplicaciones, ahora toca poner a prueba al servidor HTTP Apache,&#8230;]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con las pruebas d<a href="http://blog.theinit.com/wp-content/uploads/2012/01/images.jpeg"><img class="alignleft size-full wp-image-1234" title="images" src="http://blog.theinit.com/wp-content/uploads/2012/01/images.jpeg" alt="" width="257" height="196" /></a>e rendimiento de los entornos que tenemos entre manos, y una vez que <a title="Jmeter: Pruebas de carga en páginas logueadas" href="http://blog.theinit.com/2011/12/28/tutorial-jmeter-login-cookie-variabl/" target="_blank">JMeter ya nos ha dado cierta tranquilidad</a> en cuanto a los contenedores de aplicaciones, ahora toca poner a prueba al servidor HTTP Apache, que estará delante de los primeros (si eso puede ser posible) en la arquitectura de red y por tanto tendrá que soportar todas las peticiones que luego se derivarán a cada contenedor, así como su respuesta.</p>
<p>Para los tests, hemos elegido a &#8220;ab&#8221;, que como ya se tiene directamente en Ubuntu, parecía la opción más &#8220;normal&#8221;.</p>
<p>Si bien es muy sencillo de usar, <a title="AB Apache benchmarking" href="http://httpd.apache.org/docs/2.0/programs/ab.html" target="_blank">os dejo el enlace a su página oficial</a>, donde podéis consultar el detalle de cada opción.</p>
<p>Nosotros hemos tirado la siguiente prueba:</p>
<p>ab -n 10000 -c 1000 <a href="http://vitallogistics.es/">http://vitallogistics.es/</a></p>
<p>Es decir, hemos tirado un total de 10000 peticiones, con 1000 de ellas concurrentes, con un ssh abierto al servidor por lo que pudiera pasar.</p>
<p>Los resultados que nos da ab son los siguientes:</p>
<p><em>This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt;<br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd,       <a href="http://www.zeustech.net/">http://www.zeustech.net/</a><br />
Licensed to The Apache Software Foundation, <a href="http://www.apache.org/">http://www.apache.org/</a><br />
</em><br />
<em> Benchmarking vitallogistics.es (be patient)<br />
Completed 1000 requests<br />
Completed 2000 requests<br />
Completed 3000 requests<br />
Completed 4000 requests<br />
Completed 5000 requests<br />
Completed 6000 requests<br />
Completed 7000 requests<br />
Completed 8000 requests</em><br />
<em> Completed 9000 requests<br />
Completed 10000 requests<br />
Finished 10000 requests</em></p>
<p><em>Server Software:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache/2.2.3<br />
Server Hostname:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vitallogistics.es<br />
Server Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80</em></p>
<p><em>Document Path:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /<br />
Document Length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55 bytes</em></p>
<p><em> </em></p>
<p><em>&nbsp;</em></p>
<p><em>&nbsp;</em></p>
<p><em>Concurrency Level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<br />
Time taken for tests:&nbsp;&nbsp; 73.232 seconds<br />
Complete requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000<br />
Failed requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Write errors:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Non-2xx responses:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em><em>10000<br />
Total transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4890000 bytes<br />
HTML transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 550000 bytes<br />
Requests per second:&nbsp;&nbsp;&nbsp; 136.55 [#/sec] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7323.236 [ms] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.323 [ms] (mean, across all concurrent       requests)<br />
Transfer rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65.21 [Kbytes/sec] received</em></p>
<p><em>Connection Times (ms)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min&nbsp; mean[+/-sd] median&nbsp;&nbsp; max<br />
Connect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24&nbsp; 817 2848.3&nbsp;&nbsp;&nbsp;&nbsp; 51&nbsp;&nbsp; 25652<br />
Processing:&nbsp;&nbsp;&nbsp; 24 1271 3818.2&nbsp;&nbsp;&nbsp;&nbsp; 89&nbsp;&nbsp; 59049<br />
Waiting:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24 1249 3763.0&nbsp;&nbsp;&nbsp;&nbsp; 89&nbsp;&nbsp; 59049<br />
Total:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 53 2088 4879.3&nbsp;&nbsp;&nbsp; 185&nbsp;&nbsp; 62111</em></p>
<p><em> </em></p>
<p><em>&nbsp;</em></p>
<p><em>Percentage of the requests served within a certain time (ms)<br />
&nbsp; 50%&nbsp;&nbsp;&nbsp; 185<br />
&nbsp; 66%&nbsp;&nbsp;&nbsp; 420<br />
&nbsp; 75%&nbsp;&nbsp;&nbsp; 931</em><br />
<em> &nbsp; 80%&nbsp;&nbsp; 3126<br />
&nbsp; 90%&nbsp;&nbsp; 7301<br />
&nbsp; 95%&nbsp; 11156<br />
&nbsp; 98%&nbsp; 14142<br />
&nbsp; 99%&nbsp; 24905<br />
&nbsp;100%&nbsp; 62111 (longest request)</em></p>
<p>Es decir, nos da un buen número de datos generales, como el tiempo totales invertidos en la prueba, el tamaño total descargado, número de errores, tiempos medios de respuesta y velocidad media de la respuesta .</p>
<p>Pero lo interesante, creemos, de interpretar, viene al final.</p>
<p>Podemos ver en qué parte de la petición se está consumiendo qué tiempo. Si es en la conexión y procesamiento de la petición, puede que nuestro equipo sea el cuello de botella (desde donde hacemos las peticiones), pero si el tiempo está en la espera, entonces tenemos un potencial de mejora en la configuración del apache.</p>
<p>Finalmente, podemos ver qué porcentaje de peticiones han sido atendidas en un determinado tiempo. Tiene una interpretación muy interesante. En nuestro caso, por ejemplo, el 75% de las peticiones se respondieron en menos de un segundo, un 95% antes de once segundos (ya es mucho, pero en un escenario de 1000 concurrentes significa que a 950 se les responde antes de 11 segundos) y sólo a un 2% se les responde en más de catorce.</p>
<p>Un ejercicio paralelo interesante mientras se hace la prueba es tirar un &#8220;top&#8221; en el servidor de destino para ver los hilos del apache multiplicarse para atender las peticiones, y ver si el consumo de memoria se acerca al barranco del <a href="http://es.wikipedia.org/wiki/Espacio_de_intercambio" target="_blank">swapping</a>, donde tendremos un descenso acusado del rendimiento (añade RAM para evitarlo), o si estamos llevando al límite a la CPU (añade otra&#8230;).</p>
<p>En fin, que una prueba sencilla, de un par de minutos, puede darnos suficiente información como para dejar tranquilos a los clientes o realizar acciones preventivas antes de llegar a tener caídas de rendimiento significativas sin control.</p>
<p>¿Hacéis pruebas de este tipo habitualmente sobre vuestros entornos de producción o son los departamentos de sistemas de vuestros clientes quienes se encargan? ¿Tenéis algún software de testing similar? ¿Es el rendimiento final algo que se tiene en cuenta en vuestros desarrollos o suele quedar para el mantenimiento / fase 2?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.theinit.com/2012/01/20/apache-benchmark-ab-rendimiento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
