<?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>Berriart &#187; Desarrollo web</title>
	<atom:link href="http://www.berriart.com/category/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.berriart.com</link>
	<description>Un programador hablando de diseño............</description>
	<lastBuildDate>Fri, 27 Jan 2012 08:53:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Mi entorno de desarrollo web</title>
		<link>http://www.berriart.com/2012/01/27/mi-entorno-de-desarrollo-web/</link>
		<comments>http://www.berriart.com/2012/01/27/mi-entorno-de-desarrollo-web/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 08:53:46 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[addons]]></category>
		<category><![CDATA[entorno de desarrollo]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=901</guid>
		<description><![CDATA[Hoy os quería comentar cual es mi entorno de desarrollo, no para convenceros de que me copiéis, sino más bien para que me digáis vuestra opinión, qué os parece y que me recomendaríais. Cuando me acostumbro a algo me cuesta bastante cambiar aunque sepa que con el tiempo va a mejorar mi forma de trabajar, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.berriart.com/wp-content/uploads/2012/01/funny-pictures-beer-computer-57j.jpg"><img src="http://www.berriart.com/wp-content/uploads/2012/01/funny-pictures-beer-computer-57j-150x150.jpg" alt="Entorno de desarrollo ideal" width="150" height="150" class="alignright size-thumbnail wp-image-908" /></a>Hoy os quería comentar cual es mi entorno de desarrollo, no para convenceros de que me copiéis, sino más bien para que me digáis vuestra opinión, qué os parece y que me recomendaríais. Cuando me acostumbro a algo me cuesta bastante cambiar aunque sepa que con el tiempo va a mejorar mi forma de trabajar, no sé si es porque me hago viejo, pero soy capaz de intentarlo, así que no dudéis en dejarme cualquier comentario al respecto.</p>
<ul>
<li>Un PC con una distro Linux, en mi caso <a href="http://www.ubuntu.com/">Ubuntu</a>, que me viene muy bien porque tiene todo lo que yo quiero y además es lo suficiente fácil de usar para que el resto de usuarios del ordenador en mi casa no se enfaden.
<ul>
<li>Apache, MySQL y PHP incluídos, y a poder ser actualizados</li>
</ul>
</li>
<li><a href="http://netbeans.org/">Netbeans</a> es hasta el momento mi IDE preferido, aunque relamente estoy deseando cambiar porque siempre me da la impresión de que estoy cazando moscas a cañonazos. Si sigue por el buen camino <a href="http://www.sublimetext.com/2">Sublime Text 2</a> puede ser un buen candidato para el cambio, aunque todavía le queda camino por recorrer si quiere convencerme.</li>
<li><a href="http://git-scm.com/">Git</a> y <a href="http://subversion.tigris.org/">Subversion</a> para trabajo en grupo y control de versiones. Como cliente gráfico uso el propio Netbeans ya que me parece muy buena la integración que incluye con ambos, aunque muchas veces soy más amigo de usar directamente el terminal. Si sigo usando ambos es porque para proyectos de WordPress uso Subversion, pero si no, Git sería ya mi único amigo en este aspecto.</li>
<li>Como navegador para desarrollo sigo usando <a href="http://www.mozilla.org/es-ES/firefox/new/">Firefox</a>, no por el navegador en sí, ya que prefiero Chrome (o mejor dicho Chromium), sino por todos los <em>Addons</em> sin los que no podría vivir:
<ul>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/firebug/">Firebug</a>, sin ninguna duda la herramienta que más problemas me ha resuelto en los últimos años.</li>
<li><a href="https://addons.mozilla.org/en-us/firefox/addon/hostadmin/">HostAdmin</a>, de <em>dev</em> a <em>pre</em> y a <em>prod</em> en un solo click.</li>
<li><a href="https://addons.mozilla.org/es-es/firefox/addon/yslow/">YSlow</a> y <a href="http://code.google.com/speed/page-speed/download.html">Page Speed</a> para asegurarme que estoy haciendo las cosas bien en algunos aspectos de rendimiento. Son buenas <em>checklists</em>.</li>
<li><a href="https://addons.mozilla.org/es-es/firefox/addon/web-developer/">Web Developer</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/showip/">ShowIP</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/searchstatus/">SearchStatus</a>, <a href="https://addons.mozilla.org/en-us/firefox/addon/defyformvalidation/">defyFormValidation</a>,&#8230; y algún otro más también están instalados en mi navegador, pero no les doy uso tan a menudo</li>
</ul>
</li>
<li><a href="http://www.focusboosterapp.com/">Focus Booster</a> es mi pomodoro (sí, ya sé, usa Adobe Air, pero qué le vamos a hacer, nadie es perfecto). Sencillo y efectivo. (Si os interesa que tal me va usando el pomodoro os diré que bien cuando soy estricto con ello, lo que me cuesta es ser realmente estricto).</li>
</ul>
<p>Seguro que me queda alguna herramienta por nombrar, ahora es un poco tarde y la cabeza no funciona del todo bien, si me acuerdo editaré el post y la añadiré. Si a alguno os apetece y como últimamente ya no se ven muchos <em>memes</em>, podríais tomarlo como tal y contar en vuestros respectivos blogs como es vuestro entorno, si no, como ya he dicho estaría muy bien que me dejarais algún comentario con vuestra opinión.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2012/01/27/mi-entorno-de-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony2, permisos en el directorio cache (y en logs)</title>
		<link>http://www.berriart.com/2012/01/09/symfony2-permisos-directorio-cache/</link>
		<comments>http://www.berriart.com/2012/01/09/symfony2-permisos-directorio-cache/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 09:33:25 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[consola]]></category>
		<category><![CDATA[permisos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=856</guid>
		<description><![CDATA[Supongo que habréis sido más espabilados que yo, pero si alguno de vosotros también se ha peleado con los permisos del directorio app/cache, aquí tenéis la solución. Mi problema era que en la instalación de Symfony2 siempre le daba permisos 777 a los directorios app/cache y app/logs, pensaba que con eso valía. En un principio [...]]]></description>
			<content:encoded><![CDATA[<p>Supongo que habréis sido más espabilados que yo, pero si alguno de vosotros también se ha peleado con los permisos del directorio <code>app/cache</code>, aquí tenéis la solución. Mi problema era que en la instalación de <a href="http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/">Symfony2</a> siempre le daba permisos 777 a los directorios <code>app/cache</code> y <code>app/logs</code>, pensaba que con eso valía. </p>
<p>En un principio parece que sí, se accede vía web y sin ningún problema se van generando los ficheros de caché. Pero si más adelante ibas a la línea de comandos e intentabas alguna acción que tuviera que reescribir esos ficheros (generados por usuario apache o similar) te decía que el usuario que usabas no tenía permisos. Pues nada, yo volvía a darle permisos 777 con ayuda del <em>sudo</em>, hacía lo que tenía que hacer y de nuevo volvía a darle permisos para que el usuario <em>apache</em> no tuviera problemas en sobreescribir lo que yo había generado desde consola con mi usuario. Menudo lío ¿no?</p>
<p>Llegado un punto en el que este <em>loop</em> empezaba a convertirse en infinito, busqué un poquito y descubrí que no tenía que ir muy lejos a buscar la solución, estaba escrita en la <a href="http://symfony.com/doc/2.0/book/installation.html#configuration-and-setup">propia documentación de Symfony2</a>. Y realmente tampoco era tan complicada si hubiera pensado un poquito, ambos usuarios deben tener permisos sobre esos directorios:</p>
<pre>sudo rm -rf app/cache/*
sudo rm -rf app/logs/*
sudo setfacl -R -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs
sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs</pre>
<p>Dónde <code>www-data</code> es el nombre del usuario de los accesos web (en algunos casos es <em>apache</em>, <em>http</em>,&#8230;) y dónde <code>whoami</code> es el nombre del usuario con el que accedes y ejecutas la consola de Symfony.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2012/01/09/symfony2-permisos-directorio-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Probando las novedades de PHP 5.4</title>
		<link>http://www.berriart.com/2012/01/02/novedades-php-54/</link>
		<comments>http://www.berriart.com/2012/01/02/novedades-php-54/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 09:37:11 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php 5.4]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[servidor web]]></category>
		<category><![CDATA[trait]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=862</guid>
		<description><![CDATA[A pesar de que algunos aún estamos asimilando y adaptándonos a las novedades de PHP 5.3, se está hablando mucho estos últimos días de las novedades de PHP 5.4, a raíz de la reciente liberación de la cuarta release candidate de esta versión. Así que después de leer sobre ello me he decidido a probar [...]]]></description>
			<content:encoded><![CDATA[<p>A pesar de que algunos aún estamos asimilando y adaptándonos a las novedades de PHP 5.3, se está hablando mucho estos últimos días de las novedades de PHP 5.4, a raíz de la reciente liberación de la <a href="http://www.php.net/archive/2011.php#id2011-12-25-1">cuarta <em>release candidate</em></a> de esta versión. Así que después de leer sobre ello me he decidido a probar un poco y la he instalado en casa. </p>
<p>De <a href="https://svn.php.net/repository/php/php-src/tags/php_5_4_0RC4/NEWS">las novedades de la versión</a> las que más me han llamado la atención y las que creo que más útiles me van a resultar son los <em>traits</em> y el <em>servidor web embebido</em>. Aparte de estas dos y de las mejoras en el propio motor y extensiones, otras novedades de las que no voy a hablar hoy pero parecen interesantes son:</p>
<ul>
<li>Array dereferencing (un poco raro lo de poner corchetes al final de una función :p )</li>
<li>Soporte para DTrace</li>
<li>Nueva función http_response_code()</li>
<li>Llamadas indirectas a métodos estáticos de una clase mediante un array</li>
<li>Permite el uso de $this en <em>closures</em> dentro de métodos</li>
</ul>
<h2>Traits</h2>
<p>Creo que se puede decir que los <em>traits</em> han sido la solución de PHP para implementar lo que muchos pedían, &#8216;herencia múltiple&#8217; o la posibilidad de crear una clase que <em>extienda</em> múltiples clases, y así poder reaprovechar mejor el código. La manera de usar sería:</p>
<pre name="code" class="php">
&lt;?php

trait HelloWorld {
    private $whatelse;

    public function sayIt() {
        echo 'Hello World!'. PHP_EOL;
        echo $this->whatelse . PHP_EOL;
    }
}

class Producto {
    use HelloWorld;

    public function __construct($string) {
        $this->whatelse = $string;
    }
}

class Servicio {
    use HelloWorld;

    public function __construct() {
        $this->whatelse = date('c');
    }
}

$servicio = new Servicio();
$producto = new Producto('Internet');

$servicio->sayIt();
$producto->sayIt();
</pre>
<p>Esta sería la respuesta a este pequeño script:</p>
<pre>Hello World!
2011-12-29T23:27:19+00:00
Hello World!
Internet</pre>
<p>Sé que no es el mejor ejemplo pero creo que se entiende.</p>
<h2>Servidor web embebido</h2>
<p>Ya <a href="http://php.net/manual/en/features.commandline.webserver.php">dejan bien claro desde PHP</a> que se trata simplemente de un servidor para desarrollo, y no para usar en entornos de producción. Pero aún así, creo que nadie va a negar la utilidad de que PHP incluya su propio servidor y que no necesitemos instalar Apache ni ningún otro servidor web para poder ejecutar y probar nuestras aplicaciones. Para arrancar el servidor simplemente tenemos que ejecutar lo siguiente (es probable que tengas que hacer sudo):</p>
<pre>php -S &lt;addr&gt;:&lt;port&gt; -t &lt;docroot&gt;</pre>
<p>Por ejemplo:</p>
<pre>php -S localhost:80 -t /var/www</pre>
<p>Al ejecutarlo arrancaríamos el servidor web en el puerto 80 con el <em>document root</em> en <code>/var/www</code>; el log de accesos y errores aparecería directamente en consola. Para pararlo simplemnte pulsaríamos Ctrl+C.</p>
<h2>Instalación </h2>
<p>Como sabéis PHP5.4 no es una versión estable, pero si queréis instalarlo en vuestro entorno de desarrollo o de pruebas podéis ir a <a href="http://qa.php.net/">esta web</a>, descargarlo y compilarlo. </p>
<p>Si usáis Ubuntu y no os queréis complicar, podéis hacerlo mucho más fácilmente siguiendo <a href="http://chemicaloliver.net/internet/installing-php-5-4-in-ubuntu/">este pequeño tutorial</a>. Eso sí, aviso que cuando lo probé yo el paquete no estaba actualizado aún y te instalaba la RC3.</p>
<p>Por último, feliz año a todos y que programéis mucho :p</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2012/01/02/novedades-php-54/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como loguear un usuario en Symfony2</title>
		<link>http://www.berriart.com/2011/12/28/login-usuario-symonfy2-programacion/</link>
		<comments>http://www.berriart.com/2011/12/28/login-usuario-symonfy2-programacion/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 08:43:01 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[autenticación]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=848</guid>
		<description><![CDATA[Hace un tiempo Jon nos explicaba como desloguear un usuario mediante programación en Symfony2, hoy yo os cuento lo contrario, como loguear al usuario manualmente. La necesidad me surgió al implementar el login con Facebook y con Twitter en una aplicación y como puede resultar útil en otras ocasiones me lo apunto aquí. // src/Acme/HelloBundle/Controller/HelloController.php [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo Jon nos explicaba como <a href="http://jonsegador.com/2011/10/desloguear-a-un-usuario-mediante-programacion-en-symfony2/">desloguear un usuario mediante programación en Symfony2</a>, hoy yo os cuento lo contrario, como loguear al usuario manualmente. La necesidad me surgió al implementar el login con Facebook y con Twitter en una aplicación y como puede resultar útil en otras ocasiones me lo apunto aquí.</p>
<pre name="code" class="php">
// src/Acme/HelloBundle/Controller/HelloController.php

namespace Acme\HelloBundle\Controller;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

// ...

class HelloController
{
    public function barAction($foo)
    {
        // ...

        // Tienes que crear la entidad del usuario que quieres loguear, por ejemplo
        $em = $this->getDoctrine()->getEntityManager();
        $user = $em->getRepository('AcmeHelloBundle:User')->find($userId);

        // Si usas FOSUserBundle puedes sacar así el $providerKey
        $providerKey = $this->container->getParameter('fos_user.firewall_name');
        // Si no, puedes simplemente poner el nombre del firewall de tu aplicación
        $providerKey = 'main';

        // Si usas FOSUserBundle y has creado la entidad puedes sacar así los roles del user
        $roles = $user->getRoles();
        // Si no puedes hacerlo manualmente
        $roles = array('ROLE_USER');

        // Finalmente logueamos al usuario
        $token = new UsernamePasswordToken($user, null, $providerKey, $roles);
        $this->container->get('security.context')->setToken($token);

        // Y si lo crees necesario le rediriges con un mensajito
        $this->get("session")->setFlash('info', $this->get('translator')->trans('flash.logged_successfully'));

        return $this->redirect($this->generateUrl('homepage'));

        // ...
    }
}
</pre>
<p>Creo que no es mucho y que es sufientemente claro como para entenderlo sin más explicación que los comentarios del propio código, así que ahí queda. Si aún así os surge alguna dudilla que os pueda resolver hacedla en los comentarios, y con un poco de suerte y tiempo os contesto.</p>
<p>PD: Esta es mi inocentada, que creais que voy a retomar el blog como propósito de 2012 :p<br />
PD2: Hoy estoy que lo doy todo, he programado otro post para la semana que viene.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/12/28/login-usuario-symonfy2-programacion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Primeras impresiones con Symfony2</title>
		<link>http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/</link>
		<comments>http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 07:53:27 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Enlaces]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=824</guid>
		<description><![CDATA[Después de varias semanas trabajando con Symfony2 creo que va siendo hora de empezar a hablar un poco sobre el tema y compartir impresiones. He estado dos años trabajando con las versiones 1 de Symfony y ahora me he visto &#8216;obligado&#8217; a plantearme un cambio porque Symfony 1 digamos que&#8230; muere. El cambio de versiones [...]]]></description>
			<content:encoded><![CDATA[<p>Después de varias semanas trabajando con <a href="http://symfony.com/">Symfony2</a> creo que va siendo hora de empezar a hablar un poco sobre el tema y compartir impresiones. He estado dos años trabajando con las versiones 1 de Symfony y ahora me he visto &#8216;obligado&#8217; a plantearme un cambio porque Symfony 1 digamos que&#8230; muere. El cambio de versiones del framework ha sido brutal y sin ningún tipo de retrocompatibilidad, un cambio a mejor sí, pero dejándonos un poco en bragas a los desarrolladores.</p>
<p>Teniendo esto en cuenta me tengo que plantear un cambio, lo que tengo clarísimo es que con Symfony 1 no puedo seguir y como entiendo que el cambio más natural en un principio es Symfony2 he empezado con ello. No quiero decir que no me vaya a plantear otras posibilidades, por supuesto que sí, pero creo que es un buen punto para empezar, así que con ello estoy. Este cambio de framework va a necesitar en mi caso un esfuerzo extra porque a la vez me planteo el cambio casi seguro de <a href="http://www.propelorm.org/">Propel</a> a <a href="http://www.doctrine-project.org/">Doctrine2</a> y de <a href="http://www.berriart.com/2011/06/08/cambiando-de-svn-a-git/">SVN a Git</a>.</p>
<p>Creo que puedo resumir estas semanas en puntos que creo positivos y los que veo negativos:</p>
<ul>
<li><span style="color: #008000;">↑</span> <strong>Estructura y flexibilidad</strong>. Me gusta mucho como viene estructurado, y el hecho de que incluso el <em>core</em> del framework sea considerado como cualquier otra librería externa de tu aplicación y a su vez esté separado en librerías independientes que puedes usar fuera de Symfony. Además, todo (y todo es todo) es personalizable en Symfony2 (a los <em>plugins/widgets/módulos</em> que permiten modificarlo ahora les llaman <em>bundles</em>), aunque por el momento muchas veces lo difícil es saber cómo.</li>
<li><span style="color: #008000;">↑</span> <strong>Modelo-Vista-Controlador</strong>. Ya en la versión 1 la separación era muy clara, pero creo que con Symfony2 y Doctrine esto se ha visto reforzada y me gusta. Otro punto a favor creo que es el nuevo sistema de plantillas que se propone con Symfony2 llamado <a href="http://www.twig-project.org/">Twig</a>, que os recordará mucho a Smarty si alguna vez trabajásteis con él.</li>
<li><span style="color: #008000;">↑</span> <strong>Formularios</strong>. Creo que el nuevo sistema de formularios es más sencillo (uso) y a la vez más completo que el anterior. Uniéndolo con el ya mencionado sistema de plantillas Twig una bomba.</li>
<li><span style="color: #008000;">↑</span> <strong>¿Rendimiento?</strong> Lo pongo con interrogantes porque la verdad es que aunque he oído maravillas aún no he tenido la posibilidad de probarlo en producción y no voy a asegurar lo que no he visto (¡un excéptico de pura cepa como yo!), pero la verdad es que visto lo visto creo que puede ser bastante cierto.</li>
</ul>
<ul>
<li><span style="color: #ff0000;">↓</span> <strong>Documentación</strong>. Sé que aún no ha salido la versión final estable, sé que es un framework que &#8216;acaba de empezar&#8217;, sé que cuesta mucho documentar totalmente un proyecto de esta envergadura, pero me fastidia un montón estar convencidísimo de que algo se puede hacer y no encontrar como hacerlo. Estoy seguro de que con el tiempo esto cambiará, pero por el momento creo que es un gran problema sobre todo si eliges un framework de este tipo para agilizar tus desarrollos.</li>
<li><span style="color: #ff0000;">↓</span> <strong>Requisitos y gigantismo</strong>. Creo que Symfony2 no es un framework para cualquiera, no lo veo como solución a proyectos pequeños, webs informativas de pymes o blogs por ejemplo. Además para su correcto funcionamiento en producción son necesarios ciertos requisitos que no puedes encontrar en todos los hostings, sobre todo si tienes algo compartido. Para empezar PHP 5.3 es totalmente necesario, entre otras cosas por el obligatorio <a href="http://www.berriart.com/2011/02/15/como-usar-los-namespaces-en-php-5-3/">uso de los namespaces</a>. De todos modos los creadores de Symfony2 ya lo han tenido en cuenta y han creado <a href="http://silex-project.org/">Silex</a> un microframework basado en Symfony para proyectos más pequeños que estoy deseando probar.</li>
<li><span style="color: #ff0000;">↓</span> <strong>Autogeneradores</strong>. Cuando no has probado el chocolate no sabes si te gusta, pero como te guste luego no puedes dejar de comerlo, y si no tienes pues lo hechas en falta. Esto es lo que me ha pasado con los administradores autogenerados de Symfony 1 que tanto trabajo me han ahorrado, y ahora que Symfony2 no los trae pues me parece una gran falta. El generador de <abbr title="Create, Read, Update and Delete">CRUD</abbr> con Doctrine2 puede ser un sustitutivo en parte, pero no es lo mismo.</li>
</ul>
<p>Creo que esas pueden ser las conclusiones más importantes que he sacado estos primeros días. En una visión general y teniendo en cuenta que en Symfony2 aún quedan muchas cosas por hacer, creo voy a decir que en principio me gusta. Si os interesa el tema os dejo unos enlaces sobre el tema:</p>
<ul>
<li><a href="http://symfony.com">Symfony2</a>. Página oficial del framework.</li>
<li><a href="http://www.symfony.es/">symfony.es</a>. Página y comunidad de Symfony en español creada por <a href="http://javiereguiluz.com/">Javier Eguiluz</a>, alguien a quien merece la pena escuchar con atención.</li>
<li><a href="http://www.symfony.es/2011/07/06/desymfony-2011-todos-los-videos-y-presentaciones/">Ponencias de deSymfony2011</a>. Vídeos y presentaciones de las jornadas <a href="http://desymfony.com/">deSymfony</a> de este año. Aún no están colgados, pero está previsto que se vayan poniendo durante esta semana.</li>
<li><a href="http://fabien.potencier.org/">Fabien Potencier</a>. Creador del framework.</li>
<li>Gente que sabe de esto: <a href="http://javiereguiluz.com/">Javier Eguiluz</a>, <a href="http://asiermarques.com/">Asier Marqués</a>, <a href="http://sftuts.com/">Albert Jessurum</a>, <a href="http://nacho-martin.com/">Nacho Martín</a>, <a href="http://jonsegador.com/">Jon Segador</a> </li>
</ul>
<p>Sea o no mi decisión final quedarme con Symfony2 como alternativa a Symfony1 en los proyectos que ya he desarrollado, o los que vengan más adelante, estoy seguro de que no dejaré de investigar y probar cosas con él, así que seguro que seguiréis leyendo más cosas en Berriart referentes a este framework y ya sobre temas o usos más concretos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/07/11/primeras-impresiones-symfony2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Instalar Pootle en Ubuntu</title>
		<link>http://www.berriart.com/2011/07/08/instalar-pootle-en-ubuntu/</link>
		<comments>http://www.berriart.com/2011/07/08/instalar-pootle-en-ubuntu/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 23:04:47 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Aplicaciones web]]></category>
		<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[po]]></category>
		<category><![CDATA[pootle]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[traducciones]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=810</guid>
		<description><![CDATA[El otro día un tuit de @hello_google me volvió a recordar que, como él, yo también tenía que buscar una herramienta online que nos permita editar ficheros .PO de forma colaborativa. Como la mayoría ya sabréis son ficheros de traducciones que se usan en muchos proyectos de software, y a veces traen de cabeza a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.berriart.com/wp-content/uploads/2011/07/74359.jpg"><img src="http://www.berriart.com/wp-content/uploads/2011/07/74359-150x150.jpg" alt="" title="International Flags" width="150" height="150" class="alignleft size-thumbnail wp-image-813" /></a>El otro día un <a href="http://twitter.com/#!/hello_google/status/83496250917404672">tuit de @hello_google</a> me volvió a recordar que, como él, yo también tenía que buscar una herramienta online que nos permita editar <a href="http://es.wikipedia.org/wiki/Gettext">ficheros .PO</a> de forma colaborativa. Como la mayoría ya sabréis son ficheros de traducciones que se usan en muchos proyectos de software, y a veces traen de cabeza a desarrolladores y traductores. </p>
<p>La verdad es que una herramienta que nos permita manejar estos ficheros de forma colaborativa y utilizando una interfaz web medianamente intuitiva y fácil de usar era algo que llevaba tiempo necesitando pero que <em>entre pitos y flautas</em> no tenía tiempo de buscar. Conocía la existencia de <a href="https://launchpad.net/">Launchpad</a>, pero yo pensaba que era sólo para proyectos de software libre por lo que para proyectos cerrados no me valía (ahora me he dado cuenta de que también tiene servicio de pago, aún así siempre prefiero una alternativa open source y que pueda instalar en mis propios servidores). La cuestión, es que sin quererlo, he encontrado la solución cuando hacía otra consulta en <a href="http://codex.wordpress.org/Translating_WordPress">la página sobre traducciones de WordPress</a>.</p>
<p>Como habréis podido adivinar por el título de este post la solución que he encontrado se llama <a href="http://translate.sourceforge.net/wiki/pootle/">Pootle</a> (<strong>PO</strong>-based <strong>O</strong>nline <strong>T</strong>ranslation / <strong>L</strong>ocalization <strong>E</strong>ngine) y también es válido para otros tipos de archivo de traducción como pueden ser los XLIFF. Podéis ver <a href="http://pootle.locamotion.org/">en este enlace</a> un versión live de esta aplicación si queréis ver un poco mejor de que se trata, pero si queréis <em>cacharrear</em> un poco más podéis instalarlo directamente en Ubuntu que es bastante sencillito (en otras distribuciones o SO os buscáis la vida :p ). Como casi siempre, hay paquete:</p>
<p><code>sudo apt-get install pootle</code></p>
<p>Yo lo he configurado para que use <em>mysql</em> en vez de <em>sqlite3</em> editando el fichero <em>localsettings.py</em>. Si tú también lo vas a hacer, deberás instalar primero el paquete <em>python-mysqldb</em>,  crear una BD para ello, y modificar estos datos en el fichero de configuración (hay otros datos que también puedes modificar ahí, como por ejemplo configurarlo para usar memcached):</p>
<p><code>sudo apt-get install python-mysqldb<br />
gedit /etc/pootle/localsettings.py</code></p>
<p>Una vez que tengas todo listo y configurado solo tienes que hacer correr el servidor de Pootle:</p>
<p><code>sudo PootleServer</code></p>
<p>Esto lo hará correr por el puerto 8080, si ya tienes algo ahí o prefieres usar otro puerto solo tienes que indicárselo:</p>
<p><code>sudo PootleServer --port=XXXX</code></p>
<p>Finalmente, si todo ha ido bien tendrás tu servidor montado. Sino has hecho alguna otra configuración, puedes acceder a él accediendo a la URL: <code>http://127.0.0.1:8080/</code>. Si has seguido estos mismos pasos puedes loguearte con el usuario <em>admin</em> password <em>admin</em> y empezar a toquetear y cambiar configuraciones (cambia también el pass ). Ya os contaré algunas impresiones si finalmente lo implantamos para algún proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/07/08/instalar-pootle-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiando de SVN a Git</title>
		<link>http://www.berriart.com/2011/06/08/cambiando-de-svn-a-git/</link>
		<comments>http://www.berriart.com/2011/06/08/cambiando-de-svn-a-git/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 09:03:09 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Gitorious]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=778</guid>
		<description><![CDATA[Definitivamente me estoy cambiando de SVN a Git. Empecé casi por curiosidad y por lo escuchado en la charla de Distributed Source Code Management en la última PHP Barcelona Conference. Pero al final, entre la comodidad de utilizar algo conocido y la vagueza de cambiar de costumbres lo había dejado aparcado. Ahora, que me estoy [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.berriart.com/wp-content/uploads/2011/06/subversion_VS_git.jpg"><img src="http://www.berriart.com/wp-content/uploads/2011/06/subversion_VS_git.jpg" alt="" title="subversion_VS_git" width="250" height="158" class="alignleft size-full wp-image-779" /></a>Definitivamente me estoy cambiando de SVN a Git. Empecé casi por curiosidad y por lo escuchado en la charla de <a href="http://phpconference.es/php-barcelona-conference-2010/talks/"><em>Distributed Source Code Management</em></a> en la última PHP Barcelona Conference. Pero al final, entre la comodidad de utilizar algo conocido y la vagueza de cambiar de costumbres lo había dejado aparcado.</p>
<p>Ahora, que me estoy poniendo al día con Symfony2 y ellos (al igual que muchos otros) han cambiado a Git, creo que definitivamente también tengo que ponerme al día con ello y en eso estoy. Además, por lo que estoy viendo, creo va a valer mucho la pena en los casos en los que trabajes con más gente. Si estáis en el mismo punto que yo, creo que este artículo os ayudará bastante, al menos a mi me lo ha parecido: <a href="http://git.or.cz/course/svn.html">Git &#8211; SVN Crash Course</a>.</p>
<p>Uno de los problemas que le veo ahora mismo es la dificultad de instalar un servidor Git con una herramienta de gestión tipo <a href="http://trac.edgewall.org/">Trac</a>. Es decir, tener un <a href="http://github.com/">Github</a> instalado en mi propio servidor (la mayoría de este tipo de webs son gratis para proyectos open source pero de pago para proyectos privados). Lo mejor que he encontrado es <a href="http://gitorious.org/">Gitorious</a>, pero su <a href="http://cjohansen.no/en/ruby/setting_up_gitorious_on_your_own_server">instalación en un servidor Ubuntu</a> es mucho más complicada que <a href="http://www.berriart.com/2010/07/24/instalar-trac-ubuntu/">la instalación de su alternativa de SVN, el Trac</a>, al menos a mi me lo parece.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/06/08/cambiando-de-svn-a-git/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Plugin de WP para forzar usuarios a loguearse para comentar</title>
		<link>http://www.berriart.com/2011/04/22/plugin-wp-forzar-usuarios-login-comentar/</link>
		<comments>http://www.berriart.com/2011/04/22/plugin-wp-forzar-usuarios-login-comentar/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 12:06:50 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[limitar]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=714</guid>
		<description><![CDATA[Acaba de empezar la Semana Santa, y ya que tengo las mañanitas libres, he decidido entre otras cosas dedicarle un poquito de tiempo al blog y hacerle unas remodelaciones. Una de las cosas que quiero hacer es darle una sección especial a los themes y plugins de WordPress que yo hago, pequeños cambios más que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.berriart.com/wp-content/uploads/2011/04/comment.png"><img src="http://www.berriart.com/wp-content/uploads/2011/04/comment-150x150.png" alt="Comment Privileges By Post" title="Comment Privileges By Post" width="150" height="150" class="alignleft size-thumbnail wp-image-716" /></a> Acaba de empezar la Semana Santa, y ya que tengo las mañanitas libres, he decidido entre otras cosas dedicarle un poquito de tiempo al blog y hacerle unas remodelaciones. Una de las cosas que quiero hacer es darle una sección especial a los themes y plugins de WordPress que yo hago, pequeños cambios más que nada.</p>
<p>El tema es que una de las cosas que voy a hacer, sí o sí, es forzar a los usuarios a registrarse para comentar en las páginas de los plugins y los themes. Por varias razones, una es para que el que quiera un poquito de soporte al menos necesite un poco de esfuerzo para pedirlo (registrarse), otra que así podré tener más datos de quienes usan mis themes/plugins y una manera de contactarles. Seguramente me ayude también a quitar un poco de SPAM.</p>
<p>Al ir a hacerlo me he dado cuenta de que no puedo limitar lo de comentar estando registrado en cada post o página, si no que solo puedo limitarlo en general para todo el blog. Así que ya puesto me he currado un pequeño plugin que permite hacerlo. Os presento el plugin para WordPress: <a href="http://www.berriart.com/en/comment-privileges-by-post/">Comment Privileges By Post</a>.</p>
<p>Espero que le resulte útil a alguien más que a mí.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/04/22/plugin-wp-forzar-usuarios-login-comentar/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integrar Zend Framework en Symfony</title>
		<link>http://www.berriart.com/2011/04/12/integrar-zend-framework-symfony/</link>
		<comments>http://www.berriart.com/2011/04/12/integrar-zend-framework-symfony/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 08:26:53 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[integración]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=703</guid>
		<description><![CDATA[No, no me he vuelto loco, y os aseguro que no es nada tan raro. Es algo que Fabien Potencier creador de Symfony o Matthew Weier O’Phinney y Stefan Koopmanschap responsables del Framework Zend han sugerido en varias ocasiones. Los que usamos Symfony no tenemos porque volvernos locos para usar Lucene, la API de Google [...]]]></description>
			<content:encoded><![CDATA[<p>No, no me he vuelto loco, y os aseguro que no es nada tan raro. Es algo que <a href="http://fabien.potencier.org/">Fabien Potencier</a> creador de Symfony o <a href="http://weierophinney.net/matthew/">Matthew Weier O’Phinney</a> y <a href="http://www.stefankoopmanschap.com">Stefan Koopmanschap</a> responsables del Framework Zend han sugerido en varias ocasiones.</p>
<p>Los que usamos Symfony no tenemos porque volvernos locos para usar Lucene, la API de Google GData, manejar PDFs, recoger feeds o tantas otras funcionalidades que cubre tan bien el Framework Zend. No, porque integrar Zend en Symfony viene a ser bastante sencillo:</p>
<h3>Añadir la librería Zend a nuestro código</h3>
<p>Debemos descargar el <a href="http://framework.zend.com/download/current/">Framework Zend</a> y copiarlo en <em>lib/vendor</em>, que es el directorio donde guardamos habitualmente las librerías externas. Ahí lo meteremos todo dentro de una carpeta nueva que llamaremos Zend.</p>
<h3>Sistema para cargar Zend cuando lo necesitemos</h3>
<p>Para esto lo que vamos a hacer es crear un método nuevo en la clase <em>config/ProjectConfiguration.class.php</em> que nos permita cargar Zend fácilemente desde cualquier parte:</p>
<pre name="code" class="php">
class ProjectConfiguration extends sfApplicationConfiguration

  static protected $zendAutoloader = false;

  /** ............ **/

  /**
   * Agrega el framework Zend a nuestra App
   */
  static public function registerZend()
  {
    if(!self::$zendAutoloader)
    {
      set_include_path(implode(
        PATH_SEPARATOR,
        array(sfConfig::get('sf_lib_dir') . '/vendor', get_include_path())
      ));
      require_once 'Zend/Loader/Autoloader.php';
      self::$zendAutoloader = Zend_Loader_Autoloader::getInstance();
    }

    return self::$zendAutoloader;
  }
}
</pre>
<h3>Empezamos a usarlo</h3>
<p>Una vez hecho todo esto podríamos tranquilamente en un <em>action</em> o en algún <em>task</em> hacer uso del framework Zend. Por ejemplo&#8230;</p>
<pre name="code" class="php">
// Cargamos el framework Zend
ProjectConfiguration::registerZend();

// Utilizamos Zend....
try {
  $feed = Zend_Feed_Reader::import($parameters['feed']);
} catch (Zend_Feed_Exception $e) {
  /** ........ **/
}
</pre>
<p>Como podéis ver eso es todo <img src='http://www.berriart.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  A continuación os pongo las diapos que pasó la gente de Symfony y Zend en las conferencias explicando la utilidad de integrarlos y donde explican como hacerlo que es de donde he sacado yo la info:</p>
<ul>
<li><a href="http://fabien.potencier.org/talk/27/symfony-and-zend-framework-together-2009">Using Zend Framework and Symfony Together (Zend PHP Conference 2009)</a></li>
<li><a href="http://www.slideshare.net/weierophinney/using-zend-framework-with-symfony">Using Zend Framework with Symfony (sfLive 2010)</a></li>
<li><a href="http://www.slideshare.net/skoop/integrating-symfony-and">Integrating symfony and Zend Framework (IPC 2010)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/04/12/integrar-zend-framework-symfony/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Configurar Postfix para el reenvio de emails</title>
		<link>http://www.berriart.com/2011/03/30/configurar-postfix-para-el-reenvio-de-emails/</link>
		<comments>http://www.berriart.com/2011/03/30/configurar-postfix-para-el-reenvio-de-emails/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 12:25:53 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[reenvio]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=682</guid>
		<description><![CDATA[Antes de nada comentar que &#8216;los sistemas&#8217; han sido siempre una de mis asignaturas pendientes, como se suele decir, en esta vida no se puede saber de todo. Esto lo comento para avisaros de que puede que lo que os cuento no sea 100% correcto, pero también sirve para que si algun SysAdmin comprensivo lee [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de nada comentar que &#8216;los sistemas&#8217; han sido siempre una de mis asignaturas pendientes, como se suele decir, en esta vida no se puede saber de todo. Esto lo comento para avisaros de que puede que lo que os cuento no sea 100% correcto, pero también sirve para que si algun SysAdmin comprensivo lee esto y está mal me lo diga. Lo que sí puedo decir es que a mi me ha funcionado.</p>
<p>Por lo general, cuando estoy con un proyecto que necesita un servicio de email suelo recomendar e instalar <a href="http://www.google.com/apps/intl/en/business/index.html">Google Apps for Business</a>. Me parece que dan un buen servicio y se puede dar de alta facilmente simplemente teniendo el control de los DNS del dominio. Pero a veces, como en este caso, <strong>lo que busco es</strong> simplemente <strong>que el email <em>loquesea@midominio.com</em> sea reenviado a <em>example@gmail.com</em></strong>.</p>
<p>En este ejemplo hablamos de configurarlo en un servidor con Ubuntu y con postfix instalado. Si tienes otra distribución me temo que tendrás que ver por ti mismo como hacerlo de manera equivalente y si tienes Ubuntu pero no tienes postfix instalado lo puedes instalar haciendo simplemente:<br />
<code>sudo apt-get install postfix</code></p>
<p>Antes de nada haz una copia del fichero de configuración que vamos a modificar por si acaso:<br />
<code>sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bkp</code></p>
<p>Luego edita ese fichero y agrega las siguientes líneas (o modificalas si ya tienes esas variables definidas):<br />
<code>virtual_alias_domains = midominio.com</code><br />
<code>virtual_alias_maps = hash:/etc/postfix/virtual</code><br />
<em>(Asegurate de que el dominio que agregas como alias no se encuentre en ese mismo fichero en la variable <em>mydestination</em></em>)</p>
<p>La variable <em>virtual_alias_domains</em> indica en este caso los dominios de los que aceptamos recibir emails para luego reenviarlos, por eso añadimos el dominio del email que queremos reenviar. Por otro las <em>virtual_alias_maps</em> indica el fichero que contiene los alias que vamos a crear para poder reenviar los emails. El fichero está en <em>/etc/postfix/virtual</em> y en nuestro ejemplo debería contener:<br />
<code>loquesea@midominio.com        example@gmail.com</code><br />
<code>fulano@midominio.com            otherexample@gmail.com</code><br />
<code># Uncomment entry below to implement a catch-all address</code><br />
<code># @midominio.com                 example@gmail.com</code></p>
<p>Como se puede apreciar primero se debe escribir el alias y después el email al que quieres reenviar; una línea por cada reenvio que queramos configurar. Como se puede apreciar también se puede configurar para tener un <em>catch-all</em>.</p>
<p>Finalmente y para que los cambios que hemos hecho surjan efecto debemos recargar los aliases y reiniciar o recargar el servidor de postfix:<br />
<code>postmap /etc/postfix/virtual</code><br />
<code>postfix reload</code></p>
<p>Creo que eso es todo, si véis que falta algo decídmelo en los comentarios.</p>
<p>Hay más información en el propio <a href="http://www.postfix.org/VIRTUAL_README.html">README de Postfix</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2011/03/30/configurar-postfix-para-el-reenvio-de-emails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

