<?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>Pablo Morales&#039;s Blog</title>
	<atom:link href="http://blog.pablo-morales.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pablo-morales.com</link>
	<description>Web developers</description>
	<lastBuildDate>Mon, 29 Apr 2013 00:29:43 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>TDD en PHP con PHPUnit</title>
		<link>http://blog.pablo-morales.com/2013/04/tdd-en-php-con-phpunit/</link>
		<comments>http://blog.pablo-morales.com/2013/04/tdd-en-php-con-phpunit/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 00:29:43 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=891</guid>
		<description><![CDATA[Volviendo un poco a generar videos, la idea es mostrar un poco como crear aplicaciones usando TDD en PHP. Para esto vamos usar PHPUnit, y ningun framework especifico. En el video vamos a ver el siguiente codigo tests/CalculatorTest.php require_once 'src/Calculator.php'; class CalculatorTest extends \PHPUnit_Framework_TestCase { /** * @dataProvider diffProvider */ public function test_Give_2_Real_Numbers_Should_Return_The_Difference_Between_Both($a, $b, $expectedResult) [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2013/04/tdd-en-php-con-phpunit/" data-text="TDD en PHP con PHPUnit" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2013/04/tdd-en-php-con-phpunit/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2013/04/tdd-en-php-con-phpunit/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Volviendo un poco a generar videos, la idea es mostrar un poco como crear aplicaciones usando TDD en PHP. </p>
<p>Para esto vamos usar PHPUnit, y ningun framework especifico.</p>
<p><iframe width="700" height="480" src="http://www.youtube.com/embed/rjYtqjp9_Zs" frameborder="0" allowfullscreen></iframe></p>
<p>En el video vamos a ver el siguiente codigo</p>
<p>tests/CalculatorTest.php</p>
<pre lang="php">

require_once 'src/Calculator.php';

class CalculatorTest extends \PHPUnit_Framework_TestCase
{

    /**
     * @dataProvider diffProvider
     */
    public function test_Give_2_Real_Numbers_Should_Return_The_Difference_Between_Both($a, $b, $expectedResult)
    {

        $calculator = new Calculator();

        $result = $calculator->diff($a, $b);

        $this->assertEquals($expectedResult, $result);

    }

    /**
     * @expectedException InvalidArgumentException
     */
    public function test_Given_A_String_Should_Throw_An_Exception()
    {
        $calculator = new Calculator();

        $calculator->diff(5, 'tres');
    }

    public function diffProvider()
    {
        return [
            [5, 3, 2],
            [10, 5, 5],
            [-5, 5, -10],
            [5, 4, 1],
        ];
    }
}

</pre>
<p>src/Calculator.php</p>
<pre lang="php">


class Calculator
{

    public function diff($numb1, $numb2)
    {
        if (is_string($numb1) || is_string($numb2)) {
            throw new \InvalidArgumentException('Is not a number');
        }
        return $numb1 - $numb2;
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2013/04/tdd-en-php-con-phpunit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ZF2 Clase 1 &#8211; Iniciando un proyecto</title>
		<link>http://blog.pablo-morales.com/2012/08/zf2-clase-1-iniciando-un-proyecto/</link>
		<comments>http://blog.pablo-morales.com/2012/08/zf2-clase-1-iniciando-un-proyecto/#comments</comments>
		<pubDate>Mon, 20 Aug 2012 02:37:57 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[php 5.4]]></category>
		<category><![CDATA[video tutorial zend framework]]></category>
		<category><![CDATA[zend framework 2]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=848</guid>
		<description><![CDATA[Despues de mucho tiempo de hacernos esperar la verison 2 de Zend Framework esta por dar a luz, y si todavia no hay una version estable pero ya estamos por la Release candidate 4 (RC4). Muchos cambios surgieron con esta nueva version, no solo estamos hablando de soportar PHP 5.3/5.4 y todos sus nuevos features, [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2012/08/zf2-clase-1-iniciando-un-proyecto/" data-text="ZF2 Clase 1 - Iniciando un proyecto" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2012/08/zf2-clase-1-iniciando-un-proyecto/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2012/08/zf2-clase-1-iniciando-un-proyecto/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Despues de mucho tiempo de hacernos esperar la verison 2 de Zend Framework esta por dar a luz, y si todavia no hay una version estable pero ya estamos por la Release candidate 4 (RC4).</p>
<p>Muchos cambios surgieron con esta nueva version, no solo estamos hablando de soportar PHP 5.3/5.4 y todos sus nuevos features, hay muchos cambios respecto al framework en general.</p>
<p>Se cambio toda la estructura, se hizo practicamente de cero. Tenemos otra estructura de carpetas, tenemos &#8220;Modulos&#8221; de verdad, tenemos Dependency Injection (DI) e Event Manager. Esta version va a llevar a PHP a otro nivel.</p>
<p>No se van a escuchar mas comentarios del tipo, ZF es lento, es pesado. Zend Framework con la introduccion de DI no solo depreco todos sus singleton dando vuelta por todas las librerias, sino que nos hizo un framework mas transparente.</p>
<p>Durante un tiempo deje de hacer videos de ZF y tampoco doy clases en Educacion It, esto se daba porque estaba esperando esta version. Los cambios son geniales, y confio en que ZF2 y Symfony 2 van a llevar a PHP al lugar que merece.</p>
<p>En este primer capitulo vamos a crear el bootstrap de nuestra aplicacion inicial. Como aclaro en el video, voy a tratar de hacer los videos mas cortos explicando conceptos simples, pero tratando, si mis otras obligaciones me lo permiten, subir videos mas seguidos.</p>
<p>Aca les dejo el primer capitulo.<br />
<iframe width="640" height="360" src="http://www.youtube.com/embed/ytS4Pd8eb7g" frameborder="0" allowfullscreen></iframe></p>
<p>Configuracion de un virtual host.<br />
&lt;VirtualHost *:80&gt;<br />
ServerName zf2.local<br />
ServerAlias www.zf2.local<br />
DocumentRoot /Users/pablo/Workspace/ZendSkeletonApplication/public<br />
&lt;Directory /Users/pablo/Workspace/ZendSkeletonApplication/public&gt;<br />
Options FollowSymlinks<br />
AllowOverride All<br />
Order allow,deny<br />
Allow from all</p>
<p>&lt;/Directory&gt;</p>
<p>SetEnv APPLICATION_ENV development</p>
<p>&lt;/VirtualHost&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Links<br />
<a href="https://github.com/zendFramework/zf2" rel="nofollow" target="_blank">Codigo fuente de Zend Framework 2</a></p>
<p><a href="https://github.com/zendframework/ZendSkeletonApplication" rel="nofollow" target="_blank">Zend Skeleton Application</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2012/08/zf2-clase-1-iniciando-un-proyecto/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Deployar codigo, sin control de versiones y sin FTP</title>
		<link>http://blog.pablo-morales.com/2012/08/deployar-codigo-sin-control-de-versiones-y-sin-ftp/</link>
		<comments>http://blog.pablo-morales.com/2012/08/deployar-codigo-sin-control-de-versiones-y-sin-ftp/#comments</comments>
		<pubDate>Fri, 17 Aug 2012 01:21:21 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Ambiente de Desarrollo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[deployar]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=838</guid>
		<description><![CDATA[Entiendase deploy como el proceso de subir nuestro codigo/db/cambios en general a determinado ambiente. En este caso vamos a hablar del deploy en produccion. Hoy estaba escuchando que el comando rsync es terriblemente avanzado para el uso comun y que seria una buena alternativa usar FTP, o Dropbox (WTF?). Voy a tratar de desmitificar esto. [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2012/08/deployar-codigo-sin-control-de-versiones-y-sin-ftp/" data-text="Deployar codigo, sin control de versiones y sin FTP " data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2012/08/deployar-codigo-sin-control-de-versiones-y-sin-ftp/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2012/08/deployar-codigo-sin-control-de-versiones-y-sin-ftp/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Entiendase deploy como el proceso de subir nuestro codigo/db/cambios en general a determinado ambiente. En este caso vamos a hablar del deploy en produccion.</p>
<p>Hoy estaba escuchando que el comando rsync es terriblemente avanzado para el uso comun y que seria una buena alternativa usar FTP, o Dropbox (WTF?).</p>
<p>Voy a tratar de desmitificar esto.</p>
<p>Primero quiero hacer una aclaracion, es importante entender que si bien es correcto que usemos control de versiones para desarrollar no es correcto usar el control de versiones en el servidor.</p>
<p>En el control de versiones que mas le guste o les toque trabajar, ya sea git, svn, mercurial, etc. nosotros necesitamos guardar todo lo que realmente requiera de un versionado, esto tiene que entenderse como codigo no binario. Cuando hablamos de una imagen por ejemplo, la imagen puede sufrir variaciones porque un desarrollador decidio cambiarle el tamaño a las imagenes en portadas que tenemos en el slider, estas imagenes pueden ir variando constantemente pero no tenemos que analizar su codigo para ver como va variando en las dferentes versiones, no necesitamos hacer un code review tampoco, no tiene ningun sentido guardar en un versionado las imagenes, ademas tenemos el costo extra que las imagenes (generalmente), ocupan mucho espacio y a ese espacio, ese espacio se le tiene que sumar el archivo que usa el control de versiones para chequear si sufrio cambios y que cambios fueron. Lo cual estamos duplicando espacio sobre algo que no nos interesa llevar un versionado. Lo mismo pasa con los PDF, zip, .doc, etc.</p>
<p>Entonces solo vamos a versionar codigo, ese codigo puede contener por ejemplo, nuestros tests, archivos para hacer pruebas locales, archivos de ambiente, etc. No hace falta que el codigo de los tests este en produccion, nosotros no vamos a correr test unitario en produccion, ya se supone que fue probado en los distintos ambientes, por lo cual su espacio en el servidor es inecesario, lo mismo con los archivos de ambiente, para que necesito la configuracion de mi ambiente de desarrollo si estoy en produccion?. Para que necesito ocupar espacio en disco de los archivos que necesita git para validar si hay cambios, si no voy a hacer commit desde el server?, o no deberia.</p>
<p>Que pasa si mis imagenes las tengo que subir a un servidor de CDN y no al servidor donde esta el codigo? de que me sirve que el server del codigo tambien contenga las imagenes?</p>
<p>Todo muy lindo pero esto es engorroso hacerlo a mano, como hago todo el deploy en una linea de bash?</p>
<p>Muy simple con rsync.</p>
<p>Que hace este comando magico? Basicamente lee un directorio, y lo compara con otro directorio y establece que archivos se modificaron y cuales tiene que pisar. Una vez que los identifico los actualiza.</p>
<p>Su funcionalidad en contra de la creencia &#8220;popular&#8221; es muy simple.</p>
<p>Supongamos que localmente tenemos dos directorios con copias exactas de su conteinido, pero en uno de ellos decido editar un archivo o agregar uno nuevo. Pero quiero sincronizarlos.</p>
<p>Entonces voy a ejecutar lo siguiente</p>
<pre> $ rsync -avz /home/pablo/directorioModificado/ /home/pablo/directorioSinModificar/</pre>
<p>Simplemente escribimos el comando, tres simples parametros (letras), y el directorio modificado y el directorio a modificar.</p>
<p>Yo use rsync -avz, estas 3 letras significan diferentes opciones que yo quiero de rsync.</p>
<p>&#8220;a&#8221;, esta letra sirve para que rsync sincronice todo el arbol de directorios manteniendo las fechas de actualizacion, permisos, y link simbolicos (Gracias Rodrigo por la aclaracion)</p>
<p>&#8220;v&#8221;, verbose, muchos comandos en linux tienen la opcion verbose, que basicamente significa si va a mostrar el detalle en pantalla o no. Rsync sin esta opcion no nos va a mostrar el detalle de que archivos esta sincronizando.</p>
<p>&#8220;z&#8221;, esta opcion es muy importante cuando queremos hacer sincronizaciones remotas, como por ejemplo a nuestro servidor, esta opcion sirve para comprimir los datos que van a viajar por la red.</p>
<p>En el caso que quiseramos hacer lo mismo pero en una carpeta remota hacemos lo siguiente.</p>
<pre>  $ rsync -avz /home/pablo/directorioModificado/ user@midominio.com:/home/pablo/directorioSinModificar/</pre>
<p>Aca la conexion se va a dar a un servidor remoto, via ssh, por lo cual vamos a especificarle nuestro usuario de ssh (user), el dominio en el que nos vamos a conectar (dominio.com), y vamos agregar el dos puntos (:) y concatenarle la ruta a la carpeta correspondiente <strong>en el servidor.</strong></p>
<p>En mi caso el codigo para deployar codigo en el servidor es el siquiente.</p>
<pre> $ rsync -avz ~/Workspace/paintball/ user@dondejugarpaintball.com:/var/www/paintball/</pre>
<p>A esta linea yo voy a excluirle la carpeta imgs, .git, y tests. Entonces voy a usar el atributo exclude de rsync, este atributo va a sincronizar todos los archivos y carpetas, menos los que yo indique que se excluyan.</p>
<pre> $ rsync -avz ~/Workspace/paintball/ --exclude tests --exclude .git --exclude public/imgs user@dondejugarpaintball.com:/var/www/paintball/</pre>
<p>Ahora recordar todo esto puede ser tedioso, y para eso tenemos los alias. vamos a nuestro archivo ~/.bashrc y agregamos un alias que reemplace toda la linea anterior por un simple sync-paintball</p>
<pre>alias sync-paintball="rsync -avz ~/Workspace/paintball/ --exclude tests --exclude .git --exclude public/imgs user@dondejugarpaintball.com:/var/www/paintball/"</pre>
<p>Cargamos el nuevo bashrc.</p>
<pre>$ source ~/.bashrc</pre>
<p>y ejecutamos</p>
<pre>$ sync-paintball</pre>
<p>Y listo, una vez que termina de sincronizar los archivos voy al sitio en produccion y ya tengo todo actualizado. Si falla algo, cosa que puede pasar, puedo solucionarlo desde mi ambiente local y volver a sincronizarlo, o en el caso que sea algo interno del servidor me conecto al mismo y lo resuelvo. Pero en el mayor de los caso no va a hacer falta.</p>
<p>Podriamos aplicar lo mismo para sincronizar las imagenes a nuestro servidor de CDN.</p>
<p>Recuerden que cada vez que abran una conexion ssh con rsync van a necesitar escribir el password de usuario en el servidor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2012/08/deployar-codigo-sin-control-de-versiones-y-sin-ftp/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Configurando un proyecto en Zend Framework en un hosting</title>
		<link>http://blog.pablo-morales.com/2012/04/configurando-un-proyecto-en-zend-framework-en-un-hosting/</link>
		<comments>http://blog.pablo-morales.com/2012/04/configurando-un-proyecto-en-zend-framework-en-un-hosting/#comments</comments>
		<pubDate>Sat, 28 Apr 2012 18:49:56 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[dattatec]]></category>
		<category><![CDATA[elserver.com]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[instalacion]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=830</guid>
		<description><![CDATA[Increiblemente he recibido muchas preguntas sobre como instalar Zend Framework en un hosting donde no tengo acceso al virtual host, y a la configuracion de apache en general. Realmente esto es muy simple, ahora vamos a ver porque. Zend Framework no requiere que el proyecto donde se use, sea con MVC lo sugiere pero no [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2012/04/configurando-un-proyecto-en-zend-framework-en-un-hosting/" data-text="Configurando un proyecto en Zend Framework en un hosting " data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2012/04/configurando-un-proyecto-en-zend-framework-en-un-hosting/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2012/04/configurando-un-proyecto-en-zend-framework-en-un-hosting/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Increiblemente he recibido muchas preguntas sobre como instalar Zend Framework en un hosting donde no tengo acceso al virtual host, y a la configuracion de apache en general. </p>
<p>Realmente esto es muy simple, ahora vamos a ver porque. </p>
<p>Zend Framework no requiere que el proyecto donde se use, sea con MVC lo sugiere pero no hace falta. Por lo que no veamos la estructura de carpetas de Zend Framework como algo estricto. </p>
<p>Las carpetas que Zend_Tool crea cuando inicia un proyecto son las siguientes. </p>
<p>application/<br />
docs/<br />
library/<br />
public/<br />
tests/</p>
<p>Siendo public/ el punto de entrada a nuestra aplicacion, si nosotros configuramos el virtual host en apache vamos a apuntar el documentRoot de la aplicacion a la carpeta public, esto es debido a que esta carpeta contiene dos archivos escenciales para el funionamiento de la aplicacion creada en Zend Framework, index.php y .htaccess. Estos archivos van a procesar todas las urls de nuestra aplicacion y la van a redirigir al controller necesario, o al arcvhivo estatico. Teniendo en cuenta esto. Vamos a analizar como es hoy un hosting comun y corriente. </p>
<p>Hace mucho que no uso un hosting como los de elserver.com, datattec.com, y todos esos server que ofrecen servicios de hosting compartidos, no voy a hablar ni bien ni mal, prefiero no desviar el tema, si pueden paguense un VPS no son tan caros. </p>
<p>Cuando activamos nuestra cuenta en el hosting, le asignamos un dominio por ejemplo mipaginazf.com, nos van a dar una cuenta de FTP y con esa cuenta nosotros vamos a entrar desde filezilla, o el cliente FTP que usen. Cuando nos logueamos con nuestros datos podemos ver un listado de directorios con diferentes propositos  </p>
<p>cgi/<br />
public_ftp/<br />
public_html/<br />
backup/</p>
<p>etc&#8230; esto dependene del proveedor pero pueden tener diferentes nombres, mas o menos carpetas. </p>
<p>Lo que tenemos que tener como importante es que todos nuestros archivos web &#8220;deberian&#8221; ir en la carpeta public_html para ser interpretados, esta carpeta va a ser el punto de entrada de nuestro dominio mipaginazf.com</p>
<p>Digo deberian, con comillas (&#8220;) porque en nuestro caso tenemos una carpeta pubic/ que es nuestro punto de entrada, donde tenemos todos los archivos estaticos de nuestro proyecto y nuestro index.php y .htaccess que determinan que controller ejecutar. </p>
<p>Teniendo en cuenta esto, podriamos tener en el root/ de nuestro FTP las siguientes carpetas</p>
<p>cgi/<br />
public_ftp/<br />
public_html/<br />
backup/<br />
application/<br />
docs/<br />
tests/<br />
library/</p>
<p>etc.</p>
<p>Los archivos index.php y .htacces como todo el resto del contenido estatico solo necesitamos moverlo a la carpeta public_html </p>
<p>Y asi de facil es configurar un proyecto en un hosting. </p>
<p>Obviamente antes de contratar un hosting, pregunten que soporte archivos .htaccess, tenga rewrite activo, y la version de php sea mayor a 5.2.x</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2012/04/configurando-un-proyecto-en-zend-framework-en-un-hosting/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>ZF Clase 10 – Autenticacion</title>
		<link>http://blog.pablo-morales.com/2011/12/zf-clase-10-%e2%80%93-autenticacion/</link>
		<comments>http://blog.pablo-morales.com/2011/12/zf-clase-10-%e2%80%93-autenticacion/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 01:06:02 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Adapters ZF]]></category>
		<category><![CDATA[login con Zend Framework]]></category>
		<category><![CDATA[Zend_Auth]]></category>
		<category><![CDATA[Zend_Auth_Adapter]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=804</guid>
		<description><![CDATA[En los anteriores capitulos habiamos usado el video como metodo de aprendizaje, hoy habiendo cubierto la parte inicial y basica de Zend Framework, creo que estamos preparados para dejar el video atras, y continuar los capitulos leyendo un poco. En este capitulo vamos a ver como crear un sistema de login en nuestro proyecto. Nosotros [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/12/zf-clase-10-%e2%80%93-autenticacion/" data-text="ZF Clase 10 – Autenticacion" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/12/zf-clase-10-%e2%80%93-autenticacion/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/12/zf-clase-10-%e2%80%93-autenticacion/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En los anteriores capitulos habiamos usado el video como metodo de aprendizaje, hoy habiendo cubierto la parte inicial y basica de Zend Framework, creo que estamos preparados para dejar el video atras, y continuar los capitulos leyendo un poco. </p>
<p>En este capitulo vamos a ver como crear un sistema de login en nuestro proyecto. Nosotros actualmente en nuestro portal de noticias tenemos una pantalla donde publicamos nuestras noticias. Pero actualmente esa pantalla es accesible por cualquier persona. </p>
<p>El objetivo de este capitulo es crear una pantalla de login, y restringir el acceso a la administracion de las noticias solo a las personas que tengan usuario y contraseña. </p>
<p>Lo primero que vamos a hacer es crear un nuevo controller, UsuarioController.php</p>
<p>El codigo de este controller inicialmente sera asi.</p>
<pre>

class UsuarioController extends Zend_Controller_Action
{
    
    public function init()
    {
        
    }

    public function loginAction()
    {
        $form = new Application_Form_Login();

        if( $this->getRequest()->isPost() ){
            
            if( $form->isValid( $this->_getAllParams() )) {
                
                // Do something
            }
        }

        $this->view->form = $form;
    }


}
</pre>
<p>Para este controller vamos a tener que crear una vista asi que creamos la carpeta en views/scripts/usuario y agregamos el archivo login.phtml, donde vamos a imprimir el formulario y mostrar un mensaje, el archivo quedaria asi</p>
<pre>
&lt;div&gt;
    &lt;h2&gt;Ingresar al sistema&lt;/h2&gt;
    &lt;?php echo $this-&gt;form ; ?&gt;
&lt;/div&gt;
</pre>
<p>Tambien vamos a necesitar un formulario para poder ingresar usuario y contraseña. </p>
<p>Creamos el archivo en forms/Login.php</p>
<p>Este formulario va a tener un input para el usuario otro para el contraseña, y el boton de submit, el formulario Login.php nos quedaria asi. </p>
<pre>

class Application_Form_Login extends Zend_Form 
{

    public function init() 
    {

        $this->addElement(
            'text', 'username', array(
                'label' => 'Usuario:',
                'required' => true
            )
        );

        $this->addElement(
            'password', 'password', array(
                'label' => 'Contraseña:',
                'required' => true
            )
        );

        $this->addElement(
                'submit', 'Ingresar', array()
        );
    }

}
</pre>
<p>Hasta ahora no vimos nada nuevo, es mas o menos el mismo mecanismo que usamos para crear un nuevo post. Si entramos en la url de nuestro proyecto /usuario/login vamos a ver el formulario de login como aparece en la siguiente imagen.</p>
<p><img src="http://blog.pablo-morales.com/wp-content/uploads/2011/12/post-1.png" alt="" title="post-1" width="446" height="236" class="aligncenter size-full wp-image-821" /></p>
<p>Ahora que tenemos el codigo vamos a crear una tabla donde se van a guardar todos los usuarios que van a tener permisos al panel de administracion de nuestro proyecto. El sql para crear la tabla es el siguiente. </p>
<pre>
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(40) NOT NULL,
  `password` char(40) NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

INSERT INTO `users` (`username`, `password`) VALUES
    ('pablo', '7c4a8d09ca3762af61e59520943dc26494f8941b');
</pre>
<p>Nuestra tabla de usuario es bastante sencilla, por ahora vamos a cumplir con los requerimientos minimos. El hash extraño que se ve es la contraseña &#8220;123456&#8243; encriptada con la funcion <a href="php.net/sha1" target="_blank">sha1()</a></p>
<p>Ahora que ya tenemos un usuario (pablo) y una contraseña (123456), nos falta agregar la logica para que se valide si el usuario existe o no. </p>
<p>Zend Framework nos brinda el componente <a href="http://framework.zend.com/manual/en/zend.auth.html" target="_blank">Zend_Auth</a> el cual a partir de sus <a href="http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/" target="_blank">Adapters</a>, nos permite validar un usuario y loguearlo en el sistema. La forma de usarlo es bastante simple, Zend Auth entiende identidad y credencial, donde la identidad es el nombre de usuario o mail que vamos a usar para identificar a un usuario dentro del sistema, y la credencia es la contraseña. </p>
<p>Nosotros vamos a usar <a href="http://framework.zend.com/manual/en/zend.auth.adapter.dbtable.html" target="_blank">Zend_Db_Adapter_DbTable</a> el cual se encarga de validar el usuario y contraseña en nuestra base de datos. </p>
<p>El codigo cuando usemos Zend_Auth deberia ser el siguiente.</p>
<pre>
$authAdapter = new Zend_Auth_Adapter_DbTable();

$authAdapter
    ->setTableName('users')
    ->setIdentityColumn('username')
    ->setCredentialColumn('password');

$authAdapter
    ->setIdentity('pablo')
    ->setCredential(sha1('123456'));

$auth = Zend_Auth::getInstance();

$result = $auth->authenticate($authAdapter);
                
if(  $result->isValid() ){
    echo "Estamos Logueado!";
}else{
    echo "Datos incorrecto";
}
</pre>
<p>Ahora este codigo vamos a adaptarlo a nuestro controller. Nos quedaria asi</p>
<pre>
class UsuarioController extends Zend_Controller_Action
{
    
    public function init()
    {
        
    }

    public function loginAction()
    {
        $form = new Application_Form_Login();

        if( $this->getRequest()->isPost() ){
            
            if( $form->isValid( $this->_getAllParams() )) {
                
                $authAdapter = new Zend_Auth_Adapter_DbTable();
                $authAdapter
                    ->setTableName('users')
                    ->setIdentityColumn('username')
                    ->setCredentialColumn('password');

                $authAdapter
                    ->setIdentity($form->getValue('username'))
                    ->setCredential(sha1($form->getValue('password')));

                $auth = Zend_Auth::getInstance();

                
                $result = $auth->authenticate($authAdapter);
                
                if(  $result->isValid() ){
                    return $this->_redirect('/posts/listar');
                }else{
                    $form->username->addErrorMessage('Datos Incorrectos');
                }
            }
        }
        $this->view->form = $form;
    }


}
</pre>
<p>Con este codigo cada vez que nos identifiquemos correctamente nos va a redirigir a /posts/listar donde vamos a mostrar todas las noticias. </p>
<p>Ahora los que nos faltaria agregar es que en cada lugar donde nosotros queramos restringir el acceso, agregar el chequeo si el usuario esta logueado o no, sino esta logueado vamos a redireccionarlo a la pantalla de login. </p>
<p>En cada action que querramos validar esto vamos a agregar el siguiente codigo.</p>
<pre>
$auth = Zend_Auth::getInstance();
if (! $auth->hasIdentity()) {
    return $this->_redirect('/usuarios/login');
}

</pre>
<p>Notese que en el caso de PostsController, tenemos metodos que son de acceso publico y acceso privado, si llegado el caso tenemos un Controller donde necesitamos que todos los metodos sean de alcance privado, las lineas de arriba podemos escribirlas en el metodo init() de nuestro controller, ese metodo init se va a llamar antes de ejecutar un action de ese controller, y de esta forma evitamos repetir codigo. </p>
<p>Hay otras practicas para mejorar esto pero eso podemos verlo mas adelante. </p>
<p>Ahora que restringimos el acceso, vamos a necesitar la posiblidad de desloguearnos del sistema, para eso vamos agregar un link en nuestro layout.phtml en la parte del menu, que nos redireccione a /usuarios/logout  y este es el codigo de nuestro action para desloguarnos. </p>
<pre>
public function logoutAction()
{
    Zend_Auth::getInstance()->clearIdentity();
    return $this->_redirect('/usuario/login');
}
</pre>
<p>Bastante simple, no <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , asi es todo con Zend Framework. </p>
<p>Ahora, vamos a dejarlo mas bonito a todo esto, y vamos validar en la vista si el usuario esta logueado, voy a mostrar un link a logout, si esta deslogueado voy a mostrar un link a la pantalla de login. El codigo a agregar en nuestro layout seria el siguiente. </p>
<pre>
&lt;?php
$auth = Zend_Auth::getInstance();
if ( $auth->hasIdentity()) :
?&gt;
    &lt;li&gt;Usuario:&lt;?php echo $auth-&gt;getIdentity() ?&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="/usuario/logout"&gt;Logout&lt;/a&gt;
&lt;?php else: ?&gt;
    &lt;li&gt;&lt;a href="/usuario/login/"&gt;Login&lt;/a&gt;
&lt;?php endif;?&gt;

</pre>
<p>Y con esto ya somos capaces de agregar un sistema de login en nuestros proyectos usando Zend Framework. </p>
<p><a href="http://blog.pablo-morales.com/category/curso/">Ver todos los capitulos del curso</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/12/zf-clase-10-%e2%80%93-autenticacion/feed/</wfw:commentRss>
		<slash:comments>89</slash:comments>
		</item>
		<item>
		<title>Hang out with Friends (ZF)</title>
		<link>http://blog.pablo-morales.com/2011/12/hang-out-with-friends-zf/</link>
		<comments>http://blog.pablo-morales.com/2011/12/hang-out-with-friends-zf/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 02:09:20 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[hang out]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[zfcast]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=801</guid>
		<description><![CDATA[Este tiempo desde que subo los videos tengo un feedback de la gente que sigue este blog muy grande. Por este quiero probar de juntarnos virtualmente con google plus, hacer un hangout , y poder compartir experiencia, y los que tengan ganas pueden usarlo para sacarse las dudas que tengan. &#160; Es bastante informal, no [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/12/hang-out-with-friends-zf/" data-text="Hang out with Friends (ZF)" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/12/hang-out-with-friends-zf/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/12/hang-out-with-friends-zf/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Este tiempo desde que subo los videos tengo un feedback de la gente que sigue este blog muy grande. Por este quiero probar de juntarnos virtualmente con google plus, hacer un hangout , y poder compartir experiencia, y los que tengan ganas pueden usarlo para sacarse las dudas que tengan.</p>
<p>&nbsp;</p>
<p>Es bastante informal, no va a ver lista de invitados ni nada de eso, a las 21hs Hora Argentina,  abro el hangout invito a los que esten online en ese momento, y dejo abierto para que lo llenen los que quieran participar, personalmente creo que esta bueno para que planteen algun tema para los proximos videos, o como les decia antes sacarse alguna duda.</p>
<p>&nbsp;</p>
<p>Los espero, el martes 19 de diciembre a las 21hs Argentina, en google plus.<br />
Agreguenme asi los tengo a mano.</p>
<p>&nbsp;</p>
<p><a href="https://plus.google.com/113488230260400531922/posts">https://plus.google.com/113488230260400531922</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/12/hang-out-with-friends-zf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Creando un ambiente de desarrollo &#8211; Documentacion</title>
		<link>http://blog.pablo-morales.com/2011/11/creando-un-ambiente-de-desarrollo-documentacion/</link>
		<comments>http://blog.pablo-morales.com/2011/11/creando-un-ambiente-de-desarrollo-documentacion/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 00:01:12 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Ambiente de Desarrollo]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[Open source]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[ambiente de desarrollo]]></category>
		<category><![CDATA[basecamp]]></category>
		<category><![CDATA[confluence]]></category>
		<category><![CDATA[documentacion]]></category>
		<category><![CDATA[documentar codigo]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[mediawiki]]></category>
		<category><![CDATA[pbworks]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=782</guid>
		<description><![CDATA[Hay una serie de herramientas que son necesarias en cualquier ambiente de desarrollo, en esta serie de post, vamos a ver como crear un ambiente semi ideal para el desarrollo en equipos de desarrollo.Como primer topico vamos a hablar sobre la documentacion. Seguramente les paso muchas veces que tuvieron que heredar algun desarrollo ya empezado, [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/11/creando-un-ambiente-de-desarrollo-documentacion/" data-text="Creando un ambiente de desarrollo - Documentacion" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/11/creando-un-ambiente-de-desarrollo-documentacion/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/11/creando-un-ambiente-de-desarrollo-documentacion/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><div>Hay una serie de herramientas que son necesarias en cualquier ambiente de desarrollo, en esta serie de post, vamos a ver como crear un ambiente semi ideal para el desarrollo en equipos de desarrollo.Como primer topico vamos a hablar sobre la documentacion.</p>
<p>Seguramente les paso muchas veces que tuvieron que heredar algun desarrollo ya empezado, y tenian que perder mucho tiempo leyendo codigo y usando la aplicacion para entender como funcionaba y sin embargo siempre encontraban algo nuevo. Que genial seria poder leer la documentacion de como esta diseñado un software y poder entender, alcance, features, bugs, puntos de entrada, tecnlogias usadas, etc. Lamentablemente esto casi nunca pasa, y tenemos que hacerlo de la forma dificil y lenta. Pero nosotros podemos cambiar eso, e implementar politicas de documentacion para nuestros proyectos.</p>
<p>En estos sistemas podemos agregar documentos, screenshot, imagenes, especificaciones de instalacion, configuracion, librerias a usar, detalle de servidores, listado de grupos de desarrollo (en el caso que sean varios grupos), etc. Todo lo que puede servir para que una persona nueva en el grupo o alguien que herede nuestro codigo pueda entender como funciona leyendo la documentacion del desarrollo.</p>
<p>Como formato ideal de documentacion para este tipo de cosas, me parece que gana el estilo wiki. No solo tenemos wikimedia, sino que tambien contamos con Trac, Confluence, PbWorks, y muchos mas. Pero obviamente si les resulta comodo usar google docs, o archivos con formato Word o Excel tambien es valido, pero por experiencia siempre terminamos teniendo carpetas inecesarias con un monton de archivos que no sabemos de que hablan, y capaz que ya perdieron vigencia.</p>
<p>Aca les voy a contar de algunos proyectos interesantes que pueden usar para sus proyectos.</p>
<p><strong>Mediawiki</strong>.</p>
</div>
<div>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2011/11/mediawiki.png" rel="thumbnail"><img class="size-medium wp-image-786 aligncenter" title="mediawiki" src="http://blog.pablo-morales.com/wp-content/uploads/2011/11/mediawiki-300x300.png" alt="" width="150" height="150" /></a></p>
<p>El mismo codigo que se usa para la wikipedia esta disponible para que nosotros podamos instalarlo internamente en nuestro servidor con nuestros documentos privados, funciona de la misma forma que la wikipedia y se puede descargar de <a href="http://www.mediawiki.org/wiki/Download/es">http://www.mediawiki.org/wiki/Download/es</a>, dentro de nuestro ambiente lo podemos configurar como una pagina comun y corriente.</p>
<p>Mediawiki es un producto open source. Y no hay que pagar por usarlo</p>
</div>
<div>
<p><strong>Confluence</strong></p>
</div>
<div>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2011/11/confluences.jpg" rel="thumbnail"><img class="size-medium wp-image-784 aligncenter" title="confluences" src="http://blog.pablo-morales.com/wp-content/uploads/2011/11/confluences-300x300.jpg" alt="" width="150" height="150" /></a></p>
<p>Esta es otra alternativa a mediawiki que se presume mas completa y facil de integrar con otras herramientas como Jira.<br />
<a href="http://www.atlassian.com/software/confluence/overview">http://www.atlassian.com/software/confluence/overview</a></p>
<p>Lamentablemente este servicio es pago. Pueden usar los servidores de <a href="http://atlassian.com/">atlassian.com</a> o pueden usarlos dentro de su ambiente. Cualquiera de las dos es viable, el producto es muy bueno a pesar de su precio.</p>
</div>
<div>
<p><strong>Trac</strong></p>
</div>
<div><a href="http://blog.pablo-morales.com/wp-content/uploads/2011/11/trac.png" rel="thumbnail"><img class="size-thumbnail wp-image-788 aligncenter" title="trac" src="http://blog.pablo-morales.com/wp-content/uploads/2011/11/trac-150x150.png" alt="" width="150" height="150" /></a><br />
Durante mucho tiempo use Trac, no solo por la wiki, tambien por su integracion con el repositorio de svn, la verdad es que hoy no me resulta comodo, hay muchas alternativas, y esta paso a ser de mis ultimas elecciones. Trac esta desarrollado en python, y tiene plugin para integrarlo con git y creo que tambien con mercurial y bazaar. Es open source y gratuita.</div>
<div><strong>PBWorks</strong></div>
<div><a href="http://blog.pablo-morales.com/wp-content/uploads/2011/11/pb.png" rel="thumbnail"><img class="aligncenter size-full wp-image-793" title="pb" src="http://blog.pablo-morales.com/wp-content/uploads/2011/11/pb.png" alt="" width="140" height="140" /></a></div>
<div>Uno de mis favoritos, es un servicio online, de documentacion de proyectos colaborativo, anda muy bien. La version gratuita es muy completa. Se puede pagar por algunos features especiales.<br />
<a href="http://pbworks.com/">http://pbworks.com/</a></div>
<div>
<p><strong>Basecamp</strong></p>
</div>
<div><img class="aligncenter size-thumbnail wp-image-794" title="basecampposta" src="http://blog.pablo-morales.com/wp-content/uploads/2011/11/basecampposta1-150x124.png" alt="" width="150" height="124" /></div>
<div>Es uno de los mas famosos, y brinda una solucion un poco mas amplica, no recuerdo si tiene wiki, pero si soporta compartir documentos, e integra muchas funcionalidades. Es un servicio pago mensualmente<br />
<a href="http://basecamphq.com/">http://basecamphq.com</a></div>
<div><strong>Github</strong></div>
<div><img class="aligncenter size-thumbnail wp-image-795" title="github" src="http://blog.pablo-morales.com/wp-content/uploads/2011/11/github1-150x58.jpg" alt="" width="150" height="58" /></div>
<div>Sin dudas mi primer eleccion, tanto para proyecto privados pagando el fee mensual, como para proyectos opensource, no solo integra git en tus proyectos, sino que ademas brinda la posibilidad de crear wiki, ticket, comentar parte de codigos, hacer comentarios de una review, trabajar con la cantidad de colaboradores que quieras, seguro, facil. Tiene bugtrucker. Git no seria lo que es hoy sin este servicio espectacular que crece dia a dia, PHP, el Kernel de Linux, Zend Framework entre otros decidieron pasarse a github para sus proyectos. Hoy yo tengo casi todos mis proyectos en github y funciona excelente. Como wiki cuando la documentacion crece quizas sea mejor decision pensar en mediawiki, o pbworks.<a href="https://github.com/">https://github.com</a></p>
<p>&nbsp;</p>
</div>
<div>
<p>&nbsp;</p>
<p><strong>Red Mine</strong></p>
<p>Me olvidaba  de una de las mejores alternativas opensource, RedMine. Desarrollado en Ruby on Rails, es una excelente alternativa a Jira + Confluence, un producto super completo y libre.</p>
<p><a href="http://www.redmine.org/">http://www.redmine.org/</a></p>
<p>&nbsp;</p>
<p><strong>Conclusion</strong></p>
<p>Hay otras soluciones, pagas y gratuitas para documentar nuestros desarrollos. Estas son con las que trabaje, en el proximo articulo vamos a tratar de elegir que software de control de versiones usar, y cual elegir entre tantas opciones nuevas.</p>
<p>No solo es importante configurar un ambiente sino tambien usarlo. Si implementamos algun sistema para documentar y no lo usamos no tiene sentido, es una buena costumbre documentar el codigo, y es algo vital para el futuro inmediato.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/11/creando-un-ambiente-de-desarrollo-documentacion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ZF Clase 9 &#8211; Join y View Helpers</title>
		<link>http://blog.pablo-morales.com/2011/11/zf-clase-9-join-y-view-helpers/</link>
		<comments>http://blog.pablo-morales.com/2011/11/zf-clase-9-join-y-view-helpers/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 11:51:26 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Joins]]></category>
		<category><![CDATA[Zend_Db_Select]]></category>
		<category><![CDATA[Zend_Form]]></category>
		<category><![CDATA[Zend_View_Helper]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=773</guid>
		<description><![CDATA[En el video de hoy voy a mostrarles como hacer un join con otras tablas, en nuestro caso tenemos la tabla posts, y la tabla categories, vamos a tratar de crear posts que tengan una categoria asociada y mostrar los post a partir de la categoria por la que filtramos. Para esto vamos a usar [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/11/zf-clase-9-join-y-view-helpers/" data-text="ZF Clase 9 - Join y View Helpers" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/11/zf-clase-9-join-y-view-helpers/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/11/zf-clase-9-join-y-view-helpers/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En el video de hoy voy a mostrarles como hacer un join con otras tablas, en nuestro caso tenemos la tabla posts, y la tabla categories, vamos a tratar de crear posts que tengan una categoria asociada y mostrar los post a partir de la categoria por la que filtramos. </p>
<p>Para esto vamos a usar un Join para mostrar los nombres de las categorias a las que esta asociada una noticia, y un helper de la vista para mostrar el listado de categorias dentro de nuestro layout. </p>
<p>Aca les dejo el video</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/FrOaab7sQLM?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>Como material extra pueden leer <a href="http://framework.zend.com/manual/en/zend.db.select.html" rel="nofollow">Zend_Db_Select</a> aca van encontrar todo lo referente a armar querys con Zend Framework</p>
<p><a href="http://blog.pablo-morales.com/category/curso/">Ver todos los capitulos del curso</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/11/zf-clase-9-join-y-view-helpers/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>Usando PHP SPL, ArrayIterator y Data Transfer Object.</title>
		<link>http://blog.pablo-morales.com/2011/11/usando-php-spl-arrayiterator-y-data-transfer-object/</link>
		<comments>http://blog.pablo-morales.com/2011/11/usando-php-spl-arrayiterator-y-data-transfer-object/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 01:43:36 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[ArrayIterator]]></category>
		<category><![CDATA[Data Transfer Object]]></category>
		<category><![CDATA[Patrones]]></category>
		<category><![CDATA[PHP SPL]]></category>
		<category><![CDATA[SPL]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=738</guid>
		<description><![CDATA[Data Transfer Object Como nos dice nuestro maestro Martin Fowler, este patron se utiliza para reducir el numero de lladas a un objeto pasando como parametro un objeto que contenga todos los datos necesarios. Estoy haciendo un mini proyecto, que pronto subire a github para compartir con ustedes (una vez que termine la documentacion ), [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/11/usando-php-spl-arrayiterator-y-data-transfer-object/" data-text="Usando PHP SPL, ArrayIterator y Data Transfer Object. " data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/11/usando-php-spl-arrayiterator-y-data-transfer-object/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/11/usando-php-spl-arrayiterator-y-data-transfer-object/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html">Data Transfer Object</a> </p>
<p>Como nos dice nuestro maestro Martin Fowler, este patron se utiliza para reducir el numero de lladas a un objeto pasando como parametro un objeto que contenga todos los datos necesarios. </p>
<p>Estoy haciendo un mini proyecto, que pronto subire a github para compartir con ustedes (una vez que termine la documentacion <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ), en el cual necesito recibir una cantidad de datos, y para evitar que me pasen muchos parametros, opte por recibir un json, con todos los datos. Ahora el problema es que en ese json la persona que usa el servicio puede mandar parametros de mas, o de menos. </p>
<p>Ahora, para que esto sea algo ordenado, cree un Data Transfer Object, con las propiedades que necesito recibir en el json que me envian como parametro. </p>
<p>El servicio que recibe el json, va a instanciar este Data Transfer Object, y despues vamos a pasarle al modelo al metodo save el objeto completo.</p>
<p>Un paso previo deberia ser validar que los datos que recibo via Json sean correctos una vez que lo paso al DTO. </p>
<p>Supongamos que nuestra funcion encola mails a enviar. </p>
<p>Nuestro DTO sera el siguiente</p>
<pre lang="php" class="prettyprint ">

class Application_Model_Mail_DTO 
{
    public $from;
    public $to;
    public $cc;
    public $bcc;
    public $subject;
    public $replyTo;
    public $htmlBody;
    public $textBody;
    public $templateParams;
    public $htmlTemplate;
    public $textTemplate;    
}
</pre>
<p>El metodo que recibe el JSON, seria el sigueinte. </p>
<pre lang="php"  class="prettyprint">
...
public function enqueue($data)
{
    $data = Zend_Json::decode($data);
    $dto = new Application_Model_Mail_DTO();
    $dto->from = $data[‘from’];
    $dto->to = $data[‘to’];
    // … asi sucesivamente hasta cargar todas las propiedades
    $model = new Application_Model_Mail();
    $model->save( $dto );
}        

</pre>
<p>Ok, esto es bastante tedioso y termina generando un codigo muy largo para algo que podemos resolver en pocas lineas usando SPL. </p>
<p>Las <a href="http://php.net/spl">SPL</a> son librerias de PHP compuestas de algunas interfaces y clases, para resolver algunos problemas como el que tenemos en este caso. </p>
<p>Para este caso yo voy a usar <a href="http://ar2.php.net/ArrayIterator">ArrayIterator</a> que convierte mi objeto ( DTO ), y lo convierte en iterable. Ademas me va a proporcionar de un metodo vital en este proceso. </p>
<p>Ahora voy a extender mi DTO de ArrayIterator. Y ademas voy a agrgar un hack en el __construct, para que cuando reciba un array, solo guarde los valores que existen como propiedad dentro de mi DTO. La clase quedaria asi. </p>
<pre lang="php"  class="prettyprint">
class Application_Model_Mail_VO extends ArrayIterator
{
    public $from;
    public $to;
    public $cc;
    public $bcc;
    public $subject;
    public $replyTo;
    public $htmlBody;
    public $textBody;
    public $templateParams;
    public $htmlTemplate;
    public $textTemplate;

    public function __construct( $array ) 
    {
        foreach($array as $key=> $value ) {
            if(property_exists('Application_Model_Mail_VO' , $key )) {
                $this->{$key} = $value;
            }
        }
    }
}

</pre>
<p>Una vez agregado esto, ahora vamos a ver como quedaria nuestro metodo queue con esta modificacion.</p>
<pre lang="php"  class="prettyprint">
...
public function enqueue($data)
{
    $data = Zend_Json::decode($data);
    $vo = new Application_Model_Mail_DTO( $data );
    $model = new Application_Model_Mail();
    $model->save( $dto );
}
</pre>
<p>Se daran cuenta que quedo mucho mas simplificado el codigo y mientras mas simple mas facil de leer.</p>
<p>Ahora como quedaria nuestro modelo, que recibe este DTO y lo guarda, en mi ejemplo yo uso MongoDb para no tener que mostrarle el schemea de la Base de Datos, y los metodos inserts de MySql. </p>
<pre lang="php"  class="prettyprint">

class Application_Model_Mails
{
    private $_collection;

    // Insancio la clase Mongo que contiene la conexion, y le digo cual es la coleccion donde voy a guardar los datos. 
    public function __construct()
    {
        $db = new Mongo();
        $this->_collection = $db->mailer->spooler;
    }

    public function save( Application_Model_Mail_DTO $properties )
    {
        return $this->_collection->insert( $properties->getArrayCopy()  );
    }
}
</pre>
<p>Como se ve en el ejemplo, validamos que el parametro que recibe save(), sea una instancia de Application_Model_Mail_DTO, si esto es asi vamos a insertar los parametros que devuelve el metodo getArrayCopy(), que es parte de ArrayIterator, el cual devuelve un array con las propiedades de nuestro Application_Model_Mail_DTO. </p>
<p>Un paso previo, y que no contemple en este ejemplo es validar que los datos que se reciben esten completos y sean validos, tengan en cuenta siempre validar y filtrar los datos que se reciben. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/11/usando-php-spl-arrayiterator-y-data-transfer-object/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZF Clase 8 &#8211; Creando un sitio multi idioma</title>
		<link>http://blog.pablo-morales.com/2011/10/zf-clase-8-creando-un-sitio-multi-idioma/</link>
		<comments>http://blog.pablo-morales.com/2011/10/zf-clase-8-creando-un-sitio-multi-idioma/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 22:35:47 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHP5 bootstrap]]></category>
		<category><![CDATA[Video tutorial de Zend Framework]]></category>
		<category><![CDATA[Zend Bootstrap]]></category>
		<category><![CDATA[Zend Session]]></category>
		<category><![CDATA[Zend_Translate]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=732</guid>
		<description><![CDATA[Se hizo esperar este ultimo capitulo, la verdad es que tuve algunos problemas con los codecs, y poco tiempo para resolver este problemita. Lo prometido es deuda y hoy les voy a mostrar como crear un sitio multidioma. Como primera medida me baje las banderitas desde iconfinder y las agregue en el top bar de [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/10/zf-clase-8-creando-un-sitio-multi-idioma/" data-text="ZF Clase 8 - Creando un sitio multi idioma" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/10/zf-clase-8-creando-un-sitio-multi-idioma/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/10/zf-clase-8-creando-un-sitio-multi-idioma/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Se hizo esperar este ultimo capitulo, la verdad es que tuve algunos problemas con los codecs, y poco tiempo para resolver este problemita. </p>
<p>Lo prometido es deuda y hoy les voy a mostrar como crear un sitio multidioma.</p>
<p>Como primera medida me baje las banderitas desde <a rel="nofollow" href="http://www.iconfinder.com/">iconfinder</a> y las agregue en el top bar de la aplicacion. </p>
<p>Aca les dejo el video para que vean lo simple que es crear un sitio multiidioma con Zend Framework. </p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/v6geb_Aolss?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p><a href="http://blog.pablo-morales.com/category/curso/">Ver todos los capitulos del curso</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/10/zf-clase-8-creando-un-sitio-multi-idioma/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Web Designers vs. Web Developers</title>
		<link>http://blog.pablo-morales.com/2011/10/web-designers-vs-web-developers/</link>
		<comments>http://blog.pablo-morales.com/2011/10/web-designers-vs-web-developers/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 22:50:36 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[offtopic]]></category>
		<category><![CDATA[infografia]]></category>
		<category><![CDATA[web designer vs programer]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=726</guid>
		<description><![CDATA[Webeando habitualmente como todo sabado, encontre esta infografia, la cual genera que inmediatamente despues de terminar de postear esto vaya urgente a afeitarme. Lo del teclado estaba apunto de hacerlo esta semana, pero ahora me dio verguencita, aunque no hubiese sido la primera vez]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/10/web-designers-vs-web-developers/" data-text="Web Designers vs. Web Developers" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/10/web-designers-vs-web-developers/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/10/web-designers-vs-web-developers/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Webeando habitualmente como todo sabado, encontre esta infografia, la cual genera que inmediatamente despues de terminar de postear esto vaya urgente a afeitarme. </p>
<p>Lo del teclado estaba apunto de hacerlo esta semana, pero ahora me dio verguencita, aunque no hubiese sido la primera vez <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2011/10/web-designers-vs-developers.png" rel="thumbnail"><img src="http://blog.pablo-morales.com/wp-content/uploads/2011/10/web-designers-vs-developers-658x1024.png" alt="" title="web-designers-vs-developers" width="658" height="1024" class="aligncenter size-large wp-image-728" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/10/web-designers-vs-web-developers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ZF Clase 7 &#8211; Cambiando el diseno facilmente, usando Bootstrap From Twitter</title>
		<link>http://blog.pablo-morales.com/2011/10/zf-clase-7-cambiando-el-diseno-facilmente-usando-bootstrap-from-twitter/</link>
		<comments>http://blog.pablo-morales.com/2011/10/zf-clase-7-cambiando-el-diseno-facilmente-usando-bootstrap-from-twitter/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 23:13:46 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Bootsrap twitter]]></category>
		<category><![CDATA[ZF Twitter BOotstrap]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=712</guid>
		<description><![CDATA[En este video vamos a darle un poco de estilo al proyecto usando Twitter Bootstrap, bootstrap es una estructura de diseno y contiene varias herramientas que nos van a facilitar trabajar con el diseno. Esto puede usarse como base para cualquier proyecto. Pueden ver mas de este proyecto aca Boostrap from Twitter, tambien pueden encontrar [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/10/zf-clase-7-cambiando-el-diseno-facilmente-usando-bootstrap-from-twitter/" data-text="ZF Clase 7 - Cambiando el diseno facilmente, usando Bootstrap From Twitter" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/10/zf-clase-7-cambiando-el-diseno-facilmente-usando-bootstrap-from-twitter/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/10/zf-clase-7-cambiando-el-diseno-facilmente-usando-bootstrap-from-twitter/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><img src="http://blog.pablo-morales.com/wp-content/uploads/2011/10/twitter-bootstrap.png" alt="" title="twitter-bootstrap" width="600" height="140" class="aligncenter size-full wp-image-718" /></p>
<p>En este video vamos a darle un poco de estilo al proyecto usando Twitter Bootstrap, bootstrap es una estructura de diseno y contiene varias herramientas que nos van a facilitar trabajar con el diseno.</p>
<p>Esto puede usarse como base para cualquier proyecto. </p>
<p>Pueden ver mas de este proyecto aca <a href="http://twitter.github.com/bootstrap/" target="_blank">Boostrap from Twitter</a>, tambien pueden encontrar este proyecto en <a href="https://github.com/twitter/bootstrap" target="_blank">github</a></p>
<p>Aca les dejo el video para que vean como agregar Bootstrap en Zend Framework.</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/ZVLhtJ0ip0I?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p><a href="http://blog.pablo-morales.com/category/curso/">Ver todos los capitulos del curso</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/10/zf-clase-7-cambiando-el-diseno-facilmente-usando-bootstrap-from-twitter/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>ZF Clase 6 &#8211; Zend + Twitter + Oauth</title>
		<link>http://blog.pablo-morales.com/2011/10/zf-clase-6-zend-twitter-oauth/</link>
		<comments>http://blog.pablo-morales.com/2011/10/zf-clase-6-zend-twitter-oauth/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 05:57:21 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Oauth]]></category>
		<category><![CDATA[Twitter Connect]]></category>
		<category><![CDATA[Zend_Oauth]]></category>
		<category><![CDATA[Zend_Services]]></category>
		<category><![CDATA[Zend_Services_Twitter]]></category>
		<category><![CDATA[Zend_Session]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=700</guid>
		<description><![CDATA[Hoy vamos a ver como conectar nuestra aplicacion con Twitter. Lo mas importante por ahora es conseugir que un usuario se pueda identificar con su cuenta de twitter. Vamos a usar para esto Zend_Oauth, que nos facilita la conexion con cualquier sistema que use este protocolo. Tambien vamos a usar los Services de Zend Framework, [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/10/zf-clase-6-zend-twitter-oauth/" data-text="ZF Clase 6 - Zend + Twitter + Oauth" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/10/zf-clase-6-zend-twitter-oauth/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/10/zf-clase-6-zend-twitter-oauth/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><img src="http://blog.pablo-morales.com/wp-content/uploads/2011/10/twitter-connect.png" alt="" title="twitter-connect" width="600" height="262" class="aligncenter size-full wp-image-721" /></p>
<p>Hoy vamos a ver como conectar nuestra aplicacion con Twitter. </p>
<p>Lo mas importante por ahora es conseugir que un usuario se pueda identificar con su cuenta de twitter. Vamos a usar para esto Zend_Oauth, que nos facilita la conexion con cualquier sistema que use este protocolo. </p>
<p>Tambien vamos a usar los Services de Zend Framework, los cuales nos brinda una interfaz para facilitar la interaccion con otros servicios externos, como Twitter, Technoratti, Yahoo, etc.</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/ZRB70xL2rls?hl=en&#038;fs=1&#038;hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>Gracias Maestros del Web, por la publicacion, hace click en la imagen para ir al post en maestrosdelweb.com</p>
<p><a href="http://www.maestrosdelweb.com/editorial/video-tutoriales-de-zend-framework/" target="_blank" title="Maestrosdelweb.com"><img src="http://blog.pablo-morales.com/wp-content/uploads/2011/10/guia-zend-1-300x118.jpg" alt="" title="guia-zend (1)" width="300" height="118" class="aligncenter size-medium wp-image-699" /></a></p>
<p>En el proximo capitulo vamos a ver como hacer un sitio multi idioma.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/10/zf-clase-6-zend-twitter-oauth/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>ZF Clase 5 &#8211; Editar, Borrar y Paginar nuestros datos.</title>
		<link>http://blog.pablo-morales.com/2011/09/zf-clase-5-editar-borrar-y-paginar-nuestros-datos/</link>
		<comments>http://blog.pablo-morales.com/2011/09/zf-clase-5-editar-borrar-y-paginar-nuestros-datos/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 02:20:05 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend Db]]></category>
		<category><![CDATA[Zend Db Table Row]]></category>
		<category><![CDATA[Zend Paginator]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=687</guid>
		<description><![CDATA[Con este video concluye la serie inicial de videos. Hoy vamos a ver como Editar, Borrar, y Paginar nuestros datos. Vamos a ver como manipular un row facilmente, para borrarlo y editarlo. Vamos a usar Zend_Paginator para paginar resultados facilmente con Zend Framework. Con estos 5 videos ustedes deberian ser capaces de empezar a trabajar [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/09/zf-clase-5-editar-borrar-y-paginar-nuestros-datos/" data-text="ZF Clase 5 - Editar, Borrar y Paginar nuestros datos." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/09/zf-clase-5-editar-borrar-y-paginar-nuestros-datos/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/09/zf-clase-5-editar-borrar-y-paginar-nuestros-datos/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Con este video concluye la serie inicial de videos. Hoy vamos a ver como Editar, Borrar, y Paginar nuestros datos. </p>
<p>Vamos a ver como manipular un row facilmente, para borrarlo y editarlo. Vamos a usar Zend_Paginator para paginar resultados facilmente con Zend Framework. </p>
<p>Con estos 5 videos ustedes deberian ser capaces de empezar a trabajar con Zend Framework, hay mucho para aprender no se desmoralicen si se traban con algo, nos pasa a todos y todos los dias.</p>
<p>Ahora les dejo para que vean, recuerden verlo en HD. </p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/upB6mD16oEw?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>No se olviden de twitearlo/plusearlo/Facebookearlo  <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Si tienen dudas comenten, estoy archivando toda las dudas que surgen en los comentarios para despues crear mas video a partir de esas inquietudes.</p>
<p>Capitulos Anteriores<br />
<a href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/">Capitulo 1 < Configuracion y creacion del proyecto</a><br />
<a href="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/">Capitulo 2 < Estructura de directorios, MVC y layouts</a><br />
<a href="http://blog.pablo-morales.com/2011/08/zf-clase-3-%E2%80%93-objeto-view-y-contenido-estatico/">Capitulo 3 < Objeto view, y contenido estatico </a><br />
<a href="http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/">Capitulo 4 < Modelos y Formularios </a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/09/zf-clase-5-editar-borrar-y-paginar-nuestros-datos/feed/</wfw:commentRss>
		<slash:comments>93</slash:comments>
		</item>
		<item>
		<title>ZF Clase 4 &#8211; Modelos y Formularios</title>
		<link>http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/</link>
		<comments>http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 07:00:09 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[conectarse a una db]]></category>
		<category><![CDATA[Modelos]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[Zend_Db]]></category>
		<category><![CDATA[Zend_Form]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=671</guid>
		<description><![CDATA[Llego la hora de hacer algo util, hoy vamos a ver como configurar nuestra aplicacion para trabajar con una base de datos mysql, para eso vamos a usar Zend_Form para crear formularios y vamos a crear modelos para poder traer datos de nuestras tablas y poder escribir en ellas. Si te perdiste el video anterior [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/" data-text="ZF Clase 4 - Modelos y Formularios" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Llego la hora de hacer algo util, hoy vamos a ver como configurar nuestra aplicacion para trabajar con una base de datos mysql, para eso vamos a usar Zend_Form para crear formularios y vamos a crear modelos para poder traer datos de nuestras tablas y poder escribir en ellas. </p>
<p>Si te perdiste el video anterior podes verlo <a href="http://blog.pablo-morales.com/2011/08/zf-clase-3-%E2%80%93-objeto-view-y-contenido-estatico/">aca</a></p>
<p>Es recomendable ver el video en 720p de resolucion y en pantalla completa.<br />
<iframe width="640" height="390" src="http://www.youtube.com/embed/9lRplwh20sg?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>Los que quieran descargarse el codigo fuente pueden hacerlo desde github en <a href="http://github.com/pablofmorales/News123">http://github.com/pablofmorales/News123</a></p>
<p>Capitulos Anteriores<br />
<a href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/">Capitulo 1 < Configuracion y creacion del proyecto</a><br />
<a href="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/">Capitulo 2 < Estructura de directorios, MVC y layouts</a><br />
<a href="http://blog.pablo-morales.com/2011/08/zf-clase-3-%E2%80%93-objeto-view-y-contenido-estatico/">Capitulo 3 < Objeto view, y contenido estatico </a></p>
<p>Proximo capitulo > Edicion, y Paginado. </p>
<p>Gracias <a href="http://www.maestrosdelweb.com" target="_blank" title="Maestros del Web" >Maestrosdelweb</a> por darme un espacio en su cuenta de youtube</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/09/zf-clase-4-modelos-y-formularios/feed/</wfw:commentRss>
		<slash:comments>64</slash:comments>
		</item>
		<item>
		<title>Convertir facilmente una fecha en varios formatos con Zend_Date</title>
		<link>http://blog.pablo-morales.com/2011/08/convertir-facilmente-una-fecha-en-varios-formatos-con-zend_date/</link>
		<comments>http://blog.pablo-morales.com/2011/08/convertir-facilmente-una-fecha-en-varios-formatos-con-zend_date/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 12:19:37 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[convertir fechas]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend_Date]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=669</guid>
		<description><![CDATA[Muchas veces necesitamos guardar una fecha en mysql, y recibimos una fecha con el formato dd/mm/yyyy, pero en Mysql es necesario guardarlo con el formato yyyy-mm-dd. Esto no supone ningun inconveniente con Zend Framework, la verdad es que es bastante simple. Lo primero que hacemos es recibir la fecha como viene, y crear una instancia [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/08/convertir-facilmente-una-fecha-en-varios-formatos-con-zend_date/" data-text="Convertir facilmente una fecha en varios formatos con Zend_Date" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/08/convertir-facilmente-una-fecha-en-varios-formatos-con-zend_date/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/08/convertir-facilmente-una-fecha-en-varios-formatos-con-zend_date/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Muchas veces necesitamos guardar una fecha en mysql, y recibimos una fecha con el formato dd/mm/yyyy, pero en Mysql es necesario guardarlo con el formato yyyy-mm-dd.</p>
<p>Esto no supone ningun inconveniente con Zend Framework, la verdad es que es bastante simple. </p>
<p>Lo primero que hacemos es recibir la fecha como viene, y crear una instancia de Zend_Date</p>
<pre lang="php">
$fechaInicial = "25/08/2016";

$fecha = new Zend_Date($fechaInicial, 'dd/mm/yyyy');

echo $fecha->get('yyyy-mm-dd');
</pre>
<p>Con el metodo get y pasando como parametro, el formato que necesitamos es todo lo que necesitamos para guardar ese valor con un formato de fecha valido en nuestra base de datos. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/08/convertir-facilmente-una-fecha-en-varios-formatos-con-zend_date/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementando closures en PHP 5.3</title>
		<link>http://blog.pablo-morales.com/2011/08/implementando-closures-en-php-5-3/</link>
		<comments>http://blog.pablo-morales.com/2011/08/implementando-closures-en-php-5-3/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 11:08:48 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[array_walk]]></category>
		<category><![CDATA[cloures]]></category>
		<category><![CDATA[funciones anonimas]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[trim]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=667</guid>
		<description><![CDATA[Hasta ahora no necesite implementar funciones anonimas en ningun proyecto, pero estaba trabajando con archivos de texto, donde tenia que parsear el contenido y me encontre que el array que generaba con cada columna de una linea de archivo, venia con espacios al inicio y me complicaba las validaciones, asi que tenia que usar la [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/08/implementando-closures-en-php-5-3/" data-text="Implementando closures en PHP 5.3" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/08/implementando-closures-en-php-5-3/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/08/implementando-closures-en-php-5-3/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Hasta ahora no necesite implementar funciones anonimas en ningun proyecto, pero estaba trabajando con archivos de texto, donde tenia que parsear el contenido y me encontre que el array que generaba con cada columna de una linea de archivo, venia con espacios al inicio y me complicaba las validaciones, asi que tenia que usar la funcion trim(), en cada elemento. Para hacerlo facil queria usar <a href="http://php.net/array_walk">array_walk()</a>, el problema es que no podia usar trim(), como nombre de funcion. </p>
<p>Asi que decidi usar closures, condenando el proyecto a solo correr en php 5.3, pero eso no iba a ser un problema (creo). </p>
<p>Para lo que no sepan lo que es un clousure, pueden leerlo en la <a href="http://php.net/manual/es/functions.anonymous.php">pagina de PHP</a> </p>
<p>El codigo es bastante simple y lo comparto a continuacion. </p>
<pre lang="php">
array_walk($prop, function(&#038;$n) {
	$n = trim($n);
});
</pre>
<p>Como ven en el ejemplo la forma de implementarlo es realmente muy simple, tal como lo hacemos en javascripts. </p>
<p>Es importante que no abusen de estas funciones anonimas, porque pueden traer confusion cuando el sistema crezca un poco, pero es interesante aplicarlo en estos casos que son bastante simples, y necesarios. </p>
<p>Soy conciente de que tendria que tener listo el capitulo 4 del curso de Zend Framework, en un rato lo subo, a no desesperarce. <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/08/implementando-closures-en-php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZF Clase 3 – Objeto view, y contenido estatico</title>
		<link>http://blog.pablo-morales.com/2011/08/zf-clase-3-%e2%80%93-objeto-view-y-contenido-estatico/</link>
		<comments>http://blog.pablo-morales.com/2011/08/zf-clase-3-%e2%80%93-objeto-view-y-contenido-estatico/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 23:34:13 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[contenido estatico]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[object view]]></category>
		<category><![CDATA[views]]></category>
		<category><![CDATA[vistas]]></category>
		<category><![CDATA[zend framework mvc]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=661</guid>
		<description><![CDATA[En este capitulo vemos como pasar datos desde un controller hacia la vista, o el layout. Tambien agregamos archivos estaticos al proyecto, css, js, e imagenes. Si te perdiste el video anterior podes verlo aca Es recomendable ver el video en 720p/1080p de resolucion y en pantalla completa. Los que quieran descargarse el codigo fuente [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/08/zf-clase-3-%e2%80%93-objeto-view-y-contenido-estatico/" data-text="ZF Clase 3 – Objeto view, y contenido estatico" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/08/zf-clase-3-%e2%80%93-objeto-view-y-contenido-estatico/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/08/zf-clase-3-%e2%80%93-objeto-view-y-contenido-estatico/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En este capitulo vemos como pasar datos desde un controller hacia la vista, o el layout. Tambien agregamos archivos estaticos al proyecto, css, js, e imagenes.</p>
<p>Si te perdiste el video anterior podes verlo <a href="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/">aca</a></p>
<p>Es recomendable ver el video en 720p/1080p de resolucion y en pantalla completa.<br />
<iframe width="640" height="390" src="http://www.youtube.com/embed/fmDETc6KnSE" frameborder="0" allowfullscreen></iframe><br/></br/></p>
<p>Los que quieran descargarse el codigo fuente pueden hacerlo desde github en <a href="http://github.com/pablofmorales/News123">http://github.com/pablofmorales/News123</a></p>
<p><a href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/">Capitulo 1 < Configuracion y creacion del proyecto</a><br />
<a href="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/">Capitulo 2 < Estructura de directorios, MVC y layouts</a><br/></p>
<p>Proximo capitulo > Base de datos y Modelos</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/08/zf-clase-3-%e2%80%93-objeto-view-y-contenido-estatico/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>ZF Clase 2 &#8211; Estructura de directorios, MVC y layouts</title>
		<link>http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/</link>
		<comments>http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 18:47:50 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[layouts]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[vistas zf]]></category>
		<category><![CDATA[zend framework mvc]]></category>
		<category><![CDATA[zf html5]]></category>
		<category><![CDATA[zf layouts]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=657</guid>
		<description><![CDATA[Ya esta el capitulo dos del video tutorial de Zend Framework, en esta edicion vamos a dar un repaso sobre la estructura de direcotrios de Zend Framework, editar los controllers, las vistas, y el layout de nuestra aplicacion. Tambien vamos a empezar a darle forma a nuestro proyecto. Y entender la diferencia entre el contenido [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/" data-text="ZF Clase 2 - Estructura de directorios, MVC y layouts" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Ya esta el capitulo dos del video tutorial de Zend Framework, en esta edicion vamos a dar un repaso sobre la estructura de direcotrios de Zend Framework, editar los controllers, las vistas, y el layout de nuestra aplicacion.</p>
<p>Tambien vamos a empezar a darle forma a nuestro proyecto. Y entender la diferencia entre el contenido estatico y el contenido generado por nuestro MVC. </p>
<p>Espero que lo disfruten, pueden usar los comments de este blog para plantear dudas, pedir que se refuerce algun tema, o pedir temas a tocar en el futuro. </p>
<p>Si te perdiste el video anterior podes verlo <a href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/">aca</a></p>
<p>Es recomendable ver el video en 720p de resolucion y en pantalla completa.<br />
<iframe src="http://player.vimeo.com/video/26958080?title=0&amp;byline=0&amp;portrait=0" width="601" height="338" frameborder="0"></iframe><br/></br/></p>
<p>Los que quieran descargarse el codigo fuente pueden hacerlo desde github en <a href="http://github.com/pablofmorales/News123">http://github.com/pablofmorales/News123</a></p>
<p><a href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/">Capitulo Anterior < Configuracion y creacion del proyecto</a></p>
<p>Proximo capitulo > Enviar parametros a las vistas y agregar archivos js y css a nuestro proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/07/zf-clase-2-estructura-de-directorios-mvc-y-layouts/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>ZF Clase 1 &#8211; Configuracion y creacion del proyecto</title>
		<link>http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/</link>
		<comments>http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 00:47:50 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Curso]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[crear un proyecto zf]]></category>
		<category><![CDATA[crear virtual host zend framework]]></category>
		<category><![CDATA[framework php]]></category>
		<category><![CDATA[php5 screencast]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[Screencast zf]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=646</guid>
		<description><![CDATA[Este es el primero de una serie de screencast donde la idea es mostrar como crear un proyecto con Zend Framework. Vamos a crear un portal de noticias que llamaremos &#8220;news123&#8243; a medida que pasen las clases vamos a darle forma al proyecto. En el primer capitulo vamos a configurar nuestro proyecto desde 0. Esto [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/" data-text="ZF Clase 1 - Configuracion y creacion del proyecto" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Este es el primero de una serie de screencast donde la idea es mostrar como crear un proyecto con Zend Framework.</p>
<p>Vamos a crear un portal de noticias que llamaremos &#8220;news123&#8243; a medida que pasen las clases vamos a darle forma al proyecto.</p>
<p>En el primer capitulo vamos a configurar nuestro proyecto desde 0. Esto incluye el startup del proyecto y la configuracion en netbeans, y en Apapche para que corra dentro de un virtualhost dentro de un servidor local. </p>
<p>Recomiendo ver el video en pantalla completa y en la resolucion 720p para poder ver con claridad el tutorial.</p>
<p><iframe width="640" height="510" src="http://www.youtube.com/embed/KNyhUbusOQ0" frameborder="0" allowfullscreen></iframe></p>
<p>Los que quieran descargarse el codigo fuente pueden hacerlo desde github en <a href="http://github.com/pablofmorales/News123">http://github.com/pablofmorales/News123</a></p>
<p>Proximo capitulo ></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/07/screencast-de-zend-framework-clase-1-configuracion-y-creacion-del-proyecto/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Ahora cualquiera puede certificarse en PHP 5.3</title>
		<link>http://blog.pablo-morales.com/2011/05/ahora-cualquiera-puede-certificarse-en-php-5-3/</link>
		<comments>http://blog.pablo-morales.com/2011/05/ahora-cualquiera-puede-certificarse-en-php-5-3/#comments</comments>
		<pubDate>Fri, 20 May 2011 19:35:12 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[php5]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Certificacion PHP]]></category>
		<category><![CDATA[php 5.3]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=642</guid>
		<description><![CDATA[Y si gente si yo pude cualquier mortal puede. La verdad es que no fue nada dificil, lei el libro una vez, y despues repase algunos capitulos la noche anterior, y salio bastante bien. Creo que las partes mas importantes para repasar y que por ahi no se usa mucho es el trabajo con socket, [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/05/ahora-cualquiera-puede-certificarse-en-php-5-3/" data-text="Ahora cualquiera puede certificarse en PHP 5.3" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/05/ahora-cualquiera-puede-certificarse-en-php-5-3/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/05/ahora-cualquiera-puede-certificarse-en-php-5-3/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Y  si gente si yo pude cualquier mortal puede. La verdad es que no fue  nada dificil, lei el libro una vez, y despues repase algunos capitulos  la noche anterior, y salio bastante bien.</p>
<p>Creo  que las partes mas importantes para repasar y que por ahi no se usa  mucho es el trabajo con socket, y XML, ya que le da mucha relevancia al  trabajo con DOM.</p>
<p>Lo  unico malo que me paso es que la licencia la compre hace unos 11 meses  atras, y cuando fui a rendir en vez de tomarme la version 5.2 me tomaron  la 5.3, y no hubo problema con las LAMDA ni con Namespaces, el problema  vino con las SPL, ya que en la version anterior solo tenia algunas SPL,  ahora habia un monton, y me preguntaron justo la que nunca habia usado  <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> .</p>
<p>Pero quiero animarlos a todos para que intenten sacar la certificacion, en Argentina <a href="http://www.zend.com/en/yellow-pages#list-cid=10&amp;firstname=&amp;lastname=&amp;orderby=name&amp;sid=XX&amp;company=&amp;photo_first=&amp;certtype=&amp;ClientCandidateID=">solo somos 19 los certificados</a> y no estaria mal que ese numero aumentara un poco.</p>
<p>En Argentina el examen se puede rendir en muchos lugares, yo elegi Educacion It por ser ex profesor del instituto, pero hay muchos lugares para elegir.</p>
<p>Aca les dejo mi link</p>
<p style="text-align: center;"><a href="http://www.zend.com/store/education/certification/authenticate.php?ClientCandidateID=zend017009" target="_blank"><img class="size-full wp-image-643 aligncenter" title="zce-php5-3-logo" src="http://blog.pablo-morales.com/wp-content/uploads/2011/05/zce-php5-3-logo.gif" alt="" width="73" height="68" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/05/ahora-cualquiera-puede-certificarse-en-php-5-3/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Facebook agradece a PHPUnit</title>
		<link>http://blog.pablo-morales.com/2011/01/facebook-agradece-a-phpunit/</link>
		<comments>http://blog.pablo-morales.com/2011/01/facebook-agradece-a-phpunit/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 03:52:16 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Open source]]></category>
		<category><![CDATA[bergmann]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[php unit]]></category>
		<category><![CDATA[sebastian]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=640</guid>
		<description><![CDATA[Por casualidad hoy volvi a visitar el blog de Sebastian Bergmann, un groso dentro del ambiente de PHP. Sin dudas el proyecto mas importante que realizo fue PHP Unit el cual esta tomando cada vez mas repercusion dentro de los desarrollos actuales. Uno de los grupos de desarrolladores mas importantes en la web que usa [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2011/01/facebook-agradece-a-phpunit/" data-text="Facebook agradece a PHPUnit" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2011/01/facebook-agradece-a-phpunit/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2011/01/facebook-agradece-a-phpunit/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Por casualidad hoy volvi a visitar el blog de Sebastian Bergmann, un groso dentro del ambiente de PHP. Sin dudas el proyecto mas importante que realizo fue PHP Unit el cual esta tomando cada vez mas repercusion dentro de los desarrollos actuales.</p>
<p>Uno de los grupos de desarrolladores mas importantes en la web que usa PHP Unit es Facebook. Y a traves de un mail le agradecen  a Sebastian Bergamann de la siguiente forma</p>
<p>&#8220;Hey Sebastian,</p>
<p>we would really like to thank you for all the work  you’ve done on PHPUnit this year. Testing is important when we’re  talking about 500 million people; a bug for 1% of Facebook users is  still affecting 5 million people!</p>
<p>To show our appreciation we&#8217;d  like to give you a free year of a GitHub paid account. The link below  provides one year of more space, more collaborators, and private  repositories. If you already have a paid GitHub account, it will add a  bunch of credit instead.&#8221;</p>
<p>Mas alla que para Facebook una cuenta por un año en github no significa nada, si tenemos en cuenta los millones de dolares que recibe de inversion, tambien es verdad que no hacia falta quedar bien con Sebastian porque el lo hace sin animo de lucro,  sin embargo el grupo de desarrolladores de Facebook consiguieron retribuirle a Sebastian su trabajo, de una manera muy interesante.</p>
<p>Lo mas importante de esto fue el comentario de Sebastian sobre este mail.</p>
<p>&#8220;Thank you, Facebook!</p>
<p>It feels good to be appreciated for the  work I do to make the life of PHP developers better by working on  development and quality assurance tools such as PHPUnit.&#8221;</p>
<p>Creo que esto simboliza el esfuerzo que cada uno hace por el open source. No hablamos de plata, de dolares ni de cuentas gratis por servicios online, sino la satisfaccion personal de saber que lo que hacemos le sirve a otras personas.</p>
<p>Cuando compartimos nuestro trabajo estamos facilitando las cosas a muchas personas. En este caso una de las herramientas mas utiles a la hora de desarrollar una aplicacion, y asegurarnos de que todo anda bien.</p>
<p><a href="http://sebastian-bergmann.de/blog/" target="_self">Pagina de Sebastian </a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2011/01/facebook-agradece-a-phpunit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cualidades esenciales para cualquier desarrollador web</title>
		<link>http://blog.pablo-morales.com/2010/10/cualidades-esenciales-para-cualquier-desarrollador-web/</link>
		<comments>http://blog.pablo-morales.com/2010/10/cualidades-esenciales-para-cualquier-desarrollador-web/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 16:23:54 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[desarrollador web]]></category>
		<category><![CDATA[senior developer]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=634</guid>
		<description><![CDATA[Cada vez es hay mayor cantidad de herramientas y tecnicas para realizar sistemas web, esto le da muchas mas complejidad dia a dia al desarrollo web, pero tambien mucha herramientas que facilitan el desarrollo de un sistema web. Antes con saber programar en PHP/Mysql/Html/Css era mas que suficiente para conseguir clientes, y poder trabajar en [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/10/cualidades-esenciales-para-cualquier-desarrollador-web/" data-text="Cualidades esenciales para cualquier desarrollador web" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/10/cualidades-esenciales-para-cualquier-desarrollador-web/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/10/cualidades-esenciales-para-cualquier-desarrollador-web/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Cada  vez es hay mayor cantidad de herramientas y tecnicas para realizar  sistemas web, esto le da muchas mas complejidad dia a dia al desarrollo  web, pero tambien mucha herramientas que facilitan el desarrollo de un  sistema web.</p>
<p>Antes  con saber programar en PHP/Mysql/Html/Css era mas que suficiente para  conseguir clientes, y poder trabajar en cualquier proyecto web. Hoy en  dia esto no es suficiente.</p>
<p>Los  sistemas al ser mas complejos, requieren mas profesionalismo en el  desarrollo, y gente mas capacitada. Hay muchas herramientas que hoy son  indispensable para proyectos medianos/grandes, que requieren mas de un  programador.</p>
<p><strong>Control de versiones.</strong></p>
<p>Es  real que los sistemas son cada vez mas grandes y mas robustos,  generalmente vemos que un sistema tiene varios desarrolladores,  disenadores, QA, y otros, solo para crear un sitio de e-commerce, o un  portal mediano. Esto hace indispensable el uso de un sistema para el  control de versiones, pero no solo alcanza con saber hacer un checkout y  commit con svn, ahora se necesita un conocimiento general sobre la  teoria del control de versiones, branch, tags, mergear ramas. Tambien  manejo de otros sistemas de control de versiones como mi actual favorito  Git, o mercury, entre otros.</p>
<p><strong>Testing Unitarios.</strong></p>
<p>El  trabajo en grupo es algo de todos los dias, siempre nos acomplamos a un  grupo de desarrolladores, son muy pocos los proyectos que hacemos solo  para que los desarrolle una sola persoa, esto si bien acelera los  tiempos de desarrollo, tambien puede generar conflictos con el codigo de  otras personas, puede pasar que alguien suba algo y rompa todas las  funcionalidades del resto de los desarrolladores. Esto es tan normal que  ya tenemos asumido que puede pasar en cualquier momento. Pero tenemos  los unit testing, que hacen que estas cosas se puedan prevenir. Antes de  hacer un commit, corremos todos los testing unitarios, y podemos saber  si rompimos algo, antes de subir nuestro codigo al repositorio global.  Igual, lo ideal es que cada developer trabaje en su branch, y que  alguien o un script, mergee los branch al trunk cuando haya pasado todos  los testing, y se considere que puede pasar al trunk (rama principal).  Hay sistemas open source como crouisecontrol, que mantienen informado a  todo el equipo como salieron los unit testing despues de que alguien del  equipo subiera sus cambios. Si alguien subio y rompio algun unit  testing, este le envia un mail a todo el equipo avisando del problema,  para que lo solucionen rapido, ademas podemos hacer que sino pasa los  testing, revote los cambios.</p>
<p><strong>SEO</strong></p>
<p>El  SEO es un tema importante hoy en dia, no necesitamos ser “expertos” en  SEO, pero necesitamos entender que es y cuales son las buenas practicas  que podemos aplicar en nuestros desarrollos para facilitar la indexacion  de parte de los motores de busqueda. Url amistosas, xhtml estricto y  semantico, jerarquizacion de nuestro contenido utilizando correctamente  los tags html, edicion de metatags, etc.</p>
<p><strong>Servidores </strong></p>
<p>Este  siempre fue un tema que todo desarrollador esquivo, para delegar la  responsabilidades al sys admin correspondiente. Es increible la cantidad  de desarrolladores que se consideran senior, y no saben configurar un  Virtual Host en apache, o usar minimamente la consola de linux.  Linux/Unix nos brinda un monton de herramientas para los desarrolladores  increbiles, que nos pueden hacer la vida mucho mas facil, y no lo digo  solo por los comandos mas usados como tail, cat, vim y grep, tambien  tenemos muchas otras herramientas que aumentarian considerablemente la  velocidad y calidad de nuestros trabajos.</p>
<p><strong><br />
Uso de Frameworks.</strong></p>
<p>Coincidas  o no con la filosofia de usar uno u otro framework, te guste ZF y  detestes Cake, o no te guste ninguno, la realidad es que tenes que tener  la capacidad de poder manejar cualquiera de estos. Obviamente no estoy  diciendo de manejarlos en profundiad sino manejar sus conceptos basicos,  como configuracion, como maneja el modelo de datos, las vistas, etc. La  mayoria de frameworks en PHP usan el Patron de diseno MVC. Conocer como  funciona MVC es vital hoy en dia, pero tambien lo es entender los  conceptos de ORM, Smarty (sistemas de plantilla), y tantos otros  “Frameworks” / Libreria que complementan el desarrollo de una  aplicacion.</p>
<p><strong><br />
Aplicaciones Pre Armadas. </strong></p>
<p>Antes  teniamos PHP-Nuke y gracias, en la actualidad que un cliente te  presente la posibilidad de usar Joomla, Drupal, o Magento, es algo casi  de todos los dias, nosotros como developers, tenemos que conocer no solo  las ventajas de cada sistema de este tipo, sino tambien estar preparado  para utilizarlo en el caso de que creamos que es necesario. Drupal para  desarrollar webs es una herramienta increiblemente facil, ahorramos  muchisimo tiempo de desarrollo configuracion, etc, etc. Lo mejor de  estas aplicaciones es que es muy facil integrarlas a otros sistemas como  Wikimedia, wordpress, u otros sistemas similares, o propios. Crear un  modulo o plugin tambien es muy simple y  las comunidades brindan una  ayuda que vamos a poder valorar muchisimo cuando las necesitemos.</p>
<p><strong><br />
Social Media.</strong><br />
Muy  lejos estoy de aceptar este rubro como algo importante, pero cuando yo  me refiero a social media, lo hago desde el lado de desarrollo,  orientando la aplicacion para que tenga las funcionalidades para  integrarse con las redes sociales mas importantes. Un ejemplo excelente  para mi gusto es stackoverflow, intenta registrarte y loguearte, son  geniales. Esta claro que un usuario web comun y corriente hoy en dia  tiene alguna cuenta o en gmail, facebook, wordpress, twitter, entre  otros, porque no usar las api de esas redes sociales para facilitar el  registro y login de usuarios en nuestros sistemas?</p>
<p>Compartir  el contenido de nuestros sitios, con herramientas tan facil de usar  como el “Me gusta” de facebook, o twittear un contenido, son muy utilies  no solo para que nuestros usuarios puedan compartir sus intereses  dentro de sus circulos “sociales”, sino tambien para que podamos  conseguir usarios nuevos por este medio.</p>
<p><strong>Herramientas para el desarrollo</strong></p>
<p>No  quiero volver a empezar la discusion de Vim o Eclipse, esto es algo que  sobrepasa cualquier discusion, hoy en dia necesitamos todas las  herramientas que aumenten nuestra productividad y el mejor manejo para  el trabajo en equipo. El IDE hoy en dia es esencial, no quieras  desarrollar algo en Vim, porque si estas trabajando por hora, vas a  generar perdidas a la empresas en un monton de aspectos, que la verdad  esos problemas no lo vas a tener con el correcto uso de un IDE, Eclipse  PDT / Netbeans, son herramientas geniales para cualquier developer. Pero  tambien estas herramientas no son las unicas. Necesitamos algo con el  que puedas ver tus tareas asignadas, estado de las mismas, y porque no  las de tus otros companeros de equipos. Un tracker como Trac, o Pivotal  Tracker, yo estoy usando este ultimo y la verdad es que es bastante  complejo pero muy util una vez que le hagarraste la mano. Necesitas  trackear tus horas para aumentar la productividad?, usa Toggl, es un  servicio web publico con una version gratuita muy flexible. Con una  herramienta para instalar que tiene su version en windows, mac , y linux  <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>Conclusion<br />
Pareciera  que estoy dejando de lado los temas importantes que son conocimientos  del lenguaje del lado del servir, motor de base de datos, javascripts,  frameworks en JS, Css, xhtml, html5. Todos estos son conocimientos que  ya deberiamos tener en claro, sinos consideramos experimentados.</p>
<p>Trabajando  en entornos Norte americanos, las exigencias son aun mayores. Estos  exigen un nivel, que es muy dificil encontrar en latino america. Pero  podemos adaptarnos, tenemos la capacidad, y ellos tienen que entender  que somos la mejor opcion.  Lo mismo para el mercado europeo.</p>
<p>Espero  que entiendan que mi idea no es hablar como absolutista, mas bien  compartir la experiencia de haber estado tanto tiempo en el desarrollo  web.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/10/cualidades-esenciales-para-cualquier-desarrollador-web/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Instalando PHP 5.2.x en Ubuntu Lucid.</title>
		<link>http://blog.pablo-morales.com/2010/06/instalando-php-5-2-x-en-ubuntu-lucid/</link>
		<comments>http://blog.pablo-morales.com/2010/06/instalando-php-5-2-x-en-ubuntu-lucid/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 21:53:24 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[ioncube]]></category>
		<category><![CDATA[php 5.2]]></category>
		<category><![CDATA[php 5.2 en lucid]]></category>
		<category><![CDATA[php 5.3 a php 5.2]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=630</guid>
		<description><![CDATA[Una de las novedades con Ubuntu Lucid es que venia con PHP 5.3, para mi iba todo muy bien, hasta que empeze a trabajar con Magento enterprise edition, el cual requiere la libreria ioncube (http://www.ioncube.com/). Lo primero que hice fue tratar de instalar en la libreria en mi php 5.3, despues de buscar un poco [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/06/instalando-php-5-2-x-en-ubuntu-lucid/" data-text="Instalando PHP 5.2.x en Ubuntu Lucid." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/06/instalando-php-5-2-x-en-ubuntu-lucid/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/06/instalando-php-5-2-x-en-ubuntu-lucid/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Una de las novedades con Ubuntu Lucid es que venia con PHP 5.3, para mi iba todo muy bien, hasta que empeze a trabajar con Magento enterprise edition, el cual requiere la libreria ioncube (http://www.ioncube.com/). Lo primero que hice fue tratar de instalar en la libreria en mi php 5.3, despues de buscar un poco me encontre con el primer problema, Ioncube aun no tiene soporte para php 5.3. </p>
<p>Como si o si necesitaba instalar esta libreria busque la forma de pasar a PHP 5.2, lamentablemente no estan facil como se supone que deberia ser. Lo mas llamativo es que no existe dentro del repo de Lucid la version 5.2.x, solo nos deja instalar php 5.3, esto me resulto raro ya que esta version todavia no esta demasiado fomentada en los servidores web. Me paso en otras distro que con algun problema con por ejemplo mysql, donde la version default de mysql era mysql-server-5.1 en el repo igual contaba con la version mysql-server-5.0. </p>
<p>Para instalar PHP 5.2 en Lucid, hay que borrar todo lo relacionado a PHP 5.3 en nuestro sistema, y despues cambiar los repos para que busque en el de Karmic que es la version anterior, y si tiene php 5.2 en los repos. </p>
<p>Segui paso a paso esta post para tener php5.2 en Lucid</p>
<p>http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/</p>
<p>El problema es que hay que acordarse que cada vez que queramos instalar algo relacionado con PHP hay que hacerlo asi.</p>
<p>$ sudo aptitude install -t karmic nombrPaquete</p>
<p>Es molesto pero por ahora la unica solucion.</p>
<p>Despues de hacer esto, instale el ioncube, y todo perfecto. </p>
<p>Instale las librerias gd, mysql, curl. </p>
<p>Cuando quise instalar mcrypt, otra libreria muy necesaria, empezo mi segundo problema y el mas molesto. Por alguna razon, esto es probable que yo haya hecho algo mal, cuando queria instalar mcrypt, el apt-get me daba una advertencia, diciendo que para instalar el paquete tenia que hacer un upgrade a la version 5.3, ninguna de las opciones de instalacion me permitian mantenerme en 5.2. </p>
<p>Un companero de proyecto, Gonzalo, me recomendo bajarme la lib de 64 bit desde el repo de debian http://packages.debian.org/lenny/php5-mcrypt, podria haber usado </p>
<p>#dpkg -i paquete &#8211;force all, pero esto podria traer problemas con mi distro, asi que descomprimi el .deb, e instale la lib a mano. Copiando el .so en /usr/lib/php5/2006&#8230;/ y creando el mcrypt.ini en /etc/php5/conf.d </p>
<p>Cuando reinicie el apache encontre mi tercer y ultimo problema. Mcrypt tiene una dependencia, que es libltdl, busque en aptitude y lo que habia ya estaba instalado, y como ya habia pasado un rato en esto, hice la facil, me baje desde debian lenny la libreria http://packages.debian.org/lenny/libltdl3 y la instale con dpkg.</p>
<p>Ahora anda todo perfecto. Ubuntu Lucid con Php 5.2 con Ioncube corriendo a la perfeccion Magento Enterprise. <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/06/instalando-php-5-2-x-en-ubuntu-lucid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resumen de lo aprendido con Amazon Ec2</title>
		<link>http://blog.pablo-morales.com/2010/06/resumen-de-lo-aprendido-con-amazon-ec2/</link>
		<comments>http://blog.pablo-morales.com/2010/06/resumen-de-lo-aprendido-con-amazon-ec2/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 14:09:32 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[amazon]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Scalabillity]]></category>
		<category><![CDATA[amazon ec2]]></category>
		<category><![CDATA[opinion de amazon ec2]]></category>
		<category><![CDATA[Review Amazon Ec2]]></category>
		<category><![CDATA[reviews]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=624</guid>
		<description><![CDATA[Estuve probando Amazon Ec2, las conclusiones que saque es que economicamente para un sitio con pocos requerimientos no sirve. Es mucho mas económico y fácil de mantener un VPS ( Virtual Private Server), que usar amazon. Pero cuando tenes un sitio con mucho requeriminento de hardware es ideal. Voy a contar en que situación Amazon [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/06/resumen-de-lo-aprendido-con-amazon-ec2/" data-text="Resumen de lo aprendido con Amazon Ec2" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/06/resumen-de-lo-aprendido-con-amazon-ec2/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/06/resumen-de-lo-aprendido-con-amazon-ec2/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Estuve probando Amazon Ec2, las conclusiones que saque es que economicamente para un sitio con pocos requerimientos no sirve. Es mucho mas económico y fácil de mantener un VPS  ( Virtual Private Server), que usar amazon. Pero cuando tenes un sitio con mucho requeriminento de hardware es ideal.</p>
<p>Voy a contar en que situación Amazon es ideal.<br />
En otro post comparti unos vídeos de una charla de Ricardo Gallir contando como subió meneame en Amazon Ec2 y las ventajas que este le ofrece comparado con otros servicios de hosting. Es normal ver los tweets de @rgallir contando lo aburrido que esta desde que subio meneame a Amazon, ya que siempre anda todo bien.</p>
<p>Lo interesante de Amazon es su tendencia para poder escalar de forma horizontal. Esto es agregando mas procesador, mas memoria, mas disco, o mas instancias, que vendrían a ser como mas servidores en paralelo. Parece complicado pero la verdad es que no, si, es necesario tener conocimientos sobre administración de sistemas o contratar a alguien que los tenga, ya que no tenemos el famoso cpanel para poder configurar todo. Amazon nos ofrece un montón de herramientas muy facil de usar, y de entender para que las queremos, que vamos a adorar y a extranar cuando no tengamos que usar Ec2.</p>
<p>Para sintetizar un poco, Ec2 y todo el kit de productos de Amazon, nos van a ser de utilidad el dia que no podamos mantener todo en un unico servidor y necesitemos contratar servidores secundarios para poder balancear la carga, tanto enviar la base de datos a uno o mas servidores, mover el ad server, manejo de contenido estatico, y demas. O que por ejemplo tengamos picos de visitas tan altos que necesitemos servidores en paralelo en determinados horarios o momentos para poder soportar la demanda. En estas circunstancia o basicamente cuando nuestro vps o dedicado nos quede chico, ahi tenemos que evaluar Amazon Ec2.</p>
<p>Lo explico en numeros.</p>
<p>Para montar un unico sitio con pocos requerimientos de hard, podemos usar una instancia tipo small con 1 solo core, y 1.7 gb ram, vamos a necesitar contratar EBS de 10gb por lo menos, que es para administrar Volumenes no volatiles, ya que las instancias cuando se apagan se borran por completo. Y supongamos que vamos a usar una ip, solo con esto estamos rondando los u$d 90 que si bien no es un precio desorbitante, es caro comparado con un VPS, yo hoy en dia uno de los VPS que contrato estoy pagando $360 que serian tambien unos u$s 90 por un server con 8 core, y casi 2gb ram, y 70gb de espacio, los precios están muy parecidos, pero el tema es que con Amazon ec2 tengo un solo core, comparado con los 8 que me ofrece mi proveedor de hosting. Si quisieramos sumar una instancia Ec2 con un dual core, el precio se nos va casi al doble, y aun asi, seguimos sin poder alcanzar los 8 core, del VPS.</p>
<p>Hoy en dia sigue siendo mas economico, contratar un VPS. No solo por los costos en Hardware sino en mantenimiento, ya que no es lo mismo administrar los servidores desde un amistoso Cpanel, que desde la consola de Amazon.</p>
<p>Obviamente el hardware no es el unico punto para determinar si conviene o no migrar todo a la nube, tambien tenemos los factores de conectividad, y soporte. La realidad es que en Argentina no existe ningun datacenter decente, nada de nada, datattec, el server.com, ARGENTINA.COM (en mayusculas porque va con bronca), y tantos otros que dan vuelta, no estan a la altura de la conectividad, hardware, soporte, que te puede dar una empresa reseller de algun datacenter en Estados Unidos. (No te voy a hacer publicidad Andy, vas a tener que darme algun beneficio si queres que diga que uso datawebhosting ).</p>
<p>Todo esto no quiere decir que no puedas ir migrando tu/s sitios a la nube, tenes varios productos de Amazon que podes ir usando antes de migrar a Ec2. Cloudfront, S3, SQS, etc. Los podes implementar sin necesidad de alojar tu sitio en Ec2. Tambien podes empezar a probar Amazon Ec2 con microsistemas, por ejemplo yo deje un openx con Amazon Ec2 para ir testeando su funcionamiento, gracias a la herramiento cloudwatch, puedo ver las estadisticas de exigencias que tuvo el servidor. Esto es interesante para saber si necesitas aumentar los requerimientos, cloudwatch tiene un costo por cada instancia en el que lo uses <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Lo Bueno</p>
<p>* Las herramientas, amis, consola, autoscaller, cloudwatch, SQS, S3, EBS, poder usar casi cualquier distro que se te ocurra, tunear tu distro y registrar amis privadas, esto es increible. Todo muy facil, y rapido de usar.</p>
<p>* El poder de escalamiento horizontal.</p>
<p>* Economico si necesitas varios servidores en paralelo, ya que estos se prenden o apagan cuando se necesitan, y no necesitas contratar servicios de 24&#215;7. Las instancias tienen costes minimos por hora.</p>
<p>* Es muy divertido administrar Amazon.</p>
<p>Lo Malo</p>
<p>* Necesita conocimientos medios de administracion de servidores o pagarle a alguien para que lo haga. Me he enterado de muchos clientes que pagan para que algun sysadmin les haga toda la primera configuracion y despues administran todo con Cpanel, Ec2 requiere un mantenimiento especializado casi constante.</p>
<p>* Caro en sitios chicos.</p>
<p>Nada mas, la verdad que me dio bronca no poder conseguir instancias mas poderosas dentro de los usd 100 mensuales, pero igual termine encantado con el mundo Amazon. Dentro de poco voy a poder montar todo un grupo de sitios con alto requerimiento de hardware, y voy a necesitar escalar con varios servidores, y la opcion que voy a manejar es Ec2, en su momento les comentare como fue.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/06/resumen-de-lo-aprendido-con-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>2 tips para aumentar la velocidad de tus sitios</title>
		<link>http://blog.pablo-morales.com/2010/05/2-tips-para-aumentar-la-velocidad-de-tus-sitios/</link>
		<comments>http://blog.pablo-morales.com/2010/05/2-tips-para-aumentar-la-velocidad-de-tus-sitios/#comments</comments>
		<pubDate>Thu, 13 May 2010 15:40:37 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Optimizing]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[optimizacion]]></category>
		<category><![CDATA[velocidad web]]></category>
		<category><![CDATA[zend fraemwork optimization]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=621</guid>
		<description><![CDATA[Puff hace mucho no escribo nada mi nuevo proyecto (http://www.dondejugarpaintball.com) Me esta llevando todo mi tiempo libre. Voy a mostrarles como implementar de forma simple dos tips de velocidad para tus paginas, el primero es gzip, la idea es que toda la salida de nuestra aplicacion al browser no tenga espacios inecesarios, tabulaciones, y saltos [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/05/2-tips-para-aumentar-la-velocidad-de-tus-sitios/" data-text="2 tips para aumentar la velocidad de tus sitios" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/05/2-tips-para-aumentar-la-velocidad-de-tus-sitios/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/05/2-tips-para-aumentar-la-velocidad-de-tus-sitios/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Puff hace mucho no escribo nada mi nuevo proyecto (<a href="http://www.dondejugarpaintball.com" title="Donde jugar paintball">http://www.dondejugarpaintball.com</a>) Me esta llevando todo mi tiempo libre. </p>
<p>Voy a mostrarles como implementar de forma simple dos tips de velocidad para tus paginas, el primero es gzip, la idea es que toda la salida de nuestra aplicacion al browser no tenga espacios inecesarios, tabulaciones, y saltos de lineas, en pocas palabras, si vemos el codigo fuente de nuestro sitio vamos a ver solo una linea con todo el contenido html, como pueden ver en <a href="http://www.dondejugarpaintball.com" title="Donde jugar paintball">http://www.dondejugarpaintball.com</a>. Esto es muy util para ahorrarnos ancho de banda, y obviamente aumentar la velocidad con la que se descarga nuestro contenido. </p>
<p>Esto a simple vista pareceria ser un trabajo de horas, pero como nosotros usamos Zend Framework y toda la info de nuestra aplicacion pasa por nuestro public/index.php con solo editar este archivo podemos conseguir esta mejora en segundos. </p>
<p>Si tienen un archivo index.php standar sin modificaciones, puden copiar y pegar este codigo y es suficiente. </p>
<pre lang="php">
//Con esta linea le indicamos que queremos obtener toda la salida generada 
ob_start();
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
            realpath(APPLICATION_PATH . '/../library'),
            get_include_path(),
        )));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();
$application->run();


// A partir de esta linea conseguimos toda la salida generada y la comprimimos
$cntACmp =ob_get_contents();
ob_end_clean();
$cntACmp=str_replace("\n",' ',$cntACmp);
$cntACmp=ereg_replace('[[:space:]]+',' ',$cntACmp);
ob_start("ob_gzhandler");
echo $cntACmp;
ob_end_flush();

</pre>
<p>Si guardan y ejecutan su aplicacion, ya tendrian que tener todo su contenido html en una sola linea. </p>
<p>El segundo tips, ya requiere un poco mas de conocimeintos sobre apache.<br />
La idea es que cada vez que alguien pida un contenido estatico como una imagen, o css el apache responda lo mas rapido posible, esto se hace diciendole que nuestro contenido tiene una fecha de expiracion x, y por lo tanto si esa fecha no vario, hay que entregar el mismo contenido que se entrego anteriormente, esto reduce mucho los recursos de nuestro sistema para entregar un contenido estatico. Podemos definir tiempos para cada extension. </p>
<p>Para realizar este cambio necesitamos saber si tenemos el modulo expire de Apache activado.</p>
<p>En caso contrario entramos como sudo y escribimos</p>
<p>sudo a2enmod expire </p>
<p>Reiniciamos apache</p>
<p>/etc/init.d/apache2 reload</p>
<p>Y ya queda activado. </p>
<p>Despues de confirmar que el modulo expire esta activado, editamos nuestro archivo public/.htacces, y agregamos las lineas correspondientes.</p>
<pre lang="apache">
#empezamos a definir los tiempos de expiracion de cada contenido
ExpiresActive On
ExpiresDefault A0
ExpiresByType image/gif A25920000
ExpiresByType image/png A25920000
ExpiresByType image/jpg A25920000
ExpiresByType image/jpeg A25920000
ExpiresByType text/css A25920000
ExpiresByType text/javascript A259200000

#estas son nuestras directivas por default
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/05/2-tips-para-aumentar-la-velocidad-de-tus-sitios/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Dos proyectos en Zend Framework en un mismo dominio.</title>
		<link>http://blog.pablo-morales.com/2010/04/dos-proyectos-en-zend-framework-en-un-mismo-dominio/</link>
		<comments>http://blog.pablo-morales.com/2010/04/dos-proyectos-en-zend-framework-en-un-mismo-dominio/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:59:24 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[dos proyectos un subdominio]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=618</guid>
		<description><![CDATA[En uno de los proyectos que tengo abierto tengo una aplicacion en Zend Framework en un http://www.dominio.com, cree una aplicacion que complementa a esta primera también en ZF, pero en realidad es otro sitio, otra base, y otro modelo de negocio, pero por un tema de SEO, la segunda aplicacion tenia que ser accesible únicamente [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/04/dos-proyectos-en-zend-framework-en-un-mismo-dominio/" data-text="Dos proyectos en Zend Framework en un mismo dominio." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/04/dos-proyectos-en-zend-framework-en-un-mismo-dominio/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/04/dos-proyectos-en-zend-framework-en-un-mismo-dominio/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En uno de los proyectos que tengo abierto tengo una aplicacion en Zend Framework en un http://www.dominio.com, cree una aplicacion que complementa a esta primera también en ZF, pero en realidad es otro sitio, otra base, y otro modelo de negocio, pero por un tema de SEO, la segunda aplicacion tenia que ser accesible únicamente desde http://www.dominio.com/segundaAPp/ y no desde http://www.segundaApp.com/.</p>
<p>La solución es muy simple, pero por ahi alguno tiene o tuvo este problema y no supo resolverlo.</p>
<p>En el .htaccess de la aplicacion principal tenemos el siguiente código en una aplicacion creada con Zend_Application.</p>
<pre>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Lo que hace es, sino encuentra la carpeta/archivo en el directorio actual, ejecuta el index.php el cual parsea la url, para detectar el modulo, controller, action.</p>
<p>A estas lineas hay que agregarle una regla, que si la uri empieza con segundaApp, hay que redireccionar a el index.php de segundaApp. Mi solución fue crear un symlink desde la segunda aplicacion hasta la app actual con el nombre de la segundaApp.</p>
<pre>
RewriteEngine On
#segundaApp.php es un symlink a ../../segundaApp/public/index.php
RewriteRule ^ segundaApp.php [NC,L]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
</pre>
<p>Ahora lo que falta es crear reglas de ruteos dentro de segundaApp para poder redireccionar al controller especifico la url correcta.</p>
<p>Otra forma seria poder agregar módulos dentro de segundApp, pero esto no lo probé, lo que necesitaba lo conseguí perfectamente con esta linea en el .htaccess</p>
<p>El único problema que obtuve con esta forma es con el contenido estático, que siempre lo busco en /imgs/logo.png o /css/core.css, si yo hiciera esto buscaría el contenido estatico dentro de la aplicacion principal, si no comparto contenido lo mejor es usar urls absolutas apuntando por ejemplo a static.segundaApp.com, esta url la pueden obtener  con un helper, $this->baseUrl() de ZF puede servir, no recuerdo si envia el dominio completo, pero en el caso que no pueden crear uno que resuelva este problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/04/dos-proyectos-en-zend-framework-en-un-mismo-dominio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upload de archivos con Zend Form.</title>
		<link>http://blog.pablo-morales.com/2010/03/upload-de-archivos-con-zend-form/</link>
		<comments>http://blog.pablo-morales.com/2010/03/upload-de-archivos-con-zend-form/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 21:18:55 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_File_Transfer]]></category>
		<category><![CDATA[Zend_Form]]></category>
		<category><![CDATA[Zend_Form_Element_File]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=613</guid>
		<description><![CDATA[Mi idea era subir un archivo dentro de un formulario, renombrar ese archivo con un id conseguido en esa misma operacion con el siguiente formato logo_{$id}.jpg . El problema es que cuando agregaba el setDestination del form me copiaba el archivo con su nombre original en la carpeta de destino. No conseguia renombrarlo. Vi muchisimos [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/03/upload-de-archivos-con-zend-form/" data-text="Upload de archivos con Zend Form." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/03/upload-de-archivos-con-zend-form/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/03/upload-de-archivos-con-zend-form/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Mi idea era subir un archivo dentro de un formulario, renombrar ese archivo con un id conseguido en esa misma operacion con el siguiente formato logo_{$id}.jpg . El problema es que cuando agregaba el setDestination del form me copiaba el archivo con su nombre original en la carpeta de destino. No conseguia renombrarlo.</p>
<p>Vi muchisimos ejemplos pero al parecer con la nueva version no andan ninguno, porque los que probe no me sirvieron de forma literal (es decir copy/paste ) .</p>
<p>Asi que tuve que ponerme a leer un poco <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  . Despues de ver como funcionaba Zend_Form_Element_File. Trate de implementar la forma mas logica. La cual no me anduvo. Me acorde que cuando usas isValid de un Zend_Form, este ejecuta los filtros y las validaciones correspondientes. Pero encontre dentro de la documentacion la solucion a mi primer problema, el metodo setValueDisabled( true ) evita que se ejecute el filtro del elemento, asi puedo aplicar mi filtro para renombrar mi archivo despues de validarlo.</p>
<p>Mi segundo problema es que cuando implemente esto, no me guardaba el archivo en donde habia establecido. Para entender esto un poco Zend_Form_Element_File usa Zend_File_Tranfer que es el encargado de manipular el archivo. Lo  que siguio fue traerme el adapter de Zend_File_Transfer de mi elemento, agregar los filtros y ejecutar el upload. Y listo tenia mi archivo subido &#8216;in the ZF way&#8217;.</p>
<p>Este es el formulario</p>
<pre lang="php">

class Application_Form_Company extends Zend_Form
{

    public function init()
    {

        $this->setAttrib('enctype', 'multipart/form-data');

        $this->addElement('text', 'name', array(
            'required'   => true,
            'validators' => array(
            ),
            'class' => 'sf'
        ));
        $this->addElement('file', 'logo', array(
            'class' => 'sf'
        ));
        $this->logo->addValidator( 'Extension', false, 'jpg,png,gif,jpeg' );
        $this->logo->addValidator( 'Size', false, '10024000' );
        $this->logo
            ->setDestination( APPLICATION_PATH . '/../public/empresas/imgs/' )
            ->setValueDisabled( true );

        $this->addElement('text', 'website', array(
            'required'   => true,
            'class' => 'sf'
        ));

        $this->addElement('text', 'telephone', array(
            'required'   => true,
            'class' => 'sf'
        ));

        $this->addElement('textarea', 'information', array(
            'required'   => true,
            'class' => 'sf'
        ));

        $this->setDecorators(
            array(
                array(
                    'ViewScript',
                    array( 'viewScript' => 'company/form.phtml' )
                )
            )
        );
    }
}
</pre>
<p>Asi quedo mi action</p>
<pre lang="php">
        ...
        $form = new Application_Form_Company();
        if ( $this->getRequest()->isPost() ) {
            $file = $form->logo;
            if( $form->isValid($this->getRequest()->getParams()) ) {
                $bind = $form->getValues();
                $company = new Application_Model_Company();
           
                if( $company->exists( $bind['name'] ) ) {
                    $form->name->addErrorMessage( "La empresa ya existe" );
                } else {
                    try {
                        $id = $company->save( $bind );
                    }catch( Exception $e ) {
                        $this->_helper->flashMessenger()
                            ->addMessage( 'Hubo un problema, revise los datos' );
                    }
           
                    // Traemos el adapter de Zend_File_Transfer
                    $upload = $form->logo->getTransferAdapter();

                    // Lo ideal es que el path lo trajeramos de un archivo de configuracion.
                    $upload->addFilter('Rename', array(
                        'target' => APPLICATION_PATH . '/../public/empresas/imgs/logo_'. $id .' .jpg',
                        'overwrite' => true
                    ));
                    var_dump( $upload->receive() );
                    ...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/03/upload-de-archivos-con-zend-form/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Escalando con Zend Server.</title>
		<link>http://blog.pablo-morales.com/2010/03/escalando-con-zend-server/</link>
		<comments>http://blog.pablo-morales.com/2010/03/escalando-con-zend-server/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 18:07:46 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Optimizing]]></category>
		<category><![CDATA[Scalabillity]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cache php]]></category>
		<category><![CDATA[escalamiento]]></category>
		<category><![CDATA[optimizar php]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[zend debugger]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=606</guid>
		<description><![CDATA[Revisando algunos problemas que tuve hoy con un servidor me volvi a plantear el uso de Zend Server. Zend Server es un administrador para servidor de aplicaciones web siempre que trabajen con PHP. Este nos permite administrar extensiones, logs, extensiones. Ademas viene con Zend Optimizer+, Zend Data Cache, y Zend Debugger. Este producto de la [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/03/escalando-con-zend-server/" data-text="Escalando con Zend Server." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/03/escalando-con-zend-server/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/03/escalando-con-zend-server/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Revisando algunos problemas que tuve hoy con un servidor me volvi a plantear el uso de Zend Server.</p>
<p>Zend Server es un administrador para servidor de aplicaciones web siempre que trabajen con PHP. Este nos permite administrar extensiones, logs, extensiones. Ademas viene con Zend Optimizer+, Zend Data Cache, y Zend Debugger. Este producto de la gente de Zend nos promete manejar una mayor cantidad de usuarios, de datos y codigo.</p>
<p>Dentro de sus principales objetivos es la de proveer una herramienta para escalar y aumentar la performance de nuestro servidor.</p>
<p>En estas diapositivas, la gente de Zend hace una introduccion a Zend Server.</p>
<p><object width="600" height="450"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scalabilityperformancecaching-091022140435-phpapp01&#038;stripped_title=zend-server-a-guided-tour" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scalabilityperformancecaching-091022140435-phpapp01&#038;stripped_title=zend-server-a-guided-tour" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="450"></embed></object></p>
<p>Tambien nos hablan de Performance y Escalabilidad.</p>
<p><object width="600" height="450"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scalabilityperformancecaching-091022140451-phpapp02&#038;stripped_title=zend-server-scalability-performance" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scalabilityperformancecaching-091022140451-phpapp02&#038;stripped_title=zend-server-scalability-performance" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="450"></embed></object></p>
<p>Tambien nos brinda un servicio de Colas.</p>
<p><object width="600" height="450"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=queues-091028151208-phpapp01&#038;stripped_title=task-scheduling-and-asynchronous-processing-evolved-zend-server-job-queue" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=queues-091028151208-phpapp01&#038;stripped_title=task-scheduling-and-asynchronous-processing-evolved-zend-server-job-queue" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="450"></embed></object></p>
<p>Aca nos muestran como hicieron para optimizar magento el software open source para crear tiendas online.</p>
<p><object width="600" height="450"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20090709zend-varien-webinar-performance-optimization-july09-final-confirmed-090715224834-phpapp01&#038;stripped_title=optimizing-magento-performance-with-zend-server" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20090709zend-varien-webinar-performance-optimization-july09-final-confirmed-090715224834-phpapp01&#038;stripped_title=optimizing-magento-performance-with-zend-server" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="450"></embed></object></p>
<p>Instalacion en Debian.</p>
<p><em>$ sudo vim /etc/apt/source.list</em></p>
<p>agregamos la siguiente linea</p>
<p>#Zend Server Respository<br />
deb http://repos.zend.com/zend-server/deb server non-free</p>
<p>Agregamos la clave publica del repositorio</p>
<p><em>$ wget http://repos.zend.com/deb/zend.key -O- | sudo apt-key add -</em></p>
<p>Actualizamos el repositorio</p>
<p><em>$ sudo aptitude update</em></p>
<p>Si queremos instalar php 5.2.x</p>
<p><em>$ sudo aptitude install zend-server-ce-php-5.2</em></p>
<p>Si queremos php 5.3.x</p>
<p><em>$ sudo aptitude install zend-server-ce-php-5.2</em></p>
<p>Cuando termine la instalacion podemos entrar en https://localhost:10082/ZendServer/ o http://localhost:10082/ZendServer/</p>
<p>Despues de completar el formulario de administracion, sino tuvimos ningun problema vamos a ver la siguiente pantalla.</p>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2010/03/Screenshot-Zend-Server-Community-Edition-Mozilla-Firefox.png" rel="thumbnail"><img src="http://blog.pablo-morales.com/wp-content/uploads/2010/03/Screenshot-Zend-Server-Community-Edition-Mozilla-Firefox.png" alt="" title="Screenshot-Zend Server Community Edition - Mozilla Firefox" width="600" height="437" class="aligncenter size-full wp-image-610" /></a></p>
<p>Con estas diapositivas podemos ver un poco las virtudes de Zend Server un producto totalmente gratuito y facil de instalar. Si necesitan soporte tambien, pueden contratarlo, hay planes para todos los gustos.</p>
<p><a rel="nofollow" href="http://www.zend.com/en/products/server/server-whats-new">Zend Server</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/03/escalando-con-zend-server/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Video Tutorial HTML 5</title>
		<link>http://blog.pablo-morales.com/2010/03/video-tutorial-html-5/</link>
		<comments>http://blog.pablo-morales.com/2010/03/video-tutorial-html-5/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 21:03:18 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Html 5]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=601</guid>
		<description><![CDATA[En el ultimo google fest que se realizo en Buenos Aires, la gente de Google, comento varias de las ventajas de HTML 5 y como podriamos aprovechar la geolocalizacion. Todavia no hay mucho soporte para HTML 5, las proximas versiones de los Browsers van a empezar a tener mas sopoprte para las nuevas especificaciones. Armando [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/03/video-tutorial-html-5/" data-text="Video Tutorial HTML 5" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/03/video-tutorial-html-5/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/03/video-tutorial-html-5/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En el ultimo google fest que se realizo en Buenos Aires, la gente de Google, comento varias de las ventajas de HTML 5 y como podriamos aprovechar la geolocalizacion. Todavia no hay mucho soporte para HTML 5, las proximas versiones de los Browsers van a empezar a tener mas sopoprte para las nuevas especificaciones. </p>
<p><a href="http://dupermag.com/">Armando Sosa</a> realizo un video tutorial explicando  claramente que es y cuales son las ventajas de HTML 5 </p>
<p><object width="600" height="450"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9680041&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9680041&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="450"></embed></object>
<p><a href="http://vimeo.com/9680041">HTML5 para principiantes</a> from <a href="http://vimeo.com/user284743">Armando Sosa</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Via Buzz Cesar Casas compartio unos ejemplos de juegos y manipulacion de graficos con html 5, sin la necesidad de Flash. </p>
<p>http://www.benjoffe.com/code/games/torus/</p>
<p>http://29a.ch/jswars/</p>
<p>http://www.kevs3d.co.uk/dev/asteroids/</p>
<p>http://9elements.com/io/projects/html5/canvas/</p>
<p>http://www.benjoffe.com/code/demos/canvascape/textures</p>
<p>http://www.benjoffe.com/code/tools/functions3d/</p>
<p>http://www.benjoffe.com/code/toys/spirograph/</p>
<p>www.benjoffe.com</p>
<p>Al parecer HTML 5 va a traer muchos beneficios, en reduccion del codigo html. Hoy en dia podemos ver youtube con el reproductor de HTML 5, aunque no es tan bonito ni tenga las mismas funcionalidades es una alternativa muy fuerte a los reproductores FLASH.</p>
<p>Hay que prestar atencion en como afectara en el SEO con las etiquetas<br />
<section>
<aside>
<nav>
<article>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/03/video-tutorial-html-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chuleta o Ayuda memoria para iniciarse con Zend Framework</title>
		<link>http://blog.pablo-morales.com/2010/03/chuleta-o-ayuda-memoria-para-iniciarse-con-zend-framework/</link>
		<comments>http://blog.pablo-morales.com/2010/03/chuleta-o-ayuda-memoria-para-iniciarse-con-zend-framework/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 15:22:38 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=596</guid>
		<description><![CDATA[La gente de Dzone( http://www.dzone.com ) hoy subio a su repositorio de refcardz una chuleta o ayuda memoria para iniciarse con Zend Framework, el texto esta en ingles, pero es muy claro. Lo pueden descargar desde la pagina de dzone (http://refcardz.dzone.com/). Se registran y puden acceder al contenido. Aca les dejo la copia para verlo [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/03/chuleta-o-ayuda-memoria-para-iniciarse-con-zend-framework/" data-text="Chuleta o Ayuda memoria para iniciarse con Zend Framework" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/03/chuleta-o-ayuda-memoria-para-iniciarse-con-zend-framework/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/03/chuleta-o-ayuda-memoria-para-iniciarse-con-zend-framework/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>La gente de Dzone( http://www.dzone.com ) hoy subio a su repositorio de refcardz una chuleta o ayuda memoria para iniciarse con Zend Framework, el texto esta en ingles, pero es muy claro.</p>
<p>Lo pueden descargar desde la pagina de dzone (http://refcardz.dzone.com/). Se registran y puden acceder al contenido.</p>
<p>Aca les dejo la copia para verlo online</p>
<p><object id="doc_163299443655438" name="doc_163299443655438" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" ><param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"><param name="wmode" value="opaque"><param name="bgcolor" value="#ffffff"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><param name="FlashVars" value="document_id=27990685&#038;access_key=key-2isupircxcxuy24987or&#038;page=1&#038;viewMode=list"><embed id="doc_163299443655438" name="doc_163299443655438" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=27990685&#038;access_key=key-2isupircxcxuy24987or&#038;page=1&#038;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"></embed></object>	</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/03/chuleta-o-ayuda-memoria-para-iniciarse-con-zend-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Escalando nuestras web – Capitulo 2 “Migracion de meneame a Amazon”.</title>
		<link>http://blog.pablo-morales.com/2010/03/escalando-nuestras-web-%e2%80%93-capitulo-2-%e2%80%9cmigracion-de-meneame-a-amazon%e2%80%9d/</link>
		<comments>http://blog.pablo-morales.com/2010/03/escalando-nuestras-web-%e2%80%93-capitulo-2-%e2%80%9cmigracion-de-meneame-a-amazon%e2%80%9d/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 12:48:50 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[amazon]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[amazon ec2]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[subir a la nube]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=588</guid>
		<description><![CDATA[Estuve teniendo unos problemas con un servidor en produccion, y me ocupo la mayor parte de mi ultimo tiempo, por eso no continue los capitulos de &#8230; &#8220;Escalando nuestras web&#8221;. La verdad que en este tiempo lei mucho sobre todo lo que este relacionado con la nube. Uno de los casos de exito que mas [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/03/escalando-nuestras-web-%e2%80%93-capitulo-2-%e2%80%9cmigracion-de-meneame-a-amazon%e2%80%9d/" data-text="Escalando nuestras web – Capitulo 2 “Migracion de meneame a Amazon”." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/03/escalando-nuestras-web-%e2%80%93-capitulo-2-%e2%80%9cmigracion-de-meneame-a-amazon%e2%80%9d/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/03/escalando-nuestras-web-%e2%80%93-capitulo-2-%e2%80%9cmigracion-de-meneame-a-amazon%e2%80%9d/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Estuve teniendo unos problemas con un servidor en produccion, y me ocupo la mayor parte de mi ultimo tiempo, por eso no continue los capitulos de &#8230; &#8220;Escalando nuestras web&#8221;. La verdad que en este tiempo lei mucho sobre todo lo que este relacionado con la nube. Uno de los casos de exito que mas me intereso fue el de meneame. Como la mayoria debe saber meneame es un servicio de publicacion de noticias, donde los usuarios menean la noticia o no. Mientras mas meneos tenga mejor vista estara la noticia y conseguiras mas visitas a la misma, ademas de aumenta nuestro karma que es la valorisacion en meneame de un usuario. Pero lo que nos importa a nosotros es que es un sitio con muchisimo trafico. El cual su creador y director Ricardo Gallir decidio montar meneame en la nube.</p>
<p>Los videos que vamos a ver a continuacion son unas charlas que dio, donde explica, el porque y como migro a Amazon toda la estructura de meneame, que como nos va a explicar el no es nada sencillo. El audio esta bastante bajo pero el material es de altisima calidad para perderselo, suban lo maximo que puedan el volumen y disfruten de la conferencia.</p>
<p><strong>Parte 1.</strong></p>
<p>En el video van a encontrar una explicacion sobre el contenido estatico muy interesante en el cual Ricardo nos recomienda tener un dominio totalmente diferente para manejar este tipo de contenido, y tambien nos aconseja si vamos a manejar imagenes muy chicas no conviene usar cloudfront para esto porque encarece mucho los costos, y si usar otro servidor tipo lighthttp o nginx que la tienen mas clara con el manejo de contenido de este tipo. Siempre sobre el puerto 80 y no esas locuras de ponerlo en el 8080 que limitan a los usuarios que acceden desde lugares donde tienen restringidos los puertos.</p>
<p>Tambien nos explica bastante bien como funciona EC2 y que son las instancias. Los costos en un monstruo como Meneame y lo compara con los presupuesto que le dieron empresas como arsys.es entre otras.</p>
<p>Presten atencion a la parte que habla sobre escalado vertical y horizontal, y las herramientas que amazon EC2 nos brinda para esto.</p>
<p><object id="utv599478" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="386" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="utv_n_114152" /><param name="flashvars" value="loc=%2F&amp;autoplay=false&amp;vid=4469862" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.ustream.tv/flash/video/4469862" /><embed id="utv599478" type="application/x-shockwave-flash" width="480" height="386" src="http://www.ustream.tv/flash/video/4469862" allowscriptaccess="always" allowfullscreen="true" flashvars="loc=%2F&amp;autoplay=false&amp;vid=4469862" name="utv_n_114152"></embed></object></p>
<p><strong>Parte 2.</strong></p>
<p>En la segunda parte vamos a un ejemplo practico como configurar Amazon EC2 para tener nuestra propia instancia y un sitio corriendo</p>
<p><object id="utv345223" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="386" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="utv_n_93445" /><param name="flashvars" value="loc=%2F&amp;autoplay=false&amp;vid=4467973" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.ustream.tv/flash/video/4467973" /><embed id="utv345223" type="application/x-shockwave-flash" width="480" height="386" src="http://www.ustream.tv/flash/video/4467973" allowscriptaccess="always" allowfullscreen="true" flashvars="loc=%2F&amp;autoplay=false&amp;vid=4467973" name="utv_n_93445"></embed></object></p>
<p>Despues de estas charlas, y algunos comentarios en su blog y en el blog de meneame, Ricardo Gallir practicamente se convirtio en un promotor de Amazon. Tampoco es raro verlo en twitter haciendo comentarios sobre el buen servicio de amazon.</p>
<p>Esta es una opcion que todos deberiamos analizar cuando nuestro trafico requiere recursos que ningun hosting de usd 3 puede ofrecernos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/03/escalando-nuestras-web-%e2%80%93-capitulo-2-%e2%80%9cmigracion-de-meneame-a-amazon%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transacciones Mysql con Zend Framework.</title>
		<link>http://blog.pablo-morales.com/2010/02/transacciones-mysql-con-zend-framework/</link>
		<comments>http://blog.pablo-morales.com/2010/02/transacciones-mysql-con-zend-framework/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 15:40:34 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[base de datos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Mysql Transacciones]]></category>
		<category><![CDATA[Transacciones]]></category>
		<category><![CDATA[Zend Framework y Transacciones]]></category>
		<category><![CDATA[Zend_Db]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=582</guid>
		<description><![CDATA[Una transacción es un conjunto de operaciones en la base que se ejecutan por separadas pero están relacionadas la una con la otra y necesitamos que si se ejecuta una operación se asegure que también lo haga en las operaciones siguientes. En los tipos de tablas transaccionales (InnoDb y DBD ) de MySql, tenemos la [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/02/transacciones-mysql-con-zend-framework/" data-text="Transacciones Mysql con Zend Framework." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/02/transacciones-mysql-con-zend-framework/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/02/transacciones-mysql-con-zend-framework/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Una transacción es un conjunto de operaciones en la base que se<br />
ejecutan por separadas pero están relacionadas la una con la otra y<br />
necesitamos que si se ejecuta una operación se asegure que también lo<br />
haga en las operaciones siguientes.</p>
<p>En los tipos de tablas transaccionales (InnoDb y DBD ) de MySql,<br />
tenemos la opción de determinar cuando hacer un commit, esto nos<br />
permite hacer un rollback en el caso de que no estemos felices con el<br />
resultado de nuestra transacción.</p>
<p>En las tablas del tipo no transaccional (MyIsam) esta opción no<br />
existen porque están seteadas para que se haga un auto commit, esto<br />
significa que no vamos a poder usar transacciones para tablas de Tipo<br />
MyIsam, solo para InnoDb.</p>
<p>Con las tablas InnoDb nosotros podemos controlar cuando hacer el<br />
commit. Podemos revisar que todas las operaciones se hayan realizado<br />
de forma correcta y recién ahí hacer un commit de la transacción.</p>
<p>Con esta forma nosotros nos aseguramos que una operación se ejecute en<br />
su totalidad, e informar al usuario o a quien sea necesario el<br />
resultado de la misma.</p>
<p>La gente de Doctrine en su blog comentan que su ORM aumenta la<br />
velocidad de mysql, ya que ellos manejan transacciones de forma nativa<br />
en todas sus operaciones,<br />
http://www.doctrine-project.org/blog/transactions-and-performance .<br />
Les recomiendo que lean el articulo, aunque esta en ingles es bastante<br />
claro. Quizás el articulo los entusiasme y se metan un poco en el<br />
mundo de los ORM.</p>
<p>Zend Framework como no podía de ser de otra forma tiene soporte para<br />
transacciones. Si tenemos ZF en un sistema con MVC, y tenemos que<br />
hacer una transacción que involucre mas de un modelo, la transacción<br />
la podemos abrir en cualquiera de ellos, y comitearla.</p>
<p>La forma correcta es conseguir el adapter. El cual nos brinda la<br />
interfaz con la conexion a la base de datos. El mismo lo podemos<br />
conseguir llamando al  metodo getAdapter de cualquiera de nuestros<br />
modelos.</p>
<pre lang="php">
class TestController extends Zend_Controller_Action 
{
       public function createAction()
       {
               $params = $this->_getAllParams();
               $model1 = new MyFirstModel();
               $model2 = new MySecondModel();
               //Conseguimos el Adapter de nuestra conexion
               $db = $model1->getAdapter();
               // Iniciamos la transaccion
               $db->beginTransacction();
               try{
                       $model1->insert( $params );
                       $model1->insert( $params );
                       // Sino hubo ningun inconveniente hacemos un commit
                       $db->commit();
               } catch( Exception $e ) {
                       // Si hubo problemas. Enviamos todo marcha atras
                       $db->rollBack;
               }

       }
}
</pre>
<p>En el código de ejemplo podemos ver como recibimos ciertos datos por<br />
POST/GET y los datos los guardamos en dos modelos diferentes, esas<br />
acciones están dentro de un try/catch, el que nos permite atrapar las<br />
excepciones que podrían ser enviada por alguna de las operaciones que<br />
tenemos dentro de la transacción en cuyo caso ejecutamos el rollback.<br />
Si todo salio bien llamamos al metodo commit.</p>
<p>Si nosotros queremos forzar dentro de nuestros modelos un rollback lo<br />
mas transparente es tirar una excepcion, y desde el controller se<br />
ejecuta el rollback. La forma de generar una excepcion es la<br />
siguiente.</p>
<p>Para saber mas de transacciones nada mejor que ir a las fuentes originals.</p>
<p>MySql <a href="http://dev.mysql.com/doc/refman/5.0/es/ansi-diff-transactions.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/es/ansi-diff-transactions.html</a><br />
Zend Framework <a href="http://framework.zend.com/manual/1.10/en/zend.db.adapter.html#zend.db.adapter.transactions" target="_blank">http://framework.zend.com/manual/1.10/en/zend.db.adapter.html#zend.db.adapter.transactions</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/02/transacciones-mysql-con-zend-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ejecutar un resources desde la consola.</title>
		<link>http://blog.pablo-morales.com/2010/02/ejecutar-un-resources-desde-la-consola/</link>
		<comments>http://blog.pablo-morales.com/2010/02/ejecutar-un-resources-desde-la-consola/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 16:39:47 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[Zend_Mail]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=578</guid>
		<description><![CDATA[Si ejecutamos un script desde el shell, y necesitamos ejecutar algún resources en particular, como el de la base de datos. Necesitamos instanciar Zend_Application, y ejecutar los resources que necesitemos. En este ejemplo vamos a ejecutar un script que nos envié por mail los usuarios registrados en el dia. cronSendReport.php defined('APPLICATION_PATH') &#124;&#124; define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); set_include_path(implode(PATH_SEPARATOR, array( APPLICATION_PATH . '/../library', get_include_path(), ))); require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance(); // Iniciamos Zend_Application $application [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/02/ejecutar-un-resources-desde-la-consola/" data-text="Ejecutar un resources desde la consola." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/02/ejecutar-un-resources-desde-la-consola/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/02/ejecutar-un-resources-desde-la-consola/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Si ejecutamos un script desde el shell, y necesitamos ejecutar algún resources en particular, como el de la base de datos. Necesitamos instanciar Zend_Application, y ejecutar los resources que necesitemos.</p>
<div>En este ejemplo vamos a ejecutar un script que nos envié por mail los usuarios registrados en el dia.</div>
<div>
<div>cronSendReport.php</div>
<pre lang="php">

defined('APPLICATION_PATH')  || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
set_include_path(implode(PATH_SEPARATOR, array(
APPLICATION_PATH . '/../library',
get_include_path(),
)));

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

// Iniciamos Zend_Application
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);


// Ejecutamos el resource que trae los datos de conexion.
$bootstrap = $application->getBootstrap();
$bootstrap->bootstrap('db');

$dbAdapter = $bootstrap->getResource('db');

$query = 'SELECT count(*) total from users where date(creation_date) = date(now())'
$row = $dbAdapter->fetchRow( $query );

$mail = new Zend_Mail();
$mail->setBodyText( "Hoy se registraron {$row['total']}" );
$mail->setFrom( "mimail@pablo-morales.com" );
$mail->setSubject( "Reporte de nuevos usuarios" );
$mail->send();


</pre>
<div>La forma de ejecutarlo, es</div>
<div>$ php cronSendReport.php</div>
<div>En el ejemplo solo vemos como se ejecuta uno de los resources, pero podemos ejecutar todos los que necesitemos llamando al método bootstrap de Zend_Application.</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/02/ejecutar-un-resources-desde-la-consola/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Escalando nuestras web &#8211; Capitulo 1 &#8220;Usando servicios de  Colas&#8221;.</title>
		<link>http://blog.pablo-morales.com/2010/02/escalando-nuestras-web-capitulo-1-usando-servicios-de-colas/</link>
		<comments>http://blog.pablo-morales.com/2010/02/escalando-nuestras-web-capitulo-1-usando-servicios-de-colas/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 20:41:55 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[amazon sqs]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[escalando]]></category>
		<category><![CDATA[escalando sistemas web]]></category>
		<category><![CDATA[nube]]></category>
		<category><![CDATA[Sistema de encolamiento]]></category>
		<category><![CDATA[SQS]]></category>
		<category><![CDATA[Teoria de colas]]></category>
		<category><![CDATA[Zend Queue]]></category>
		<category><![CDATA[Zend_Amazon]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=566</guid>
		<description><![CDATA[En esta serie de artículos voy a tratar de explicar como hacer para que nuestros sitios web sean escalables. Trabaje en varios proyectos donde inicialmente eran webs para unos pocos usuarios pero con el tiempo fueron tomando fuerza y hoy tienen grandes cantidades de visitas y consumo de recursos. El problema es que estos sistemas no tuvieron una gran inversión y no están preparado [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2010/02/escalando-nuestras-web-capitulo-1-usando-servicios-de-colas/" data-text="Escalando nuestras web - Capitulo 1 \"Usando servicios de  Colas\"." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2010/02/escalando-nuestras-web-capitulo-1-usando-servicios-de-colas/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2010/02/escalando-nuestras-web-capitulo-1-usando-servicios-de-colas/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En esta serie de artículos voy a tratar de explicar como hacer para que nuestros sitios <span class="misspell">web</span> sean <a id="mnii" title="escalables" href="http://es.wikipedia.org/wiki/Escalabilidad" target="_blank">escalables</a>. Trabaje en varios proyectos donde inicialmente eran <span class="misspell">webs</span> para unos pocos usuarios pero con el tiempo fueron tomando fuerza y hoy tienen grandes cantidades de visitas y consumo de recursos. El problema es que estos sistemas no tuvieron una gran inversión y no están preparado para el consumo que generar.</p>
<p>Esta situación es muy común hoy en dia. En cualquier libro de escalabilidad, o <span class="misspell">web</span>, foros, etc. uno de los puntos mas recurrentes es tratar de que las tareas que no requieran una interacción directa con el usuario se ejecuten en segundo plano. También podríamos agregar que lo ideal es que para ejecutar estas acciones en segundo plano se ejecuten a través de un único proceso, la centralización de estas acciones nos permite migrar a otro servidor el dia de mañana en caso de que sea requerido o si el servidor se  cae y poder retomar las acciones sin procesar una vez que el servidor vuelva, y sin que el usuario se haya enterado de este problema. Para hacer esto vamos a aplicar la <a id="vauo" title="teoria de colas" href="http://es.wikipedia.org/wiki/Teoría_de_colas" target="_blank">teoría de colas</a>.</p>
<p><strong><span class="misspell">Teoria</span> de colas.</strong></p>
<p>La teoría de colas es según la <span class="misspell">wikipedia</span>, el estudio matemático de las lineas de espera. Básicamente se encolan procesos en orden de llegada, cuando la aplicacion libera un proceso toma el que entro después, y así <span class="misspell">sucesivamente</span>. En todos los aspectos de la vida podemos encontrar colas, en el supermercado, cuando vamos a pagar impuestos, cuando vamos a la cancha a ver a Boca, etc.</p>
<div>En nuestro caso, supongamos que tenemos recursos limitados en nuestro hardware y nuestro servidor <span class="misspell">mysql</span> solo atiende 10 conexiones simultaneas, cuando la visita 11 se conecte a la base de datos, el servidor de <span class="misspell">mysql</span> <span class="misspell">hara</span> esperar al proceso hasta que se termine de procesar alguno de los anteriores 10 procesos. En el caso que <span class="misspell">tengamamos</span> muchas mas visitas el cuello de botella seria mas grande, y puede pasar que no podamos alcanzar a procesar todos los pedidos.</div>
<p>La forma ideal de evitar estos cuellos de botella y evitar que el usuario espere <span class="misspell">inecesesariamente</span>, es enviar todos los procesos a una cola, esta cola podría contener un objeto <span class="misspell">serializado</span>, que al correr el proceso que desencole <span class="misspell">deserealizaria</span> el contenido pudiendo ejecutar la acción del usuario, sin que el usuario tenga que esperar a que se desencolen todos los procesos anteriores, o sobrecargar el servidor.</p>
<p>Podemos usar una única cola. O crear una cola para cada tarea diferente. Una cola para el envió de <span class="misspell">mails</span>, otra para subir los comentarios de un producto, otra para procesar visitas en el sitio, etc.</p>
<p><strong>Por que usar Colas.</strong></p>
<p><strong><span style="font-weight: normal;"><br />
</span></strong></p>
<p><strong><a href="http://blog.pablo-morales.com/wp-content/uploads/2010/02/amazon_simple_queue_service.jpg" rel="thumbnail"><img class="aligncenter size-full wp-image-567" title="amazon_simple_queue_service" src="http://blog.pablo-morales.com/wp-content/uploads/2010/02/amazon_simple_queue_service.jpg" alt="amazon_simple_queue_service" width="512" height="332" /></a><br />
</strong></p>
<p><strong><span style="font-weight: normal;">La idea de usar colas es para evitar usar <span class="misspell">insert</span>/<span class="misspell">update</span>/<span class="misspell">delete</span> en la base de datos en tiempo real haciendo al usuario esperar que se termine este proceso antes de mostrarle la pagina cargada para que pueda seguir usando el sitio. Que este encolado no significa que tengamos que esperar 10 minutos para correr un <span class="misspell">cron</span> y ejecutar los cambios estos cambios pueden demorar un minuto o quizás menos. Pero todo varía dependiendo de la velocidad que necesitemos esa información. También podemos evitar el <span class="misspell">cron</span> y correr un <span class="misspell">deamon</span> que ejecute un evento cada vez que recibe un nuevo evento encolado. </span></strong></p>
<p><strong><span style="font-weight: normal;">Lo ideal seria reemplazar todos los <span class="misspell">insert</span>/<span class="misspell">update</span>/<span class="misspell">delete</span> a la base por un envió a una cola x, para ser procesada en segundo plano. Esto a veces no es posible, en este caso podemos ver otras opciones. </span></strong></p>
<p>Las colas simplifican nuestro trabajo. Supongamos que tenemos un proceso que envía <span class="misspell">mails</span>. Este proceso (<span class="misspell">mailer</span>) recibe un <span class="misspell">mail</span> de <span class="misspell">envio</span>, uno de respuesta, un asunto, y mensaje. Con estos datos que recibe el <span class="misspell">mailer</span> <span class="misspell">envia</span> <span class="misspell">mails</span>, sin importar que sea de registro, de recuperación de clave, de aviso que un usuario le envió un correo interno, etc.. Esto hace que un <span class="misspell">unico</span> lugar tengamos la <span class="misspell">logica</span> necesaria para enviar un <span class="misspell">mail</span>.</p>
<p>Supongamos que tenemos 3 servidores en nuestra red. Y solo uno esta configurado para enviar <span class="misspell">mails</span> correctamente usando <span class="misspell">sendmail</span> o <span class="misspell">postfix</span>, da la casualidad que por necesidad el <span class="misspell">frontend</span> del sitio tuvimos que moverlo o inicialmente esta en un servidor diferente. En nuestro caso lo <span class="misspell">unico</span> que tenemos que procurar es instalar el <span class="misspell">mailer</span> en nuestro servidor que si puede enviar <span class="misspell">mail</span>. Sin importar en que servidor esta instalado el <span class="misspell">frontend</span>.</p>
<p>Lo mismo podemos aplicar para diferentes procesos. El calculo de estadísticas del sitio, la carga de datos de nuestro <span class="misspell">backoffice</span>, etc. No tienen porque compartir la misma base, ni el mismo servidor. El proceso de sincronización se puede hacer mediante colas.</p>
<p>Esto nos permite evitar la recarga de la base de datos, cuando la gente de administración necesita saber cuantos usuarios se registraron a las 16:45 del martes anterior, o alguna de esos reportes extraños que a ellos les encanta pedir, y que <span class="misspell">generalmente</span> significan <span class="misspell">querys</span> con un costo altísimo en cuanto a procesos. Procesos que necesitamos libres en nuestro <span class="misspell">frontend</span> para que el usuario navegue sin problemas.</p>
<p><strong>Distintos tipos de colas disponibles para nuestros sistemas <span class="misspell">web</span>.</strong></p>
<div>En la actualidad existen muchas formas de implementar un servicio de cola en el desarrollo <span class="misspell">web</span>, los mas comunes son <a id="f58s" title="ActiveMq de apache" href="http://activemq.apache.org/" target="_blank"><span class="misspell">ActiveMq</span> de apache</a>, <a id="wp9b" title="memcacheq" href="http://memcachedb.org/memcacheq/" target="_blank"><span class="misspell">Memcacheq</span></a>, <a id="olq9" title="gearman" href="http://gearman.org/" target="_blank"><span class="misspell">Gearman</span></a>, etc. <span class="misspell">Tambien</span> <span class="misspell">podriamos</span> usar la base de datos para encolar tareas, pero la verdad es que mientras menos abusemos del motor de la base de datos mejor.</div>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2010/02/apache-activemq-logo.png" rel="thumbnail"><img class="aligncenter size-full wp-image-569" title="apache-activemq-logo" src="http://blog.pablo-morales.com/wp-content/uploads/2010/02/apache-activemq-logo.png" alt="apache-activemq-logo" width="386" height="114" /></a></p>
<div>Un sistema de colas con <span class="misspell">ActiveMq</span> es mas <span class="misspell">rapido</span> que hacer una <span class="misspell">conexion</span> y un <span id="bad_word" class="misspell">insert</span> en la base de datos, y consume menos recursos. <span class="misspell">Despues</span> de todo lo <span class="misspell">unico</span> que hace es abrir un <span class="misspell">socket</span> para recibir un <span class="misspell">string</span>, y guardarlo con un nombre x.</div>
<div>He probado <span class="misspell">Activemq</span> con mucho <span class="misspell">exito</span>, pero actualmente estoy usando el servicio de <a id="f:vr" title="Amazon SQS" href="http://aws.amazon.com/sqs/" target="_blank">Amazon <span class="misspell">SQS</span></a>, el cual esta dentro del abanico de servicios de <a id="nx8-" title="Amazon AWS" href="http://aws.amazon.com/" target="_blank">Amazon <span class="misspell">AWS</span></a>, en <span class="misspell">proximos</span> <span class="misspell">capitulos</span> espero poder hablarles sobre <a id="h7_d" title="Amazon S3" href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a> y <a id="bo2w" title="Amazon cloudfront" href="http://aws.amazon.com/cloudfront/" target="_blank">Amazon <span class="misspell">cloudfront</span></a>.</div>
<div>
<div><strong>Amazon <span class="misspell">SQS</span></strong></div>
<div><strong><span class="misspell"><a href="http://blog.pablo-morales.com/wp-content/uploads/2010/02/amazon_web_services.gif" rel="thumbnail"><img class="aligncenter size-full wp-image-568" title="amazon_web_services" src="http://blog.pablo-morales.com/wp-content/uploads/2010/02/amazon_web_services.gif" alt="amazon_web_services" width="164" height="60" /></a><br />
</span></strong></div>
<div><strong><span style="font-weight: normal;"><br />
</span></strong></div>
<div>Con Amazon <span class="misspell">SQS</span> tenemos nuestro sistema de colas alojado en un servidor de alto rendimiento sin limites de espacio o de procesos a costos <span class="misspell">bajisimos</span>. Muy <span class="misspell">facil</span> de implementar y mucho mas <span class="misspell">facil</span> de usar gracias a <span class="misspell">Zend</span> <span class="misspell">Framework</span>, que trae un componente <span class="misspell">Zend</span>_<span class="misspell">Services</span>_Amazon_<span class="misspell">Sqs</span>, con el cual podemos encolar, desencolar de forma muy <span class="misspell">facil</span>. Por el tema de costo para que se den una idea, yo voy un mes de uso, y no llego a u$d 1 de costo.</div>
</div>
<div><strong>Ejemplo de uso con <span class="misspell">Zend</span>_<span class="misspell">Service</span>_Amazon_<span class="misspell">SQS</span></strong><br />
<strong></strong></div>
<div><strong><br />
</strong></div>
<div>Encolar un tarea.</div>
<pre lang="php">
$key = 'Mi Clave provista por Amazon';

$secretKey = 'Mi Clave Secreta provista por Amazon';

$data = Zend_Json::encode( $objetoAProcesar );
$sqs = new Zend_Service_Amazon_Sqs($key, $secretKey );
$queueUrl = $sqs-&gt;create( 'to_process_message' );
$sqs-&gt;send($queueUrl, $data);</pre>
<p>Desencolar y procesar.</p>
<pre lang="php">
$config = Zend_Registry::get("config");
$sqs = new Zend_Service_Amazon_Sqs($key, $secretKey );
$queues = $sqs-&gt;receive( $queueUrl );
foreach ($queues as $message) {
    // Aca procesamos el mensaje. Si el objeto esta serializado lo deserializamos, y ejecutamos el proceso correspondiente.
    // Si usamos un proceso unico para desencolar todas las colas. No estaria de mas establecer una interfaz para pasar estos objetos.
    $data = Zend_Json::decode( $message );
    print_r($data);
    // Terminado de procesar lo borramos, asi no volvemos a traerlo
    $sqs-&gt;deleteMessage( $queueUrl, $message['handle']);
}
</pre>
<p>Este es un inicio al <span class="misspell">escalamiento</span> de sistemas <span class="misspell">web</span>. En el <span class="misspell">proximo</span> capitulo contenido <span class="misspell">estatico</span> en un dominio y servidor diferente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2010/02/escalando-nuestras-web-capitulo-1-usando-servicios-de-colas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cuidado con los programadores con FrontPage</title>
		<link>http://blog.pablo-morales.com/2009/12/cuidado-con-los-programadores-con-frontpage/</link>
		<comments>http://blog.pablo-morales.com/2009/12/cuidado-con-los-programadores-con-frontpage/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 14:20:58 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[programadores de frontpage]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=548</guid>
		<description><![CDATA[Es común siendo parte de este rubro que al comentar con alguien que te dedicas al desarrollo web, comenten cosas como &#8220;ahhh haces paginitas web&#8220;, &#8220;yo con el dreamweber hice algunas paginas&#8221;. Y la verdad es entendendible viniendo de alguien que desconoce el rubro, pero nosotros tenemos que ser consientes de que es algo mas [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/12/cuidado-con-los-programadores-con-frontpage/" data-text="Cuidado con los programadores con FrontPage" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/12/cuidado-con-los-programadores-con-frontpage/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/12/cuidado-con-los-programadores-con-frontpage/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><!--:es--><img class="alignleft size-full wp-image-549" title="frontpage" src="http://blog.pablo-morales.com/wp-content/uploads/2009/12/frontpage.gif" alt="frontpage" width="120" height="94" /></p>
<p>Es común siendo parte de este rubro que al comentar con alguien que te dedicas al desarrollo <span class="misspell">web</span>, comenten cosas como &#8220;<span class="misspell">ahhh</span> haces <span class="misspell">paginitas</span> <span class="misspell">web</span>&#8220;, &#8220;yo con el <span class="misspell">dreamweber</span> hice algunas paginas&#8221;. Y la verdad es <span class="misspell">entendendible</span> viniendo de alguien que desconoce el rubro, pero nosotros tenemos que ser consientes de que es algo mas que hacer <span class="misspell">paginitas</span>.</p>
<p>Muchas personas alguna vez agarraron el <span class="misspell">frontpage</span> o <span class="misspell">dreamweber</span> e hicieron la pagina de su empresa o la del colegio. Pero esto no es un problema ya que no <span class="misspell">varia</span> mucho de hacer una <span class="misspell">presentacion</span> con el <span class="misspell">Powerpoint</span>, de hecho hay una <span class="misspell">funcion</span> de <span class="misspell">MS</span> <span class="misspell">Word</span> para exportar un documento como <span class="misspell">web</span>. Esto es lo genial de html, es realmente simple.</p>
<p>El problema viene que muchos intentaron hacer sitios un poco mas complejo o con una idea mas amplia que solo dar a conocer una empresa. Muchos intentaron dar servicios a <span class="misspell">traves</span> de la <span class="misspell">web</span>, vender productos, o armar redes sociales, pero siguieron usando el <span class="misspell">frontpage</span> o <span class="misspell">algun</span> editor parecido. Hoy en dia vemos cantidad infinita de estos sitios que se caen a pedazos pero por <span class="misspell">antiguedad</span> por suerte, o vaya a saber porque, tienen un trafico superior a lo que realmente se merece el producto que están mostrando. No hablo solo de una cuestión estética sino un sitio en general, vemos sitios con trafico de 400000 visitas mensuales donde ni siquiera aplicaron uno de las herramientas <span class="misspell">basicas</span> que nos brinda un lenguaje del lado del servidor como <span class="misspell">php</span>, como es la inclusión de partes de nuestra <span class="misspell">web</span> para no tener que repetir el <span class="misspell">header</span>, <span class="misspell">menu</span>, <span class="misspell">footer</span>, etc. Sitios donde cada pagina es toda una <span class="misspell">web</span>, donde el mismo archivo se procesa toda la <span class="misspell">informacion</span> que se va a mostrar, se <span class="misspell">envian</span> <span class="misspell">mails</span> y se genera el html a mostrar. No estoy hablando de aplicar <span class="misspell">MVC</span>, sino un poco de sentido <span class="misspell">comun</span>.</p>
<p>Me <span class="misspell">sorprenderia</span> que <span class="misspell">algun</span> programador con mas de un año de experiencia no haya visto sitios como este que doy como ejemplo.</p>
<p>La verdad es que en mis desarrollos anteriores <span class="misspell">cometi</span> muchos errores (en los actuales <span class="misspell">tambien</span>), pero siempre tuve la <span class="misspell">intencion</span> de hacer lo mejor posible. Siempre busque la forma de mejorar, y veo que esto no le paso a todo el mundo.</p>
<p>El tiempo que estuve en <span class="misspell">Easytech</span> valore siempre las ganas de todos de hacer el mejor desarrollo posible, esto encabezado por los jefes, y seguido de toda la cuadrilla de <span class="misspell">programadores</span>, no había un solo <span class="misspell">eslabon</span> en la cadena de <span class="misspell">produccion</span> que no le interesara hacer el mejor desarrollo. Creo que se lograron grandes cosas y realmente <span class="misspell">aprendi</span> <span class="misspell">muchisimo</span>.<br />
Es importante aunque sea una temporada corta encontrarse con gente de estas <span class="misspell">caracteristicas</span>, porque mas <span class="misspell">alla</span> de que uno tenga mas experiencia que otros, siempre vas a aprender algo nuevo.</p>
<p>La contra cara de <span class="misspell">easytech</span> es <span class="misspell">bothmedia</span>, <span class="misspell">lamentablemente</span> herede un desarrollo de ellos, y dia a dia estoy sufriendo por cada error que encuentro, <span class="misspell">increiblemente</span> el desarrollo no es de los 90, es de ahora, creo que lo terminaron hace 7 u 8 meses, sin embargo es <span class="misspell">increible</span> ver como hay gente que se vende como una <span class="misspell">super</span> consultora internacional, hace desastres. No son mas que diseñadores de <span class="misspell">paginitas</span> <span class="misspell">web</span> con su <span class="misspell">super</span> <span class="misspell">frontpage</span> 2022, que copian y pegan <span class="misspell">codigo</span> de <span class="misspell">phpclasses</span>, o <span class="misspell">hotscripts</span>, ni saben para que sirven, pero esto les sirve para <span class="misspell">considerarse</span> <span class="misspell">programadores</span> <span class="misspell">PHP</span>. No conozco a la gente que esta a cargo de esta consultora, mi intención no es desprestigiar, <span class="misspell">lamentablemente</span> este ultimo mes estuve lidiando con este software, y quizás me volví intolerante con <span class="misspell">bothmedia</span>, pero tengo mis razones.<br />
Creo no exagerar en las criticas como la gente de <a href="http://blog.scriptia.net/articulos/2009/11/vilaweb-y-el-desarrollador-tonto-del-haba.html" target="_blank"><span class="misspell">scriptia</span>.<span class="misspell">net</span></a><br />
Pero devuelta aclaro, todos fuimos novatos, cometimos errores, hicimos DESASTRES, pero siempre a pesar de nuestras <span class="misspell">limitaciones</span> tenemos que buscar perfeccionarnos.</p>
<p>Para mi una forma de perfeccionarme fue usar un <span class="misspell">framework</span>, ser estricto con el estilo de mi <span class="misspell">codigo</span>, ser estructurado en algunos sentidos, y flexibles en otros. Buscar soluciones en la experiencia de otros usuarios, ver un problema y tratar de ver las diferentes <span class="misspell">posibilidades</span>.</p>
<p>Es importante que aprendan a leer <span class="misspell">directamente</span> de la <span class="misspell">documentacion</span> oficial. Leer blogs para aprender sobre la experiencia de otros usuarios. Estar en alguna lista o foro donde se toquen los temas que te interesan. Aprender todos los puestos que involucran el desarrollo <span class="misspell">web</span>, <span class="misspell">Diseno</span>, <span class="misspell">Programacion</span>, <span class="misspell">DBA</span>, <span class="misspell">SysAdmin</span>, esto nos va a dar una amplitud mayor a la hora de plantear una nueva arquitectura. Busquen nuevas herramientas, <span class="misspell">esten</span> al tanto de las novedades. Apoyen el <span class="misspell">Open</span> <span class="misspell">Source</span>, que el les va a retribuir de forma que ni se imaginan.</p>
<p>Bueno es todo, <span class="misspell">sufienciente</span> por hoy, ya me descargue, esa es la magia de tener un blog.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/12/cuidado-con-los-programadores-con-frontpage/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Zend Framework y SEO</title>
		<link>http://blog.pablo-morales.com/2009/12/zend-framework-y-seo/</link>
		<comments>http://blog.pablo-morales.com/2009/12/zend-framework-y-seo/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 20:39:43 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[es zf para seo]]></category>
		<category><![CDATA[seo con zf]]></category>
		<category><![CDATA[Seo y Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=531</guid>
		<description><![CDATA[Me paso muchas veces de hablar con gente que necesitaban un sistema web o una web institucional, y al comentarles que iba a utilizar Zend Framework mucho coincidían en preguntar, si Zend Framework era compatible con SEO. Si bien esta pregunta puede sonar ridícula para la mayoría de los programadores web, es una realidad que [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/12/zend-framework-y-seo/" data-text="Zend Framework y SEO" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/12/zend-framework-y-seo/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/12/zend-framework-y-seo/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Me paso muchas veces de hablar con gente que necesitaban un sistema <span class="misspell">web</span> o una <span class="misspell">web</span> <span class="misspell">institucional</span>, y al comentarles que iba a utilizar <span class="misspell">Zend</span> <span class="misspell">Framework</span> mucho coincidían en preguntar, si <span class="misspell">Zend</span> <span class="misspell">Framework</span> era compatible con SEO.</p>
<p>Si bien esta pregunta puede sonar ridícula para la mayoría de los <span class="misspell">programadores</span> <span class="misspell">web</span>, es una realidad que hay muchas personas que piensan que <span class="misspell">ZF</span> o cualquier <span class="misspell">framework</span> puede llegar a tener problemas con lo que a SEO se refiere.</p>
<p>La respuesta es fácil, si, <span class="misspell">ZF</span> es compatible con SEO, por muchas razones, pero <span class="misspell">principalmente</span> porque el SEO no es afectado por la tecnología que uses del lado del servidor para procesar los pedidos.</p>
<p>Hace un tiempo que estoy siguiendo bastante el tema de SEO, aprendí mucho este ultimo año sobre las manías de los buscadores, y como lograr posicionase mejor. Es un trabajo de hormiga y requiere mucho trabajo de análisis, por mas que nosotros como desarrolladores armemos toda la tecnología necesaria para hacer un buen SEO, todo esto no sirve sin alguien que este encima de lo que buscan o necesitan los usuarios. Es impresionante ver como cambiando alguna palabra en el <span class="misspell">contendio</span> <span class="misspell">url</span>, h1, o <span class="misspell">title</span>, puede variar tanto el resultado de búsqueda. Pero <span class="misspell">centremonos</span> en la parte tecnológica.</p>
<p><span class="misspell">ZF</span> nos brinda muchas herramientas para que podamos implementar un buen SEO en nuestros sistemas <span class="misspell">web</span>. En la <span class="misspell">version</span> 1.8 o 1.9 no recuerdo bien se agrego un <span class="misspell">helper</span> para generar <span class="misspell">sitemaps</span>. Si bien no es ninguna ciencia hacer un <span class="misspell">sitemap</span> de nuestro contenido nunca viene mal una <span class="misspell">ayudita</span> o <span class="misspell">helper</span> <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . También se agrego un <span class="misspell">helper</span> para los <span class="misspell">breadcrumbs</span> <span class="misspell">quie</span> es otro de los eslabones para un buen SEO. Con <span class="misspell">Zend</span>_<span class="misspell">Layout</span> podemos editar <span class="misspell">facilmente</span> nuestros metas y <span class="misspell">title</span>, pudiendo controlar facilmente desde nuestros <span class="misspell">action</span> el valor que van a tener estos en la pagina a mostrar. Pero sin duda uno de los mas importantes es <a id="d5iu" title="Zend_Controller_Route" href="http://framework.zend.com/manual/en/zend.controller.router.html" target="_blank"><span class="misspell">Zend</span>_<span class="misspell">Controller</span>_<span class="misspell">Router</span>,</a> con este componente nosotros podemos <span class="misspell">enrutar</span> todos nuestros <span class="misspell">actions</span>, con <span class="misspell">url</span> mucho mas amistosas y lo mas importante, es <span class="misspell">super</span> <span class="misspell">facil</span> de configurar. No solo rutas <span class="misspell">estaticas</span>, sino <span class="misspell">dinamicas</span>, que varíen dependiendo de algún parámetro que podamos capturar con alguna regular expresión.</p>
<p>Hace poco una familia amiga me <span class="misspell">pidio</span> hacer un sitio con un catalogo de revistas importadas para empezar a captar clientes por <span class="misspell">internet</span> y no depender de la forma tradicional que era distribuyendo revistas a los <span class="misspell">canillitas</span> de Buenos Aires.</p>
<p>Lo particular de esto es que es el <span class="misspell">unico</span> distribuidor de revistas importadas del <span class="misspell">pais</span>, lo que lo hacia bastante atractivo para captar clientes por <span class="misspell">internet</span>. La idea del sitio era bastante <span class="misspell">basica</span>, un catalogo de revistas importadas online, la gente que estaba interesada los llamaba por <span class="misspell">telefeno</span> y se les acerca al <span class="misspell">canillita</span> mas cercano. Pero creo que le dimos una vuelta de rosca mas al sitio <span class="misspell">refinandolo</span> para que realmente sea atractivo para google.</p>
<p><span class="misspell">Todavia</span> hay varias cosas que estamos refinando pero el sitio ya tiene  a unas pocas semanas de estar online suficiente visitas por google para saber que el esfuerzo <span class="misspell">valio</span> la pena.</p>
<p>Los puntos que tuve en cuenta para lograr esto son simples, una <span class="misspell">organizacion</span> clara del contenido por <span class="misspell">categorias</span> un buscador y una forma <span class="misspell">facil</span> y <span class="misspell">rapida</span> de comunicarse con los empleados de la distribuidora. Es importante <span class="misspell">tambine</span> un <span class="misspell">interlinkeado</span> de contenido, por eso en los detalles de las revistas no solo se sugiere otras revistas que <span class="misspell">esten</span> en la misma <span class="misspell">categoria</span> sino <span class="misspell">tambien</span> <span class="misspell">busquedas</span> relacionadas.</p>
<p>Usar un motor de <span class="misspell">busqueda</span> que genere una <span class="misspell">url</span> por cada <span class="misspell">busqueda</span> y hacer que esos <span class="misspell">links</span> sean <span class="misspell">indexables</span> por google es uno de los recursos mas comunes, por eso hoy en dia vemos sitios como ar.emagister.com con mas paginas que <span class="misspell">Taringa</span>. Siendo esto un poco <span class="misspell">ilogico</span> ya que <span class="misspell">taringa</span> tiene miles de usuarios generando contenido e <span class="misspell">emagister</span> argentina unos cuantos data <span class="misspell">entries</span>. Pero este es un recurso totalmente legal, y <span class="misspell">util</span>, ya que no solo generamos mas <span class="misspell">url</span> para nuestro sitio, y mas contenido, sino que <span class="misspell">ademas</span> generamos <span class="misspell">urls</span> con las palabras claves que usan nuestros usuarios para llegar al contenido.</p>
<p>Todo esto no <span class="misspell">tendria</span> sentido si solo <span class="misspell">agregaramos</span> el contenido al <span class="misspell">sitemap</span>, <span class="misspell">tambien</span> es necesario darle fuerza a <span class="misspell">traves</span> del <span class="misspell">interlinkeado</span> como es en el caso que les estoy presentando.</p>
<p>El mundo de SEO es muy interesante debido a los resultados que obtenemos con el. Pero <span class="misspell">tambien</span> nos ayuda a hacer mejores <span class="misspell">web</span>, a veces vamos a sufrir un poco de <span class="misspell">spam</span> en el contenido con <span class="misspell">urls</span> rozando el limite de lo tolerante o h1 que superan el ancho total de una pagina, pero esto seguramente sea penalizado en <span class="misspell">algun</span> momento con mas firmeza por los buscadores, y tengamos una <span class="misspell">web</span> mejor.</p>
<p>Es importante que como <span class="misspell">desarrolladores</span> tengamos en cuenta las mejores practicas para hacer <span class="misspell">web</span> <span class="misspell">semanticas</span> y validas. Con funcionalidades que permitan mayor <span class="misspell">usabilidad</span>.</p>
<p><span class="misspell">Zend</span> <span class="misspell">Framework</span> en cada <span class="misspell">release</span> nos da nuevas <span class="misspell">herramientas</span> para llevar esto a cabo, pero el <span class="misspell">exito</span> que tengamos va a depender de como <span class="misspell">nostros</span> <span class="misspell">implementemos</span> estas <span class="misspell">herramientas</span>.</p>
<p>El sitio que les comentaba es <a href="http://www.revistasimportadas.com" target="_self">http://www.revistasimportadas.com</a> no hace falta mucha perspicacia para darse cuenta que <span class="misspell">tambien</span> el nombre el dominio fue elegido para favorecer el SEO.</p>
<p><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/12/zend-framework-y-seo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pindonga TV, la creatividad en un podcast</title>
		<link>http://blog.pablo-morales.com/2009/12/pindonga-tv-la-creatividad-en-un-podcast/</link>
		<comments>http://blog.pablo-morales.com/2009/12/pindonga-tv-la-creatividad-en-un-podcast/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 19:41:45 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Pindonga tv]]></category>
		<category><![CDATA[podcast de internet]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=527</guid>
		<description><![CDATA[Hace un tiempo atras el unico podcast que veia era Pindonga tv, por alguna razon que nunca me entere dejo de emitir. Hace unos dias mis feeds se llenaron de post que hablaban sobre el regreso de Pindonga. Pindonga TV basciamente es un podcast de actualidad sobre internet. Siempre desde un lado divertido. Y realmente [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/12/pindonga-tv-la-creatividad-en-un-podcast/" data-text="Pindonga TV, la creatividad en un podcast" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/12/pindonga-tv-la-creatividad-en-un-podcast/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/12/pindonga-tv-la-creatividad-en-un-podcast/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><!--:en--></p>
<div class="mceTemp mceIEcenter">
<dl id="attachment_528" class="wp-caption aligncenter" style="width: 360px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-528" title="Pindonga TV" src="http://blog.pablo-morales.com/wp-content/uploads/2009/12/logo.gif" alt="Pindonga TV" width="350" height="100" /></dt>
</dl>
</div>
<p>Hace un tiempo atras el unico podcast que veia era Pindonga tv, por alguna razon que nunca me entere dejo de emitir. Hace unos dias mis feeds se llenaron de post que hablaban sobre el regreso de Pindonga.</p>
<p>Pindonga TV basciamente es un podcast de actualidad sobre internet. Siempre desde un lado divertido. Y realmente siempre se esfuerzan por ser creativos. En este ultimo capitulo subieron un poco mas la apuesta y realmente quedo un producto muy bueno.<br />
El primer capitulo de esta nueva etapa me facino, lo suficiente para escribir una entrada que no tenga relacion con el desarrollo web en este blog.</p>
<p>En este capitulo participan Bloggers famosos, entre ellos Cristian de Maestros del Web,  que ustedes conoceran mejor que yo, pero lo realmente genial es como esta armado, la historia.</p>
<p>Es interesante ver ademas el crecimiento de este genero. Muchos estan trascendiendo los blogs para hacer podcasts, como es el caso de FORAT, un excelente blog taller sobre linux, que ahora tiene podcast, Vacasvolando.com es otro ejemplo, que se hizo famoso cuando contaron &#8220;La verdadera historia de Taringa!&#8221;,  y que hoy en dia tienen varios podcast sobre diferentes temas.</p>
<p>Este es un generemo en crecimiento constante y seguramente este crecimiento seguira de forma exponencial si seguimos encontrando productos de calidad como el de Pindonga.TV.</p>
<p>Viendo el lado tecnologico creo que les falta un poco mas de desarrollo a su web, es demasiado simple. Creo que un poco de trabajo podria mejorar muchisimo la usabilidad.</p>
<p>En cuanto a lo comercial me llamo mucho la atencion no ver publicidad ni nada parecido. Tampoco se esforzaron mucho por el SEO.<br />
Ya veremos con el tiempo como sobreviven este tipo de proyecto.</p>
<p>Vean el video en <a title="Pindonga tv" href="http://www.pindonga.tv/" target="_blank">pindonga.tv</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/12/pindonga-tv-la-creatividad-en-un-podcast/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Cron para Backup y Optimizacion de tablas con PHP + Zend Framework</title>
		<link>http://blog.pablo-morales.com/2009/12/cron-para-backup-optimizacion-tablas-php-zend-framework/</link>
		<comments>http://blog.pablo-morales.com/2009/12/cron-para-backup-optimizacion-tablas-php-zend-framework/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 21:55:24 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[cron backup php zf]]></category>
		<category><![CDATA[Zend_Db]]></category>
		<category><![CDATA[zf en linea de comando]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=518</guid>
		<description><![CDATA[Cron para Backup y Optimizacion de tablas con PHP + Zend Framework Hace mucho no escribía un post, y quiero volver a retomar el habito con este pequeño scripts realizado con Zend Framework para optimizar todas las tablas de una base de datos mysql y además generar un dump por cada tabla, los resultados los [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/12/cron-para-backup-optimizacion-tablas-php-zend-framework/" data-text="Cron para Backup y Optimizacion de tablas con PHP + Zend Framework" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/12/cron-para-backup-optimizacion-tablas-php-zend-framework/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/12/cron-para-backup-optimizacion-tablas-php-zend-framework/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><span class="misspell">Cron</span> para <span class="misspell">Backup</span> y <span class="misspell">Optimizacion</span> de tablas con <span class="misspell">PHP</span> + <span class="misspell">Zend</span> <span class="misspell">Framework</span></p>
<p>Hace mucho no escribía un post, y quiero volver a retomar el habito con este pequeño <span class="misspell">scripts</span> realizado con <span class="misspell">Zend</span> <span class="misspell">Framework</span> para optimizar todas las tablas de una base de datos <span class="misspell">mysql</span> y además generar un <span class="misspell">dump</span> por cada tabla, los resultados los vamos a comprimir para que no ocupe espacio innecesario.</p>
<p>Mantener un <span class="misspell">backup</span> de nuestras tablas es mas que recomendable, uno nunca sabe cuando lo va a necesitar, sobre todo porque es muy fácil implementar un sistema <span class="misspell">automatico</span> para generar <span class="misspell">backups</span> como vamos a ver a <span class="misspell">continuacion</span>.</p>
<p>En este post aunque es corto quiero demostrar que es posible realizar lo siguientes puntos:</p>
<p>1- Correr <span class="misspell">php</span> desde la consola de <span class="misspell">linux</span><br />
2- Correr <span class="misspell">Zend</span> <span class="misspell">Framework</span> desde la consola ( si es posible! ) y usar componentes de <span class="misspell">Zend</span> <span class="misspell">Framework</span> sin la necesidad de usar <span class="misspell">MVC</span>, <span class="misspell">Zend</span>_<span class="misspell">Application</span>.<br />
3- Realizar <span class="misspell">backups</span> diarios de sus base de datos.</p>
<p>1- Correr <span class="misspell">php</span> desde la consola de <span class="misspell">linux</span>.</p>
<p>Esto espero que no sea una ciencia para ninguno, realmente es muy fácil. Creamos un <span class="misspell">scripts</span> antes de los <span class="misspell">tags</span> &lt;?<span class="misspell">php</span> ?&gt; agregamos #!ruta_de_<span class="misspell">php</span> en mi caso seria #!/<span class="misspell">usr</span>/<span class="misspell">bin</span>/<span class="misspell">php</span> con esta linea le decimos a quien llamar para ejecutar el código que viene a continuación.<br />
Un ejemplo simple seria el siguiente.</p>
<pre lang="php">
#!/usr/bin/php
echo "Estoy imprimiendo directamente en la consola";
</pre>
<p>Guardamos el archivo como <span class="misspell">test</span>.<span class="misspell">php</span>, y le damos  permisos de ejecución con el comando</p>
<p>$ <span class="misspell">chmod</span> a+x <span class="misspell">test</span>.<span class="misspell">php</span></p>
<p>Ahora lo ejecutamos</p>
<p>$ ./test.php</p>
<p>El resultado es el siguiente</p>
<div id="gfhp" style="text-align: left;"><img style="width: 621px; height: 90px;" src="http://docs.google.com/File?id=dcz4grwr_137d4mjnpqn_b" alt="" /></div>
<p>2- Correr <span class="misspell">Zend</span> <span class="misspell">Framework</span> desde la consola ( si es posible! ).</p>
<p><span class="misspell">Zend</span> <span class="misspell">Framework</span> mas allá de un montón de herramientas que nos brinda y formas de trabajo. Así como <span class="misspell">Zend</span>_<span class="misspell">Application</span>, Estructura de directorios organizadas, <span class="misspell">MVC</span>, etc <span class="misspell">tambien</span> nos permite usar sus componentes <span class="misspell">individualmente</span>.<br />
Si nosotros <span class="misspell">quisieramos</span> usar <span class="misspell">Zend</span>_<span class="misspell">Db</span>, y todos los beneficios que este trae, solo necesitamos una <span class="misspell">configuracion</span> mínima y listo. Podemos usar <span class="misspell">Zend</span>_<span class="misspell">Db</span> sin usar <span class="misspell">MVC</span> o <span class="misspell">Zend</span>_<span class="misspell">Application</span> y mantener nuestra estructura de directorios.</p>
<p>En este caso voy a usar <span class="misspell">Zend</span>_<span class="misspell">Db</span> para conectarme a una base y conseguir un listado de tablas.</p>
<p>El código es el siguiente.</p>
<pre lang="php">
#!/usr/bin/php

set_include_path( implode( PATH_SEPARATOR, array(
    realpath( 'library' ),
    get_include_path(),
)));

require_once( "library/Zend/Db.php" );
/** Conectamos a la base de datos con ZF */
$db = Zend_Db::factory( 'Pdo_Mysql',
    array(
        'adapterNamespace' => Zend_Db_Adapter,
        'dbname' => 'mysql',
        'host' => 'localhost',
        'username' => 'test',
        'password' => 'qwerty'
    )
);

$db->getConnection();

$rowset = $db->fetchAll( "SHOW TABLES" );

print_r( serialize( $rowset ));
</pre>
<p>Para el ejemplo yo use <span class="misspell">Pdo</span>_<span class="misspell">Mysql</span> pero <span class="misspell">puden</span> usar el <span class="misspell">adapter</span> que quieran. Yo <span class="misspell">serialize</span> el <span class="misspell">array</span> $<span class="misspell">rowset</span> para que sea mas claro en la imagen que se ve a <span class="misspell">continuacion</span> que muestra todas las tablas que tiene la base de datos <span class="misspell">mysql</span>.</p>
<div id="pik:" style="text-align: left;"><img style="width: 648px; height: 182.63px;" src="http://docs.google.com/File?id=dcz4grwr_1387q3svjck_b" alt="" /></div>
<p>3- Incentivar a realizar <span class="misspell">backups</span> diarios de sus base de datos.</p>
<p>Es muy <span class="misspell">comun</span> que una tabla se rompa o alguien cometa <span class="misspell">algun</span> error y se pierdan datos o dañe una tabla o toda una base. Hay mil factores que pueden hacer que necesitemos un <span class="misspell">backup</span> reciente de nuestra base. Si creamos un <span class="misspell">dump</span> entero de nuestra base cuando queramos recuperar una tabla se nos va a complicar un poco realizar esta tarea sin tener que abrir un archivo que vaya a saber cuando miles de mega ocupe. Por eso es conveniente hacer <span class="misspell">backup</span> de las tablas <span class="misspell">individualmente</span>, <span class="misspell">asi</span> en el caso que tengamos problemas con una sola tabla recuperar esa tabla se hace una tarea <span class="misspell">facil</span> .</p>
<p>Hacer un <span class="misspell">script</span> que genere este <span class="misspell">backup</span> diariamente no es complicado, creamos el <span class="misspell">scripts</span>, y <span class="misspell">configuramos</span> el <span class="misspell">cron</span> para que se ejecute a la hora que tengamos la menor cantidad de visitas.</p>
<p>Este <span class="misspell">script</span> esta en <span class="misspell">PHP</span>, en realidad la manera mas <span class="misspell">optima</span> seria hacerlo en <span class="misspell">shell</span> <span class="misspell">scripting</span> pero <span class="misspell">tambien</span> <span class="misspell">queria</span> demostrar los 2 puntos anteriores.</p>
<p>Mi <span class="misspell">script</span> es muy sencillo y es <span class="misspell">facil</span> de entender. Primero trae todas las tablas de la base que estamos usando. Ejecutamos un <a id="pc02" title="nofollow" href="http://dev.mysql.com/doc/refman/5.0/es/optimize-table.html" target="_blank"><span class="misspell">optimize</span></a> para cada tabla, <span class="misspell">inmediatamente</span> generamos un <span class="misspell">backup</span> de esa tabla en una carpeta temporal, cuando terminamos de hacer estas acciones con todas las tablas comprimimos la carpeta y borramos la carpeta <span class="misspell">orginal</span>, para que no ocupe espacio.</p>
<p>Para ejecutar los comandos de <span class="misspell">linux</span> use <a id="spaf" title="noFollow" href="http://php.net/system" target="_blank"><span class="misspell">noFollow</span></a> y no me preocupe mucho en validarlo, cada uno puede buscar la forma de optimizar el <span class="misspell">codigo</span>.</p>
<p>El <span class="misspell">script</span> cuenta con dos <span class="misspell">archvios</span>. Un <span class="misspell">application</span>.<span class="misspell">ini</span> donde guardo toda la <span class="misspell">info</span> de la base de datos</p>
<p><span class="misspell">config</span>/<span class="misspell">application</span>.<span class="misspell">ini</span><br />
[<span class="misspell">db</span>]<br />
<span class="misspell">adapter</span> = <span class="misspell">Pdo</span>_<span class="misspell">Mysql</span><br />
<span class="misspell">params</span>.<span class="misspell">adapterNamespace</span> = <span class="misspell">Zend</span>_<span class="misspell">Db</span>_<span class="misspell">Adapter</span><br />
<span class="misspell">params</span>.<span class="misspell">host</span> = <span class="misspell">localhost</span><br />
<span class="misspell">params</span>.<span class="misspell">username</span> = <span class="misspell">test</span><br />
<span class="misspell">params</span>.<span class="misspell">password</span> = &#8220;<span class="misspell">qwerty</span>&#8221;<br />
<span class="misspell">params</span>.<span class="misspell">dbname</span> = <span class="misspell">mibase</span><br />
<span class="misspell">params</span>.<span class="misspell">port</span> = 3306<br />
params.options.autoQuoteIdentifiers = 0</p>
<p>Y el <span class="misspell">script</span> completo</p>
<pre lang="php">
#!/usr/bin/php
set_time_limit( 0 );
set_include_path( implode( PATH_SEPARATOR, array(
    realpath( 'library' ),
    get_include_path(),
)));

require_once( "library/Zend/Config/Ini.php" );
require_once( "library/Zend/Db.php" );
/** Conectamos a la base de datos con ZF */
$applicationConfig = new Zend_Config_Ini( 'config/application.ini' );
$db = Zend_Db::factory(
    $applicationConfig->db
);
$db->getConnection();

$rootPath = "/home/backup/db/";

$destination = $rootPath . date("Y.m.d") ;

mkdir ( $destination );
$config = $db->getConfig();

$rowset = $db->fetchAll( "SHOW TABLES" );
foreach ( $rowset as $row ){
    /** Optimizamos la tabla */
    $query = "OPTIMIZE TABLE " . $row['Tables_in_' . $config['dbname'] ] ;
    $db->query( $query );
    $path = $destination . "/{$row['Tables_in_' . $config['dbname'] ]}." . date("Y.m.d") . ".sql" ;

    /** Generamos un dump de la tabla */
    system( "mysqldump --opt -u {$config['username']} -p{$config['password']} -h {$config['host']} {$config['dbname']} {$row['Tables_in_' . $config['dbname'] ]} > $path " );
}
/** Comprimimos la carpeta con los dump de la fecha  y borramos la carpeta */
system( "tar zcf {$destination}.tar.gz {$destination}"  );
system( "rm -rf $destination" );

$db->closeConnection();
echo "ndone!nn";

</pre>
<p>Antes de ejecutar el <span class="misspell">script</span> tienen que crear la carpeta /<span class="misspell">home</span>/<span class="misspell">backup</span>/<span class="misspell">db</span> y darle permisos de escritura</p>
<p>$ sudo <span class="misspell">mkdir</span> -p /<span class="misspell">home</span>/<span class="misspell">backup</span>/<span class="misspell">db</span></p>
<p>$ sudo <span class="misspell">chmod</span> -R a+<span class="misspell">rw</span> /<span class="misspell">home</span>/<span class="misspell">backup</span>/<span class="misspell">db</span></p>
<p>lo agregamos  al <span class="misspell">crontab</span> y listo.</p>
<p>$ sudo <span class="misspell">vim</span> /<span class="misspell">var</span>/<span class="misspell">spool</span>/<span class="misspell">cron</span>/<span class="misspell">crontabs</span>/<span class="misspell">root</span></p>
<p>Agregamos la siguiente linea para que se ejecute todos los <span class="misspell">dias</span> a las 2:20 <span class="misspell">am</span><br />
20 2 * * * /var/www/html/scripts/cronOptimize.php &gt; /<span class="misspell">dev</span>/<span class="misspell">null</span> 2&gt; /<span class="misspell">dev</span>/<span class="misspell">null</span></p>
<p>Y listo</p>
<p>Recuerden que tienen que tener instalado <span class="misspell">php</span>5-<span class="misspell">cli</span></p>
<p>$ sudo <span class="misspell">aptitude</span> <span class="misspell">install</span> <span class="misspell">php</span>5-<span class="misspell">cli</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/12/cron-para-backup-optimizacion-tablas-php-zend-framework/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Adapters en Zend Framework.</title>
		<link>http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/</link>
		<comments>http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 20:17:19 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Adapter]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=509</guid>
		<description><![CDATA[Muchos componentes de Zend Framework, utilizan &#8220;Adapters&#8221;, estos adapters corresponden a la implementacion del patron con el mismo nombre Patron Adapter. La idea es simple. Tenemos un componente que hace ciertas cosas. Por ejemplo manejar una base de datos. Este tiene un metodo conectarse(), traerTodo(), traerLosUltimos10(), etc. Nuestro componente nos dice que tenemos estos metodos [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/" data-text="Adapters en Zend Framework." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Muchos componentes de Zend Framework, utilizan &#8220;Adapters&#8221;,  estos adapters corresponden a la implementacion del patron con el mismo nombre Patron Adapter.</p>
<p>La idea es simple. Tenemos un componente que hace ciertas cosas. Por ejemplo manejar una base de datos. Este tiene un metodo conectarse(), traerTodo(), traerLosUltimos10(), etc. Nuestro componente nos dice que tenemos estos metodos disponibles, sin importar el motor de base de datos que utlizemos. Lo unico que requerie es que le pasemos que adapter vamos a usar. Este componente no tiene la logica de como hacer para conectarse a una base, lo unico que hace es llamar al metodo con el mismo nombre del adapter que le pasamos, y hacer funciones comunes en el caso que se necesiten.</p>
<p>La estructura de nuestro</p>
<pre lang="php">
class MyComponent_DB
{
    private $_conn;

    public function __construct()
    {}

    public function traerTodos(iMyAdapter $adapter )
    {
        return $adapter->traerTodos();
    }

    public function conectarse(iMyAdapter $adapter )
    {
        $this->_conn = $adapter->conectarse();
        return true;
    }

    public function traerLosUltimos10(iMyAdapter $adapter )
    {
        return $adapter->traerLosUltimos10(();
    }
}
</pre>
<p>Nuestros adapter tendrian que implementar la siguiente interfaz</p>
<pre lang="php">
interface iMyAdapter
{
    public function traerTodos();
    public function conectarse();
    public function traerLosUltimos10( );
}
</pre>
<p>De esta forma nuestro adapter para mysql tendria la siguiente forma</p>
<pre lang="php">
class MyAdapter implement iMyAdapter
{
    private $_link;
    public function traerTodos()
    {
        // @todo logica de mysql para traer todos los registros de una tabla
    }

    public function conectarse()
    {
        $this->_link = mysql_connect('localhost', 'usuario', 'qwerty');
        mysql_select_db('prueba');
    }

    public function traerLosUltimos10()
    {
        // @todo logica para traer los ultimos10 registros de una tabla
    }
}
</pre>
<p>Podriamos crear la cantidad de adapters que creamos necesarios, para Oracle, para sqlite, etc.</p>
<p>Lo unico que hay que tener en cuenta es que nosotros tenemos que pasarle a la clase MyComponent_DB el adapter que querramos usar.</p>
<p>Cada uno va a contener su propia logica para hacer lo mismo que el resto de los adapters pero a su manera.</p>
<p>Esta misma idea podemos migrarla a otras funcionalidades como la de Autenticar un usuario, administrar roles, paginar, usar js en nuestro codigo, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/10/adapters-en-zend-framework/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Crear certificados para nuestras aplicaciones con Zend Framework</title>
		<link>http://blog.pablo-morales.com/2009/09/crear-certificados-para-nuestras-aplicaciones-con-zend-framework/</link>
		<comments>http://blog.pablo-morales.com/2009/09/crear-certificados-para-nuestras-aplicaciones-con-zend-framework/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 16:11:48 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[SOA]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[mrcrypt]]></category>
		<category><![CDATA[Zend_Filter]]></category>
		<category><![CDATA[Zend_Filter_Decrypt]]></category>
		<category><![CDATA[Zend_Filter_Encrypt]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=503</guid>
		<description><![CDATA[En el proyecto actual en el que estoy trabajando nos topamos con un problema para validar que un usuario solo pueda ver sus datos y/o productos y no los de otro usuario. Este problema se da porque el proyecto actual esta muy orientado a SOA, servicios orientado a la arquitectura, básicamente esto significa subdividir una [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/09/crear-certificados-para-nuestras-aplicaciones-con-zend-framework/" data-text="Crear certificados para nuestras aplicaciones con Zend Framework" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/09/crear-certificados-para-nuestras-aplicaciones-con-zend-framework/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/09/crear-certificados-para-nuestras-aplicaciones-con-zend-framework/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En el proyecto actual en el que estoy trabajando nos topamos con un problema para validar que un usuario solo pueda ver sus datos y/o productos y no los de otro usuario. Este problema se da porque el proyecto actual esta muy orientado a <a id="ce:2" title="SOA" href="http://en.wikipedia.org/wiki/Service-oriented_architecture"><span class="misspell">SOA</span></a>, servicios orientado a la arquitectura, básicamente esto significa subdividir una aplicacion en <span class="misspell">aplicaciones</span> mas chicas, <span class="misspell">generalmente</span> están desacopladas unas de otras, y cada una funciona como un ser independiente. La comunicacion entre ellas es a través de los conocidos <a id="h6i7" title="Web Services" href="http://en.wikipedia.org/wiki/Web_Services"><span class="misspell">Web</span> <span class="misspell">Servic</span></a>es (<span class="misspell">rest</span>, <span class="misspell">xml</span>-<span class="misspell">rpc</span>, <span class="misspell">soap</span>, <span class="misspell">json</span> ).</p>
<div id="jy83" style="text-align: center;">
<div id="k.rr" style="text-align: center;"><img style="width: 320px; height: 377.57px;" src="http://docs.google.com/File?id=dcz4grwr_124fq9qntg3_b" alt="" /></div>
</div>
<p>Una de estas <span class="misspell">aplicaciones</span> es un <a id="am6:" title="Single Sign-on" href="http://es.wikipedia.org/wiki/Single_Sign-On">Single <span class="misspell">Sign</span>-<span class="misspell">on</span></a> el cual administra todo lo referente a los usuarios, sesiones, datos, etc. Otra de las <span class="misspell">aplicaciones</span> es un <span class="misspell">Shopping</span> <span class="misspell">cart</span>, este tiene las ordenes asociadas a un id de usuario, como <span class="misspell">conte</span> antes la idea es que estén lo mas desacopladas posibles, esto es para poder reutilizar estas apis en otros proyectos evitando reescribir código, y con tocar algunos <span class="misspell">items</span> de <span class="misspell">configuracion</span> salga andando.</p>
<p>Si desde una tercera aplicacion quiero traer los <span class="misspell">items</span> agregados por un usuario, debería pedirle al <span class="misspell">shopping</span> <span class="misspell">cart</span> los <span class="misspell">items</span> a partir del id de usuario. Por ejemplo, si la api de <span class="misspell">shopping</span> <span class="misspell">cart</span> tiene la siguiente interfaz.</p>
<pre lang="php">
public getOrder( $userId );
public getItems( $orderId );
public payOrder( $orderId, $method );
</pre>
<p>Si nosotros queremos traer la orden abierta de un usuario enviamos el id del usuario y obtenemos el id de la orden, con el mismo conseguimos los <span class="misspell">items</span>, y porque no pagarlo. Para evitar este problema, tendríamos que validar que el que esta ejecutando estas funciones este <span class="misspell">logueado</span> en el sistema, y no alguien <span class="misspell">aprobechandose</span> de la falta de <span class="misspell">validacion</span>.</p>
<p>La forma <span class="misspell">logica</span> de hacer esto es validar la sesión de usuario, pero como comente antes  esta opción no es posible porque las <span class="misspell">aplicaciones</span> están separadas, pueden llegar a estar en el mismo <span class="misspell">server</span> como puede que no.</p>
<p>Para solucionar esto utilizamos un sistema parecido al de <a id="ljh3" title="Kerberos" href="http://es.wikipedia.org/wiki/Kerberos"><span class="misspell">Kerberos</span></a>,  aprovechando que tenemos un sistema donde centralizamos los usuarios ( el Single <span class="misspell">Sign</span>-<span class="misspell">on</span>), vamos a usarlo para emitir <span class="misspell">certificados</span> que se van a poder utilizar para validar los datos de un usuario.</p>
<p>Este certificado como dijimos lo emite el single <span class="misspell">sign</span>-<span class="misspell">on</span>, el mismo va a viajar <span class="misspell">encriptado</span>, cada aplicacion va a tener conocimiento de como <span class="misspell">desencriptarla</span>.</p>
<p>Cada vez que nosotros busquemos los <span class="misspell">items</span> del <span class="misspell">carrito</span> de compras de un usuario, vamos a hacer la llamada pasando el certificado, el id de usuario, y los parámetros específicos que requiera cada método de la api.</p>
<p>Cuando se <span class="misspell">desencripta</span> el certificado con una cable en la <span class="misspell">configuracion</span> de cada api obtenemos un objeto <span class="misspell">PHP</span> el cual tiene 3 propiedades, <span class="misspell">userId</span>, <span class="misspell">timestamp</span>, y un token. El <span class="misspell">userId</span> sirve para validar que el id de usuario que nos envían es el mismo que el certificado, el <span class="misspell">timestamp</span> es para saber si el certificado sigue vigente o caduco, el token, es solo para que el certificado nunca sea el mismo, y sea difícil interceptarlo.</p>
<p>Aplicando esta solución, la <span class="misspell">interface</span> del <span class="misspell">Shopping</span> <span class="misspell">cart</span> nos quedo así</p>
<pre lang="php">
public getOrder( $userId, $credential );
public getItems( $orderId, $userId, $credential );
public payOrder( $orderId, $method, $userId, $credential );
</pre>
<p>Hay muchos protocolos de <span class="misspell">encriptacion</span> el tema es bastante amplio y hay para todos los gustos. En este caso nosotros nos decidimos por <a id="afil" title="Mrcrypt" href="http://ar.php.net/manual/en/function.mcrypt-cbc.php"><span class="misspell">Mrcrypt</span></a>, esta era la <span class="misspell">opcion</span> mas <span class="misspell">comoda</span>, no solo por que viene por <span class="misspell">default</span> en <span class="misspell">PHP</span>, sino porque <span class="misspell">tambien</span> hay un componente de <span class="misspell">Zend</span> <span class="misspell">Framework</span> que nos deja aprovechar esta <span class="misspell">extension</span>.</p>
<p>Esta <span class="misspell">situacion</span> se pueda dar en varias situaciones, no <span class="misspell">precisamente</span> en este aplicacion en particular, <span class="misspell">tambien</span> se puede aplicar el sistema de clave publica y privada pero hay una <span class="misspell">funcion</span> en <span class="misspell">php</span> para usar <span class="misspell">GnuPG</span> (http://ar.php.net/manual/en/function.gnupg-encrypt.php), no lo <span class="misspell">probe</span> ni investigue mucho, pero si esto no soluciona el problema podemos usarlo desde <span class="misspell">command</span> <span class="misspell">line</span>, en Devzone.zend.com <span class="misspell">encontre</span> este articulo que nos puede ayudar un poco mas http://devzone.zend.com/article/1265</p>
<p>Para <span class="misspell">implemntar</span> esta <span class="misspell">solucion</span> en la aplicacion en la que trabajo use <span class="misspell">Zend</span>_<span class="misspell">Filter</span>, <span class="misspell">basicamente</span> <span class="misspell">Zend</span>_<span class="misspell">Filter</span> toma un valor le aplica ciertas reglas, y devuelve un resultado filtrado por estas reglas, por ejemplo un nombre de usuario tiene que estar en <span class="misspell">minuscula</span>, sin espacios, sin guiones medios ( &#8211; ), para esto nosotros vamos a aplicarle una <span id="bad_word" class="misspell">funcion</span> para que le limpie los espacios en los extremos, le quite los guiones, o caracteres que no queramos, y ejecute un <span class="misspell">strtolower</span> para devolver el <span class="misspell">string</span> en <span class="misspell">minuscula</span>. Todo esto aplica como filtro, a un valor se le puede aplicar mas de un filtro. <span class="misspell">Zend</span>_<span class="misspell">Filter</span> nos da un conjunto de Filtros mas complejos que un simple <span class="misspell">trim</span>(), o <span class="misspell">strtolower</span>.</p>
<p><span class="misspell">Zend</span>_<span class="misspell">Filter</span> nos provee dos filtros que en realidad son uno solo (para saber el porque mirar el <span class="misspell">codigo</span> fuente de <span class="misspell">Zend</span>_<span class="misspell">Filter</span>_<span class="misspell">Decrypt</span> ), <span class="misspell">Zend</span>_<span class="misspell">Filter</span>_<span class="misspell">Decrypt</span> y <span class="misspell">Zend</span>_<span class="misspell">Filter</span>_<span class="misspell">Encrypt</span>.</p>
<p>Estos nos sirven para recibir un <span class="misspell">parametro</span> <span class="misspell">encriptarlo</span>, y <span class="misspell">desencriptarlo</span>.</p>
<p>Es muy sencillo utilizarlo pero tiene algunas cosas que por <span class="misspell">ahi</span> no quedan tan claro. Para este caso yo use <span class="misspell">mrcrypt</span> y aproveche el <span class="misspell">adapter</span> de <span class="misspell">Mrcrypt</span> que esta para este filtro. Al usar un <span class="misspell">adapter</span> obtenemos un <span class="misspell">monton</span> de propiedades que en el caso de no  agregar el <span class="misspell">adapter</span> <span class="misspell">tendriamos</span> que <span class="misspell">completarlas</span> nosotros mismos una por una. El problema con el que nos encontramos es que si o si necesitamos pasar el <span class="misspell">adapter</span>, y el vector, el vector <span class="misspell">basicamente</span> es la cantidad de bytes que va a tener cada bloque de <span class="misspell">encriptacion</span> (para mas leer la wiki), este <span class="misspell">parametro</span> es obligatorio, porque sino lo ingresamos usa un valor <span class="misspell">random</span>, y seria imposible <span class="misspell">desencriptarlo</span> sin la cantidad exacta de bytes por bloque. No <span class="misspell">entendi</span> porque la gente de <span class="misspell">Zend</span> no incluyo un valor <span class="misspell">default</span> para los vectores pero alguna <span class="misspell">razon</span> <span class="misspell">tendran</span>.</p>
<p>En el ejemplo que vamos a ver a <span class="misspell">continuacion</span>, se crea un objeto con ciertas propiedades, lo <span class="misspell">serializamos</span>, lo <span class="misspell">encriptamos</span>, lo pasamos a base64, para que podamos enviarlo <span class="misspell">via</span> <span class="misspell">get</span> a otros sistemas.</p>
<pre lang="php">

$obj = new stdClass();
$obj->userId = 12;
$obj->timestamp = time();
$obj->token = sha1(uniqueid(mt_rand(),true);

$objSerialized = serialize( $obj );

$encrypt = new Zend_Filter_Encrypt(
    array(
        'adapter' => 'mrcrypt'
        , 'vector' => '12345678'
    )
);

//Aplicamos el filtro a nuestro objeto serializado, esto nos devuelve un binario encryptado
$objEncrypted = $encrypt->filter( $objSerialized );

//Convertimos el binario en algo que podamos usar mas facilmente
$credential = base64_encode( $objEncrypted );

?>

</pre>
<p>El valor que obtenemos de esta <span class="misspell">operacion</span> va a ser nuestro certificado.</p>
<p>Cuando queramos <span class="misspell">desencriptarlo</span> el <span class="misspell">codigo</span> que tenemos que aplicar a nuestro <span class="misspell">certifiado</span> es el siguiente</p>
<pre lang="php">
$encrypt = new Zend_Filter_Decrypt(
    array(
        'adapter' => 'mrcrypt'
        , 'vector' => '12345678'
    )
);
$objEncrypted = base64_decode( $credential);
$objSerialized = $encrypt->filter( $objEncrypted );
$obj = unserialize( $objSerialized );

/* ahora mostramos nuestro objeto desencriptado y desserializado */

Zend_Debug::dump( $obj );
</pre>
<p><span class="misspell">Ademas</span> de obtener el objeto <span class="misspell">deseariliazado</span> ahora nos toca validar la credencial, para esto con el objeto <span class="misspell">deserealizado</span> comparamos si el <span class="misspell">userId</span> que nos llega es el mismo que en la credencial, y si la fecha es cercana al <span class="misspell">timestamp</span> que tiene la credencial. Como <span class="misspell">parametro</span> <span class="misspell">exta</span> mis <span class="misspell">credenciales</span> tienen un <span class="misspell">timestamp</span> y <span class="misspell">timelife</span>, que me dice cuanto puede vivir un certificado.</p>
<p>A <span class="misspell">Zend</span>_<span class="misspell">Filter</span>_<span class="misspell">Decrypt</span> y  <span class="misspell">Zend</span>_<span class="misspell">Filter</span>_<span class="misspell">Encrypt</span> podemos agregarle un <span class="misspell">salt</span> que va a darle mas seguridad a nuestros <span class="misspell">certificados</span>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/09/crear-certificados-para-nuestras-aplicaciones-con-zend-framework/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Auto audita tus sitios webs.</title>
		<link>http://blog.pablo-morales.com/2009/04/auto-audita-tus-sitios-webs/</link>
		<comments>http://blog.pablo-morales.com/2009/04/auto-audita-tus-sitios-webs/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 23:04:53 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=481</guid>
		<description><![CDATA[Con la gente del grupo Web &#38; Beer armamos un checklist de los puntos importantes con los que debería cumplir una web antes de salir a producción. Estos puntos que se van a mencionar son importante en cualquier desarrollo web, y contempla la mayoría de los problemas. Es importante que chequeen estos puntos en sus [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/04/auto-audita-tus-sitios-webs/" data-text="Auto audita tus sitios webs." data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/04/auto-audita-tus-sitios-webs/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/04/auto-audita-tus-sitios-webs/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><a href="http://blog.pablo-morales.com/wp-content/uploads/2009/04/audita_tu_web.jpg" rel="thumbnail"><img class="aligncenter size-full wp-image-482" title="audita_tu_web" src="http://blog.pablo-morales.com/wp-content/uploads/2009/04/audita_tu_web.jpg" alt="audita_tu_web" width="300" height="300" /></a></p>
<p>Con la gente del <a title="Web and beer" href="http://groups.google.com/group/webandbeer">grupo <span class="misspell">Web</span> &amp; <span class="misspell">Beer</span></a> armamos un <span class="misspell">checklist</span> de los puntos importantes con los que debería cumplir una <span class="misspell">web</span> antes de salir a producción. Estos puntos que se van a mencionar son importante en cualquier desarrollo <span class="misspell">web</span>, y contempla la mayoría de los problemas. Es importante que chequeen estos puntos en sus desarrollos actuales, y traten de evitar tener problemas con los nuevos sistemas que vendrán.</p>
<p><strong>- Validar formularios y entrada de datos desde el lado del cliente y desde el lado del servidor. </strong><br />
Este punto es uno de los mas importantes, muchos programadores validan los datos desde uno de los dos lados, o del cliente o del servidor. La idea es que siempre se validen los dos. Se podría obviar la validación<img class="alignright size-full wp-image-483" title="login_valid" src="http://blog.pablo-morales.com/wp-content/uploads/2009/04/login_valid.png" alt="login_valid" width="274" height="182" /> del lado del cliente, pero nunca del lado del servidor, nosotros tenemos que saber que datos y de que tipo son los que entran en nuestro sistema. Para eso tenemos que comprobar si es alfanumérico, si es numérico, si es un <span class="misspell">mail</span>, etc. No hay conformarse solo con validar los datos desde <span class="misspell">javascripts</span>, ya que esto puede ser filtrado. La <span class="misspell">validacion</span> del lado del cliente sirve para que no hagamos esperar al usuario mientras se procesan los datos en el servidor, sino escribió un dato en un campo obligatorio no lo dejamos enviar el formulario. Con un simple <span class="misspell">plugin</span> de <span class="misspell">firefox</span> puedo cambiar los datos que se envían por post agregando lo necesario para hacer un <span class="misspell">sql</span> <span class="misspell">injection</span>. Hay que <span class="misspell">chquear</span> que la cantidad de caracteres que pueda ingresar sea igual o menor que la capacidad del campo que va a guardar este dato en la base de datos.</p>
<p><strong>- Validar Claves y nombre de usuarios de los usuarios del sistema. </strong><br />
Los usuarios no pueden tener claves de 2 o 3 letras, tienen que tener claves seguras o por lo menos lo mayor posible, deberíamos asegurarnos que una clave sea de por lo menos 5 caracteres y no sea igual que el usuario, o no permitir secuencias de números o 5 datos repetidos como 55555, no estaría mal validar que los usuarios no ingresen claves que <span class="misspell">esten</span> dentro de las claves mas comunes, como <span class="misspell">qwerty</span>, 123456, dios!, <span class="misspell">miclave</span>, <span class="misspell">password</span>, etc. Esto es para darle cierta seguridad a nuestro sistemas y evitar casos de <span class="misspell">phishing</span>. Otra cosa que veo muy seguido es que muchos validan que la clave sea alfanumérica, pero si quiero poner una clave del estilo <span class="misspell">ph</span>1s#u!r no podría. Se debería permitir este tipo de claves ya que es mucho mas segura que una alfanumérica. Lo mismo con los usuarios, <span class="misspell">minimamente</span> tienen que tener 5 caracteres y en lo posible alfanuméricos. Estoy viendo cada vez mas seguido <span class="misspell">web</span> que usan los <span class="misspell">mails</span> como nombre de usuario.</p>
<p><strong>- <span class="misspell">Encoding</span>. </strong><br />
Este tema es muy <span class="misspell">problematico</span>, quien no ha tenido problemas con este punto?. Tenemos que ser <span class="misspell">homogeneos</span> y elegir siempre el mismo <span class="misspell">encodi</span><a href="http://blog.pablo-morales.com/wp-content/uploads/2009/04/i-will-not-assume-untrusted-data-is-valid-utf-8.png" rel="thumbnail"><img class="alignleft size-medium wp-image-484" title="i-will-not-assume-untrusted-data-is-valid-utf-8" src="http://blog.pablo-morales.com/wp-content/uploads/2009/04/i-will-not-assume-untrusted-data-is-valid-utf-8-300x188.png" alt="i-will-not-assume-untrusted-data-is-valid-utf-8" width="300" height="188" /></a><span class="misspell">gn</span>, el ideal es <span class="misspell">utf</span>-8 ya que es con el que trabajan los servidores <span class="misspell">unix</span> donde estarán alojados la mayoría de los sistemas <span class="misspell">web</span>. Hay que revisar que los archivos que usemos, y las cabeceras de los <span class="misspell">xhtml</span> que estén en <span class="misspell">utf</span>-8, también tenemos que asegurarnos que nuestra base de datos este guardando los datos en <span class="misspell">utf</span>-8.</p>
<p><br/><br/><br />
<strong>- Paginas de errores. </strong><br />
Cuando alguien intenta acceder a una <span class="misspell">url</span> de nuestro dominio que no corresponde a ninguna pagina activa, deberíamos mostrar un error personalizado de 404 y agregar <span class="misspell">links</span> que lo dirijan a la <span class="misspell">home</span> de nuestra <span class="misspell">web</span> o a un buscador de contenidos.</p>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2009/04/404.jpg" rel="thumbnail"><img class="aligncenter size-medium wp-image-485" title="404" src="http://blog.pablo-morales.com/wp-content/uploads/2009/04/404-300x243.jpg" alt="404" width="214" height="174" /></a></p>
<p><strong>- <span class="misspell">Cross</span> <span class="misspell">Browser</span>.</strong><br />
El gran dolor de cabeza de cualquier desarrollador. Esto es algo muy difícil de lograr ya que muchos navegadores implementan su propio estándar y no siguen el de la w3c, <span class="misspell">digase</span> <span class="misspell">ie</span>6, <span class="misspell">ie</span>7, <span class="misspell">ie</span>8. Pero también hay que saber que los navegadores interpretan algunas cosas de forma diferente por eso es ideal probarlo en distintos <span class="misspell">browsers</span> para que no se rompa el diseño.</p>
<p>Es probable que tengas que usar <a title="google search" href="http://www.google.com.ar/search?q=css+hack&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a"><span class="misspell">Css</span> <span class="misspell">Hack</span></a> para que tu sitio sea <span class="misspell">cross</span> <span class="misspell">browser</span></p>
<p>Puedes usar <a title="Browse shots" href="http://browsershots.org/"><span class="misspell">Browsershots</span></a> para ver una <span class="misspell">screenshot</span> de tu <span class="misspell">web</span> en diferentes navegadores</p>
<p><strong>- Evitar archivos de <span class="misspell">configuracion</span> dentro del <span class="misspell">webroot</span>.<br />
</strong><br />
Este es otro de los puntos de seguridad grave que podemos llegar a tener.  Los archivos de <span class="misspell">configuracion</span> que tiene los datos de acceso a la base de datos o accesos a <span class="misspell">web</span> <span class="misspell">services</span> tienen que estar fuera del <span class="misspell">webroot</span> de nuestro sitio.</p>
<p>Estos son aspectos generales, pero ahora vamos a hablar de algunos puntos en cuanto a la accesibilidad y el SEO.</p>
<p><strong>- <span class="misspell">Sitemap</span>. </strong><br />
Es importante que si quieren que su sitio sea indexado por los buscadores tengas un <span class="misspell">sitemap</span>, y den de alta el mismo en estos buscadores. Dice la leyenda que si tu <span class="misspell">sitemap</span> tiene el nombre <span class="misspell">sitemap</span>.<span class="misspell">xml</span>, google lo indexa mejor que si fuese <span class="misspell">sitemap</span>.<span class="misspell">php</span> o cualquier otro nombre.</p>
<p><a title="Sitemap" href="http://en.wikipedia.org/wiki/Site_map">Wikipedia</a></p>
<p><strong>- <span class="misspell">Imagenes</span>. </strong><br />
Las <span class="misspell">imagenes</span> son un ingreso de visitas importantes si se usan <span class="misspell">adecuadamentes</span>. Hay dos puntos necesario para manejar las <span class="misspell">imagenes</span> y conseguir visitas con ellas, tener un <span class="misspell">alt</span> con la descripción de la imagen, y que el nombre del archivo haga una descripción del mismo, por ejemplo <span class="misspell">cristina</span>_<span class="misspell">kirchner</span>_en_la_rosada.<span class="misspell">jpg</span>, si se fijan cuando ustedes buscan una imagen en <a title="google images" href="http://images.google.com">Google <span class="misspell">Images</span></a> se van a dar cuenta que usan estos dos criterios para la búsqueda.</p>
<p><strong>- Paginas internas</strong></p>
<p>Cada pagina que tenga nuestro sistema debería tener la descripción de esta en la <span class="misspell">url</span>. Esto se llama <span class="misspell">clean</span> <span class="misspell">urls</span>, y se ve mucho en los <span class="misspell">cms</span>, que nos permiten que el acceso a una pagina en vez de ser http://dominio.com/noticia/index.php?newsId=342 se convierta en http://dominio.com/noticia/newsId/342/ esto es mas claro que lo que vimos en el ejemplo anterior, perotambién podríamos mejorarlo mucho mas si nuestra  <span class="misspell">url</span> luciera así http://dominio.com/news/342_cristina_aumenta_sueldo_a_los_jubilados.html. Google indexa mejor los contenidos donde su <span class="misspell">url</span> describe el contenido que va a mostrar. Esto es <span class="misspell">facil</span> de solucionar agregando alias a nuestras paginas, o creando alguna regla de <span class="misspell">rewrite</span> que maneje este problema, los que usen <span class="misspell">ZF</span> pueden usar <span class="misspell">Zend</span>_<span class="misspell">Route</span> , pero siempre seria mas <span class="misspell">optimo</span> que lo hagan desde .<span class="misspell">htaccess</span>.</p>
<p>Si tu sitio tiene bajo control estos puntos te invito que revises <a title="Web and beer checklist" href="http://spreadsheets.google.com/pub?key=pr2E8Ps448oS9Clet9pO_Dg">los otros puntos creados por la gente de <span class="misspell">Web</span> &amp; <span class="misspell">Beer</span></a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/04/auto-audita-tus-sitios-webs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integracion entre sistemas web</title>
		<link>http://blog.pablo-morales.com/2009/04/integracion-entre-sistemas-web/</link>
		<comments>http://blog.pablo-morales.com/2009/04/integracion-entre-sistemas-web/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 04:16:37 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[varios]]></category>
		<category><![CDATA[google account]]></category>
		<category><![CDATA[Integracion de sistemas]]></category>
		<category><![CDATA[login compartido]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=439</guid>
		<description><![CDATA[Actualmente una empresa no solo tiene una web institucional, sino que muchas veces ofrecen servicios a través de esta y/o manejan una intranet/extranet y esto genera que tenga muchas aplicaciones con diferentes sistemas de usuarios, e información duplicada. Pero como estructurar una aplicacion donde van a convivir varios tipos de usuarios en una misma estructura [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/04/integracion-entre-sistemas-web/" data-text="Integracion entre sistemas web" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/04/integracion-entre-sistemas-web/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/04/integracion-entre-sistemas-web/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Actualmente una empresa no solo tiene una <span class="misspell">web</span> institucional, sino que muchas veces ofrecen servicios a través de esta y/o manejan una <span class="misspell">intranet</span>/<span class="misspell">extranet</span> y esto genera que tenga muchas aplicaciones con diferentes sistemas de usuarios, e información duplicada.</p>
<p><a href="http://blog.pablo-morales.com/wp-content/uploads/2009/04/integration1.jpg" rel="thumbnail"><img class="aligncenter size-full wp-image-476" title="Integracion entre sistemas web" src="http://blog.pablo-morales.com/wp-content/uploads/2009/04/integration1.jpg" alt="Integracion entre sistemas web" width="400" height="288" /></a></p>
<p>Pero como estructurar una aplicacion donde van a convivir varios tipos de usuarios en una misma estructura sin generar conflic</p>
<p>tos ?.</p>
<p>Lo que voy a plantear en este articulo es una estructura genérica para un problema especifico.</p>
<p>El problema es la unión de todas o casi todas las aplicaciones de una empresa que presta servicios online donde se unifique el flujo de la información.</p>
<p>Una empresa que tienen 5 aplicaciones no necesariamente tiene que tener toda su información repartida en 5 base de datos <span class="misspell">diferenntes</span> Pueden llegar a compartir la misma base, o tener una base donde se unifica cierta información compartida. O si,  tener diferentes bases para cada subsistema, pero compartir la información común a través de los mismos sistemas sin la necesidad de duplicar una interfaz para administrar esa <span class="misspell">informacion</span> o peor aun duplicar información corriendo el riesgo de generar una inconsistencia de datos.</p>
<p>Recuerdo mis tiempos en la <a title="Universidad Catolica Argentina" href="http://www.uca.edu.ar/index.php/home/index/es"><span class="misspell">UCA</span></a> donde cada departamento tenia aplicaciones diferentes, desarrolladas independientemente por diferentes personas o grupos, sin una integracion clara entre ellas. Estoy seguro que hasta el día de hoy los alumnos se deben quejar porque tienen que loguearse con diferentes usuarios y claves, para distintos servicios que supuestamente están alojados en el mismo lugar.</p>
<p>Pero este no es solo el problema de una <span class="misspell">institucion</span> con la embergadura de una empresa con mas de 10000 empleados. Este problema puede ocurrir en cualquier ámbito, hasta en una <span class="misspell">pymes</span>, donde cuenta con dos o tres sistemas que son independientes entre si.</p>
<p>Los sistemas o subsistemas pueden relacionarse de manera muy fácil, y esto generalmente va a requerir menos horas de desarrollo que aplicaciones totalmente independientes, teniendo en cuenta que siempre habrá que administrar módulos de forma independientes.</p>
<p>Tengo que volver a mencionar la posibilidad de un servidor de usuarios, pero no crean que por referirme a algo como un servidor, implique costo de hardware y mantenimiento, esto puede estar alojado en una <span class="misspell">pc</span> cualquiera compartiendo espacio con el resto de los sistemas. Un servidor de usuarios me parece la implementación perfecta, porque cada sistema siempre va a tener independencia a través de su dominio, pero va a evitar el <span class="misspell">re</span> ingreso de creación de usuarios, permisos, y logueos, para un usuario con acceso a varios de los subsistemas.</p>
<p>Voy a dar un ejemplo simple, un programador de la empresa Zeta, cuando ingresa a trabajar se loguea en el sistema de ticket de su empresa para ver que cosas están pendientes. Luego de terminadas, se loguea en el sistema de horas, para cargar las horas trabajadas durante el día, al final del día decide agregar una entrada al blog de la empresa explicando uno de los descubrimientos que hizo.</p>
<p>Esto genero que el usuario tenga que tener cuenta en los 3 sistemas con los que trabajo, y no solo tener una cuenta sino que además se tiene que loguear en las tres.</p>
<p>Esto por <span class="misspell">ahi</span> si hablamos de un programador no es problema porque esta acostumbrado. Pero supongamos que es un cliente que tiene su sitio <span class="misspell">web</span> de ventas de remeras, y necesita revisar en el panel de administración si están al día las ultimas promociones que publicito,  revisar el trafico de visitas o de ventas del mes en el sistema de estadísticas del sitio, después revisar si entraron nuevos productos al <span class="misspell">tracker</span> para poder procesarlos y despacharlos. No solo eso después va a querer agregar un ticket al sistema de ticket de la empresa Zeta porque uno de los módulos necesita una funcionalidad nueva. Y otro vez se va a loguear en el sistema de horas, para saber si <span class="misspell">todavia</span> cuenta con horas disponibles dentro de su paquete mensual o necesita comprar mas.</p>
<p>Ahora el tema es mas complicado porque el tedioso trabajo de loguearse en cada aplicacion no lo hace el empleado que no le llega a molestar, sino lo hace un ejecutivo o un comerciante que no necesariamente se tiene que acordar de sus 20 claves, para los diferentes sitios. O peor aun tiene que usar claves muy simples para no olvidárselas o una única clave repetida.</p>
<p>Y esto es lo que se ve de afuera, porque por dentro seguramente tengamos un sitio <span class="misspell">web</span> desarrollado con <span class="misspell">drupal</span> con su base de datos <span class="misspell">MySql</span>, un sistema de estadísticas hecho con alguna herramienta de reportes, un sistema de <span class="misspell">tracking</span> desarrollado por nosotros al igual que el sistema de horas, y  el <span class="misspell">Trac</span> o <span class="misspell">Mantis</span> para administrar ticket.</p>
<p>Todos estos sistemas con Base de datos diferentes y datos duplicados, cada uno con su sistema de administración, donde damos de alta a los usuarios y sus permisos.</p>
<p>Todo esto se puede <span class="misspell">simplicar</span> de sobre manera con un sistema de usuarios integrados. <a id="bmcw" title="En otro articulo ya mencionamos teóricamente como crear esto," href="../2008/11/mantener-la-sesion-entre-dominios-diferentes/">En otro articulo ya mencionamos teóricamente como crear esto,</a> quizás me inspire y suba algún código que haga esto para evitar que pierdan tiempo pensando como hacerlo.</p>
<p>Le doy una extremada importancia al tema usuarios porque lo veo con Clientes que se quejan de esa falta de integracion y se que es molesto para ellos y se podría solucionar de forma muy fácil. Pero también podemos ver el tema de reportes.</p>
<p>No necesariamente para generar reportes hay que duplicar los datos de otras bases, de hecho este ejercicio a veces consumo muchos recursos que no queremos desaprovechar. Podemos reutilizar la base en el mejor de los casos o buscar otras medidas.</p>
<p>Un punto interesante es  que nosotros podemos usar aplicaciones <span class="misspell">pre</span>-armadas como <span class="misspell">Drupal</span>, <span class="misspell">trac</span>, <span class="misspell">PHP</span> <span class="misspell">Report</span>, etc  y con algunos ajustes adaptarlas a nuestro sistema de integracion de usuarios. Cada sistema implementa su propia forma de autenticación pero nosotros podemos tomarnos el trabajo de mirar 15 minutos para ver como funciona su sistema de <span class="misspell">loguin</span> e integrarlo en nuestro servidor de usuarios. El caso de <span class="misspell">Drupal</span> es mucho mas simple ya que cuenta con un <span class="misspell">webservice</span> para <span class="misspell">administracion</span> de usuarios entre ellos el login y <span class="misspell">logout</span>.</p>
<p>Escribir esto medio ganas de armar el sistema de usuarios y compartirlo para que vean lo fácil que se puede integrar.</p>
<p>Otro punto a destacar es que podemos interconectar nuestros sistemas a través de <span class="misspell">webservices</span> sin la necesidad de que compartan la misma <span class="misspell">conexion</span> de base de datos. O el mismo servidor.</p>
<p>Espero ver mas sistemas integrados después de esto. Quizás <span class="misspell">algun</span> <span class="misspell">dia</span>, pueda entrar a mi <span class="misspell">pc</span>, abrir el navegador <span class="misspell">loguearme</span> en una pagina X y acceder a todas mis <span class="misspell">web</span> <span class="misspell">autenticandome</span> <span class="misspell">unicamente</span> en la pagina X, <span class="misspell">quizas</span> el <span class="misspell">openId</span> logre esto. Veremos, mientras tanto voy a seguir usando el administrador de cuentas de <span class="misspell">firefox</span> (cuidado que este guarda la clave de forma <span class="misspell">plain</span> en el <span class="misspell">filesystem</span> ).</p>
<p><span class="misspell">PHP</span> <span class="misspell">Report</span> <span class="misspell">Maker</span> ( http://www.hkvstore.com/phpreportmaker/ )<br />
<span class="misspell">Drupal</span> (http://drupal.org)<br />
<span class="misspell">Mantis</span> ( http://www.mantisbt.org/ )<br />
<span class="misspell">Trac</span> ( http://trac.edgewall.org/ )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/04/integracion-entre-sistemas-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jugando con Zend Server</title>
		<link>http://blog.pablo-morales.com/2009/03/playing-with-zend-serverjugando-con-zend-server/</link>
		<comments>http://blog.pablo-morales.com/2009/03/playing-with-zend-serverjugando-con-zend-server/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 16:14:33 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=467</guid>
		<description><![CDATA[Me decidi probar la nueva estella de Zend, Zend Server. Basicamente es un entorno de administracion para servidores web, las caracteristicas principales son la administracion de los archivos de configuracion, monitoreo de nuestros logs,monitoreo de aplicaciones, y promete un entorno seguro. Todo esto dentro de una interface Web que de hecho es bastante agradable. Tambien [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/03/playing-with-zend-serverjugando-con-zend-server/" data-text="Jugando con Zend Server" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/03/playing-with-zend-serverjugando-con-zend-server/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/03/playing-with-zend-serverjugando-con-zend-server/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><img class="aligncenter size-full wp-image-472" title="logo" src="http://blog.pablo-morales.com/wp-content/uploads/2009/03/logo.png" alt="logo" width="241" height="213" /> Me decidi probar la nueva estella de Zend, <a title="Zend Server" href="http://www.zend.com/en/products/server/" target="_self">Zend Server</a>.  <img class="size-medium wp-image-468 alignleft" title="Zend Server in action" src="http://blog.pablo-morales.com/wp-content/uploads/2009/03/snapshot1-300x217.png" alt="snapshot1" width="300" height="217" /> Basicamente es un entorno de administracion para servidores web, las caracteristicas principales son la administracion de los archivos de configuracion, monitoreo de nuestros logs,monitoreo de aplicaciones, y promete un entorno seguro. Todo esto dentro de una interface Web que de hecho es bastante agradable.</p>
<div class="mceTemp mceIEcenter">
<dl id="attachment_469" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://blog.pablo-morales.com/wp-content/uploads/2009/03/snapshot2.png" rel="thumbnail"><img class="size-medium wp-image-469" title="Zend Server in action 2" src="http://blog.pablo-morales.com/wp-content/uploads/2009/03/snapshot2-300x172.png" alt="snapshot2" width="300" height="172" /></a></dt>
</dl>
</div>
<p style="text-align: center;">
<p>Tambien viene integrado con Zend Core, asi que tambien tenemos Apache, php 5.x.  Ya trae incluido un paquete con Zend Optimizer +, Zend Debugger, Zend Data Cache, Zend Guard Load, Zend Java Bridge, Zend Acelerator.  Un administrador de extensiones, y algun que oto dellate mas.  <img class="size-medium wp-image-470 alignright" title="Zend Server in action" src="http://blog.pablo-morales.com/wp-content/uploads/2009/03/snapshot3-300x104.png" alt="Zend Server in action" width="300" height="104" /> La verdad que no vale la pena pagar por este producto, creo que con un grupo de aplicaciones open source se puede conseguir esto y seguramente mucho mas. Por ahora voy a seguir usandolo hasta que se acabe la licencia de prueba. En estos treinta dias voy a tratar de sacarle mas provecho para entende porque pagar lo que sale la licencia. Quizas el soporte lo valga, pero pagar soporte para esto?.  La instalacion la hice a partir del tar.gz, tengo Arch linux, asi que para hacerla facil preferi instalarlo a mano.  <img class="size-medium wp-image-471 alignleft" title="Carpetas en Zend Server" src="http://blog.pablo-morales.com/wp-content/uploads/2009/03/snapshot4-300x124.png" alt="Carpetas en Zend Server" width="300" height="124" /> Despues de bajarme el tar.gz, lo descomprimi en la carpeta /opt/. Tuve que crear un symlink de la carpeta /var/log/ y de /var/www/html para que se acople facilmente a la estructura de Zend Server. Despues cree los virtual host dentro de /opt/zend/apache2/conf/vhost/. Siempre uso esta carpeta para tener cada dominio/Subdominio con su propio archivo de configuracion, esto me facilita mucho la organizacion.  Despues restarteo el servicio de apache, y ya tengo montado mi servidor web con Zend Server, hasta que tenga que pagar por esto <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/03/playing-with-zend-serverjugando-con-zend-server/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Personal Book = Drupal + ZF</title>
		<link>http://blog.pablo-morales.com/2009/03/personal-book-drupal-zf/</link>
		<comments>http://blog.pablo-morales.com/2009/03/personal-book-drupal-zf/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 20:48:05 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[personal book]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=453</guid>
		<description><![CDATA[Este ultimo tiempo estuve bastante ocupado cerrando algunos proyectos por eso la falta de post en el blog. El proyecto que mas me ocupo mi tiempo es Personal Book que desarrollamos en Easytech. Basicamente PBOOK es un sistema de ventas de libro online, con el agregado que podes agregarle una dedicatoria a cualquier libro que [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/03/personal-book-drupal-zf/" data-text="Personal Book = Drupal + ZF" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/03/personal-book-drupal-zf/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/03/personal-book-drupal-zf/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><div class="mceTemp mceIEcenter">
<dl id="attachment_459" class="wp-caption aligncenter" style="width: 330px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-459" title="Drupa Zend Framework" src="http://blog.pablo-morales.com/wp-content/uploads/2009/03/drupalzendframework.jpg" alt="Drupa Zend Framework" width="320" height="183" /></dt>
</dl>
</div>
<p>Este ultimo tiempo estuve bastante ocupado cerrando algunos proyectos por eso la falta de post en el blog.</p>
<p>El proyecto que mas me ocupo mi tiempo es <a href="http://www.personalbook.cl">Personal Book</a> que desarrollamos en <a title="Easytech" href="http://www.easytech.com.ar" target="_blank">Easytech</a>. Basicamente PBOOK es un sistema de ventas de libro online, con el agregado que podes agregarle una dedicatoria a cualquier libro que compres. Atras de este proyecto esta una de las empresas grandes de Chile<a href="http://www.dimacofi.cl/">, Dimacofi.</a></p>
<p>Despues de viajar a Chile para ultimar detalles sobre el cierre del proyecto, hoy por fin se hace publica la pagina para que cualquier Chileno (por ahora), pueda comprar libros de forma online, sin la necesidad de depender de un stock y sin moverse de su casa.</p>
<p>Para el proyecto se decidio usar <a title="Drupal" href="http://drupal.org" target="_self">Drupal</a> para el manejo del sitio, y los contenidos  y Zend Framework para todo el resto. Se uso 2 motores de base de datos, mysql para Drupal, y Oracle XE para el resto.</p>
<p>El sitio cuenta con varios subsistemas, que se comunican entre si a traves de colas de <a title="Active MQ" href="http://activemq.apache.org/" target="_blank">ActiveMQ</a>, un sistema de colas de la gente de Apache Software Foundation, el cual nos resulto excelente para esta funcion.</p>
<p>Si tienen la oportunidad naveguen el sitio y vean como pueden trabajar en perfecta armonia Zend Framework y Drupal .</p>
<p>site: <a title="Personal Book" href="http://www.personalbook.cl" target="_self">www.personalbook.cl</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/03/personal-book-drupal-zf/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Autenticacion mas compleja con Zend_Auth</title>
		<link>http://blog.pablo-morales.com/2009/02/autenticacion-mas-compleja-con-zend_auth/</link>
		<comments>http://blog.pablo-morales.com/2009/02/autenticacion-mas-compleja-con-zend_auth/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 03:23:53 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[Zend_Auth]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=448</guid>
		<description><![CDATA[En los casos comunes de autenticaciones con Zend_Auth nosotros le pasamos un usuario y una clave, pero hay veces que necesitamos que valide por mas datos. Una autenticacion comun seria la siguiente. Zend_Loader::loadClass( 'Zend_Auth_Adapter_DbTable' ); $dbAdapter = Zend_Registry::get( 'dbAdapter' ); $authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter ); $authAdapter->setTableName( 'SYS_USER' ); $authAdapter->setIdentityColumn( 'username' ); $authAdapter->setCredentialColumn( 'password' ); [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/02/autenticacion-mas-compleja-con-zend_auth/" data-text="Autenticacion mas compleja con Zend_Auth" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/02/autenticacion-mas-compleja-con-zend_auth/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/02/autenticacion-mas-compleja-con-zend_auth/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>En los casos comunes de autenticaciones con Zend_Auth nosotros le pasamos un usuario y una clave, pero hay veces que necesitamos que valide por mas datos.</p>
<p>Una autenticacion comun seria la siguiente.</p>
<pre lang="php">
 Zend_Loader::loadClass( 'Zend_Auth_Adapter_DbTable' );
 $dbAdapter = Zend_Registry::get( 'dbAdapter' );
 $authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter );
 $authAdapter->setTableName( 'SYS_USER' );
 $authAdapter->setIdentityColumn( 'username' );
 $authAdapter->setCredentialColumn( 'password' );
 $authAdapter->setIdentity( strtolower( trim( $username )) );
 $authAdapter->setCredential( md5( $passwd ));
 $auth = Zend_Auth::getInstance();
 $result = $auth->authenticate( $authAdapter );
</pre>
<p>Pero que pasa si ademas necesitamos validar si el usuario esta o no activo en el sistema, o si no esta suspendido temporalmente?</p>
<p>Nososotros podemos pasarle un parametro extra a Zend_Auth_Adapter_DbTable, para que filtre por mas datos.</p>
<p>Por ejemplo el caso anterior, quedaria de la siguiente manera si ademas nosotros queremos saber si el campo status = &#8216;A&#8217;</p>
<pre lang="php">
 Zend_Loader::loadClass( 'Zend_Auth_Adapter_DbTable' );
 $dbAdapter = Zend_Registry::get( 'dbAdapter' );
 $authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter, 'SYS_USER', 'username', 'password', "MD5( ? ) AND status = 'A' " );
 $authAdapter->setIdentity( strtolower( trim( $username )) );
 $authAdapter->setCredential( md5( $passwd ));
 $auth = Zend_Auth::getInstance();
 $result = $auth->authenticate( $authAdapter );
</pre>
<p>De esta forma, cada vez que intentemos loguearnos nos va a encriptar la clave con la funcion MD5, y preguntar si status =&#8217;A&#8217;. </p>
<p>Si ustedes no necesitan encriptar la clave pueden usar directamente el signo de pregunta sin la funcion MD5, tambien pueden agregar mas funcionalidades, para mas detalle mirar la <a href="http://framework.zend.com/manual/en/zend.auth.adapter.dbtable.html" title="doc oficial">documentacion oficial</a></p>
<p>En el administrador del blogzf tenemos un ejemplo de implementacion de este sistema.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/02/autenticacion-mas-compleja-con-zend_auth/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Gestionar tuneles sin abrir una terminal por cada tunel</title>
		<link>http://blog.pablo-morales.com/2009/01/gestionar-tuneles-sin-abrir-una-terminal-por-cada-tunel/</link>
		<comments>http://blog.pablo-morales.com/2009/01/gestionar-tuneles-sin-abrir-una-terminal-por-cada-tunel/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 21:22:47 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[gstm]]></category>
		<category><![CDATA[tunel ssh]]></category>
		<category><![CDATA[tuneles]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=444</guid>
		<description><![CDATA[Gnome SSH Tunnel Manager es una heramienta GUI, para gestionar la adminsitracion de tuneles en nuestro sistema. Esto es para evitar abrir una consola por cada tunel que necesitemos. La herramienta nos permite gestionar varios perfiles, yes muy facil de usar. Para los que usamos los tuneles constantemente, esta herramienta se vuelve indispensable. Para Instalarlo [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/01/gestionar-tuneles-sin-abrir-una-terminal-por-cada-tunel/" data-text="Gestionar tuneles sin abrir una terminal por cada tunel" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/01/gestionar-tuneles-sin-abrir-una-terminal-por-cada-tunel/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/01/gestionar-tuneles-sin-abrir-una-terminal-por-cada-tunel/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><div class="mceTemp mceIEcenter"></div>
<p>Gnome SSH Tunnel Manager es una heramienta GUI, para gestionar la adminsitracion de tuneles en nuestro sistema. Esto es para evitar abrir una consola por cada tunel que necesitemos.</p>
<p>La herramienta nos permite gestionar varios perfiles, yes muy facil de usar.</p>
<p><img class="size-full wp-image-443 alignleft" title="Gnome SSH Tunnel Manager" src="http://blog.pablo-morales.com/wp-content/uploads/2009/01/screenshot1.jpg" alt="Gnome SSH Tunnel Manager" width="280" height="336" /></p>
<p>Para los que usamos los tuneles constantemente, esta herramienta se vuelve indispensable.</p>
<p>Para Instalarlo en Fedora Core 10 solo basta con hacer</p>
<p>$ sudo yum install gstm</p>
<p>Para debian y ubuntu supongo que sera algo parecido, pero con apt-get, sino se pueden bajar el fuente de <a title="GSTM" href="http://sourceforge.net/projects/gstm/" target="_self">sourceforge</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/01/gestionar-tuneles-sin-abrir-una-terminal-por-cada-tunel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frameworks, una opcion en el desarrollo web</title>
		<link>http://blog.pablo-morales.com/2009/01/frameworks-una-opcion-en-el-desarrollo-web/</link>
		<comments>http://blog.pablo-morales.com/2009/01/frameworks-una-opcion-en-el-desarrollo-web/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 03:10:59 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[akelos]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[uso de framework]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=431</guid>
		<description><![CDATA[Es muy interesante ver que en la actualidad la mayoría de las empresas serias de desarrollo web se están volcando al uso de framework en sus desarrollos. Esto tiene una ventajas para el empleador, el empleado, y el cliente. El empleado esta aprendiendo a desarrollar con un framework y no solo un framework sino una [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/01/frameworks-una-opcion-en-el-desarrollo-web/" data-text="Frameworks, una opcion en el desarrollo web" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/01/frameworks-una-opcion-en-el-desarrollo-web/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/01/frameworks-una-opcion-en-el-desarrollo-web/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p><!--:en--></p>
<div class="mceTemp mceIEcenter">
<dl id="attachment_433" class="wp-caption aligncenter" style="width: 430px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-433" title="framework web" src="http://blog.pablo-morales.com/wp-content/uploads/2009/01/framework_php.png" alt="frameworks para las web" width="420" height="300" /></dt>
</dl>
</div>
<p style="text-align: left;">
<p style="text-align: left;">
<p style="text-align: left;">Es muy interesante ver que en la actualidad la mayoría de las empresas serias de desarrollo web se están volcando al uso de framework en sus desarrollos. Esto tiene una ventajas para el empleador, el empleado, y el cliente.</p>
<p style="text-align: left;">El empleado esta aprendiendo a desarrollar con un framework y no solo un framework sino una estructura de trabajo la cual le sirve para agregar en su currículum, el empleador consigue ahorrarse tiempo en desarrollos y en controles, y el cliente obtiene en menor tiempo y con una mejor calidad sus productos.</p>
<p style="text-align: left;">
<p>La explicacion es muy simple, los frameworks web actuales no son desarrollados por un equipo reducido de personas, sino que están continuamente creciendo gracias al apoyo de las comunidades virtuales.</p>
<p>Estos Frameworks, generalmente son <span class="misspell">open</span> <span class="misspell">source</span>, y están desarrollados y apoyado por grandes corporaciones, por ejemplo el caso de <span class="misspell">Symfony</span> que tiene como Padrino a Yahoo,  que  utiliza este framework en la mayoría de sus desarrollos con PHP, como es el caso de <a id="s8_2" title="http://www.symfony.es/2007/05/26/yahoo-elige-symfony-para-delicious-yahoo-answers-y-yahoo-bookmarks/" href="http://www.symfony.es/2007/05/26/yahoo-elige-symfony-para-delicious-yahoo-answers-y-yahoo-bookmarks/"><span class="misspell">Delicius</span>, Yahoo <span class="misspell">Answerr</span> y Yahoo <span class="misspell">Bookmarks</span></a>. Zend Framework es apoyado por la creciente Zend <span class="misspell">Company</span> que son los creadores del lenguaje PHP.</p>
<p>Estos dos son los grandes frameworks de PHP, pero hay muchos mas, muchisimos mas. La elección de cual les conviene mas, tiene que ser evaluada por la empresa, teniendo en cuenta quien le da mas o mejor de estos frameworks.</p>
<p>El caso de <span class="misspell">Akelos</span> es bastante interesante, ya que su idea es construir aplicaciones en PHP al estilo <span class="misspell">Ruby</span> <span class="misspell">On</span> <span class="misspell">Rails</span>, este ultimo también un gran framework y muy popular debido a la facilidad de uso y a su código bastante simple.</p>
<p>En la balanza aparecen muchos factores, y cada factor es importante. Yo elijo Zend Framework porque me da una flexibilidad sin atarme a <span class="misspell">ningun</span> mecanismo. Puedo desarrollar si quiero sin implementar <span class="misspell">MVC</span>, o incluir Zend Framework dentro de WordPress para manejar los plugins, como es el caso de este blog.</p>
<p>Lo mas importante, es que una empresa no tiene que preocuparse como hacer una librería para la conexion a la base de datos, o para crear a un web <span class="misspell">service</span>, o como manejar <span class="misspell">templates</span> dentro de su sistema, como validar formularios, etc. Y no tiene que preocuparse no porque no lo tenga que hacer, sino porque estos frameworks le brindan una solución, les dice como crear formularios, validarlos tanto del lado del cliente como del servidor, manejar distintos <span class="misspell">templates</span>, manejar base de datos, etc, etc,etc. Y no solo soluciones del tipo &#8220;necesito conectarme a una base de la mejor manera posible&#8221;, es lo que no simplifica un framework, sino que nos brinda todo una forma de trabajo como es la <span class="misspell">division</span> por capas <span class="misspell">MVC</span> (<span class="misspell">Model</span> View Controller), sino una estructura de directorios prolija, y clara. Sobre todo que hace fácil y organizable cualquier modulo o aplicacion.<span class="misspell">Ademas</span> como el caso de Zend Framework, nos da una <span class="misspell">recomendacion</span> de <a id="s7dv" title="como escribir nuestro codigo, y trabajar en grupo." href="http://framework.zend.com/manual/en/coding-standard.html">como escribir nuestro <span class="misspell">codigo</span>, y trabajar en grupo.</a></p>
<p>Otro de los puntos a favor de un framework, es que es gratis. La empresa no tiene que poner un centavo y obtiene cientos o miles de lineas de código para que use sin ningún limite sin nada a cambio.</p>
<p>Recuerdo mucho tiempo haber rediseñado clases para la conexion a la abase de datos, o generar capas de abstracción para hacer ciertas funcionalidades, como el manejo de formularios. Y todo ese tiempo perdido si bien tengo que reconocer que aprendí bastante con la prueba y error (hubieron muchos errores lamentablemente), mis desarrollos hubiesen sido mejores y en menos tiempo aprovechando estos recursos.</p>
<p>Como dije en un post anterior de este blog, el costo de aprendizaje es mínimo, ya que no se tarda lo mismo generando código de cero, que aprender a usar un código existente que cumple lo que nosotros necesitamos.</p>
<p>Sobre el lenguaje de <span class="misspell">programacion</span> a elegir para los desarrollos web, también depende de muchos factores, uno de los puntos a tener en cuenta, es  la cantidad de programadores que hay en el mercado, y lo que cobran estos programadores. Viendo estos factores PHP parece la mejor alternativa, pero <span class="misspell">Python</span> con <span class="misspell">Django</span> esta pisando fuerte y mas solido de lo que hizo <span class="misspell">Ruby</span> <span class="misspell">On</span> <span class="misspell">Rails</span> hasta ahora.</p>
<p><span class="misspell">Links</span> Interesantes</p>
<p><a id="u26-" title="Akelos" href="http://akelos.org/"><span class="misspell">Akelos</span></a></p>
<p><a id="os.f" title="Zend Framework" href="http://framework.zend.com/">Zend Framework</a></p>
<p><a id="bj15" title="Symfony" href="http://www.symfony-project.org/"><span class="misspell">Symfony</span></a></p>
<p><a id="wnzh" title="CakePHP" href="http://cakephp.org/"><span class="misspell">CakePHP</span></a></p>
<p><a id="n-ls" title="Ruby On Rails" href="http://rubyonrails.org/"><span class="misspell">Ruby</span> <span class="misspell">On</span> <span class="misspell">Rails</span></a></p>
<p><a id="hxnc" title="Django" href="http://www.djangoproject.com/"><span class="misspell">Django</span></a></p>
<p><a id="ay38" title="Codeigniter" href="http://codeigniter.com/"><span class="misspell">Codeigniter</span></a><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/01/frameworks-una-opcion-en-el-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Proyecto BlogZf &#8211; Parte 6</title>
		<link>http://blog.pablo-morales.com/2009/01/proyecto-blogzf-parte-6/</link>
		<comments>http://blog.pablo-morales.com/2009/01/proyecto-blogzf-parte-6/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 16:11:28 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[blogzf]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=429</guid>
		<description><![CDATA[Plugins. En ZF podemos utilizar plugins. Estos plugins se van a ejecutar en determinado momento, como puede ser el Predispatch o el PostDispatch. En muchos proyectos con ZF se utiliza una capa superior para los controllers para obligar al sistema que ejecute siempre la capa superior donde en esta capa podemos tener varias funcionalidades comunes [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2009/01/proyecto-blogzf-parte-6/" data-text=" Proyecto BlogZf - Parte 6" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2009/01/proyecto-blogzf-parte-6/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2009/01/proyecto-blogzf-parte-6/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><div id="jz8:" style="padding: 1em 0pt; text-align: center;"><img src="http://docs.google.com/File?id=dcz4grwr_251ft8j54wm_b" alt="" width="320" height="220" /></div>
<p><strong>Plugins.</strong></p>
<p>En ZF podemos utilizar plugins. Estos plugins se van a ejecutar en determinado momento, como puede ser el Predispatch o el PostDispatch. En muchos proyectos con ZF se utiliza una capa superior para los controllers para obligar al sistema que ejecute siempre la capa superior donde en esta capa podemos tener varias funcionalidades comunes para todos los controllers.</p>
<p>Esto no es una mala decisión, de hecho en nuestro blog tenemos un controller genérico. Pero también podemos hacer uso de los plugins, estos además de servirnos posteriormente para extender la funcionalidades, como puede ser el agregado de un contador de visitas, o cualquier funcionalidad extra que queramos darle al sistema sin necesidad de tocar el código existente, solo extendiendo el que hay. Como es el caso de los plugins en WordPress, también podemos tener algunos plugins genéricos, para que procesen acciones genéricas, como puede ser el caso de configurar la vista, el layout, o la base de datos, el manejo de sesiones, etc.</p>
<p>En nuestro blog actualmente hay varios plugins, y cada uno bien separado su funcionalidad, hay un plugin extra especialmente para el admin, el cual maneja la seguridad (por ahora solo eso), pero también tenemos un plugin para instanciar la vista, y decirle de donde sacar el menú, y todo lo necesario para renderear la vista, además de un plugin para el manejo de layouts, otro plugin para la base de datos. Y además de esto una capa de abstracción superior en los controllers.</p>
<p>El uso de plugins en Zend Framework, es muy fácil y se cargan desde el bootstrap, cuando agregamos los controllers y antes de hacer dispatch, le decimos que plugins cargar.</p>
<pre lang="php">
$controller = Zend_Controller_Front::getInstance
    ->throwExceptions(true)
    ->registerPlugin( new Blogzf_Controller_Plugin_Config())
    ->registerPlugin( new Blogzf_Controller_Plugin_Layout())
    ->registerPlugin( new Blogzf_Controller_Plugin_View())
    ->registerPlugin( new Blogzf_Controller_Plugin_Backoffice())
    ->dispatch();
</pre>
<p>Como se puede apreciar en el código de nuestro bootstrap, cargamos 4 plugins. Estos plugins los ubicamos en la carpeta library/Blogzf/Controller/Plugin, esta ruta es para tener una hegemonía con la estructura de directorios de ZF.</p>
<p>Estos plugins son muy fácil de programar. Cada clase implementa una interfaz genérica que cada método corresponde a una instancia de ejecución de nuestra pagina. Tenemos un método para preDispatch, otro para el postdispatch, que cada vez que le toca ejecutarse a estos metodos se llama a los plugins, antes del controller. Nuestros plugins extienden de la clase padre Zend_Controller_Plugin_Abstract . Un plugin normal con dos metodos  como son PreDispatch, PostDispatch, quedaría como el siguiente.</p>
<pre lang="php">
/**
 * Plugin para administrar las vistas de nuestro sistema.
 *
 */
class Blogzf_Controller_Plugin_View extends Zend_Controller_Plugin_Abstract
{
    protected $_viewRenderer;
    protected $_view;
    public function preDispatch (Zend_Controller_Request_Abstract $request)
    {
        /**
         * Esto es un singleton de la vista para que no lo reinicie
         */
        $this->_viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        $this->_viewRenderer->initView();
        /**
         * Traemo los datos del archivo de configuaracion
         */
        $config = Zend_Registry::getInstance()->get( 'config_ini' );
        $auth = Zend_Auth::getInstance();
        
        $this->_view = $this->_viewRenderer->view;
        
        /**
         * Agregamos unas
         */
        $this->_view->baseUrl = $request->getBaseUrl();
        $this->_view->module = $request->getModuleName();
        $this->_view->controller = $request->getControllerName();
        $this->_view->action = $request->getActionName();

        $this->_view->hasIdentity = false;
        
        if ( $auth->hasIdentity() ) {
            $this->_view->hasIdentity = true;
            $this->_view->Identity = $auth->getIdentity();
        }
        
        /**
         * Agregamos las rutas para las vistas
         */
        $this->_view->addScriptPath('/application/blog/views');
        $this->_view->addScriptPath('/application/admin/views');
        /**
         * Url basicas del sistema
         */
        $this->_view->staticServer = $config->site->static->server;
        $this->_view->appServer = $config->site->static->server;
         /**
         * Agrego el titulo de la pagina
         */
        $this->_view->headTitle()->append( $config->site->title );
        $this->_view->site = $config->site;
        /**
         * Agrego los css para esta pagina que siempre va a ser el mismo.
         * /layout/nombre_layout/style.css esto es para poder agregar muchos layout. Y no dependan
         * de la cantidad de css, si necesitamos separar en mas archivos. Podemos hacer un @import desde
         * style.css
         *
         */
        if ( $request->module == 'admin' ) {
            $layout = $config->site->layout->admin;
            $this->_view->headScript()
                ->appendFile( $this->_view->staticServer . 'js/mootools/mootools-core.js' );
        } else {
            $layout = $config->site->layout->default;
        }

        $this->_view->headLink()
            ->appendStylesheet( $this->_view->staticServer . 'layout/'.$layout.'/styles.css' );


    }
    public function postDispatch (Zend_Controller_Request_Abstract $request)
    {
        if ($this->_view->module=='default') {
            return;
        }
         
        if ($this->_view->layout()->isEnabled() ) {
            $this->_view->layout()->sidebar = $this->_view->action( 'rightcontent', 'sidebar', $this->_view->module );
            $this->_view->layout()->header = $this->_view->action( 'header', 'sidebar', $this->_view->module );
            $this->_view->layout()->footer = $this->_view->action( 'footer', 'sidebar', $this->_view->module );
            $this->_view->layout()->menutop = $this->_view->action( 'menutop','sidebar', $this->_view->module );
        }     
    }
}
</pre>
<p>Si necesitamos que algun dato persista, podemos usar Zend_Registry <img src='http://blog.pablo-morales.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Como se daran cuenta, estos plugins son muy facil. No requieren mucho mas que esto.</p>
<p>Si van al codigo de blogzf van a encontrar el codigo de los otros 4 plugins.</p>
<p><a href="http://www.framework.zend.com/manual/en/zend.controller.plugins.html" >Mas informacion</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2009/01/proyecto-blogzf-parte-6/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Mp3 blaster, el placer por lo liviano</title>
		<link>http://blog.pablo-morales.com/2008/12/mp3-blaster-el-placer-por-lo-liviano/</link>
		<comments>http://blog.pablo-morales.com/2008/12/mp3-blaster-el-placer-por-lo-liviano/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 00:58:16 +0000</pubDate>
		<dc:creator>Pablo Morales</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mp3blaster]]></category>
		<category><![CDATA[windows media player]]></category>

		<guid isPermaLink="false">http://blog.pablo-morales.com/?p=420</guid>
		<description><![CDATA[Hace un tiempo desde que probe fluxbox que estoy bastante maniatico con lo extremadamente ligth, de hecho ahora mientras escribo esto estoy tomando una Villa del sur levite (cuack). Mp3Blaster es un reproductor de mp3 que funciona desde la linea de comando. Tiene una interfaz muy diferente al Winamp y tambien muy diferente la cantidad [...]]]></description>
				<content:encoded><![CDATA[<div style="width: 585px; height: 80px; overflow: none;">
		<div style="float: left; margin-right: 10px;"><a href="http://twitter.com/share" class="twitter-share-button" data-lang="es" data-via="pablofmorales" data-url="http://blog.pablo-morales.com/2008/12/mp3-blaster-el-placer-por-lo-liviano/" data-text="Mp3 blaster, el placer por lo liviano" data-count="vertical"></a></div>
		<div style="float: left; margin-right: 10px;"><g:plusone size="tall" href="http://blog.pablo-morales.com/2008/12/mp3-blaster-el-placer-por-lo-liviano/"></g:plusone></div>
		<div style="float: left; z-index: 100;"><fb:like href="http://blog.pablo-morales.com/2008/12/mp3-blaster-el-placer-por-lo-liviano/" layout="box_count"  send="false" width="0" show_faces="false" action="like" font=""></fb:like></div>
	</div><p>Hace un tiempo desde que probe fluxbox que estoy bastante maniatico con lo extremadamente ligth, de hecho ahora mientras escribo esto estoy tomando una Villa del sur levite (cuack).</p>
<p>Mp3Blaster es un reproductor de mp3 que funciona desde la linea de comando. Tiene una interfaz muy diferente al Winamp y tambien muy diferente la cantidad de recursos que consume, pero hacen lo mismo, reproducir nuestros MP3.</p>
<p>La instalacion como siempre en linux, FACIL. En ubuntu.<br />
$ sudo aptitude install mp3blaster</p>
<p>En cualquier otra distro, hay .deb, y rpm dando vuelta por la red.</p>
<p>Sino se pueden bajar las fuentes desde la pagina de <a href="http://mp3blaster.sourceforge.net/">sourceforce de mp3blaster,</a> y hacer el clasico ./configure &amp;&amp; make &amp;&amp; make install y listo.</p>
<p>Con mp3blaster vamos a poder crear playlist, y reproducir de forma liviana nustros Mp3. Si quieren consumir menos recursos haganlo desde una terminal xterm, y no las pesadas gnome-terminal y komander.</p>
<p><img class="aligncenter size-medium wp-image-421" title="3_snap19" src="http://blog.pablo-morales.com/wp-content/uploads/2008/12/3_snap19-300x209.jpg" alt="3_snap19" width="300" height="209" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pablo-morales.com/2008/12/mp3-blaster-el-placer-por-lo-liviano/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
